0000: 2f 2a 20 54 72 61 6d 70 6f 6c 69 6e 65 20 63 6f /* Trampoline co
0010: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 2f nstruction */../
0020: 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 31 *. * Copyright 1
0030: 39 39 35 2d 31 39 39 39 2c 20 32 30 30 31 2d 32 995-1999, 2001-2
0040: 30 30 34 20 42 72 75 6e 6f 20 48 61 69 62 6c 65 004 Bruno Haible
0050: 2c 20 3c 62 72 75 6e 6f 40 63 6c 69 73 70 2e 6f , <bruno@clisp.o
0060: 72 67 3e 0a 20 2a 0a 20 2a 20 54 68 69 73 20 69 rg>. *. * This i
0070: 73 20 66 72 65 65 20 73 6f 66 74 77 61 72 65 20 s free software
0080: 64 69 73 74 72 69 62 75 74 65 64 20 75 6e 64 65 distributed unde
0090: 72 20 74 68 65 20 47 4e 55 20 47 65 6e 65 72 61 r the GNU Genera
00a0: 6c 20 50 75 62 6c 69 63 20 4c 69 63 65 6e 63 65 l Public Licence
00b0: 0a 20 2a 20 64 65 73 63 72 69 62 65 64 20 69 6e . * described in
00c0: 20 74 68 65 20 66 69 6c 65 20 43 4f 50 59 49 4e the file COPYIN
00d0: 47 2e 20 43 6f 6e 74 61 63 74 20 74 68 65 20 61 G. Contact the a
00e0: 75 74 68 6f 72 20 69 66 20 79 6f 75 20 64 6f 6e uthor if you don
00f0: 27 74 20 68 61 76 65 20 74 68 69 73 0a 20 2a 20 't have this. *
0100: 6f 72 20 63 61 6e 27 74 20 6c 69 76 65 20 77 69 or can't live wi
0110: 74 68 20 69 74 2e 20 54 68 65 72 65 20 69 73 20 th it. There is
0120: 41 42 53 4f 4c 55 54 45 4c 59 20 4e 4f 20 57 41 ABSOLUTELY NO WA
0130: 52 52 41 4e 54 59 2c 20 65 78 70 6c 69 63 69 74 RRANTY, explicit
0140: 20 6f 72 20 69 6d 70 6c 69 65 64 2c 0a 20 2a 20 or implied,. *
0150: 6f 6e 20 74 68 69 73 20 73 6f 66 74 77 61 72 65 on this software
0160: 2e 0a 20 2a 2f 0a 0a 0a 23 69 6e 63 6c 75 64 65 .. */...#include
0170: 20 22 63 6f 6e 66 69 67 2e 68 22 0a 23 69 6e 63 "config.h".#inc
0180: 6c 75 64 65 20 22 74 72 61 6d 70 6f 6c 69 6e 65 lude "trampoline
0190: 5f 72 2e 68 22 0a 0a 23 69 66 20 64 65 66 69 6e _r.h"..#if defin
01a0: 65 64 28 5f 5f 68 70 70 61 5f 5f 29 0a 23 69 66 ed(__hppa__).#if
01b0: 20 30 0a 23 64 65 66 69 6e 65 20 5f 5f 68 70 70 0.#define __hpp
01c0: 61 6f 6c 64 5f 5f 20 20 2f 2a 20 4f 6c 64 20 74 aold__ /* Old t
01d0: 72 61 6d 70 6f 6c 69 6e 65 2c 20 72 65 61 6c 20 rampoline, real
01e0: 6d 61 63 68 69 6e 65 20 63 6f 64 65 2e 20 2a 2f machine code. */
01f0: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 5f .#else.#define _
0200: 5f 68 70 70 61 6e 65 77 5f 5f 20 20 2f 2a 20 4e _hppanew__ /* N
0210: 65 77 20 74 72 61 6d 70 6f 6c 69 6e 65 2c 20 6a ew trampoline, j
0220: 75 73 74 20 61 20 63 6c 6f 73 75 72 65 2e 20 2a ust a closure. *
0230: 2f 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a /.#endif.#endif.
0240: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 72 73 #if defined(__rs
0250: 36 30 30 30 5f 5f 29 0a 23 69 66 20 64 65 66 69 6000__).#if defi
0260: 6e 65 64 28 5f 5f 4e 65 74 42 53 44 5f 5f 29 0a ned(__NetBSD__).
0270: 23 64 65 66 69 6e 65 20 5f 5f 72 73 36 30 30 30 #define __rs6000
0280: 6e 65 74 62 73 64 5f 5f 0a 23 65 6c 73 65 0a 23 netbsd__.#else.#
0290: 69 66 20 21 64 65 66 69 6e 65 64 28 5f 41 49 58 if !defined(_AIX
02a0: 29 0a 23 64 65 66 69 6e 65 20 5f 5f 72 73 36 30 ).#define __rs60
02b0: 30 30 73 79 73 76 34 5f 5f 20 20 2f 2a 20 53 79 00sysv4__ /* Sy
02c0: 73 56 2e 34 20 41 42 49 2c 20 72 65 61 6c 20 6d sV.4 ABI, real m
02d0: 61 63 68 69 6e 65 20 63 6f 64 65 2e 20 2a 2f 0a achine code. */.
02e0: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 5f 5f #else.#define __
02f0: 72 73 36 30 30 30 61 69 78 5f 5f 20 20 2f 2a 20 rs6000aix__ /*
0300: 41 49 58 20 41 42 49 2c 20 6a 75 73 74 20 61 20 AIX ABI, just a
0310: 63 6c 6f 73 75 72 65 2e 20 2a 2f 0a 23 65 6e 64 closure. */.#end
0320: 69 66 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 if.#endif.#endif
0330: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 68 .#if defined(__h
0340: 70 70 61 6e 65 77 5f 5f 29 0a 2f 2a 0a 20 2a 20 ppanew__)./*. *
0350: 41 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 A function point
0360: 65 72 20 69 73 20 61 20 62 69 61 73 65 64 20 70 er is a biased p
0370: 6f 69 6e 74 65 72 20 74 6f 20 61 20 64 61 74 61 ointer to a data
0380: 20 61 72 65 61 20 77 68 6f 73 65 20 66 69 72 73 area whose firs
0390: 74 20 77 6f 72 64 0a 20 2a 20 63 6f 6e 74 61 69 t word. * contai
03a0: 6e 73 20 74 68 65 20 61 63 74 75 61 6c 20 61 64 ns the actual ad
03b0: 64 72 65 73 73 20 6f 66 20 74 68 65 20 66 75 6e dress of the fun
03c0: 63 74 69 6f 6e 2e 0a 20 2a 2f 0a 65 78 74 65 72 ction.. */.exter
03d0: 6e 20 76 6f 69 64 20 74 72 61 6d 70 5f 72 20 28 n void tramp_r (
03e0: 29 3b 20 2f 2a 20 74 72 61 6d 70 6f 6c 69 6e 65 ); /* trampoline
03f0: 20 70 72 6f 74 6f 74 79 70 65 20 2a 2f 0a 2f 2a prototype */./*
0400: 20 57 65 20 64 6f 6e 27 74 20 6e 65 65 64 20 74 We don't need t
0410: 6f 20 74 61 6b 65 20 61 6e 79 20 73 70 65 63 69 o take any speci
0420: 61 6c 20 6d 65 61 73 75 72 65 73 20 74 6f 20 6d al measures to m
0430: 61 6b 65 20 74 68 65 20 63 6f 64 65 20 65 78 65 ake the code exe
0440: 63 75 74 61 62 6c 65 0a 20 2a 20 73 69 6e 63 65 cutable. * since
0450: 20 74 68 65 20 61 63 74 75 61 6c 20 69 6e 73 74 the actual inst
0460: 72 75 63 74 69 6f 6e 73 20 61 72 65 20 69 6e 20 ructions are in
0470: 74 68 65 20 74 65 78 74 20 73 65 67 6d 65 6e 74 the text segment
0480: 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 43 4f .. */.#ifndef CO
0490: 44 45 5f 45 58 45 43 55 54 41 42 4c 45 0a 23 64 DE_EXECUTABLE.#d
04a0: 65 66 69 6e 65 20 43 4f 44 45 5f 45 58 45 43 55 efine CODE_EXECU
04b0: 54 41 42 4c 45 0a 23 65 6e 64 69 66 0a 23 65 6e TABLE.#endif.#en
04c0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
04d0: 5f 5f 72 73 36 30 30 30 61 69 78 5f 5f 29 20 7c __rs6000aix__) |
04e0: 7c 20 64 65 66 69 6e 65 64 28 5f 5f 69 61 36 34 | defined(__ia64
04f0: 5f 5f 29 0a 2f 2a 0a 20 2a 20 41 20 66 75 6e 63 __)./*. * A func
0500: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 20 tion pointer is
0510: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 64 a pointer to a d
0520: 61 74 61 20 61 72 65 61 20 77 68 6f 73 65 20 66 ata area whose f
0530: 69 72 73 74 20 77 6f 72 64 20 63 6f 6e 74 61 69 irst word contai
0540: 6e 73 0a 20 2a 20 74 68 65 20 61 63 74 75 61 6c ns. * the actual
0550: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 address of the
0560: 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 2f 0a 65 78 function.. */.ex
0570: 74 65 72 6e 20 76 6f 69 64 20 28 2a 74 72 61 6d tern void (*tram
0580: 70 5f 72 29 20 28 29 3b 20 2f 2a 20 74 72 61 6d p_r) (); /* tram
0590: 70 6f 6c 69 6e 65 20 70 72 6f 74 6f 74 79 70 65 poline prototype
05a0: 20 2a 2f 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 */./* We don't
05b0: 6e 65 65 64 20 74 6f 20 74 61 6b 65 20 61 6e 79 need to take any
05c0: 20 73 70 65 63 69 61 6c 20 6d 65 61 73 75 72 65 special measure
05d0: 73 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 63 6f s to make the co
05e0: 64 65 20 65 78 65 63 75 74 61 62 6c 65 0a 20 2a de executable. *
05f0: 20 73 69 6e 63 65 20 74 68 65 20 61 63 74 75 61 since the actua
0600: 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 l instructions a
0610: 72 65 20 69 6e 20 74 68 65 20 74 65 78 74 20 73 re in the text s
0620: 65 67 6d 65 6e 74 2e 0a 20 2a 2f 0a 23 69 66 6e egment.. */.#ifn
0630: 64 65 66 20 43 4f 44 45 5f 45 58 45 43 55 54 41 def CODE_EXECUTA
0640: 42 4c 45 0a 23 64 65 66 69 6e 65 20 43 4f 44 45 BLE.#define CODE
0650: 5f 45 58 45 43 55 54 41 42 4c 45 0a 23 65 6e 64 _EXECUTABLE.#end
0660: 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 if.#endif.#if de
0670: 66 69 6e 65 64 28 5f 5f 6d 36 38 6b 5f 5f 29 0a fined(__m68k__).
0680: 23 69 66 20 64 65 66 69 6e 65 64 28 41 4d 49 47 #if defined(AMIG
0690: 41 29 20 2f 2a 20 41 6d 69 67 61 20 72 75 6e 6e A) /* Amiga runn
06a0: 69 6e 67 20 41 6d 69 67 61 4f 53 2c 20 6e 6f 74 ing AmigaOS, not
06b0: 20 4c 69 6e 75 78 20 2a 2f 0a 23 69 66 6e 64 65 Linux */.#ifnde
06c0: 66 20 43 4f 44 45 5f 45 58 45 43 55 54 41 42 4c f CODE_EXECUTABL
06d0: 45 20 2f 2a 20 63 6f 6e 66 69 67 75 72 65 20 67 E /* configure g
06e0: 75 65 73 73 65 73 20 77 72 6f 6e 67 3f 3f 20 2a uesses wrong?? *
06f0: 2f 0a 23 64 65 66 69 6e 65 20 43 4f 44 45 5f 45 /.#define CODE_E
0700: 58 45 43 55 54 41 42 4c 45 0a 23 65 6e 64 69 66 XECUTABLE.#endif
0710: 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a .#endif.#endif..
0720: 2f 2a 20 41 73 20 6f 66 20 57 69 6e 64 6f 77 73 /* As of Windows
0730: 20 58 50 20 53 50 20 32 2c 20 6d 61 6c 6c 6f 63 XP SP 2, malloc
0740: 27 64 20 6d 65 6d 6f 72 79 20 69 73 20 6e 6f 74 'd memory is not
0750: 20 65 78 65 63 75 74 61 62 6c 65 20 2a 2f 0a 23 executable */.#
0760: 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 23 75 6e ifdef _WIN32.#un
0770: 64 65 66 20 43 4f 44 45 5f 45 58 45 43 55 54 41 def CODE_EXECUTA
0780: 42 4c 45 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e BLE.#endif..#ifn
0790: 64 65 66 20 43 4f 44 45 5f 45 58 45 43 55 54 41 def CODE_EXECUTA
07a0: 42 4c 45 0a 2f 2a 20 48 6f 77 20 64 6f 20 77 65 BLE./* How do we
07b0: 20 6d 61 6b 65 20 74 68 65 20 74 72 61 6d 70 6f make the trampo
07c0: 6c 69 6e 65 27 73 20 63 6f 64 65 20 65 78 65 63 line's code exec
07d0: 75 74 61 62 6c 65 3f 20 2a 2f 0a 23 69 66 20 64 utable? */.#if d
07e0: 65 66 69 6e 65 64 28 48 41 56 45 5f 4d 41 43 48 efined(HAVE_MACH
07f0: 5f 56 4d 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 _VM) || defined(
0800: 5f 5f 63 6f 6e 76 65 78 5f 5f 29 20 7c 7c 20 64 __convex__) || d
0810: 65 66 69 6e 65 64 28 48 41 56 45 5f 57 4f 52 4b efined(HAVE_WORK
0820: 49 4e 47 5f 4d 50 52 4f 54 45 43 54 29 20 7c 7c ING_MPROTECT) ||
0830: 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 53 59 defined(HAVE_SY
0840: 53 5f 4d 38 38 4b 42 43 53 5f 48 29 0a 2f 2a 20 S_M88KBCS_H)./*
0850: 6d 70 72 6f 74 65 63 74 28 29 20 5b 6f 72 20 65 mprotect() [or e
0860: 71 75 69 76 61 6c 65 6e 74 5d 20 74 68 65 20 6d quivalent] the m
0870: 61 6c 6c 6f 63 27 65 64 20 61 72 65 61 2e 20 2a alloc'ed area. *
0880: 2f 0a 23 64 65 66 69 6e 65 20 45 58 45 43 55 54 /.#define EXECUT
0890: 41 42 4c 45 5f 56 49 41 5f 4d 50 52 4f 54 45 43 ABLE_VIA_MPROTEC
08a0: 54 0a 23 65 6c 73 65 0a 23 69 66 64 65 66 20 48 T.#else.#ifdef H
08b0: 41 56 45 5f 4d 4d 41 50 0a 2f 2a 20 55 73 65 20 AVE_MMAP./* Use
08c0: 61 6e 20 6d 6d 61 70 27 65 64 20 70 61 67 65 2e an mmap'ed page.
08d0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 45 58 45 43 */.#define EXEC
08e0: 55 54 41 42 4c 45 5f 56 49 41 5f 4d 4d 41 50 0a UTABLE_VIA_MMAP.
08f0: 23 69 66 64 65 66 20 48 41 56 45 5f 4d 4d 41 50 #ifdef HAVE_MMAP
0900: 5f 41 4e 4f 4e 59 4d 4f 55 53 0a 2f 2a 20 55 73 _ANONYMOUS./* Us
0910: 65 20 6d 6d 61 70 20 77 69 74 68 20 74 68 65 20 e mmap with the
0920: 4d 41 50 5f 41 4e 4f 4e 59 4d 4f 55 53 20 6f 72 MAP_ANONYMOUS or
0930: 20 4d 41 50 5f 41 4e 4f 4e 20 66 6c 61 67 2e 20 MAP_ANON flag.
0940: 2a 2f 0a 23 64 65 66 69 6e 65 20 45 58 45 43 55 */.#define EXECU
0950: 54 41 42 4c 45 5f 56 49 41 5f 4d 4d 41 50 5f 41 TABLE_VIA_MMAP_A
0960: 4e 4f 4e 59 4d 4f 55 53 0a 23 65 6c 73 65 0a 2f NONYMOUS.#else./
0970: 2a 20 55 73 65 20 6d 6d 61 70 20 6f 6e 20 2f 64 * Use mmap on /d
0980: 65 76 2f 7a 65 72 6f 2e 20 2a 2f 0a 23 64 65 66 ev/zero. */.#def
0990: 69 6e 65 20 45 58 45 43 55 54 41 42 4c 45 5f 56 ine EXECUTABLE_V
09a0: 49 41 5f 4d 4d 41 50 5f 44 45 56 5a 45 52 4f 0a IA_MMAP_DEVZERO.
09b0: 23 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 69 66 #endif.#else.#if
09c0: 64 65 66 20 48 41 56 45 5f 53 48 4d 0a 2f 2a 20 def HAVE_SHM./*
09d0: 55 73 65 20 61 6e 20 73 68 6d 61 74 27 65 64 20 Use an shmat'ed
09e0: 70 61 67 65 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 page. */.#define
09f0: 20 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41 5f EXECUTABLE_VIA_
0a00: 53 48 4d 0a 23 65 6c 73 65 0a 23 69 66 64 65 66 SHM.#else.#ifdef
0a10: 20 5f 57 49 4e 33 32 0a 2f 2a 20 55 73 65 20 56 _WIN32./* Use V
0a20: 69 72 74 75 61 6c 41 6c 6c 6f 63 20 2a 2f 0a 23 irtualAlloc */.#
0a30: 65 6c 73 65 0a 3f 3f 0a 23 65 6e 64 69 66 0a 23 else.??.#endif.#
0a40: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 65 6e endif.#endif.#en
0a50: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 23 69 6e 63 dif.#endif..#inc
0a60: 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 20 2f lude <stdio.h> /
0a70: 2a 20 64 65 63 6c 61 72 65 73 20 66 70 72 69 6e * declares fprin
0a80: 74 66 28 29 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 tf() */..#includ
0a90: 65 20 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a e <sys/types.h>.
0aa0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 #include <stdlib
0ab0: 2e 68 3e 20 2f 2a 20 64 65 63 6c 61 72 65 73 20 .h> /* declares
0ac0: 61 62 6f 72 74 28 29 2c 20 6d 61 6c 6c 6f 63 28 abort(), malloc(
0ad0: 29 2c 20 66 72 65 65 28 29 20 2a 2f 0a 23 69 66 ), free() */.#if
0ae0: 64 65 66 20 48 41 56 45 5f 55 4e 49 53 54 44 5f def HAVE_UNISTD_
0af0: 48 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 H.#include <unis
0b00: 74 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a td.h>.#endif../*
0b10: 20 44 65 63 6c 61 72 65 20 67 65 74 70 61 67 65 Declare getpage
0b20: 73 69 7a 65 28 29 2e 20 2a 2f 0a 23 69 66 64 65 size(). */.#ifde
0b30: 66 20 48 41 56 45 5f 47 45 54 50 41 47 45 53 49 f HAVE_GETPAGESI
0b40: 5a 45 0a 23 69 66 64 65 66 20 5f 5f 63 70 6c 75 ZE.#ifdef __cplu
0b50: 73 70 6c 75 73 0a 65 78 74 65 72 6e 20 22 43 22 splus.extern "C"
0b60: 20 52 45 54 47 45 54 50 41 47 45 53 49 5a 45 54 RETGETPAGESIZET
0b70: 59 50 45 20 67 65 74 70 61 67 65 73 69 7a 65 20 YPE getpagesize
0b80: 28 76 6f 69 64 29 3b 0a 23 65 6c 69 66 20 64 65 (void);.#elif de
0b90: 66 69 6e 65 64 28 5f 5f 53 54 44 43 5f 5f 29 0a fined(__STDC__).
0ba0: 65 78 74 65 72 6e 20 52 45 54 47 45 54 50 41 47 extern RETGETPAG
0bb0: 45 53 49 5a 45 54 59 50 45 20 67 65 74 70 61 67 ESIZETYPE getpag
0bc0: 65 73 69 7a 65 20 28 76 6f 69 64 29 3b 0a 23 65 esize (void);.#e
0bd0: 6c 73 65 0a 65 78 74 65 72 6e 20 52 45 54 47 45 lse.extern RETGE
0be0: 54 50 41 47 45 53 49 5a 45 54 59 50 45 20 67 65 TPAGESIZETYPE ge
0bf0: 74 70 61 67 65 73 69 7a 65 20 28 29 3b 0a 23 65 tpagesize ();.#e
0c00: 6e 64 69 66 0a 23 65 6c 73 65 0a 23 69 66 64 65 ndif.#else.#ifde
0c10: 66 20 48 41 56 45 5f 53 59 53 5f 50 41 52 41 4d f HAVE_SYS_PARAM
0c20: 5f 48 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 _H.#include <sys
0c30: 2f 70 61 72 61 6d 2e 68 3e 0a 23 65 6c 73 65 0a /param.h>.#else.
0c40: 2f 2a 20 4e 6f 74 20 55 6e 69 78 2c 20 65 2e 67 /* Not Unix, e.g
0c50: 2e 20 6d 69 6e 67 77 33 32 20 2a 2f 0a 23 64 65 . mingw32 */.#de
0c60: 66 69 6e 65 20 50 41 47 45 53 49 5a 45 20 34 30 fine PAGESIZE 40
0c70: 39 36 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 96.#endif.#defin
0c80: 65 20 67 65 74 70 61 67 65 73 69 7a 65 28 29 20 e getpagesize()
0c90: 50 41 47 45 53 49 5a 45 0a 23 65 6e 64 69 66 0a PAGESIZE.#endif.
0ca0: 0a 2f 2a 20 44 65 63 6c 61 72 65 20 6d 70 72 6f ./* Declare mpro
0cb0: 74 65 63 74 28 29 20 6f 72 20 65 71 75 69 76 61 tect() or equiva
0cc0: 6c 65 6e 74 2e 20 2a 2f 0a 23 69 66 64 65 66 20 lent. */.#ifdef
0cd0: 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41 5f 4d EXECUTABLE_VIA_M
0ce0: 50 52 4f 54 45 43 54 0a 23 69 66 64 65 66 20 48 PROTECT.#ifdef H
0cf0: 41 56 45 5f 4d 41 43 48 5f 56 4d 0a 23 69 6e 63 AVE_MACH_VM.#inc
0d00: 6c 75 64 65 20 3c 73 79 73 2f 72 65 73 6f 75 72 lude <sys/resour
0d10: 63 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c ce.h>.#include <
0d20: 6d 61 63 68 2f 6d 61 63 68 5f 69 6e 74 65 72 66 mach/mach_interf
0d30: 61 63 65 2e 68 3e 0a 23 69 66 64 65 66 20 4e 65 ace.h>.#ifdef Ne
0d40: 58 54 0a 23 69 6e 63 6c 75 64 65 20 3c 6d 61 63 XT.#include <mac
0d50: 68 2f 6d 61 63 68 5f 69 6e 69 74 2e 68 3e 0a 23 h/mach_init.h>.#
0d60: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 6f endif.#ifdef __o
0d70: 73 66 5f 5f 0a 23 69 6e 63 6c 75 64 65 20 3c 6d sf__.#include <m
0d80: 61 63 68 5f 69 6e 69 74 2e 68 3e 0a 23 65 6e 64 ach_init.h>.#end
0d90: 69 66 0a 23 69 6e 63 6c 75 64 65 20 3c 6d 61 63 if.#include <mac
0da0: 68 2f 6d 61 63 68 69 6e 65 2f 76 6d 5f 70 61 72 h/machine/vm_par
0db0: 61 6d 2e 68 3e 0a 23 65 6c 73 65 0a 23 69 66 64 am.h>.#else.#ifd
0dc0: 65 66 20 48 41 56 45 5f 53 59 53 5f 4d 38 38 4b ef HAVE_SYS_M88K
0dd0: 42 43 53 5f 48 0a 23 69 6e 63 6c 75 64 65 20 3c BCS_H.#include <
0de0: 73 79 73 2f 6d 38 38 6b 62 63 73 2e 68 3e 0a 23 sys/m88kbcs.h>.#
0df0: 64 65 66 69 6e 65 20 67 65 74 70 61 67 65 73 69 define getpagesi
0e00: 7a 65 28 29 20 20 34 30 39 36 20 20 2f 2a 20 3f ze() 4096 /* ?
0e10: 3f 20 2a 2f 0a 23 65 6c 73 65 0a 23 69 6e 63 6c ? */.#else.#incl
0e20: 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73 2e 68 ude <sys/types.h
0e30: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f >.#include <sys/
0e40: 6d 6d 61 6e 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 mman.h>.#endif.#
0e50: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a endif.#endif../*
0e60: 20 44 65 63 6c 61 72 65 20 6d 6d 61 70 28 29 2e Declare mmap().
0e70: 20 2a 2f 0a 23 69 66 64 65 66 20 45 58 45 43 55 */.#ifdef EXECU
0e80: 54 41 42 4c 45 5f 56 49 41 5f 4d 4d 41 50 0a 23 TABLE_VIA_MMAP.#
0e90: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 include <sys/typ
0ea0: 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c es.h>.#include <
0eb0: 73 79 73 2f 6d 6d 61 6e 2e 68 3e 0a 23 69 66 20 sys/mman.h>.#if
0ec0: 21 64 65 66 69 6e 65 64 28 50 52 4f 54 5f 45 58 !defined(PROT_EX
0ed0: 45 43 29 20 26 26 20 64 65 66 69 6e 65 64 28 50 EC) && defined(P
0ee0: 52 4f 54 5f 45 58 45 43 55 54 45 29 20 2f 2a 20 ROT_EXECUTE) /*
0ef0: 49 72 69 78 20 34 2e 30 2e 35 20 6e 65 65 64 73 Irix 4.0.5 needs
0f00: 20 74 68 69 73 20 2a 2f 0a 23 64 65 66 69 6e 65 this */.#define
0f10: 20 50 52 4f 54 5f 45 58 45 43 20 50 52 4f 54 5f PROT_EXEC PROT_
0f20: 45 58 45 43 55 54 45 0a 23 65 6e 64 69 66 0a 23 EXECUTE.#endif.#
0f30: 65 6e 64 69 66 0a 0a 2f 2a 20 44 65 63 6c 61 72 endif../* Declar
0f40: 65 20 6f 70 65 6e 28 29 2e 20 2a 2f 0a 23 69 66 e open(). */.#if
0f50: 64 65 66 20 45 58 45 43 55 54 41 42 4c 45 5f 56 def EXECUTABLE_V
0f60: 49 41 5f 4d 4d 41 50 5f 44 45 56 5a 45 52 4f 0a IA_MMAP_DEVZERO.
0f70: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 #include <sys/ty
0f80: 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 pes.h>.#include
0f90: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c <unistd.h>.#incl
0fa0: 75 64 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23 69 ude <fcntl.h>.#i
0fb0: 66 64 65 66 20 4f 50 45 4e 5f 4e 45 45 44 53 5f fdef OPEN_NEEDS_
0fc0: 53 59 53 5f 46 49 4c 45 5f 48 0a 23 69 6e 63 6c SYS_FILE_H.#incl
0fd0: 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68 3e ude <sys/file.h>
0fe0: 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a .#endif.#endif..
0ff0: 2f 2a 20 44 65 63 6c 61 72 65 20 73 68 6d 67 65 /* Declare shmge
1000: 74 28 29 2c 20 73 68 6d 61 74 28 29 2c 20 73 68 t(), shmat(), sh
1010: 6d 63 74 6c 28 29 2e 20 2a 2f 0a 23 69 66 64 65 mctl(). */.#ifde
1020: 66 20 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41 f EXECUTABLE_VIA
1030: 5f 53 48 4d 0a 23 69 6e 63 6c 75 64 65 20 3c 73 _SHM.#include <s
1040: 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 ys/types.h>.#inc
1050: 6c 75 64 65 20 3c 73 79 73 2f 69 70 63 2e 68 3e lude <sys/ipc.h>
1060: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 .#include <sys/s
1070: 68 6d 2e 68 3e 0a 23 69 66 64 65 66 20 48 41 56 hm.h>.#ifdef HAV
1080: 45 5f 53 59 53 5f 53 59 53 4d 41 43 52 4f 53 5f E_SYS_SYSMACROS_
1090: 48 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f H.#include <sys/
10a0: 73 79 73 6d 61 63 72 6f 73 2e 68 3e 0a 23 65 6e sysmacros.h>.#en
10b0: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 53 dif.#endif../* S
10c0: 75 70 70 6f 72 74 20 66 6f 72 20 69 6e 73 74 72 upport for instr
10d0: 75 63 74 69 6f 6e 20 63 61 63 68 65 20 66 6c 75 uction cache flu
10e0: 73 68 2e 20 2a 2f 0a 23 69 66 64 65 66 20 5f 5f sh. */.#ifdef __
10f0: 69 33 38 36 5f 5f 0a 23 69 66 20 64 65 66 69 6e i386__.#if defin
1100: 65 64 28 5f 57 49 4e 33 32 29 20 2f 2a 20 57 69 ed(_WIN32) /* Wi
1110: 6e 64 6f 77 73 4e 54 20 6f 72 20 57 69 6e 64 6f ndowsNT or Windo
1120: 77 73 39 35 20 2a 2f 0a 23 64 65 66 69 6e 65 20 ws95 */.#define
1130: 57 49 4e 33 32 5f 4c 45 41 4e 5f 41 4e 44 5f 4d WIN32_LEAN_AND_M
1140: 45 41 4e 0a 23 64 65 66 69 6e 65 20 57 49 4e 33 EAN.#define WIN3
1150: 32 5f 45 58 54 52 41 5f 4c 45 41 4e 0a 23 69 6e 2_EXTRA_LEAN.#in
1160: 63 6c 75 64 65 20 3c 77 69 6e 64 6f 77 73 2e 68 clude <windows.h
1170: 3e 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a >.#endif.#endif.
1180: 23 69 66 64 65 66 20 5f 5f 6d 36 38 6b 5f 5f 0a #ifdef __m68k__.
1190: 23 69 66 20 64 65 66 69 6e 65 64 28 41 4d 49 47 #if defined(AMIG
11a0: 41 29 20 2f 2a 20 41 6d 69 67 61 20 72 75 6e 6e A) /* Amiga runn
11b0: 69 6e 67 20 41 6d 69 67 61 4f 53 2c 20 6e 6f 74 ing AmigaOS, not
11c0: 20 4c 69 6e 75 78 20 2a 2f 0a 23 69 6e 63 6c 75 Linux */.#inclu
11d0: 64 65 20 3c 65 78 65 63 2f 74 79 70 65 73 2e 68 de <exec/types.h
11e0: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 78 65 63 >.#include <exec
11f0: 2f 65 78 65 63 62 61 73 65 2e 68 3e 0a 23 69 6e /execbase.h>.#in
1200: 63 6c 75 64 65 20 3c 70 72 6f 74 6f 2f 65 78 65 clude <proto/exe
1210: 63 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 c.h>.#endif.#ifd
1220: 65 66 20 68 70 75 78 0a 23 69 6e 63 6c 75 64 65 ef hpux.#include
1230: 20 3c 73 79 73 2f 63 61 63 68 65 2e 68 3e 0a 23 <sys/cache.h>.#
1240: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 endif.#endif.#if
1250: 20 64 65 66 69 6e 65 64 28 5f 5f 6d 69 70 73 5f defined(__mips_
1260: 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f _) || defined(__
1270: 6d 69 70 73 6e 33 32 5f 5f 29 20 7c 7c 20 64 65 mipsn32__) || de
1280: 66 69 6e 65 64 28 5f 5f 6d 69 70 73 36 34 5f 5f fined(__mips64__
1290: 29 0a 23 69 66 64 65 66 20 75 6c 74 72 69 78 0a ).#ifdef ultrix.
12a0: 23 69 6e 63 6c 75 64 65 20 3c 6d 69 70 73 2f 63 #include <mips/c
12b0: 61 63 68 65 63 74 6c 2e 68 3e 0a 23 65 6c 73 65 achectl.h>.#else
12c0: 0a 23 69 66 64 65 66 20 6c 69 6e 75 78 0a 23 69 .#ifdef linux.#i
12d0: 6e 63 6c 75 64 65 20 3c 61 73 6d 2f 63 61 63 68 nclude <asm/cach
12e0: 65 63 74 6c 2e 68 3e 0a 23 65 6c 73 65 0a 23 69 ectl.h>.#else.#i
12f0: 66 64 65 66 20 48 41 56 45 5f 53 59 53 5f 43 41 fdef HAVE_SYS_CA
1300: 43 48 45 43 54 4c 5f 48 0a 23 69 6e 63 6c 75 64 CHECTL_H.#includ
1310: 65 20 3c 73 79 73 2f 63 61 63 68 65 63 74 6c 2e e <sys/cachectl.
1320: 68 3e 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 h>.#endif.#endif
1330: 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 .#endif.#endif.#
1340: 69 66 64 65 66 20 5f 5f 6d 38 38 6b 5f 5f 0a 23 ifdef __m88k__.#
1350: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 79 73 include <sys/sys
1360: 6c 6f 63 61 6c 2e 68 3e 0a 23 65 6e 64 69 66 0a local.h>.#endif.
1370: 2f 2a 20 49 6e 6c 69 6e 65 20 61 73 73 65 6d 62 /* Inline assemb
1380: 6c 79 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 ly function for
1390: 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 61 63 68 instruction cach
13a0: 65 20 66 6c 75 73 68 2e 20 2a 2f 0a 23 69 66 20 e flush. */.#if
13b0: 64 65 66 69 6e 65 64 28 5f 5f 73 70 61 72 63 5f defined(__sparc_
13c0: 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f _) || defined(__
13d0: 73 70 61 72 63 36 34 5f 5f 29 20 7c 7c 20 64 65 sparc64__) || de
13e0: 66 69 6e 65 64 28 5f 5f 61 6c 70 68 61 5f 5f 29 fined(__alpha__)
13f0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 68 70 || defined(__hp
1400: 70 61 6f 6c 64 5f 5f 29 20 7c 7c 20 64 65 66 69 paold__) || defi
1410: 6e 65 64 28 5f 5f 72 73 36 30 30 30 73 79 73 76 ned(__rs6000sysv
1420: 34 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4__) || defined(
1430: 5f 5f 72 73 36 30 30 30 6e 65 74 62 73 64 5f 5f __rs6000netbsd__
1440: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 63 ) || defined(__c
1450: 6f 6e 76 65 78 5f 5f 29 0a 23 69 66 64 65 66 20 onvex__).#ifdef
1460: 5f 5f 47 4e 55 43 5f 5f 0a 65 78 74 65 72 6e 20 __GNUC__.extern
1470: 69 6e 6c 69 6e 65 0a 23 69 66 20 64 65 66 69 6e inline.#if defin
1480: 65 64 28 5f 5f 73 70 61 72 63 5f 5f 29 20 7c 7c ed(__sparc__) ||
1490: 20 64 65 66 69 6e 65 64 28 5f 5f 73 70 61 72 63 defined(__sparc
14a0: 36 34 5f 5f 29 0a 23 69 6e 63 6c 75 64 65 20 22 64__).#include "
14b0: 63 61 63 68 65 2d 73 70 61 72 63 2e 63 22 0a 23 cache-sparc.c".#
14c0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 61 endif.#ifdef __a
14d0: 6c 70 68 61 5f 5f 0a 23 69 6e 63 6c 75 64 65 20 lpha__.#include
14e0: 22 63 61 63 68 65 2d 61 6c 70 68 61 2e 63 22 0a "cache-alpha.c".
14f0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f #endif.#ifdef __
1500: 68 70 70 61 5f 5f 0a 23 69 6e 63 6c 75 64 65 20 hppa__.#include
1510: 22 63 61 63 68 65 2d 68 70 70 61 2e 63 22 0a 23 "cache-hppa.c".#
1520: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 72 endif.#ifdef __r
1530: 73 36 30 30 30 5f 5f 0a 23 69 6e 63 6c 75 64 65 s6000__.#include
1540: 20 22 63 61 63 68 65 2d 72 73 36 30 30 30 2e 63 "cache-rs6000.c
1550: 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 ".#endif.#ifdef
1560: 5f 5f 63 6f 6e 76 65 78 5f 5f 0a 23 69 6e 63 6c __convex__.#incl
1570: 75 64 65 20 22 63 61 63 68 65 2d 63 6f 6e 76 65 ude "cache-conve
1580: 78 2e 63 22 0a 23 65 6e 64 69 66 0a 23 65 6c 73 x.c".#endif.#els
1590: 65 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f e.#if defined(__
15a0: 73 70 61 72 63 5f 5f 29 20 7c 7c 20 64 65 66 69 sparc__) || defi
15b0: 6e 65 64 28 5f 5f 73 70 61 72 63 36 34 5f 5f 29 ned(__sparc64__)
15c0: 0a 65 78 74 65 72 6e 20 76 6f 69 64 20 5f 5f 54 .extern void __T
15d0: 52 5f 63 6c 65 61 72 5f 63 61 63 68 65 5f 34 28 R_clear_cache_4(
15e0: 29 3b 0a 23 65 6c 73 65 0a 65 78 74 65 72 6e 20 );.#else.extern
15f0: 76 6f 69 64 20 5f 5f 54 52 5f 63 6c 65 61 72 5f void __TR_clear_
1600: 63 61 63 68 65 28 29 3b 0a 23 65 6e 64 69 66 0a cache();.#endif.
1610: 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f #endif.#endif../
1620: 2a 20 4c 65 6e 67 74 68 20 61 6e 64 20 61 6c 69 * Length and ali
1630: 67 6e 6d 65 6e 74 20 6f 66 20 74 72 61 6d 70 6f gnment of trampo
1640: 6c 69 6e 65 20 2a 2f 0a 23 69 66 64 65 66 20 5f line */.#ifdef _
1650: 5f 69 33 38 36 5f 5f 0a 23 64 65 66 69 6e 65 20 _i386__.#define
1660: 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 31 36 0a TRAMP_LENGTH 16.
1670: 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c #define TRAMP_AL
1680: 49 47 4e 20 31 36 20 20 2f 2a 20 34 20 66 6f 72 IGN 16 /* 4 for
1690: 20 61 20 69 33 38 36 2c 20 31 36 20 66 6f 72 20 a i386, 16 for
16a0: 61 20 69 34 38 36 20 2a 2f 0a 23 65 6e 64 69 66 a i486 */.#endif
16b0: 0a 23 69 66 64 65 66 20 5f 5f 6d 36 38 6b 5f 5f .#ifdef __m68k__
16c0: 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c .#define TRAMP_L
16d0: 45 4e 47 54 48 20 31 34 0a 23 64 65 66 69 6e 65 ENGTH 14.#define
16e0: 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20 31 36 0a TRAMP_ALIGN 16.
16f0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
1700: 65 64 28 5f 5f 6d 69 70 73 5f 5f 29 20 26 26 20 ed(__mips__) &&
1710: 21 64 65 66 69 6e 65 64 28 5f 5f 6d 69 70 73 6e !defined(__mipsn
1720: 33 32 5f 5f 29 0a 23 64 65 66 69 6e 65 20 54 52 32__).#define TR
1730: 41 4d 50 5f 4c 45 4e 47 54 48 20 32 34 0a 23 64 AMP_LENGTH 24.#d
1740: 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 efine TRAMP_ALIG
1750: 4e 20 34 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 N 4.#endif.#ifde
1760: 66 20 5f 5f 6d 69 70 73 6e 33 32 5f 5f 0a 23 64 f __mipsn32__.#d
1770: 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47 efine TRAMP_LENG
1780: 54 48 20 32 34 0a 23 64 65 66 69 6e 65 20 54 52 TH 24.#define TR
1790: 41 4d 50 5f 41 4c 49 47 4e 20 34 0a 23 65 6e 64 AMP_ALIGN 4.#end
17a0: 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d 69 70 73 if.#ifdef __mips
17b0: 36 34 6f 6c 64 5f 5f 0a 23 64 65 66 69 6e 65 20 64old__.#define
17c0: 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 35 36 0a TRAMP_LENGTH 56.
17d0: 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c #define TRAMP_AL
17e0: 49 47 4e 20 34 0a 23 65 6e 64 69 66 0a 23 69 66 IGN 4.#endif.#if
17f0: 64 65 66 20 5f 5f 6d 69 70 73 36 34 5f 5f 0a 23 def __mips64__.#
1800: 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e define TRAMP_LEN
1810: 47 54 48 20 33 32 0a 23 64 65 66 69 6e 65 20 54 GTH 32.#define T
1820: 52 41 4d 50 5f 41 4c 49 47 4e 20 38 0a 23 65 6e RAMP_ALIGN 8.#en
1830: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
1840: 5f 5f 73 70 61 72 63 5f 5f 29 20 26 26 20 21 64 __sparc__) && !d
1850: 65 66 69 6e 65 64 28 5f 5f 73 70 61 72 63 36 34 efined(__sparc64
1860: 5f 5f 29 0a 23 64 65 66 69 6e 65 20 54 52 41 4d __).#define TRAM
1870: 50 5f 4c 45 4e 47 54 48 20 31 36 0a 23 64 65 66 P_LENGTH 16.#def
1880: 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20 ine TRAMP_ALIGN
1890: 31 36 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 16.#endif.#ifdef
18a0: 20 5f 5f 73 70 61 72 63 36 34 5f 5f 0a 23 64 65 __sparc64__.#de
18b0: 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47 54 fine TRAMP_LENGT
18c0: 48 20 33 32 0a 23 64 65 66 69 6e 65 20 54 52 41 H 32.#define TRA
18d0: 4d 50 5f 41 4c 49 47 4e 20 31 36 0a 23 65 6e 64 MP_ALIGN 16.#end
18e0: 69 66 0a 23 69 66 64 65 66 20 5f 5f 61 6c 70 68 if.#ifdef __alph
18f0: 61 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52 41 4d a__.#define TRAM
1900: 50 5f 4c 45 4e 47 54 48 20 33 32 0a 23 64 65 66 P_LENGTH 32.#def
1910: 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20 ine TRAMP_ALIGN
1920: 38 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 8.#endif.#ifdef
1930: 5f 5f 68 70 70 61 6f 6c 64 5f 5f 0a 23 64 65 66 __hppaold__.#def
1940: 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 ine TRAMP_LENGTH
1950: 20 34 38 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 48.#define TRAM
1960: 50 5f 41 4c 49 47 4e 20 31 36 0a 23 65 6e 64 69 P_ALIGN 16.#endi
1970: 66 0a 23 69 66 64 65 66 20 5f 5f 68 70 70 61 6e f.#ifdef __hppan
1980: 65 77 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52 41 ew__.#define TRA
1990: 4d 50 5f 4c 45 4e 47 54 48 20 31 36 0a 23 64 65 MP_LENGTH 16.#de
19a0: 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e fine TRAMP_ALIGN
19b0: 20 31 36 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 16.#define TRAM
19c0: 50 5f 42 49 41 53 20 32 0a 23 65 6e 64 69 66 0a P_BIAS 2.#endif.
19d0: 23 69 66 64 65 66 20 5f 5f 61 72 6d 5f 5f 0a 23 #ifdef __arm__.#
19e0: 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e define TRAMP_LEN
19f0: 47 54 48 20 33 32 0a 23 64 65 66 69 6e 65 20 54 GTH 32.#define T
1a00: 52 41 4d 50 5f 41 4c 49 47 4e 20 34 0a 23 65 6e RAMP_ALIGN 4.#en
1a10: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 72 73 36 dif.#ifdef __rs6
1a20: 30 30 30 73 79 73 76 34 5f 5f 0a 23 64 65 66 69 000sysv4__.#defi
1a30: 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 ne TRAMP_LENGTH
1a40: 32 34 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 24.#define TRAMP
1a50: 5f 41 4c 49 47 4e 20 34 0a 23 65 6e 64 69 66 0a _ALIGN 4.#endif.
1a60: 23 69 66 64 65 66 20 5f 5f 72 73 36 30 30 30 6e #ifdef __rs6000n
1a70: 65 74 62 73 64 5f 5f 0a 23 64 65 66 69 6e 65 20 etbsd__.#define
1a80: 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 32 34 0a TRAMP_LENGTH 24.
1a90: 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c #define TRAMP_AL
1aa0: 49 47 4e 20 34 0a 23 65 6e 64 69 66 0a 23 69 66 IGN 4.#endif.#if
1ab0: 64 65 66 20 5f 5f 72 73 36 30 30 30 61 69 78 5f def __rs6000aix_
1ac0: 5f 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f _.#define TRAMP_
1ad0: 4c 45 4e 47 54 48 20 32 30 0a 23 64 65 66 69 6e LENGTH 20.#defin
1ae0: 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20 34 0a e TRAMP_ALIGN 4.
1af0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f #endif.#ifdef __
1b00: 6d 38 38 6b 5f 5f 0a 23 64 65 66 69 6e 65 20 54 m88k__.#define T
1b10: 52 41 4d 50 5f 4c 45 4e 47 54 48 20 32 30 0a 23 RAMP_LENGTH 20.#
1b20: 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 define TRAMP_ALI
1b30: 47 4e 20 38 0a 23 65 6e 64 69 66 0a 23 69 66 64 GN 8.#endif.#ifd
1b40: 65 66 20 5f 5f 63 6f 6e 76 65 78 5f 5f 0a 23 64 ef __convex__.#d
1b50: 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47 efine TRAMP_LENG
1b60: 54 48 20 31 34 0a 23 64 65 66 69 6e 65 20 54 52 TH 14.#define TR
1b70: 41 4d 50 5f 41 4c 49 47 4e 20 34 0a 23 65 6e 64 AMP_ALIGN 4.#end
1b80: 69 66 0a 23 69 66 64 65 66 20 5f 5f 69 61 36 34 if.#ifdef __ia64
1b90: 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 __.#define TRAMP
1ba0: 5f 4c 45 4e 47 54 48 20 33 32 0a 23 64 65 66 69 _LENGTH 32.#defi
1bb0: 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20 31 ne TRAMP_ALIGN 1
1bc0: 36 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 6.#endif.#ifdef
1bd0: 5f 5f 78 38 36 5f 36 34 5f 5f 0a 23 64 65 66 69 __x86_64__.#defi
1be0: 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 ne TRAMP_LENGTH
1bf0: 32 32 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 22.#define TRAMP
1c00: 5f 41 4c 49 47 4e 20 31 36 0a 23 65 6e 64 69 66 _ALIGN 16.#endif
1c10: 0a 23 69 66 64 65 66 20 5f 5f 73 33 39 30 5f 5f .#ifdef __s390__
1c20: 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c .#define TRAMP_L
1c30: 45 4e 47 54 48 20 32 32 0a 23 64 65 66 69 6e 65 ENGTH 22.#define
1c40: 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20 32 0a 23 TRAMP_ALIGN 2.#
1c50: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 54 endif..#ifndef T
1c60: 52 41 4d 50 5f 42 49 41 53 0a 23 64 65 66 69 6e RAMP_BIAS.#defin
1c70: 65 20 54 52 41 4d 50 5f 42 49 41 53 20 30 0a 23 e TRAMP_BIAS 0.#
1c80: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 54 endif..#define T
1c90: 52 41 4d 50 5f 54 4f 54 41 4c 5f 4c 45 4e 47 54 RAMP_TOTAL_LENGT
1ca0: 48 20 28 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 H (TRAMP_LENGTH
1cb0: 2b 20 32 2a 73 69 7a 65 6f 66 28 76 6f 69 64 2a + 2*sizeof(void*
1cc0: 29 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 ))..#if !defined
1cd0: 28 43 4f 44 45 5f 45 58 45 43 55 54 41 42 4c 45 (CODE_EXECUTABLE
1ce0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 45 58 ) && !defined(EX
1cf0: 45 43 55 54 41 42 4c 45 5f 56 49 41 5f 4d 50 52 ECUTABLE_VIA_MPR
1d00: 4f 54 45 43 54 29 0a 2f 2a 20 41 49 58 20 64 6f OTECT)./* AIX do
1d10: 65 73 6e 27 74 20 73 75 70 70 6f 72 74 20 6d 70 esn't support mp
1d20: 72 6f 74 65 63 74 28 29 20 69 6e 20 6d 61 6c 6c rotect() in mall
1d30: 6f 63 27 65 64 20 6d 65 6d 6f 72 79 2e 20 4d 75 oc'ed memory. Mu
1d40: 73 74 20 67 65 74 20 70 61 67 65 73 20 6f 66 0a st get pages of.
1d50: 20 2a 20 6d 65 6d 6f 72 79 20 77 69 74 68 20 65 * memory with e
1d60: 78 65 63 75 74 65 20 70 65 72 6d 69 73 73 69 6f xecute permissio
1d70: 6e 20 76 69 61 20 6d 6d 61 70 28 29 2e 20 54 68 n via mmap(). Th
1d80: 65 6e 20 6b 65 65 70 20 61 20 66 72 65 65 20 6c en keep a free l
1d90: 69 73 74 20 6f 66 0a 20 2a 20 66 72 65 65 20 74 ist of. * free t
1da0: 72 61 6d 70 6f 6c 69 6e 65 73 2e 0a 20 2a 2f 0a rampolines.. */.
1db0: 73 74 61 74 69 63 20 63 68 61 72 2a 20 66 72 65 static char* fre
1dc0: 65 6c 69 73 74 20 3d 20 4e 55 4c 4c 3b 0a 23 65 elist = NULL;.#e
1dd0: 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 ndif..#if define
1de0: 64 28 5f 5f 53 54 44 43 5f 5f 29 20 7c 7c 20 64 d(__STDC__) || d
1df0: 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 efined(__GNUC__)
1e00: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 || defined(__cp
1e10: 6c 75 73 70 6c 75 73 29 0a 5f 5f 54 52 5f 66 75 lusplus).__TR_fu
1e20: 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 5f 74 72 61 nction alloc_tra
1e30: 6d 70 6f 6c 69 6e 65 5f 72 20 28 5f 5f 54 52 5f mpoline_r (__TR_
1e40: 66 75 6e 63 74 69 6f 6e 20 61 64 64 72 65 73 73 function address
1e50: 2c 20 76 6f 69 64 2a 20 64 61 74 61 30 2c 20 76 , void* data0, v
1e60: 6f 69 64 2a 20 64 61 74 61 31 29 0a 23 65 6c 73 oid* data1).#els
1e70: 65 0a 5f 5f 54 52 5f 66 75 6e 63 74 69 6f 6e 20 e.__TR_function
1e80: 61 6c 6c 6f 63 5f 74 72 61 6d 70 6f 6c 69 6e 65 alloc_trampoline
1e90: 5f 72 20 28 61 64 64 72 65 73 73 2c 20 64 61 74 _r (address, dat
1ea0: 61 30 2c 20 64 61 74 61 31 29 0a 20 20 5f 5f 54 a0, data1). __T
1eb0: 52 5f 66 75 6e 63 74 69 6f 6e 20 61 64 64 72 65 R_function addre
1ec0: 73 73 3b 0a 20 20 76 6f 69 64 2a 20 64 61 74 61 ss;. void* data
1ed0: 30 3b 0a 20 20 76 6f 69 64 2a 20 64 61 74 61 31 0;. void* data1
1ee0: 3b 0a 23 65 6e 64 69 66 0a 7b 0a 20 20 63 68 61 ;.#endif.{. cha
1ef0: 72 2a 20 66 75 6e 63 74 69 6f 6e 3b 0a 20 20 63 r* function;. c
1f00: 68 61 72 2a 20 64 61 74 61 3b 0a 0a 23 69 66 20 har* data;..#if
1f10: 21 64 65 66 69 6e 65 64 28 43 4f 44 45 5f 45 58 !defined(CODE_EX
1f20: 45 43 55 54 41 42 4c 45 29 0a 20 20 73 74 61 74 ECUTABLE). stat
1f30: 69 63 20 6c 6f 6e 67 20 70 61 67 65 73 69 7a 65 ic long pagesize
1f40: 20 3d 20 30 3b 0a 23 69 66 20 64 65 66 69 6e 65 = 0;.#if define
1f50: 64 28 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41 d(EXECUTABLE_VIA
1f60: 5f 4d 4d 41 50 5f 44 45 56 5a 45 52 4f 29 0a 20 _MMAP_DEVZERO).
1f70: 20 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f static int zero
1f80: 5f 66 64 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a _fd;.#endif. /*
1f90: 20 46 69 72 73 74 2c 20 67 65 74 20 74 68 65 20 First, get the
1fa0: 70 61 67 65 20 73 69 7a 65 20 6f 6e 63 65 20 61 page size once a
1fb0: 6e 64 20 66 6f 72 20 61 6c 6c 2e 20 2a 2f 0a 20 nd for all. */.
1fc0: 20 69 66 20 28 21 70 61 67 65 73 69 7a 65 29 0a if (!pagesize).
1fd0: 20 20 20 20 7b 0a 23 69 66 20 64 65 66 69 6e 65 {.#if define
1fe0: 64 28 48 41 56 45 5f 4d 41 43 48 5f 56 4d 29 0a d(HAVE_MACH_VM).
1ff0: 20 20 20 20 20 20 70 61 67 65 73 69 7a 65 20 3d pagesize =
2000: 20 76 6d 5f 70 61 67 65 5f 73 69 7a 65 3b 0a 23 vm_page_size;.#
2010: 65 6c 73 65 0a 20 20 20 20 20 20 70 61 67 65 73 else. pages
2020: 69 7a 65 20 3d 20 67 65 74 70 61 67 65 73 69 7a ize = getpagesiz
2030: 65 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 e();.#endif.#if
2040: 64 65 66 69 6e 65 64 28 45 58 45 43 55 54 41 42 defined(EXECUTAB
2050: 4c 45 5f 56 49 41 5f 4d 4d 41 50 5f 44 45 56 5a LE_VIA_MMAP_DEVZ
2060: 45 52 4f 29 0a 20 20 20 20 20 20 7a 65 72 6f 5f ERO). zero_
2070: 66 64 20 3d 20 6f 70 65 6e 28 22 2f 64 65 76 2f fd = open("/dev/
2080: 7a 65 72 6f 22 2c 4f 5f 52 44 4f 4e 4c 59 2c 30 zero",O_RDONLY,0
2090: 36 34 34 29 3b 0a 20 20 20 20 20 20 69 66 20 28 644);. if (
20a0: 7a 65 72 6f 5f 66 64 20 3c 20 30 29 0a 20 20 20 zero_fd < 0).
20b0: 20 20 20 20 20 7b 20 66 70 72 69 6e 74 66 28 73 { fprintf(s
20c0: 74 64 65 72 72 2c 22 74 72 61 6d 70 6f 6c 69 6e tderr,"trampolin
20d0: 65 3a 20 43 61 6e 6e 6f 74 20 6f 70 65 6e 20 2f e: Cannot open /
20e0: 64 65 76 2f 7a 65 72 6f 21 5c 6e 22 29 3b 20 61 dev/zero!\n"); a
20f0: 62 6f 72 74 28 29 3b 20 7d 0a 23 65 6e 64 69 66 bort(); }.#endif
2100: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 . }.#endif..
2110: 20 2f 2a 20 31 2e 20 41 6c 6c 6f 63 61 74 65 20 /* 1. Allocate
2120: 72 6f 6f 6d 20 2a 2f 0a 0a 23 69 66 20 21 64 65 room */..#if !de
2130: 66 69 6e 65 64 28 43 4f 44 45 5f 45 58 45 43 55 fined(CODE_EXECU
2140: 54 41 42 4c 45 29 20 26 26 20 21 64 65 66 69 6e TABLE) && !defin
2150: 65 64 28 45 58 45 43 55 54 41 42 4c 45 5f 56 49 ed(EXECUTABLE_VI
2160: 41 5f 4d 50 52 4f 54 45 43 54 29 0a 20 20 2f 2a A_MPROTECT). /*
2170: 20 4e 6f 74 65 3a 20 54 68 69 73 20 6d 65 6d 6f Note: This memo
2180: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 ry allocation is
2190: 20 6e 6f 74 20 6d 75 6c 74 69 74 68 72 65 61 64 not multithread
21a0: 2d 73 61 66 65 2e 20 57 65 20 6d 69 67 68 74 20 -safe. We might
21b0: 6e 65 65 64 0a 20 20 20 2a 20 74 6f 20 61 64 64 need. * to add
21c0: 20 73 70 65 63 69 61 6c 20 28 70 6c 61 74 66 6f special (platfo
21d0: 72 6d 20 64 65 70 65 6e 64 65 6e 74 29 20 63 6f rm dependent) co
21e0: 64 65 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 2e 0a de for locking..
21f0: 20 20 20 2a 20 46 6f 72 74 75 6e 61 74 65 6c 79 * Fortunately
2200: 2c 20 6d 6f 73 74 20 6d 6f 64 65 72 6e 20 73 79 , most modern sy
2210: 73 74 65 6d 73 20 77 68 65 72 65 20 6d 75 6c 74 stems where mult
2220: 69 74 68 72 65 61 64 2d 73 61 66 65 74 79 20 6d ithread-safety m
2230: 61 74 74 65 72 73 0a 20 20 20 2a 20 68 61 76 65 atters. * have
2240: 20 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41 5f EXECUTABLE_VIA_
2250: 4d 50 52 4f 54 45 43 54 2c 20 61 6e 64 20 74 68 MPROTECT, and th
2260: 6f 73 65 20 77 68 69 63 68 20 64 6f 6e 27 74 20 ose which don't
2270: 28 41 49 58 20 6f 6e 20 72 73 36 30 30 30 20 61 (AIX on rs6000 a
2280: 6e 64 0a 20 20 20 2a 20 48 50 2d 55 58 20 6f 6e nd. * HP-UX on
2290: 20 68 70 70 61 29 20 68 61 76 65 20 43 4f 44 45 hppa) have CODE
22a0: 5f 45 58 45 43 55 54 41 42 4c 45 2e 20 54 68 75 _EXECUTABLE. Thu
22b0: 73 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 s no locking cod
22c0: 65 20 69 73 20 6e 65 65 64 65 64 0a 20 20 20 2a e is needed. *
22d0: 20 66 6f 72 20 74 68 65 20 6d 6f 6d 65 6e 74 2e for the moment.
22e0: 0a 20 20 20 2a 2f 0a 20 20 69 66 20 28 66 72 65 . */. if (fre
22f0: 65 6c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 0a 20 elist == NULL).
2300: 20 20 20 7b 20 2f 2a 20 47 65 74 20 61 20 6e 65 { /* Get a ne
2310: 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 w page. */.
2320: 20 63 68 61 72 2a 20 70 61 67 65 3b 0a 23 69 66 char* page;.#if
2330: 64 65 66 20 45 58 45 43 55 54 41 42 4c 45 5f 56 def EXECUTABLE_V
2340: 49 41 5f 4d 4d 41 50 5f 41 4e 4f 4e 59 4d 4f 55 IA_MMAP_ANONYMOU
2350: 53 0a 20 20 20 20 20 20 70 61 67 65 20 3d 20 6d S. page = m
2360: 6d 61 70 28 30 2c 20 70 61 67 65 73 69 7a 65 2c map(0, pagesize,
2370: 20 50 52 4f 54 5f 52 45 41 44 20 7c 20 50 52 4f PROT_READ | PRO
2380: 54 5f 57 52 49 54 45 20 7c 20 50 52 4f 54 5f 45 T_WRITE | PROT_E
2390: 58 45 43 2c 20 4d 41 50 5f 41 4e 4f 4e 59 4d 4f XEC, MAP_ANONYMO
23a0: 55 53 20 7c 20 4d 41 50 5f 56 41 52 49 41 42 4c US | MAP_VARIABL
23b0: 45 2c 20 2d 31 2c 20 30 29 3b 0a 23 65 6e 64 69 E, -1, 0);.#endi
23c0: 66 0a 23 69 66 64 65 66 20 45 58 45 43 55 54 41 f.#ifdef EXECUTA
23d0: 42 4c 45 5f 56 49 41 5f 4d 4d 41 50 5f 44 45 56 BLE_VIA_MMAP_DEV
23e0: 5a 45 52 4f 0a 20 20 20 20 20 20 70 61 67 65 20 ZERO. page
23f0: 3d 20 6d 6d 61 70 28 30 2c 20 70 61 67 65 73 69 = mmap(0, pagesi
2400: 7a 65 2c 20 50 52 4f 54 5f 52 45 41 44 20 7c 20 ze, PROT_READ |
2410: 50 52 4f 54 5f 57 52 49 54 45 20 7c 20 50 52 4f PROT_WRITE | PRO
2420: 54 5f 45 58 45 43 2c 20 4d 41 50 5f 50 52 49 56 T_EXEC, MAP_PRIV
2430: 41 54 45 2c 20 7a 65 72 6f 5f 66 64 2c 20 30 29 ATE, zero_fd, 0)
2440: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 ;.#endif.#ifdef
2450: 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41 5f 53 EXECUTABLE_VIA_S
2460: 48 4d 0a 20 20 20 20 20 20 69 6e 74 20 73 68 6d HM. int shm
2470: 69 64 20 3d 20 73 68 6d 67 65 74 28 49 50 43 5f id = shmget(IPC_
2480: 50 52 49 56 41 54 45 2c 20 70 61 67 65 73 69 7a PRIVATE, pagesiz
2490: 65 2c 20 30 37 30 30 7c 49 50 43 5f 43 52 45 41 e, 0700|IPC_CREA
24a0: 54 29 3b 0a 20 20 20 20 20 20 69 66 20 28 73 68 T);. if (sh
24b0: 6d 69 64 3c 30 29 0a 20 20 20 20 20 20 20 20 7b mid<0). {
24c0: 20 70 61 67 65 20 3d 20 28 63 68 61 72 2a 29 28 page = (char*)(
24d0: 2d 31 29 3b 20 7d 0a 20 20 20 20 20 20 65 6c 73 -1); }. els
24e0: 65 0a 20 20 20 20 20 20 20 20 7b 20 70 61 67 65 e. { page
24f0: 20 3d 20 73 68 6d 61 74 28 73 68 6d 69 64 2c 20 = shmat(shmid,
2500: 30 2c 20 30 29 3b 20 73 68 6d 63 74 6c 28 73 68 0, 0); shmctl(sh
2510: 6d 69 64 2c 20 49 50 43 5f 52 4d 49 44 2c 20 30 mid, IPC_RMID, 0
2520: 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 ); }.#endif.#ifd
2530: 65 66 20 5f 57 49 4e 33 32 0a 20 20 20 20 20 20 ef _WIN32.
2540: 70 61 67 65 20 3d 20 56 69 72 74 75 61 6c 41 6c page = VirtualAl
2550: 6c 6f 63 28 4e 55 4c 4c 2c 20 70 61 67 65 73 69 loc(NULL, pagesi
2560: 7a 65 2c 20 4d 45 4d 5f 43 4f 4d 4d 49 54 2c 20 ze, MEM_COMMIT,
2570: 50 41 47 45 5f 45 58 45 43 55 54 45 5f 52 45 41 PAGE_EXECUTE_REA
2580: 44 57 52 49 54 45 29 3b 0a 20 20 20 20 20 20 69 DWRITE);. i
2590: 66 20 28 70 61 67 65 20 3d 3d 20 30 29 0a 20 20 f (page == 0).
25a0: 20 20 20 20 09 7b 20 70 61 67 65 20 3d 20 28 63 .{ page = (c
25b0: 68 61 72 2a 29 28 2d 31 29 3b 20 7d 0a 23 65 6e har*)(-1); }.#en
25c0: 64 69 66 0a 20 20 20 20 20 20 69 66 20 28 70 61 dif. if (pa
25d0: 67 65 20 3d 3d 20 28 63 68 61 72 2a 29 28 2d 31 ge == (char*)(-1
25e0: 29 29 0a 20 20 20 20 20 20 20 20 7b 20 66 70 72 )). { fpr
25f0: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 74 72 61 intf(stderr,"tra
2600: 6d 70 6f 6c 69 6e 65 3a 20 4f 75 74 20 6f 66 20 mpoline: Out of
2610: 76 69 72 74 75 61 6c 20 6d 65 6d 6f 72 79 21 5c virtual memory!\
2620: 6e 22 29 3b 20 61 62 6f 72 74 28 29 3b 20 7d 0a n"); abort(); }.
2630: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 74 /* Fill it
2640: 20 77 69 74 68 20 66 72 65 65 20 74 72 61 6d 70 with free tramp
2650: 6f 6c 69 6e 65 73 2e 20 2a 2f 0a 20 20 20 20 20 olines. */.
2660: 20 7b 20 63 68 61 72 2a 2a 20 6c 61 73 74 20 3d { char** last =
2670: 20 26 66 72 65 65 6c 69 73 74 3b 0a 20 20 20 20 &freelist;.
2680: 20 20 20 20 63 68 61 72 2a 20 70 61 67 65 5f 65 char* page_e
2690: 6e 64 20 3d 20 70 61 67 65 20 2b 20 70 61 67 65 nd = page + page
26a0: 73 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 77 68 size;. wh
26b0: 69 6c 65 20 28 70 61 67 65 2b 54 52 41 4d 50 5f ile (page+TRAMP_
26c0: 54 4f 54 41 4c 5f 4c 45 4e 47 54 48 20 3c 3d 20 TOTAL_LENGTH <=
26d0: 70 61 67 65 5f 65 6e 64 29 0a 20 20 20 20 20 20 page_end).
26e0: 20 20 20 20 7b 20 2a 6c 61 73 74 20 3d 20 70 61 { *last = pa
26f0: 67 65 3b 20 6c 61 73 74 20 3d 20 28 63 68 61 72 ge; last = (char
2700: 2a 2a 29 70 61 67 65 3b 20 70 61 67 65 20 2b 3d **)page; page +=
2710: 20 54 52 41 4d 50 5f 54 4f 54 41 4c 5f 4c 45 4e TRAMP_TOTAL_LEN
2720: 47 54 48 3b 20 7d 0a 20 20 20 20 20 20 20 20 2a GTH; }. *
2730: 6c 61 73 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 last = NULL;.
2740: 20 7d 20 7d 0a 20 20 66 75 6e 63 74 69 6f 6e 20 } }. function
2750: 3d 20 66 72 65 65 6c 69 73 74 3b 20 66 72 65 65 = freelist; free
2760: 6c 69 73 74 20 3d 20 2a 28 63 68 61 72 2a 2a 29 list = *(char**)
2770: 66 72 65 65 6c 69 73 74 3b 0a 23 65 6c 73 65 0a freelist;.#else.
2780: 20 20 7b 20 63 68 61 72 2a 20 72 6f 6f 6d 20 3d { char* room =
2790: 20 28 63 68 61 72 2a 29 20 6d 61 6c 6c 6f 63 28 (char*) malloc(
27a0: 73 69 7a 65 6f 66 28 76 6f 69 64 2a 29 20 2b 20 sizeof(void*) +
27b0: 54 52 41 4d 50 5f 54 4f 54 41 4c 5f 4c 45 4e 47 TRAMP_TOTAL_LENG
27c0: 54 48 20 2b 20 54 52 41 4d 50 5f 41 4c 49 47 4e TH + TRAMP_ALIGN
27d0: 2d 31 29 3b 0a 20 20 20 20 69 66 20 28 21 72 6f -1);. if (!ro
27e0: 6f 6d 29 0a 20 20 20 20 20 20 7b 20 66 70 72 69 om). { fpri
27f0: 6e 74 66 28 73 74 64 65 72 72 2c 22 74 72 61 6d ntf(stderr,"tram
2800: 70 6f 6c 69 6e 65 3a 20 4f 75 74 20 6f 66 20 76 poline: Out of v
2810: 69 72 74 75 61 6c 20 6d 65 6d 6f 72 79 21 5c 6e irtual memory!\n
2820: 22 29 3b 20 61 62 6f 72 74 28 29 3b 20 7d 0a 20 "); abort(); }.
2830: 20 20 20 66 75 6e 63 74 69 6f 6e 20 3d 20 28 63 function = (c
2840: 68 61 72 2a 29 28 28 28 6c 6f 6e 67 29 72 6f 6f har*)(((long)roo
2850: 6d 20 2b 20 73 69 7a 65 6f 66 28 76 6f 69 64 2a m + sizeof(void*
2860: 29 20 2b 20 54 52 41 4d 50 5f 41 4c 49 47 4e 2d ) + TRAMP_ALIGN-
2870: 31 29 20 26 20 2d 54 52 41 4d 50 5f 41 4c 49 47 1) & -TRAMP_ALIG
2880: 4e 29 3b 0a 20 20 20 20 28 28 63 68 61 72 2a 2a N);. ((char**
2890: 29 66 75 6e 63 74 69 6f 6e 29 5b 2d 31 5d 20 3d )function)[-1] =
28a0: 20 72 6f 6f 6d 3b 20 2f 2a 20 62 61 63 6b 70 6f room; /* backpo
28b0: 69 6e 74 65 72 20 66 6f 72 20 66 72 65 65 5f 74 inter for free_t
28c0: 72 61 6d 70 6f 6c 69 6e 65 28 29 20 2a 2f 0a 20 rampoline() */.
28d0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 }.#endif.. /*
28e0: 32 2e 20 46 69 6c 6c 20 6f 75 74 20 74 68 65 20 2. Fill out the
28f0: 74 72 61 6d 70 6f 6c 69 6e 65 20 2a 2f 0a 20 20 trampoline */.
2900: 64 61 74 61 20 3d 20 66 75 6e 63 74 69 6f 6e 20 data = function
2910: 2b 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 3b 0a + TRAMP_LENGTH;.
2920: 20 20 2f 2a 20 4b 6e 6f 77 69 6e 67 20 74 68 61 /* Knowing tha
2930: 74 20 64 61 74 61 20 3d 20 66 75 6e 63 74 69 6f t data = functio
2940: 6e 20 2b 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 n + TRAMP_LENGTH
2950: 2c 20 77 65 20 63 6f 75 6c 64 20 63 65 72 74 61 , we could certa
2960: 69 6e 6c 79 20 6f 70 74 69 6d 69 7a 65 0a 20 20 inly optimize.
2970: 20 2a 20 74 68 65 20 74 72 61 6d 70 6f 6c 69 6e * the trampolin
2980: 65 73 20 61 20 6c 69 74 74 6c 65 20 62 69 74 20 es a little bit
2990: 6d 6f 72 65 2c 20 75 73 69 6e 67 20 50 43 20 72 more, using PC r
29a0: 65 6c 61 74 69 76 65 20 61 64 64 72 65 73 73 69 elative addressi
29b0: 6e 67 20 6d 6f 64 65 73 2e 0a 20 20 20 2a 20 42 ng modes.. * B
29c0: 75 74 20 49 20 64 6f 75 62 74 20 69 74 27 73 20 ut I doubt it's
29d0: 72 65 61 6c 6c 79 20 77 6f 72 74 68 20 69 74 2e really worth it.
29e0: 0a 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 5f 5f . */.#ifdef __
29f0: 69 33 38 36 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 i386__. /* func
2a00: 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 70 6f tion:. * po
2a10: 70 6c 20 25 65 63 78 09 09 09 35 39 0a 20 20 20 pl %ecx...59.
2a20: 2a 20 20 20 20 70 75 73 68 6c 20 24 3c 64 61 74 * pushl $<dat
2a30: 61 3e 09 09 09 36 38 20 3c 64 61 74 61 3e 0a 20 a>...68 <data>.
2a40: 20 20 2a 20 20 20 20 70 75 73 68 6c 20 25 65 63 * pushl %ec
2a50: 78 09 09 09 35 31 0a 20 20 20 2a 20 20 20 20 6a x...51. * j
2a60: 6d 70 20 3c 61 64 64 72 65 73 73 3e 09 09 09 45 mp <address>...E
2a70: 39 20 3c 61 64 64 72 65 73 73 3e 2d 3c 68 65 72 9 <address>-<her
2a80: 65 3e 0a 20 20 20 2a 20 68 65 72 65 3a 0a 20 20 e>. * here:.
2a90: 20 2a 20 20 20 20 6e 6f 70 09 09 09 09 39 30 0a * nop....90.
2aa0: 20 20 20 2a 20 20 20 20 6e 6f 70 09 09 09 09 39 * nop....9
2ab0: 30 0a 20 20 20 2a 20 20 20 20 6e 6f 70 09 09 09 0. * nop...
2ac0: 09 39 30 0a 20 20 20 2a 20 20 20 20 6e 6f 70 09 .90. * nop.
2ad0: 09 09 09 39 30 0a 20 20 20 2a 2f 0a 20 20 2a 28 ...90. */. *(
2ae0: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
2af0: 6f 6e 20 2b 20 30 29 20 3d 20 30 78 36 38 35 39 on + 0) = 0x6859
2b00: 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 ;. *(long *) (
2b10: 66 75 6e 63 74 69 6f 6e 20 2b 20 32 29 20 3d 20 function + 2) =
2b20: 28 6c 6f 6e 67 29 20 64 61 74 61 3b 0a 20 20 2a (long) data;. *
2b30: 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 (short *) (funct
2b40: 69 6f 6e 20 2b 20 36 29 20 3d 20 30 78 45 39 35 ion + 6) = 0xE95
2b50: 31 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 1;. *(long *)
2b60: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d (function + 8) =
2b70: 20 28 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 20 (long) address
2b80: 2d 20 28 6c 6f 6e 67 29 20 28 66 75 6e 63 74 69 - (long) (functi
2b90: 6f 6e 20 2b 20 31 32 29 3b 0a 20 20 2a 28 6c 6f on + 12);. *(lo
2ba0: 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e ng *) (function
2bb0: 20 2b 31 32 29 20 3d 20 30 78 39 30 39 30 39 30 +12) = 0x909090
2bc0: 39 30 3b 20 20 20 2f 2a 20 6e 6f 70 20 6e 6f 70 90; /* nop nop
2bd0: 20 6e 6f 70 20 6e 6f 70 2c 20 66 6f 72 20 61 6c nop nop, for al
2be0: 69 67 6e 6d 65 6e 74 20 2a 2f 0a 23 64 65 66 69 ignment */.#defi
2bf0: 6e 65 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 ne is_tramp(func
2c00: 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e 73 tion) \. *(uns
2c10: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 igned short *) (
2c20: 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 3d function + 0) ==
2c30: 20 30 78 36 38 35 39 20 26 26 20 5c 0a 20 20 2a 0x6859 && \. *
2c40: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 (unsigned short
2c50: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 36 *) (function + 6
2c60: 29 20 3d 3d 20 30 78 45 39 35 31 0a 23 64 65 66 ) == 0xE951.#def
2c70: 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 65 73 ine tramp_addres
2c80: 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 s(function) \.
2c90: 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e *(long *) (fun
2ca0: 63 74 69 6f 6e 20 2b 20 38 29 20 2b 20 28 6c 6f ction + 8) + (lo
2cb0: 6e 67 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 ng) (function +
2cc0: 31 32 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 12).#define tram
2cd0: 70 5f 64 61 74 61 28 66 75 6e 63 74 69 6f 6e 29 p_data(function)
2ce0: 20 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 \. *(long *)
2cf0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 32 29 0a (function + 2).
2d00: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f #endif.#ifdef __
2d10: 6d 36 38 6b 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 m68k__. /* func
2d20: 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 6d 6f tion:. * mo
2d30: 76 65 6c 20 23 3c 64 61 74 61 3e 2c 61 30 09 09 vel #<data>,a0..
2d40: 32 30 20 37 43 20 3c 64 61 74 61 3e 0a 20 20 20 20 7C <data>.
2d50: 2a 20 20 20 20 6a 6d 70 20 3c 61 64 64 72 65 73 * jmp <addres
2d60: 73 3e 09 09 09 34 45 20 46 39 20 3c 61 64 64 72 s>...4E F9 <addr
2d70: 65 73 73 3e 0a 20 20 20 2a 20 20 20 20 6e 6f 70 ess>. * nop
2d80: 09 09 09 09 34 45 20 37 31 0a 20 20 20 2a 2f 0a ....4E 71. */.
2d90: 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 *(short *) (fu
2da0: 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20 30 78 nction + 0) = 0x
2db0: 32 30 37 43 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 207C;. *(long *
2dc0: 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 32 ) (function + 2
2dd0: 29 20 3d 20 28 6c 6f 6e 67 29 20 64 61 74 61 3b ) = (long) data;
2de0: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 . *(short *) (f
2df0: 75 6e 63 74 69 6f 6e 20 2b 20 36 29 20 3d 20 30 unction + 6) = 0
2e00: 78 34 45 46 39 3b 0a 20 20 2a 28 6c 6f 6e 67 20 x4EF9;. *(long
2e10: 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 *) (function +
2e20: 38 29 20 3d 20 28 6c 6f 6e 67 29 20 61 64 64 72 8) = (long) addr
2e30: 65 73 73 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a ess;. *(short *
2e40: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 ) (function +12)
2e50: 20 3d 20 30 78 34 45 37 31 3b 0a 23 64 65 66 69 = 0x4E71;.#defi
2e60: 6e 65 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 ne is_tramp(func
2e70: 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e 73 tion) \. *(uns
2e80: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 igned short *) (
2e90: 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 3d function + 0) ==
2ea0: 20 30 78 32 30 37 43 20 26 26 20 5c 0a 20 20 2a 0x207C && \. *
2eb0: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 (unsigned short
2ec0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 36 *) (function + 6
2ed0: 29 20 3d 3d 20 30 78 34 45 46 39 20 26 26 20 5c ) == 0x4EF9 && \
2ee0: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 . *(unsigned sh
2ef0: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ort *) (function
2f00: 20 2b 31 32 29 20 3d 3d 20 30 78 34 45 37 31 0a +12) == 0x4E71.
2f10: 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 #define tramp_ad
2f20: 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 dress(function)
2f30: 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 \. *(long *)
2f40: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 0a 23 (function + 8).#
2f50: 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 define tramp_dat
2f60: 61 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 a(function) \.
2f70: 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e *(long *) (fun
2f80: 63 74 69 6f 6e 20 2b 20 32 29 0a 23 65 6e 64 69 ction + 2).#endi
2f90: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f f.#if defined(__
2fa0: 6d 69 70 73 5f 5f 29 20 26 26 20 21 64 65 66 69 mips__) && !defi
2fb0: 6e 65 64 28 5f 5f 6d 69 70 73 6e 33 32 5f 5f 29 ned(__mipsn32__)
2fc0: 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a . /* function:.
2fd0: 20 20 20 2a 20 20 20 20 6c 69 20 24 32 2c 3c 64 * li $2,<d
2fe0: 61 74 61 3e 26 30 78 66 66 66 66 30 30 30 30 09 ata>&0xffff0000.
2ff0: 09 33 43 20 30 32 20 68 69 31 36 28 3c 64 61 74 .3C 02 hi16(<dat
3000: 61 3e 29 0a 20 20 20 2a 20 20 20 20 6f 72 69 20 a>). * ori
3010: 24 32 2c 24 32 2c 3c 64 61 74 61 3e 26 30 78 66 $2,$2,<data>&0xf
3020: 66 66 66 09 09 33 34 20 34 32 20 6c 6f 31 36 28 fff..34 42 lo16(
3030: 3c 64 61 74 61 3e 29 0a 20 20 20 2a 20 20 20 20 <data>). *
3040: 6c 69 20 24 32 35 2c 3c 61 64 64 72 65 73 73 3e li $25,<address>
3050: 26 30 78 66 66 66 66 30 30 30 30 09 33 43 20 31 &0xffff0000.3C 1
3060: 39 20 68 69 31 36 28 3c 61 64 64 72 65 73 73 3e 9 hi16(<address>
3070: 29 0a 20 20 20 2a 20 20 20 20 6f 72 69 20 24 32 ). * ori $2
3080: 35 2c 24 32 35 2c 3c 61 64 64 72 65 73 73 3e 26 5,$25,<address>&
3090: 30 78 66 66 66 66 09 33 37 20 33 39 20 6c 6f 31 0xffff.37 39 lo1
30a0: 36 28 3c 61 64 64 72 65 73 73 3e 29 0a 20 20 20 6(<address>).
30b0: 2a 20 20 20 20 6a 20 24 32 35 09 09 09 09 30 33 * j $25....03
30c0: 20 32 30 20 30 30 20 30 38 0a 20 20 20 2a 20 20 20 00 08. *
30d0: 20 20 6e 6f 70 09 09 09 09 30 30 20 30 30 20 30 nop....00 00 0
30e0: 30 20 30 30 0a 20 20 20 2a 2f 0a 20 20 2f 2a 20 0 00. */. /*
30f0: 57 68 61 74 20 61 62 6f 75 74 20 62 69 67 20 65 What about big e
3100: 6e 64 69 61 6e 20 2f 20 6c 69 74 74 6c 65 20 65 ndian / little e
3110: 6e 64 69 61 6e 20 3f 3f 20 2a 2f 0a 20 20 2a 28 ndian ?? */. *(
3120: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
3130: 6f 6e 20 2b 20 30 29 20 3d 20 30 78 33 43 30 32 on + 0) = 0x3C02
3140: 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 ;. *(short *) (
3150: 66 75 6e 63 74 69 6f 6e 20 2b 20 32 29 20 3d 20 function + 2) =
3160: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
3170: 64 61 74 61 20 3e 3e 20 31 36 3b 0a 20 20 2a 28 data >> 16;. *(
3180: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
3190: 6f 6e 20 2b 20 34 29 20 3d 20 30 78 33 34 34 32 on + 4) = 0x3442
31a0: 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 ;. *(short *) (
31b0: 66 75 6e 63 74 69 6f 6e 20 2b 20 36 29 20 3d 20 function + 6) =
31c0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
31d0: 64 61 74 61 20 26 20 30 78 66 66 66 66 3b 0a 20 data & 0xffff;.
31e0: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e *(short *) (fun
31f0: 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 30 78 33 ction + 8) = 0x3
3200: 43 31 39 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a C19;. *(short *
3210: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 30 29 ) (function +10)
3220: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e = (unsigned lon
3230: 67 29 20 61 64 64 72 65 73 73 20 3e 3e 20 31 36 g) address >> 16
3240: 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 ;. *(short *) (
3250: 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d 20 function +12) =
3260: 30 78 33 37 33 39 3b 0a 20 20 2a 28 73 68 6f 72 0x3739;. *(shor
3270: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
3280: 31 34 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 14) = (unsigned
3290: 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 20 26 20 long) address &
32a0: 30 78 66 66 66 66 3b 0a 20 20 2a 28 6c 6f 6e 67 0xffff;. *(long
32b0: 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b *) (function +
32c0: 31 36 29 20 3d 20 30 78 30 33 32 30 30 30 30 38 16) = 0x03200008
32d0: 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 ;. *(long *) (
32e0: 66 75 6e 63 74 69 6f 6e 20 2b 32 30 29 20 3d 20 function +20) =
32f0: 30 78 30 30 30 30 30 30 30 30 3b 0a 23 64 65 66 0x00000000;.#def
3300: 69 6e 65 20 69 73 5f 74 72 61 6d 70 28 66 75 6e ine is_tramp(fun
3310: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e ction) \. *(un
3320: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 signed short *)
3330: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d (function + 0) =
3340: 3d 20 30 78 33 43 30 32 20 26 26 20 5c 0a 20 20 = 0x3C02 && \.
3350: 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 *(unsigned short
3360: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 *) (function +
3370: 34 29 20 3d 3d 20 30 78 33 34 34 32 20 26 26 20 4) == 0x3442 &&
3380: 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 \. *(unsigned s
3390: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f hort *) (functio
33a0: 6e 20 2b 20 38 29 20 3d 3d 20 30 78 33 43 31 39 n + 8) == 0x3C19
33b0: 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e && \. *(unsign
33c0: 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e ed short *) (fun
33d0: 63 74 69 6f 6e 20 2b 31 32 29 20 3d 3d 20 30 78 ction +12) == 0x
33e0: 33 37 33 39 20 26 26 20 5c 0a 20 20 2a 28 75 6e 3739 && \. *(un
33f0: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 29 20 20 signed long *)
3400: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d (function +16) =
3410: 3d 20 30 78 30 33 32 30 30 30 30 38 20 26 26 20 = 0x03200008 &&
3420: 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 6c \. *(unsigned l
3430: 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f ong *) (functio
3440: 6e 20 2b 32 30 29 20 3d 3d 20 30 78 30 30 30 30 n +20) == 0x0000
3450: 30 30 30 30 0a 23 64 65 66 69 6e 65 20 68 69 6c 0000.#define hil
3460: 6f 28 68 69 77 6f 72 64 2c 6c 6f 77 6f 72 64 29 o(hiword,loword)
3470: 20 20 5c 0a 20 20 28 28 28 75 6e 73 69 67 6e 65 \. (((unsigne
3480: 64 20 6c 6f 6e 67 29 20 28 68 69 77 6f 72 64 29 d long) (hiword)
3490: 20 3c 3c 20 31 36 29 20 7c 20 28 75 6e 73 69 67 << 16) | (unsig
34a0: 6e 65 64 20 6c 6f 6e 67 29 20 28 6c 6f 77 6f 72 ned long) (lowor
34b0: 64 29 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d d)).#define tram
34c0: 70 5f 61 64 64 72 65 73 73 28 66 75 6e 63 74 69 p_address(functi
34d0: 6f 6e 29 20 20 5c 0a 20 20 68 69 6c 6f 28 2a 28 on) \. hilo(*(
34e0: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a unsigned short *
34f0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 30 29 ) (function +10)
3500: 2c 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f , *(unsigned sho
3510: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
3520: 2b 31 34 29 29 0a 23 64 65 66 69 6e 65 20 74 72 +14)).#define tr
3530: 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 74 69 6f amp_data(functio
3540: 6e 29 20 20 5c 0a 20 20 68 69 6c 6f 28 2a 28 75 n) \. hilo(*(u
3550: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 nsigned short *)
3560: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 32 29 2c (function + 2),
3570: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 *(unsigned shor
3580: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
3590: 20 36 29 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 6)).#endif.#ifd
35a0: 65 66 20 5f 5f 6d 69 70 73 6e 33 32 5f 5f 0a 20 ef __mipsn32__.
35b0: 20 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 /* function:.
35c0: 20 2a 20 20 20 20 6c 77 20 24 32 2c 31 36 28 24 * lw $2,16($
35d0: 32 35 29 09 09 09 38 46 20 32 32 20 30 30 20 31 25)...8F 22 00 1
35e0: 30 0a 20 20 20 2a 20 20 20 20 6c 77 20 24 32 35 0. * lw $25
35f0: 2c 32 30 28 24 32 35 29 09 09 09 38 46 20 33 39 ,20($25)...8F 39
3600: 20 30 30 20 31 34 0a 20 20 20 2a 20 20 20 20 6a 00 14. * j
3610: 20 24 32 35 09 09 09 09 30 33 20 32 30 20 30 30 $25....03 20 00
3620: 20 30 38 0a 20 20 20 2a 20 20 20 20 6e 6f 70 09 08. * nop.
3630: 09 09 09 30 30 20 30 30 20 30 30 20 30 30 0a 20 ...00 00 00 00.
3640: 20 20 2a 20 20 20 20 2e 77 6f 72 64 20 3c 64 61 * .word <da
3650: 74 61 3e 09 09 09 3c 64 61 74 61 3e 0a 20 20 20 ta>...<data>.
3660: 2a 20 20 20 20 2e 77 6f 72 64 20 3c 61 64 64 72 * .word <addr
3670: 65 73 73 3e 09 09 09 3c 61 64 64 72 65 73 73 3e ess>...<address>
3680: 0a 20 20 20 2a 2f 0a 20 20 2f 2a 20 57 68 61 74 . */. /* What
3690: 20 61 62 6f 75 74 20 62 69 67 20 65 6e 64 69 61 about big endia
36a0: 6e 20 2f 20 6c 69 74 74 6c 65 20 65 6e 64 69 61 n / little endia
36b0: 6e 20 3f 3f 20 2a 2f 0a 20 20 2a 28 75 6e 73 69 n ?? */. *(unsi
36c0: 67 6e 65 64 20 69 6e 74 20 2a 29 20 28 66 75 6e gned int *) (fun
36d0: 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20 30 78 38 ction + 0) = 0x8
36e0: 46 32 32 30 30 31 30 3b 0a 20 20 2a 28 75 6e 73 F220010;. *(uns
36f0: 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 28 66 75 igned int *) (fu
3700: 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 20 30 78 nction + 4) = 0x
3710: 38 46 33 39 30 30 31 34 3b 0a 20 20 2a 28 75 6e 8F390014;. *(un
3720: 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 28 66 signed int *) (f
3730: 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 30 unction + 8) = 0
3740: 78 30 33 32 30 30 30 30 38 3b 0a 20 20 2a 28 75 x03200008;. *(u
3750: 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 28 nsigned int *) (
3760: 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d 20 function +12) =
3770: 30 78 30 30 30 30 30 30 30 30 3b 0a 20 20 2a 28 0x00000000;. *(
3780: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 unsigned int *)
3790: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d (function +16) =
37a0: 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 (unsigned int)
37b0: 64 61 74 61 3b 0a 20 20 2a 28 75 6e 73 69 67 6e data;. *(unsign
37c0: 65 64 20 69 6e 74 20 2a 29 20 28 66 75 6e 63 74 ed int *) (funct
37d0: 69 6f 6e 20 2b 32 30 29 20 3d 20 28 75 6e 73 69 ion +20) = (unsi
37e0: 67 6e 65 64 20 69 6e 74 29 20 61 64 64 72 65 73 gned int) addres
37f0: 73 3b 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72 s;.#define is_tr
3800: 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c amp(function) \
3810: 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 20 20 . *(int *)
3820: 20 20 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b (function +
3830: 20 30 29 20 3d 3d 20 30 78 38 46 32 32 30 30 31 0) == 0x8F22001
3840: 30 20 26 26 20 5c 0a 20 20 2a 28 69 6e 74 20 2a 0 && \. *(int *
3850: 29 20 20 20 20 20 20 20 20 20 20 28 66 75 6e 63 ) (func
3860: 74 69 6f 6e 20 2b 20 34 29 20 3d 3d 20 30 78 38 tion + 4) == 0x8
3870: 46 33 39 30 30 31 34 20 26 26 20 5c 0a 20 20 2a F390014 && \. *
3880: 28 69 6e 74 20 2a 29 20 20 20 20 20 20 20 20 20 (int *)
3890: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 (function + 8)
38a0: 3d 3d 20 30 78 30 33 32 30 30 30 30 38 20 26 26 == 0x03200008 &&
38b0: 20 5c 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 \. *(int *)
38c0: 20 20 20 20 20 20 20 28 66 75 6e 63 74 69 6f 6e (function
38d0: 20 2b 31 32 29 20 3d 3d 20 30 78 30 30 30 30 30 +12) == 0x00000
38e0: 30 30 30 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 000.#define tram
38f0: 70 5f 61 64 64 72 65 73 73 28 66 75 6e 63 74 69 p_address(functi
3900: 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67 on) \. *(unsig
3910: 6e 65 64 20 69 6e 74 20 2a 29 20 28 66 75 6e 63 ned int *) (func
3920: 74 69 6f 6e 20 2b 32 30 29 0a 23 64 65 66 69 6e tion +20).#defin
3930: 65 20 74 72 61 6d 70 5f 64 61 74 61 28 66 75 6e e tramp_data(fun
3940: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e ction) \. *(un
3950: 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 28 66 signed int *) (f
3960: 75 6e 63 74 69 6f 6e 20 2b 31 36 29 0a 23 65 6e unction +16).#en
3970: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d 69 70 dif.#ifdef __mip
3980: 73 36 34 6f 6c 64 5f 5f 0a 20 20 2f 2a 20 66 75 s64old__. /* fu
3990: 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 nction:. *
39a0: 64 6c 69 20 24 32 2c 3c 64 61 74 61 3e 09 09 09 dli $2,<data>...
39b0: 33 43 20 30 32 20 68 69 31 36 28 68 69 33 32 28 3C 02 hi16(hi32(
39c0: 3c 64 61 74 61 3e 29 29 0a 20 20 20 2a 09 09 09 <data>)). *...
39d0: 09 09 33 34 20 34 32 20 6c 6f 31 36 28 68 69 33 ..34 42 lo16(hi3
39e0: 32 28 3c 64 61 74 61 3e 29 29 0a 20 20 20 2a 09 2(<data>)). *.
39f0: 09 09 09 09 30 30 20 30 32 20 31 34 20 33 38 0a ....00 02 14 38.
3a00: 20 20 20 2a 09 09 09 09 09 33 34 20 34 32 20 68 *.....34 42 h
3a10: 69 31 36 28 6c 6f 33 32 28 3c 64 61 74 61 3e 29 i16(lo32(<data>)
3a20: 29 0a 20 20 20 2a 09 09 09 09 09 30 30 20 30 32 ). *.....00 02
3a30: 20 31 34 20 33 38 0a 20 20 20 2a 09 09 09 09 09 14 38. *.....
3a40: 33 34 20 34 32 20 6c 6f 31 36 28 6c 6f 33 32 28 34 42 lo16(lo32(
3a50: 3c 64 61 74 61 3e 29 29 0a 20 20 20 2a 20 20 20 <data>)). *
3a60: 20 64 6c 69 20 24 32 35 2c 3c 61 64 64 72 65 73 dli $25,<addres
3a70: 73 3e 09 09 33 43 20 31 39 20 68 69 31 36 28 68 s>..3C 19 hi16(h
3a80: 69 33 32 28 3c 61 64 64 72 65 73 73 3e 29 29 0a i32(<address>)).
3a90: 20 20 20 2a 09 09 09 09 09 33 37 20 33 39 20 6c *.....37 39 l
3aa0: 6f 31 36 28 68 69 33 32 28 3c 61 64 64 72 65 73 o16(hi32(<addres
3ab0: 73 3e 29 29 0a 20 20 20 2a 09 09 09 09 09 30 30 s>)). *.....00
3ac0: 20 31 39 20 43 43 20 33 38 0a 20 20 20 2a 09 09 19 CC 38. *..
3ad0: 09 09 09 33 37 20 33 39 20 68 69 31 36 28 6c 6f ...37 39 hi16(lo
3ae0: 33 32 28 3c 61 64 64 72 65 73 73 3e 29 29 0a 20 32(<address>)).
3af0: 20 20 2a 09 09 09 09 09 30 30 20 31 39 20 43 43 *.....00 19 CC
3b00: 20 33 38 0a 20 20 20 2a 09 09 09 09 09 33 37 20 38. *.....37
3b10: 33 39 20 6c 6f 31 36 28 6c 6f 33 32 28 3c 61 64 39 lo16(lo32(<ad
3b20: 64 72 65 73 73 3e 29 29 0a 20 20 20 2a 20 20 20 dress>)). *
3b30: 20 6a 20 24 32 35 09 09 09 09 30 33 20 32 30 20 j $25....03 20
3b40: 30 30 20 30 38 0a 20 20 20 2a 20 20 20 20 6e 6f 00 08. * no
3b50: 70 09 09 09 09 30 30 20 30 30 20 30 30 20 30 30 p....00 00 00 00
3b60: 0a 20 20 20 2a 2f 0a 20 20 2f 2a 20 57 68 61 74 . */. /* What
3b70: 20 61 62 6f 75 74 20 62 69 67 20 65 6e 64 69 61 about big endia
3b80: 6e 20 2f 20 6c 69 74 74 6c 65 20 65 6e 64 69 61 n / little endia
3b90: 6e 20 3f 3f 20 2a 2f 0a 20 20 2a 28 73 68 6f 72 n ?? */. *(shor
3ba0: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
3bb0: 20 30 29 20 3d 20 30 78 33 43 30 32 3b 0a 20 20 0) = 0x3C02;.
3bc0: 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 *(short *) (func
3bd0: 74 69 6f 6e 20 2b 20 32 29 20 3d 20 28 75 6e 73 tion + 2) = (uns
3be0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 61 74 61 igned long) data
3bf0: 20 3e 3e 20 34 38 3b 0a 20 20 2a 28 73 68 6f 72 >> 48;. *(shor
3c00: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
3c10: 20 34 29 20 3d 20 30 78 33 34 34 32 3b 0a 20 20 4) = 0x3442;.
3c20: 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 *(short *) (func
3c30: 74 69 6f 6e 20 2b 20 36 29 20 3d 20 28 28 75 6e tion + 6) = ((un
3c40: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 61 74 signed long) dat
3c50: 61 20 3e 3e 20 33 32 29 20 26 20 30 78 66 66 66 a >> 32) & 0xfff
3c60: 66 3b 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 f;. *(int *)
3c70: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d (function + 8) =
3c80: 20 30 78 30 30 30 32 31 34 33 38 3b 0a 20 20 2a 0x00021438;. *
3c90: 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 (short *) (funct
3ca0: 69 6f 6e 20 2b 31 32 29 20 3d 20 30 78 33 34 34 ion +12) = 0x344
3cb0: 32 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 2;. *(short *)
3cc0: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 34 29 20 3d (function +14) =
3cd0: 20 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 ((unsigned long
3ce0: 29 20 64 61 74 61 20 3e 3e 20 31 36 29 20 26 20 ) data >> 16) &
3cf0: 30 78 66 66 66 66 3b 0a 20 20 2a 28 69 6e 74 20 0xffff;. *(int
3d00: 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b *) (function +
3d10: 31 36 29 20 3d 20 30 78 30 30 30 32 31 34 33 38 16) = 0x00021438
3d20: 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 ;. *(short *) (
3d30: 66 75 6e 63 74 69 6f 6e 20 2b 32 30 29 20 3d 20 function +20) =
3d40: 30 78 33 34 34 32 3b 0a 20 20 2a 28 73 68 6f 72 0x3442;. *(shor
3d50: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
3d60: 32 32 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 22) = (unsigned
3d70: 6c 6f 6e 67 29 20 64 61 74 61 20 26 20 30 78 66 long) data & 0xf
3d80: 66 66 66 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a fff;. *(short *
3d90: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 34 29 ) (function +24)
3da0: 20 3d 20 30 78 33 43 31 39 3b 0a 20 20 2a 28 73 = 0x3C19;. *(s
3db0: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f hort *) (functio
3dc0: 6e 20 2b 32 36 29 20 3d 20 28 75 6e 73 69 67 6e n +26) = (unsign
3dd0: 65 64 20 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 ed long) address
3de0: 20 3e 3e 20 34 38 3b 0a 20 20 2a 28 73 68 6f 72 >> 48;. *(shor
3df0: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
3e00: 32 38 29 20 3d 20 30 78 33 37 33 39 3b 0a 20 20 28) = 0x3739;.
3e10: 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 *(short *) (func
3e20: 74 69 6f 6e 20 2b 33 30 29 20 3d 20 28 28 75 6e tion +30) = ((un
3e30: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64 signed long) add
3e40: 72 65 73 73 20 3e 3e 20 33 32 29 20 26 20 30 78 ress >> 32) & 0x
3e50: 66 66 66 66 3b 0a 20 20 2a 28 69 6e 74 20 2a 29 ffff;. *(int *)
3e60: 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 33 32 (function +32
3e70: 29 20 3d 20 30 78 30 30 31 39 43 43 33 38 3b 0a ) = 0x0019CC38;.
3e80: 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 *(short *) (fu
3e90: 6e 63 74 69 6f 6e 20 2b 33 36 29 20 3d 20 30 78 nction +36) = 0x
3ea0: 33 37 33 39 3b 0a 20 20 2a 28 73 68 6f 72 74 20 3739;. *(short
3eb0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 33 38 *) (function +38
3ec0: 29 20 3d 20 28 28 75 6e 73 69 67 6e 65 64 20 6c ) = ((unsigned l
3ed0: 6f 6e 67 29 20 61 64 64 72 65 73 73 20 3e 3e 20 ong) address >>
3ee0: 31 36 29 20 26 20 30 78 66 66 66 66 3b 0a 20 20 16) & 0xffff;.
3ef0: 2a 28 69 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 *(int *) (func
3f00: 74 69 6f 6e 20 2b 34 30 29 20 3d 20 30 78 30 30 tion +40) = 0x00
3f10: 31 39 43 43 33 38 3b 0a 20 20 2a 28 73 68 6f 72 19CC38;. *(shor
3f20: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
3f30: 34 34 29 20 3d 20 30 78 33 37 33 39 3b 0a 20 20 44) = 0x3739;.
3f40: 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 *(short *) (func
3f50: 74 69 6f 6e 20 2b 34 36 29 20 3d 20 28 75 6e 73 tion +46) = (uns
3f60: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64 72 igned long) addr
3f70: 65 73 73 20 26 20 30 78 66 66 66 66 3b 0a 20 20 ess & 0xffff;.
3f80: 2a 28 69 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 *(int *) (func
3f90: 74 69 6f 6e 20 2b 34 38 29 20 3d 20 30 78 30 33 tion +48) = 0x03
3fa0: 32 30 30 30 30 38 3b 0a 20 20 2a 28 69 6e 74 20 200008;. *(int
3fb0: 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b *) (function +
3fc0: 35 32 29 20 3d 20 30 78 30 30 30 30 30 30 30 30 52) = 0x00000000
3fd0: 3b 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72 61 ;.#define is_tra
3fe0: 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a mp(function) \.
3ff0: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f *(unsigned sho
4000: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
4010: 2b 20 30 29 20 3d 3d 20 30 78 33 43 30 32 20 26 + 0) == 0x3C02 &
4020: 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 & \. *(unsigned
4030: 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 short *) (funct
4040: 69 6f 6e 20 2b 20 34 29 20 3d 3d 20 30 78 33 34 ion + 4) == 0x34
4050: 34 32 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 42 && \. *(unsi
4060: 67 6e 65 64 20 69 6e 74 20 2a 29 20 20 20 28 66 gned int *) (f
4070: 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 3d 20 unction + 8) ==
4080: 30 78 30 30 30 32 31 34 33 38 20 26 26 20 5c 0a 0x00021438 && \.
4090: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f *(unsigned sho
40a0: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
40b0: 2b 31 32 29 20 3d 3d 20 30 78 33 34 34 32 20 26 +12) == 0x3442 &
40c0: 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 & \. *(unsigned
40d0: 20 69 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74 int *) (funct
40e0: 69 6f 6e 20 2b 31 36 29 20 3d 3d 20 30 78 30 30 ion +16) == 0x00
40f0: 30 32 31 34 33 38 20 26 26 20 5c 0a 20 20 2a 28 021438 && \. *(
4100: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a unsigned short *
4110: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 30 29 ) (function +20)
4120: 20 3d 3d 20 30 78 33 34 34 32 20 26 26 20 5c 0a == 0x3442 && \.
4130: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f *(unsigned sho
4140: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
4150: 2b 32 34 29 20 3d 3d 20 30 78 33 43 31 39 20 26 +24) == 0x3C19 &
4160: 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 & \. *(unsigned
4170: 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 short *) (funct
4180: 69 6f 6e 20 2b 32 38 29 20 3d 3d 20 30 78 33 37 ion +28) == 0x37
4190: 33 39 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 39 && \. *(unsi
41a0: 67 6e 65 64 20 69 6e 74 20 2a 29 20 20 20 28 66 gned int *) (f
41b0: 75 6e 63 74 69 6f 6e 20 2b 33 32 29 20 3d 3d 20 unction +32) ==
41c0: 30 78 30 30 31 39 43 43 33 38 20 26 26 20 5c 0a 0x0019CC38 && \.
41d0: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f *(unsigned sho
41e0: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
41f0: 2b 33 36 29 20 3d 3d 20 30 78 33 37 33 39 20 26 +36) == 0x3739 &
4200: 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 & \. *(unsigned
4210: 20 69 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74 int *) (funct
4220: 69 6f 6e 20 2b 34 30 29 20 3d 3d 20 30 78 30 30 ion +40) == 0x00
4230: 31 39 43 43 33 38 20 26 26 20 5c 0a 20 20 2a 28 19CC38 && \. *(
4240: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a unsigned short *
4250: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 34 34 29 ) (function +44)
4260: 20 3d 3d 20 30 78 33 37 33 39 20 26 26 20 5c 0a == 0x3739 && \.
4270: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 *(unsigned int
4280: 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 *) (function
4290: 2b 34 38 29 20 3d 3d 20 30 78 30 33 32 30 30 30 +48) == 0x032000
42a0: 30 38 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 08 && \. *(unsi
42b0: 67 6e 65 64 20 69 6e 74 20 2a 29 20 20 20 28 66 gned int *) (f
42c0: 75 6e 63 74 69 6f 6e 20 2b 35 32 29 20 3d 3d 20 unction +52) ==
42d0: 30 78 30 30 30 30 30 30 30 30 0a 23 64 65 66 69 0x00000000.#defi
42e0: 6e 65 20 68 69 6c 6f 28 77 6f 72 64 33 2c 77 6f ne hilo(word3,wo
42f0: 72 64 32 2c 77 6f 72 64 31 2c 77 6f 72 64 30 29 rd2,word1,word0)
4300: 20 20 5c 0a 20 20 28 28 28 75 6e 73 69 67 6e 65 \. (((unsigne
4310: 64 20 6c 6f 6e 67 29 20 28 77 6f 72 64 33 29 20 d long) (word3)
4320: 3c 3c 20 34 38 29 20 7c 20 28 28 75 6e 73 69 67 << 48) | ((unsig
4330: 6e 65 64 20 6c 6f 6e 67 29 20 28 77 6f 72 64 32 ned long) (word2
4340: 29 20 3c 3c 20 33 32 29 20 7c 20 5c 0a 20 20 20 ) << 32) | \.
4350: 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 ((unsigned long)
4360: 20 28 77 6f 72 64 31 29 20 3c 3c 20 31 36 29 20 (word1) << 16)
4370: 7c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 | (unsigned long
4380: 29 20 28 77 6f 72 64 30 29 29 0a 23 64 65 66 69 ) (word0)).#defi
4390: 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 65 73 73 ne tramp_address
43a0: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 (function) \.
43b0: 68 69 6c 6f 28 2a 28 75 6e 73 69 67 6e 65 64 20 hilo(*(unsigned
43c0: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
43d0: 6f 6e 20 2b 32 36 29 2c 20 5c 0a 20 20 20 20 20 on +26), \.
43e0: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f *(unsigned sho
43f0: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
4400: 2b 33 30 29 2c 20 5c 0a 20 20 20 20 20 20 20 2a +30), \. *
4410: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 (unsigned short
4420: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 33 38 *) (function +38
4430: 29 2c 20 5c 0a 20 20 20 20 20 20 20 2a 28 75 6e ), \. *(un
4440: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 signed short *)
4450: 28 66 75 6e 63 74 69 6f 6e 20 2b 34 36 29 29 0a (function +46)).
4460: 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 #define tramp_da
4470: 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a ta(function) \.
4480: 20 20 68 69 6c 6f 28 2a 28 75 6e 73 69 67 6e 65 hilo(*(unsigne
4490: 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 d short *) (func
44a0: 74 69 6f 6e 20 2b 20 32 29 2c 20 5c 0a 20 20 20 tion + 2), \.
44b0: 20 20 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 *(unsigned s
44c0: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f hort *) (functio
44d0: 6e 20 2b 20 36 29 2c 20 5c 0a 20 20 20 20 20 20 n + 6), \.
44e0: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 *(unsigned shor
44f0: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
4500: 31 34 29 2c 20 5c 0a 20 20 20 20 20 20 20 2a 28 14), \. *(
4510: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a unsigned short *
4520: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 32 29 ) (function +22)
4530: 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 ).#endif.#ifdef
4540: 5f 5f 6d 69 70 73 36 34 5f 5f 0a 20 20 2f 2a 20 __mips64__. /*
4550: 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 function:. *
4560: 20 20 6c 64 20 24 32 2c 31 36 28 24 32 35 29 09 ld $2,16($25).
4570: 09 09 44 46 20 32 32 20 30 30 20 31 30 0a 20 20 ..DF 22 00 10.
4580: 20 2a 20 20 20 20 6c 64 20 24 32 35 2c 32 34 28 * ld $25,24(
4590: 24 32 35 29 09 09 09 44 46 20 33 39 20 30 30 20 $25)...DF 39 00
45a0: 31 38 0a 20 20 20 2a 20 20 20 20 6a 20 24 32 35 18. * j $25
45b0: 09 09 09 09 30 33 20 32 30 20 30 30 20 30 38 0a ....03 20 00 08.
45c0: 20 20 20 2a 20 20 20 20 6e 6f 70 09 09 09 09 30 * nop....0
45d0: 30 20 30 30 20 30 30 20 30 30 0a 20 20 20 2a 20 0 00 00 00. *
45e0: 20 20 20 2e 64 77 6f 72 64 20 3c 64 61 74 61 3e .dword <data>
45f0: 09 09 09 3c 64 61 74 61 3e 0a 20 20 20 2a 20 20 ...<data>. *
4600: 20 20 2e 64 77 6f 72 64 20 3c 61 64 64 72 65 73 .dword <addres
4610: 73 3e 09 09 3c 61 64 64 72 65 73 73 3e 0a 20 20 s>..<address>.
4620: 20 2a 2f 0a 20 20 2f 2a 20 57 68 61 74 20 61 62 */. /* What ab
4630: 6f 75 74 20 62 69 67 20 65 6e 64 69 61 6e 20 2f out big endian /
4640: 20 6c 69 74 74 6c 65 20 65 6e 64 69 61 6e 20 3f little endian ?
4650: 3f 20 2a 2f 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 ? */. *(long *)
4660: 20 20 20 20 20 20 20 20 20 20 28 66 75 6e 63 74 (funct
4670: 69 6f 6e 20 2b 20 30 29 20 3d 20 30 78 44 46 32 ion + 0) = 0xDF2
4680: 32 30 30 31 30 44 46 33 39 30 30 31 38 4c 3b 0a 20010DF390018L;.
4690: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 20 20 20 *(long *)
46a0: 20 20 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b (function +
46b0: 20 38 29 20 3d 20 30 78 30 33 32 30 30 30 30 38 8) = 0x03200008
46c0: 30 30 30 30 30 30 30 30 4c 3b 0a 20 20 2a 28 75 00000000L;. *(u
46d0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 29 20 nsigned long *)
46e0: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d (function +16) =
46f0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
4700: 20 64 61 74 61 3b 0a 20 20 2a 28 75 6e 73 69 67 data;. *(unsig
4710: 6e 65 64 20 6c 6f 6e 67 20 2a 29 20 28 66 75 6e ned long *) (fun
4720: 63 74 69 6f 6e 20 2b 32 34 29 20 3d 20 28 75 6e ction +24) = (un
4730: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64 signed long) add
4740: 72 65 73 73 3b 0a 23 64 65 66 69 6e 65 20 69 73 ress;.#define is
4750: 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29 _tramp(function)
4760: 20 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 \. *(long *)
4770: 20 20 20 20 20 20 20 20 20 28 66 75 6e 63 74 69 (functi
4780: 6f 6e 20 2b 20 30 29 20 3d 3d 20 30 78 44 46 32 on + 0) == 0xDF2
4790: 32 30 30 31 30 44 46 33 39 30 30 31 38 4c 20 26 20010DF390018L &
47a0: 26 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 & \. *(long *)
47b0: 20 20 20 20 20 20 20 20 20 28 66 75 6e 63 74 69 (functi
47c0: 6f 6e 20 2b 20 38 29 20 3d 3d 20 30 78 30 33 32 on + 8) == 0x032
47d0: 30 30 30 30 38 30 30 30 30 30 30 30 30 4c 0a 23 0000800000000L.#
47e0: 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 define tramp_add
47f0: 72 65 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 ress(function)
4800: 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 6c \. *(unsigned l
4810: 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ong *) (function
4820: 20 2b 32 34 29 0a 23 64 65 66 69 6e 65 20 74 72 +24).#define tr
4830: 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 74 69 6f amp_data(functio
4840: 6e 29 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e n) \. *(unsign
4850: 65 64 20 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 ed long *) (func
4860: 74 69 6f 6e 20 2b 31 36 29 0a 23 65 6e 64 69 66 tion +16).#endif
4870: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 73 .#if defined(__s
4880: 70 61 72 63 5f 5f 29 20 26 26 20 21 64 65 66 69 parc__) && !defi
4890: 6e 65 64 28 5f 5f 73 70 61 72 63 36 34 5f 5f 29 ned(__sparc64__)
48a0: 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a . /* function:.
48b0: 20 20 20 2a 20 20 20 20 73 65 74 68 69 20 25 68 * sethi %h
48c0: 69 28 3c 64 61 74 61 3e 29 2c 25 67 32 09 09 30 i(<data>),%g2..0
48d0: 35 30 30 30 30 30 30 20 7c 20 28 3c 64 61 74 61 5000000 | (<data
48e0: 3e 20 3e 3e 20 31 30 29 0a 20 20 20 2a 20 20 20 > >> 10). *
48f0: 20 73 65 74 68 69 20 25 68 69 28 3c 61 64 64 72 sethi %hi(<addr
4900: 65 73 73 3e 29 2c 25 67 31 09 30 33 30 30 30 30 ess>),%g1.030000
4910: 30 30 20 7c 20 28 3c 61 64 64 72 65 73 73 3e 20 00 | (<address>
4920: 3e 3e 20 31 30 29 0a 20 20 20 2a 20 20 20 20 6a >> 10). * j
4930: 6d 70 20 25 67 31 2b 25 6c 6f 28 3c 61 64 64 72 mp %g1+%lo(<addr
4940: 65 73 73 3e 29 09 09 38 31 43 30 36 30 30 30 20 ess>)..81C06000
4950: 7c 20 28 3c 61 64 64 72 65 73 73 3e 20 26 20 30 | (<address> & 0
4960: 78 33 66 66 29 0a 20 20 20 2a 20 20 20 20 6f 72 x3ff). * or
4970: 20 25 67 32 2c 25 6c 6f 28 3c 64 61 74 61 3e 29 %g2,%lo(<data>)
4980: 2c 25 67 32 09 09 38 34 31 30 41 30 30 30 20 7c ,%g2..8410A000 |
4990: 20 28 3c 64 61 74 61 3e 20 26 20 30 78 33 66 66 (<data> & 0x3ff
49a0: 29 0a 20 20 20 2a 2f 0a 23 64 65 66 69 6e 65 20 ). */.#define
49b0: 68 69 28 77 6f 72 64 29 20 20 28 28 75 6e 73 69 hi(word) ((unsi
49c0: 67 6e 65 64 20 6c 6f 6e 67 29 20 28 77 6f 72 64 gned long) (word
49d0: 29 20 3e 3e 20 31 30 29 0a 23 64 65 66 69 6e 65 ) >> 10).#define
49e0: 20 6c 6f 28 77 6f 72 64 29 20 20 28 28 75 6e 73 lo(word) ((uns
49f0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 77 6f 72 igned long) (wor
4a00: 64 29 20 26 20 30 78 33 66 66 29 0a 20 20 2a 28 d) & 0x3ff). *(
4a10: 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f long *) (functio
4a20: 6e 20 2b 20 30 29 20 3d 20 30 78 30 35 30 30 30 n + 0) = 0x05000
4a30: 30 30 30 20 7c 20 68 69 28 64 61 74 61 29 3b 0a 000 | hi(data);.
4a40: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e *(long *) (fun
4a50: 63 74 69 6f 6e 20 2b 20 34 29 20 3d 20 30 78 30 ction + 4) = 0x0
4a60: 33 30 30 30 30 30 30 20 7c 20 68 69 28 61 64 64 3000000 | hi(add
4a70: 72 65 73 73 29 3b 0a 20 20 2a 28 6c 6f 6e 67 20 ress);. *(long
4a80: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 *) (function + 8
4a90: 29 20 3d 20 30 78 38 31 43 30 36 30 30 30 20 7c ) = 0x81C06000 |
4aa0: 20 6c 6f 28 61 64 64 72 65 73 73 29 3b 0a 20 20 lo(address);.
4ab0: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 *(long *) (funct
4ac0: 69 6f 6e 20 2b 31 32 29 20 3d 20 30 78 38 34 31 ion +12) = 0x841
4ad0: 30 41 30 30 30 20 7c 20 6c 6f 28 64 61 74 61 29 0A000 | lo(data)
4ae0: 3b 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72 61 ;.#define is_tra
4af0: 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a mp(function) \.
4b00: 20 20 28 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 (*(long *) (fu
4b10: 6e 63 74 69 6f 6e 20 2b 20 30 29 20 26 20 30 78 nction + 0) & 0x
4b20: 66 66 63 30 30 30 30 30 29 20 3d 3d 20 30 78 30 ffc00000) == 0x0
4b30: 35 30 30 30 30 30 30 20 26 26 20 5c 0a 20 20 28 5000000 && \. (
4b40: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 *(long *) (funct
4b50: 69 6f 6e 20 2b 20 34 29 20 26 20 30 78 66 66 63 ion + 4) & 0xffc
4b60: 30 30 30 30 30 29 20 3d 3d 20 30 78 30 33 30 30 00000) == 0x0300
4b70: 30 30 30 30 20 26 26 20 5c 0a 20 20 28 2a 28 6c 0000 && \. (*(l
4b80: 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ong *) (function
4b90: 20 2b 20 38 29 20 26 20 30 78 66 66 66 66 66 63 + 8) & 0xfffffc
4ba0: 30 30 29 20 3d 3d 20 30 78 38 31 43 30 36 30 30 00) == 0x81C0600
4bb0: 30 20 26 26 20 5c 0a 20 20 28 2a 28 6c 6f 6e 67 0 && \. (*(long
4bc0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 *) (function +1
4bd0: 32 29 20 26 20 30 78 66 66 66 66 66 63 30 30 29 2) & 0xfffffc00)
4be0: 20 3d 3d 20 30 78 38 34 31 30 41 30 30 30 0a 23 == 0x8410A000.#
4bf0: 64 65 66 69 6e 65 20 68 69 6c 6f 28 68 69 77 6f define hilo(hiwo
4c00: 72 64 2c 6c 6f 77 6f 72 64 29 20 20 28 28 28 68 rd,loword) (((h
4c10: 69 77 6f 72 64 29 20 3c 3c 20 31 30 29 20 7c 20 iword) << 10) |
4c20: 28 28 6c 6f 77 6f 72 64 29 20 26 20 30 78 33 66 ((loword) & 0x3f
4c30: 66 29 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d f)).#define tram
4c40: 70 5f 61 64 64 72 65 73 73 28 66 75 6e 63 74 69 p_address(functi
4c50: 6f 6e 29 20 20 5c 0a 20 20 68 69 6c 6f 28 2a 28 on) \. hilo(*(
4c60: 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f long *) (functio
4c70: 6e 20 2b 20 34 29 2c 20 2a 28 6c 6f 6e 67 20 2a n + 4), *(long *
4c80: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 ) (function + 8)
4c90: 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f ).#define tramp_
4ca0: 64 61 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 20 data(function)
4cb0: 5c 0a 20 20 68 69 6c 6f 28 2a 28 6c 6f 6e 67 20 \. hilo(*(long
4cc0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 *) (function + 0
4cd0: 29 2c 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 ), *(long *) (fu
4ce0: 6e 63 74 69 6f 6e 20 2b 31 32 29 29 0a 23 65 6e nction +12)).#en
4cf0: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 73 70 61 dif.#ifdef __spa
4d00: 72 63 36 34 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 rc64__. /* func
4d10: 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 72 64 tion:. * rd
4d20: 20 25 70 63 2c 25 67 31 09 09 09 38 33 34 31 34 %pc,%g1...83414
4d30: 30 30 30 0a 20 20 20 2a 20 20 20 20 6c 64 78 20 000. * ldx
4d40: 5b 25 67 31 2b 32 34 5d 2c 25 67 32 09 09 43 34 [%g1+24],%g2..C4
4d50: 35 38 36 30 31 38 0a 20 20 20 2a 20 20 20 20 6a 586018. * j
4d60: 6d 70 20 25 67 32 09 09 09 09 38 31 43 30 38 30 mp %g2....81C080
4d70: 30 30 0a 20 20 20 2a 20 20 20 20 6c 64 78 20 5b 00. * ldx [
4d80: 25 67 31 2b 31 36 5d 2c 25 67 35 09 09 43 41 35 %g1+16],%g5..CA5
4d90: 38 36 30 31 30 0a 20 20 20 2a 20 20 20 20 2e 6c 86010. * .l
4da0: 6f 6e 67 20 68 69 67 68 33 32 28 3c 64 61 74 61 ong high32(<data
4db0: 3e 29 09 09 3c 64 61 74 61 3e 20 3e 3e 20 33 32 >)..<data> >> 32
4dc0: 0a 20 20 20 2a 20 20 20 20 2e 6c 6f 6e 67 20 6c . * .long l
4dd0: 6f 77 33 32 28 3c 64 61 74 61 3e 29 09 09 3c 64 ow32(<data>)..<d
4de0: 61 74 61 3e 20 26 20 30 78 66 66 66 66 66 66 66 ata> & 0xfffffff
4df0: 66 0a 20 20 20 2a 20 20 20 20 2e 6c 6f 6e 67 20 f. * .long
4e00: 68 69 67 68 33 32 28 3c 61 64 64 72 65 73 73 3e high32(<address>
4e10: 29 09 09 3c 61 64 64 72 65 73 73 3e 20 3e 3e 20 )..<address> >>
4e20: 33 32 0a 20 20 20 2a 20 20 20 20 2e 6c 6f 6e 67 32. * .long
4e30: 20 6c 6f 77 33 32 28 3c 61 64 64 72 65 73 73 3e low32(<address>
4e40: 29 09 09 3c 61 64 64 72 65 73 73 3e 20 26 20 30 )..<address> & 0
4e50: 78 66 66 66 66 66 66 66 66 0a 20 20 20 2a 2f 0a xffffffff. */.
4e60: 20 20 2a 28 69 6e 74 20 2a 29 20 20 28 66 75 6e *(int *) (fun
4e70: 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20 30 78 38 ction + 0) = 0x8
4e80: 33 34 31 34 30 30 30 3b 0a 20 20 2a 28 69 6e 74 3414000;. *(int
4e90: 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b *) (function +
4ea0: 20 34 29 20 3d 20 30 78 43 34 35 38 36 30 31 38 4) = 0xC4586018
4eb0: 3b 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 28 66 ;. *(int *) (f
4ec0: 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 30 unction + 8) = 0
4ed0: 78 38 31 43 30 38 30 30 30 3b 0a 20 20 2a 28 69 x81C08000;. *(i
4ee0: 6e 74 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e nt *) (function
4ef0: 20 2b 31 32 29 20 3d 20 30 78 43 41 35 38 36 30 +12) = 0xCA5860
4f00: 31 30 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 10;. *(long *)
4f10: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d (function +16) =
4f20: 20 28 6c 6f 6e 67 29 20 64 61 74 61 3b 0a 20 20 (long) data;.
4f30: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 *(long *) (funct
4f40: 69 6f 6e 20 2b 32 34 29 20 3d 20 28 6c 6f 6e 67 ion +24) = (long
4f50: 29 20 61 64 64 72 65 73 73 3b 0a 23 64 65 66 69 ) address;.#defi
4f60: 6e 65 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 ne is_tramp(func
4f70: 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 69 6e 74 tion) \. *(int
4f80: 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b *) (function +
4f90: 20 30 29 20 3d 3d 20 30 78 38 33 34 31 34 30 30 0) == 0x8341400
4fa0: 30 20 26 26 20 5c 0a 20 20 2a 28 69 6e 74 20 2a 0 && \. *(int *
4fb0: 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 ) (function + 4
4fc0: 29 20 3d 3d 20 30 78 43 34 35 38 36 30 31 38 20 ) == 0xC4586018
4fd0: 26 26 20 5c 0a 20 20 2a 28 69 6e 74 20 2a 29 20 && \. *(int *)
4fe0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 (function + 8)
4ff0: 3d 3d 20 30 78 38 31 43 30 38 30 30 30 20 26 26 == 0x81C08000 &&
5000: 20 5c 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 28 \. *(int *) (
5010: 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d 3d function +12) ==
5020: 20 30 78 43 41 35 38 36 30 31 30 0a 23 64 65 66 0xCA586010.#def
5030: 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 65 73 ine tramp_addres
5040: 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 s(function) \.
5050: 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 *(long *) (func
5060: 74 69 6f 6e 20 2b 32 34 29 0a 23 64 65 66 69 6e tion +24).#defin
5070: 65 20 74 72 61 6d 70 5f 64 61 74 61 28 66 75 6e e tramp_data(fun
5080: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 6c 6f ction) \. *(lo
5090: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 ng *) (function
50a0: 2b 31 36 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 +16).#endif.#ifd
50b0: 65 66 20 5f 5f 61 6c 70 68 61 5f 5f 0a 20 20 2f ef __alpha__. /
50c0: 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a * function:. *
50d0: 20 20 20 20 62 72 20 24 31 2c 66 75 6e 63 74 69 br $1,functi
50e0: 6f 6e 2e 2e 6e 67 09 30 30 20 30 30 20 32 30 20 on..ng.00 00 20
50f0: 43 30 0a 20 20 20 2a 20 66 75 6e 63 74 69 6f 6e C0. * function
5100: 2e 2e 6e 67 3a 0a 20 20 20 2a 20 20 20 20 6c 64 ..ng:. * ld
5110: 71 20 24 32 37 2c 32 30 28 24 31 29 09 09 31 34 q $27,20($1)..14
5120: 20 30 30 20 36 31 20 41 37 0a 20 20 20 2a 20 20 00 61 A7. *
5130: 20 20 6c 64 71 20 24 31 2c 31 32 28 24 31 29 09 ldq $1,12($1).
5140: 09 30 43 20 30 30 20 32 31 20 41 34 0a 20 20 20 .0C 00 21 A4.
5150: 2a 20 20 20 20 6a 6d 70 20 24 33 31 2c 28 24 32 * jmp $31,($2
5160: 37 29 2c 30 09 09 30 30 20 30 30 20 46 42 20 36 7),0..00 00 FB 6
5170: 42 0a 20 20 20 2a 20 20 20 20 2e 71 75 61 64 20 B. * .quad
5180: 3c 64 61 74 61 3e 09 09 3c 64 61 74 61 3e 0a 20 <data>..<data>.
5190: 20 20 2a 20 20 20 20 2e 71 75 61 64 20 3c 61 64 * .quad <ad
51a0: 64 72 65 73 73 3e 09 09 3c 61 64 64 72 65 73 73 dress>..<address
51b0: 3e 0a 20 20 20 2a 2f 0a 20 20 7b 20 73 74 61 74 >. */. { stat
51c0: 69 63 20 69 6e 74 20 63 6f 64 65 20 5b 34 5d 20 ic int code [4]
51d0: 3d 0a 20 20 20 20 20 20 7b 20 30 78 43 30 32 30 =. { 0xC020
51e0: 30 30 30 30 2c 20 30 78 41 37 36 31 30 30 31 34 0000, 0xA7610014
51f0: 2c 20 30 78 41 34 32 31 30 30 30 43 2c 20 30 78 , 0xA421000C, 0x
5200: 36 42 46 42 30 30 30 30 20 7d 3b 0a 20 20 20 20 6BFB0000 };.
5210: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 20 28 int i;. for (
5220: 69 3d 30 3b 20 69 3c 34 3b 20 69 2b 2b 29 20 7b i=0; i<4; i++) {
5230: 20 28 28 69 6e 74 20 2a 29 20 66 75 6e 63 74 69 ((int *) functi
5240: 6f 6e 29 5b 69 5d 20 3d 20 63 6f 64 65 5b 69 5d on)[i] = code[i]
5250: 3b 20 7d 0a 20 20 20 20 28 28 6c 6f 6e 67 20 2a ; }. ((long *
5260: 29 20 66 75 6e 63 74 69 6f 6e 29 5b 32 5d 20 3d ) function)[2] =
5270: 20 28 6c 6f 6e 67 29 20 64 61 74 61 3b 0a 20 20 (long) data;.
5280: 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 ((long *) func
5290: 74 69 6f 6e 29 5b 33 5d 20 3d 20 28 6c 6f 6e 67 tion)[3] = (long
52a0: 29 20 61 64 64 72 65 73 73 3b 0a 20 20 7d 0a 23 ) address;. }.#
52b0: 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 28 define is_tramp(
52c0: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 function) \. (
52d0: 28 69 6e 74 20 2a 29 20 66 75 6e 63 74 69 6f 6e (int *) function
52e0: 29 5b 30 5d 20 3d 3d 20 30 78 43 30 32 30 30 30 )[0] == 0xC02000
52f0: 30 30 20 26 26 20 5c 0a 20 20 28 28 69 6e 74 20 00 && \. ((int
5300: 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 31 5d 20 *) function)[1]
5310: 3d 3d 20 30 78 41 37 36 31 30 30 31 34 20 26 26 == 0xA7610014 &&
5320: 20 5c 0a 20 20 28 28 69 6e 74 20 2a 29 20 66 75 \. ((int *) fu
5330: 6e 63 74 69 6f 6e 29 5b 32 5d 20 3d 3d 20 30 78 nction)[2] == 0x
5340: 41 34 32 31 30 30 30 43 20 26 26 20 5c 0a 20 20 A421000C && \.
5350: 28 28 69 6e 74 20 2a 29 20 66 75 6e 63 74 69 6f ((int *) functio
5360: 6e 29 5b 33 5d 20 3d 3d 20 30 78 36 42 46 42 30 n)[3] == 0x6BFB0
5370: 30 30 30 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 000.#define tram
5380: 70 5f 61 64 64 72 65 73 73 28 66 75 6e 63 74 69 p_address(functi
5390: 6f 6e 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 on) \. ((long
53a0: 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 33 5d 0a *) function)[3].
53b0: 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 #define tramp_da
53c0: 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a ta(function) \.
53d0: 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 ((long *) func
53e0: 74 69 6f 6e 29 5b 32 5d 0a 23 65 6e 64 69 66 0a tion)[2].#endif.
53f0: 23 69 66 64 65 66 20 5f 5f 68 70 70 61 6f 6c 64 #ifdef __hppaold
5400: 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e __. /* function
5410: 3a 0a 20 20 20 2a 20 20 20 20 6c 64 69 6c 20 4c :. * ldil L
5420: 27 3c 64 61 74 61 3e 2c 25 72 32 39 09 09 32 33 '<data>,%r29..23
5430: 41 30 30 30 30 30 20 7c 20 68 69 28 3c 64 61 74 A00000 | hi(<dat
5440: 61 3e 29 0a 20 20 20 2a 20 20 20 20 6c 64 69 6c a>). * ldil
5450: 20 4c 27 3c 61 64 64 72 65 73 73 3e 2c 25 72 32 L'<address>,%r2
5460: 31 09 09 32 32 41 30 30 30 30 30 20 7c 20 68 69 1..22A00000 | hi
5470: 28 3c 61 64 64 72 65 73 73 3e 29 0a 20 20 20 2a (<address>). *
5480: 20 20 20 20 6c 64 6f 20 52 27 3c 64 61 74 61 3e ldo R'<data>
5490: 28 25 72 32 39 29 2c 25 72 32 39 09 09 33 37 42 (%r29),%r29..37B
54a0: 44 30 30 30 30 20 7c 20 6c 6f 28 3c 64 61 74 61 D0000 | lo(<data
54b0: 3e 29 0a 20 20 20 2a 20 20 20 20 6c 64 6f 20 52 >). * ldo R
54c0: 27 3c 61 64 64 72 65 73 73 3e 28 25 72 32 31 29 '<address>(%r21)
54d0: 2c 25 72 32 31 09 33 36 42 35 30 30 30 30 20 7c ,%r21.36B50000 |
54e0: 20 6c 6f 28 3c 61 64 64 72 65 73 73 3e 29 0a 20 lo(<address>).
54f0: 20 20 2a 20 20 20 20 62 62 2c 3e 3d 2c 6e 20 25 * bb,>=,n %
5500: 72 32 31 2c 33 30 2c 66 75 6e 63 74 69 6f 6e 32 r21,30,function2
5510: 09 43 37 44 35 43 30 31 32 0a 20 20 20 2a 20 20 .C7D5C012. *
5520: 20 20 64 65 70 69 20 30 2c 33 31 2c 32 2c 25 72 depi 0,31,2,%r
5530: 32 31 09 09 44 36 41 30 31 43 31 45 0a 20 20 20 21..D6A01C1E.
5540: 2a 20 20 20 20 6c 64 77 20 34 28 30 2c 25 72 32 * ldw 4(0,%r2
5550: 31 29 2c 25 72 31 39 09 09 34 41 42 33 30 30 30 1),%r19..4AB3000
5560: 38 0a 20 20 20 2a 20 20 20 20 6c 64 77 20 30 28 8. * ldw 0(
5570: 30 2c 25 72 32 31 29 2c 25 72 32 31 09 09 34 41 0,%r21),%r21..4A
5580: 42 35 30 30 30 30 0a 20 20 20 2a 20 66 75 6e 63 B50000. * func
5590: 74 69 6f 6e 32 3a 0a 20 20 20 2a 20 20 20 20 6c tion2:. * l
55a0: 64 73 69 64 20 28 30 2c 25 72 32 31 29 2c 25 72 dsid (0,%r21),%r
55b0: 31 09 09 30 32 41 30 31 30 41 31 0a 20 20 20 2a 1..02A010A1. *
55c0: 20 20 20 20 6d 74 73 70 20 25 72 31 2c 25 73 72 mtsp %r1,%sr
55d0: 30 09 09 09 30 30 30 31 31 38 32 30 0a 20 20 20 0...00011820.
55e0: 2a 20 20 20 20 62 65 2c 6e 20 30 28 25 73 72 30 * be,n 0(%sr0
55f0: 2c 25 72 32 31 29 09 09 45 32 41 30 30 30 30 32 ,%r21)..E2A00002
5600: 0a 20 20 20 2a 20 20 20 20 6e 6f 70 09 09 09 09 . * nop....
5610: 30 38 30 30 30 32 34 30 0a 20 20 20 2a 2f 0a 20 08000240. */.
5620: 20 2f 2a 20 57 68 65 6e 20 64 65 63 6f 64 69 6e /* When decodin
5630: 67 20 61 20 32 31 2d 62 69 74 20 61 72 67 75 6d g a 21-bit argum
5640: 65 6e 74 20 69 6e 20 61 6e 20 69 6e 73 74 72 75 ent in an instru
5650: 63 74 69 6f 6e 2c 20 74 68 65 20 68 70 70 61 20 ction, the hppa
5660: 70 65 72 66 6f 72 6d 73 0a 20 20 20 2a 20 74 68 performs. * th
5670: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20 e following bit
5680: 6d 61 6e 69 70 75 6c 61 74 69 6f 6e 3a 0a 20 20 manipulation:.
5690: 20 2a 20 61 73 73 65 6d 62 6c 65 32 31 3a 20 78 * assemble21: x
56a0: 5b 32 30 5d 2e 2e 2e 78 5b 30 5d 0a 20 20 20 2a [20]...x[0]. *
56b0: 20 20 20 20 20 20 20 2d 2d 3e 20 78 5b 30 5d 20 --> x[0]
56c0: 78 5b 31 31 5d 2e 2e 2e 78 5b 31 5d 20 78 5b 31 x[11]...x[1] x[1
56d0: 35 5d 2e 2e 78 5b 31 34 5d 20 78 5b 32 30 5d 2e 5]..x[14] x[20].
56e0: 2e 2e 78 5b 31 36 5d 20 78 5b 31 33 5d 2e 2e 78 ..x[16] x[13]..x
56f0: 5b 31 32 5d 0a 20 20 20 2a 20 57 68 65 6e 20 65 [12]. * When e
5700: 6e 63 6f 64 69 6e 67 20 61 20 32 31 2d 62 69 74 ncoding a 21-bit
5710: 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 61 argument into a
5720: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 77 n instruction, w
5730: 65 20 6e 65 65 64 20 74 68 65 0a 20 20 20 2a 20 e need the. *
5740: 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65 20 72 to perform the r
5750: 65 76 65 72 73 65 20 70 65 72 6d 75 74 61 74 69 everse permutati
5760: 6f 6e 3a 0a 20 20 20 2a 20 70 65 72 6d 75 74 65 on:. * permute
5770: 32 31 3a 20 20 79 5b 32 30 5d 2e 2e 2e 79 5b 30 21: y[20]...y[0
5780: 5d 0a 20 20 20 2a 20 20 20 20 20 20 20 2d 2d 3e ]. * -->
5790: 20 79 5b 36 5d 2e 2e 2e 79 5b 32 5d 20 79 5b 38 y[6]...y[2] y[8
57a0: 5d 2e 2e 79 5b 37 5d 20 79 5b 31 5d 2e 2e 79 5b ]..y[7] y[1]..y[
57b0: 30 5d 20 79 5b 31 39 5d 2e 2e 2e 79 5b 39 5d 20 0] y[19]...y[9]
57c0: 79 5b 32 30 5d 0a 20 20 20 2a 2f 0a 23 64 65 66 y[20]. */.#def
57d0: 69 6e 65 20 61 73 73 65 6d 62 6c 65 32 31 28 78 ine assemble21(x
57e0: 29 20 20 5c 0a 20 20 28 28 28 28 78 29 20 26 20 ) \. ((((x) &
57f0: 30 78 31 29 20 3c 3c 20 32 30 29 20 7c 20 28 28 0x1) << 20) | ((
5800: 28 78 29 20 26 20 30 78 46 46 45 29 20 3c 3c 20 (x) & 0xFFE) <<
5810: 38 29 20 7c 20 5c 0a 20 20 20 28 28 28 78 29 20 8) | \. (((x)
5820: 26 20 30 78 43 30 30 30 29 20 3e 3e 20 37 29 20 & 0xC000) >> 7)
5830: 7c 20 28 28 28 78 29 20 26 20 30 78 31 46 30 30 | (((x) & 0x1F00
5840: 30 30 29 20 3e 3e 20 31 34 29 20 7c 20 28 28 28 00) >> 14) | (((
5850: 78 29 20 26 20 30 78 33 30 30 30 29 20 3e 3e 20 x) & 0x3000) >>
5860: 31 32 29 29 0a 23 64 65 66 69 6e 65 20 70 65 72 12)).#define per
5870: 6d 75 74 65 32 31 28 79 29 20 20 5c 0a 20 20 28 mute21(y) \. (
5880: 28 28 28 79 29 20 26 20 30 78 37 43 29 20 3c 3c (((y) & 0x7C) <<
5890: 20 31 34 29 20 7c 20 28 28 28 79 29 20 26 20 30 14) | (((y) & 0
58a0: 78 31 38 30 29 20 3c 3c 20 37 29 20 7c 20 28 28 x180) << 7) | ((
58b0: 28 79 29 20 26 20 30 78 33 29 20 3c 3c 20 31 32 (y) & 0x3) << 12
58c0: 29 20 7c 20 5c 0a 20 20 20 28 28 28 79 29 20 26 ) | \. (((y) &
58d0: 20 30 78 46 46 45 30 30 29 20 3e 3e 20 38 29 20 0xFFE00) >> 8)
58e0: 7c 20 28 28 28 79 29 20 26 20 30 78 31 30 30 30 | (((y) & 0x1000
58f0: 30 30 29 20 3e 3e 20 32 30 29 29 0a 23 64 65 66 00) >> 20)).#def
5900: 69 6e 65 20 68 69 28 77 6f 72 64 29 20 20 70 65 ine hi(word) pe
5910: 72 6d 75 74 65 32 31 28 28 75 6e 73 69 67 6e 65 rmute21((unsigne
5920: 64 20 6c 6f 6e 67 29 20 28 77 6f 72 64 29 20 3e d long) (word) >
5930: 3e 20 31 31 29 0a 23 64 65 66 69 6e 65 20 6c 6f > 11).#define lo
5940: 28 77 6f 72 64 29 20 20 28 28 28 75 6e 73 69 67 (word) (((unsig
5950: 6e 65 64 20 6c 6f 6e 67 29 20 28 77 6f 72 64 29 ned long) (word)
5960: 20 26 20 30 78 37 46 46 29 20 3c 3c 20 31 29 0a & 0x7FF) << 1).
5970: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e *(long *) (fun
5980: 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20 30 78 32 ction + 0) = 0x2
5990: 33 41 30 30 30 30 30 20 7c 20 68 69 28 64 61 74 3A00000 | hi(dat
59a0: 61 29 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 a);. *(long *)
59b0: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d (function + 4) =
59c0: 20 30 78 32 32 41 30 30 30 30 30 20 7c 20 68 69 0x22A00000 | hi
59d0: 28 61 64 64 72 65 73 73 29 3b 0a 20 20 2a 28 6c (address);. *(l
59e0: 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ong *) (function
59f0: 20 2b 20 38 29 20 3d 20 30 78 33 37 42 44 30 30 + 8) = 0x37BD00
5a00: 30 30 20 7c 20 6c 6f 28 64 61 74 61 29 3b 0a 20 00 | lo(data);.
5a10: 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 *(long *) (func
5a20: 74 69 6f 6e 20 2b 31 32 29 20 3d 20 30 78 33 36 tion +12) = 0x36
5a30: 42 35 30 30 30 30 20 7c 20 6c 6f 28 61 64 64 72 B50000 | lo(addr
5a40: 65 73 73 29 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a ess);. *(long *
5a50: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 ) (function +16)
5a60: 20 3d 20 30 78 43 37 44 35 43 30 31 32 3b 0a 20 = 0xC7D5C012;.
5a70: 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 *(long *) (func
5a80: 74 69 6f 6e 20 2b 32 30 29 20 3d 20 30 78 44 36 tion +20) = 0xD6
5a90: 41 30 31 43 31 45 3b 0a 20 20 2a 28 6c 6f 6e 67 A01C1E;. *(long
5aa0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 *) (function +2
5ab0: 34 29 20 3d 20 30 78 34 41 42 33 30 30 30 38 3b 4) = 0x4AB30008;
5ac0: 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 . *(long *) (fu
5ad0: 6e 63 74 69 6f 6e 20 2b 32 38 29 20 3d 20 30 78 nction +28) = 0x
5ae0: 34 41 42 35 30 30 30 30 3b 0a 20 20 2a 28 6c 6f 4AB50000;. *(lo
5af0: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 ng *) (function
5b00: 2b 33 32 29 20 3d 20 30 78 30 32 41 30 31 30 41 +32) = 0x02A010A
5b10: 31 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 1;. *(long *) (
5b20: 66 75 6e 63 74 69 6f 6e 20 2b 33 36 29 20 3d 20 function +36) =
5b30: 30 78 30 30 30 31 31 38 32 30 3b 0a 20 20 2a 28 0x00011820;. *(
5b40: 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f long *) (functio
5b50: 6e 20 2b 34 30 29 20 3d 20 30 78 45 32 41 30 30 n +40) = 0xE2A00
5b60: 30 30 32 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 002;. *(long *)
5b70: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 34 34 29 20 (function +44)
5b80: 3d 20 30 78 30 38 30 30 30 32 34 30 3b 0a 23 64 = 0x08000240;.#d
5b90: 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 28 66 efine is_tramp(f
5ba0: 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 28 unction) \. ((
5bb0: 6c 6f 6e 67 29 20 66 75 6e 63 74 69 6f 6e 20 26 long) function &
5bc0: 20 33 29 20 3d 3d 20 30 20 26 26 20 5c 0a 20 20 3) == 0 && \.
5bd0: 28 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 (*(long *) (func
5be0: 74 69 6f 6e 20 2b 20 30 29 20 26 20 30 78 66 66 tion + 0) & 0xff
5bf0: 65 30 30 30 30 30 29 20 3d 3d 20 30 78 32 33 41 e00000) == 0x23A
5c00: 30 30 30 30 30 20 26 26 20 5c 0a 20 20 28 2a 28 00000 && \. (*(
5c10: 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f long *) (functio
5c20: 6e 20 2b 20 34 29 20 26 20 30 78 66 66 65 30 30 n + 4) & 0xffe00
5c30: 30 30 30 29 20 3d 3d 20 30 78 32 32 41 30 30 30 000) == 0x22A000
5c40: 30 30 20 26 26 20 5c 0a 20 20 28 2a 28 6c 6f 6e 00 && \. (*(lon
5c50: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b g *) (function +
5c60: 20 38 29 20 26 20 30 78 66 66 66 66 66 30 30 30 8) & 0xfffff000
5c70: 29 20 3d 3d 20 30 78 33 37 42 44 30 30 30 30 20 ) == 0x37BD0000
5c80: 26 26 20 5c 0a 20 20 28 2a 28 6c 6f 6e 67 20 2a && \. (*(long *
5c90: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 ) (function +12)
5ca0: 20 26 20 30 78 66 66 66 66 66 30 30 30 29 20 3d & 0xfffff000) =
5cb0: 3d 20 30 78 33 36 42 35 30 30 30 30 20 26 26 20 = 0x36B50000 &&
5cc0: 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 \. *(long *) (f
5cd0: 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 3d 20 unction +16) ==
5ce0: 30 78 43 37 44 35 43 30 31 32 20 26 26 20 5c 0a 0xC7D5C012 && \.
5cf0: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e *(long *) (fun
5d00: 63 74 69 6f 6e 20 2b 32 30 29 20 3d 3d 20 30 78 ction +20) == 0x
5d10: 44 36 41 30 31 43 31 45 20 26 26 20 5c 0a 20 20 D6A01C1E && \.
5d20: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 *(long *) (funct
5d30: 69 6f 6e 20 2b 32 34 29 20 3d 3d 20 30 78 34 41 ion +24) == 0x4A
5d40: 42 33 30 30 30 38 20 26 26 20 5c 0a 20 20 2a 28 B30008 && \. *(
5d50: 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f long *) (functio
5d60: 6e 20 2b 32 38 29 20 3d 3d 20 30 78 34 41 42 35 n +28) == 0x4AB5
5d70: 30 30 30 30 20 26 26 20 5c 0a 20 20 2a 28 6c 6f 0000 && \. *(lo
5d80: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 ng *) (function
5d90: 2b 33 32 29 20 3d 3d 20 30 78 30 32 41 30 31 30 +32) == 0x02A010
5da0: 41 31 20 26 26 20 5c 0a 20 20 2a 28 6c 6f 6e 67 A1 && \. *(long
5db0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 33 *) (function +3
5dc0: 36 29 20 3d 3d 20 30 78 30 30 30 31 31 38 32 30 6) == 0x00011820
5dd0: 20 26 26 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a && \. *(long *
5de0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 34 30 29 ) (function +40)
5df0: 20 3d 3d 20 30 78 45 32 41 30 30 30 30 32 20 26 == 0xE2A00002 &
5e00: 26 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 & \. *(long *)
5e10: 28 66 75 6e 63 74 69 6f 6e 20 2b 34 34 29 20 3d (function +44) =
5e20: 3d 20 30 78 30 38 30 30 30 32 34 30 0a 23 64 65 = 0x08000240.#de
5e30: 66 69 6e 65 20 68 69 6c 6f 28 68 69 77 6f 72 64 fine hilo(hiword
5e40: 2c 6c 6f 77 6f 72 64 29 20 20 5c 0a 20 20 28 28 ,loword) \. ((
5e50: 61 73 73 65 6d 62 6c 65 32 31 28 28 75 6e 73 69 assemble21((unsi
5e60: 67 6e 65 64 20 6c 6f 6e 67 29 20 28 68 69 77 6f gned long) (hiwo
5e70: 72 64 29 29 20 3c 3c 20 31 31 29 20 7c 20 5c 0a rd)) << 11) | \.
5e80: 20 20 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c (((unsigned l
5e90: 6f 6e 67 29 20 28 6c 6f 77 6f 72 64 29 20 26 20 ong) (loword) &
5ea0: 30 78 46 46 45 29 20 3e 3e 20 31 29 20 5c 0a 20 0xFFE) >> 1) \.
5eb0: 20 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 ).#define tramp
5ec0: 5f 61 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f _address(functio
5ed0: 6e 29 20 20 5c 0a 20 20 68 69 6c 6f 28 2a 28 6c n) \. hilo(*(l
5ee0: 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ong *) (function
5ef0: 20 2b 20 34 29 2c 20 2a 28 6c 6f 6e 67 20 2a 29 + 4), *(long *)
5f00: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 29 (function +12))
5f10: 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 .#define tramp_d
5f20: 61 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c ata(function) \
5f30: 0a 20 20 68 69 6c 6f 28 2a 28 6c 6f 6e 67 20 2a . hilo(*(long *
5f40: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 ) (function + 0)
5f50: 2c 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e , *(long *) (fun
5f60: 63 74 69 6f 6e 20 2b 20 38 29 29 0a 23 65 6e 64 ction + 8)).#end
5f70: 69 66 0a 23 69 66 64 65 66 20 5f 5f 68 70 70 61 if.#ifdef __hppa
5f80: 6e 65 77 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 new__. /* funct
5f90: 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 2e 6c 6f ion:. * .lo
5fa0: 6e 67 20 20 20 74 72 61 6d 70 5f 72 0a 20 20 20 ng tramp_r.
5fb0: 2a 20 20 20 20 2e 6c 6f 6e 67 20 20 20 63 6c 6f * .long clo
5fc0: 73 75 72 65 0a 20 20 20 2a 20 63 6c 6f 73 75 72 sure. * closur
5fd0: 65 3a 0a 20 20 20 2a 20 20 20 20 2e 6c 6f 6e 67 e:. * .long
5fe0: 20 20 20 3c 64 61 74 61 3e 0a 20 20 20 2a 20 20 <data>. *
5ff0: 20 20 2e 6c 6f 6e 67 20 20 20 3c 61 64 64 72 65 .long <addre
6000: 73 73 3e 0a 20 20 20 2a 2f 0a 20 20 7b 20 2f 2a ss>. */. { /*
6010: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 62 work around a b
6020: 75 67 20 69 6e 20 67 63 63 20 33 2e 2a 20 2a 2f ug in gcc 3.* */
6030: 0a 20 20 20 20 76 6f 69 64 2a 20 74 72 61 6d 70 . void* tramp
6040: 5f 72 5f 61 64 64 72 65 73 73 20 3d 20 26 74 72 _r_address = &tr
6050: 61 6d 70 5f 72 3b 0a 20 20 20 20 2a 28 6c 6f 6e amp_r;. *(lon
6060: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b g *) (function +
6070: 20 30 29 20 3d 20 28 28 6c 6f 6e 67 20 2a 29 20 0) = ((long *)
6080: 28 28 63 68 61 72 2a 29 74 72 61 6d 70 5f 72 5f ((char*)tramp_r_
6090: 61 64 64 72 65 73 73 2d 32 29 29 5b 30 5d 3b 0a address-2))[0];.
60a0: 20 20 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 *(long *) (f
60b0: 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 20 28 unction + 4) = (
60c0: 6c 6f 6e 67 29 20 28 66 75 6e 63 74 69 6f 6e 20 long) (function
60d0: 2b 20 38 29 3b 0a 20 20 20 20 2a 28 6c 6f 6e 67 + 8);. *(long
60e0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 *) (function +
60f0: 38 29 20 3d 20 28 6c 6f 6e 67 29 20 64 61 74 61 8) = (long) data
6100: 3b 0a 20 20 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 ;. *(long *)
6110: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d (function +12) =
6120: 20 28 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 3b (long) address;
6130: 0a 20 20 7d 0a 23 64 65 66 69 6e 65 20 69 73 5f . }.#define is_
6140: 74 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20 tramp(function)
6150: 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 \. ((long *) f
6160: 75 6e 63 74 69 6f 6e 29 5b 30 5d 20 3d 3d 20 28 unction)[0] == (
6170: 28 6c 6f 6e 67 20 2a 29 20 28 28 63 68 61 72 2a (long *) ((char*
6180: 29 74 72 61 6d 70 5f 72 5f 61 64 64 72 65 73 73 )tramp_r_address
6190: 2d 32 29 29 5b 30 5d 0a 23 64 65 66 69 6e 65 20 -2))[0].#define
61a0: 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75 tramp_address(fu
61b0: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 28 6c nction) \. ((l
61c0: 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 ong *) function)
61d0: 5b 33 5d 0a 23 64 65 66 69 6e 65 20 74 72 61 6d [3].#define tram
61e0: 70 5f 64 61 74 61 28 66 75 6e 63 74 69 6f 6e 29 p_data(function)
61f0: 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 20 \. ((long *)
6200: 66 75 6e 63 74 69 6f 6e 29 5b 32 5d 0a 23 65 6e function)[2].#en
6210: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 61 72 6d dif.#ifdef __arm
6220: 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e __. /* function
6230: 3a 0a 20 20 20 2a 20 20 20 20 6c 64 72 20 20 20 :. * ldr
6240: 20 20 69 70 2c 5b 70 63 2c 23 5f 66 75 6e 63 74 ip,[pc,#_funct
6250: 69 6f 6e 2d 2e 2d 38 5d 09 09 45 35 39 46 43 30 ion-.-8]..E59FC0
6260: 31 34 0a 20 20 20 2a 20 20 20 20 6c 64 72 20 20 14. * ldr
6270: 20 20 20 69 70 2c 5b 69 70 2c 23 30 5d 09 09 09 ip,[ip,#0]...
6280: 45 35 39 43 43 30 30 30 20 20 3f 3f 49 73 20 74 E59CC000 ??Is t
6290: 68 69 73 20 63 6f 72 72 65 63 74 3f 3f 0a 20 20 his correct??.
62a0: 20 2a 20 20 20 20 73 74 6d 66 64 20 20 20 73 70 * stmfd sp
62b0: 21 2c 7b 69 70 7d 09 09 09 45 39 32 44 31 30 30 !,{ip}...E92D100
62c0: 30 0a 20 20 20 2a 20 20 20 20 6c 64 72 20 20 20 0. * ldr
62d0: 20 20 69 70 2c 5b 70 63 2c 23 5f 64 61 74 61 2d ip,[pc,#_data-
62e0: 2e 2d 38 5d 09 09 45 35 39 46 43 30 30 34 0a 20 .-8]..E59FC004.
62f0: 20 20 2a 20 20 20 20 6c 64 72 20 20 20 20 20 69 * ldr i
6300: 70 2c 5b 69 70 2c 23 30 5d 09 09 09 45 35 39 43 p,[ip,#0]...E59C
6310: 43 30 30 30 20 20 3f 3f 49 73 20 74 68 69 73 20 C000 ??Is this
6320: 63 6f 72 72 65 63 74 3f 3f 0a 20 20 20 2a 20 20 correct??. *
6330: 20 20 6c 64 6d 66 64 20 20 20 73 70 21 2c 7b 70 ldmfd sp!,{p
6340: 63 7d 5e 09 09 09 45 38 46 44 38 30 30 30 0a 20 c}^...E8FD8000.
6350: 20 20 2a 20 5f 64 61 74 61 3a 0a 20 20 20 2a 20 * _data:. *
6360: 20 20 20 2e 77 6f 72 64 20 20 20 3c 64 61 74 61 .word <data
6370: 3e 09 09 09 09 3c 64 61 74 61 3e 0a 20 20 20 2a >....<data>. *
6380: 20 5f 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a _function:. *
6390: 20 20 20 20 2e 77 6f 72 64 20 20 20 3c 61 64 64 .word <add
63a0: 72 65 73 73 3e 09 09 09 3c 61 64 64 72 65 73 73 ress>...<address
63b0: 3e 0a 20 20 20 2a 2f 0a 20 20 7b 20 73 74 61 74 >. */. { stat
63c0: 69 63 20 6c 6f 6e 67 20 63 6f 64 65 20 5b 36 5d ic long code [6]
63d0: 20 3d 0a 20 20 20 20 20 20 7b 20 30 78 45 35 39 =. { 0xE59
63e0: 46 43 30 31 34 2c 20 30 78 45 35 39 43 43 30 30 FC014, 0xE59CC00
63f0: 30 2c 20 30 78 45 39 32 44 31 30 30 30 2c 20 30 0, 0xE92D1000, 0
6400: 78 45 35 39 46 43 30 30 34 2c 0a 20 20 20 20 20 xE59FC004,.
6410: 20 20 20 30 78 45 35 39 43 43 30 30 30 2c 20 30 0xE59CC000, 0
6420: 78 45 38 46 44 38 30 30 30 0a 20 20 20 20 20 20 xE8FD8000.
6430: 7d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 };. int i;.
6440: 20 20 66 6f 72 20 28 69 3d 30 3b 20 69 3c 36 3b for (i=0; i<6;
6450: 20 69 2b 2b 29 20 7b 20 28 28 6c 6f 6e 67 20 2a i++) { ((long *
6460: 29 20 66 75 6e 63 74 69 6f 6e 29 5b 69 5d 20 3d ) function)[i] =
6470: 20 63 6f 64 65 5b 69 5d 3b 20 7d 0a 20 20 20 20 code[i]; }.
6480: 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 ((long *) functi
6490: 6f 6e 29 5b 36 5d 20 3d 20 28 6c 6f 6e 67 29 20 on)[6] = (long)
64a0: 64 61 74 61 3b 0a 20 20 20 20 28 28 6c 6f 6e 67 data;. ((long
64b0: 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 37 5d *) function)[7]
64c0: 20 3d 20 28 6c 6f 6e 67 29 20 61 64 64 72 65 73 = (long) addres
64d0: 73 3b 0a 20 20 7d 0a 23 64 65 66 69 6e 65 20 69 s;. }.#define i
64e0: 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e s_tramp(function
64f0: 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 ) \. ((long *)
6500: 20 66 75 6e 63 74 69 6f 6e 29 5b 30 5d 20 3d 3d function)[0] ==
6510: 20 30 78 45 35 39 46 43 30 31 34 20 26 26 20 5c 0xE59FC014 && \
6520: 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e . ((long *) fun
6530: 63 74 69 6f 6e 29 5b 31 5d 20 3d 3d 20 30 78 45 ction)[1] == 0xE
6540: 35 39 43 43 30 30 30 20 26 26 20 5c 0a 20 20 28 59CC000 && \. (
6550: 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f (long *) functio
6560: 6e 29 5b 32 5d 20 3d 3d 20 30 78 45 39 32 44 31 n)[2] == 0xE92D1
6570: 30 30 30 20 26 26 20 5c 0a 20 20 28 28 6c 6f 6e 000 && \. ((lon
6580: 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 33 g *) function)[3
6590: 5d 20 3d 3d 20 30 78 45 35 39 46 43 30 30 34 20 ] == 0xE59FC004
65a0: 26 26 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 && \. ((long *)
65b0: 20 66 75 6e 63 74 69 6f 6e 29 5b 34 5d 20 3d 3d function)[4] ==
65c0: 20 30 78 45 35 39 43 43 30 30 30 20 26 26 20 5c 0xE59CC000 && \
65d0: 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e . ((long *) fun
65e0: 63 74 69 6f 6e 29 5b 35 5d 20 3d 3d 20 30 78 45 ction)[5] == 0xE
65f0: 38 46 44 38 30 30 30 0a 23 64 65 66 69 6e 65 20 8FD8000.#define
6600: 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75 tramp_address(fu
6610: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 28 6c nction) \. ((l
6620: 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 ong *) function)
6630: 5b 37 5d 0a 23 64 65 66 69 6e 65 20 74 72 61 6d [7].#define tram
6640: 70 5f 64 61 74 61 28 66 75 6e 63 74 69 6f 6e 29 p_data(function)
6650: 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 20 \. ((long *)
6660: 66 75 6e 63 74 69 6f 6e 29 5b 36 5d 0a 23 65 6e function)[6].#en
6670: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 72 73 36 dif.#ifdef __rs6
6680: 30 30 30 73 79 73 76 34 5f 5f 0a 20 20 2f 2a 20 000sysv4__. /*
6690: 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 function:. *
66a0: 20 20 7b 6c 69 75 7c 6c 69 73 7d 20 31 31 2c 68 {liu|lis} 11,h
66b0: 69 31 36 28 3c 64 61 74 61 3e 29 09 09 33 44 20 i16(<data>)..3D
66c0: 36 30 20 68 69 31 36 28 3c 64 61 74 61 3e 29 0a 60 hi16(<data>).
66d0: 20 20 20 2a 20 20 20 20 7b 6f 72 69 6c 7c 6f 72 * {oril|or
66e0: 69 7d 20 31 31 2c 31 31 2c 6c 6f 31 36 28 3c 64 i} 11,11,lo16(<d
66f0: 61 74 61 3e 29 09 09 36 31 20 36 42 20 6c 6f 31 ata>)..61 6B lo1
6700: 36 28 3c 64 61 74 61 3e 29 0a 20 20 20 2a 20 20 6(<data>). *
6710: 20 20 7b 6c 69 75 7c 6c 69 73 7d 20 30 2c 68 69 {liu|lis} 0,hi
6720: 31 36 28 3c 61 64 64 72 65 73 73 3e 29 09 09 33 16(<address>)..3
6730: 43 20 30 30 20 68 69 31 36 28 3c 61 64 64 72 65 C 00 hi16(<addre
6740: 73 73 3e 29 0a 20 20 20 2a 20 20 20 20 7b 6f 72 ss>). * {or
6750: 69 6c 7c 6f 72 69 7d 20 30 2c 30 2c 6c 6f 31 36 il|ori} 0,0,lo16
6760: 28 3c 61 64 64 72 65 73 73 3e 29 09 09 36 30 20 (<address>)..60
6770: 30 30 20 6c 6f 31 36 28 3c 61 64 64 72 65 73 73 00 lo16(<address
6780: 3e 29 0a 20 20 20 2a 20 20 20 20 6d 74 63 74 72 >). * mtctr
6790: 20 30 09 09 09 09 09 37 43 20 30 39 20 30 33 20 0.....7C 09 03
67a0: 41 36 0a 20 20 20 2a 20 20 20 20 62 63 74 72 09 A6. * bctr.
67b0: 09 09 09 09 34 45 20 38 30 20 30 34 20 32 30 0a ....4E 80 04 20.
67c0: 20 20 20 2a 2f 0a 20 20 2a 28 73 68 6f 72 74 20 */. *(short
67d0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 *) (function + 0
67e0: 29 20 3d 20 30 78 33 44 36 30 3b 0a 20 20 2a 28 ) = 0x3D60;. *(
67f0: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
6800: 6f 6e 20 2b 20 32 29 20 3d 20 28 75 6e 73 69 67 on + 2) = (unsig
6810: 6e 65 64 20 6c 6f 6e 67 29 20 64 61 74 61 20 3e ned long) data >
6820: 3e 20 31 36 3b 0a 20 20 2a 28 73 68 6f 72 74 20 > 16;. *(short
6830: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 *) (function + 4
6840: 29 20 3d 20 30 78 36 31 36 42 3b 0a 20 20 2a 28 ) = 0x616B;. *(
6850: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
6860: 6f 6e 20 2b 20 36 29 20 3d 20 28 75 6e 73 69 67 on + 6) = (unsig
6870: 6e 65 64 20 6c 6f 6e 67 29 20 64 61 74 61 20 26 ned long) data &
6880: 20 30 78 66 66 66 66 3b 0a 20 20 2a 28 73 68 6f 0xffff;. *(sho
6890: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
68a0: 2b 20 38 29 20 3d 20 30 78 33 43 30 30 3b 0a 20 + 8) = 0x3C00;.
68b0: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e *(short *) (fun
68c0: 63 74 69 6f 6e 20 2b 31 30 29 20 3d 20 28 75 6e ction +10) = (un
68d0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64 signed long) add
68e0: 72 65 73 73 20 3e 3e 20 31 36 3b 0a 20 20 2a 28 ress >> 16;. *(
68f0: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
6900: 6f 6e 20 2b 31 32 29 20 3d 20 30 78 36 30 30 30 on +12) = 0x6000
6910: 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 ;. *(short *) (
6920: 66 75 6e 63 74 69 6f 6e 20 2b 31 34 29 20 3d 20 function +14) =
6930: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
6940: 61 64 64 72 65 73 73 20 26 20 30 78 66 66 66 66 address & 0xffff
6950: 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 ;. *(long *) (
6960: 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20 function +16) =
6970: 30 78 37 43 30 39 30 33 41 36 3b 0a 20 20 2a 28 0x7C0903A6;. *(
6980: 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 long *) (functi
6990: 6f 6e 20 2b 32 30 29 20 3d 20 30 78 34 45 38 30 on +20) = 0x4E80
69a0: 30 34 32 30 3b 0a 23 64 65 66 69 6e 65 20 69 73 0420;.#define is
69b0: 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29 _tramp(function)
69c0: 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 \. *(unsigned
69d0: 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 short *) (funct
69e0: 69 6f 6e 20 2b 20 30 29 20 3d 3d 20 30 78 33 44 ion + 0) == 0x3D
69f0: 36 30 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 60 && \. *(unsi
6a00: 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 gned short *) (f
6a10: 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 3d 20 unction + 4) ==
6a20: 30 78 36 31 36 42 20 26 26 20 5c 0a 20 20 2a 28 0x616B && \. *(
6a30: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a unsigned short *
6a40: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 ) (function + 8)
6a50: 20 3d 3d 20 30 78 33 43 30 30 20 26 26 20 5c 0a == 0x3C00 && \.
6a60: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f *(unsigned sho
6a70: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
6a80: 2b 31 32 29 20 3d 3d 20 30 78 36 30 30 30 20 26 +12) == 0x6000 &
6a90: 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 & \. *(unsigned
6aa0: 20 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 long *) (funct
6ab0: 69 6f 6e 20 2b 31 36 29 20 3d 3d 20 30 78 37 43 ion +16) == 0x7C
6ac0: 30 39 30 33 41 36 20 26 26 20 5c 0a 20 20 2a 28 0903A6 && \. *(
6ad0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 29 unsigned long *)
6ae0: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 30 29 (function +20)
6af0: 20 3d 3d 20 30 78 34 45 38 30 30 34 32 30 0a 23 == 0x4E800420.#
6b00: 64 65 66 69 6e 65 20 68 69 6c 6f 28 68 69 77 6f define hilo(hiwo
6b10: 72 64 2c 6c 6f 77 6f 72 64 29 20 20 5c 0a 20 20 rd,loword) \.
6b20: 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 (((unsigned long
6b30: 29 20 28 68 69 77 6f 72 64 29 20 3c 3c 20 31 36 ) (hiword) << 16
6b40: 29 20 7c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f ) | (unsigned lo
6b50: 6e 67 29 20 28 6c 6f 77 6f 72 64 29 29 0a 23 64 ng) (loword)).#d
6b60: 65 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 efine tramp_addr
6b70: 65 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c ess(function) \
6b80: 0a 20 20 68 69 6c 6f 28 2a 28 75 6e 73 69 67 6e . hilo(*(unsign
6b90: 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e ed short *) (fun
6ba0: 63 74 69 6f 6e 20 2b 31 30 29 2c 20 2a 28 75 6e ction +10), *(un
6bb0: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 signed short *)
6bc0: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 34 29 29 0a (function +14)).
6bd0: 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 #define tramp_da
6be0: 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a ta(function) \.
6bf0: 20 20 68 69 6c 6f 28 2a 28 75 6e 73 69 67 6e 65 hilo(*(unsigne
6c00: 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 d short *) (func
6c10: 74 69 6f 6e 20 2b 20 32 29 2c 20 2a 28 75 6e 73 tion + 2), *(uns
6c20: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 igned short *) (
6c30: 66 75 6e 63 74 69 6f 6e 20 2b 20 36 29 29 0a 23 function + 6)).#
6c40: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 72 endif.#ifdef __r
6c50: 73 36 30 30 30 6e 65 74 62 73 64 5f 5f 0a 20 20 s6000netbsd__.
6c60: 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 /* function:.
6c70: 2a 20 20 20 20 7b 6c 69 75 7c 6c 69 73 7d 20 31 * {liu|lis} 1
6c80: 33 2c 68 69 31 36 28 3c 64 61 74 61 3e 29 09 09 3,hi16(<data>)..
6c90: 33 44 20 41 30 20 68 69 31 36 28 3c 64 61 74 61 3D A0 hi16(<data
6ca0: 3e 29 0a 20 20 20 2a 20 20 20 20 7b 6f 72 69 6c >). * {oril
6cb0: 7c 6f 72 69 7d 20 31 33 2c 31 33 2c 6c 6f 31 36 |ori} 13,13,lo16
6cc0: 28 3c 64 61 74 61 3e 29 09 09 36 31 20 41 44 20 (<data>)..61 AD
6cd0: 6c 6f 31 36 28 3c 64 61 74 61 3e 29 0a 20 20 20 lo16(<data>).
6ce0: 2a 20 20 20 20 7b 6c 69 75 7c 6c 69 73 7d 20 30 * {liu|lis} 0
6cf0: 2c 68 69 31 36 28 3c 61 64 64 72 65 73 73 3e 29 ,hi16(<address>)
6d00: 09 09 33 43 20 30 30 20 68 69 31 36 28 3c 61 64 ..3C 00 hi16(<ad
6d10: 64 72 65 73 73 3e 29 0a 20 20 20 2a 20 20 20 20 dress>). *
6d20: 7b 6f 72 69 6c 7c 6f 72 69 7d 20 30 2c 30 2c 6c {oril|ori} 0,0,l
6d30: 6f 31 36 28 3c 61 64 64 72 65 73 73 3e 29 09 09 o16(<address>)..
6d40: 36 30 20 30 30 20 6c 6f 31 36 28 3c 61 64 64 72 60 00 lo16(<addr
6d50: 65 73 73 3e 29 0a 20 20 20 2a 20 20 20 20 6d 74 ess>). * mt
6d60: 63 74 72 20 30 09 09 09 09 09 37 43 20 30 39 20 ctr 0.....7C 09
6d70: 30 33 20 41 36 0a 20 20 20 2a 20 20 20 20 62 63 03 A6. * bc
6d80: 74 72 09 09 09 09 09 34 45 20 38 30 20 30 34 20 tr.....4E 80 04
6d90: 32 30 0a 20 20 20 2a 2f 0a 20 20 2a 28 73 68 6f 20. */. *(sho
6da0: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
6db0: 2b 20 30 29 20 3d 20 30 78 33 44 41 30 3b 0a 20 + 0) = 0x3DA0;.
6dc0: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e *(short *) (fun
6dd0: 63 74 69 6f 6e 20 2b 20 32 29 20 3d 20 28 75 6e ction + 2) = (un
6de0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 61 74 signed long) dat
6df0: 61 20 3e 3e 20 31 36 3b 0a 20 20 2a 28 73 68 6f a >> 16;. *(sho
6e00: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
6e10: 2b 20 34 29 20 3d 20 30 78 36 31 41 44 3b 0a 20 + 4) = 0x61AD;.
6e20: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e *(short *) (fun
6e30: 63 74 69 6f 6e 20 2b 20 36 29 20 3d 20 28 75 6e ction + 6) = (un
6e40: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 61 74 signed long) dat
6e50: 61 20 26 20 30 78 66 66 66 66 3b 0a 20 20 2a 28 a & 0xffff;. *(
6e60: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
6e70: 6f 6e 20 2b 20 38 29 20 3d 20 30 78 33 43 30 30 on + 8) = 0x3C00
6e80: 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 ;. *(short *) (
6e90: 66 75 6e 63 74 69 6f 6e 20 2b 31 30 29 20 3d 20 function +10) =
6ea0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
6eb0: 61 64 64 72 65 73 73 20 3e 3e 20 31 36 3b 0a 20 address >> 16;.
6ec0: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e *(short *) (fun
6ed0: 63 74 69 6f 6e 20 2b 31 32 29 20 3d 20 30 78 36 ction +12) = 0x6
6ee0: 30 30 30 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 000;. *(short *
6ef0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 34 29 ) (function +14)
6f00: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e = (unsigned lon
6f10: 67 29 20 61 64 64 72 65 73 73 20 26 20 30 78 66 g) address & 0xf
6f20: 66 66 66 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 fff;. *(long *)
6f30: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 (function +16)
6f40: 20 3d 20 30 78 37 43 30 39 30 33 41 36 3b 0a 20 = 0x7C0903A6;.
6f50: 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e *(long *) (fun
6f60: 63 74 69 6f 6e 20 2b 32 30 29 20 3d 20 30 78 34 ction +20) = 0x4
6f70: 45 38 30 30 34 32 30 3b 0a 23 64 65 66 69 6e 65 E800420;.#define
6f80: 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 is_tramp(functi
6f90: 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67 on) \. *(unsig
6fa0: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 ned short *) (fu
6fb0: 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 3d 20 30 nction + 0) == 0
6fc0: 78 33 44 41 30 20 26 26 20 5c 0a 20 20 2a 28 75 x3DA0 && \. *(u
6fd0: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 nsigned short *)
6fe0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 (function + 4)
6ff0: 3d 3d 20 30 78 36 31 41 44 20 26 26 20 5c 0a 20 == 0x61AD && \.
7000: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 *(unsigned shor
7010: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
7020: 20 38 29 20 3d 3d 20 30 78 33 43 30 30 20 26 26 8) == 0x3C00 &&
7030: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 \. *(unsigned
7040: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
7050: 6f 6e 20 2b 31 32 29 20 3d 3d 20 30 78 36 30 30 on +12) == 0x600
7060: 30 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 0 && \. *(unsig
7070: 6e 65 64 20 6c 6f 6e 67 20 2a 29 20 20 28 66 75 ned long *) (fu
7080: 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 3d 20 30 nction +16) == 0
7090: 78 37 43 30 39 30 33 41 36 20 26 26 20 5c 0a 20 x7C0903A6 && \.
70a0: 20 2a 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 *(unsigned long
70b0: 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b *) (function +
70c0: 32 30 29 20 3d 3d 20 30 78 34 45 38 30 30 34 32 20) == 0x4E80042
70d0: 30 0a 23 64 65 66 69 6e 65 20 68 69 6c 6f 28 68 0.#define hilo(h
70e0: 69 77 6f 72 64 2c 6c 6f 77 6f 72 64 29 20 20 5c iword,loword) \
70f0: 0a 20 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c . (((unsigned l
7100: 6f 6e 67 29 20 28 68 69 77 6f 72 64 29 20 3c 3c ong) (hiword) <<
7110: 20 31 36 29 20 7c 20 28 75 6e 73 69 67 6e 65 64 16) | (unsigned
7120: 20 6c 6f 6e 67 29 20 28 6c 6f 77 6f 72 64 29 29 long) (loword))
7130: 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 61 .#define tramp_a
7140: 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e 29 ddress(function)
7150: 20 20 5c 0a 20 20 68 69 6c 6f 28 2a 28 75 6e 73 \. hilo(*(uns
7160: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 igned short *) (
7170: 66 75 6e 63 74 69 6f 6e 20 2b 31 30 29 2c 20 2a function +10), *
7180: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 (unsigned short
7190: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 34 *) (function +14
71a0: 29 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 )).#define tramp
71b0: 5f 64 61 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 _data(function)
71c0: 20 5c 0a 20 20 68 69 6c 6f 28 2a 28 75 6e 73 69 \. hilo(*(unsi
71d0: 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 gned short *) (f
71e0: 75 6e 63 74 69 6f 6e 20 2b 20 32 29 2c 20 2a 28 unction + 2), *(
71f0: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a unsigned short *
7200: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 36 29 ) (function + 6)
7210: 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 ).#endif.#ifdef
7220: 5f 5f 72 73 36 30 30 30 61 69 78 5f 5f 0a 20 20 __rs6000aix__.
7230: 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 /* function:.
7240: 2a 20 20 20 20 2e 6c 6f 6e 67 20 2e 74 72 61 6d * .long .tram
7250: 70 5f 72 0a 20 20 20 2a 20 20 20 20 2e 6c 6f 6e p_r. * .lon
7260: 67 20 2e 6d 79 74 6f 63 0a 20 20 20 2a 20 20 20 g .mytoc. *
7270: 20 2e 6c 6f 6e 67 20 30 0a 20 20 20 2a 20 2e 6d .long 0. * .m
7280: 79 74 6f 63 3a 0a 20 20 20 2a 20 20 20 20 2e 6c ytoc:. * .l
7290: 6f 6e 67 20 3c 64 61 74 61 3e 0a 20 20 20 2a 20 ong <data>. *
72a0: 20 20 20 2e 6c 6f 6e 67 20 3c 61 64 64 72 65 73 .long <addres
72b0: 73 3e 0a 20 20 20 2a 2f 0a 20 20 2a 28 6c 6f 6e s>. */. *(lon
72c0: 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 g *) (function
72d0: 2b 20 30 29 20 3d 20 28 28 6c 6f 6e 67 20 2a 29 + 0) = ((long *)
72e0: 20 26 74 72 61 6d 70 5f 72 29 5b 30 5d 3b 0a 20 &tramp_r)[0];.
72f0: 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e *(long *) (fun
7300: 63 74 69 6f 6e 20 2b 20 34 29 20 3d 20 28 6c 6f ction + 4) = (lo
7310: 6e 67 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 ng) (function +
7320: 31 32 29 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 12);. *(long *)
7330: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 (function + 8)
7340: 20 3d 20 30 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a = 0;. *(long *
7350: 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 ) (function +12
7360: 29 20 3d 20 28 6c 6f 6e 67 29 20 64 61 74 61 3b ) = (long) data;
7370: 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 . *(long *) (f
7380: 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20 28 unction +16) = (
7390: 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 3b 0a 23 long) address;.#
73a0: 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 28 define is_tramp(
73b0: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 function) \. (
73c0: 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f (long *) functio
73d0: 6e 29 5b 30 5d 20 3d 3d 20 28 28 6c 6f 6e 67 20 n)[0] == ((long
73e0: 2a 29 20 26 74 72 61 6d 70 5f 72 29 5b 30 5d 0a *) &tramp_r)[0].
73f0: 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 #define tramp_ad
7400: 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 dress(function)
7410: 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 \. ((long *) f
7420: 75 6e 63 74 69 6f 6e 29 5b 34 5d 0a 23 64 65 66 unction)[4].#def
7430: 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 28 66 ine tramp_data(f
7440: 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 28 unction) \. ((
7450: 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e long *) function
7460: 29 5b 33 5d 0a 23 65 6e 64 69 66 0a 23 69 66 64 )[3].#endif.#ifd
7470: 65 66 20 5f 5f 6d 38 38 6b 5f 5f 0a 20 20 2f 2a ef __m88k__. /*
7480: 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 function:. *
7490: 20 20 20 6f 72 2e 75 20 20 20 20 23 72 31 31 2c or.u #r11,
74a0: 23 72 30 2c 68 69 31 36 28 3c 64 61 74 61 3e 29 #r0,hi16(<data>)
74b0: 09 09 35 44 20 36 30 20 68 69 31 36 28 3c 64 61 ..5D 60 hi16(<da
74c0: 74 61 3e 29 0a 20 20 20 2a 20 20 20 20 6f 72 20 ta>). * or
74d0: 20 20 20 20 20 23 72 31 31 2c 23 72 31 31 2c 6c #r11,#r11,l
74e0: 6f 31 36 28 3c 64 61 74 61 3e 29 09 09 35 39 20 o16(<data>)..59
74f0: 36 42 20 6c 6f 31 36 28 3c 64 61 74 61 3e 29 0a 6B lo16(<data>).
7500: 20 20 20 2a 20 20 20 20 6f 72 2e 75 20 20 20 20 * or.u
7510: 23 72 31 33 2c 23 72 30 2c 68 69 31 36 28 3c 61 #r13,#r0,hi16(<a
7520: 64 64 72 65 73 73 3e 29 09 35 44 20 41 30 20 68 ddress>).5D A0 h
7530: 69 31 36 28 3c 61 64 64 72 65 73 73 3e 29 0a 20 i16(<address>).
7540: 20 20 2a 20 20 20 20 6f 72 20 20 20 20 20 20 23 * or #
7550: 72 31 33 2c 23 72 31 33 2c 6c 6f 31 36 28 3c 61 r13,#r13,lo16(<a
7560: 64 64 72 65 73 73 3e 29 09 35 39 20 41 44 20 6c ddress>).59 AD l
7570: 6f 31 36 28 3c 61 64 64 72 65 73 73 3e 29 0a 20 o16(<address>).
7580: 20 20 2a 20 20 20 20 6a 6d 70 20 20 20 20 20 23 * jmp #
7590: 72 31 33 09 09 09 09 46 34 20 30 30 20 43 30 20 r13....F4 00 C0
75a0: 30 44 0a 20 20 20 2a 2f 0a 20 20 2a 28 73 68 6f 0D. */. *(sho
75b0: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
75c0: 2b 20 30 29 20 3d 20 30 78 35 44 36 30 3b 0a 20 + 0) = 0x5D60;.
75d0: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e *(short *) (fun
75e0: 63 74 69 6f 6e 20 2b 20 32 29 20 3d 20 28 75 6e ction + 2) = (un
75f0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 61 74 signed long) dat
7600: 61 20 3e 3e 20 31 36 3b 0a 20 20 2a 28 73 68 6f a >> 16;. *(sho
7610: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
7620: 2b 20 34 29 20 3d 20 30 78 35 39 36 42 3b 0a 20 + 4) = 0x596B;.
7630: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e *(short *) (fun
7640: 63 74 69 6f 6e 20 2b 20 36 29 20 3d 20 28 75 6e ction + 6) = (un
7650: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 61 74 signed long) dat
7660: 61 20 26 20 30 78 66 66 66 66 3b 0a 20 20 2a 28 a & 0xffff;. *(
7670: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
7680: 6f 6e 20 2b 20 38 29 20 3d 20 30 78 35 44 41 30 on + 8) = 0x5DA0
7690: 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 ;. *(short *) (
76a0: 66 75 6e 63 74 69 6f 6e 20 2b 31 30 29 20 3d 20 function +10) =
76b0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
76c0: 61 64 64 72 65 73 73 20 3e 3e 20 31 36 3b 0a 20 address >> 16;.
76d0: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e *(short *) (fun
76e0: 63 74 69 6f 6e 20 2b 31 32 29 20 3d 20 30 78 35 ction +12) = 0x5
76f0: 39 41 44 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 9AD;. *(short *
7700: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 34 29 ) (function +14)
7710: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e = (unsigned lon
7720: 67 29 20 61 64 64 72 65 73 73 20 26 20 30 78 66 g) address & 0xf
7730: 66 66 66 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 fff;. *(long *)
7740: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 (function +16)
7750: 20 3d 20 30 78 46 34 30 30 43 30 30 44 3b 0a 23 = 0xF400C00D;.#
7760: 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 28 define is_tramp(
7770: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a function) \. *
7780: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 (unsigned short
7790: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 *) (function + 0
77a0: 29 20 3d 3d 20 30 78 35 44 36 30 20 26 26 20 5c ) == 0x5D60 && \
77b0: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 . *(unsigned sh
77c0: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ort *) (function
77d0: 20 2b 20 34 29 20 3d 3d 20 30 78 35 39 36 42 20 + 4) == 0x596B
77e0: 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 && \. *(unsigne
77f0: 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 d short *) (func
7800: 74 69 6f 6e 20 2b 20 38 29 20 3d 3d 20 30 78 35 tion + 8) == 0x5
7810: 44 41 30 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 DA0 && \. *(uns
7820: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 igned short *) (
7830: 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d 3d function +12) ==
7840: 20 30 78 35 39 41 44 20 26 26 20 5c 0a 20 20 2a 0x59AD && \. *
7850: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a (unsigned long *
7860: 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 ) (function +16
7870: 29 20 3d 3d 20 30 78 46 34 30 30 43 30 30 44 0a ) == 0xF400C00D.
7880: 23 64 65 66 69 6e 65 20 68 69 6c 6f 28 68 69 77 #define hilo(hiw
7890: 6f 72 64 2c 6c 6f 77 6f 72 64 29 20 20 5c 0a 20 ord,loword) \.
78a0: 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e (((unsigned lon
78b0: 67 29 20 28 68 69 77 6f 72 64 29 20 3c 3c 20 31 g) (hiword) << 1
78c0: 36 29 20 7c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6) | (unsigned l
78d0: 6f 6e 67 29 20 28 6c 6f 77 6f 72 64 29 29 0a 23 ong) (loword)).#
78e0: 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 define tramp_add
78f0: 72 65 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 ress(function)
7900: 5c 0a 20 20 68 69 6c 6f 28 2a 28 75 6e 73 69 67 \. hilo(*(unsig
7910: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 ned short *) (fu
7920: 6e 63 74 69 6f 6e 20 2b 31 30 29 2c 20 2a 28 75 nction +10), *(u
7930: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 nsigned short *)
7940: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 34 29 29 (function +14))
7950: 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 .#define tramp_d
7960: 61 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c ata(function) \
7970: 0a 20 20 68 69 6c 6f 28 2a 28 75 6e 73 69 67 6e . hilo(*(unsign
7980: 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e ed short *) (fun
7990: 63 74 69 6f 6e 20 2b 20 32 29 2c 20 2a 28 75 6e ction + 2), *(un
79a0: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 signed short *)
79b0: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 36 29 29 0a (function + 6)).
79c0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f #endif.#ifdef __
79d0: 63 6f 6e 76 65 78 5f 5f 0a 20 20 2f 2a 20 66 75 convex__. /* fu
79e0: 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 nction:. *
79f0: 6c 64 2e 77 20 23 3c 64 61 74 61 3e 2c 73 30 09 ld.w #<data>,s0.
7a00: 09 09 09 3f 3f 3f 3f 20 3c 64 61 74 61 3e 0a 20 ...???? <data>.
7a10: 20 20 2a 20 20 20 20 6a 6d 70 20 3c 61 64 64 72 * jmp <addr
7a20: 65 73 73 3e 09 09 09 09 30 31 34 30 20 3c 61 64 ess>....0140 <ad
7a30: 64 72 65 73 73 3e 0a 20 20 20 2a 20 20 20 20 64 dress>. * d
7a40: 73 2e 68 20 30 09 09 09 09 09 30 30 30 30 0a 20 s.h 0.....0000.
7a50: 20 20 2a 2f 0a 20 20 2a 28 73 68 6f 72 74 20 2a */. *(short *
7a60: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 ) (function + 0)
7a70: 20 3d 20 30 78 3f 3f 3f 3f 3b 0a 20 20 2a 28 6c = 0x????;. *(l
7a80: 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f ong *) (functio
7a90: 6e 20 2b 20 32 29 20 3d 20 28 75 6e 73 69 67 6e n + 2) = (unsign
7aa0: 65 64 20 6c 6f 6e 67 29 20 64 61 74 61 3b 0a 20 ed long) data;.
7ab0: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e *(short *) (fun
7ac0: 63 74 69 6f 6e 20 2b 20 36 29 20 3d 20 30 78 30 ction + 6) = 0x0
7ad0: 31 34 30 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 140;. *(long *)
7ae0: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 (function + 8)
7af0: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e = (unsigned lon
7b00: 67 29 20 61 64 64 72 65 73 73 3b 0a 20 20 2a 28 g) address;. *(
7b10: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
7b20: 6f 6e 20 2b 31 32 29 20 3d 20 30 78 30 30 30 30 on +12) = 0x0000
7b30: 3b 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72 61 ;.#define is_tra
7b40: 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a mp(function) \.
7b50: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f *(unsigned sho
7b60: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
7b70: 2b 20 30 29 20 3d 3d 20 30 78 3f 3f 3f 3f 20 26 + 0) == 0x???? &
7b80: 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 & \. *(unsigned
7b90: 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 short *) (funct
7ba0: 69 6f 6e 20 2b 20 36 29 20 3d 3d 20 30 78 30 31 ion + 6) == 0x01
7bb0: 34 30 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 40 && \. *(unsi
7bc0: 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 gned short *) (f
7bd0: 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d 3d 20 unction +12) ==
7be0: 30 78 30 30 30 30 0a 23 64 65 66 69 6e 65 20 74 0x0000.#define t
7bf0: 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75 6e ramp_address(fun
7c00: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 6c 6f ction) \. *(lo
7c10: 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e ng *) (function
7c20: 20 2b 20 38 29 0a 23 64 65 66 69 6e 65 20 74 72 + 8).#define tr
7c30: 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 74 69 6f amp_data(functio
7c40: 6e 29 20 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a n) \. *(long *
7c50: 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 32 ) (function + 2
7c60: 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 ).#endif.#ifdef
7c70: 5f 5f 69 61 36 34 5f 5f 0a 20 20 2f 2a 20 66 75 __ia64__. /* fu
7c80: 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 nction:. *
7c90: 64 61 74 61 38 20 20 20 74 72 61 6d 70 5f 72 0a data8 tramp_r.
7ca0: 20 20 20 2a 20 20 20 20 64 61 74 61 38 20 20 20 * data8
7cb0: 63 6c 6f 73 75 72 65 0a 20 20 20 2a 20 63 6c 6f closure. * clo
7cc0: 73 75 72 65 3a 0a 20 20 20 2a 20 20 20 20 64 61 sure:. * da
7cd0: 74 61 38 20 20 20 3c 61 64 64 72 65 73 73 3e 0a ta8 <address>.
7ce0: 20 20 20 2a 20 20 20 20 64 61 74 61 38 20 20 20 * data8
7cf0: 3c 64 61 74 61 3e 0a 20 20 20 2a 2f 0a 20 20 2a <data>. */. *
7d00: 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 (long *) (functi
7d10: 6f 6e 20 2b 20 30 29 20 3d 20 28 6c 6f 6e 67 29 on + 0) = (long)
7d20: 20 26 74 72 61 6d 70 5f 72 3b 0a 20 20 2a 28 6c &tramp_r;. *(l
7d30: 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ong *) (function
7d40: 20 2b 20 38 29 20 3d 20 28 6c 6f 6e 67 29 20 28 + 8) = (long) (
7d50: 66 75 6e 63 74 69 6f 6e 20 2b 20 31 36 29 3b 0a function + 16);.
7d60: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e *(long *) (fun
7d70: 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20 28 6c 6f ction +16) = (lo
7d80: 6e 67 29 20 61 64 64 72 65 73 73 3b 0a 20 20 2a ng) address;. *
7d90: 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 (long *) (functi
7da0: 6f 6e 20 2b 32 34 29 20 3d 20 28 6c 6f 6e 67 29 on +24) = (long)
7db0: 20 64 61 74 61 3b 0a 23 64 65 66 69 6e 65 20 69 data;.#define i
7dc0: 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e s_tramp(function
7dd0: 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 ) \. ((long *)
7de0: 20 66 75 6e 63 74 69 6f 6e 29 5b 30 5d 20 3d 3d function)[0] ==
7df0: 20 28 6c 6f 6e 67 29 20 26 74 72 61 6d 70 5f 72 (long) &tramp_r
7e00: 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 61 .#define tramp_a
7e10: 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e 29 ddress(function)
7e20: 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 20 \. ((long *)
7e30: 66 75 6e 63 74 69 6f 6e 29 5b 32 5d 0a 23 64 65 function)[2].#de
7e40: 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 28 fine tramp_data(
7e50: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 function) \. (
7e60: 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f (long *) functio
7e70: 6e 29 5b 33 5d 0a 23 65 6e 64 69 66 0a 23 69 66 n)[3].#endif.#if
7e80: 64 65 66 20 5f 5f 78 38 36 5f 36 34 5f 5f 0a 20 def __x86_64__.
7e90: 20 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 /* function:.
7ea0: 20 2a 20 20 20 20 6d 6f 76 61 62 73 71 20 24 3c * movabsq $<
7eb0: 64 61 74 61 3e 2c 25 72 31 30 09 09 34 39 20 42 data>,%r10..49 B
7ec0: 41 20 3c 64 61 74 61 3e 0a 20 20 20 2a 20 20 20 A <data>. *
7ed0: 20 6d 6f 76 61 62 73 71 20 24 3c 61 64 64 72 65 movabsq $<addre
7ee0: 73 73 3e 2c 25 72 61 78 09 09 34 38 20 42 38 20 ss>,%rax..48 B8
7ef0: 3c 61 64 64 72 65 73 73 3e 0a 20 20 20 2a 20 20 <address>. *
7f00: 20 20 6a 6d 70 20 2a 25 72 61 78 09 09 09 46 46 jmp *%rax...FF
7f10: 20 45 30 0a 20 20 20 2a 2f 0a 20 20 2a 28 73 68 E0. */. *(sh
7f20: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ort *) (function
7f30: 20 2b 20 30 29 20 3d 20 30 78 42 41 34 39 3b 0a + 0) = 0xBA49;.
7f40: 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 *(short *) (fu
7f50: 6e 63 74 69 6f 6e 20 2b 20 32 29 20 3d 20 28 75 nction + 2) = (u
7f60: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 61 nsigned long) da
7f70: 74 61 20 26 20 30 78 66 66 66 66 3b 0a 20 20 2a ta & 0xffff;. *
7f80: 28 69 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74 (int *) (funct
7f90: 69 6f 6e 20 2b 20 34 29 20 3d 20 28 28 75 6e 73 ion + 4) = ((uns
7fa0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 61 74 61 igned long) data
7fb0: 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66 66 66 >> 16) & 0xffff
7fc0: 66 66 66 66 3b 0a 20 20 2a 28 73 68 6f 72 74 20 ffff;. *(short
7fd0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 *) (function + 8
7fe0: 29 20 3d 20 28 28 75 6e 73 69 67 6e 65 64 20 6c ) = ((unsigned l
7ff0: 6f 6e 67 29 20 64 61 74 61 20 3e 3e 20 34 38 29 ong) data >> 48)
8000: 20 26 20 30 78 66 66 66 66 3b 0a 20 20 2a 28 73 & 0xffff;. *(s
8010: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f hort *) (functio
8020: 6e 20 2b 31 30 29 20 3d 20 30 78 42 38 34 38 3b n +10) = 0xB848;
8030: 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 28 66 . *(int *) (f
8040: 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d 20 28 unction +12) = (
8050: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 61 unsigned long) a
8060: 64 64 72 65 73 73 20 26 20 30 78 66 66 66 66 66 ddress & 0xfffff
8070: 66 66 66 3b 0a 20 20 2a 28 69 6e 74 20 2a 29 20 fff;. *(int *)
8080: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 (function +16)
8090: 20 3d 20 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f = ((unsigned lo
80a0: 6e 67 29 20 61 64 64 72 65 73 73 20 3e 3e 20 33 ng) address >> 3
80b0: 32 29 20 26 20 30 78 66 66 66 66 66 66 66 66 3b 2) & 0xffffffff;
80c0: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 . *(short *) (f
80d0: 75 6e 63 74 69 6f 6e 20 2b 32 30 29 20 3d 20 30 unction +20) = 0
80e0: 78 45 30 46 46 3b 0a 23 64 65 66 69 6e 65 20 69 xE0FF;.#define i
80f0: 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e s_tramp(function
8100: 29 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 ) \. *(unsigne
8110: 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 d short *) (func
8120: 74 69 6f 6e 20 2b 20 30 29 20 3d 3d 20 30 78 42 tion + 0) == 0xB
8130: 41 34 39 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 A49 && \. *(uns
8140: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 igned short *) (
8150: 66 75 6e 63 74 69 6f 6e 20 2b 31 30 29 20 3d 3d function +10) ==
8160: 20 30 78 42 38 34 38 20 26 26 20 5c 0a 20 20 2a 0xB848 && \. *
8170: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 (unsigned short
8180: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 30 *) (function +20
8190: 29 20 3d 3d 20 30 78 45 30 46 46 0a 23 64 65 66 ) == 0xE0FF.#def
81a0: 69 6e 65 20 68 69 6c 6f 28 68 69 77 6f 72 64 2c ine hilo(hiword,
81b0: 6c 6f 77 6f 72 64 29 20 20 5c 0a 20 20 28 28 28 loword) \. (((
81c0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 unsigned long) (
81d0: 68 69 77 6f 72 64 29 20 3c 3c 20 33 32 29 20 7c hiword) << 32) |
81e0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
81f0: 20 28 6c 6f 77 6f 72 64 29 29 0a 23 64 65 66 69 (loword)).#defi
8200: 6e 65 20 68 69 6d 69 64 6c 6f 28 68 69 73 68 6f ne himidlo(hisho
8210: 72 74 2c 6d 69 64 77 6f 72 64 2c 6c 6f 73 68 6f rt,midword,losho
8220: 72 74 29 20 20 5c 0a 20 20 28 28 28 75 6e 73 69 rt) \. (((unsi
8230: 67 6e 65 64 20 6c 6f 6e 67 29 20 28 68 69 73 68 gned long) (hish
8240: 6f 72 74 29 20 3c 3c 20 34 38 29 20 7c 20 28 75 ort) << 48) | (u
8250: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 6d nsigned long) (m
8260: 69 64 77 6f 72 64 29 20 3c 3c 20 31 36 20 5c 0a idword) << 16 \.
8270: 20 20 20 7c 20 28 75 6e 73 69 67 6e 65 64 20 6c | (unsigned l
8280: 6f 6e 67 29 20 28 6c 6f 73 68 6f 72 74 29 29 0a ong) (loshort)).
8290: 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 #define tramp_ad
82a0: 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 dress(function)
82b0: 20 5c 0a 20 20 68 69 6c 6f 28 2a 28 75 6e 73 69 \. hilo(*(unsi
82c0: 67 6e 65 64 20 69 6e 74 20 2a 29 20 28 66 75 6e gned int *) (fun
82d0: 63 74 69 6f 6e 20 2b 31 36 29 2c 20 2a 28 75 6e ction +16), *(un
82e0: 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 28 66 signed int *) (f
82f0: 75 6e 63 74 69 6f 6e 20 2b 31 32 29 29 0a 23 64 unction +12)).#d
8300: 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 efine tramp_data
8310: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 (function) \.
8320: 68 69 6d 69 64 6c 6f 28 2a 28 75 6e 73 69 67 6e himidlo(*(unsign
8330: 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e ed short *) (fun
8340: 63 74 69 6f 6e 20 2b 20 38 29 2c 20 5c 0a 20 20 ction + 8), \.
8350: 20 20 20 20 20 20 20 20 2a 28 75 6e 73 69 67 6e *(unsign
8360: 65 64 20 69 6e 74 20 2a 29 20 20 20 28 66 75 6e ed int *) (fun
8370: 63 74 69 6f 6e 20 2b 20 34 29 2c 20 5c 0a 20 20 ction + 4), \.
8380: 20 20 20 20 20 20 20 20 2a 28 75 6e 73 69 67 6e *(unsign
8390: 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e ed short *) (fun
83a0: 63 74 69 6f 6e 20 2b 20 32 29 29 0a 23 65 6e 64 ction + 2)).#end
83b0: 69 66 0a 23 69 66 64 65 66 20 5f 5f 73 33 39 30 if.#ifdef __s390
83c0: 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e __. /* function
83d0: 3a 0a 0a 20 20 20 20 20 20 20 20 62 72 61 73 20 :.. bras
83e0: 20 20 20 25 72 31 2c 2e 4c 54 4e 30 5f 30 0a 2e %r1,.LTN0_0..
83f0: 4c 54 30 5f 30 3a 0a 2e 4c 43 30 3a 0a 20 20 20 LT0_0:..LC0:.
8400: 20 20 20 20 20 2e 6c 6f 6e 67 20 20 20 30 78 37 .long 0x7
8410: 33 35 35 34 37 31 31 0a 2e 4c 43 31 3a 0a 20 20 3554711..LC1:.
8420: 20 20 20 20 20 20 2e 6c 6f 6e 67 20 20 20 30 78 .long 0x
8430: 62 61 62 65 62 65 63 30 0a 2e 4c 54 4e 30 5f 30 babebec0..LTN0_0
8440: 3a 0a 20 20 20 20 20 20 20 20 6c 20 20 20 20 20 :. l
8450: 20 20 25 72 30 2c 2e 4c 43 30 2d 2e 4c 54 30 5f %r0,.LC0-.LT0_
8460: 30 28 25 72 31 29 0a 20 20 20 20 20 20 20 20 6c 0(%r1). l
8470: 20 20 20 20 20 20 20 25 72 31 2c 2e 4c 43 31 2d %r1,.LC1-
8480: 2e 4c 54 31 5f 30 28 25 72 31 29 0a 20 20 20 20 .LT1_0(%r1).
8490: 20 20 20 20 62 72 20 20 20 20 20 20 25 72 31 0a br %r1.
84a0: 20 20 2a 2f 0a 20 20 2f 2a 20 57 68 61 74 20 61 */. /* What a
84b0: 62 6f 75 74 20 62 69 67 20 65 6e 64 69 61 6e 20 bout big endian
84c0: 2f 20 6c 69 74 74 6c 65 20 65 6e 64 69 61 6e 20 / little endian
84d0: 3f 3f 20 2a 2f 0a 20 20 2a 28 75 6e 73 69 67 6e ?? */. *(unsign
84e0: 65 64 20 69 6e 74 20 2a 29 20 20 20 28 66 75 6e ed int *) (fun
84f0: 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20 30 78 41 ction + 0) = 0xA
8500: 37 31 35 30 30 30 36 3b 0a 20 20 2a 28 75 6e 73 7150006;. *(uns
8510: 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 20 20 28 igned int *) (
8520: 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 20 function + 4) =
8530: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 64 (unsigned int) d
8540: 61 74 61 3b 0a 20 20 2a 28 75 6e 73 69 67 6e 65 ata;. *(unsigne
8550: 64 20 69 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 d int *) (func
8560: 74 69 6f 6e 20 2b 20 38 29 20 3d 20 28 75 6e 73 tion + 8) = (uns
8570: 69 67 6e 65 64 20 69 6e 74 29 20 61 64 64 72 65 igned int) addre
8580: 73 73 3b 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 ss;. *(unsigned
8590: 20 69 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74 int *) (funct
85a0: 69 6f 6e 20 2b 31 32 29 20 3d 20 30 78 35 38 30 ion +12) = 0x580
85b0: 30 31 30 30 30 3b 0a 20 20 2a 28 75 6e 73 69 67 01000;. *(unsig
85c0: 6e 65 64 20 69 6e 74 20 2a 29 20 20 20 28 66 75 ned int *) (fu
85d0: 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20 30 78 nction +16) = 0x
85e0: 35 38 31 30 31 30 30 34 3b 0a 20 20 2a 28 75 6e 58101004;. *(un
85f0: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 signed short *)
8600: 28 66 75 6e 63 74 69 6f 6e 20 2b 32 30 29 20 3d (function +20) =
8610: 20 30 78 30 37 66 31 3b 0a 23 64 65 66 69 6e 65 0x07f1;.#define
8620: 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 is_tramp(functi
8630: 6f 6e 29 20 20 5c 0a 20 20 2a 28 69 6e 74 20 2a on) \. *(int *
8640: 29 20 20 20 20 20 20 20 20 20 20 20 20 28 66 75 ) (fu
8650: 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 3d 20 30 nction + 0) == 0
8660: 78 41 37 31 35 30 30 30 36 20 26 26 20 5c 0a 20 xA7150006 && \.
8670: 20 2a 28 69 6e 74 20 2a 29 20 20 20 20 20 20 20 *(int *)
8680: 20 20 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b (function +
8690: 31 32 29 20 3d 3d 20 30 78 35 38 30 30 31 30 30 12) == 0x5800100
86a0: 30 20 26 26 20 5c 0a 20 20 2a 28 69 6e 74 20 2a 0 && \. *(int *
86b0: 29 20 20 20 20 20 20 20 20 20 20 20 20 28 66 75 ) (fu
86c0: 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 3d 20 30 nction +16) == 0
86d0: 78 35 38 31 30 31 30 30 34 20 26 26 20 5c 0a 20 x58101004 && \.
86e0: 20 2a 28 73 68 6f 72 74 20 2a 29 20 20 20 20 20 *(short *)
86f0: 20 20 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b (function +
8700: 32 30 29 20 3d 3d 20 30 78 30 37 66 31 0a 23 64 20) == 0x07f1.#d
8710: 65 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 efine tramp_addr
8720: 65 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c ess(function) \
8730: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e . *(unsigned in
8740: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
8750: 38 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 8).#define tramp
8760: 5f 64 61 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 _data(function)
8770: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 \. *(unsigned
8780: 69 6e 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e int *) (function
8790: 20 2b 34 29 0a 23 65 6e 64 69 66 0a 20 20 2f 2a +4).#endif. /*
87a0: 0a 20 20 20 2a 20 64 61 74 61 3a 0a 20 20 20 2a . * data:. *
87b0: 20 20 20 20 3c 64 61 74 61 30 3e 09 09 09 09 3c <data0>....<
87c0: 64 61 74 61 30 3e 0a 20 20 20 2a 20 20 20 20 3c data0>. * <
87d0: 64 61 74 61 31 3e 09 09 09 09 3c 64 61 74 61 31 data1>....<data1
87e0: 3e 0a 20 20 20 2a 2f 0a 20 20 2a 28 6c 6f 6e 67 >. */. *(long
87f0: 20 2a 29 20 20 28 64 61 74 61 20 2b 20 30 2a 73 *) (data + 0*s
8800: 69 7a 65 6f 66 28 76 6f 69 64 2a 29 29 20 3d 20 izeof(void*)) =
8810: 28 6c 6f 6e 67 29 20 64 61 74 61 30 3b 0a 20 20 (long) data0;.
8820: 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 64 61 74 61 *(long *) (data
8830: 20 2b 20 31 2a 73 69 7a 65 6f 66 28 76 6f 69 64 + 1*sizeof(void
8840: 2a 29 29 20 3d 20 28 6c 6f 6e 67 29 20 64 61 74 *)) = (long) dat
8850: 61 31 3b 0a 0a 20 20 2f 2a 20 33 2e 20 53 65 74 a1;.. /* 3. Set
8860: 20 6d 65 6d 6f 72 79 20 70 72 6f 74 65 63 74 69 memory protecti
8870: 6f 6e 20 74 6f 20 22 65 78 65 63 75 74 61 62 6c on to "executabl
8880: 65 22 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 e" */..#if !defi
8890: 6e 65 64 28 43 4f 44 45 5f 45 58 45 43 55 54 41 ned(CODE_EXECUTA
88a0: 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 BLE) && defined(
88b0: 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41 5f 4d EXECUTABLE_VIA_M
88c0: 50 52 4f 54 45 43 54 29 0a 20 20 2f 2a 20 43 61 PROTECT). /* Ca
88d0: 6c 6c 20 6d 70 72 6f 74 65 63 74 20 6f 6e 20 74 ll mprotect on t
88e0: 68 65 20 70 61 67 65 73 20 74 68 61 74 20 63 6f he pages that co
88f0: 6e 74 61 69 6e 20 74 68 65 20 72 61 6e 67 65 2e ntain the range.
8900: 20 2a 2f 0a 20 20 7b 20 75 6e 73 69 67 6e 65 64 */. { unsigned
8910: 20 6c 6f 6e 67 20 73 74 61 72 74 5f 61 64 64 72 long start_addr
8920: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e = (unsigned lon
8930: 67 29 20 66 75 6e 63 74 69 6f 6e 3b 0a 20 20 20 g) function;.
8940: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 65 unsigned long e
8950: 6e 64 5f 61 64 64 72 20 3d 20 28 75 6e 73 69 67 nd_addr = (unsig
8960: 6e 65 64 20 6c 6f 6e 67 29 20 28 66 75 6e 63 74 ned long) (funct
8970: 69 6f 6e 20 2b 20 54 52 41 4d 50 5f 4c 45 4e 47 ion + TRAMP_LENG
8980: 54 48 29 3b 0a 20 20 20 20 73 74 61 72 74 5f 61 TH);. start_a
8990: 64 64 72 20 3d 20 73 74 61 72 74 5f 61 64 64 72 ddr = start_addr
89a0: 20 26 20 2d 70 61 67 65 73 69 7a 65 3b 0a 20 20 & -pagesize;.
89b0: 20 20 65 6e 64 5f 61 64 64 72 20 3d 20 28 65 6e end_addr = (en
89c0: 64 5f 61 64 64 72 20 2b 20 70 61 67 65 73 69 7a d_addr + pagesiz
89d0: 65 2d 31 29 20 26 20 2d 70 61 67 65 73 69 7a 65 e-1) & -pagesize
89e0: 3b 0a 20 20 20 7b 75 6e 73 69 67 6e 65 64 20 6c ;. {unsigned l
89f0: 6f 6e 67 20 6c 65 6e 20 3d 20 65 6e 64 5f 61 64 ong len = end_ad
8a00: 64 72 20 2d 20 73 74 61 72 74 5f 61 64 64 72 3b dr - start_addr;
8a10: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 .#if defined(HAV
8a20: 45 5f 4d 41 43 48 5f 56 4d 29 0a 20 20 20 20 69 E_MACH_VM). i
8a30: 66 20 28 76 6d 5f 70 72 6f 74 65 63 74 28 74 61 f (vm_protect(ta
8a40: 73 6b 5f 73 65 6c 66 28 29 2c 73 74 61 72 74 5f sk_self(),start_
8a50: 61 64 64 72 2c 6c 65 6e 2c 30 2c 56 4d 5f 50 52 addr,len,0,VM_PR
8a60: 4f 54 5f 52 45 41 44 7c 56 4d 5f 50 52 4f 54 5f OT_READ|VM_PROT_
8a70: 57 52 49 54 45 7c 56 4d 5f 50 52 4f 54 5f 45 58 WRITE|VM_PROT_EX
8a80: 45 43 55 54 45 29 20 21 3d 20 4b 45 52 4e 5f 53 ECUTE) != KERN_S
8a90: 55 43 43 45 53 53 29 0a 23 65 6c 73 65 0a 23 69 UCCESS).#else.#i
8aa0: 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 6f 6e 76 f defined(__conv
8ab0: 65 78 5f 5f 29 0a 20 20 20 20 2f 2a 20 43 6f 6e ex__). /* Con
8ac0: 76 65 78 20 4f 53 20 63 61 6c 6c 73 20 69 74 20 vex OS calls it
8ad0: 60 6d 72 65 6d 61 70 28 29 27 2e 20 2a 2f 0a 20 `mremap()'. */.
8ae0: 20 20 20 6d 72 65 6d 61 70 28 73 74 61 72 74 5f mremap(start_
8af0: 61 64 64 72 2c 20 26 6c 65 6e 2c 20 50 52 4f 54 addr, &len, PROT
8b00: 5f 52 45 41 44 7c 50 52 4f 54 5f 57 52 49 54 45 _READ|PROT_WRITE
8b10: 7c 50 52 4f 54 5f 45 58 45 43 2c 20 4d 41 50 5f |PROT_EXEC, MAP_
8b20: 50 52 49 56 41 54 45 29 3b 0a 20 20 20 20 69 66 PRIVATE);. if
8b30: 20 28 30 29 0a 23 65 6c 73 65 0a 23 69 66 20 64 (0).#else.#if d
8b40: 65 66 69 6e 65 64 28 48 41 56 45 5f 53 59 53 5f efined(HAVE_SYS_
8b50: 4d 38 38 4b 42 43 53 5f 48 29 0a 20 20 20 20 69 M88KBCS_H). i
8b60: 66 20 28 6d 65 6d 63 74 6c 28 73 74 61 72 74 5f f (memctl(start_
8b70: 61 64 64 72 2c 20 6c 65 6e 2c 20 4d 43 54 5f 54 addr, len, MCT_T
8b80: 45 58 54 29 20 3d 3d 20 2d 31 29 0a 23 65 6c 73 EXT) == -1).#els
8b90: 65 0a 20 20 20 20 69 66 20 28 6d 70 72 6f 74 65 e. if (mprote
8ba0: 63 74 28 28 76 6f 69 64 2a 29 73 74 61 72 74 5f ct((void*)start_
8bb0: 61 64 64 72 2c 20 6c 65 6e 2c 20 50 52 4f 54 5f addr, len, PROT_
8bc0: 52 45 41 44 7c 50 52 4f 54 5f 57 52 49 54 45 7c READ|PROT_WRITE|
8bd0: 50 52 4f 54 5f 45 58 45 43 29 20 3c 20 30 29 0a PROT_EXEC) < 0).
8be0: 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 65 #endif.#endif.#e
8bf0: 6e 64 69 66 0a 20 20 20 20 20 20 7b 20 66 70 72 ndif. { fpr
8c00: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 74 72 61 intf(stderr,"tra
8c10: 6d 70 6f 6c 69 6e 65 3a 20 63 61 6e 6e 6f 74 20 mpoline: cannot
8c20: 6d 61 6b 65 20 6d 65 6d 6f 72 79 20 65 78 65 63 make memory exec
8c30: 75 74 61 62 6c 65 5c 6e 22 29 3b 20 61 62 6f 72 utable\n"); abor
8c40: 74 28 29 3b 20 7d 0a 20 20 7d 7d 0a 23 65 6e 64 t(); }. }}.#end
8c50: 69 66 0a 0a 20 20 2f 2a 20 34 2e 20 46 6c 75 73 if.. /* 4. Flus
8c60: 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 61 h instruction ca
8c70: 63 68 65 20 2a 2f 0a 20 20 2f 2a 20 57 65 20 6e che */. /* We n
8c80: 65 65 64 20 74 68 69 73 20 62 65 63 61 75 73 65 eed this because
8c90: 20 73 6f 6d 65 20 43 50 55 73 20 68 61 76 65 20 some CPUs have
8ca0: 73 65 70 61 72 61 74 65 20 64 61 74 61 20 63 61 separate data ca
8cb0: 63 68 65 20 61 6e 64 20 69 6e 73 74 72 75 63 74 che and instruct
8cc0: 69 6f 6e 0a 20 20 20 2a 20 63 61 63 68 65 2e 20 ion. * cache.
8cd0: 54 68 65 20 66 72 65 73 68 6c 79 20 62 75 69 6c The freshly buil
8ce0: 74 20 74 72 61 6d 70 6f 6c 69 6e 65 20 69 73 20 t trampoline is
8cf0: 76 69 73 69 62 6c 65 20 74 6f 20 74 68 65 20 64 visible to the d
8d00: 61 74 61 20 63 61 63 68 65 2c 20 62 75 74 20 6e ata cache, but n
8d10: 6f 74 0a 20 20 20 2a 20 6d 61 79 62 65 20 6e 6f ot. * maybe no
8d20: 74 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75 63 t to the instruc
8d30: 74 69 6f 6e 20 63 61 63 68 65 2e 20 54 68 69 73 tion cache. This
8d40: 20 69 73 20 68 61 69 72 79 2e 0a 20 20 20 2a 2f is hairy.. */
8d50: 0a 23 69 66 20 21 28 64 65 66 69 6e 65 64 28 5f .#if !(defined(_
8d60: 5f 68 70 70 61 6e 65 77 5f 5f 29 20 7c 7c 20 64 _hppanew__) || d
8d70: 65 66 69 6e 65 64 28 5f 5f 72 73 36 30 30 30 61 efined(__rs6000a
8d80: 69 78 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 ix__) || defined
8d90: 28 5f 5f 69 61 36 34 5f 5f 29 29 0a 20 20 2f 2a (__ia64__)). /*
8da0: 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 69 66 20 Only needed if
8db0: 77 65 20 72 65 61 6c 6c 79 20 73 65 74 20 75 70 we really set up
8dc0: 20 6d 61 63 68 69 6e 65 20 69 6e 73 74 72 75 63 machine instruc
8dd0: 74 69 6f 6e 73 2e 20 2a 2f 0a 23 69 66 64 65 66 tions. */.#ifdef
8de0: 20 5f 5f 69 33 38 36 5f 5f 0a 23 69 66 20 64 65 __i386__.#if de
8df0: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a 20 20 fined(_WIN32).
8e00: 77 68 69 6c 65 20 28 21 46 6c 75 73 68 49 6e 73 while (!FlushIns
8e10: 74 72 75 63 74 69 6f 6e 43 61 63 68 65 28 47 65 tructionCache(Ge
8e20: 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 28 tCurrentProcess(
8e30: 29 2c 66 75 6e 63 74 69 6f 6e 2c 54 52 41 4d 50 ),function,TRAMP
8e40: 5f 4c 45 4e 47 54 48 29 29 0a 20 20 20 20 63 6f _LENGTH)). co
8e50: 6e 74 69 6e 75 65 3b 0a 23 65 6e 64 69 66 0a 23 ntinue;.#endif.#
8e60: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d endif.#ifdef __m
8e70: 36 38 6b 5f 5f 0a 23 69 66 20 64 65 66 69 6e 65 68k__.#if define
8e80: 64 28 4e 65 58 54 29 20 26 26 20 64 65 66 69 6e d(NeXT) && defin
8e90: 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a 20 20 5f ed(__GNUC__). _
8ea0: 5f 61 73 6d 5f 5f 20 5f 5f 76 6f 6c 61 74 69 6c _asm__ __volatil
8eb0: 65 5f 5f 20 28 22 74 72 61 70 20 23 32 22 29 3b e__ ("trap #2");
8ec0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
8ed0: 6e 65 64 28 41 4d 49 47 41 29 0a 20 20 43 61 63 ned(AMIGA). Cac
8ee0: 68 65 43 6c 65 61 72 45 28 66 75 6e 63 74 69 6f heClearE(functio
8ef0: 6e 2c 54 52 41 4d 50 5f 4c 45 4e 47 54 48 2c 43 n,TRAMP_LENGTH,C
8f00: 41 43 52 46 5f 43 6c 65 61 72 49 7c 43 41 43 52 ACRF_ClearI|CACR
8f10: 46 5f 43 6c 65 61 72 44 29 3b 0a 23 65 6e 64 69 F_ClearD);.#endi
8f20: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 61 70 f.#if defined(ap
8f30: 6f 6c 6c 6f 29 0a 20 20 63 61 63 68 65 5f 24 63 ollo). cache_$c
8f40: 6c 65 61 72 28 29 3b 0a 23 65 6e 64 69 66 0a 23 lear();.#endif.#
8f50: 69 66 20 64 65 66 69 6e 65 64 28 68 70 75 78 29 if defined(hpux)
8f60: 0a 20 20 63 61 63 68 65 63 74 6c 28 43 43 5f 49 . cachectl(CC_I
8f70: 50 55 52 47 45 2c 66 75 6e 63 74 69 6f 6e 2c 54 PURGE,function,T
8f80: 52 41 4d 50 5f 4c 45 4e 47 54 48 29 3b 0a 23 65 RAMP_LENGTH);.#e
8f90: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
8fa0: 28 5f 5f 4e 65 74 42 53 44 5f 5f 29 20 26 26 20 (__NetBSD__) &&
8fb0: 64 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f defined(__GNUC__
8fc0: 29 0a 20 20 7b 20 72 65 67 69 73 74 65 72 20 75 ). { register u
8fd0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 5f 62 65 nsigned long _be
8fe0: 67 20 5f 5f 61 73 6d 5f 5f 20 28 22 25 61 31 22 g __asm__ ("%a1"
8ff0: 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f ) = (unsigned lo
9000: 6e 67 29 20 66 75 6e 63 74 69 6f 6e 3b 0a 20 20 ng) function;.
9010: 20 20 72 65 67 69 73 74 65 72 20 75 6e 73 69 67 register unsig
9020: 6e 65 64 20 6c 6f 6e 67 20 5f 6c 65 6e 20 5f 5f ned long _len __
9030: 61 73 6d 5f 5f 20 28 22 25 64 31 22 29 20 3d 20 asm__ ("%d1") =
9040: 54 52 41 4d 50 5f 4c 45 4e 47 54 48 3b 0a 20 20 TRAMP_LENGTH;.
9050: 20 20 5f 5f 61 73 6d 5f 5f 20 5f 5f 76 6f 6c 61 __asm__ __vola
9060: 74 69 6c 65 5f 5f 20 28 0a 20 20 20 20 20 20 22 tile__ (. "
9070: 6d 6f 76 65 25 2e 6c 20 25 23 30 78 38 30 30 30 move%.l %#0x8000
9080: 30 30 30 34 2c 25 2f 64 30 5c 6e 5c 74 22 20 2f 0004,%/d0\n\t" /
9090: 2a 20 43 43 5f 45 58 54 50 55 52 47 45 20 7c 20 * CC_EXTPURGE |
90a0: 43 5f 49 50 55 52 47 45 20 2a 2f 0a 20 20 20 20 C_IPURGE */.
90b0: 20 20 22 74 72 61 70 20 23 31 32 22 20 20 20 20 "trap #12"
90c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
90d0: 20 20 2f 2a 20 6b 65 72 6e 65 6c 20 63 61 6c 6c /* kernel call
90e0: 20 60 63 61 63 68 65 63 74 6c 27 20 2a 2f 0a 20 `cachectl' */.
90f0: 20 20 20 20 20 3a 0a 20 20 20 20 20 20 3a 20 22 :. : "
9100: 61 22 20 28 5f 62 65 67 29 2c 20 22 64 22 20 28 a" (_beg), "d" (
9110: 5f 6c 65 6e 29 0a 20 20 20 20 20 20 3a 20 22 25 _len). : "%
9120: 61 30 22 2c 20 22 25 61 31 22 2c 20 22 25 64 30 a0", "%a1", "%d0
9130: 22 2c 20 22 25 64 31 22 20 20 20 20 2f 2a 20 63 ", "%d1" /* c
9140: 61 6c 6c 2d 75 73 65 64 20 72 65 67 69 73 74 65 all-used registe
9150: 72 73 20 2a 2f 0a 20 20 20 20 20 20 29 3b 0a 20 rs */. );.
9160: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 }.#endif.#if de
9170: 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 fined(__linux__)
9180: 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e && defined(__GN
9190: 55 43 5f 5f 29 0a 20 20 7b 20 72 65 67 69 73 74 UC__). { regist
91a0: 65 72 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 er unsigned long
91b0: 20 5f 62 65 67 20 5f 5f 61 73 6d 5f 5f 20 28 22 _beg __asm__ ("
91c0: 25 64 31 22 29 20 3d 20 28 75 6e 73 69 67 6e 65 %d1") = (unsigne
91d0: 64 20 6c 6f 6e 67 29 20 66 75 6e 63 74 69 6f 6e d long) function
91e0: 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 75 ;. register u
91f0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 5f 6c 65 nsigned long _le
9200: 6e 20 5f 5f 61 73 6d 5f 5f 20 28 22 25 64 34 22 n __asm__ ("%d4"
9210: 29 20 3d 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 ) = TRAMP_LENGTH
9220: 20 2b 20 33 32 3b 0a 20 20 20 20 5f 5f 61 73 6d + 32;. __asm
9230: 5f 5f 20 5f 5f 76 6f 6c 61 74 69 6c 65 5f 5f 20 __ __volatile__
9240: 28 0a 20 20 20 20 20 20 22 6d 6f 76 65 25 2e 6c (. "move%.l
9250: 20 25 23 31 32 33 2c 25 2f 64 30 5c 6e 5c 74 22 %#123,%/d0\n\t"
9260: 0a 20 20 20 20 20 20 22 6d 6f 76 65 25 2e 6c 20 . "move%.l
9270: 25 23 31 2c 25 2f 64 32 5c 6e 5c 74 22 0a 20 20 %#1,%/d2\n\t".
9280: 20 20 20 20 22 6d 6f 76 65 25 2e 6c 20 25 23 33 "move%.l %#3
9290: 2c 25 2f 64 33 5c 6e 5c 74 22 0a 20 20 20 20 20 ,%/d3\n\t".
92a0: 20 22 74 72 61 70 20 25 23 30 22 0a 20 20 20 20 "trap %#0".
92b0: 20 20 3a 0a 20 20 20 20 20 20 3a 20 22 64 22 20 :. : "d"
92c0: 28 5f 62 65 67 29 2c 20 22 64 22 20 28 5f 6c 65 (_beg), "d" (_le
92d0: 6e 29 0a 20 20 20 20 20 20 3a 20 22 25 64 30 22 n). : "%d0"
92e0: 2c 20 22 25 64 32 22 2c 20 22 25 64 33 22 0a 20 , "%d2", "%d3".
92f0: 20 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 );. }.#end
9300: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 41 if.#if defined(A
9310: 55 58 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f UX) && defined(_
9320: 5f 47 4e 55 43 5f 5f 29 0a 20 20 2f 2a 20 73 79 _GNUC__). /* sy
9330: 73 6d 36 38 6b 28 31 30 35 2c 20 61 64 64 72 2c sm68k(105, addr,
9340: 20 73 63 6f 70 65 2c 20 63 61 63 68 65 2c 20 6c scope, cache, l
9350: 65 6e 29 20 2a 2f 0a 20 20 5f 5f 61 73 6d 5f 5f en) */. __asm__
9360: 20 5f 5f 76 6f 6c 61 74 69 6c 65 5f 5f 20 28 0a __volatile__ (.
9370: 20 20 20 20 22 6d 6f 76 65 25 2e 6c 20 25 31 2c "move%.l %1,
9380: 25 2f 73 70 40 2d 5c 6e 5c 74 22 0a 20 20 20 20 %/sp@-\n\t".
9390: 22 6d 6f 76 65 25 2e 6c 20 25 23 33 2c 25 2f 73 "move%.l %#3,%/s
93a0: 70 40 2d 5c 6e 5c 74 22 0a 20 20 20 20 22 6d 6f p@-\n\t". "mo
93b0: 76 65 25 2e 6c 20 25 23 31 2c 25 2f 73 70 40 2d ve%.l %#1,%/sp@-
93c0: 5c 6e 5c 74 22 0a 20 20 20 20 22 6d 6f 76 65 25 \n\t". "move%
93d0: 2e 6c 20 25 30 2c 25 2f 73 70 40 2d 5c 6e 5c 74 .l %0,%/sp@-\n\t
93e0: 22 0a 20 20 20 20 22 6d 6f 76 65 25 2e 6c 20 25 ". "move%.l %
93f0: 23 31 30 35 2c 25 2f 73 70 40 2d 5c 6e 5c 74 22 #105,%/sp@-\n\t"
9400: 0a 20 20 20 20 22 6d 6f 76 65 25 2e 6c 20 25 23 . "move%.l %#
9410: 30 2c 25 2f 73 70 40 2d 5c 6e 5c 74 22 0a 20 20 0,%/sp@-\n\t".
9420: 20 20 22 6d 6f 76 65 25 2e 6c 20 25 23 33 38 2c "move%.l %#38,
9430: 25 2f 73 70 40 2d 5c 6e 5c 74 22 0a 20 20 20 20 %/sp@-\n\t".
9440: 22 74 72 61 70 20 25 23 30 5c 6e 5c 74 22 0a 20 "trap %#0\n\t".
9450: 20 20 20 22 61 64 64 25 2e 6c 20 25 23 32 34 2c "add%.l %#24,
9460: 25 2f 73 70 22 0a 20 20 20 20 3a 0a 20 20 20 20 %/sp". :.
9470: 3a 20 22 72 22 20 28 66 75 6e 63 74 69 6f 6e 29 : "r" (function)
9480: 2c 20 22 67 22 20 28 28 69 6e 74 29 54 52 41 4d , "g" ((int)TRAM
9490: 50 5f 4c 45 4e 47 54 48 29 0a 20 20 20 20 3a 20 P_LENGTH). :
94a0: 22 25 64 30 22 0a 20 20 20 20 29 3b 0a 23 65 6e "%d0". );.#en
94b0: 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 dif.#endif.#if d
94c0: 65 66 69 6e 65 64 28 5f 5f 6d 69 70 73 5f 5f 29 efined(__mips__)
94d0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 6d 69 || defined(__mi
94e0: 70 73 6e 33 32 5f 5f 29 20 7c 7c 20 64 65 66 69 psn32__) || defi
94f0: 6e 65 64 28 5f 5f 6d 69 70 73 36 34 5f 5f 29 0a ned(__mips64__).
9500: 20 20 63 61 63 68 65 66 6c 75 73 68 28 66 75 6e cacheflush(fun
9510: 63 74 69 6f 6e 2c 54 52 41 4d 50 5f 4c 45 4e 47 ction,TRAMP_LENG
9520: 54 48 2c 49 43 41 43 48 45 29 3b 0a 20 20 2f 2a TH,ICACHE);. /*
9530: 20 67 66 6f 72 74 68 2d 30 2e 33 2e 30 20 75 73 gforth-0.3.0 us
9540: 65 73 20 42 43 41 43 48 45 20 69 6e 73 74 65 61 es BCACHE instea
9550: 64 20 6f 66 20 49 43 41 43 48 45 2e 20 57 68 79 d of ICACHE. Why
9560: 3f 3f 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 ?? */.#endif.#if
9570: 20 64 65 66 69 6e 65 64 28 5f 5f 73 70 61 72 63 defined(__sparc
9580: 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f __) || defined(_
9590: 5f 73 70 61 72 63 36 34 5f 5f 29 0a 20 20 2f 2a _sparc64__). /*
95a0: 20 54 68 69 73 20 61 73 73 75 6d 65 73 20 74 68 This assumes th
95b0: 61 74 20 74 68 65 20 74 72 61 6d 70 6f 6c 69 6e at the trampolin
95c0: 65 20 66 69 74 73 20 69 6e 20 61 74 20 6d 6f 73 e fits in at mos
95d0: 74 20 74 77 6f 20 63 61 63 68 65 20 6c 69 6e 65 t two cache line
95e0: 73 2e 20 2a 2f 0a 20 20 5f 5f 54 52 5f 63 6c 65 s. */. __TR_cle
95f0: 61 72 5f 63 61 63 68 65 5f 32 28 66 75 6e 63 74 ar_cache_2(funct
9600: 69 6f 6e 2c 66 75 6e 63 74 69 6f 6e 2b 54 52 41 ion,function+TRA
9610: 4d 50 5f 4c 45 4e 47 54 48 2d 31 29 3b 0a 23 65 MP_LENGTH-1);.#e
9620: 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 61 6c ndif.#ifdef __al
9630: 70 68 61 5f 5f 0a 20 20 5f 5f 54 52 5f 63 6c 65 pha__. __TR_cle
9640: 61 72 5f 63 61 63 68 65 28 29 3b 0a 23 65 6e 64 ar_cache();.#end
9650: 69 66 0a 23 69 66 64 65 66 20 5f 5f 68 70 70 61 if.#ifdef __hppa
9660: 5f 5f 0a 20 20 2f 2a 20 54 68 69 73 20 61 73 73 __. /* This ass
9670: 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 74 72 umes that the tr
9680: 61 6d 70 6f 6c 69 6e 65 20 66 69 74 73 20 69 6e ampoline fits in
9690: 20 61 74 20 6d 6f 73 74 20 74 77 6f 20 63 61 63 at most two cac
96a0: 68 65 20 6c 69 6e 65 73 2e 20 2a 2f 0a 20 20 5f he lines. */. _
96b0: 5f 54 52 5f 63 6c 65 61 72 5f 63 61 63 68 65 28 _TR_clear_cache(
96c0: 66 75 6e 63 74 69 6f 6e 2c 66 75 6e 63 74 69 6f function,functio
96d0: 6e 2b 54 52 41 4d 50 5f 4c 45 4e 47 54 48 2d 31 n+TRAMP_LENGTH-1
96e0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 );.#endif.#ifdef
96f0: 20 5f 5f 61 72 6d 5f 5f 0a 20 20 2f 2a 20 54 68 __arm__. /* Th
9700: 69 73 20 43 50 55 20 64 6f 65 73 20 6e 6f 74 20 is CPU does not
9710: 68 61 76 65 20 61 20 73 65 70 61 72 61 74 65 20 have a separate
9720: 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 61 63 68 instruction cach
9730: 65 2e 20 28 49 20 74 68 69 6e 6b 2e 29 20 2a 2f e. (I think.) */
9740: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f .#endif.#ifdef _
9750: 5f 72 73 36 30 30 30 5f 5f 0a 20 20 5f 5f 54 52 _rs6000__. __TR
9760: 5f 63 6c 65 61 72 5f 63 61 63 68 65 28 66 75 6e _clear_cache(fun
9770: 63 74 69 6f 6e 29 3b 0a 23 65 6e 64 69 66 0a 23 ction);.#endif.#
9780: 69 66 64 65 66 20 5f 5f 6d 38 38 6b 5f 5f 0a 20 ifdef __m88k__.
9790: 20 73 79 73 6d 6f 74 28 53 38 38 43 41 43 48 45 sysmot(S88CACHE
97a0: 46 4c 55 53 48 50 41 47 45 2c 20 28 75 6e 73 69 FLUSHPAGE, (unsi
97b0: 67 6e 65 64 20 6c 6f 6e 67 29 66 75 6e 63 74 69 gned long)functi
97c0: 6f 6e 20 26 20 2d 70 61 67 65 73 69 7a 65 29 3b on & -pagesize);
97d0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f .#endif.#ifdef _
97e0: 5f 63 6f 6e 76 65 78 5f 5f 0a 20 20 5f 5f 54 52 _convex__. __TR
97f0: 5f 63 6c 65 61 72 5f 63 61 63 68 65 28 29 3b 0a _clear_cache();.
9800: 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 #endif.#endif..
9810: 20 2f 2a 20 35 2e 20 52 65 74 75 72 6e 2e 20 2a /* 5. Return. *
9820: 2f 0a 20 20 72 65 74 75 72 6e 20 28 5f 5f 54 52 /. return (__TR
9830: 5f 66 75 6e 63 74 69 6f 6e 29 20 28 66 75 6e 63 _function) (func
9840: 74 69 6f 6e 20 2b 20 54 52 41 4d 50 5f 42 49 41 tion + TRAMP_BIA
9850: 53 29 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e S);.}..#if defin
9860: 65 64 28 5f 5f 53 54 44 43 5f 5f 29 20 7c 7c 20 ed(__STDC__) ||
9870: 64 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f defined(__GNUC__
9880: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 63 ) || defined(__c
9890: 70 6c 75 73 70 6c 75 73 29 0a 76 6f 69 64 20 66 plusplus).void f
98a0: 72 65 65 5f 74 72 61 6d 70 6f 6c 69 6e 65 5f 72 ree_trampoline_r
98b0: 20 28 5f 5f 54 52 5f 66 75 6e 63 74 69 6f 6e 20 (__TR_function
98c0: 66 75 6e 63 74 69 6f 6e 29 0a 23 65 6c 73 65 0a function).#else.
98d0: 76 6f 69 64 20 66 72 65 65 5f 74 72 61 6d 70 6f void free_trampo
98e0: 6c 69 6e 65 5f 72 20 28 66 75 6e 63 74 69 6f 6e line_r (function
98f0: 29 0a 20 20 5f 5f 54 52 5f 66 75 6e 63 74 69 6f ). __TR_functio
9900: 6e 20 66 75 6e 63 74 69 6f 6e 3b 0a 23 65 6e 64 n function;.#end
9910: 69 66 0a 7b 0a 23 69 66 20 54 52 41 4d 50 5f 42 if.{.#if TRAMP_B
9920: 49 41 53 0a 20 20 66 75 6e 63 74 69 6f 6e 20 3d IAS. function =
9930: 20 28 5f 5f 54 52 5f 66 75 6e 63 74 69 6f 6e 29 (__TR_function)
9940: 28 28 63 68 61 72 2a 29 66 75 6e 63 74 69 6f 6e ((char*)function
9950: 20 2d 20 54 52 41 4d 50 5f 42 49 41 53 29 3b 0a - TRAMP_BIAS);.
9960: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 #endif.#if !defi
9970: 6e 65 64 28 43 4f 44 45 5f 45 58 45 43 55 54 41 ned(CODE_EXECUTA
9980: 42 4c 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 BLE) && !defined
9990: 28 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41 5f (EXECUTABLE_VIA_
99a0: 4d 50 52 4f 54 45 43 54 29 0a 20 20 2a 28 63 68 MPROTECT). *(ch
99b0: 61 72 2a 2a 29 66 75 6e 63 74 69 6f 6e 20 3d 20 ar**)function =
99c0: 66 72 65 65 6c 69 73 74 3b 20 66 72 65 65 6c 69 freelist; freeli
99d0: 73 74 20 3d 20 28 63 68 61 72 2a 29 66 75 6e 63 st = (char*)func
99e0: 74 69 6f 6e 3b 0a 20 20 2f 2a 20 49 74 20 69 73 tion;. /* It is
99f0: 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 77 6f probably not wo
9a00: 72 74 68 20 63 61 6c 6c 69 6e 67 20 6d 75 6e 6d rth calling munm
9a10: 61 70 28 29 20 66 6f 72 20 65 6e 74 69 72 65 6c ap() for entirel
9a20: 79 20 66 72 65 65 64 20 70 61 67 65 73 2e 20 2a y freed pages. *
9a30: 2f 0a 23 65 6c 73 65 0a 20 20 66 72 65 65 28 28 /.#else. free((
9a40: 28 63 68 61 72 2a 2a 29 66 75 6e 63 74 69 6f 6e (char**)function
9a50: 29 5b 2d 31 5d 29 3b 0a 23 65 6e 64 69 66 0a 7d )[-1]);.#endif.}
9a60: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f ..#if defined(__
9a70: 53 54 44 43 5f 5f 29 20 7c 7c 20 64 65 66 69 6e STDC__) || defin
9a80: 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 20 7c 7c 20 ed(__GNUC__) ||
9a90: 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75 73 70 defined(__cplusp
9aa0: 6c 75 73 29 0a 69 6e 74 20 69 73 5f 74 72 61 6d lus).int is_tram
9ab0: 70 6f 6c 69 6e 65 5f 72 20 28 76 6f 69 64 2a 20 poline_r (void*
9ac0: 66 75 6e 63 74 69 6f 6e 29 0a 23 65 6c 73 65 0a function).#else.
9ad0: 69 6e 74 20 69 73 5f 74 72 61 6d 70 6f 6c 69 6e int is_trampolin
9ae0: 65 5f 72 20 28 66 75 6e 63 74 69 6f 6e 29 0a 20 e_r (function).
9af0: 20 76 6f 69 64 2a 20 66 75 6e 63 74 69 6f 6e 3b void* function;
9b00: 0a 23 65 6e 64 69 66 0a 7b 0a 23 69 66 20 64 65 .#endif.{.#if de
9b10: 66 69 6e 65 64 28 69 73 5f 74 72 61 6d 70 29 20 fined(is_tramp)
9b20: 26 26 20 64 65 66 69 6e 65 64 28 74 72 61 6d 70 && defined(tramp
9b30: 5f 64 61 74 61 29 0a 23 69 66 64 65 66 20 5f 5f _data).#ifdef __
9b40: 68 70 70 61 6e 65 77 5f 5f 0a 20 20 76 6f 69 64 hppanew__. void
9b50: 2a 20 74 72 61 6d 70 5f 72 5f 61 64 64 72 65 73 * tramp_r_addres
9b60: 73 20 3d 20 26 74 72 61 6d 70 5f 72 3b 0a 20 20 s = &tramp_r;.
9b70: 69 66 20 28 21 28 28 28 6c 6f 6e 67 29 66 75 6e if (!(((long)fun
9b80: 63 74 69 6f 6e 20 26 20 33 29 20 3d 3d 20 28 54 ction & 3) == (T
9b90: 52 41 4d 50 5f 42 49 41 53 20 26 20 33 29 29 29 RAMP_BIAS & 3)))
9ba0: 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 return 0;.#endi
9bb0: 66 0a 20 20 72 65 74 75 72 6e 0a 20 20 20 28 28 f. return. ((
9bc0: 69 73 5f 74 72 61 6d 70 28 28 28 63 68 61 72 2a is_tramp(((char*
9bd0: 29 66 75 6e 63 74 69 6f 6e 20 2d 20 54 52 41 4d )function - TRAM
9be0: 50 5f 42 49 41 53 29 29 29 0a 20 20 20 20 26 26 P_BIAS))). &&
9bf0: 20 28 28 74 72 61 6d 70 5f 64 61 74 61 28 28 28 ((tramp_data(((
9c00: 63 68 61 72 2a 29 66 75 6e 63 74 69 6f 6e 20 2d char*)function -
9c10: 20 54 52 41 4d 50 5f 42 49 41 53 29 29 29 20 3d TRAMP_BIAS))) =
9c20: 3d 20 28 6c 6f 6e 67 29 28 28 63 68 61 72 2a 29 = (long)((char*)
9c30: 66 75 6e 63 74 69 6f 6e 20 2d 20 54 52 41 4d 50 function - TRAMP
9c40: 5f 42 49 41 53 20 2b 20 54 52 41 4d 50 5f 4c 45 _BIAS + TRAMP_LE
9c50: 4e 47 54 48 29 29 0a 20 20 20 20 3f 20 31 20 3a NGTH)). ? 1 :
9c60: 20 30 0a 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 0. );.#else.
9c70: 20 61 62 6f 72 74 28 29 3b 0a 23 65 6e 64 69 66 abort();.#endif
9c80: 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 .}..#if defined(
9c90: 5f 5f 53 54 44 43 5f 5f 29 20 7c 7c 20 64 65 66 __STDC__) || def
9ca0: 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 20 7c ined(__GNUC__) |
9cb0: 7c 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75 | defined(__cplu
9cc0: 73 70 6c 75 73 29 0a 5f 5f 54 52 5f 66 75 6e 63 splus).__TR_func
9cd0: 74 69 6f 6e 20 74 72 61 6d 70 6f 6c 69 6e 65 5f tion trampoline_
9ce0: 72 5f 61 64 64 72 65 73 73 20 28 76 6f 69 64 2a r_address (void*
9cf0: 20 66 75 6e 63 74 69 6f 6e 29 0a 23 65 6c 73 65 function).#else
9d00: 0a 5f 5f 54 52 5f 66 75 6e 63 74 69 6f 6e 20 74 .__TR_function t
9d10: 72 61 6d 70 6f 6c 69 6e 65 5f 72 5f 61 64 64 72 rampoline_r_addr
9d20: 65 73 73 20 28 66 75 6e 63 74 69 6f 6e 29 0a 20 ess (function).
9d30: 20 76 6f 69 64 2a 20 66 75 6e 63 74 69 6f 6e 3b void* function;
9d40: 0a 23 65 6e 64 69 66 0a 7b 0a 23 69 66 64 65 66 .#endif.{.#ifdef
9d50: 20 74 72 61 6d 70 5f 61 64 64 72 65 73 73 0a 20 tramp_address.
9d60: 20 72 65 74 75 72 6e 20 28 5f 5f 54 52 5f 66 75 return (__TR_fu
9d70: 6e 63 74 69 6f 6e 29 28 74 72 61 6d 70 5f 61 64 nction)(tramp_ad
9d80: 64 72 65 73 73 28 28 28 63 68 61 72 2a 29 66 75 dress(((char*)fu
9d90: 6e 63 74 69 6f 6e 20 2d 20 54 52 41 4d 50 5f 42 nction - TRAMP_B
9da0: 49 41 53 29 29 29 3b 0a 23 65 6c 73 65 0a 20 20 IAS)));.#else.
9db0: 61 62 6f 72 74 28 29 3b 0a 23 65 6e 64 69 66 0a abort();.#endif.
9dc0: 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f }..#if defined(_
9dd0: 5f 53 54 44 43 5f 5f 29 20 7c 7c 20 64 65 66 69 _STDC__) || defi
9de0: 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 20 7c 7c ned(__GNUC__) ||
9df0: 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75 73 defined(__cplus
9e00: 70 6c 75 73 29 0a 76 6f 69 64 2a 20 74 72 61 6d plus).void* tram
9e10: 70 6f 6c 69 6e 65 5f 72 5f 64 61 74 61 30 20 28 poline_r_data0 (
9e20: 76 6f 69 64 2a 20 66 75 6e 63 74 69 6f 6e 29 0a void* function).
9e30: 23 65 6c 73 65 0a 76 6f 69 64 2a 20 74 72 61 6d #else.void* tram
9e40: 70 6f 6c 69 6e 65 5f 72 5f 64 61 74 61 30 20 28 poline_r_data0 (
9e50: 66 75 6e 63 74 69 6f 6e 29 0a 20 20 76 6f 69 64 function). void
9e60: 2a 20 66 75 6e 63 74 69 6f 6e 3b 0a 23 65 6e 64 * function;.#end
9e70: 69 66 0a 7b 0a 23 69 66 64 65 66 20 74 72 61 6d if.{.#ifdef tram
9e80: 70 5f 64 61 74 61 0a 20 20 72 65 74 75 72 6e 20 p_data. return
9e90: 28 28 76 6f 69 64 2a 2a 29 28 28 63 68 61 72 2a ((void**)((char*
9ea0: 29 66 75 6e 63 74 69 6f 6e 2d 54 52 41 4d 50 5f )function-TRAMP_
9eb0: 42 49 41 53 2b 54 52 41 4d 50 5f 4c 45 4e 47 54 BIAS+TRAMP_LENGT
9ec0: 48 29 29 5b 30 5d 3b 0a 23 65 6c 73 65 0a 20 20 H))[0];.#else.
9ed0: 61 62 6f 72 74 28 29 3b 0a 23 65 6e 64 69 66 0a abort();.#endif.
9ee0: 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f }..#if defined(_
9ef0: 5f 53 54 44 43 5f 5f 29 20 7c 7c 20 64 65 66 69 _STDC__) || defi
9f00: 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 20 7c 7c ned(__GNUC__) ||
9f10: 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75 73 defined(__cplus
9f20: 70 6c 75 73 29 0a 76 6f 69 64 2a 20 74 72 61 6d plus).void* tram
9f30: 70 6f 6c 69 6e 65 5f 72 5f 64 61 74 61 31 20 28 poline_r_data1 (
9f40: 76 6f 69 64 2a 20 66 75 6e 63 74 69 6f 6e 29 0a void* function).
9f50: 23 65 6c 73 65 0a 76 6f 69 64 2a 20 74 72 61 6d #else.void* tram
9f60: 70 6f 6c 69 6e 65 5f 72 5f 64 61 74 61 31 20 28 poline_r_data1 (
9f70: 66 75 6e 63 74 69 6f 6e 29 0a 20 20 76 6f 69 64 function). void
9f80: 2a 20 66 75 6e 63 74 69 6f 6e 3b 0a 23 65 6e 64 * function;.#end
9f90: 69 66 0a 7b 0a 23 69 66 64 65 66 20 74 72 61 6d if.{.#ifdef tram
9fa0: 70 5f 64 61 74 61 0a 20 20 72 65 74 75 72 6e 20 p_data. return
9fb0: 28 28 76 6f 69 64 2a 2a 29 28 28 63 68 61 72 2a ((void**)((char*
9fc0: 29 66 75 6e 63 74 69 6f 6e 2d 54 52 41 4d 50 5f )function-TRAMP_
9fd0: 42 49 41 53 2b 54 52 41 4d 50 5f 4c 45 4e 47 54 BIAS+TRAMP_LENGT
9fe0: 48 29 29 5b 31 5d 3b 0a 23 65 6c 73 65 0a 20 20 H))[1];.#else.
9ff0: 61 62 6f 72 74 28 29 3b 0a 23 65 6e 64 69 66 0a abort();.#endif.
a000: 7d 0a }.