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 36 20 42 72 75 6e 6f 20 48 61 69 62 6c 65 006 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: 2e 68 22 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 .h"..#if defined
01a0: 28 5f 5f 68 70 70 61 5f 5f 29 0a 23 69 66 20 30 (__hppa__).#if 0
01b0: 0a 23 64 65 66 69 6e 65 20 5f 5f 68 70 70 61 6f .#define __hppao
01c0: 6c 64 5f 5f 20 20 2f 2a 20 4f 6c 64 20 74 72 61 ld__ /* Old tra
01d0: 6d 70 6f 6c 69 6e 65 2c 20 72 65 61 6c 20 6d 61 mpoline, real ma
01e0: 63 68 69 6e 65 20 63 6f 64 65 2e 20 2a 2f 0a 23 chine code. */.#
01f0: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 5f 5f 68 else.#define __h
0200: 70 70 61 6e 65 77 5f 5f 20 20 2f 2a 20 4e 65 77 ppanew__ /* New
0210: 20 74 72 61 6d 70 6f 6c 69 6e 65 2c 20 6a 75 73 trampoline, jus
0220: 74 20 61 20 63 6c 6f 73 75 72 65 2e 20 2a 2f 0a t a closure. */.
0230: 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 #endif.#endif.#i
0240: 66 20 64 65 66 69 6e 65 64 28 5f 5f 70 6f 77 65 f defined(__powe
0250: 72 70 63 5f 5f 29 20 26 26 20 21 64 65 66 69 6e rpc__) && !defin
0260: 65 64 28 5f 5f 70 6f 77 65 72 70 63 36 34 5f 5f ed(__powerpc64__
0270: 29 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f ).#if !defined(_
0280: 41 49 58 29 0a 23 64 65 66 69 6e 65 20 5f 5f 70 AIX).#define __p
0290: 6f 77 65 72 70 63 73 79 73 76 34 5f 5f 20 20 2f owerpcsysv4__ /
02a0: 2a 20 53 79 73 56 2e 34 20 41 42 49 2c 20 72 65 * SysV.4 ABI, re
02b0: 61 6c 20 6d 61 63 68 69 6e 65 20 63 6f 64 65 2e al machine code.
02c0: 20 2a 2f 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e */.#else.#defin
02d0: 65 20 5f 5f 70 6f 77 65 72 70 63 61 69 78 5f 5f e __powerpcaix__
02e0: 20 20 2f 2a 20 41 49 58 20 41 42 49 2c 20 6a 75 /* AIX ABI, ju
02f0: 73 74 20 61 20 63 6c 6f 73 75 72 65 2e 20 2a 2f st a closure. */
0300: 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 .#endif.#endif.#
0310: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 70 6f 77 if defined(__pow
0320: 65 72 70 63 36 34 5f 5f 29 0a 2f 2a 20 54 68 65 erpc64__)./* The
0330: 20 6f 6e 6c 79 20 41 42 49 20 6f 6e 20 70 6f 77 only ABI on pow
0340: 65 72 70 63 36 34 20 6b 6e 6f 77 6e 20 73 6f 20 erpc64 known so
0350: 66 61 72 20 69 73 20 74 68 65 20 41 49 58 20 41 far is the AIX A
0360: 42 49 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 5f BI. */.#define _
0370: 5f 70 6f 77 65 72 70 63 36 34 61 69 78 5f 5f 20 _powerpc64aix__
0380: 20 2f 2a 20 41 49 58 20 41 42 49 2c 20 6a 75 73 /* AIX ABI, jus
0390: 74 20 61 20 63 6c 6f 73 75 72 65 2e 20 2a 2f 0a t a closure. */.
03a0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
03b0: 65 64 28 5f 5f 68 70 70 61 6e 65 77 5f 5f 29 0a ed(__hppanew__).
03c0: 2f 2a 0a 20 2a 20 41 20 66 75 6e 63 74 69 6f 6e /*. * A function
03d0: 20 70 6f 69 6e 74 65 72 20 69 73 20 61 20 62 69 pointer is a bi
03e0: 61 73 65 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 ased pointer to
03f0: 61 20 64 61 74 61 20 61 72 65 61 20 77 68 6f 73 a data area whos
0400: 65 20 66 69 72 73 74 20 77 6f 72 64 0a 20 2a 20 e first word. *
0410: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 61 63 74 contains the act
0420: 75 61 6c 20 61 64 64 72 65 73 73 20 6f 66 20 74 ual address of t
0430: 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 2f he function.. */
0440: 0a 65 78 74 65 72 6e 20 76 6f 69 64 20 74 72 61 .extern void tra
0450: 6d 70 20 28 29 3b 20 2f 2a 20 74 72 61 6d 70 6f mp (); /* trampo
0460: 6c 69 6e 65 20 70 72 6f 74 6f 74 79 70 65 20 2a line prototype *
0470: 2f 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 6e 65 /./* We don't ne
0480: 65 64 20 74 6f 20 74 61 6b 65 20 61 6e 79 20 73 ed to take any s
0490: 70 65 63 69 61 6c 20 6d 65 61 73 75 72 65 73 20 pecial measures
04a0: 74 6f 20 6d 61 6b 65 20 74 68 65 20 63 6f 64 65 to make the code
04b0: 20 65 78 65 63 75 74 61 62 6c 65 0a 20 2a 20 73 executable. * s
04c0: 69 6e 63 65 20 74 68 65 20 61 63 74 75 61 6c 20 ince the actual
04d0: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 instructions are
04e0: 20 69 6e 20 74 68 65 20 74 65 78 74 20 73 65 67 in the text seg
04f0: 6d 65 6e 74 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 ment.. */.#ifnde
0500: 66 20 43 4f 44 45 5f 45 58 45 43 55 54 41 42 4c f CODE_EXECUTABL
0510: 45 0a 23 64 65 66 69 6e 65 20 43 4f 44 45 5f 45 E.#define CODE_E
0520: 58 45 43 55 54 41 42 4c 45 0a 23 65 6e 64 69 66 XECUTABLE.#endif
0530: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
0540: 6e 65 64 28 5f 5f 70 6f 77 65 72 70 63 61 69 78 ned(__powerpcaix
0550: 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f __) || defined(_
0560: 5f 70 6f 77 65 72 70 63 36 34 61 69 78 5f 5f 29 _powerpc64aix__)
0570: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 69 61 || defined(__ia
0580: 36 34 5f 5f 29 0a 2f 2a 0a 20 2a 20 41 20 66 75 64__)./*. * A fu
0590: 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 nction pointer i
05a0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 s a pointer to a
05b0: 20 64 61 74 61 20 61 72 65 61 20 77 68 6f 73 65 data area whose
05c0: 20 66 69 72 73 74 20 77 6f 72 64 20 63 6f 6e 74 first word cont
05d0: 61 69 6e 73 0a 20 2a 20 74 68 65 20 61 63 74 75 ains. * the actu
05e0: 61 6c 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 al address of th
05f0: 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 2f 0a e function.. */.
0600: 65 78 74 65 72 6e 20 76 6f 69 64 20 28 2a 74 72 extern void (*tr
0610: 61 6d 70 29 20 28 29 3b 20 2f 2a 20 74 72 61 6d amp) (); /* tram
0620: 70 6f 6c 69 6e 65 20 70 72 6f 74 6f 74 79 70 65 poline prototype
0630: 20 2a 2f 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 */./* We don't
0640: 6e 65 65 64 20 74 6f 20 74 61 6b 65 20 61 6e 79 need to take any
0650: 20 73 70 65 63 69 61 6c 20 6d 65 61 73 75 72 65 special measure
0660: 73 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 63 6f s to make the co
0670: 64 65 20 65 78 65 63 75 74 61 62 6c 65 0a 20 2a de executable. *
0680: 20 73 69 6e 63 65 20 74 68 65 20 61 63 74 75 61 since the actua
0690: 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 l instructions a
06a0: 72 65 20 69 6e 20 74 68 65 20 74 65 78 74 20 73 re in the text s
06b0: 65 67 6d 65 6e 74 2e 0a 20 2a 2f 0a 23 69 66 6e egment.. */.#ifn
06c0: 64 65 66 20 43 4f 44 45 5f 45 58 45 43 55 54 41 def CODE_EXECUTA
06d0: 42 4c 45 0a 23 64 65 66 69 6e 65 20 43 4f 44 45 BLE.#define CODE
06e0: 5f 45 58 45 43 55 54 41 42 4c 45 0a 23 65 6e 64 _EXECUTABLE.#end
06f0: 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 if.#endif.#if de
0700: 66 69 6e 65 64 28 5f 5f 6d 36 38 6b 5f 5f 29 0a fined(__m68k__).
0710: 23 69 66 20 64 65 66 69 6e 65 64 28 41 4d 49 47 #if defined(AMIG
0720: 41 29 20 2f 2a 20 41 6d 69 67 61 20 72 75 6e 6e A) /* Amiga runn
0730: 69 6e 67 20 41 6d 69 67 61 4f 53 2c 20 6e 6f 74 ing AmigaOS, not
0740: 20 4c 69 6e 75 78 20 2a 2f 0a 23 69 66 6e 64 65 Linux */.#ifnde
0750: 66 20 43 4f 44 45 5f 45 58 45 43 55 54 41 42 4c f CODE_EXECUTABL
0760: 45 20 2f 2a 20 63 6f 6e 66 69 67 75 72 65 20 67 E /* configure g
0770: 75 65 73 73 65 73 20 77 72 6f 6e 67 3f 3f 20 2a uesses wrong?? *
0780: 2f 0a 23 64 65 66 69 6e 65 20 43 4f 44 45 5f 45 /.#define CODE_E
0790: 58 45 43 55 54 41 42 4c 45 0a 23 65 6e 64 69 66 XECUTABLE.#endif
07a0: 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a .#endif.#endif..
07b0: 2f 2a 20 41 73 20 6f 66 20 57 69 6e 64 6f 77 73 /* As of Windows
07c0: 20 58 50 20 53 50 20 32 2c 20 6d 61 6c 6c 6f 63 XP SP 2, malloc
07d0: 27 64 20 6d 65 6d 6f 72 79 20 69 73 20 6e 6f 74 'd memory is not
07e0: 20 65 78 65 63 75 74 61 62 6c 65 20 2a 2f 0a 23 executable */.#
07f0: 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 23 75 6e ifdef _WIN32.#un
0800: 64 65 66 20 43 4f 44 45 5f 45 58 45 43 55 54 41 def CODE_EXECUTA
0810: 42 4c 45 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e BLE.#endif..#ifn
0820: 64 65 66 20 43 4f 44 45 5f 45 58 45 43 55 54 41 def CODE_EXECUTA
0830: 42 4c 45 0a 2f 2a 20 48 6f 77 20 64 6f 20 77 65 BLE./* How do we
0840: 20 6d 61 6b 65 20 74 68 65 20 74 72 61 6d 70 6f make the trampo
0850: 6c 69 6e 65 27 73 20 63 6f 64 65 20 65 78 65 63 line's code exec
0860: 75 74 61 62 6c 65 3f 20 2a 2f 0a 23 69 66 20 64 utable? */.#if d
0870: 65 66 69 6e 65 64 28 48 41 56 45 5f 4d 41 43 48 efined(HAVE_MACH
0880: 5f 56 4d 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 _VM) || defined(
0890: 5f 5f 63 6f 6e 76 65 78 5f 5f 29 20 7c 7c 20 64 __convex__) || d
08a0: 65 66 69 6e 65 64 28 48 41 56 45 5f 57 4f 52 4b efined(HAVE_WORK
08b0: 49 4e 47 5f 4d 50 52 4f 54 45 43 54 29 20 7c 7c ING_MPROTECT) ||
08c0: 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 53 59 defined(HAVE_SY
08d0: 53 5f 4d 38 38 4b 42 43 53 5f 48 29 0a 2f 2a 20 S_M88KBCS_H)./*
08e0: 6d 70 72 6f 74 65 63 74 28 29 20 5b 6f 72 20 65 mprotect() [or e
08f0: 71 75 69 76 61 6c 65 6e 74 5d 20 74 68 65 20 6d quivalent] the m
0900: 61 6c 6c 6f 63 27 65 64 20 61 72 65 61 2e 20 2a alloc'ed area. *
0910: 2f 0a 23 64 65 66 69 6e 65 20 45 58 45 43 55 54 /.#define EXECUT
0920: 41 42 4c 45 5f 56 49 41 5f 4d 50 52 4f 54 45 43 ABLE_VIA_MPROTEC
0930: 54 0a 23 65 6c 73 65 0a 23 69 66 64 65 66 20 48 T.#else.#ifdef H
0940: 41 56 45 5f 4d 4d 41 50 0a 2f 2a 20 55 73 65 20 AVE_MMAP./* Use
0950: 61 6e 20 6d 6d 61 70 27 65 64 20 70 61 67 65 2e an mmap'ed page.
0960: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 45 58 45 43 */.#define EXEC
0970: 55 54 41 42 4c 45 5f 56 49 41 5f 4d 4d 41 50 0a UTABLE_VIA_MMAP.
0980: 23 69 66 64 65 66 20 48 41 56 45 5f 4d 4d 41 50 #ifdef HAVE_MMAP
0990: 5f 41 4e 4f 4e 59 4d 4f 55 53 0a 2f 2a 20 55 73 _ANONYMOUS./* Us
09a0: 65 20 6d 6d 61 70 20 77 69 74 68 20 74 68 65 20 e mmap with the
09b0: 4d 41 50 5f 41 4e 4f 4e 59 4d 4f 55 53 20 6f 72 MAP_ANONYMOUS or
09c0: 20 4d 41 50 5f 41 4e 4f 4e 20 66 6c 61 67 2e 20 MAP_ANON flag.
09d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 45 58 45 43 55 */.#define EXECU
09e0: 54 41 42 4c 45 5f 56 49 41 5f 4d 4d 41 50 5f 41 TABLE_VIA_MMAP_A
09f0: 4e 4f 4e 59 4d 4f 55 53 0a 23 65 6c 73 65 0a 2f NONYMOUS.#else./
0a00: 2a 20 55 73 65 20 6d 6d 61 70 20 6f 6e 20 2f 64 * Use mmap on /d
0a10: 65 76 2f 7a 65 72 6f 2e 20 2a 2f 0a 23 64 65 66 ev/zero. */.#def
0a20: 69 6e 65 20 45 58 45 43 55 54 41 42 4c 45 5f 56 ine EXECUTABLE_V
0a30: 49 41 5f 4d 4d 41 50 5f 44 45 56 5a 45 52 4f 0a IA_MMAP_DEVZERO.
0a40: 23 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 69 66 #endif.#else.#if
0a50: 64 65 66 20 48 41 56 45 5f 53 48 4d 0a 2f 2a 20 def HAVE_SHM./*
0a60: 55 73 65 20 61 6e 20 73 68 6d 61 74 27 65 64 20 Use an shmat'ed
0a70: 70 61 67 65 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 page. */.#define
0a80: 20 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41 5f EXECUTABLE_VIA_
0a90: 53 48 4d 0a 23 65 6c 73 65 0a 23 69 66 64 65 66 SHM.#else.#ifdef
0aa0: 20 5f 57 49 4e 33 32 0a 2f 2a 20 55 73 65 20 56 _WIN32./* Use V
0ab0: 69 72 74 75 61 6c 41 6c 6c 6f 63 20 2a 2f 0a 23 irtualAlloc */.#
0ac0: 65 6c 73 65 0a 3f 3f 0a 23 65 6e 64 69 66 0a 23 else.??.#endif.#
0ad0: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 65 6e endif.#endif.#en
0ae0: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 23 69 6e 63 dif.#endif..#inc
0af0: 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 20 2f lude <stdio.h> /
0b00: 2a 20 64 65 63 6c 61 72 65 73 20 66 70 72 69 6e * declares fprin
0b10: 74 66 28 29 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 tf() */..#includ
0b20: 65 20 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a e <sys/types.h>.
0b30: 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 #include <stdlib
0b40: 2e 68 3e 20 2f 2a 20 64 65 63 6c 61 72 65 73 20 .h> /* declares
0b50: 61 62 6f 72 74 28 29 2c 20 6d 61 6c 6c 6f 63 28 abort(), malloc(
0b60: 29 2c 20 66 72 65 65 28 29 20 2a 2f 0a 23 69 66 ), free() */.#if
0b70: 64 65 66 20 48 41 56 45 5f 55 4e 49 53 54 44 5f def HAVE_UNISTD_
0b80: 48 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 H.#include <unis
0b90: 74 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a td.h>.#endif../*
0ba0: 20 44 65 63 6c 61 72 65 20 67 65 74 70 61 67 65 Declare getpage
0bb0: 73 69 7a 65 28 29 2e 20 2a 2f 0a 23 69 66 64 65 size(). */.#ifde
0bc0: 66 20 48 41 56 45 5f 47 45 54 50 41 47 45 53 49 f HAVE_GETPAGESI
0bd0: 5a 45 0a 23 69 66 64 65 66 20 5f 5f 63 70 6c 75 ZE.#ifdef __cplu
0be0: 73 70 6c 75 73 0a 65 78 74 65 72 6e 20 22 43 22 splus.extern "C"
0bf0: 20 52 45 54 47 45 54 50 41 47 45 53 49 5a 45 54 RETGETPAGESIZET
0c00: 59 50 45 20 67 65 74 70 61 67 65 73 69 7a 65 20 YPE getpagesize
0c10: 28 76 6f 69 64 29 3b 0a 23 65 6c 73 65 0a 65 78 (void);.#else.ex
0c20: 74 65 72 6e 20 52 45 54 47 45 54 50 41 47 45 53 tern RETGETPAGES
0c30: 49 5a 45 54 59 50 45 20 67 65 74 70 61 67 65 73 IZETYPE getpages
0c40: 69 7a 65 20 28 76 6f 69 64 29 3b 0a 23 65 6e 64 ize (void);.#end
0c50: 69 66 0a 23 65 6c 73 65 0a 23 69 66 64 65 66 20 if.#else.#ifdef
0c60: 48 41 56 45 5f 53 59 53 5f 50 41 52 41 4d 5f 48 HAVE_SYS_PARAM_H
0c70: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 70 .#include <sys/p
0c80: 61 72 61 6d 2e 68 3e 0a 23 65 6c 73 65 0a 2f 2a aram.h>.#else./*
0c90: 20 4e 6f 74 20 55 6e 69 78 2c 20 65 2e 67 2e 20 Not Unix, e.g.
0ca0: 6d 69 6e 67 77 33 32 20 2a 2f 0a 23 64 65 66 69 mingw32 */.#defi
0cb0: 6e 65 20 50 41 47 45 53 49 5a 45 20 34 30 39 36 ne PAGESIZE 4096
0cc0: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 .#endif.#define
0cd0: 67 65 74 70 61 67 65 73 69 7a 65 28 29 20 50 41 getpagesize() PA
0ce0: 47 45 53 49 5a 45 0a 23 65 6e 64 69 66 0a 0a 2f GESIZE.#endif../
0cf0: 2a 20 44 65 63 6c 61 72 65 20 6d 70 72 6f 74 65 * Declare mprote
0d00: 63 74 28 29 20 6f 72 20 65 71 75 69 76 61 6c 65 ct() or equivale
0d10: 6e 74 2e 20 2a 2f 0a 23 69 66 64 65 66 20 45 58 nt. */.#ifdef EX
0d20: 45 43 55 54 41 42 4c 45 5f 56 49 41 5f 4d 50 52 ECUTABLE_VIA_MPR
0d30: 4f 54 45 43 54 0a 23 69 66 64 65 66 20 48 41 56 OTECT.#ifdef HAV
0d40: 45 5f 4d 41 43 48 5f 56 4d 0a 23 69 6e 63 6c 75 E_MACH_VM.#inclu
0d50: 64 65 20 3c 73 79 73 2f 72 65 73 6f 75 72 63 65 de <sys/resource
0d60: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6d 61 .h>.#include <ma
0d70: 63 68 2f 6d 61 63 68 5f 69 6e 74 65 72 66 61 63 ch/mach_interfac
0d80: 65 2e 68 3e 0a 23 69 66 64 65 66 20 4e 65 58 54 e.h>.#ifdef NeXT
0d90: 0a 23 69 6e 63 6c 75 64 65 20 3c 6d 61 63 68 2f .#include <mach/
0da0: 6d 61 63 68 5f 69 6e 69 74 2e 68 3e 0a 23 65 6e mach_init.h>.#en
0db0: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 6f 73 66 dif.#ifdef __osf
0dc0: 5f 5f 0a 23 69 6e 63 6c 75 64 65 20 3c 6d 61 63 __.#include <mac
0dd0: 68 5f 69 6e 69 74 2e 68 3e 0a 23 65 6e 64 69 66 h_init.h>.#endif
0de0: 0a 23 69 6e 63 6c 75 64 65 20 3c 6d 61 63 68 2f .#include <mach/
0df0: 6d 61 63 68 69 6e 65 2f 76 6d 5f 70 61 72 61 6d machine/vm_param
0e00: 2e 68 3e 0a 23 65 6c 73 65 0a 23 69 66 64 65 66 .h>.#else.#ifdef
0e10: 20 48 41 56 45 5f 53 59 53 5f 4d 38 38 4b 42 43 HAVE_SYS_M88KBC
0e20: 53 5f 48 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 S_H.#include <sy
0e30: 73 2f 6d 38 38 6b 62 63 73 2e 68 3e 0a 23 64 65 s/m88kbcs.h>.#de
0e40: 66 69 6e 65 20 67 65 74 70 61 67 65 73 69 7a 65 fine getpagesize
0e50: 28 29 20 20 34 30 39 36 20 20 2f 2a 20 3f 3f 20 () 4096 /* ??
0e60: 2a 2f 0a 23 65 6c 73 65 0a 23 69 6e 63 6c 75 64 */.#else.#includ
0e70: 65 20 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a e <sys/types.h>.
0e80: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6d #include <sys/mm
0e90: 61 6e 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 65 6e an.h>.#endif.#en
0ea0: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 44 dif.#endif../* D
0eb0: 65 63 6c 61 72 65 20 6d 6d 61 70 28 29 2e 20 2a eclare mmap(). *
0ec0: 2f 0a 23 69 66 64 65 66 20 45 58 45 43 55 54 41 /.#ifdef EXECUTA
0ed0: 42 4c 45 5f 56 49 41 5f 4d 4d 41 50 0a 23 69 6e BLE_VIA_MMAP.#in
0ee0: 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73 clude <sys/types
0ef0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 .h>.#include <sy
0f00: 73 2f 6d 6d 61 6e 2e 68 3e 0a 23 69 66 20 21 64 s/mman.h>.#if !d
0f10: 65 66 69 6e 65 64 28 50 52 4f 54 5f 45 58 45 43 efined(PROT_EXEC
0f20: 29 20 26 26 20 64 65 66 69 6e 65 64 28 50 52 4f ) && defined(PRO
0f30: 54 5f 45 58 45 43 55 54 45 29 20 2f 2a 20 49 72 T_EXECUTE) /* Ir
0f40: 69 78 20 34 2e 30 2e 35 20 6e 65 65 64 73 20 74 ix 4.0.5 needs t
0f50: 68 69 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 his */.#define P
0f60: 52 4f 54 5f 45 58 45 43 20 50 52 4f 54 5f 45 58 ROT_EXEC PROT_EX
0f70: 45 43 55 54 45 0a 23 65 6e 64 69 66 0a 23 65 6e ECUTE.#endif.#en
0f80: 64 69 66 0a 0a 2f 2a 20 44 65 63 6c 61 72 65 20 dif../* Declare
0f90: 6f 70 65 6e 28 29 2e 20 2a 2f 0a 23 69 66 64 65 open(). */.#ifde
0fa0: 66 20 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41 f EXECUTABLE_VIA
0fb0: 5f 4d 4d 41 50 5f 44 45 56 5a 45 52 4f 0a 23 69 _MMAP_DEVZERO.#i
0fc0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65 nclude <sys/type
0fd0: 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 s.h>.#include <u
0fe0: 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 nistd.h>.#includ
0ff0: 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23 65 6e 64 e <fcntl.h>.#end
1000: 69 66 0a 0a 2f 2a 20 44 65 63 6c 61 72 65 20 73 if../* Declare s
1010: 68 6d 67 65 74 28 29 2c 20 73 68 6d 61 74 28 29 hmget(), shmat()
1020: 2c 20 73 68 6d 63 74 6c 28 29 2e 20 2a 2f 0a 23 , shmctl(). */.#
1030: 69 66 64 65 66 20 45 58 45 43 55 54 41 42 4c 45 ifdef EXECUTABLE
1040: 5f 56 49 41 5f 53 48 4d 0a 23 69 6e 63 6c 75 64 _VIA_SHM.#includ
1050: 65 20 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a e <sys/types.h>.
1060: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 69 70 #include <sys/ip
1070: 63 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 c.h>.#include <s
1080: 79 73 2f 73 68 6d 2e 68 3e 0a 23 69 66 64 65 66 ys/shm.h>.#ifdef
1090: 20 48 41 56 45 5f 53 59 53 5f 53 59 53 4d 41 43 HAVE_SYS_SYSMAC
10a0: 52 4f 53 5f 48 0a 23 69 6e 63 6c 75 64 65 20 3c ROS_H.#include <
10b0: 73 79 73 2f 73 79 73 6d 61 63 72 6f 73 2e 68 3e sys/sysmacros.h>
10c0: 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a .#endif.#endif..
10d0: 2f 2a 20 53 75 70 70 6f 72 74 20 66 6f 72 20 69 /* Support for i
10e0: 6e 73 74 72 75 63 74 69 6f 6e 20 63 61 63 68 65 nstruction cache
10f0: 20 66 6c 75 73 68 2e 20 2a 2f 0a 23 69 66 64 65 flush. */.#ifde
1100: 66 20 5f 5f 69 33 38 36 5f 5f 0a 23 69 66 20 64 f __i386__.#if d
1110: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 2f efined(_WIN32) /
1120: 2a 20 57 69 6e 64 6f 77 73 4e 54 20 6f 72 20 57 * WindowsNT or W
1130: 69 6e 64 6f 77 73 39 35 20 2a 2f 0a 23 64 65 66 indows95 */.#def
1140: 69 6e 65 20 57 49 4e 33 32 5f 4c 45 41 4e 5f 41 ine WIN32_LEAN_A
1150: 4e 44 5f 4d 45 41 4e 0a 23 64 65 66 69 6e 65 20 ND_MEAN.#define
1160: 57 49 4e 33 32 5f 45 58 54 52 41 5f 4c 45 41 4e WIN32_EXTRA_LEAN
1170: 0a 23 69 6e 63 6c 75 64 65 20 3c 77 69 6e 64 6f .#include <windo
1180: 77 73 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 65 6e ws.h>.#endif.#en
1190: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d 36 38 dif.#ifdef __m68
11a0: 6b 5f 5f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 k__.#if defined(
11b0: 41 4d 49 47 41 29 20 2f 2a 20 41 6d 69 67 61 20 AMIGA) /* Amiga
11c0: 72 75 6e 6e 69 6e 67 20 41 6d 69 67 61 4f 53 2c running AmigaOS,
11d0: 20 6e 6f 74 20 4c 69 6e 75 78 20 2a 2f 0a 23 69 not Linux */.#i
11e0: 6e 63 6c 75 64 65 20 3c 65 78 65 63 2f 74 79 70 nclude <exec/typ
11f0: 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c es.h>.#include <
1200: 65 78 65 63 2f 65 78 65 63 62 61 73 65 2e 68 3e exec/execbase.h>
1210: 0a 23 69 6e 63 6c 75 64 65 20 3c 70 72 6f 74 6f .#include <proto
1220: 2f 65 78 65 63 2e 68 3e 0a 23 65 6e 64 69 66 0a /exec.h>.#endif.
1230: 23 69 66 64 65 66 20 68 70 75 78 0a 23 69 6e 63 #ifdef hpux.#inc
1240: 6c 75 64 65 20 3c 73 79 73 2f 63 61 63 68 65 2e lude <sys/cache.
1250: 68 3e 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 h>.#endif.#endif
1260: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 6d .#if defined(__m
1270: 69 70 73 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 ips__) || define
1280: 64 28 5f 5f 6d 69 70 73 6e 33 32 5f 5f 29 20 7c d(__mipsn32__) |
1290: 7c 20 64 65 66 69 6e 65 64 28 5f 5f 6d 69 70 73 | defined(__mips
12a0: 36 34 5f 5f 29 0a 23 69 66 64 65 66 20 75 6c 74 64__).#ifdef ult
12b0: 72 69 78 0a 23 69 6e 63 6c 75 64 65 20 3c 6d 69 rix.#include <mi
12c0: 70 73 2f 63 61 63 68 65 63 74 6c 2e 68 3e 0a 23 ps/cachectl.h>.#
12d0: 65 6c 73 65 0a 23 69 66 64 65 66 20 6c 69 6e 75 else.#ifdef linu
12e0: 78 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 6d 2f x.#include <asm/
12f0: 63 61 63 68 65 63 74 6c 2e 68 3e 0a 23 65 6c 73 cachectl.h>.#els
1300: 65 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 59 e.#ifdef HAVE_SY
1310: 53 5f 43 41 43 48 45 43 54 4c 5f 48 0a 23 69 6e S_CACHECTL_H.#in
1320: 63 6c 75 64 65 20 3c 73 79 73 2f 63 61 63 68 65 clude <sys/cache
1330: 63 74 6c 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 65 ctl.h>.#endif.#e
1340: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 65 6e 64 ndif.#endif.#end
1350: 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d 38 38 6b if.#ifdef __m88k
1360: 5f 5f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 __.#include <sys
1370: 2f 73 79 73 6c 6f 63 61 6c 2e 68 3e 0a 23 65 6e /syslocal.h>.#en
1380: 64 69 66 0a 2f 2a 20 49 6e 6c 69 6e 65 20 61 73 dif./* Inline as
1390: 73 65 6d 62 6c 79 20 66 75 6e 63 74 69 6f 6e 20 sembly function
13a0: 66 6f 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 for instruction
13b0: 63 61 63 68 65 20 66 6c 75 73 68 2e 20 2a 2f 0a cache flush. */.
13c0: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 73 70 #if defined(__sp
13d0: 61 72 63 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 arc__) || define
13e0: 64 28 5f 5f 73 70 61 72 63 36 34 5f 5f 29 20 7c d(__sparc64__) |
13f0: 7c 20 64 65 66 69 6e 65 64 28 5f 5f 61 6c 70 68 | defined(__alph
1400: 61 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 a__) || defined(
1410: 5f 5f 68 70 70 61 6f 6c 64 5f 5f 29 20 7c 7c 20 __hppaold__) ||
1420: 64 65 66 69 6e 65 64 28 5f 5f 70 6f 77 65 72 70 defined(__powerp
1430: 63 73 79 73 76 34 5f 5f 29 20 7c 7c 20 64 65 66 csysv4__) || def
1440: 69 6e 65 64 28 5f 5f 63 6f 6e 76 65 78 5f 5f 29 ined(__convex__)
1450: 0a 23 69 66 64 65 66 20 5f 5f 47 4e 55 43 5f 5f .#ifdef __GNUC__
1460: 0a 65 78 74 65 72 6e 20 69 6e 6c 69 6e 65 0a 23 .extern inline.#
1470: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 73 70 61 if defined(__spa
1480: 72 63 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 rc__) || defined
1490: 28 5f 5f 73 70 61 72 63 36 34 5f 5f 29 0a 23 69 (__sparc64__).#i
14a0: 6e 63 6c 75 64 65 20 22 63 61 63 68 65 2d 73 70 nclude "cache-sp
14b0: 61 72 63 2e 63 22 0a 23 65 6e 64 69 66 0a 23 69 arc.c".#endif.#i
14c0: 66 64 65 66 20 5f 5f 61 6c 70 68 61 5f 5f 0a 23 fdef __alpha__.#
14d0: 69 6e 63 6c 75 64 65 20 22 63 61 63 68 65 2d 61 include "cache-a
14e0: 6c 70 68 61 2e 63 22 0a 23 65 6e 64 69 66 0a 23 lpha.c".#endif.#
14f0: 69 66 64 65 66 20 5f 5f 68 70 70 61 5f 5f 0a 23 ifdef __hppa__.#
1500: 69 6e 63 6c 75 64 65 20 22 63 61 63 68 65 2d 68 include "cache-h
1510: 70 70 61 2e 63 22 0a 23 65 6e 64 69 66 0a 23 69 ppa.c".#endif.#i
1520: 66 20 64 65 66 69 6e 65 64 28 5f 5f 70 6f 77 65 f defined(__powe
1530: 72 70 63 5f 5f 29 20 26 26 20 21 64 65 66 69 6e rpc__) && !defin
1540: 65 64 28 5f 5f 70 6f 77 65 72 70 63 36 34 5f 5f ed(__powerpc64__
1550: 29 0a 23 69 6e 63 6c 75 64 65 20 22 63 61 63 68 ).#include "cach
1560: 65 2d 70 6f 77 65 72 70 63 2e 63 22 0a 23 65 6e e-powerpc.c".#en
1570: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 63 6f 6e dif.#ifdef __con
1580: 76 65 78 5f 5f 0a 23 69 6e 63 6c 75 64 65 20 22 vex__.#include "
1590: 63 61 63 68 65 2d 63 6f 6e 76 65 78 2e 63 22 0a cache-convex.c".
15a0: 23 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 69 66 #endif.#else.#if
15b0: 20 64 65 66 69 6e 65 64 28 5f 5f 73 70 61 72 63 defined(__sparc
15c0: 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f __) || defined(_
15d0: 5f 73 70 61 72 63 36 34 5f 5f 29 0a 65 78 74 65 _sparc64__).exte
15e0: 72 6e 20 76 6f 69 64 20 5f 5f 54 52 5f 63 6c 65 rn void __TR_cle
15f0: 61 72 5f 63 61 63 68 65 5f 34 28 29 3b 0a 23 65 ar_cache_4();.#e
1600: 6c 73 65 0a 65 78 74 65 72 6e 20 76 6f 69 64 20 lse.extern void
1610: 5f 5f 54 52 5f 63 6c 65 61 72 5f 63 61 63 68 65 __TR_clear_cache
1620: 28 29 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 ();.#endif.#endi
1630: 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 4c 65 6e f.#endif../* Len
1640: 67 74 68 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e gth and alignmen
1650: 74 20 6f 66 20 74 72 61 6d 70 6f 6c 69 6e 65 20 t of trampoline
1660: 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 69 33 38 36 */.#ifdef __i386
1670: 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 __.#define TRAMP
1680: 5f 4c 45 4e 47 54 48 20 31 35 0a 23 64 65 66 69 _LENGTH 15.#defi
1690: 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20 31 ne TRAMP_ALIGN 1
16a0: 36 20 20 2f 2a 20 34 20 66 6f 72 20 61 20 69 33 6 /* 4 for a i3
16b0: 38 36 2c 20 31 36 20 66 6f 72 20 61 20 69 34 38 86, 16 for a i48
16c0: 36 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 6 */.#endif.#ifd
16d0: 65 66 20 5f 5f 6d 36 38 6b 5f 5f 0a 23 64 65 66 ef __m68k__.#def
16e0: 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 ine TRAMP_LENGTH
16f0: 20 31 38 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 18.#define TRAM
1700: 50 5f 41 4c 49 47 4e 20 31 36 0a 23 65 6e 64 69 P_ALIGN 16.#endi
1710: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f f.#if defined(__
1720: 6d 69 70 73 5f 5f 29 20 26 26 20 21 64 65 66 69 mips__) && !defi
1730: 6e 65 64 28 5f 5f 6d 69 70 73 6e 33 32 5f 5f 29 ned(__mipsn32__)
1740: 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c .#define TRAMP_L
1750: 45 4e 47 54 48 20 33 32 0a 23 64 65 66 69 6e 65 ENGTH 32.#define
1760: 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20 34 0a 23 TRAMP_ALIGN 4.#
1770: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d endif.#ifdef __m
1780: 69 70 73 6e 33 32 5f 5f 0a 23 64 65 66 69 6e 65 ipsn32__.#define
1790: 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 33 36 TRAMP_LENGTH 36
17a0: 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 .#define TRAMP_A
17b0: 4c 49 47 4e 20 34 0a 23 65 6e 64 69 66 0a 23 69 LIGN 4.#endif.#i
17c0: 66 64 65 66 20 5f 5f 6d 69 70 73 36 34 6f 6c 64 fdef __mips64old
17d0: 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 __.#define TRAMP
17e0: 5f 4c 45 4e 47 54 48 20 38 34 0a 23 64 65 66 69 _LENGTH 84.#defi
17f0: 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20 34 ne TRAMP_ALIGN 4
1800: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f .#endif.#ifdef _
1810: 5f 6d 69 70 73 36 34 5f 5f 0a 23 64 65 66 69 6e _mips64__.#defin
1820: 65 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 34 e TRAMP_LENGTH 4
1830: 38 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 8.#define TRAMP_
1840: 41 4c 49 47 4e 20 38 0a 23 65 6e 64 69 66 0a 23 ALIGN 8.#endif.#
1850: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 73 70 61 if defined(__spa
1860: 72 63 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65 rc__) && !define
1870: 64 28 5f 5f 73 70 61 72 63 36 34 5f 5f 29 0a 23 d(__sparc64__).#
1880: 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e define TRAMP_LEN
1890: 47 54 48 20 32 38 0a 23 64 65 66 69 6e 65 20 54 GTH 28.#define T
18a0: 52 41 4d 50 5f 41 4c 49 47 4e 20 31 36 0a 23 65 RAMP_ALIGN 16.#e
18b0: 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 73 70 ndif.#ifdef __sp
18c0: 61 72 63 36 34 5f 5f 0a 23 64 65 66 69 6e 65 20 arc64__.#define
18d0: 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 34 38 0a TRAMP_LENGTH 48.
18e0: 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c #define TRAMP_AL
18f0: 49 47 4e 20 31 36 0a 23 65 6e 64 69 66 0a 23 69 IGN 16.#endif.#i
1900: 66 64 65 66 20 5f 5f 61 6c 70 68 61 5f 5f 0a 23 fdef __alpha__.#
1910: 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e define TRAMP_LEN
1920: 47 54 48 20 34 38 0a 23 64 65 66 69 6e 65 20 54 GTH 48.#define T
1930: 52 41 4d 50 5f 41 4c 49 47 4e 20 38 0a 23 65 6e RAMP_ALIGN 8.#en
1940: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 68 70 70 dif.#ifdef __hpp
1950: 61 6f 6c 64 5f 5f 0a 23 64 65 66 69 6e 65 20 54 aold__.#define T
1960: 52 41 4d 50 5f 4c 45 4e 47 54 48 20 35 36 0a 23 RAMP_LENGTH 56.#
1970: 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 define TRAMP_ALI
1980: 47 4e 20 31 36 0a 23 65 6e 64 69 66 0a 23 69 66 GN 16.#endif.#if
1990: 64 65 66 20 5f 5f 68 70 70 61 6e 65 77 5f 5f 0a def __hppanew__.
19a0: 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 #define TRAMP_LE
19b0: 4e 47 54 48 20 32 30 0a 23 64 65 66 69 6e 65 20 NGTH 20.#define
19c0: 54 52 41 4d 50 5f 41 4c 49 47 4e 20 31 36 0a 23 TRAMP_ALIGN 16.#
19d0: 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 42 49 41 define TRAMP_BIA
19e0: 53 20 32 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 S 2.#endif.#ifde
19f0: 66 20 5f 5f 61 72 6d 5f 5f 0a 23 64 65 66 69 6e f __arm__.#defin
1a00: 65 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 33 e TRAMP_LENGTH 3
1a10: 36 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 6.#define TRAMP_
1a20: 41 4c 49 47 4e 20 34 0a 23 65 6e 64 69 66 0a 23 ALIGN 4.#endif.#
1a30: 69 66 64 65 66 20 5f 5f 70 6f 77 65 72 70 63 73 ifdef __powerpcs
1a40: 79 73 76 34 5f 5f 0a 23 64 65 66 69 6e 65 20 54 ysv4__.#define T
1a50: 52 41 4d 50 5f 4c 45 4e 47 54 48 20 33 36 0a 23 RAMP_LENGTH 36.#
1a60: 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 define TRAMP_ALI
1a70: 47 4e 20 34 0a 23 65 6e 64 69 66 0a 23 69 66 64 GN 4.#endif.#ifd
1a80: 65 66 20 5f 5f 70 6f 77 65 72 70 63 61 69 78 5f ef __powerpcaix_
1a90: 5f 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f _.#define TRAMP_
1aa0: 4c 45 4e 47 54 48 20 32 34 0a 23 64 65 66 69 6e LENGTH 24.#defin
1ab0: 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20 34 0a e TRAMP_ALIGN 4.
1ac0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f #endif.#ifdef __
1ad0: 70 6f 77 65 72 70 63 36 34 61 69 78 5f 5f 0a 23 powerpc64aix__.#
1ae0: 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e define TRAMP_LEN
1af0: 47 54 48 20 34 38 0a 23 64 65 66 69 6e 65 20 54 GTH 48.#define T
1b00: 52 41 4d 50 5f 41 4c 49 47 4e 20 38 0a 23 65 6e RAMP_ALIGN 8.#en
1b10: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d 38 38 dif.#ifdef __m88
1b20: 6b 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52 41 4d k__.#define TRAM
1b30: 50 5f 4c 45 4e 47 54 48 20 33 32 0a 23 64 65 66 P_LENGTH 32.#def
1b40: 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20 ine TRAMP_ALIGN
1b50: 38 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 8.#endif.#ifdef
1b60: 5f 5f 63 6f 6e 76 65 78 5f 5f 0a 23 64 65 66 69 __convex__.#defi
1b70: 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 ne TRAMP_LENGTH
1b80: 32 30 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 20.#define TRAMP
1b90: 5f 41 4c 49 47 4e 20 34 0a 23 65 6e 64 69 66 0a _ALIGN 4.#endif.
1ba0: 23 69 66 64 65 66 20 5f 5f 69 61 36 34 5f 5f 0a #ifdef __ia64__.
1bb0: 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 #define TRAMP_LE
1bc0: 4e 47 54 48 20 34 30 0a 23 64 65 66 69 6e 65 20 NGTH 40.#define
1bd0: 54 52 41 4d 50 5f 41 4c 49 47 4e 20 31 36 0a 23 TRAMP_ALIGN 16.#
1be0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 78 endif.#ifdef __x
1bf0: 38 36 5f 36 34 5f 5f 0a 23 64 65 66 69 6e 65 20 86_64__.#define
1c00: 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 33 32 0a TRAMP_LENGTH 32.
1c10: 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c #define TRAMP_AL
1c20: 49 47 4e 20 31 36 0a 23 65 6e 64 69 66 0a 23 69 IGN 16.#endif.#i
1c30: 66 64 65 66 20 5f 5f 73 33 39 30 5f 5f 0a 23 64 fdef __s390__.#d
1c40: 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47 efine TRAMP_LENG
1c50: 54 48 20 33 36 0a 23 64 65 66 69 6e 65 20 54 52 TH 36.#define TR
1c60: 41 4d 50 5f 41 4c 49 47 4e 20 32 0a 23 65 6e 64 AMP_ALIGN 2.#end
1c70: 69 66 0a 0a 23 69 66 6e 64 65 66 20 54 52 41 4d if..#ifndef TRAM
1c80: 50 5f 42 49 41 53 0a 23 64 65 66 69 6e 65 20 54 P_BIAS.#define T
1c90: 52 41 4d 50 5f 42 49 41 53 20 30 0a 23 65 6e 64 RAMP_BIAS 0.#end
1ca0: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 if..#if !defined
1cb0: 28 43 4f 44 45 5f 45 58 45 43 55 54 41 42 4c 45 (CODE_EXECUTABLE
1cc0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 45 58 ) && !defined(EX
1cd0: 45 43 55 54 41 42 4c 45 5f 56 49 41 5f 4d 50 52 ECUTABLE_VIA_MPR
1ce0: 4f 54 45 43 54 29 0a 2f 2a 20 41 49 58 20 64 6f OTECT)./* AIX do
1cf0: 65 73 6e 27 74 20 73 75 70 70 6f 72 74 20 6d 70 esn't support mp
1d00: 72 6f 74 65 63 74 28 29 20 69 6e 20 6d 61 6c 6c rotect() in mall
1d10: 6f 63 27 65 64 20 6d 65 6d 6f 72 79 2e 20 4d 75 oc'ed memory. Mu
1d20: 73 74 20 67 65 74 20 70 61 67 65 73 20 6f 66 0a st get pages of.
1d30: 20 2a 20 6d 65 6d 6f 72 79 20 77 69 74 68 20 65 * memory with e
1d40: 78 65 63 75 74 65 20 70 65 72 6d 69 73 73 69 6f xecute permissio
1d50: 6e 20 76 69 61 20 6d 6d 61 70 28 29 2e 20 54 68 n via mmap(). Th
1d60: 65 6e 20 6b 65 65 70 20 61 20 66 72 65 65 20 6c en keep a free l
1d70: 69 73 74 20 6f 66 0a 20 2a 20 66 72 65 65 20 74 ist of. * free t
1d80: 72 61 6d 70 6f 6c 69 6e 65 73 2e 0a 20 2a 2f 0a rampolines.. */.
1d90: 73 74 61 74 69 63 20 63 68 61 72 2a 20 66 72 65 static char* fre
1da0: 65 6c 69 73 74 20 3d 20 4e 55 4c 4c 3b 0a 23 65 elist = NULL;.#e
1db0: 6e 64 69 66 0a 0a 5f 5f 54 52 5f 66 75 6e 63 74 ndif..__TR_funct
1dc0: 69 6f 6e 20 61 6c 6c 6f 63 5f 74 72 61 6d 70 6f ion alloc_trampo
1dd0: 6c 69 6e 65 20 28 5f 5f 54 52 5f 66 75 6e 63 74 line (__TR_funct
1de0: 69 6f 6e 20 61 64 64 72 65 73 73 2c 20 76 6f 69 ion address, voi
1df0: 64 2a 20 76 61 72 69 61 62 6c 65 2c 20 76 6f 69 d* variable, voi
1e00: 64 2a 20 64 61 74 61 29 0a 7b 0a 20 20 63 68 61 d* data).{. cha
1e10: 72 2a 20 66 75 6e 63 74 69 6f 6e 3b 0a 0a 23 69 r* function;..#i
1e20: 66 20 21 64 65 66 69 6e 65 64 28 43 4f 44 45 5f f !defined(CODE_
1e30: 45 58 45 43 55 54 41 42 4c 45 29 0a 20 20 73 74 EXECUTABLE). st
1e40: 61 74 69 63 20 6c 6f 6e 67 20 70 61 67 65 73 69 atic long pagesi
1e50: 7a 65 20 3d 20 30 3b 0a 23 69 66 20 64 65 66 69 ze = 0;.#if defi
1e60: 6e 65 64 28 45 58 45 43 55 54 41 42 4c 45 5f 56 ned(EXECUTABLE_V
1e70: 49 41 5f 4d 4d 41 50 5f 44 45 56 5a 45 52 4f 29 IA_MMAP_DEVZERO)
1e80: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 7a 65 . static int ze
1e90: 72 6f 5f 66 64 3b 0a 23 65 6e 64 69 66 0a 20 20 ro_fd;.#endif.
1ea0: 2f 2a 20 46 69 72 73 74 2c 20 67 65 74 20 74 68 /* First, get th
1eb0: 65 20 70 61 67 65 20 73 69 7a 65 20 6f 6e 63 65 e page size once
1ec0: 20 61 6e 64 20 66 6f 72 20 61 6c 6c 2e 20 2a 2f and for all. */
1ed0: 0a 20 20 69 66 20 28 21 70 61 67 65 73 69 7a 65 . if (!pagesize
1ee0: 29 0a 20 20 20 20 7b 0a 23 69 66 20 64 65 66 69 ). {.#if defi
1ef0: 6e 65 64 28 48 41 56 45 5f 4d 41 43 48 5f 56 4d ned(HAVE_MACH_VM
1f00: 29 0a 20 20 20 20 20 20 70 61 67 65 73 69 7a 65 ). pagesize
1f10: 20 3d 20 76 6d 5f 70 61 67 65 5f 73 69 7a 65 3b = vm_page_size;
1f20: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 70 61 67 .#else. pag
1f30: 65 73 69 7a 65 20 3d 20 67 65 74 70 61 67 65 73 esize = getpages
1f40: 69 7a 65 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69 ize();.#endif.#i
1f50: 66 20 64 65 66 69 6e 65 64 28 45 58 45 43 55 54 f defined(EXECUT
1f60: 41 42 4c 45 5f 56 49 41 5f 4d 4d 41 50 5f 44 45 ABLE_VIA_MMAP_DE
1f70: 56 5a 45 52 4f 29 0a 20 20 20 20 20 20 7a 65 72 VZERO). zer
1f80: 6f 5f 66 64 20 3d 20 6f 70 65 6e 28 22 2f 64 65 o_fd = open("/de
1f90: 76 2f 7a 65 72 6f 22 2c 4f 5f 52 44 4f 4e 4c 59 v/zero",O_RDONLY
1fa0: 2c 30 36 34 34 29 3b 0a 20 20 20 20 20 20 69 66 ,0644);. if
1fb0: 20 28 7a 65 72 6f 5f 66 64 20 3c 20 30 29 0a 20 (zero_fd < 0).
1fc0: 20 20 20 20 20 20 20 7b 20 66 70 72 69 6e 74 66 { fprintf
1fd0: 28 73 74 64 65 72 72 2c 22 74 72 61 6d 70 6f 6c (stderr,"trampol
1fe0: 69 6e 65 3a 20 43 61 6e 6e 6f 74 20 6f 70 65 6e ine: Cannot open
1ff0: 20 2f 64 65 76 2f 7a 65 72 6f 21 5c 6e 22 29 3b /dev/zero!\n");
2000: 20 61 62 6f 72 74 28 29 3b 20 7d 0a 23 65 6e 64 abort(); }.#end
2010: 69 66 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a if. }.#endif.
2020: 0a 20 20 2f 2a 20 31 2e 20 41 6c 6c 6f 63 61 74 . /* 1. Allocat
2030: 65 20 72 6f 6f 6d 20 2a 2f 0a 0a 23 69 66 20 21 e room */..#if !
2040: 64 65 66 69 6e 65 64 28 43 4f 44 45 5f 45 58 45 defined(CODE_EXE
2050: 43 55 54 41 42 4c 45 29 20 26 26 20 21 64 65 66 CUTABLE) && !def
2060: 69 6e 65 64 28 45 58 45 43 55 54 41 42 4c 45 5f ined(EXECUTABLE_
2070: 56 49 41 5f 4d 50 52 4f 54 45 43 54 29 0a 20 20 VIA_MPROTECT).
2080: 69 66 20 28 66 72 65 65 6c 69 73 74 20 3d 3d 20 if (freelist ==
2090: 4e 55 4c 4c 29 0a 20 20 20 20 7b 20 2f 2a 20 47 NULL). { /* G
20a0: 65 74 20 61 20 6e 65 77 20 70 61 67 65 2e 20 2a et a new page. *
20b0: 2f 0a 20 20 20 20 20 20 63 68 61 72 2a 20 70 61 /. char* pa
20c0: 67 65 3b 0a 23 69 66 64 65 66 20 45 58 45 43 55 ge;.#ifdef EXECU
20d0: 54 41 42 4c 45 5f 56 49 41 5f 4d 4d 41 50 5f 41 TABLE_VIA_MMAP_A
20e0: 4e 4f 4e 59 4d 4f 55 53 0a 20 20 20 20 20 20 70 NONYMOUS. p
20f0: 61 67 65 20 3d 20 6d 6d 61 70 28 30 2c 20 70 61 age = mmap(0, pa
2100: 67 65 73 69 7a 65 2c 20 50 52 4f 54 5f 52 45 41 gesize, PROT_REA
2110: 44 20 7c 20 50 52 4f 54 5f 57 52 49 54 45 20 7c D | PROT_WRITE |
2120: 20 50 52 4f 54 5f 45 58 45 43 2c 20 4d 41 50 5f PROT_EXEC, MAP_
2130: 41 4e 4f 4e 59 4d 4f 55 53 20 7c 20 4d 41 50 5f ANONYMOUS | MAP_
2140: 56 41 52 49 41 42 4c 45 2c 20 2d 31 2c 20 30 29 VARIABLE, -1, 0)
2150: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 ;.#endif.#ifdef
2160: 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41 5f 4d EXECUTABLE_VIA_M
2170: 4d 41 50 5f 44 45 56 5a 45 52 4f 0a 20 20 20 20 MAP_DEVZERO.
2180: 20 20 70 61 67 65 20 3d 20 6d 6d 61 70 28 30 2c page = mmap(0,
2190: 20 70 61 67 65 73 69 7a 65 2c 20 50 52 4f 54 5f pagesize, PROT_
21a0: 52 45 41 44 20 7c 20 50 52 4f 54 5f 57 52 49 54 READ | PROT_WRIT
21b0: 45 20 7c 20 50 52 4f 54 5f 45 58 45 43 2c 20 4d E | PROT_EXEC, M
21c0: 41 50 5f 50 52 49 56 41 54 45 2c 20 7a 65 72 6f AP_PRIVATE, zero
21d0: 5f 66 64 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a _fd, 0);.#endif.
21e0: 23 69 66 64 65 66 20 45 58 45 43 55 54 41 42 4c #ifdef EXECUTABL
21f0: 45 5f 56 49 41 5f 53 48 4d 0a 20 20 20 20 20 20 E_VIA_SHM.
2200: 69 6e 74 20 73 68 6d 69 64 20 3d 20 73 68 6d 67 int shmid = shmg
2210: 65 74 28 49 50 43 5f 50 52 49 56 41 54 45 2c 20 et(IPC_PRIVATE,
2220: 70 61 67 65 73 69 7a 65 2c 20 30 37 30 30 7c 49 pagesize, 0700|I
2230: 50 43 5f 43 52 45 41 54 29 3b 0a 20 20 20 20 20 PC_CREAT);.
2240: 20 69 66 20 28 73 68 6d 69 64 3c 30 29 0a 20 20 if (shmid<0).
2250: 20 20 20 20 20 20 7b 20 70 61 67 65 20 3d 20 28 { page = (
2260: 63 68 61 72 2a 29 28 2d 31 29 3b 20 7d 0a 20 20 char*)(-1); }.
2270: 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 20 else.
2280: 20 7b 20 70 61 67 65 20 3d 20 73 68 6d 61 74 28 { page = shmat(
2290: 73 68 6d 69 64 2c 20 30 2c 20 30 29 3b 20 73 68 shmid, 0, 0); sh
22a0: 6d 63 74 6c 28 73 68 6d 69 64 2c 20 49 50 43 5f mctl(shmid, IPC_
22b0: 52 4d 49 44 2c 20 30 29 3b 20 7d 0a 23 65 6e 64 RMID, 0); }.#end
22c0: 69 66 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32 if.#ifdef _WIN32
22d0: 0a 20 20 20 20 20 20 70 61 67 65 20 3d 20 56 69 . page = Vi
22e0: 72 74 75 61 6c 41 6c 6c 6f 63 28 4e 55 4c 4c 2c rtualAlloc(NULL,
22f0: 20 70 61 67 65 73 69 7a 65 2c 20 4d 45 4d 5f 43 pagesize, MEM_C
2300: 4f 4d 4d 49 54 2c 20 50 41 47 45 5f 45 58 45 43 OMMIT, PAGE_EXEC
2310: 55 54 45 5f 52 45 41 44 57 52 49 54 45 29 3b 0a UTE_READWRITE);.
2320: 20 20 20 20 20 20 69 66 20 28 70 61 67 65 20 3d if (page =
2330: 3d 20 30 29 0a 20 20 20 20 20 20 09 7b 20 70 61 = 0). .{ pa
2340: 67 65 20 3d 20 28 63 68 61 72 2a 29 28 2d 31 29 ge = (char*)(-1)
2350: 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 ; }.#endif.
2360: 20 69 66 20 28 70 61 67 65 20 3d 3d 20 28 63 68 if (page == (ch
2370: 61 72 2a 29 28 2d 31 29 29 0a 20 20 20 20 20 20 ar*)(-1)).
2380: 20 20 7b 20 66 70 72 69 6e 74 66 28 73 74 64 65 { fprintf(stde
2390: 72 72 2c 22 74 72 61 6d 70 6f 6c 69 6e 65 3a 20 rr,"trampoline:
23a0: 4f 75 74 20 6f 66 20 76 69 72 74 75 61 6c 20 6d Out of virtual m
23b0: 65 6d 6f 72 79 21 5c 6e 22 29 3b 20 61 62 6f 72 emory!\n"); abor
23c0: 74 28 29 3b 20 7d 0a 20 20 20 20 20 20 2f 2a 20 t(); }. /*
23d0: 46 69 6c 6c 20 69 74 20 77 69 74 68 20 66 72 65 Fill it with fre
23e0: 65 20 74 72 61 6d 70 6f 6c 69 6e 65 73 2e 20 2a e trampolines. *
23f0: 2f 0a 20 20 20 20 20 20 7b 20 63 68 61 72 2a 2a /. { char**
2400: 20 6c 61 73 74 20 3d 20 26 66 72 65 65 6c 69 73 last = &freelis
2410: 74 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 2a t;. char*
2420: 20 70 61 67 65 5f 65 6e 64 20 3d 20 70 61 67 65 page_end = page
2430: 20 2b 20 70 61 67 65 73 69 7a 65 3b 0a 20 20 20 + pagesize;.
2440: 20 20 20 20 20 77 68 69 6c 65 20 28 70 61 67 65 while (page
2450: 2b 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 3c 3d +TRAMP_LENGTH <=
2460: 20 70 61 67 65 5f 65 6e 64 29 0a 20 20 20 20 20 page_end).
2470: 20 20 20 20 20 7b 20 2a 6c 61 73 74 20 3d 20 70 { *last = p
2480: 61 67 65 3b 20 6c 61 73 74 20 3d 20 28 63 68 61 age; last = (cha
2490: 72 2a 2a 29 70 61 67 65 3b 20 70 61 67 65 20 2b r**)page; page +
24a0: 3d 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 3b 20 = TRAMP_LENGTH;
24b0: 7d 0a 20 20 20 20 20 20 20 20 2a 6c 61 73 74 20 }. *last
24c0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 20 7d 0a = NULL;. } }.
24d0: 20 20 66 75 6e 63 74 69 6f 6e 20 3d 20 66 72 65 function = fre
24e0: 65 6c 69 73 74 3b 20 66 72 65 65 6c 69 73 74 20 elist; freelist
24f0: 3d 20 2a 28 63 68 61 72 2a 2a 29 66 72 65 65 6c = *(char**)freel
2500: 69 73 74 3b 0a 23 65 6c 73 65 0a 20 20 7b 20 63 ist;.#else. { c
2510: 68 61 72 2a 20 72 6f 6f 6d 20 3d 20 28 63 68 61 har* room = (cha
2520: 72 2a 29 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f r*) malloc(sizeo
2530: 66 28 76 6f 69 64 2a 29 20 2b 20 54 52 41 4d 50 f(void*) + TRAMP
2540: 5f 4c 45 4e 47 54 48 20 2b 20 54 52 41 4d 50 5f _LENGTH + TRAMP_
2550: 41 4c 49 47 4e 2d 31 29 3b 0a 20 20 20 20 69 66 ALIGN-1);. if
2560: 20 28 21 72 6f 6f 6d 29 0a 20 20 20 20 20 20 7b (!room). {
2570: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c fprintf(stderr,
2580: 22 74 72 61 6d 70 6f 6c 69 6e 65 3a 20 4f 75 74 "trampoline: Out
2590: 20 6f 66 20 76 69 72 74 75 61 6c 20 6d 65 6d 6f of virtual memo
25a0: 72 79 21 5c 6e 22 29 3b 20 61 62 6f 72 74 28 29 ry!\n"); abort()
25b0: 3b 20 7d 0a 20 20 20 20 66 75 6e 63 74 69 6f 6e ; }. function
25c0: 20 3d 20 28 63 68 61 72 2a 29 28 28 28 6c 6f 6e = (char*)(((lon
25d0: 67 29 72 6f 6f 6d 20 2b 20 73 69 7a 65 6f 66 28 g)room + sizeof(
25e0: 76 6f 69 64 2a 29 20 2b 20 54 52 41 4d 50 5f 41 void*) + TRAMP_A
25f0: 4c 49 47 4e 2d 31 29 20 26 20 2d 54 52 41 4d 50 LIGN-1) & -TRAMP
2600: 5f 41 4c 49 47 4e 29 3b 0a 20 20 20 20 28 28 63 _ALIGN);. ((c
2610: 68 61 72 2a 2a 29 66 75 6e 63 74 69 6f 6e 29 5b har**)function)[
2620: 2d 31 5d 20 3d 20 72 6f 6f 6d 3b 20 2f 2a 20 62 -1] = room; /* b
2630: 61 63 6b 70 6f 69 6e 74 65 72 20 66 6f 72 20 66 ackpointer for f
2640: 72 65 65 5f 74 72 61 6d 70 6f 6c 69 6e 65 28 29 ree_trampoline()
2650: 20 2a 2f 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a */. }.#endif..
2660: 20 20 2f 2a 20 32 2e 20 46 69 6c 6c 20 6f 75 74 /* 2. Fill out
2670: 20 74 68 65 20 74 72 61 6d 70 6f 6c 69 6e 65 20 the trampoline
2680: 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 69 33 38 36 */.#ifdef __i386
2690: 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e __. /* function
26a0: 3a 0a 20 20 20 2a 20 20 20 20 6d 6f 76 6c 20 24 :. * movl $
26b0: 3c 64 61 74 61 3e 2c 3c 76 61 72 69 61 62 6c 65 <data>,<variable
26c0: 3e 09 09 43 37 20 30 35 20 3c 76 61 72 69 61 62 >..C7 05 <variab
26d0: 6c 65 3e 20 3c 64 61 74 61 3e 0a 20 20 20 2a 20 le> <data>. *
26e0: 20 20 20 6a 6d 70 20 3c 61 64 64 72 65 73 73 3e jmp <address>
26f0: 09 09 09 45 39 20 3c 61 64 64 72 65 73 73 3e 2d ...E9 <address>-
2700: 3c 68 65 72 65 3e 0a 20 20 20 2a 20 68 65 72 65 <here>. * here
2710: 3a 0a 20 20 20 2a 2f 0a 20 20 2a 28 73 68 6f 72 :. */. *(shor
2720: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
2730: 20 30 29 20 3d 20 30 78 30 35 43 37 3b 0a 20 20 0) = 0x05C7;.
2740: 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 *(long *) (func
2750: 74 69 6f 6e 20 2b 20 32 29 20 3d 20 28 6c 6f 6e tion + 2) = (lon
2760: 67 29 20 76 61 72 69 61 62 6c 65 3b 0a 20 20 2a g) variable;. *
2770: 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 (long *) (funct
2780: 69 6f 6e 20 2b 20 36 29 20 3d 20 28 6c 6f 6e 67 ion + 6) = (long
2790: 29 20 64 61 74 61 3b 0a 20 20 2a 28 63 68 61 72 ) data;. *(char
27a0: 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b *) (function +
27b0: 31 30 29 20 3d 20 30 78 45 39 3b 0a 20 20 2a 28 10) = 0xE9;. *(
27c0: 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 long *) (functi
27d0: 6f 6e 20 2b 31 31 29 20 3d 20 28 6c 6f 6e 67 29 on +11) = (long)
27e0: 20 61 64 64 72 65 73 73 20 2d 20 28 6c 6f 6e 67 address - (long
27f0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 31 35 ) (function + 15
2800: 29 3b 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72 );.#define is_tr
2810: 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c amp(function) \
2820: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 . *(unsigned sh
2830: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ort *) (function
2840: 20 2b 20 30 29 20 3d 3d 20 30 78 30 35 43 37 20 + 0) == 0x05C7
2850: 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 && \. *(unsigne
2860: 64 20 63 68 61 72 20 2a 29 20 20 28 66 75 6e 63 d char *) (func
2870: 74 69 6f 6e 20 2b 31 30 29 20 3d 3d 20 30 78 45 tion +10) == 0xE
2880: 39 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 9.#define tramp_
2890: 61 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e address(function
28a0: 29 20 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 ) \. *(long *)
28b0: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 31 29 (function +11)
28c0: 20 2b 20 28 6c 6f 6e 67 29 20 28 66 75 6e 63 74 + (long) (funct
28d0: 69 6f 6e 20 2b 20 31 35 29 0a 23 64 65 66 69 6e ion + 15).#defin
28e0: 65 20 74 72 61 6d 70 5f 76 61 72 69 61 62 6c 65 e tramp_variable
28f0: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 (function) \.
2900: 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 *(long *) (func
2910: 74 69 6f 6e 20 2b 20 32 29 0a 23 64 65 66 69 6e tion + 2).#defin
2920: 65 20 74 72 61 6d 70 5f 64 61 74 61 28 66 75 6e e tramp_data(fun
2930: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 6c 6f ction) \. *(lo
2940: 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e ng *) (function
2950: 20 2b 20 36 29 0a 23 65 6e 64 69 66 0a 23 69 66 + 6).#endif.#if
2960: 64 65 66 20 5f 5f 6d 36 38 6b 5f 5f 0a 20 20 2f def __m68k__. /
2970: 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a * function:. *
2980: 20 20 20 20 6d 6f 76 65 6c 20 23 3c 64 61 74 61 movel #<data
2990: 3e 2c 3c 76 61 72 69 61 62 6c 65 3e 09 32 33 20 >,<variable>.23
29a0: 46 43 20 3c 64 61 74 61 3e 20 3c 76 61 72 69 61 FC <data> <varia
29b0: 62 6c 65 3e 0a 20 20 20 2a 20 20 20 20 6a 6d 70 ble>. * jmp
29c0: 20 3c 61 64 64 72 65 73 73 3e 09 09 09 34 45 20 <address>...4E
29d0: 46 39 20 3c 61 64 64 72 65 73 73 3e 0a 20 20 20 F9 <address>.
29e0: 2a 20 20 20 20 6e 6f 70 09 09 09 09 34 45 20 37 * nop....4E 7
29f0: 31 0a 20 20 20 2a 2f 0a 20 20 2a 28 73 68 6f 72 1. */. *(shor
2a00: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
2a10: 20 30 29 20 3d 20 30 78 32 33 46 43 3b 0a 20 20 0) = 0x23FC;.
2a20: 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 *(long *) (func
2a30: 74 69 6f 6e 20 2b 20 32 29 20 3d 20 28 6c 6f 6e tion + 2) = (lon
2a40: 67 29 20 64 61 74 61 3b 0a 20 20 2a 28 6c 6f 6e g) data;. *(lon
2a50: 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 g *) (function
2a60: 2b 20 36 29 20 3d 20 28 6c 6f 6e 67 29 20 76 61 + 6) = (long) va
2a70: 72 69 61 62 6c 65 3b 0a 20 20 2a 28 73 68 6f 72 riable;. *(shor
2a80: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
2a90: 31 30 29 20 3d 20 30 78 34 45 46 39 3b 0a 20 20 10) = 0x4EF9;.
2aa0: 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 *(long *) (func
2ab0: 74 69 6f 6e 20 2b 31 32 29 20 3d 20 28 6c 6f 6e tion +12) = (lon
2ac0: 67 29 20 61 64 64 72 65 73 73 3b 0a 20 20 2a 28 g) address;. *(
2ad0: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
2ae0: 6f 6e 20 2b 31 36 29 20 3d 20 30 78 34 45 37 31 on +16) = 0x4E71
2af0: 3b 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72 61 ;.#define is_tra
2b00: 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a mp(function) \.
2b10: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f *(unsigned sho
2b20: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
2b30: 2b 20 30 29 20 3d 3d 20 30 78 32 33 46 43 20 26 + 0) == 0x23FC &
2b40: 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 & \. *(unsigned
2b50: 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 short *) (funct
2b60: 69 6f 6e 20 2b 31 30 29 20 3d 3d 20 30 78 34 45 ion +10) == 0x4E
2b70: 46 39 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 F9 && \. *(unsi
2b80: 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 gned short *) (f
2b90: 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 3d 20 unction +16) ==
2ba0: 30 78 34 45 37 31 0a 23 64 65 66 69 6e 65 20 74 0x4E71.#define t
2bb0: 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75 6e ramp_address(fun
2bc0: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 6c 6f ction) \. *(lo
2bd0: 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e ng *) (function
2be0: 20 2b 31 32 29 0a 23 64 65 66 69 6e 65 20 74 72 +12).#define tr
2bf0: 61 6d 70 5f 76 61 72 69 61 62 6c 65 28 66 75 6e amp_variable(fun
2c00: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 6c 6f ction) \. *(lo
2c10: 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e ng *) (function
2c20: 20 2b 20 36 29 0a 23 64 65 66 69 6e 65 20 74 72 + 6).#define tr
2c30: 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 74 69 6f amp_data(functio
2c40: 6e 29 20 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a n) \. *(long *
2c50: 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 32 ) (function + 2
2c60: 29 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 ).#endif.#if def
2c70: 69 6e 65 64 28 5f 5f 6d 69 70 73 5f 5f 29 20 26 ined(__mips__) &
2c80: 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 6d 69 70 & !defined(__mip
2c90: 73 6e 33 32 5f 5f 29 0a 20 20 2f 2a 20 66 75 6e sn32__). /* fun
2ca0: 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 6c ction:. * l
2cb0: 69 20 24 32 2c 3c 64 61 74 61 3e 26 30 78 66 66 i $2,<data>&0xff
2cc0: 66 66 30 30 30 30 09 09 33 43 20 30 32 20 68 69 ff0000..3C 02 hi
2cd0: 31 36 28 3c 64 61 74 61 3e 29 0a 20 20 20 2a 20 16(<data>). *
2ce0: 20 20 20 6f 72 69 20 24 32 2c 24 32 2c 3c 64 61 ori $2,$2,<da
2cf0: 74 61 3e 26 30 78 66 66 66 66 09 09 33 34 20 34 ta>&0xffff..34 4
2d00: 32 20 6c 6f 31 36 28 3c 64 61 74 61 3e 29 0a 20 2 lo16(<data>).
2d10: 20 20 2a 20 20 20 20 73 77 20 24 32 2c 3c 76 61 * sw $2,<va
2d20: 72 69 61 62 6c 65 3e 09 09 33 43 20 30 31 20 68 riable>..3C 01 h
2d30: 69 31 36 28 3c 76 61 72 69 61 62 6c 65 3e 29 0a i16(<variable>).
2d40: 20 20 20 2a 20 20 20 20 09 09 09 09 41 43 20 32 * ....AC 2
2d50: 32 20 6c 6f 31 36 28 3c 76 61 72 69 61 62 6c 65 2 lo16(<variable
2d60: 3e 29 0a 20 20 20 2a 20 20 20 20 6c 69 20 24 32 >). * li $2
2d70: 35 2c 3c 61 64 64 72 65 73 73 3e 26 30 78 66 66 5,<address>&0xff
2d80: 66 66 30 30 30 30 09 33 43 20 31 39 20 68 69 31 ff0000.3C 19 hi1
2d90: 36 28 3c 61 64 64 72 65 73 73 3e 29 0a 20 20 20 6(<address>).
2da0: 2a 20 20 20 20 6f 72 69 20 24 32 35 2c 24 32 35 * ori $25,$25
2db0: 2c 3c 61 64 64 72 65 73 73 3e 26 30 78 66 66 66 ,<address>&0xfff
2dc0: 66 09 33 37 20 33 39 20 6c 6f 31 36 28 3c 61 64 f.37 39 lo16(<ad
2dd0: 64 72 65 73 73 3e 29 0a 20 20 20 2a 20 20 20 20 dress>). *
2de0: 6a 20 24 32 35 09 09 09 09 30 33 20 32 30 20 30 j $25....03 20 0
2df0: 30 20 30 38 0a 20 20 20 2a 20 20 20 20 6e 6f 70 0 08. * nop
2e00: 09 09 09 09 30 30 20 30 30 20 30 30 20 30 30 0a ....00 00 00 00.
2e10: 20 20 20 2a 2f 0a 20 20 2f 2a 20 57 68 61 74 20 */. /* What
2e20: 61 62 6f 75 74 20 62 69 67 20 65 6e 64 69 61 6e about big endian
2e30: 20 2f 20 6c 69 74 74 6c 65 20 65 6e 64 69 61 6e / little endian
2e40: 20 3f 3f 20 2a 2f 0a 20 20 2a 28 73 68 6f 72 74 ?? */. *(short
2e50: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 *) (function +
2e60: 30 29 20 3d 20 30 78 33 43 30 32 3b 0a 20 20 2a 0) = 0x3C02;. *
2e70: 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 (short *) (funct
2e80: 69 6f 6e 20 2b 20 32 29 20 3d 20 28 75 6e 73 69 ion + 2) = (unsi
2e90: 67 6e 65 64 20 6c 6f 6e 67 29 20 64 61 74 61 20 gned long) data
2ea0: 3e 3e 20 31 36 3b 0a 20 20 2a 28 73 68 6f 72 74 >> 16;. *(short
2eb0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 *) (function +
2ec0: 34 29 20 3d 20 30 78 33 34 34 32 3b 0a 20 20 2a 4) = 0x3442;. *
2ed0: 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 (short *) (funct
2ee0: 69 6f 6e 20 2b 20 36 29 20 3d 20 28 75 6e 73 69 ion + 6) = (unsi
2ef0: 67 6e 65 64 20 6c 6f 6e 67 29 20 64 61 74 61 20 gned long) data
2f00: 26 20 30 78 66 66 66 66 3b 0a 20 20 2a 28 73 68 & 0xffff;. *(sh
2f10: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ort *) (function
2f20: 20 2b 20 38 29 20 3d 20 30 78 33 43 30 31 3b 0a + 8) = 0x3C01;.
2f30: 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 *(short *) (fu
2f40: 6e 63 74 69 6f 6e 20 2b 31 30 29 20 3d 20 28 75 nction +10) = (u
2f50: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 76 61 nsigned long) va
2f60: 72 69 61 62 6c 65 20 3e 3e 20 31 36 3b 0a 20 20 riable >> 16;.
2f70: 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 *(short *) (func
2f80: 74 69 6f 6e 20 2b 31 32 29 20 3d 20 30 78 41 43 tion +12) = 0xAC
2f90: 32 32 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 22;. *(short *)
2fa0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 34 29 20 (function +14)
2fb0: 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 = (unsigned long
2fc0: 29 20 76 61 72 69 61 62 6c 65 20 26 20 30 78 66 ) variable & 0xf
2fd0: 66 66 66 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a fff;. *(short *
2fe0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 ) (function +16)
2ff0: 20 3d 20 30 78 33 43 31 39 3b 0a 20 20 2a 28 73 = 0x3C19;. *(s
3000: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f hort *) (functio
3010: 6e 20 2b 31 38 29 20 3d 20 28 75 6e 73 69 67 6e n +18) = (unsign
3020: 65 64 20 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 ed long) address
3030: 20 3e 3e 20 31 36 3b 0a 20 20 2a 28 73 68 6f 72 >> 16;. *(shor
3040: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
3050: 32 30 29 20 3d 20 30 78 33 37 33 39 3b 0a 20 20 20) = 0x3739;.
3060: 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 *(short *) (func
3070: 74 69 6f 6e 20 2b 32 32 29 20 3d 20 28 75 6e 73 tion +22) = (uns
3080: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64 72 igned long) addr
3090: 65 73 73 20 26 20 30 78 66 66 66 66 3b 0a 20 20 ess & 0xffff;.
30a0: 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 *(long *) (func
30b0: 74 69 6f 6e 20 2b 32 34 29 20 3d 20 30 78 30 33 tion +24) = 0x03
30c0: 32 30 30 30 30 38 3b 0a 20 20 2a 28 6c 6f 6e 67 200008;. *(long
30d0: 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b *) (function +
30e0: 32 38 29 20 3d 20 30 78 30 30 30 30 30 30 30 30 28) = 0x00000000
30f0: 3b 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72 61 ;.#define is_tra
3100: 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a mp(function) \.
3110: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f *(unsigned sho
3120: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
3130: 2b 20 30 29 20 3d 3d 20 30 78 33 43 30 32 20 26 + 0) == 0x3C02 &
3140: 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 & \. *(unsigned
3150: 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 short *) (funct
3160: 69 6f 6e 20 2b 20 34 29 20 3d 3d 20 30 78 33 34 ion + 4) == 0x34
3170: 34 32 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 42 && \. *(unsi
3180: 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 gned short *) (f
3190: 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 3d 20 unction + 8) ==
31a0: 30 78 33 43 30 31 20 26 26 20 5c 0a 20 20 2a 28 0x3C01 && \. *(
31b0: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a unsigned short *
31c0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 ) (function +12)
31d0: 20 3d 3d 20 30 78 41 43 32 32 20 26 26 20 5c 0a == 0xAC22 && \.
31e0: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f *(unsigned sho
31f0: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
3200: 2b 31 36 29 20 3d 3d 20 30 78 33 43 31 39 20 26 +16) == 0x3C19 &
3210: 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 & \. *(unsigned
3220: 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 short *) (funct
3230: 69 6f 6e 20 2b 32 30 29 20 3d 3d 20 30 78 33 37 ion +20) == 0x37
3240: 33 39 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 39 && \. *(unsi
3250: 67 6e 65 64 20 6c 6f 6e 67 20 2a 29 20 20 28 66 gned long *) (f
3260: 75 6e 63 74 69 6f 6e 20 2b 32 34 29 20 3d 3d 20 unction +24) ==
3270: 30 78 30 33 32 30 30 30 30 38 20 26 26 20 5c 0a 0x03200008 && \.
3280: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e *(unsigned lon
3290: 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 g *) (function
32a0: 2b 32 38 29 20 3d 3d 20 30 78 30 30 30 30 30 30 +28) == 0x000000
32b0: 30 30 0a 23 64 65 66 69 6e 65 20 68 69 6c 6f 28 00.#define hilo(
32c0: 68 69 77 6f 72 64 2c 6c 6f 77 6f 72 64 29 20 20 hiword,loword)
32d0: 5c 0a 20 20 28 28 28 75 6e 73 69 67 6e 65 64 20 \. (((unsigned
32e0: 6c 6f 6e 67 29 20 28 68 69 77 6f 72 64 29 20 3c long) (hiword) <
32f0: 3c 20 31 36 29 20 7c 20 28 75 6e 73 69 67 6e 65 < 16) | (unsigne
3300: 64 20 6c 6f 6e 67 29 20 28 6c 6f 77 6f 72 64 29 d long) (loword)
3310: 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f ).#define tramp_
3320: 61 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e address(function
3330: 29 20 20 5c 0a 20 20 68 69 6c 6f 28 2a 28 75 6e ) \. hilo(*(un
3340: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 signed short *)
3350: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 38 29 2c 20 (function +18),
3360: 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 *(unsigned short
3370: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 *) (function +2
3380: 32 29 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 2)).#define tram
3390: 70 5f 76 61 72 69 61 62 6c 65 28 66 75 6e 63 74 p_variable(funct
33a0: 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c 6f 28 2a ion) \. hilo(*
33b0: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 (unsigned short
33c0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 30 *) (function +10
33d0: 29 2c 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 ), *(unsigned sh
33e0: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ort *) (function
33f0: 20 2b 31 34 29 29 0a 23 64 65 66 69 6e 65 20 74 +14)).#define t
3400: 72 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 74 69 ramp_data(functi
3410: 6f 6e 29 20 20 5c 0a 20 20 68 69 6c 6f 28 2a 28 on) \. hilo(*(
3420: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a unsigned short *
3430: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 32 29 ) (function + 2)
3440: 2c 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f , *(unsigned sho
3450: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
3460: 2b 20 36 29 29 0a 23 65 6e 64 69 66 0a 23 69 66 + 6)).#endif.#if
3470: 64 65 66 20 5f 5f 6d 69 70 73 6e 33 32 5f 5f 0a def __mipsn32__.
3480: 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 /* function:.
3490: 20 20 2a 20 20 20 20 6c 77 20 24 32 2c 32 34 28 * lw $2,24(
34a0: 24 32 35 29 09 09 09 38 46 20 32 32 20 30 30 20 $25)...8F 22 00
34b0: 31 38 0a 20 20 20 2a 20 20 20 20 6c 77 20 24 33 18. * lw $3
34c0: 2c 32 38 28 24 32 35 29 09 09 09 38 46 20 32 33 ,28($25)...8F 23
34d0: 20 30 30 20 31 43 0a 20 20 20 2a 20 20 20 20 73 00 1C. * s
34e0: 77 20 24 33 2c 30 28 24 32 29 09 09 09 41 43 20 w $3,0($2)...AC
34f0: 34 33 20 30 30 20 30 30 0a 20 20 20 2a 20 20 20 43 00 00. *
3500: 20 6c 77 20 24 32 35 2c 33 32 28 24 32 35 29 09 lw $25,32($25).
3510: 09 09 38 46 20 33 39 20 30 30 20 32 30 0a 20 20 ..8F 39 00 20.
3520: 20 2a 20 20 20 20 6a 20 24 32 35 09 09 09 09 30 * j $25....0
3530: 33 20 32 30 20 30 30 20 30 38 0a 20 20 20 2a 20 3 20 00 08. *
3540: 20 20 20 6e 6f 70 09 09 09 09 30 30 20 30 30 20 nop....00 00
3550: 30 30 20 30 30 0a 20 20 20 2a 20 20 20 20 2e 77 00 00. * .w
3560: 6f 72 64 20 3c 76 61 72 69 61 62 6c 65 3e 09 09 ord <variable>..
3570: 3c 76 61 72 69 61 62 6c 65 3e 0a 20 20 20 2a 20 <variable>. *
3580: 20 20 20 2e 77 6f 72 64 20 3c 64 61 74 61 3e 09 .word <data>.
3590: 09 09 3c 64 61 74 61 3e 0a 20 20 20 2a 20 20 20 ..<data>. *
35a0: 20 2e 77 6f 72 64 20 3c 61 64 64 72 65 73 73 3e .word <address>
35b0: 09 09 09 3c 61 64 64 72 65 73 73 3e 0a 20 20 20 ...<address>.
35c0: 2a 2f 0a 20 20 2f 2a 20 57 68 61 74 20 61 62 6f */. /* What abo
35d0: 75 74 20 62 69 67 20 65 6e 64 69 61 6e 20 2f 20 ut big endian /
35e0: 6c 69 74 74 6c 65 20 65 6e 64 69 61 6e 20 3f 3f little endian ??
35f0: 20 2a 2f 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 */. *(unsigned
3600: 20 69 6e 74 20 2a 29 20 28 66 75 6e 63 74 69 6f int *) (functio
3610: 6e 20 2b 20 30 29 20 3d 20 30 78 38 46 32 32 30 n + 0) = 0x8F220
3620: 30 31 38 3b 0a 20 20 2a 28 75 6e 73 69 67 6e 65 018;. *(unsigne
3630: 64 20 69 6e 74 20 2a 29 20 28 66 75 6e 63 74 69 d int *) (functi
3640: 6f 6e 20 2b 20 34 29 20 3d 20 30 78 38 46 32 33 on + 4) = 0x8F23
3650: 30 30 31 43 3b 0a 20 20 2a 28 75 6e 73 69 67 6e 001C;. *(unsign
3660: 65 64 20 69 6e 74 20 2a 29 20 28 66 75 6e 63 74 ed int *) (funct
3670: 69 6f 6e 20 2b 20 38 29 20 3d 20 30 78 41 43 34 ion + 8) = 0xAC4
3680: 33 30 30 30 30 3b 0a 20 20 2a 28 75 6e 73 69 67 30000;. *(unsig
3690: 6e 65 64 20 69 6e 74 20 2a 29 20 28 66 75 6e 63 ned int *) (func
36a0: 74 69 6f 6e 20 2b 31 32 29 20 3d 20 30 78 38 46 tion +12) = 0x8F
36b0: 33 39 30 30 32 30 3b 0a 20 20 2a 28 75 6e 73 69 390020;. *(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 31 36 29 20 3d 20 30 78 30 ction +16) = 0x0
36e0: 33 32 30 30 30 30 38 3b 0a 20 20 2a 28 75 6e 73 3200008;. *(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 32 30 29 20 3d 20 30 78 nction +20) = 0x
3710: 30 30 30 30 30 30 30 30 3b 0a 20 20 2a 28 75 6e 00000000;. *(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 32 34 29 20 3d 20 28 unction +24) = (
3740: 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 76 61 unsigned int) va
3750: 72 69 61 62 6c 65 3b 0a 20 20 2a 28 75 6e 73 69 riable;. *(unsi
3760: 67 6e 65 64 20 69 6e 74 20 2a 29 20 28 66 75 6e gned int *) (fun
3770: 63 74 69 6f 6e 20 2b 32 38 29 20 3d 20 28 75 6e ction +28) = (un
3780: 73 69 67 6e 65 64 20 69 6e 74 29 20 64 61 74 61 signed int) data
3790: 3b 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 ;. *(unsigned i
37a0: 6e 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 nt *) (function
37b0: 2b 33 32 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 +32) = (unsigned
37c0: 20 69 6e 74 29 20 61 64 64 72 65 73 73 3b 0a 23 int) address;.#
37d0: 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 28 define is_tramp(
37e0: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a function) \. *
37f0: 28 69 6e 74 20 2a 29 20 20 20 20 20 20 20 20 20 (int *)
3800: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 (function + 0)
3810: 3d 3d 20 30 78 38 46 32 32 30 30 31 38 20 26 26 == 0x8F220018 &&
3820: 20 5c 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 \. *(int *)
3830: 20 20 20 20 20 20 20 28 66 75 6e 63 74 69 6f 6e (function
3840: 20 2b 20 34 29 20 3d 3d 20 30 78 38 46 32 33 30 + 4) == 0x8F230
3850: 30 31 43 20 26 26 20 5c 0a 20 20 2a 28 69 6e 74 01C && \. *(int
3860: 20 2a 29 20 20 20 20 20 20 20 20 20 20 28 66 75 *) (fu
3870: 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 3d 20 30 nction + 8) == 0
3880: 78 41 43 34 33 30 30 30 30 20 26 26 20 5c 0a 20 xAC430000 && \.
3890: 20 2a 28 69 6e 74 20 2a 29 20 20 20 20 20 20 20 *(int *)
38a0: 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 (function +12
38b0: 29 20 3d 3d 20 30 78 38 46 33 39 30 30 32 30 20 ) == 0x8F390020
38c0: 26 26 20 5c 0a 20 20 2a 28 69 6e 74 20 2a 29 20 && \. *(int *)
38d0: 20 20 20 20 20 20 20 20 20 28 66 75 6e 63 74 69 (functi
38e0: 6f 6e 20 2b 31 36 29 20 3d 3d 20 30 78 30 33 32 on +16) == 0x032
38f0: 30 30 30 30 38 20 26 26 20 5c 0a 20 20 2a 28 69 00008 && \. *(i
3900: 6e 74 20 2a 29 20 20 20 20 20 20 20 20 20 20 28 nt *) (
3910: 66 75 6e 63 74 69 6f 6e 20 2b 32 30 29 20 3d 3d function +20) ==
3920: 20 30 78 30 30 30 30 30 30 30 30 0a 23 64 65 66 0x00000000.#def
3930: 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 65 73 ine tramp_addres
3940: 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 s(function) \.
3950: 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 *(unsigned int
3960: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 33 32 *) (function +32
3970: 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f ).#define tramp_
3980: 76 61 72 69 61 62 6c 65 28 66 75 6e 63 74 69 6f variable(functio
3990: 6e 29 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e n) \. *(unsign
39a0: 65 64 20 69 6e 74 20 2a 29 20 28 66 75 6e 63 74 ed int *) (funct
39b0: 69 6f 6e 20 2b 32 34 29 0a 23 64 65 66 69 6e 65 ion +24).#define
39c0: 20 74 72 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 tramp_data(func
39d0: 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e 73 tion) \. *(uns
39e0: 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 28 66 75 igned int *) (fu
39f0: 6e 63 74 69 6f 6e 20 2b 32 38 29 0a 23 65 6e 64 nction +28).#end
3a00: 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d 69 70 73 if.#ifdef __mips
3a10: 36 34 6f 6c 64 5f 5f 0a 20 20 2f 2a 20 66 75 6e 64old__. /* fun
3a20: 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 64 ction:. * d
3a30: 6c 69 20 24 32 2c 3c 76 61 72 69 61 62 6c 65 3e li $2,<variable>
3a40: 09 09 33 43 20 30 32 20 68 69 31 36 28 68 69 33 ..3C 02 hi16(hi3
3a50: 32 28 3c 76 61 72 69 61 62 6c 65 3e 29 29 0a 20 2(<variable>)).
3a60: 20 20 2a 09 09 09 09 09 33 34 20 34 32 20 6c 6f *.....34 42 lo
3a70: 31 36 28 68 69 33 32 28 3c 76 61 72 69 61 62 6c 16(hi32(<variabl
3a80: 65 3e 29 29 0a 20 20 20 2a 09 09 09 09 09 30 30 e>)). *.....00
3a90: 20 30 32 20 31 34 20 33 38 0a 20 20 20 2a 09 09 02 14 38. *..
3aa0: 09 09 09 33 34 20 34 32 20 68 69 31 36 28 6c 6f ...34 42 hi16(lo
3ab0: 33 32 28 3c 76 61 72 69 61 62 6c 65 3e 29 29 0a 32(<variable>)).
3ac0: 20 20 20 2a 09 09 09 09 09 30 30 20 30 32 20 31 *.....00 02 1
3ad0: 34 20 33 38 0a 20 20 20 2a 09 09 09 09 09 33 34 4 38. *.....34
3ae0: 20 34 32 20 6c 6f 31 36 28 6c 6f 33 32 28 3c 76 42 lo16(lo32(<v
3af0: 61 72 69 61 62 6c 65 3e 29 29 0a 20 20 20 2a 20 ariable>)). *
3b00: 20 20 20 64 6c 69 20 24 33 2c 3c 64 61 74 61 3e dli $3,<data>
3b10: 09 09 09 33 43 20 30 33 20 68 69 31 36 28 68 69 ...3C 03 hi16(hi
3b20: 33 32 28 3c 64 61 74 61 3e 29 29 0a 20 20 20 2a 32(<data>)). *
3b30: 09 09 09 09 09 33 34 20 36 33 20 6c 6f 31 36 28 .....34 63 lo16(
3b40: 68 69 33 32 28 3c 64 61 74 61 3e 29 29 0a 20 20 hi32(<data>)).
3b50: 20 2a 09 09 09 09 09 30 30 20 30 33 20 31 43 20 *.....00 03 1C
3b60: 33 38 0a 20 20 20 2a 09 09 09 09 09 33 34 20 36 38. *.....34 6
3b70: 33 20 68 69 31 36 28 6c 6f 33 32 28 3c 64 61 74 3 hi16(lo32(<dat
3b80: 61 3e 29 29 0a 20 20 20 2a 09 09 09 09 09 30 30 a>)). *.....00
3b90: 20 30 33 20 31 43 20 33 38 0a 20 20 20 2a 09 09 03 1C 38. *..
3ba0: 09 09 09 33 34 20 36 33 20 6c 6f 31 36 28 6c 6f ...34 63 lo16(lo
3bb0: 33 32 28 3c 64 61 74 61 3e 29 29 0a 20 20 20 2a 32(<data>)). *
3bc0: 20 20 20 20 73 64 20 24 33 2c 30 28 24 32 29 09 sd $3,0($2).
3bd0: 09 09 46 43 20 34 33 20 30 30 20 30 30 0a 20 20 ..FC 43 00 00.
3be0: 20 2a 20 20 20 20 64 6c 69 20 24 32 35 2c 3c 61 * dli $25,<a
3bf0: 64 64 72 65 73 73 3e 09 09 33 43 20 31 39 20 68 ddress>..3C 19 h
3c00: 69 31 36 28 68 69 33 32 28 3c 61 64 64 72 65 73 i16(hi32(<addres
3c10: 73 3e 29 29 0a 20 20 20 2a 09 09 09 09 09 33 37 s>)). *.....37
3c20: 20 33 39 20 6c 6f 31 36 28 68 69 33 32 28 3c 61 39 lo16(hi32(<a
3c30: 64 64 72 65 73 73 3e 29 29 0a 20 20 20 2a 09 09 ddress>)). *..
3c40: 09 09 09 30 30 20 31 39 20 43 43 20 33 38 0a 20 ...00 19 CC 38.
3c50: 20 20 2a 09 09 09 09 09 33 37 20 33 39 20 68 69 *.....37 39 hi
3c60: 31 36 28 6c 6f 33 32 28 3c 61 64 64 72 65 73 73 16(lo32(<address
3c70: 3e 29 29 0a 20 20 20 2a 09 09 09 09 09 30 30 20 >)). *.....00
3c80: 31 39 20 43 43 20 33 38 0a 20 20 20 2a 09 09 09 19 CC 38. *...
3c90: 09 09 33 37 20 33 39 20 6c 6f 31 36 28 6c 6f 33 ..37 39 lo16(lo3
3ca0: 32 28 3c 61 64 64 72 65 73 73 3e 29 29 0a 20 20 2(<address>)).
3cb0: 20 2a 20 20 20 20 6a 20 24 32 35 09 09 09 09 30 * j $25....0
3cc0: 33 20 32 30 20 30 30 20 30 38 0a 20 20 20 2a 20 3 20 00 08. *
3cd0: 20 20 20 6e 6f 70 09 09 09 09 30 30 20 30 30 20 nop....00 00
3ce0: 30 30 20 30 30 0a 20 20 20 2a 2f 0a 20 20 2f 2a 00 00. */. /*
3cf0: 20 57 68 61 74 20 61 62 6f 75 74 20 62 69 67 20 What about big
3d00: 65 6e 64 69 61 6e 20 2f 20 6c 69 74 74 6c 65 20 endian / little
3d10: 65 6e 64 69 61 6e 20 3f 3f 20 2a 2f 0a 20 20 2a endian ?? */. *
3d20: 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 (short *) (funct
3d30: 69 6f 6e 20 2b 20 30 29 20 3d 20 30 78 33 43 30 ion + 0) = 0x3C0
3d40: 32 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 2;. *(short *)
3d50: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 32 29 20 3d (function + 2) =
3d60: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
3d70: 20 76 61 72 69 61 62 6c 65 20 3e 3e 20 34 38 3b variable >> 48;
3d80: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 . *(short *) (f
3d90: 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 20 30 unction + 4) = 0
3da0: 78 33 34 34 32 3b 0a 20 20 2a 28 73 68 6f 72 74 x3442;. *(short
3db0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 *) (function +
3dc0: 36 29 20 3d 20 28 28 75 6e 73 69 67 6e 65 64 20 6) = ((unsigned
3dd0: 6c 6f 6e 67 29 20 76 61 72 69 61 62 6c 65 20 3e long) variable >
3de0: 3e 20 33 32 29 20 26 20 30 78 66 66 66 66 3b 0a > 32) & 0xffff;.
3df0: 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 28 66 75 *(int *) (fu
3e00: 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 30 78 nction + 8) = 0x
3e10: 30 30 30 32 31 34 33 38 3b 0a 20 20 2a 28 73 68 00021438;. *(sh
3e20: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ort *) (function
3e30: 20 2b 31 32 29 20 3d 20 30 78 33 34 34 32 3b 0a +12) = 0x3442;.
3e40: 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 *(short *) (fu
3e50: 6e 63 74 69 6f 6e 20 2b 31 34 29 20 3d 20 28 28 nction +14) = ((
3e60: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 76 unsigned long) v
3e70: 61 72 69 61 62 6c 65 20 3e 3e 20 31 36 29 20 26 ariable >> 16) &
3e80: 20 30 78 66 66 66 66 3b 0a 20 20 2a 28 69 6e 74 0xffff;. *(int
3e90: 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 *) (function
3ea0: 2b 31 36 29 20 3d 20 30 78 30 30 30 32 31 34 33 +16) = 0x0002143
3eb0: 38 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 8;. *(short *)
3ec0: 28 66 75 6e 63 74 69 6f 6e 20 2b 32 30 29 20 3d (function +20) =
3ed0: 20 30 78 33 34 34 32 3b 0a 20 20 2a 28 73 68 6f 0x3442;. *(sho
3ee0: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
3ef0: 2b 32 32 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 +22) = (unsigned
3f00: 20 6c 6f 6e 67 29 20 76 61 72 69 61 62 6c 65 20 long) variable
3f10: 26 20 30 78 66 66 66 66 3b 0a 20 20 2a 28 73 68 & 0xffff;. *(sh
3f20: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ort *) (function
3f30: 20 2b 32 34 29 20 3d 20 30 78 33 43 30 33 3b 0a +24) = 0x3C03;.
3f40: 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 *(short *) (fu
3f50: 6e 63 74 69 6f 6e 20 2b 32 36 29 20 3d 20 28 75 nction +26) = (u
3f60: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 61 nsigned long) da
3f70: 74 61 20 3e 3e 20 34 38 3b 0a 20 20 2a 28 73 68 ta >> 48;. *(sh
3f80: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ort *) (function
3f90: 20 2b 32 38 29 20 3d 20 30 78 33 34 36 33 3b 0a +28) = 0x3463;.
3fa0: 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 *(short *) (fu
3fb0: 6e 63 74 69 6f 6e 20 2b 33 30 29 20 3d 20 28 28 nction +30) = ((
3fc0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 unsigned long) d
3fd0: 61 74 61 20 3e 3e 20 33 32 29 20 26 20 30 78 66 ata >> 32) & 0xf
3fe0: 66 66 66 3b 0a 20 20 2a 28 69 6e 74 20 2a 29 20 fff;. *(int *)
3ff0: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 33 32 29 (function +32)
4000: 20 3d 20 30 78 30 30 30 33 31 43 33 38 3b 0a 20 = 0x00031C38;.
4010: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e *(short *) (fun
4020: 63 74 69 6f 6e 20 2b 33 36 29 20 3d 20 30 78 33 ction +36) = 0x3
4030: 34 36 33 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 463;. *(short *
4040: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 33 38 29 ) (function +38)
4050: 20 3d 20 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f = ((unsigned lo
4060: 6e 67 29 20 64 61 74 61 20 3e 3e 20 31 36 29 20 ng) data >> 16)
4070: 26 20 30 78 66 66 66 66 3b 0a 20 20 2a 28 69 6e & 0xffff;. *(in
4080: 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e t *) (function
4090: 20 2b 34 30 29 20 3d 20 30 78 30 30 30 33 31 43 +40) = 0x00031C
40a0: 33 38 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 38;. *(short *)
40b0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 34 34 29 20 (function +44)
40c0: 3d 20 30 78 33 34 36 33 3b 0a 20 20 2a 28 73 68 = 0x3463;. *(sh
40d0: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ort *) (function
40e0: 20 2b 34 36 29 20 3d 20 28 75 6e 73 69 67 6e 65 +46) = (unsigne
40f0: 64 20 6c 6f 6e 67 29 20 64 61 74 61 20 26 20 30 d long) data & 0
4100: 78 66 66 66 66 3b 0a 20 20 2a 28 69 6e 74 20 2a xffff;. *(int *
4110: 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 34 ) (function +4
4120: 38 29 20 3d 20 30 78 46 43 34 33 30 30 30 30 3b 8) = 0xFC430000;
4130: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 . *(short *) (f
4140: 75 6e 63 74 69 6f 6e 20 2b 35 32 29 20 3d 20 30 unction +52) = 0
4150: 78 33 43 31 39 3b 0a 20 20 2a 28 73 68 6f 72 74 x3C19;. *(short
4160: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 35 *) (function +5
4170: 34 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 4) = (unsigned l
4180: 6f 6e 67 29 20 61 64 64 72 65 73 73 20 3e 3e 20 ong) address >>
4190: 34 38 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 48;. *(short *)
41a0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 35 36 29 20 (function +56)
41b0: 3d 20 30 78 33 37 33 39 3b 0a 20 20 2a 28 73 68 = 0x3739;. *(sh
41c0: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ort *) (function
41d0: 20 2b 35 38 29 20 3d 20 28 28 75 6e 73 69 67 6e +58) = ((unsign
41e0: 65 64 20 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 ed long) address
41f0: 20 3e 3e 20 33 32 29 20 26 20 30 78 66 66 66 66 >> 32) & 0xffff
4200: 3b 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 28 ;. *(int *) (
4210: 66 75 6e 63 74 69 6f 6e 20 2b 36 30 29 20 3d 20 function +60) =
4220: 30 78 30 30 31 39 43 43 33 38 3b 0a 20 20 2a 28 0x0019CC38;. *(
4230: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
4240: 6f 6e 20 2b 36 34 29 20 3d 20 30 78 33 37 33 39 on +64) = 0x3739
4250: 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 ;. *(short *) (
4260: 66 75 6e 63 74 69 6f 6e 20 2b 36 36 29 20 3d 20 function +66) =
4270: 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 ((unsigned long)
4280: 20 61 64 64 72 65 73 73 20 3e 3e 20 31 36 29 20 address >> 16)
4290: 26 20 30 78 66 66 66 66 3b 0a 20 20 2a 28 69 6e & 0xffff;. *(in
42a0: 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e t *) (function
42b0: 20 2b 36 38 29 20 3d 20 30 78 30 30 31 39 43 43 +68) = 0x0019CC
42c0: 33 38 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 38;. *(short *)
42d0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 37 32 29 20 (function +72)
42e0: 3d 20 30 78 33 37 33 39 3b 0a 20 20 2a 28 73 68 = 0x3739;. *(sh
42f0: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ort *) (function
4300: 20 2b 37 34 29 20 3d 20 28 75 6e 73 69 67 6e 65 +74) = (unsigne
4310: 64 20 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 20 d long) address
4320: 26 20 30 78 66 66 66 66 3b 0a 20 20 2a 28 69 6e & 0xffff;. *(in
4330: 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e t *) (function
4340: 20 2b 37 36 29 20 3d 20 30 78 30 33 32 30 30 30 +76) = 0x032000
4350: 30 38 3b 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 08;. *(int *)
4360: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 38 30 29 20 (function +80)
4370: 3d 20 30 78 30 30 30 30 30 30 30 30 3b 0a 23 64 = 0x00000000;.#d
4380: 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 28 66 efine is_tramp(f
4390: 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 unction) \. *(
43a0: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a unsigned short *
43b0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 ) (function + 0)
43c0: 20 3d 3d 20 30 78 33 43 30 32 20 26 26 20 5c 0a == 0x3C02 && \.
43d0: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f *(unsigned sho
43e0: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
43f0: 2b 20 34 29 20 3d 3d 20 30 78 33 34 34 32 20 26 + 4) == 0x3442 &
4400: 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 & \. *(unsigned
4410: 20 69 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74 int *) (funct
4420: 69 6f 6e 20 2b 20 38 29 20 3d 3d 20 30 78 30 30 ion + 8) == 0x00
4430: 30 32 31 34 33 38 20 26 26 20 5c 0a 20 20 2a 28 021438 && \. *(
4440: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a unsigned short *
4450: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 ) (function +12)
4460: 20 3d 3d 20 30 78 33 34 34 32 20 26 26 20 5c 0a == 0x3442 && \.
4470: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 *(unsigned int
4480: 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 *) (function
4490: 2b 31 36 29 20 3d 3d 20 30 78 30 30 30 32 31 34 +16) == 0x000214
44a0: 33 38 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 38 && \. *(unsi
44b0: 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 gned short *) (f
44c0: 75 6e 63 74 69 6f 6e 20 2b 32 30 29 20 3d 3d 20 unction +20) ==
44d0: 30 78 33 34 34 32 20 26 26 20 5c 0a 20 20 2a 28 0x3442 && \. *(
44e0: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a unsigned short *
44f0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 34 29 ) (function +24)
4500: 20 3d 3d 20 30 78 33 43 30 33 20 26 26 20 5c 0a == 0x3C03 && \.
4510: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f *(unsigned sho
4520: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
4530: 2b 32 38 29 20 3d 3d 20 30 78 33 34 36 33 20 26 +28) == 0x3463 &
4540: 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 & \. *(unsigned
4550: 20 69 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74 int *) (funct
4560: 69 6f 6e 20 2b 33 32 29 20 3d 3d 20 30 78 30 30 ion +32) == 0x00
4570: 30 33 31 43 33 38 20 26 26 20 5c 0a 20 20 2a 28 031C38 && \. *(
4580: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a unsigned short *
4590: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 33 36 29 ) (function +36)
45a0: 20 3d 3d 20 30 78 33 34 36 33 20 26 26 20 5c 0a == 0x3463 && \.
45b0: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 *(unsigned int
45c0: 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 *) (function
45d0: 2b 34 30 29 20 3d 3d 20 30 78 30 30 30 33 31 43 +40) == 0x00031C
45e0: 33 38 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 38 && \. *(unsi
45f0: 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 gned short *) (f
4600: 75 6e 63 74 69 6f 6e 20 2b 34 34 29 20 3d 3d 20 unction +44) ==
4610: 30 78 33 34 36 33 20 26 26 20 5c 0a 20 20 2a 28 0x3463 && \. *(
4620: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 unsigned int *)
4630: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 34 38 29 (function +48)
4640: 20 3d 3d 20 30 78 46 43 34 33 30 30 30 30 20 26 == 0xFC430000 &
4650: 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 & \. *(unsigned
4660: 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 short *) (funct
4670: 69 6f 6e 20 2b 35 32 29 20 3d 3d 20 30 78 33 43 ion +52) == 0x3C
4680: 31 39 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 19 && \. *(unsi
4690: 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 gned short *) (f
46a0: 75 6e 63 74 69 6f 6e 20 2b 35 36 29 20 3d 3d 20 unction +56) ==
46b0: 30 78 33 37 33 39 20 26 26 20 5c 0a 20 20 2a 28 0x3739 && \. *(
46c0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 unsigned int *)
46d0: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 36 30 29 (function +60)
46e0: 20 3d 3d 20 30 78 30 30 31 39 43 43 33 38 20 26 == 0x0019CC38 &
46f0: 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 & \. *(unsigned
4700: 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 short *) (funct
4710: 69 6f 6e 20 2b 36 34 29 20 3d 3d 20 30 78 33 37 ion +64) == 0x37
4720: 33 39 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 39 && \. *(unsi
4730: 67 6e 65 64 20 69 6e 74 20 2a 29 20 20 20 28 66 gned int *) (f
4740: 75 6e 63 74 69 6f 6e 20 2b 36 38 29 20 3d 3d 20 unction +68) ==
4750: 30 78 30 30 31 39 43 43 33 38 20 26 26 20 5c 0a 0x0019CC38 && \.
4760: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f *(unsigned sho
4770: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
4780: 2b 37 32 29 20 3d 3d 20 30 78 33 37 33 39 20 26 +72) == 0x3739 &
4790: 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 & \. *(unsigned
47a0: 20 69 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74 int *) (funct
47b0: 69 6f 6e 20 2b 37 36 29 20 3d 3d 20 30 78 30 33 ion +76) == 0x03
47c0: 32 30 30 30 30 38 20 26 26 20 5c 0a 20 20 2a 28 200008 && \. *(
47d0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 unsigned int *)
47e0: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 38 30 29 (function +80)
47f0: 20 3d 3d 20 30 78 30 30 30 30 30 30 30 30 0a 23 == 0x00000000.#
4800: 64 65 66 69 6e 65 20 68 69 6c 6f 28 77 6f 72 64 define hilo(word
4810: 33 2c 77 6f 72 64 32 2c 77 6f 72 64 31 2c 77 6f 3,word2,word1,wo
4820: 72 64 30 29 20 20 5c 0a 20 20 28 28 28 75 6e 73 rd0) \. (((uns
4830: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 77 6f 72 igned long) (wor
4840: 64 33 29 20 3c 3c 20 34 38 29 20 7c 20 28 28 75 d3) << 48) | ((u
4850: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 77 nsigned long) (w
4860: 6f 72 64 32 29 20 3c 3c 20 33 32 29 20 7c 20 5c ord2) << 32) | \
4870: 0a 20 20 20 28 28 75 6e 73 69 67 6e 65 64 20 6c . ((unsigned l
4880: 6f 6e 67 29 20 28 77 6f 72 64 31 29 20 3c 3c 20 ong) (word1) <<
4890: 31 36 29 20 7c 20 28 75 6e 73 69 67 6e 65 64 20 16) | (unsigned
48a0: 6c 6f 6e 67 29 20 28 77 6f 72 64 30 29 29 0a 23 long) (word0)).#
48b0: 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 define tramp_add
48c0: 72 65 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 ress(function)
48d0: 5c 0a 20 20 68 69 6c 6f 28 2a 28 75 6e 73 69 67 \. hilo(*(unsig
48e0: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 ned short *) (fu
48f0: 6e 63 74 69 6f 6e 20 2b 35 34 29 2c 20 5c 0a 20 nction +54), \.
4900: 20 20 20 20 20 20 2a 28 75 6e 73 69 67 6e 65 64 *(unsigned
4910: 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 short *) (funct
4920: 69 6f 6e 20 2b 35 38 29 2c 20 5c 0a 20 20 20 20 ion +58), \.
4930: 20 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 *(unsigned sh
4940: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ort *) (function
4950: 20 2b 36 36 29 2c 20 5c 0a 20 20 20 20 20 20 20 +66), \.
4960: 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 *(unsigned short
4970: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 37 *) (function +7
4980: 34 29 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 4)).#define tram
4990: 70 5f 76 61 72 69 61 62 6c 65 28 66 75 6e 63 74 p_variable(funct
49a0: 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c 6f 28 2a ion) \. hilo(*
49b0: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 (unsigned short
49c0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 32 *) (function + 2
49d0: 29 2c 20 5c 0a 20 20 20 20 20 20 20 2a 28 75 6e ), \. *(un
49e0: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 signed short *)
49f0: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 36 29 2c 20 (function + 6),
4a00: 5c 0a 20 20 20 20 20 20 20 2a 28 75 6e 73 69 67 \. *(unsig
4a10: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 ned short *) (fu
4a20: 6e 63 74 69 6f 6e 20 2b 31 34 29 2c 20 5c 0a 20 nction +14), \.
4a30: 20 20 20 20 20 20 2a 28 75 6e 73 69 67 6e 65 64 *(unsigned
4a40: 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 short *) (funct
4a50: 69 6f 6e 20 2b 32 32 29 29 0a 23 64 65 66 69 6e ion +22)).#defin
4a60: 65 20 74 72 61 6d 70 5f 64 61 74 61 28 66 75 6e e tramp_data(fun
4a70: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c 6f ction) \. hilo
4a80: 28 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 (*(unsigned shor
4a90: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
4aa0: 32 36 29 2c 20 5c 0a 20 20 20 20 20 20 20 2a 28 26), \. *(
4ab0: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a unsigned short *
4ac0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 33 30 29 ) (function +30)
4ad0: 2c 20 5c 0a 20 20 20 20 20 20 20 2a 28 75 6e 73 , \. *(uns
4ae0: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 igned short *) (
4af0: 66 75 6e 63 74 69 6f 6e 20 2b 33 38 29 2c 20 5c function +38), \
4b00: 0a 20 20 20 20 20 20 20 2a 28 75 6e 73 69 67 6e . *(unsign
4b10: 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e ed short *) (fun
4b20: 63 74 69 6f 6e 20 2b 34 36 29 29 0a 23 65 6e 64 ction +46)).#end
4b30: 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d 69 70 73 if.#ifdef __mips
4b40: 36 34 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 69 64__. /* functi
4b50: 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 6c 64 20 24 on:. * ld $
4b60: 32 2c 32 34 28 24 32 35 29 09 09 09 44 46 20 32 2,24($25)...DF 2
4b70: 32 20 30 30 20 31 38 0a 20 20 20 2a 20 20 20 20 2 00 18. *
4b80: 6c 64 20 24 33 2c 33 32 28 24 32 35 29 09 09 09 ld $3,32($25)...
4b90: 44 46 20 32 33 20 30 30 20 32 30 0a 20 20 20 2a DF 23 00 20. *
4ba0: 20 20 20 20 73 64 20 24 33 2c 30 28 24 32 29 09 sd $3,0($2).
4bb0: 09 09 46 43 20 34 33 20 30 30 20 30 30 0a 20 20 ..FC 43 00 00.
4bc0: 20 2a 20 20 20 20 6c 64 20 24 32 35 2c 34 30 28 * ld $25,40(
4bd0: 24 32 35 29 09 09 09 44 46 20 33 39 20 30 30 20 $25)...DF 39 00
4be0: 32 38 0a 20 20 20 2a 20 20 20 20 6a 20 24 32 35 28. * j $25
4bf0: 09 09 09 09 30 33 20 32 30 20 30 30 20 30 38 0a ....03 20 00 08.
4c00: 20 20 20 2a 20 20 20 20 6e 6f 70 09 09 09 09 30 * nop....0
4c10: 30 20 30 30 20 30 30 20 30 30 0a 20 20 20 2a 20 0 00 00 00. *
4c20: 20 20 20 2e 64 77 6f 72 64 20 3c 76 61 72 69 61 .dword <varia
4c30: 62 6c 65 3e 09 09 3c 76 61 72 69 61 62 6c 65 3e ble>..<variable>
4c40: 0a 20 20 20 2a 20 20 20 20 2e 64 77 6f 72 64 20 . * .dword
4c50: 3c 64 61 74 61 3e 09 09 09 3c 64 61 74 61 3e 0a <data>...<data>.
4c60: 20 20 20 2a 20 20 20 20 2e 64 77 6f 72 64 20 3c * .dword <
4c70: 61 64 64 72 65 73 73 3e 09 09 3c 61 64 64 72 65 address>..<addre
4c80: 73 73 3e 0a 20 20 20 2a 2f 0a 20 20 2f 2a 20 57 ss>. */. /* W
4c90: 68 61 74 20 61 62 6f 75 74 20 62 69 67 20 65 6e hat about big en
4ca0: 64 69 61 6e 20 2f 20 6c 69 74 74 6c 65 20 65 6e dian / little en
4cb0: 64 69 61 6e 20 3f 3f 20 2a 2f 0a 20 20 2a 28 6c dian ?? */. *(l
4cc0: 6f 6e 67 20 2a 29 20 20 20 20 20 20 20 20 20 20 ong *)
4cd0: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d (function + 0) =
4ce0: 20 30 78 44 46 32 32 30 30 31 38 44 46 32 33 30 0xDF220018DF230
4cf0: 30 32 30 4c 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 020L;. *(long *
4d00: 29 20 20 20 20 20 20 20 20 20 20 28 66 75 6e 63 ) (func
4d10: 74 69 6f 6e 20 2b 20 38 29 20 3d 20 30 78 46 43 tion + 8) = 0xFC
4d20: 34 33 30 30 30 30 44 46 33 39 30 30 32 38 4c 3b 430000DF390028L;
4d30: 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 20 20 . *(long *)
4d40: 20 20 20 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 (function
4d50: 2b 31 36 29 20 3d 20 30 78 30 33 32 30 30 30 30 +16) = 0x0320000
4d60: 38 30 30 30 30 30 30 30 30 4c 3b 0a 20 20 2a 28 800000000L;. *(
4d70: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 29 unsigned long *)
4d80: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 34 29 20 (function +24)
4d90: 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 = (unsigned long
4da0: 29 20 76 61 72 69 61 62 6c 65 3b 0a 20 20 2a 28 ) variable;. *(
4db0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 29 unsigned long *)
4dc0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 33 32 29 20 (function +32)
4dd0: 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 = (unsigned long
4de0: 29 20 64 61 74 61 3b 0a 20 20 2a 28 75 6e 73 69 ) data;. *(unsi
4df0: 67 6e 65 64 20 6c 6f 6e 67 20 2a 29 20 28 66 75 gned long *) (fu
4e00: 6e 63 74 69 6f 6e 20 2b 34 30 29 20 3d 20 28 75 nction +40) = (u
4e10: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 61 64 nsigned long) ad
4e20: 64 72 65 73 73 3b 0a 23 64 65 66 69 6e 65 20 69 dress;.#define i
4e30: 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e s_tramp(function
4e40: 29 20 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 ) \. *(long *)
4e50: 20 20 20 20 20 20 20 20 20 20 28 66 75 6e 63 74 (funct
4e60: 69 6f 6e 20 2b 20 30 29 20 3d 3d 20 30 78 44 46 ion + 0) == 0xDF
4e70: 32 32 30 30 31 38 44 46 32 33 30 30 32 30 4c 20 220018DF230020L
4e80: 26 26 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 && \. *(long *)
4e90: 20 20 20 20 20 20 20 20 20 20 28 66 75 6e 63 74 (funct
4ea0: 69 6f 6e 20 2b 20 38 29 20 3d 3d 20 30 78 46 43 ion + 8) == 0xFC
4eb0: 34 33 30 30 30 30 44 46 33 39 30 30 32 38 4c 20 430000DF390028L
4ec0: 26 26 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 && \. *(long *)
4ed0: 20 20 20 20 20 20 20 20 20 20 28 66 75 6e 63 74 (funct
4ee0: 69 6f 6e 20 2b 31 36 29 20 3d 3d 20 30 78 30 33 ion +16) == 0x03
4ef0: 32 30 30 30 30 38 30 30 30 30 30 30 30 30 4c 0a 20000800000000L.
4f00: 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 #define tramp_ad
4f10: 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 dress(function)
4f20: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 \. *(unsigned
4f30: 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f long *) (functio
4f40: 6e 20 2b 34 30 29 0a 23 64 65 66 69 6e 65 20 74 n +40).#define t
4f50: 72 61 6d 70 5f 76 61 72 69 61 62 6c 65 28 66 75 ramp_variable(fu
4f60: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 nction) \. *(u
4f70: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 29 20 nsigned long *)
4f80: 28 66 75 6e 63 74 69 6f 6e 20 2b 32 34 29 0a 23 (function +24).#
4f90: 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 define tramp_dat
4fa0: 61 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 a(function) \.
4fb0: 20 2a 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 *(unsigned long
4fc0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 33 *) (function +3
4fd0: 32 29 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 2).#endif.#if de
4fe0: 66 69 6e 65 64 28 5f 5f 73 70 61 72 63 5f 5f 29 fined(__sparc__)
4ff0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 73 && !defined(__s
5000: 70 61 72 63 36 34 5f 5f 29 0a 20 20 2f 2a 20 66 parc64__). /* f
5010: 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 unction:. *
5020: 20 73 65 74 68 69 20 25 68 69 28 3c 76 61 72 69 sethi %hi(<vari
5030: 61 62 6c 65 3e 29 2c 25 67 31 09 30 33 30 30 30 able>),%g1.03000
5040: 30 30 30 20 7c 20 28 3c 76 61 72 69 61 62 6c 65 000 | (<variable
5050: 3e 20 3e 3e 20 31 30 29 0a 20 20 20 2a 20 20 20 > >> 10). *
5060: 20 73 65 74 68 69 20 25 68 69 28 3c 64 61 74 61 sethi %hi(<data
5070: 3e 29 2c 25 67 32 09 09 30 35 30 30 30 30 30 30 >),%g2..05000000
5080: 20 7c 20 28 3c 64 61 74 61 3e 20 3e 3e 20 31 30 | (<data> >> 10
5090: 29 0a 20 20 20 2a 20 20 20 20 6f 72 20 25 67 32 ). * or %g2
50a0: 2c 25 6c 6f 28 3c 64 61 74 61 3e 29 2c 25 67 32 ,%lo(<data>),%g2
50b0: 09 09 38 34 31 30 41 30 30 30 20 7c 20 28 3c 64 ..8410A000 | (<d
50c0: 61 74 61 3e 20 26 20 30 78 33 66 66 29 0a 20 20 ata> & 0x3ff).
50d0: 20 2a 20 20 20 20 73 74 20 25 67 32 2c 5b 25 67 * st %g2,[%g
50e0: 31 2b 25 6c 6f 28 3c 76 61 72 69 61 62 6c 65 3e 1+%lo(<variable>
50f0: 29 5d 09 43 34 32 30 36 30 30 30 20 7c 20 28 3c )].C4206000 | (<
5100: 76 61 72 69 61 62 6c 65 3e 20 26 20 30 78 33 66 variable> & 0x3f
5110: 66 29 0a 20 20 20 2a 20 20 20 20 73 65 74 68 69 f). * sethi
5120: 20 25 68 69 28 3c 61 64 64 72 65 73 73 3e 29 2c %hi(<address>),
5130: 25 67 31 09 30 33 30 30 30 30 30 30 20 7c 20 28 %g1.03000000 | (
5140: 3c 61 64 64 72 65 73 73 3e 20 3e 3e 20 31 30 29 <address> >> 10)
5150: 0a 20 20 20 2a 20 20 20 20 6a 6d 70 20 25 67 31 . * jmp %g1
5160: 2b 25 6c 6f 28 3c 61 64 64 72 65 73 73 3e 29 09 +%lo(<address>).
5170: 09 38 31 43 30 36 30 30 30 20 7c 20 28 3c 61 64 .81C06000 | (<ad
5180: 64 72 65 73 73 3e 20 26 20 30 78 33 66 66 29 0a dress> & 0x3ff).
5190: 20 20 20 2a 20 20 20 20 6e 6f 70 09 09 09 09 30 * nop....0
51a0: 31 30 30 30 30 30 30 0a 20 20 20 2a 2f 0a 23 64 1000000. */.#d
51b0: 65 66 69 6e 65 20 68 69 28 77 6f 72 64 29 20 20 efine hi(word)
51c0: 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 ((unsigned long)
51d0: 20 28 77 6f 72 64 29 20 3e 3e 20 31 30 29 0a 23 (word) >> 10).#
51e0: 64 65 66 69 6e 65 20 6c 6f 28 77 6f 72 64 29 20 define lo(word)
51f0: 20 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 ((unsigned long
5200: 29 20 28 77 6f 72 64 29 20 26 20 30 78 33 66 66 ) (word) & 0x3ff
5210: 29 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 ). *(long *) (f
5220: 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20 30 unction + 0) = 0
5230: 78 30 33 30 30 30 30 30 30 20 7c 20 68 69 28 76 x03000000 | hi(v
5240: 61 72 69 61 62 6c 65 29 3b 0a 20 20 2a 28 6c 6f ariable);. *(lo
5250: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 ng *) (function
5260: 2b 20 34 29 20 3d 20 30 78 30 35 30 30 30 30 30 + 4) = 0x0500000
5270: 30 20 7c 20 68 69 28 64 61 74 61 29 3b 0a 20 20 0 | hi(data);.
5280: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 *(long *) (funct
5290: 69 6f 6e 20 2b 20 38 29 20 3d 20 30 78 38 34 31 ion + 8) = 0x841
52a0: 30 41 30 30 30 20 7c 20 6c 6f 28 64 61 74 61 29 0A000 | lo(data)
52b0: 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 ;. *(long *) (f
52c0: 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d 20 30 unction +12) = 0
52d0: 78 43 34 32 30 36 30 30 30 20 7c 20 6c 6f 28 76 xC4206000 | lo(v
52e0: 61 72 69 61 62 6c 65 29 3b 0a 20 20 2a 28 6c 6f ariable);. *(lo
52f0: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 ng *) (function
5300: 2b 31 36 29 20 3d 20 30 78 30 33 30 30 30 30 30 +16) = 0x0300000
5310: 30 20 7c 20 68 69 28 61 64 64 72 65 73 73 29 3b 0 | hi(address);
5320: 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 . *(long *) (fu
5330: 6e 63 74 69 6f 6e 20 2b 32 30 29 20 3d 20 30 78 nction +20) = 0x
5340: 38 31 43 30 36 30 30 30 20 7c 20 6c 6f 28 61 64 81C06000 | lo(ad
5350: 64 72 65 73 73 29 3b 0a 20 20 2a 28 6c 6f 6e 67 dress);. *(long
5360: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 *) (function +2
5370: 34 29 20 3d 20 30 78 30 31 30 30 30 30 30 30 3b 4) = 0x01000000;
5380: 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d .#define is_tram
5390: 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 p(function) \.
53a0: 20 28 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e (*(long *) (fun
53b0: 63 74 69 6f 6e 20 2b 20 30 29 20 26 20 30 78 66 ction + 0) & 0xf
53c0: 66 63 30 30 30 30 30 29 20 3d 3d 20 30 78 30 33 fc00000) == 0x03
53d0: 30 30 30 30 30 30 20 26 26 20 5c 0a 20 20 28 2a 000000 && \. (*
53e0: 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 (long *) (functi
53f0: 6f 6e 20 2b 20 34 29 20 26 20 30 78 66 66 63 30 on + 4) & 0xffc0
5400: 30 30 30 30 29 20 3d 3d 20 30 78 30 35 30 30 30 0000) == 0x05000
5410: 30 30 30 20 26 26 20 5c 0a 20 20 28 2a 28 6c 6f 000 && \. (*(lo
5420: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 ng *) (function
5430: 2b 20 38 29 20 26 20 30 78 66 66 66 66 66 63 30 + 8) & 0xfffffc0
5440: 30 29 20 3d 3d 20 30 78 38 34 31 30 41 30 30 30 0) == 0x8410A000
5450: 20 26 26 20 5c 0a 20 20 28 2a 28 6c 6f 6e 67 20 && \. (*(long
5460: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 *) (function +12
5470: 29 20 26 20 30 78 66 66 66 66 66 63 30 30 29 20 ) & 0xfffffc00)
5480: 3d 3d 20 30 78 43 34 32 30 36 30 30 30 20 26 26 == 0xC4206000 &&
5490: 20 5c 0a 20 20 28 2a 28 6c 6f 6e 67 20 2a 29 20 \. (*(long *)
54a0: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20 26 (function +16) &
54b0: 20 30 78 66 66 63 30 30 30 30 30 29 20 3d 3d 20 0xffc00000) ==
54c0: 30 78 30 33 30 30 30 30 30 30 20 26 26 20 5c 0a 0x03000000 && \.
54d0: 20 20 28 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 (*(long *) (fu
54e0: 6e 63 74 69 6f 6e 20 2b 32 30 29 20 26 20 30 78 nction +20) & 0x
54f0: 66 66 66 66 66 63 30 30 29 20 3d 3d 20 30 78 38 fffffc00) == 0x8
5500: 31 43 30 36 30 30 30 20 26 26 20 5c 0a 20 20 20 1C06000 && \.
5510: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 *(long *) (funct
5520: 69 6f 6e 20 2b 32 34 29 20 20 20 20 20 20 20 20 ion +24)
5530: 20 20 20 20 20 20 20 3d 3d 20 30 78 30 31 30 30 == 0x0100
5540: 30 30 30 30 0a 23 64 65 66 69 6e 65 20 68 69 6c 0000.#define hil
5550: 6f 28 68 69 77 6f 72 64 2c 6c 6f 77 6f 72 64 29 o(hiword,loword)
5560: 20 20 28 28 28 68 69 77 6f 72 64 29 20 3c 3c 20 (((hiword) <<
5570: 31 30 29 20 7c 20 28 28 6c 6f 77 6f 72 64 29 20 10) | ((loword)
5580: 26 20 30 78 33 66 66 29 29 0a 23 64 65 66 69 6e & 0x3ff)).#defin
5590: 65 20 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 e tramp_address(
55a0: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68 function) \. h
55b0: 69 6c 6f 28 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 ilo(*(long *) (f
55c0: 75 6e 63 74 69 6f 6e 20 2b 31 36 29 2c 20 2a 28 unction +16), *(
55d0: 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f long *) (functio
55e0: 6e 20 2b 32 30 29 29 0a 23 64 65 66 69 6e 65 20 n +20)).#define
55f0: 74 72 61 6d 70 5f 76 61 72 69 61 62 6c 65 28 66 tramp_variable(f
5600: 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69 unction) \. hi
5610: 6c 6f 28 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 lo(*(long *) (fu
5620: 6e 63 74 69 6f 6e 20 2b 20 30 29 2c 20 2a 28 6c nction + 0), *(l
5630: 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ong *) (function
5640: 20 2b 31 32 29 29 0a 23 64 65 66 69 6e 65 20 74 +12)).#define t
5650: 72 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 74 69 ramp_data(functi
5660: 6f 6e 29 20 20 5c 0a 20 20 68 69 6c 6f 28 2a 28 on) \. hilo(*(
5670: 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f long *) (functio
5680: 6e 20 2b 20 34 29 2c 20 2a 28 6c 6f 6e 67 20 2a n + 4), *(long *
5690: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 ) (function + 8)
56a0: 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 ).#endif.#ifdef
56b0: 5f 5f 73 70 61 72 63 36 34 5f 5f 0a 20 20 2f 2a __sparc64__. /*
56c0: 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 function:. *
56d0: 20 20 20 72 64 20 25 70 63 2c 25 67 31 09 09 09 rd %pc,%g1...
56e0: 38 33 34 31 34 30 30 30 0a 20 20 20 2a 20 20 20 83414000. *
56f0: 20 6c 64 78 20 5b 25 67 31 2b 32 34 5d 2c 25 67 ldx [%g1+24],%g
5700: 32 09 09 43 34 35 38 36 30 31 38 0a 20 20 20 2a 2..C4586018. *
5710: 20 20 20 20 6c 64 78 20 5b 25 67 31 2b 33 32 5d ldx [%g1+32]
5720: 2c 25 67 33 09 09 43 36 35 38 36 30 32 30 0a 20 ,%g3..C6586020.
5730: 20 20 2a 20 20 20 20 6c 64 78 20 5b 25 67 31 2b * ldx [%g1+
5740: 34 30 5d 2c 25 67 31 09 09 43 32 35 38 36 30 32 40],%g1..C258602
5750: 38 0a 20 20 20 2a 20 20 20 20 6a 6d 70 20 25 67 8. * jmp %g
5760: 31 09 09 09 09 38 31 43 30 34 30 30 30 0a 20 20 1....81C04000.
5770: 20 2a 20 20 20 20 73 74 78 20 25 67 33 2c 5b 25 * stx %g3,[%
5780: 67 32 5d 09 09 09 43 36 37 30 38 30 30 30 0a 20 g2]...C6708000.
5790: 20 20 2a 20 20 20 20 2e 6c 6f 6e 67 20 68 69 67 * .long hig
57a0: 68 33 32 28 3c 76 61 72 69 61 62 6c 65 3e 29 09 h32(<variable>).
57b0: 3c 76 61 72 69 61 62 6c 65 3e 20 3e 3e 20 33 32 <variable> >> 32
57c0: 0a 20 20 20 2a 20 20 20 20 2e 6c 6f 6e 67 20 6c . * .long l
57d0: 6f 77 33 32 28 3c 76 61 72 69 61 62 6c 65 3e 29 ow32(<variable>)
57e0: 09 09 3c 76 61 72 69 61 62 6c 65 3e 20 26 20 30 ..<variable> & 0
57f0: 78 66 66 66 66 66 66 66 66 0a 20 20 20 2a 20 20 xffffffff. *
5800: 20 20 2e 6c 6f 6e 67 20 68 69 67 68 33 32 28 3c .long high32(<
5810: 64 61 74 61 3e 29 09 09 3c 64 61 74 61 3e 20 3e data>)..<data> >
5820: 3e 20 33 32 0a 20 20 20 2a 20 20 20 20 2e 6c 6f > 32. * .lo
5830: 6e 67 20 6c 6f 77 33 32 28 3c 64 61 74 61 3e 29 ng low32(<data>)
5840: 09 09 3c 64 61 74 61 3e 20 26 20 30 78 66 66 66 ..<data> & 0xfff
5850: 66 66 66 66 66 0a 20 20 20 2a 20 20 20 20 2e 6c fffff. * .l
5860: 6f 6e 67 20 68 69 67 68 33 32 28 3c 61 64 64 72 ong high32(<addr
5870: 65 73 73 3e 29 09 09 3c 61 64 64 72 65 73 73 3e ess>)..<address>
5880: 20 3e 3e 20 33 32 0a 20 20 20 2a 20 20 20 20 2e >> 32. * .
5890: 6c 6f 6e 67 20 6c 6f 77 33 32 28 3c 61 64 64 72 long low32(<addr
58a0: 65 73 73 3e 29 09 09 3c 61 64 64 72 65 73 73 3e ess>)..<address>
58b0: 20 26 20 30 78 66 66 66 66 66 66 66 66 0a 20 20 & 0xffffffff.
58c0: 20 2a 2f 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 */. *(int *)
58d0: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d (function + 0) =
58e0: 20 30 78 38 33 34 31 34 30 30 30 3b 0a 20 20 2a 0x83414000;. *
58f0: 28 69 6e 74 20 2a 29 20 20 28 66 75 6e 63 74 69 (int *) (functi
5900: 6f 6e 20 2b 20 34 29 20 3d 20 30 78 43 34 35 38 on + 4) = 0xC458
5910: 36 30 31 38 3b 0a 20 20 2a 28 69 6e 74 20 2a 29 6018;. *(int *)
5920: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 (function + 8)
5930: 20 3d 20 30 78 43 36 35 38 36 30 32 30 3b 0a 20 = 0xC6586020;.
5940: 20 2a 28 69 6e 74 20 2a 29 20 20 28 66 75 6e 63 *(int *) (func
5950: 74 69 6f 6e 20 2b 31 32 29 20 3d 20 30 78 43 32 tion +12) = 0xC2
5960: 35 38 36 30 32 38 3b 0a 20 20 2a 28 69 6e 74 20 586028;. *(int
5970: 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 *) (function +1
5980: 36 29 20 3d 20 30 78 38 31 43 30 34 30 30 30 3b 6) = 0x81C04000;
5990: 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 28 66 75 . *(int *) (fu
59a0: 6e 63 74 69 6f 6e 20 2b 32 30 29 20 3d 20 30 78 nction +20) = 0x
59b0: 43 36 37 30 38 30 30 30 3b 0a 20 20 2a 28 6c 6f C6708000;. *(lo
59c0: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 ng *) (function
59d0: 2b 32 34 29 20 3d 20 28 6c 6f 6e 67 29 20 76 61 +24) = (long) va
59e0: 72 69 61 62 6c 65 3b 0a 20 20 2a 28 6c 6f 6e 67 riable;. *(long
59f0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 33 *) (function +3
5a00: 32 29 20 3d 20 28 6c 6f 6e 67 29 20 64 61 74 61 2) = (long) data
5a10: 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 ;. *(long *) (f
5a20: 75 6e 63 74 69 6f 6e 20 2b 34 30 29 20 3d 20 28 unction +40) = (
5a30: 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 3b 0a 23 long) address;.#
5a40: 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 28 define is_tramp(
5a50: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a function) \. *
5a60: 28 69 6e 74 20 2a 29 20 20 28 66 75 6e 63 74 69 (int *) (functi
5a70: 6f 6e 20 2b 20 30 29 20 3d 3d 20 30 78 38 33 34 on + 0) == 0x834
5a80: 31 34 30 30 30 20 26 26 20 5c 0a 20 20 2a 28 69 14000 && \. *(i
5a90: 6e 74 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e nt *) (function
5aa0: 20 2b 20 34 29 20 3d 3d 20 30 78 43 34 35 38 36 + 4) == 0xC4586
5ab0: 30 31 38 20 26 26 20 5c 0a 20 20 2a 28 69 6e 74 018 && \. *(int
5ac0: 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b *) (function +
5ad0: 20 38 29 20 3d 3d 20 30 78 43 36 35 38 36 30 32 8) == 0xC658602
5ae0: 30 20 26 26 20 5c 0a 20 20 2a 28 69 6e 74 20 2a 0 && \. *(int *
5af0: 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 ) (function +12
5b00: 29 20 3d 3d 20 30 78 43 32 35 38 36 30 32 38 20 ) == 0xC2586028
5b10: 26 26 20 5c 0a 20 20 2a 28 69 6e 74 20 2a 29 20 && \. *(int *)
5b20: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20 (function +16)
5b30: 3d 3d 20 30 78 38 31 43 30 34 30 30 30 20 26 26 == 0x81C04000 &&
5b40: 20 5c 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 28 \. *(int *) (
5b50: 66 75 6e 63 74 69 6f 6e 20 2b 32 30 29 20 3d 3d function +20) ==
5b60: 20 30 78 43 36 37 30 38 30 30 30 0a 23 64 65 66 0xC6708000.#def
5b70: 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 65 73 ine tramp_addres
5b80: 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 s(function) \.
5b90: 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 *(long *) (func
5ba0: 74 69 6f 6e 20 2b 34 30 29 0a 23 64 65 66 69 6e tion +40).#defin
5bb0: 65 20 74 72 61 6d 70 5f 76 61 72 69 61 62 6c 65 e tramp_variable
5bc0: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 (function) \.
5bd0: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 *(long *) (funct
5be0: 69 6f 6e 20 2b 32 34 29 0a 23 64 65 66 69 6e 65 ion +24).#define
5bf0: 20 74 72 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 tramp_data(func
5c00: 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 6c 6f 6e tion) \. *(lon
5c10: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b g *) (function +
5c20: 33 32 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 32).#endif.#ifde
5c30: 66 20 5f 5f 61 6c 70 68 61 5f 5f 0a 20 20 2f 2a f __alpha__. /*
5c40: 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 function:. *
5c50: 20 20 20 62 72 20 24 31 2c 66 75 6e 63 74 69 6f br $1,functio
5c60: 6e 2e 2e 6e 67 09 30 30 20 30 30 20 32 30 20 43 n..ng.00 00 20 C
5c70: 30 0a 20 20 20 2a 20 66 75 6e 63 74 69 6f 6e 2e 0. * function.
5c80: 2e 6e 67 3a 0a 20 20 20 2a 20 20 20 20 6c 64 71 .ng:. * ldq
5c90: 20 24 32 2c 32 30 28 24 31 29 09 09 31 34 20 30 $2,20($1)..14 0
5ca0: 30 20 34 31 20 41 34 0a 20 20 20 2a 20 20 20 20 0 41 A4. *
5cb0: 6c 64 71 20 24 33 2c 32 38 28 24 31 29 09 09 31 ldq $3,28($1)..1
5cc0: 43 20 30 30 20 36 31 20 41 34 0a 20 20 20 2a 20 C 00 61 A4. *
5cd0: 20 20 20 6c 64 71 20 24 32 37 2c 33 36 28 24 31 ldq $27,36($1
5ce0: 29 09 09 32 34 20 30 30 20 36 31 20 41 37 0a 20 )..24 00 61 A7.
5cf0: 20 20 2a 20 20 20 20 73 74 71 20 24 32 2c 30 28 * stq $2,0(
5d00: 24 33 29 09 09 30 30 20 30 30 20 34 33 20 42 34 $3)..00 00 43 B4
5d10: 0a 20 20 20 2a 20 20 20 20 6a 6d 70 20 24 33 31 . * jmp $31
5d20: 2c 28 24 32 37 29 2c 30 09 09 30 30 20 30 30 20 ,($27),0..00 00
5d30: 46 42 20 36 42 0a 20 20 20 2a 20 20 20 20 2e 71 FB 6B. * .q
5d40: 75 61 64 20 3c 64 61 74 61 3e 09 09 3c 64 61 74 uad <data>..<dat
5d50: 61 3e 0a 20 20 20 2a 20 20 20 20 2e 71 75 61 64 a>. * .quad
5d60: 20 3c 76 61 72 69 61 62 6c 65 3e 09 3c 76 61 72 <variable>.<var
5d70: 69 61 62 6c 65 3e 0a 20 20 20 2a 20 20 20 20 2e iable>. * .
5d80: 71 75 61 64 20 3c 61 64 64 72 65 73 73 3e 09 09 quad <address>..
5d90: 3c 61 64 64 72 65 73 73 3e 0a 20 20 20 2a 2f 0a <address>. */.
5da0: 20 20 7b 20 73 74 61 74 69 63 20 69 6e 74 20 63 { static int c
5db0: 6f 64 65 20 5b 36 5d 20 3d 0a 20 20 20 20 20 20 ode [6] =.
5dc0: 7b 20 30 78 43 30 32 30 30 30 30 30 2c 20 30 78 { 0xC0200000, 0x
5dd0: 41 34 34 31 30 30 31 34 2c 20 30 78 41 34 36 31 A4410014, 0xA461
5de0: 30 30 31 43 2c 20 30 78 41 37 36 31 30 30 32 34 001C, 0xA7610024
5df0: 2c 20 30 78 42 34 34 33 30 30 30 30 2c 20 30 78 , 0xB4430000, 0x
5e00: 36 42 46 42 30 30 30 30 20 7d 3b 0a 20 20 20 20 6BFB0000 };.
5e10: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 20 28 int i;. for (
5e20: 69 3d 30 3b 20 69 3c 36 3b 20 69 2b 2b 29 20 7b i=0; i<6; i++) {
5e30: 20 28 28 69 6e 74 20 2a 29 20 66 75 6e 63 74 69 ((int *) functi
5e40: 6f 6e 29 5b 69 5d 20 3d 20 63 6f 64 65 5b 69 5d on)[i] = code[i]
5e50: 3b 20 7d 0a 20 20 20 20 28 28 6c 6f 6e 67 20 2a ; }. ((long *
5e60: 29 20 66 75 6e 63 74 69 6f 6e 29 5b 33 5d 20 3d ) function)[3] =
5e70: 20 28 6c 6f 6e 67 29 20 64 61 74 61 3b 0a 20 20 (long) data;.
5e80: 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 ((long *) func
5e90: 74 69 6f 6e 29 5b 34 5d 20 3d 20 28 6c 6f 6e 67 tion)[4] = (long
5ea0: 29 20 76 61 72 69 61 62 6c 65 3b 0a 20 20 20 20 ) variable;.
5eb0: 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 ((long *) functi
5ec0: 6f 6e 29 5b 35 5d 20 3d 20 28 6c 6f 6e 67 29 20 on)[5] = (long)
5ed0: 61 64 64 72 65 73 73 3b 0a 20 20 7d 0a 23 64 65 address;. }.#de
5ee0: 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 28 66 75 fine is_tramp(fu
5ef0: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 28 69 nction) \. ((i
5f00: 6e 74 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b nt *) function)[
5f10: 30 5d 20 3d 3d 20 30 78 43 30 32 30 30 30 30 30 0] == 0xC0200000
5f20: 20 26 26 20 5c 0a 20 20 28 28 69 6e 74 20 2a 29 && \. ((int *)
5f30: 20 66 75 6e 63 74 69 6f 6e 29 5b 31 5d 20 3d 3d function)[1] ==
5f40: 20 30 78 41 34 34 31 30 30 31 34 20 26 26 20 5c 0xA4410014 && \
5f50: 0a 20 20 28 28 69 6e 74 20 2a 29 20 66 75 6e 63 . ((int *) func
5f60: 74 69 6f 6e 29 5b 32 5d 20 3d 3d 20 30 78 41 34 tion)[2] == 0xA4
5f70: 36 31 30 30 31 43 20 26 26 20 5c 0a 20 20 28 28 61001C && \. ((
5f80: 69 6e 74 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 int *) function)
5f90: 5b 33 5d 20 3d 3d 20 30 78 41 37 36 31 30 30 32 [3] == 0xA761002
5fa0: 34 20 26 26 20 5c 0a 20 20 28 28 69 6e 74 20 2a 4 && \. ((int *
5fb0: 29 20 66 75 6e 63 74 69 6f 6e 29 5b 34 5d 20 3d ) function)[4] =
5fc0: 3d 20 30 78 42 34 34 33 30 30 30 30 20 26 26 20 = 0xB4430000 &&
5fd0: 5c 0a 20 20 28 28 69 6e 74 20 2a 29 20 66 75 6e \. ((int *) fun
5fe0: 63 74 69 6f 6e 29 5b 35 5d 20 3d 3d 20 30 78 36 ction)[5] == 0x6
5ff0: 42 46 42 30 30 30 30 0a 23 64 65 66 69 6e 65 20 BFB0000.#define
6000: 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75 tramp_address(fu
6010: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 28 6c nction) \. ((l
6020: 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 ong *) function)
6030: 5b 35 5d 0a 23 64 65 66 69 6e 65 20 74 72 61 6d [5].#define tram
6040: 70 5f 76 61 72 69 61 62 6c 65 28 66 75 6e 63 74 p_variable(funct
6050: 69 6f 6e 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 ion) \. ((long
6060: 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 34 5d *) function)[4]
6070: 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 .#define tramp_d
6080: 61 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c ata(function) \
6090: 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e . ((long *) fun
60a0: 63 74 69 6f 6e 29 5b 33 5d 0a 23 65 6e 64 69 66 ction)[3].#endif
60b0: 0a 23 69 66 64 65 66 20 5f 5f 68 70 70 61 6f 6c .#ifdef __hppaol
60c0: 64 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f d__. /* functio
60d0: 6e 3a 0a 20 20 20 2a 20 20 20 20 6c 64 69 6c 20 n:. * ldil
60e0: 4c 27 3c 64 61 74 61 3e 2c 25 72 32 30 09 09 32 L'<data>,%r20..2
60f0: 32 38 30 30 30 30 30 20 7c 20 68 69 28 3c 64 61 2800000 | hi(<da
6100: 74 61 3e 29 0a 20 20 20 2a 20 20 20 20 6c 64 69 ta>). * ldi
6110: 6c 20 4c 27 3c 76 61 72 69 61 62 6c 65 3e 2c 25 l L'<variable>,%
6120: 72 31 39 09 09 32 32 36 30 30 30 30 30 20 7c 20 r19..22600000 |
6130: 68 69 28 3c 76 61 72 69 61 62 6c 65 3e 29 0a 20 hi(<variable>).
6140: 20 20 2a 20 20 20 20 6c 64 6f 20 52 27 3c 64 61 * ldo R'<da
6150: 74 61 3e 28 25 72 32 30 29 2c 25 72 32 30 09 09 ta>(%r20),%r20..
6160: 33 36 39 34 30 30 30 30 20 7c 20 6c 6f 28 3c 64 36940000 | lo(<d
6170: 61 74 61 3e 29 0a 20 20 20 2a 20 20 20 20 73 74 ata>). * st
6180: 77 20 25 72 32 30 2c 52 27 3c 76 61 72 69 61 62 w %r20,R'<variab
6190: 6c 65 3e 28 25 72 31 39 29 09 36 41 37 34 30 30 le>(%r19).6A7400
61a0: 30 30 20 7c 20 6c 6f 28 3c 76 61 72 69 61 62 6c 00 | lo(<variabl
61b0: 65 3e 29 0a 20 20 20 2a 20 20 20 20 6c 64 69 6c e>). * ldil
61c0: 20 4c 27 3c 61 64 64 72 65 73 73 3e 2c 25 72 32 L'<address>,%r2
61d0: 31 09 09 32 32 41 30 30 30 30 30 20 7c 20 68 69 1..22A00000 | hi
61e0: 28 3c 61 64 64 72 65 73 73 3e 29 0a 20 20 20 2a (<address>). *
61f0: 20 20 20 20 6c 64 6f 20 52 27 3c 61 64 64 72 65 ldo R'<addre
6200: 73 73 3e 28 25 72 32 31 29 2c 25 72 32 31 09 33 ss>(%r21),%r21.3
6210: 36 42 35 30 30 30 30 20 7c 20 6c 6f 28 3c 61 64 6B50000 | lo(<ad
6220: 64 72 65 73 73 3e 29 0a 20 20 20 2a 20 20 20 20 dress>). *
6230: 62 62 2c 3e 3d 2c 6e 20 25 72 32 31 2c 33 30 2c bb,>=,n %r21,30,
6240: 66 75 6e 63 74 69 6f 6e 32 09 43 37 44 35 43 30 function2.C7D5C0
6250: 31 32 0a 20 20 20 2a 20 20 20 20 64 65 70 69 20 12. * depi
6260: 30 2c 33 31 2c 32 2c 25 72 32 31 09 09 44 36 41 0,31,2,%r21..D6A
6270: 30 31 43 31 45 0a 20 20 20 2a 20 20 20 20 6c 64 01C1E. * ld
6280: 77 20 34 28 30 2c 25 72 32 31 29 2c 25 72 31 39 w 4(0,%r21),%r19
6290: 09 09 34 41 42 33 30 30 30 38 0a 20 20 20 2a 20 ..4AB30008. *
62a0: 20 20 20 6c 64 77 20 30 28 30 2c 25 72 32 31 29 ldw 0(0,%r21)
62b0: 2c 25 72 32 31 09 09 34 41 42 35 30 30 30 30 0a ,%r21..4AB50000.
62c0: 20 20 20 2a 20 66 75 6e 63 74 69 6f 6e 32 3a 0a * function2:.
62d0: 20 20 20 2a 20 20 20 20 6c 64 73 69 64 20 28 30 * ldsid (0
62e0: 2c 25 72 32 31 29 2c 25 72 31 09 09 30 32 41 30 ,%r21),%r1..02A0
62f0: 31 30 41 31 0a 20 20 20 2a 20 20 20 20 6d 74 73 10A1. * mts
6300: 70 20 25 72 31 2c 25 73 72 30 09 09 09 30 30 30 p %r1,%sr0...000
6310: 31 31 38 32 30 0a 20 20 20 2a 20 20 20 20 62 65 11820. * be
6320: 2c 6e 20 30 28 25 73 72 30 2c 25 72 32 31 29 09 ,n 0(%sr0,%r21).
6330: 09 45 32 41 30 30 30 30 32 0a 20 20 20 2a 20 20 .E2A00002. *
6340: 20 20 6e 6f 70 09 09 09 09 30 38 30 30 30 32 34 nop....0800024
6350: 30 0a 20 20 20 2a 2f 0a 20 20 2f 2a 20 57 68 65 0. */. /* Whe
6360: 6e 20 64 65 63 6f 64 69 6e 67 20 61 20 32 31 2d n decoding a 21-
6370: 62 69 74 20 61 72 67 75 6d 65 6e 74 20 69 6e 20 bit argument in
6380: 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 an instruction,
6390: 74 68 65 20 68 70 70 61 20 70 65 72 66 6f 72 6d the hppa perform
63a0: 73 0a 20 20 20 2a 20 74 68 65 20 66 6f 6c 6c 6f s. * the follo
63b0: 77 69 6e 67 20 62 69 74 20 6d 61 6e 69 70 75 6c wing bit manipul
63c0: 61 74 69 6f 6e 3a 0a 20 20 20 2a 20 61 73 73 65 ation:. * asse
63d0: 6d 62 6c 65 32 31 3a 20 78 5b 32 30 5d 2e 2e 2e mble21: x[20]...
63e0: 78 5b 30 5d 0a 20 20 20 2a 20 20 20 20 20 20 20 x[0]. *
63f0: 2d 2d 3e 20 78 5b 30 5d 20 78 5b 31 31 5d 2e 2e --> x[0] x[11]..
6400: 2e 78 5b 31 5d 20 78 5b 31 35 5d 2e 2e 78 5b 31 .x[1] x[15]..x[1
6410: 34 5d 20 78 5b 32 30 5d 2e 2e 2e 78 5b 31 36 5d 4] x[20]...x[16]
6420: 20 78 5b 31 33 5d 2e 2e 78 5b 31 32 5d 0a 20 20 x[13]..x[12].
6430: 20 2a 20 57 68 65 6e 20 65 6e 63 6f 64 69 6e 67 * When encoding
6440: 20 61 20 32 31 2d 62 69 74 20 61 72 67 75 6d 65 a 21-bit argume
6450: 6e 74 20 69 6e 74 6f 20 61 6e 20 69 6e 73 74 72 nt into an instr
6460: 75 63 74 69 6f 6e 2c 20 77 65 20 6e 65 65 64 20 uction, we need
6470: 74 68 65 0a 20 20 20 2a 20 74 6f 20 70 65 72 66 the. * to perf
6480: 6f 72 6d 20 74 68 65 20 72 65 76 65 72 73 65 20 orm the reverse
6490: 70 65 72 6d 75 74 61 74 69 6f 6e 3a 0a 20 20 20 permutation:.
64a0: 2a 20 70 65 72 6d 75 74 65 32 31 3a 20 20 79 5b * permute21: y[
64b0: 32 30 5d 2e 2e 2e 79 5b 30 5d 0a 20 20 20 2a 20 20]...y[0]. *
64c0: 20 20 20 20 20 20 2d 2d 3e 20 79 5b 36 5d 2e 2e --> y[6]..
64d0: 2e 79 5b 32 5d 20 79 5b 38 5d 2e 2e 79 5b 37 5d .y[2] y[8]..y[7]
64e0: 20 79 5b 31 5d 2e 2e 79 5b 30 5d 20 79 5b 31 39 y[1]..y[0] y[19
64f0: 5d 2e 2e 2e 79 5b 39 5d 20 79 5b 32 30 5d 0a 20 ]...y[9] y[20].
6500: 20 20 2a 2f 0a 23 64 65 66 69 6e 65 20 61 73 73 */.#define ass
6510: 65 6d 62 6c 65 32 31 28 78 29 20 20 5c 0a 20 20 emble21(x) \.
6520: 28 28 28 28 78 29 20 26 20 30 78 31 29 20 3c 3c ((((x) & 0x1) <<
6530: 20 32 30 29 20 7c 20 28 28 28 78 29 20 26 20 30 20) | (((x) & 0
6540: 78 46 46 45 29 20 3c 3c 20 38 29 20 7c 20 5c 0a xFFE) << 8) | \.
6550: 20 20 20 28 28 28 78 29 20 26 20 30 78 43 30 30 (((x) & 0xC00
6560: 30 29 20 3e 3e 20 37 29 20 7c 20 28 28 28 78 29 0) >> 7) | (((x)
6570: 20 26 20 30 78 31 46 30 30 30 30 29 20 3e 3e 20 & 0x1F0000) >>
6580: 31 34 29 20 7c 20 28 28 28 78 29 20 26 20 30 78 14) | (((x) & 0x
6590: 33 30 30 30 29 20 3e 3e 20 31 32 29 29 0a 23 64 3000) >> 12)).#d
65a0: 65 66 69 6e 65 20 70 65 72 6d 75 74 65 32 31 28 efine permute21(
65b0: 79 29 20 20 5c 0a 20 20 28 28 28 28 79 29 20 26 y) \. ((((y) &
65c0: 20 30 78 37 43 29 20 3c 3c 20 31 34 29 20 7c 20 0x7C) << 14) |
65d0: 28 28 28 79 29 20 26 20 30 78 31 38 30 29 20 3c (((y) & 0x180) <
65e0: 3c 20 37 29 20 7c 20 28 28 28 79 29 20 26 20 30 < 7) | (((y) & 0
65f0: 78 33 29 20 3c 3c 20 31 32 29 20 7c 20 5c 0a 20 x3) << 12) | \.
6600: 20 20 28 28 28 79 29 20 26 20 30 78 46 46 45 30 (((y) & 0xFFE0
6610: 30 29 20 3e 3e 20 38 29 20 7c 20 28 28 28 79 29 0) >> 8) | (((y)
6620: 20 26 20 30 78 31 30 30 30 30 30 29 20 3e 3e 20 & 0x100000) >>
6630: 32 30 29 29 0a 23 64 65 66 69 6e 65 20 68 69 28 20)).#define hi(
6640: 77 6f 72 64 29 20 20 70 65 72 6d 75 74 65 32 31 word) permute21
6650: 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 ((unsigned long)
6660: 20 28 77 6f 72 64 29 20 3e 3e 20 31 31 29 0a 23 (word) >> 11).#
6670: 64 65 66 69 6e 65 20 6c 6f 28 77 6f 72 64 29 20 define lo(word)
6680: 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e (((unsigned lon
6690: 67 29 20 28 77 6f 72 64 29 20 26 20 30 78 37 46 g) (word) & 0x7F
66a0: 46 29 20 3c 3c 20 31 29 0a 20 20 2a 28 6c 6f 6e F) << 1). *(lon
66b0: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b g *) (function +
66c0: 20 30 29 20 3d 20 30 78 32 32 38 30 30 30 30 30 0) = 0x22800000
66d0: 20 7c 20 68 69 28 64 61 74 61 29 3b 0a 20 20 2a | hi(data);. *
66e0: 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 (long *) (functi
66f0: 6f 6e 20 2b 20 34 29 20 3d 20 30 78 32 32 36 30 on + 4) = 0x2260
6700: 30 30 30 30 20 7c 20 68 69 28 76 61 72 69 61 62 0000 | hi(variab
6710: 6c 65 29 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 le);. *(long *)
6720: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 (function + 8)
6730: 3d 20 30 78 33 36 39 34 30 30 30 30 20 7c 20 6c = 0x36940000 | l
6740: 6f 28 64 61 74 61 29 3b 0a 20 20 2a 28 6c 6f 6e o(data);. *(lon
6750: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b g *) (function +
6760: 31 32 29 20 3d 20 30 78 36 41 37 34 30 30 30 30 12) = 0x6A740000
6770: 20 7c 20 6c 6f 28 76 61 72 69 61 62 6c 65 29 3b | lo(variable);
6780: 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 . *(long *) (fu
6790: 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20 30 78 nction +16) = 0x
67a0: 32 32 41 30 30 30 30 30 20 7c 20 68 69 28 61 64 22A00000 | hi(ad
67b0: 64 72 65 73 73 29 3b 0a 20 20 2a 28 6c 6f 6e 67 dress);. *(long
67c0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 *) (function +2
67d0: 30 29 20 3d 20 30 78 33 36 42 35 30 30 30 30 20 0) = 0x36B50000
67e0: 7c 20 6c 6f 28 61 64 64 72 65 73 73 29 3b 0a 20 | lo(address);.
67f0: 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 *(long *) (func
6800: 74 69 6f 6e 20 2b 32 34 29 20 3d 20 30 78 43 37 tion +24) = 0xC7
6810: 44 35 43 30 31 32 3b 0a 20 20 2a 28 6c 6f 6e 67 D5C012;. *(long
6820: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 *) (function +2
6830: 38 29 20 3d 20 30 78 44 36 41 30 31 43 31 45 3b 8) = 0xD6A01C1E;
6840: 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 . *(long *) (fu
6850: 6e 63 74 69 6f 6e 20 2b 33 32 29 20 3d 20 30 78 nction +32) = 0x
6860: 34 41 42 33 30 30 30 38 3b 0a 20 20 2a 28 6c 6f 4AB30008;. *(lo
6870: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 ng *) (function
6880: 2b 33 36 29 20 3d 20 30 78 34 41 42 35 30 30 30 +36) = 0x4AB5000
6890: 30 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 0;. *(long *) (
68a0: 66 75 6e 63 74 69 6f 6e 20 2b 34 30 29 20 3d 20 function +40) =
68b0: 30 78 30 32 41 30 31 30 41 31 3b 0a 20 20 2a 28 0x02A010A1;. *(
68c0: 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f long *) (functio
68d0: 6e 20 2b 34 34 29 20 3d 20 30 78 30 30 30 31 31 n +44) = 0x00011
68e0: 38 32 30 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 820;. *(long *)
68f0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 34 38 29 20 (function +48)
6900: 3d 20 30 78 45 32 41 30 30 30 30 32 3b 0a 20 20 = 0xE2A00002;.
6910: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 *(long *) (funct
6920: 69 6f 6e 20 2b 35 32 29 20 3d 20 30 78 30 38 30 ion +52) = 0x080
6930: 30 30 32 34 30 3b 0a 23 64 65 66 69 6e 65 20 69 00240;.#define i
6940: 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e s_tramp(function
6950: 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 29 20 66 ) \. ((long) f
6960: 75 6e 63 74 69 6f 6e 20 26 20 33 29 20 3d 3d 20 unction & 3) ==
6970: 30 20 26 26 20 5c 0a 20 20 28 2a 28 6c 6f 6e 67 0 && \. (*(long
6980: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 *) (function +
6990: 30 29 20 26 20 30 78 66 66 65 30 30 30 30 30 29 0) & 0xffe00000)
69a0: 20 3d 3d 20 30 78 32 32 38 30 30 30 30 30 20 26 == 0x22800000 &
69b0: 26 20 5c 0a 20 20 28 2a 28 6c 6f 6e 67 20 2a 29 & \. (*(long *)
69c0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 (function + 4)
69d0: 26 20 30 78 66 66 65 30 30 30 30 30 29 20 3d 3d & 0xffe00000) ==
69e0: 20 30 78 32 32 36 30 30 30 30 30 20 26 26 20 5c 0x22600000 && \
69f0: 0a 20 20 28 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 . (*(long *) (f
6a00: 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 26 20 30 unction + 8) & 0
6a10: 78 66 66 66 66 66 30 30 30 29 20 3d 3d 20 30 78 xfffff000) == 0x
6a20: 33 36 39 34 30 30 30 30 20 26 26 20 5c 0a 20 20 36940000 && \.
6a30: 28 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 (*(long *) (func
6a40: 74 69 6f 6e 20 2b 31 32 29 20 26 20 30 78 66 66 tion +12) & 0xff
6a50: 66 66 66 30 30 30 29 20 3d 3d 20 30 78 36 41 37 fff000) == 0x6A7
6a60: 34 30 30 30 30 20 26 26 20 5c 0a 20 20 28 2a 28 40000 && \. (*(
6a70: 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f long *) (functio
6a80: 6e 20 2b 31 36 29 20 26 20 30 78 66 66 65 30 30 n +16) & 0xffe00
6a90: 30 30 30 29 20 3d 3d 20 30 78 32 32 41 30 30 30 000) == 0x22A000
6aa0: 30 30 20 26 26 20 5c 0a 20 20 28 2a 28 6c 6f 6e 00 && \. (*(lon
6ab0: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b g *) (function +
6ac0: 32 30 29 20 26 20 30 78 66 66 66 66 66 30 30 30 20) & 0xfffff000
6ad0: 29 20 3d 3d 20 30 78 33 36 42 35 30 30 30 30 20 ) == 0x36B50000
6ae0: 26 26 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 && \. *(long *)
6af0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 34 29 20 (function +24)
6b00: 3d 3d 20 30 78 43 37 44 35 43 30 31 32 20 26 26 == 0xC7D5C012 &&
6b10: 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 \. *(long *) (
6b20: 66 75 6e 63 74 69 6f 6e 20 2b 32 38 29 20 3d 3d function +28) ==
6b30: 20 30 78 44 36 41 30 31 43 31 45 20 26 26 20 5c 0xD6A01C1E && \
6b40: 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 . *(long *) (fu
6b50: 6e 63 74 69 6f 6e 20 2b 33 32 29 20 3d 3d 20 30 nction +32) == 0
6b60: 78 34 41 42 33 30 30 30 38 20 26 26 20 5c 0a 20 x4AB30008 && \.
6b70: 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 *(long *) (func
6b80: 74 69 6f 6e 20 2b 33 36 29 20 3d 3d 20 30 78 34 tion +36) == 0x4
6b90: 41 42 35 30 30 30 30 20 26 26 20 5c 0a 20 20 2a AB50000 && \. *
6ba0: 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 (long *) (functi
6bb0: 6f 6e 20 2b 34 30 29 20 3d 3d 20 30 78 30 32 41 on +40) == 0x02A
6bc0: 30 31 30 41 31 20 26 26 20 5c 0a 20 20 2a 28 6c 010A1 && \. *(l
6bd0: 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ong *) (function
6be0: 20 2b 34 34 29 20 3d 3d 20 30 78 30 30 30 31 31 +44) == 0x00011
6bf0: 38 32 30 20 26 26 20 5c 0a 20 20 2a 28 6c 6f 6e 820 && \. *(lon
6c00: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b g *) (function +
6c10: 34 38 29 20 3d 3d 20 30 78 45 32 41 30 30 30 30 48) == 0xE2A0000
6c20: 32 20 26 26 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2 && \. *(long
6c30: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 35 32 *) (function +52
6c40: 29 20 3d 3d 20 30 78 30 38 30 30 30 32 34 30 0a ) == 0x08000240.
6c50: 23 64 65 66 69 6e 65 20 68 69 6c 6f 28 68 69 77 #define hilo(hiw
6c60: 6f 72 64 2c 6c 6f 77 6f 72 64 29 20 20 5c 0a 20 ord,loword) \.
6c70: 20 28 28 61 73 73 65 6d 62 6c 65 32 31 28 28 75 ((assemble21((u
6c80: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 68 nsigned long) (h
6c90: 69 77 6f 72 64 29 29 20 3c 3c 20 31 31 29 20 7c iword)) << 11) |
6ca0: 20 5c 0a 20 20 20 28 28 28 75 6e 73 69 67 6e 65 \. (((unsigne
6cb0: 64 20 6c 6f 6e 67 29 20 28 6c 6f 77 6f 72 64 29 d long) (loword)
6cc0: 20 26 20 30 78 46 46 45 29 20 3e 3e 20 31 29 20 & 0xFFE) >> 1)
6cd0: 5c 0a 20 20 29 0a 23 64 65 66 69 6e 65 20 74 72 \. ).#define tr
6ce0: 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75 6e 63 amp_address(func
6cf0: 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c 6f 28 tion) \. hilo(
6d00: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 *(long *) (funct
6d10: 69 6f 6e 20 2b 31 36 29 2c 20 2a 28 6c 6f 6e 67 ion +16), *(long
6d20: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 *) (function +2
6d30: 30 29 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 0)).#define tram
6d40: 70 5f 76 61 72 69 61 62 6c 65 28 66 75 6e 63 74 p_variable(funct
6d50: 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c 6f 28 2a ion) \. hilo(*
6d60: 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 (long *) (functi
6d70: 6f 6e 20 2b 20 34 29 2c 20 2a 28 6c 6f 6e 67 20 on + 4), *(long
6d80: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 *) (function +12
6d90: 29 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 )).#define tramp
6da0: 5f 64 61 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 _data(function)
6db0: 20 5c 0a 20 20 68 69 6c 6f 28 2a 28 6c 6f 6e 67 \. hilo(*(long
6dc0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 *) (function +
6dd0: 30 29 2c 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 0), *(long *) (f
6de0: 75 6e 63 74 69 6f 6e 20 2b 20 38 29 29 0a 23 65 unction + 8)).#e
6df0: 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 68 70 ndif.#ifdef __hp
6e00: 70 61 6e 65 77 5f 5f 0a 20 20 2f 2a 20 66 75 6e panew__. /* fun
6e10: 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 2e ction:. * .
6e20: 6c 6f 6e 67 20 20 20 74 72 61 6d 70 0a 20 20 20 long tramp.
6e30: 2a 20 20 20 20 2e 6c 6f 6e 67 20 20 20 63 6c 6f * .long clo
6e40: 73 75 72 65 0a 20 20 20 2a 20 63 6c 6f 73 75 72 sure. * closur
6e50: 65 3a 0a 20 20 20 2a 20 20 20 20 2e 6c 6f 6e 67 e:. * .long
6e60: 20 20 20 3c 76 61 72 69 61 62 6c 65 3e 0a 20 20 <variable>.
6e70: 20 2a 20 20 20 20 2e 6c 6f 6e 67 20 20 20 3c 64 * .long <d
6e80: 61 74 61 3e 0a 20 20 20 2a 20 20 20 20 2e 6c 6f ata>. * .lo
6e90: 6e 67 20 20 20 3c 61 64 64 72 65 73 73 3e 0a 20 ng <address>.
6ea0: 20 20 2a 2f 0a 20 20 7b 20 2f 2a 20 77 6f 72 6b */. { /* work
6eb0: 20 61 72 6f 75 6e 64 20 61 20 62 75 67 20 69 6e around a bug in
6ec0: 20 67 63 63 20 33 2e 2a 20 2a 2f 0a 20 20 20 20 gcc 3.* */.
6ed0: 76 6f 69 64 2a 20 74 72 61 6d 70 5f 61 64 64 72 void* tramp_addr
6ee0: 65 73 73 20 3d 20 26 74 72 61 6d 70 3b 0a 20 20 ess = &tramp;.
6ef0: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e *(long *) (fun
6f00: 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20 28 28 6c ction + 0) = ((l
6f10: 6f 6e 67 20 2a 29 20 28 28 63 68 61 72 2a 29 74 ong *) ((char*)t
6f20: 72 61 6d 70 5f 61 64 64 72 65 73 73 2d 32 29 29 ramp_address-2))
6f30: 5b 30 5d 3b 0a 20 20 20 20 2a 28 6c 6f 6e 67 20 [0];. *(long
6f40: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 *) (function + 4
6f50: 29 20 3d 20 28 6c 6f 6e 67 29 20 28 66 75 6e 63 ) = (long) (func
6f60: 74 69 6f 6e 20 2b 20 38 29 3b 0a 20 20 20 20 2a tion + 8);. *
6f70: 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 (long *) (functi
6f80: 6f 6e 20 2b 20 38 29 20 3d 20 28 6c 6f 6e 67 29 on + 8) = (long)
6f90: 20 76 61 72 69 61 62 6c 65 3b 0a 20 20 20 20 2a variable;. *
6fa0: 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 (long *) (functi
6fb0: 6f 6e 20 2b 31 32 29 20 3d 20 28 6c 6f 6e 67 29 on +12) = (long)
6fc0: 20 64 61 74 61 3b 0a 20 20 20 20 2a 28 6c 6f 6e data;. *(lon
6fd0: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b g *) (function +
6fe0: 31 36 29 20 3d 20 28 6c 6f 6e 67 29 20 61 64 64 16) = (long) add
6ff0: 72 65 73 73 3b 0a 20 20 7d 0a 23 64 65 66 69 6e ress;. }.#defin
7000: 65 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 e is_tramp(funct
7010: 69 6f 6e 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 ion) \. ((long
7020: 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 30 5d *) function)[0]
7030: 20 3d 3d 20 28 28 6c 6f 6e 67 20 2a 29 20 28 28 == ((long *) ((
7040: 63 68 61 72 2a 29 74 72 61 6d 70 5f 61 64 64 72 char*)tramp_addr
7050: 65 73 73 2d 32 29 29 5b 30 5d 0a 23 64 65 66 69 ess-2))[0].#defi
7060: 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 65 73 73 ne tramp_address
7070: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 (function) \.
7080: 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 ((long *) functi
7090: 6f 6e 29 5b 34 5d 0a 23 64 65 66 69 6e 65 20 74 on)[4].#define t
70a0: 72 61 6d 70 5f 76 61 72 69 61 62 6c 65 28 66 75 ramp_variable(fu
70b0: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 28 6c nction) \. ((l
70c0: 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 ong *) function)
70d0: 5b 32 5d 0a 23 64 65 66 69 6e 65 20 74 72 61 6d [2].#define tram
70e0: 70 5f 64 61 74 61 28 66 75 6e 63 74 69 6f 6e 29 p_data(function)
70f0: 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 20 \. ((long *)
7100: 66 75 6e 63 74 69 6f 6e 29 5b 33 5d 0a 23 65 6e function)[3].#en
7110: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 61 72 6d dif.#ifdef __arm
7120: 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e __. /* function
7130: 3a 0a 20 20 20 2a 09 73 74 6d 66 64 09 73 70 21 :. *.stmfd.sp!
7140: 2c 7b 72 30 7d 09 09 45 39 32 44 30 30 30 31 0a ,{r0}..E92D0001.
7150: 20 20 20 2a 20 09 6c 64 72 09 72 30 2c 5b 70 63 * .ldr.r0,[pc
7160: 2c 23 31 36 5d 09 09 45 35 39 46 30 30 30 43 0a ,#16]..E59F000C.
7170: 20 20 20 2a 09 6c 64 72 09 69 70 2c 5b 70 63 2c *.ldr.ip,[pc,
7180: 23 31 36 5d 09 09 45 35 39 46 43 30 30 43 0a 20 #16]..E59FC00C.
7190: 20 20 2a 09 73 74 72 09 72 30 2c 5b 69 70 5d 09 *.str.r0,[ip].
71a0: 09 09 45 35 38 43 30 30 30 30 0a 20 20 20 2a 09 ..E58C0000. *.
71b0: 6c 64 6d 66 64 09 73 70 21 2c 7b 72 30 7d 09 09 ldmfd.sp!,{r0}..
71c0: 45 38 42 44 30 30 30 31 0a 20 20 20 2a 09 6c 64 E8BD0001. *.ld
71d0: 72 09 70 63 2c 5b 70 63 2c 23 34 5d 09 09 45 35 r.pc,[pc,#4]..E5
71e0: 39 46 46 30 30 34 0a 20 20 20 2a 20 5f 64 61 74 9FF004. * _dat
71f0: 61 3a 0a 20 20 20 2a 09 2e 77 6f 72 64 09 3c 64 a:. *..word.<d
7200: 61 74 61 3e 0a 20 20 20 2a 20 5f 76 61 72 69 61 ata>. * _varia
7210: 62 6c 65 3a 0a 20 20 20 2a 09 2e 77 6f 72 64 09 ble:. *..word.
7220: 3c 76 61 72 69 61 62 6c 65 3e 0a 20 20 20 2a 20 <variable>. *
7230: 5f 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 09 _function:. *.
7240: 2e 77 6f 72 64 09 3c 61 64 64 72 65 73 73 3e 0a .word.<address>.
7250: 20 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 28 28 */. {. ((
7260: 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e long *) function
7270: 29 5b 30 5d 20 3d 20 30 78 45 39 32 44 30 30 30 )[0] = 0xE92D000
7280: 31 3b 0a 20 20 20 20 28 28 6c 6f 6e 67 20 2a 29 1;. ((long *)
7290: 20 66 75 6e 63 74 69 6f 6e 29 5b 31 5d 20 3d 20 function)[1] =
72a0: 30 78 45 35 39 46 30 30 30 43 3b 0a 20 20 20 20 0xE59F000C;.
72b0: 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 ((long *) functi
72c0: 6f 6e 29 5b 32 5d 20 3d 20 30 78 45 35 39 46 43 on)[2] = 0xE59FC
72d0: 30 30 43 3b 0a 20 20 20 20 28 28 6c 6f 6e 67 20 00C;. ((long
72e0: 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 33 5d 20 *) function)[3]
72f0: 3d 20 30 78 45 35 38 43 30 30 30 30 3b 0a 20 20 = 0xE58C0000;.
7300: 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 ((long *) func
7310: 74 69 6f 6e 29 5b 34 5d 20 3d 20 30 78 45 38 42 tion)[4] = 0xE8B
7320: 44 30 30 30 31 3b 0a 20 20 20 20 28 28 6c 6f 6e D0001;. ((lon
7330: 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 35 g *) function)[5
7340: 5d 20 3d 20 30 78 45 35 39 46 46 30 30 34 3b 0a ] = 0xE59FF004;.
7350: 20 20 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 ((long *) fu
7360: 6e 63 74 69 6f 6e 29 5b 36 5d 20 3d 20 28 6c 6f nction)[6] = (lo
7370: 6e 67 29 64 61 74 61 3b 0a 20 20 20 20 28 28 6c ng)data;. ((l
7380: 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 ong *) function)
7390: 5b 37 5d 20 3d 20 28 6c 6f 6e 67 29 76 61 72 69 [7] = (long)vari
73a0: 61 62 6c 65 3b 0a 20 20 20 20 28 28 6c 6f 6e 67 able;. ((long
73b0: 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 38 5d *) function)[8]
73c0: 20 3d 20 28 6c 6f 6e 67 29 61 64 64 72 65 73 73 = (long)address
73d0: 3b 0a 20 20 7d 0a 23 64 65 66 69 6e 65 20 69 73 ;. }.#define is
73e0: 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29 _tramp(function)
73f0: 20 20 5c 0a 20 20 20 20 28 28 6c 6f 6e 67 20 2a \. ((long *
7400: 29 20 66 75 6e 63 74 69 6f 6e 29 5b 30 5d 20 3d ) function)[0] =
7410: 3d 20 30 78 45 39 32 44 30 30 30 31 20 26 26 20 = 0xE92D0001 &&
7420: 5c 0a 20 20 20 20 28 28 6c 6f 6e 67 20 2a 29 20 \. ((long *)
7430: 66 75 6e 63 74 69 6f 6e 29 5b 31 5d 20 3d 3d 20 function)[1] ==
7440: 30 78 45 35 39 46 30 30 30 43 20 26 26 20 5c 0a 0xE59F000C && \.
7450: 20 20 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 ((long *) fu
7460: 6e 63 74 69 6f 6e 29 5b 32 5d 20 3d 3d 20 30 78 nction)[2] == 0x
7470: 45 35 39 46 43 30 30 43 20 26 26 20 5c 0a 20 20 E59FC00C && \.
7480: 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 ((long *) func
7490: 74 69 6f 6e 29 5b 33 5d 20 3d 3d 20 30 78 45 35 tion)[3] == 0xE5
74a0: 38 43 30 30 30 30 20 26 26 20 5c 0a 20 20 20 20 8C0000 && \.
74b0: 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 ((long *) functi
74c0: 6f 6e 29 5b 34 5d 20 3d 3d 20 30 78 45 38 42 44 on)[4] == 0xE8BD
74d0: 30 30 30 31 20 26 26 20 5c 0a 20 20 20 20 28 28 0001 && \. ((
74e0: 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e long *) function
74f0: 29 5b 35 5d 20 3d 3d 20 30 78 45 35 39 46 46 30 )[5] == 0xE59FF0
7500: 30 34 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 04.#define tramp
7510: 5f 61 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f _address(functio
7520: 6e 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a n) \. ((long *
7530: 29 20 66 75 6e 63 74 69 6f 6e 29 5b 38 5d 0a 23 ) function)[8].#
7540: 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 76 61 72 define tramp_var
7550: 69 61 62 6c 65 28 66 75 6e 63 74 69 6f 6e 29 20 iable(function)
7560: 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 \. ((long *) f
7570: 75 6e 63 74 69 6f 6e 29 5b 37 5d 0a 23 64 65 66 unction)[7].#def
7580: 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 28 66 ine tramp_data(f
7590: 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 28 unction) \. ((
75a0: 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e long *) function
75b0: 29 5b 36 5d 0a 23 65 6e 64 69 66 0a 23 69 66 64 )[6].#endif.#ifd
75c0: 65 66 20 5f 5f 70 6f 77 65 72 70 63 73 79 73 76 ef __powerpcsysv
75d0: 34 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 4__. /* functio
75e0: 6e 3a 0a 20 20 20 2a 20 20 20 20 7b 6c 69 75 7c n:. * {liu|
75f0: 6c 69 73 7d 20 31 31 2c 68 69 31 36 28 3c 76 61 lis} 11,hi16(<va
7600: 72 69 61 62 6c 65 3e 29 09 09 33 44 20 36 30 20 riable>)..3D 60
7610: 68 69 31 36 28 3c 76 61 72 69 61 62 6c 65 3e 29 hi16(<variable>)
7620: 0a 20 20 20 2a 20 20 20 20 7b 6f 72 69 6c 7c 6f . * {oril|o
7630: 72 69 7d 20 31 31 2c 31 31 2c 6c 6f 31 36 28 3c ri} 11,11,lo16(<
7640: 76 61 72 69 61 62 6c 65 3e 29 09 36 31 20 36 42 variable>).61 6B
7650: 20 6c 6f 31 36 28 3c 76 61 72 69 61 62 6c 65 3e lo16(<variable>
7660: 29 0a 20 20 20 2a 20 20 20 20 7b 6c 69 75 7c 6c ). * {liu|l
7670: 69 73 7d 20 31 32 2c 68 69 31 36 28 3c 64 61 74 is} 12,hi16(<dat
7680: 61 3e 29 09 09 33 44 20 38 30 20 68 69 31 36 28 a>)..3D 80 hi16(
7690: 3c 64 61 74 61 3e 29 0a 20 20 20 2a 20 20 20 20 <data>). *
76a0: 7b 6f 72 69 6c 7c 6f 72 69 7d 20 31 32 2c 31 32 {oril|ori} 12,12
76b0: 2c 6c 6f 31 36 28 3c 64 61 74 61 3e 29 09 09 36 ,lo16(<data>)..6
76c0: 31 20 38 43 20 6c 6f 31 36 28 3c 64 61 74 61 3e 1 8C lo16(<data>
76d0: 29 0a 20 20 20 2a 20 20 20 20 7b 73 74 7c 73 74 ). * {st|st
76e0: 77 7d 20 31 32 2c 30 28 31 31 29 09 09 09 39 31 w} 12,0(11)...91
76f0: 20 38 42 20 30 30 20 30 30 0a 20 20 20 2a 20 20 8B 00 00. *
7700: 20 20 7b 6c 69 75 7c 6c 69 73 7d 20 30 2c 68 69 {liu|lis} 0,hi
7710: 31 36 28 3c 61 64 64 72 65 73 73 3e 29 09 09 33 16(<address>)..3
7720: 43 20 30 30 20 68 69 31 36 28 3c 61 64 64 72 65 C 00 hi16(<addre
7730: 73 73 3e 29 0a 20 20 20 2a 20 20 20 20 7b 6f 72 ss>). * {or
7740: 69 6c 7c 6f 72 69 7d 20 30 2c 30 2c 6c 6f 31 36 il|ori} 0,0,lo16
7750: 28 3c 61 64 64 72 65 73 73 3e 29 09 09 36 30 20 (<address>)..60
7760: 30 30 20 6c 6f 31 36 28 3c 61 64 64 72 65 73 73 00 lo16(<address
7770: 3e 29 0a 20 20 20 2a 20 20 20 20 6d 74 63 74 72 >). * mtctr
7780: 20 30 09 09 09 09 09 37 43 20 30 39 20 30 33 20 0.....7C 09 03
7790: 41 36 0a 20 20 20 2a 20 20 20 20 62 63 74 72 09 A6. * bctr.
77a0: 09 09 09 09 34 45 20 38 30 20 30 34 20 32 30 0a ....4E 80 04 20.
77b0: 20 20 20 2a 2f 0a 20 20 2a 28 73 68 6f 72 74 20 */. *(short
77c0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 *) (function + 0
77d0: 29 20 3d 20 30 78 33 44 36 30 3b 0a 20 20 2a 28 ) = 0x3D60;. *(
77e0: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
77f0: 6f 6e 20 2b 20 32 29 20 3d 20 28 75 6e 73 69 67 on + 2) = (unsig
7800: 6e 65 64 20 6c 6f 6e 67 29 20 76 61 72 69 61 62 ned long) variab
7810: 6c 65 20 3e 3e 20 31 36 3b 0a 20 20 2a 28 73 68 le >> 16;. *(sh
7820: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ort *) (function
7830: 20 2b 20 34 29 20 3d 20 30 78 36 31 36 42 3b 0a + 4) = 0x616B;.
7840: 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 *(short *) (fu
7850: 6e 63 74 69 6f 6e 20 2b 20 36 29 20 3d 20 28 75 nction + 6) = (u
7860: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 76 61 nsigned long) va
7870: 72 69 61 62 6c 65 20 26 20 30 78 66 66 66 66 3b riable & 0xffff;
7880: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 . *(short *) (f
7890: 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 30 unction + 8) = 0
78a0: 78 33 44 38 30 3b 0a 20 20 2a 28 73 68 6f 72 74 x3D80;. *(short
78b0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 *) (function +1
78c0: 30 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 0) = (unsigned l
78d0: 6f 6e 67 29 20 64 61 74 61 20 3e 3e 20 31 36 3b ong) data >> 16;
78e0: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 . *(short *) (f
78f0: 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d 20 30 unction +12) = 0
7900: 78 36 31 38 43 3b 0a 20 20 2a 28 73 68 6f 72 74 x618C;. *(short
7910: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 *) (function +1
7920: 34 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 4) = (unsigned l
7930: 6f 6e 67 29 20 64 61 74 61 20 26 20 30 78 66 66 ong) data & 0xff
7940: 66 66 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 ff;. *(long *)
7950: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20 (function +16)
7960: 3d 20 30 78 39 31 38 42 30 30 30 30 3b 0a 20 20 = 0x918B0000;.
7970: 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 *(short *) (func
7980: 74 69 6f 6e 20 2b 32 30 29 20 3d 20 30 78 33 43 tion +20) = 0x3C
7990: 30 30 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 00;. *(short *)
79a0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 32 29 20 (function +22)
79b0: 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 = (unsigned long
79c0: 29 20 61 64 64 72 65 73 73 20 3e 3e 20 31 36 3b ) address >> 16;
79d0: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 . *(short *) (f
79e0: 75 6e 63 74 69 6f 6e 20 2b 32 34 29 20 3d 20 30 unction +24) = 0
79f0: 78 36 30 30 30 3b 0a 20 20 2a 28 73 68 6f 72 74 x6000;. *(short
7a00: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 *) (function +2
7a10: 36 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6) = (unsigned l
7a20: 6f 6e 67 29 20 61 64 64 72 65 73 73 20 26 20 30 ong) address & 0
7a30: 78 66 66 66 66 3b 0a 20 20 2a 28 6c 6f 6e 67 20 xffff;. *(long
7a40: 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 *) (function +2
7a50: 38 29 20 3d 20 30 78 37 43 30 39 30 33 41 36 3b 8) = 0x7C0903A6;
7a60: 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 . *(long *) (f
7a70: 75 6e 63 74 69 6f 6e 20 2b 33 32 29 20 3d 20 30 unction +32) = 0
7a80: 78 34 45 38 30 30 34 32 30 3b 0a 23 64 65 66 69 x4E800420;.#defi
7a90: 6e 65 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 ne is_tramp(func
7aa0: 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e 73 tion) \. *(uns
7ab0: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 igned short *) (
7ac0: 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 3d function + 0) ==
7ad0: 20 30 78 33 44 36 30 20 26 26 20 5c 0a 20 20 2a 0x3D60 && \. *
7ae0: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 (unsigned short
7af0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 *) (function + 4
7b00: 29 20 3d 3d 20 30 78 36 31 36 42 20 26 26 20 5c ) == 0x616B && \
7b10: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 . *(unsigned sh
7b20: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ort *) (function
7b30: 20 2b 20 38 29 20 3d 3d 20 30 78 33 44 38 30 20 + 8) == 0x3D80
7b40: 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 && \. *(unsigne
7b50: 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 d short *) (func
7b60: 74 69 6f 6e 20 2b 31 32 29 20 3d 3d 20 30 78 36 tion +12) == 0x6
7b70: 31 38 43 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 18C && \. *(uns
7b80: 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 29 20 20 28 igned long *) (
7b90: 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 3d function +16) ==
7ba0: 20 30 78 39 31 38 42 30 30 30 30 20 26 26 20 5c 0x918B0000 && \
7bb0: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 . *(unsigned sh
7bc0: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ort *) (function
7bd0: 20 2b 32 30 29 20 3d 3d 20 30 78 33 43 30 30 20 +20) == 0x3C00
7be0: 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 && \. *(unsigne
7bf0: 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 d short *) (func
7c00: 74 69 6f 6e 20 2b 32 34 29 20 3d 3d 20 30 78 36 tion +24) == 0x6
7c10: 30 30 30 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 000 && \. *(uns
7c20: 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 29 20 20 28 igned long *) (
7c30: 66 75 6e 63 74 69 6f 6e 20 2b 32 38 29 20 3d 3d function +28) ==
7c40: 20 30 78 37 43 30 39 30 33 41 36 20 26 26 20 5c 0x7C0903A6 && \
7c50: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 6c 6f . *(unsigned lo
7c60: 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e ng *) (function
7c70: 20 2b 33 32 29 20 3d 3d 20 30 78 34 45 38 30 30 +32) == 0x4E800
7c80: 34 32 30 0a 23 64 65 66 69 6e 65 20 68 69 6c 6f 420.#define hilo
7c90: 28 68 69 77 6f 72 64 2c 6c 6f 77 6f 72 64 29 20 (hiword,loword)
7ca0: 20 5c 0a 20 20 28 28 28 75 6e 73 69 67 6e 65 64 \. (((unsigned
7cb0: 20 6c 6f 6e 67 29 20 28 68 69 77 6f 72 64 29 20 long) (hiword)
7cc0: 3c 3c 20 31 36 29 20 7c 20 28 75 6e 73 69 67 6e << 16) | (unsign
7cd0: 65 64 20 6c 6f 6e 67 29 20 28 6c 6f 77 6f 72 64 ed long) (loword
7ce0: 29 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 )).#define tramp
7cf0: 5f 61 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f _address(functio
7d00: 6e 29 20 20 5c 0a 20 20 68 69 6c 6f 28 2a 28 75 n) \. hilo(*(u
7d10: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 nsigned short *)
7d20: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 32 29 2c (function +22),
7d30: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 *(unsigned shor
7d40: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
7d50: 32 36 29 29 0a 23 64 65 66 69 6e 65 20 74 72 61 26)).#define tra
7d60: 6d 70 5f 76 61 72 69 61 62 6c 65 28 66 75 6e 63 mp_variable(func
7d70: 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c 6f 28 tion) \. hilo(
7d80: 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 *(unsigned short
7d90: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 *) (function +
7da0: 32 29 2c 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 2), *(unsigned s
7db0: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f hort *) (functio
7dc0: 6e 20 2b 20 36 29 29 0a 23 64 65 66 69 6e 65 20 n + 6)).#define
7dd0: 74 72 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 74 tramp_data(funct
7de0: 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c 6f 28 2a ion) \. hilo(*
7df0: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 (unsigned short
7e00: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 30 *) (function +10
7e10: 29 2c 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 ), *(unsigned sh
7e20: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ort *) (function
7e30: 20 2b 31 34 29 29 0a 23 65 6e 64 69 66 0a 23 69 +14)).#endif.#i
7e40: 66 64 65 66 20 5f 5f 70 6f 77 65 72 70 63 61 69 fdef __powerpcai
7e50: 78 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f x__. /* functio
7e60: 6e 3a 0a 20 20 20 2a 20 20 20 20 2e 6c 6f 6e 67 n:. * .long
7e70: 20 2e 74 72 61 6d 70 0a 20 20 20 2a 20 20 20 20 .tramp. *
7e80: 2e 6c 6f 6e 67 20 2e 6d 79 74 6f 63 0a 20 20 20 .long .mytoc.
7e90: 2a 20 20 20 20 2e 6c 6f 6e 67 20 30 0a 20 20 20 * .long 0.
7ea0: 2a 20 2e 6d 79 74 6f 63 3a 0a 20 20 20 2a 20 20 * .mytoc:. *
7eb0: 20 20 2e 6c 6f 6e 67 20 3c 76 61 72 69 61 62 6c .long <variabl
7ec0: 65 3e 0a 20 20 20 2a 20 20 20 20 2e 6c 6f 6e 67 e>. * .long
7ed0: 20 3c 64 61 74 61 3e 0a 20 20 20 2a 20 20 20 20 <data>. *
7ee0: 2e 6c 6f 6e 67 20 3c 61 64 64 72 65 73 73 3e 0a .long <address>.
7ef0: 20 20 20 2a 2f 0a 20 20 2a 28 6c 6f 6e 67 20 2a */. *(long *
7f00: 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 ) (function + 0
7f10: 29 20 3d 20 28 28 6c 6f 6e 67 20 2a 29 20 26 74 ) = ((long *) &t
7f20: 72 61 6d 70 29 5b 30 5d 3b 0a 20 20 2a 28 6c 6f ramp)[0];. *(lo
7f30: 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e ng *) (function
7f40: 20 2b 20 34 29 20 3d 20 28 6c 6f 6e 67 29 20 28 + 4) = (long) (
7f50: 66 75 6e 63 74 69 6f 6e 20 2b 20 31 32 29 3b 0a function + 12);.
7f60: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 *(long *) (fu
7f70: 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 30 3b nction + 8) = 0;
7f80: 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 . *(long *) (f
7f90: 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d 20 28 unction +12) = (
7fa0: 6c 6f 6e 67 29 20 76 61 72 69 61 62 6c 65 3b 0a long) variable;.
7fb0: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 *(long *) (fu
7fc0: 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20 28 6c nction +16) = (l
7fd0: 6f 6e 67 29 20 64 61 74 61 3b 0a 20 20 2a 28 6c ong) data;. *(l
7fe0: 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f ong *) (functio
7ff0: 6e 20 2b 32 30 29 20 3d 20 28 6c 6f 6e 67 29 20 n +20) = (long)
8000: 61 64 64 72 65 73 73 3b 0a 23 64 65 66 69 6e 65 address;.#define
8010: 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 is_tramp(functi
8020: 6f 6e 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 on) \. ((long
8030: 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 30 5d 20 *) function)[0]
8040: 3d 3d 20 28 28 6c 6f 6e 67 20 2a 29 20 26 74 72 == ((long *) &tr
8050: 61 6d 70 29 5b 30 5d 0a 23 64 65 66 69 6e 65 20 amp)[0].#define
8060: 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75 tramp_address(fu
8070: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 28 6c nction) \. ((l
8080: 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 ong *) function)
8090: 5b 35 5d 0a 23 64 65 66 69 6e 65 20 74 72 61 6d [5].#define tram
80a0: 70 5f 76 61 72 69 61 62 6c 65 28 66 75 6e 63 74 p_variable(funct
80b0: 69 6f 6e 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 ion) \. ((long
80c0: 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 33 5d *) function)[3]
80d0: 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 .#define tramp_d
80e0: 61 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c ata(function) \
80f0: 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e . ((long *) fun
8100: 63 74 69 6f 6e 29 5b 34 5d 0a 23 65 6e 64 69 66 ction)[4].#endif
8110: 0a 23 69 66 64 65 66 20 5f 5f 70 6f 77 65 72 70 .#ifdef __powerp
8120: 63 36 34 61 69 78 5f 5f 0a 20 20 2f 2a 20 66 75 c64aix__. /* fu
8130: 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 nction:. *
8140: 2e 71 75 61 64 20 2e 74 72 61 6d 70 0a 20 20 20 .quad .tramp.
8150: 2a 20 20 20 20 2e 71 75 61 64 20 2e 6d 79 74 6f * .quad .myto
8160: 63 0a 20 20 20 2a 20 20 20 20 2e 71 75 61 64 20 c. * .quad
8170: 30 0a 20 20 20 2a 20 2e 6d 79 74 6f 63 3a 0a 20 0. * .mytoc:.
8180: 20 20 2a 20 20 20 20 2e 71 75 61 64 20 3c 76 61 * .quad <va
8190: 72 69 61 62 6c 65 3e 0a 20 20 20 2a 20 20 20 20 riable>. *
81a0: 2e 71 75 61 64 20 3c 64 61 74 61 3e 0a 20 20 20 .quad <data>.
81b0: 2a 20 20 20 20 2e 71 75 61 64 20 3c 61 64 64 72 * .quad <addr
81c0: 65 73 73 3e 0a 20 20 20 2a 2f 0a 20 20 2a 28 6c ess>. */. *(l
81d0: 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f ong *) (functio
81e0: 6e 20 2b 20 30 29 20 3d 20 28 28 6c 6f 6e 67 20 n + 0) = ((long
81f0: 2a 29 20 26 74 72 61 6d 70 29 5b 30 5d 3b 0a 20 *) &tramp)[0];.
8200: 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e *(long *) (fun
8210: 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 28 6c 6f ction + 8) = (lo
8220: 6e 67 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 ng) (function +
8230: 32 34 29 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 24);. *(long *)
8240: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 (function +16)
8250: 20 3d 20 30 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a = 0;. *(long *
8260: 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 34 ) (function +24
8270: 29 20 3d 20 28 6c 6f 6e 67 29 20 76 61 72 69 61 ) = (long) varia
8280: 62 6c 65 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 ble;. *(long *)
8290: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 33 32 29 (function +32)
82a0: 20 3d 20 28 6c 6f 6e 67 29 20 64 61 74 61 3b 0a = (long) data;.
82b0: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 *(long *) (fu
82c0: 6e 63 74 69 6f 6e 20 2b 34 30 29 20 3d 20 28 6c nction +40) = (l
82d0: 6f 6e 67 29 20 61 64 64 72 65 73 73 3b 0a 23 64 ong) address;.#d
82e0: 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 28 66 efine is_tramp(f
82f0: 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 28 unction) \. ((
8300: 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e long *) function
8310: 29 5b 30 5d 20 3d 3d 20 28 28 6c 6f 6e 67 20 2a )[0] == ((long *
8320: 29 20 26 74 72 61 6d 70 29 5b 30 5d 0a 23 64 65 ) &tramp)[0].#de
8330: 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 65 fine tramp_addre
8340: 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a ss(function) \.
8350: 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 ((long *) func
8360: 74 69 6f 6e 29 5b 35 5d 0a 23 64 65 66 69 6e 65 tion)[5].#define
8370: 20 74 72 61 6d 70 5f 76 61 72 69 61 62 6c 65 28 tramp_variable(
8380: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 function) \. (
8390: 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f (long *) functio
83a0: 6e 29 5b 33 5d 0a 23 64 65 66 69 6e 65 20 74 72 n)[3].#define tr
83b0: 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 74 69 6f amp_data(functio
83c0: 6e 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a n) \. ((long *
83d0: 29 20 66 75 6e 63 74 69 6f 6e 29 5b 34 5d 0a 23 ) function)[4].#
83e0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d endif.#ifdef __m
83f0: 38 38 6b 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 88k__. /* funct
8400: 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 6f 72 2e ion:. * or.
8410: 75 20 20 20 20 23 72 31 33 2c 23 72 30 2c 68 69 u #r13,#r0,hi
8420: 31 36 28 3c 76 61 72 69 61 62 6c 65 3e 29 09 35 16(<variable>).5
8430: 44 20 41 30 20 68 69 31 36 28 3c 76 61 72 69 61 D A0 hi16(<varia
8440: 62 6c 65 3e 29 0a 20 20 20 2a 20 20 20 20 6f 72 ble>). * or
8450: 20 20 20 20 20 20 23 72 31 33 2c 23 72 31 33 2c #r13,#r13,
8460: 6c 6f 31 36 28 3c 76 61 72 69 61 62 6c 65 3e 29 lo16(<variable>)
8470: 09 35 39 20 41 44 20 6c 6f 31 36 28 3c 76 61 72 .59 AD lo16(<var
8480: 69 61 62 6c 65 3e 29 0a 20 20 20 2a 20 20 20 20 iable>). *
8490: 6f 72 2e 75 20 20 20 20 23 72 31 30 2c 23 72 30 or.u #r10,#r0
84a0: 2c 68 69 31 36 28 3c 64 61 74 61 3e 29 09 09 35 ,hi16(<data>)..5
84b0: 44 20 34 30 20 68 69 31 36 28 3c 64 61 74 61 3e D 40 hi16(<data>
84c0: 29 0a 20 20 20 2a 20 20 20 20 6f 72 20 20 20 20 ). * or
84d0: 20 20 23 72 31 30 2c 23 72 31 30 2c 6c 6f 31 36 #r10,#r10,lo16
84e0: 28 3c 64 61 74 61 3e 29 09 09 35 39 20 34 41 20 (<data>)..59 4A
84f0: 6c 6f 31 36 28 3c 64 61 74 61 3e 29 0a 20 20 20 lo16(<data>).
8500: 2a 20 20 20 20 73 74 20 20 20 20 20 20 23 72 31 * st #r1
8510: 30 2c 23 72 30 2c 23 72 31 33 09 09 09 46 35 20 0,#r0,#r13...F5
8520: 34 30 20 32 34 20 30 44 0a 20 20 20 2a 20 20 20 40 24 0D. *
8530: 20 6f 72 2e 75 20 20 20 20 23 72 31 33 2c 23 72 or.u #r13,#r
8540: 30 2c 68 69 31 36 28 3c 61 64 64 72 65 73 73 3e 0,hi16(<address>
8550: 29 09 35 44 20 41 30 20 68 69 31 36 28 3c 61 64 ).5D A0 hi16(<ad
8560: 64 72 65 73 73 3e 29 0a 20 20 20 2a 20 20 20 20 dress>). *
8570: 6f 72 20 20 20 20 20 20 23 72 31 33 2c 23 72 31 or #r13,#r1
8580: 33 2c 6c 6f 31 36 28 3c 61 64 64 72 65 73 73 3e 3,lo16(<address>
8590: 29 09 35 39 20 41 44 20 6c 6f 31 36 28 3c 61 64 ).59 AD lo16(<ad
85a0: 64 72 65 73 73 3e 29 0a 20 20 20 2a 20 20 20 20 dress>). *
85b0: 6a 6d 70 20 20 20 20 20 23 72 31 33 09 09 09 09 jmp #r13....
85c0: 46 34 20 30 30 20 43 30 20 30 44 0a 20 20 20 2a F4 00 C0 0D. *
85d0: 2f 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 /. *(short *) (
85e0: 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20 function + 0) =
85f0: 30 78 35 44 41 30 3b 0a 20 20 2a 28 73 68 6f 72 0x5DA0;. *(shor
8600: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
8610: 20 32 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 2) = (unsigned
8620: 6c 6f 6e 67 29 20 76 61 72 69 61 62 6c 65 20 3e long) variable >
8630: 3e 20 31 36 3b 0a 20 20 2a 28 73 68 6f 72 74 20 > 16;. *(short
8640: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 *) (function + 4
8650: 29 20 3d 20 30 78 35 39 41 44 3b 0a 20 20 2a 28 ) = 0x59AD;. *(
8660: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
8670: 6f 6e 20 2b 20 36 29 20 3d 20 28 75 6e 73 69 67 on + 6) = (unsig
8680: 6e 65 64 20 6c 6f 6e 67 29 20 76 61 72 69 61 62 ned long) variab
8690: 6c 65 20 26 20 30 78 66 66 66 66 3b 0a 20 20 2a le & 0xffff;. *
86a0: 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 (short *) (funct
86b0: 69 6f 6e 20 2b 20 38 29 20 3d 20 30 78 35 44 34 ion + 8) = 0x5D4
86c0: 30 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 0;. *(short *)
86d0: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 30 29 20 3d (function +10) =
86e0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
86f0: 20 64 61 74 61 20 3e 3e 20 31 36 3b 0a 20 20 2a data >> 16;. *
8700: 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 (short *) (funct
8710: 69 6f 6e 20 2b 31 32 29 20 3d 20 30 78 35 39 34 ion +12) = 0x594
8720: 41 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 A;. *(short *)
8730: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 34 29 20 3d (function +14) =
8740: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
8750: 20 64 61 74 61 20 26 20 30 78 66 66 66 66 3b 0a data & 0xffff;.
8760: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 *(long *) (fu
8770: 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20 30 78 nction +16) = 0x
8780: 46 35 34 30 32 34 30 44 3b 0a 20 20 2a 28 73 68 F540240D;. *(sh
8790: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ort *) (function
87a0: 20 2b 32 30 29 20 3d 20 30 78 35 44 41 30 3b 0a +20) = 0x5DA0;.
87b0: 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 *(short *) (fu
87c0: 6e 63 74 69 6f 6e 20 2b 32 32 29 20 3d 20 28 75 nction +22) = (u
87d0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 61 64 nsigned long) ad
87e0: 64 72 65 73 73 20 3e 3e 20 31 36 3b 0a 20 20 2a dress >> 16;. *
87f0: 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 (short *) (funct
8800: 69 6f 6e 20 2b 32 34 29 20 3d 20 30 78 35 39 41 ion +24) = 0x59A
8810: 44 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 D;. *(short *)
8820: 28 66 75 6e 63 74 69 6f 6e 20 2b 32 36 29 20 3d (function +26) =
8830: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
8840: 20 61 64 64 72 65 73 73 20 26 20 30 78 66 66 66 address & 0xfff
8850: 66 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 f;. *(long *)
8860: 28 66 75 6e 63 74 69 6f 6e 20 2b 32 38 29 20 3d (function +28) =
8870: 20 30 78 46 34 30 30 43 30 30 44 3b 0a 23 64 65 0xF400C00D;.#de
8880: 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 28 66 75 fine is_tramp(fu
8890: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 nction) \. *(u
88a0: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 nsigned short *)
88b0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 (function + 0)
88c0: 3d 3d 20 30 78 35 44 41 30 20 26 26 20 5c 0a 20 == 0x5DA0 && \.
88d0: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 *(unsigned shor
88e0: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
88f0: 20 34 29 20 3d 3d 20 30 78 35 39 41 44 20 26 26 4) == 0x59AD &&
8900: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 \. *(unsigned
8910: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
8920: 6f 6e 20 2b 20 38 29 20 3d 3d 20 30 78 35 44 34 on + 8) == 0x5D4
8930: 30 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 0 && \. *(unsig
8940: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 ned short *) (fu
8950: 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d 3d 20 30 nction +12) == 0
8960: 78 35 39 34 41 20 26 26 20 5c 0a 20 20 2a 28 75 x594A && \. *(u
8970: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 29 20 nsigned long *)
8980: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20 (function +16)
8990: 3d 3d 20 30 78 46 35 34 30 32 34 30 44 20 26 26 == 0xF540240D &&
89a0: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 \. *(unsigned
89b0: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
89c0: 6f 6e 20 2b 32 30 29 20 3d 3d 20 30 78 35 44 41 on +20) == 0x5DA
89d0: 30 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 0 && \. *(unsig
89e0: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 ned short *) (fu
89f0: 6e 63 74 69 6f 6e 20 2b 32 34 29 20 3d 3d 20 30 nction +24) == 0
8a00: 78 35 39 41 44 20 26 26 20 5c 0a 20 20 2a 28 75 x59AD && \. *(u
8a10: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 29 20 nsigned long *)
8a20: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 38 29 20 (function +28)
8a30: 3d 3d 20 30 78 46 34 30 30 43 30 30 44 0a 23 64 == 0xF400C00D.#d
8a40: 65 66 69 6e 65 20 68 69 6c 6f 28 68 69 77 6f 72 efine hilo(hiwor
8a50: 64 2c 6c 6f 77 6f 72 64 29 20 20 5c 0a 20 20 28 d,loword) \. (
8a60: 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 ((unsigned long)
8a70: 20 28 68 69 77 6f 72 64 29 20 3c 3c 20 31 36 29 (hiword) << 16)
8a80: 20 7c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e | (unsigned lon
8a90: 67 29 20 28 6c 6f 77 6f 72 64 29 29 0a 23 64 65 g) (loword)).#de
8aa0: 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 65 fine tramp_addre
8ab0: 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a ss(function) \.
8ac0: 20 20 68 69 6c 6f 28 2a 28 75 6e 73 69 67 6e 65 hilo(*(unsigne
8ad0: 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 d short *) (func
8ae0: 74 69 6f 6e 20 2b 32 32 29 2c 20 2a 28 75 6e 73 tion +22), *(uns
8af0: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 igned short *) (
8b00: 66 75 6e 63 74 69 6f 6e 20 2b 32 36 29 29 0a 23 function +26)).#
8b10: 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 76 61 72 define tramp_var
8b20: 69 61 62 6c 65 28 66 75 6e 63 74 69 6f 6e 29 20 iable(function)
8b30: 20 5c 0a 20 20 68 69 6c 6f 28 2a 28 75 6e 73 69 \. hilo(*(unsi
8b40: 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 gned short *) (f
8b50: 75 6e 63 74 69 6f 6e 20 2b 20 32 29 2c 20 2a 28 unction + 2), *(
8b60: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a unsigned short *
8b70: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 36 29 ) (function + 6)
8b80: 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f ).#define tramp_
8b90: 64 61 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 20 data(function)
8ba0: 5c 0a 20 20 68 69 6c 6f 28 2a 28 75 6e 73 69 67 \. hilo(*(unsig
8bb0: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 ned short *) (fu
8bc0: 6e 63 74 69 6f 6e 20 2b 31 30 29 2c 20 2a 28 75 nction +10), *(u
8bd0: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 nsigned short *)
8be0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 34 29 29 (function +14))
8bf0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f .#endif.#ifdef _
8c00: 5f 63 6f 6e 76 65 78 5f 5f 0a 20 20 2f 2a 20 66 _convex__. /* f
8c10: 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 unction:. *
8c20: 20 6c 64 2e 77 20 23 3c 64 61 74 61 3e 2c 73 31 ld.w #<data>,s1
8c30: 09 09 09 09 31 31 43 39 20 3c 64 61 74 61 3e 0a ....11C9 <data>.
8c40: 20 20 20 2a 20 20 20 20 73 74 2e 77 20 73 31 2c * st.w s1,
8c50: 3c 76 61 72 69 61 62 6c 65 3e 09 09 09 33 36 34 <variable>...364
8c60: 31 20 3c 76 61 72 69 61 62 6c 65 3e 0a 20 20 20 1 <variable>.
8c70: 2a 20 20 20 20 6a 6d 70 20 3c 61 64 64 72 65 73 * jmp <addres
8c80: 73 3e 09 09 09 09 30 31 34 30 20 3c 61 64 64 72 s>....0140 <addr
8c90: 65 73 73 3e 0a 20 20 20 2a 20 20 20 20 64 73 2e ess>. * ds.
8ca0: 68 20 30 09 09 09 09 09 30 30 30 30 0a 20 20 20 h 0.....0000.
8cb0: 2a 2f 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 */. *(short *)
8cc0: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d (function + 0) =
8cd0: 20 30 78 31 31 43 39 3b 0a 20 20 2a 28 6c 6f 6e 0x11C9;. *(lon
8ce0: 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 g *) (function
8cf0: 2b 20 32 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 + 2) = (unsigned
8d00: 20 6c 6f 6e 67 29 20 64 61 74 61 3b 0a 20 20 2a long) data;. *
8d10: 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 (short *) (funct
8d20: 69 6f 6e 20 2b 20 36 29 20 3d 20 30 78 33 36 34 ion + 6) = 0x364
8d30: 31 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 1;. *(long *)
8d40: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d (function + 8) =
8d50: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
8d60: 20 76 61 72 69 61 62 6c 65 3b 0a 20 20 2a 28 73 variable;. *(s
8d70: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f hort *) (functio
8d80: 6e 20 2b 31 32 29 20 3d 20 30 78 30 31 34 30 3b n +12) = 0x0140;
8d90: 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 . *(long *) (f
8da0: 75 6e 63 74 69 6f 6e 20 2b 31 34 29 20 3d 20 28 unction +14) = (
8db0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 61 unsigned long) a
8dc0: 64 64 72 65 73 73 3b 0a 20 20 2a 28 73 68 6f 72 ddress;. *(shor
8dd0: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
8de0: 31 38 29 20 3d 20 30 78 30 30 30 30 3b 0a 23 64 18) = 0x0000;.#d
8df0: 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 28 66 efine is_tramp(f
8e00: 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 unction) \. *(
8e10: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a unsigned short *
8e20: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 ) (function + 0)
8e30: 20 3d 3d 20 30 78 31 31 43 39 20 26 26 20 5c 0a == 0x11C9 && \.
8e40: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f *(unsigned sho
8e50: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
8e60: 2b 20 36 29 20 3d 3d 20 30 78 33 36 34 31 20 26 + 6) == 0x3641 &
8e70: 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 & \. *(unsigned
8e80: 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 short *) (funct
8e90: 69 6f 6e 20 2b 31 32 29 20 3d 3d 20 30 78 30 31 ion +12) == 0x01
8ea0: 34 30 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 40 && \. *(unsi
8eb0: 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 gned short *) (f
8ec0: 75 6e 63 74 69 6f 6e 20 2b 31 38 29 20 3d 3d 20 unction +18) ==
8ed0: 30 78 30 30 30 30 0a 23 64 65 66 69 6e 65 20 74 0x0000.#define t
8ee0: 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75 6e ramp_address(fun
8ef0: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 6c 6f ction) \. *(lo
8f00: 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e ng *) (function
8f10: 20 2b 31 34 29 0a 23 64 65 66 69 6e 65 20 74 72 +14).#define tr
8f20: 61 6d 70 5f 76 61 72 69 61 62 6c 65 28 66 75 6e amp_variable(fun
8f30: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 6c 6f ction) \. *(lo
8f40: 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e ng *) (function
8f50: 20 2b 20 38 29 0a 23 64 65 66 69 6e 65 20 74 72 + 8).#define tr
8f60: 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 74 69 6f amp_data(functio
8f70: 6e 29 20 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a n) \. *(long *
8f80: 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 32 ) (function + 2
8f90: 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 ).#endif.#ifdef
8fa0: 5f 5f 69 61 36 34 5f 5f 0a 20 20 2f 2a 20 66 75 __ia64__. /* fu
8fb0: 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 nction:. *
8fc0: 64 61 74 61 38 20 20 20 74 72 61 6d 70 0a 20 20 data8 tramp.
8fd0: 20 2a 20 20 20 20 64 61 74 61 38 20 20 20 63 6c * data8 cl
8fe0: 6f 73 75 72 65 0a 20 20 20 2a 20 63 6c 6f 73 75 osure. * closu
8ff0: 72 65 3a 0a 20 20 20 2a 20 20 20 20 64 61 74 61 re:. * data
9000: 38 20 20 20 3c 61 64 64 72 65 73 73 3e 0a 20 20 8 <address>.
9010: 20 2a 20 20 20 20 64 61 74 61 38 20 20 20 3c 76 * data8 <v
9020: 61 72 69 61 62 6c 65 3e 0a 20 20 20 2a 20 20 20 ariable>. *
9030: 20 64 61 74 61 38 20 20 20 3c 64 61 74 61 3e 0a data8 <data>.
9040: 20 20 20 2a 2f 0a 20 20 2a 28 6c 6f 6e 67 20 2a */. *(long *
9050: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 ) (function + 0)
9060: 20 3d 20 28 6c 6f 6e 67 29 20 26 74 72 61 6d 70 = (long) &tramp
9070: 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 ;. *(long *) (f
9080: 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 28 unction + 8) = (
9090: 6c 6f 6e 67 29 20 28 66 75 6e 63 74 69 6f 6e 20 long) (function
90a0: 2b 20 31 36 29 3b 0a 20 20 2a 28 6c 6f 6e 67 20 + 16);. *(long
90b0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 *) (function +16
90c0: 29 20 3d 20 28 6c 6f 6e 67 29 20 61 64 64 72 65 ) = (long) addre
90d0: 73 73 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 ss;. *(long *)
90e0: 28 66 75 6e 63 74 69 6f 6e 20 2b 32 34 29 20 3d (function +24) =
90f0: 20 28 6c 6f 6e 67 29 20 76 61 72 69 61 62 6c 65 (long) variable
9100: 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 ;. *(long *) (f
9110: 75 6e 63 74 69 6f 6e 20 2b 33 32 29 20 3d 20 28 unction +32) = (
9120: 6c 6f 6e 67 29 20 64 61 74 61 3b 0a 23 64 65 66 long) data;.#def
9130: 69 6e 65 20 69 73 5f 74 72 61 6d 70 28 66 75 6e ine is_tramp(fun
9140: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 28 6c 6f ction) \. ((lo
9150: 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b ng *) function)[
9160: 30 5d 20 3d 3d 20 28 6c 6f 6e 67 29 20 26 74 72 0] == (long) &tr
9170: 61 6d 70 0a 23 64 65 66 69 6e 65 20 74 72 61 6d amp.#define tram
9180: 70 5f 61 64 64 72 65 73 73 28 66 75 6e 63 74 69 p_address(functi
9190: 6f 6e 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 on) \. ((long
91a0: 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 32 5d 0a *) function)[2].
91b0: 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 76 61 #define tramp_va
91c0: 72 69 61 62 6c 65 28 66 75 6e 63 74 69 6f 6e 29 riable(function)
91d0: 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 20 \. ((long *)
91e0: 66 75 6e 63 74 69 6f 6e 29 5b 33 5d 0a 23 64 65 function)[3].#de
91f0: 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 28 fine tramp_data(
9200: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 function) \. (
9210: 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f (long *) functio
9220: 6e 29 5b 34 5d 0a 23 65 6e 64 69 66 0a 23 69 66 n)[4].#endif.#if
9230: 64 65 66 20 5f 5f 78 38 36 5f 36 34 5f 5f 0a 20 def __x86_64__.
9240: 20 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 /* function:.
9250: 20 2a 20 20 20 20 6d 6f 76 61 62 73 71 20 24 3c * movabsq $<
9260: 64 61 74 61 3e 2c 25 72 61 78 09 09 34 38 20 42 data>,%rax..48 B
9270: 38 20 3c 64 61 74 61 3e 0a 20 20 20 2a 20 20 20 8 <data>. *
9280: 20 6d 6f 76 61 62 73 71 20 25 72 61 78 2c 20 3c movabsq %rax, <
9290: 76 61 72 69 61 62 6c 65 3e 09 34 38 20 41 33 20 variable>.48 A3
92a0: 3c 76 61 72 69 61 62 6c 65 3e 0a 20 20 20 2a 20 <variable>. *
92b0: 20 20 20 6d 6f 76 61 62 73 71 20 24 3c 61 64 64 movabsq $<add
92c0: 72 65 73 73 3e 2c 25 72 61 78 09 09 34 38 20 42 ress>,%rax..48 B
92d0: 38 20 3c 61 64 64 72 65 73 73 3e 0a 20 20 20 2a 8 <address>. *
92e0: 20 20 20 20 6a 6d 70 20 2a 25 72 61 78 09 09 09 jmp *%rax...
92f0: 46 46 20 45 30 0a 20 20 20 2a 2f 0a 20 20 2a 28 FF E0. */. *(
9300: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
9310: 6f 6e 20 2b 20 30 29 20 3d 20 30 78 42 38 34 38 on + 0) = 0xB848
9320: 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 ;. *(short *) (
9330: 66 75 6e 63 74 69 6f 6e 20 2b 20 32 29 20 3d 20 function + 2) =
9340: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
9350: 64 61 74 61 20 26 20 30 78 66 66 66 66 3b 0a 20 data & 0xffff;.
9360: 20 2a 28 69 6e 74 20 2a 29 20 20 20 28 66 75 6e *(int *) (fun
9370: 63 74 69 6f 6e 20 2b 20 34 29 20 3d 20 28 28 75 ction + 4) = ((u
9380: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 61 nsigned long) da
9390: 74 61 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66 ta >> 16) & 0xff
93a0: 66 66 66 66 66 66 3b 0a 20 20 2a 28 73 68 6f 72 ffffff;. *(shor
93b0: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
93c0: 20 38 29 20 3d 20 28 28 75 6e 73 69 67 6e 65 64 8) = ((unsigned
93d0: 20 6c 6f 6e 67 29 20 64 61 74 61 20 3e 3e 20 34 long) data >> 4
93e0: 38 29 20 26 20 30 78 66 66 66 66 3b 0a 20 20 2a 8) & 0xffff;. *
93f0: 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 (short *) (funct
9400: 69 6f 6e 20 2b 31 30 29 20 3d 20 30 78 41 33 34 ion +10) = 0xA34
9410: 38 3b 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 8;. *(int *)
9420: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d (function +12) =
9430: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
9440: 20 76 61 72 69 61 62 6c 65 20 26 20 30 78 66 66 variable & 0xff
9450: 66 66 66 66 66 66 3b 0a 20 20 2a 28 69 6e 74 20 ffffff;. *(int
9460: 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b *) (function +
9470: 31 36 29 20 3d 20 28 28 75 6e 73 69 67 6e 65 64 16) = ((unsigned
9480: 20 6c 6f 6e 67 29 20 76 61 72 69 61 62 6c 65 20 long) variable
9490: 3e 3e 20 33 32 29 20 26 20 30 78 66 66 66 66 66 >> 32) & 0xfffff
94a0: 66 66 66 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a fff;. *(short *
94b0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 30 29 ) (function +20)
94c0: 20 3d 20 30 78 42 38 34 38 3b 0a 20 20 2a 28 73 = 0xB848;. *(s
94d0: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f hort *) (functio
94e0: 6e 20 2b 32 32 29 20 3d 20 28 75 6e 73 69 67 6e n +22) = (unsign
94f0: 65 64 20 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 ed long) address
9500: 20 26 20 30 78 66 66 66 66 3b 0a 20 20 2a 28 69 & 0xffff;. *(i
9510: 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f nt *) (functio
9520: 6e 20 2b 32 34 29 20 3d 20 28 28 75 6e 73 69 67 n +24) = ((unsig
9530: 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64 72 65 73 ned long) addres
9540: 73 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66 66 s >> 16) & 0xfff
9550: 66 66 66 66 66 3b 0a 20 20 2a 28 73 68 6f 72 74 fffff;. *(short
9560: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 *) (function +2
9570: 38 29 20 3d 20 28 28 75 6e 73 69 67 6e 65 64 20 8) = ((unsigned
9580: 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 20 3e 3e long) address >>
9590: 20 34 38 29 20 26 20 30 78 66 66 66 66 3b 0a 20 48) & 0xffff;.
95a0: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e *(short *) (fun
95b0: 63 74 69 6f 6e 20 2b 33 30 29 20 3d 20 30 78 45 ction +30) = 0xE
95c0: 30 46 46 3b 0a 23 64 65 66 69 6e 65 20 69 73 5f 0FF;.#define is_
95d0: 74 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20 tramp(function)
95e0: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 \. *(unsigned
95f0: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
9600: 6f 6e 20 2b 20 30 29 20 3d 3d 20 30 78 42 38 34 on + 0) == 0xB84
9610: 38 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 8 && \. *(unsig
9620: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 ned short *) (fu
9630: 6e 63 74 69 6f 6e 20 2b 31 30 29 20 3d 3d 20 30 nction +10) == 0
9640: 78 41 33 34 38 20 26 26 20 5c 0a 20 20 2a 28 75 xA348 && \. *(u
9650: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 nsigned short *)
9660: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 30 29 20 (function +20)
9670: 3d 3d 20 30 78 42 38 34 38 20 26 26 20 5c 0a 20 == 0xB848 && \.
9680: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 *(unsigned shor
9690: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
96a0: 33 30 29 20 3d 3d 20 30 78 45 30 46 46 0a 23 64 30) == 0xE0FF.#d
96b0: 65 66 69 6e 65 20 68 69 6c 6f 28 68 69 77 6f 72 efine hilo(hiwor
96c0: 64 2c 6c 6f 77 6f 72 64 29 20 20 5c 0a 20 20 28 d,loword) \. (
96d0: 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 ((unsigned long)
96e0: 20 28 68 69 77 6f 72 64 29 20 3c 3c 20 33 32 29 (hiword) << 32)
96f0: 20 7c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e | (unsigned lon
9700: 67 29 20 28 6c 6f 77 6f 72 64 29 29 0a 23 64 65 g) (loword)).#de
9710: 66 69 6e 65 20 68 69 6d 69 64 6c 6f 28 68 69 73 fine himidlo(his
9720: 68 6f 72 74 2c 6d 69 64 77 6f 72 64 2c 6c 6f 73 hort,midword,los
9730: 68 6f 72 74 29 20 20 5c 0a 20 20 28 28 28 75 6e hort) \. (((un
9740: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 68 69 signed long) (hi
9750: 73 68 6f 72 74 29 20 3c 3c 20 34 38 29 20 7c 20 short) << 48) |
9760: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
9770: 28 6d 69 64 77 6f 72 64 29 20 3c 3c 20 31 36 20 (midword) << 16
9780: 5c 0a 20 20 20 7c 20 28 75 6e 73 69 67 6e 65 64 \. | (unsigned
9790: 20 6c 6f 6e 67 29 20 28 6c 6f 73 68 6f 72 74 29 long) (loshort)
97a0: 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f ).#define tramp_
97b0: 61 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e address(function
97c0: 29 20 20 5c 0a 20 20 68 69 6d 69 64 6c 6f 28 2a ) \. himidlo(*
97d0: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 (unsigned short
97e0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 38 *) (function +28
97f0: 29 2c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 2a ), \. *
9800: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 (unsigned int *)
9810: 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 34 (function +24
9820: 29 2c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 2a ), \. *
9830: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 (unsigned short
9840: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 32 *) (function +22
9850: 29 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 )).#define tramp
9860: 5f 76 61 72 69 61 62 6c 65 28 66 75 6e 63 74 69 _variable(functi
9870: 6f 6e 29 20 20 5c 0a 20 20 68 69 6c 6f 28 2a 28 on) \. hilo(*(
9880: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 unsigned int *)
9890: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 2c 20 (function +16),
98a0: 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a *(unsigned int *
98b0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 ) (function +12)
98c0: 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f ).#define tramp_
98d0: 64 61 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 20 data(function)
98e0: 5c 0a 20 20 68 69 6d 69 64 6c 6f 28 2a 28 75 6e \. himidlo(*(un
98f0: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 signed short *)
9900: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 2c 20 (function + 8),
9910: 5c 0a 20 20 20 20 20 20 20 20 20 20 2a 28 75 6e \. *(un
9920: 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 20 20 signed int *)
9930: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 2c 20 (function + 4),
9940: 5c 0a 20 20 20 20 20 20 20 20 20 20 2a 28 75 6e \. *(un
9950: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 signed short *)
9960: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 32 29 29 0a (function + 2)).
9970: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f #endif.#ifdef __
9980: 73 33 39 30 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 s390__. /* func
9990: 74 69 6f 6e 3a 0a 0a 20 20 20 20 20 20 20 20 6c tion:.. l
99a0: 72 20 20 20 20 20 20 25 72 30 2c 25 72 31 33 0a r %r0,%r13.
99b0: 20 20 20 20 20 20 20 20 62 72 61 73 20 20 20 20 bras
99c0: 25 72 31 33 2c 2e 4c 54 4e 30 5f 30 0a 2e 4c 54 %r13,.LTN0_0..LT
99d0: 30 5f 30 3a 0a 2e 4c 43 30 3a 0a 20 20 20 20 20 0_0:..LC0:.
99e0: 20 20 20 2e 6c 6f 6e 67 20 20 20 30 78 37 33 35 .long 0x735
99f0: 35 34 37 31 31 0a 2e 4c 43 31 3a 0a 20 20 20 20 54711..LC1:.
9a00: 20 20 20 20 2e 6c 6f 6e 67 20 20 20 30 78 31 32 .long 0x12
9a10: 33 34 35 36 37 38 0a 2e 4c 43 32 3a 0a 20 20 20 345678..LC2:.
9a20: 20 20 20 20 20 2e 6c 6f 6e 67 20 20 20 30 78 62 .long 0xb
9a30: 61 62 65 62 65 63 30 0a 2e 4c 54 4e 30 5f 30 3a abebec0..LTN0_0:
9a40: 0a 20 20 20 20 20 20 20 20 6c 20 20 20 20 20 20 . l
9a50: 20 25 72 31 2c 2e 4c 43 30 2d 2e 4c 54 30 5f 30 %r1,.LC0-.LT0_0
9a60: 28 25 72 31 33 29 0a 20 20 20 20 20 20 20 20 6d (%r13). m
9a70: 76 63 20 20 20 20 20 30 28 34 2c 25 72 31 29 2c vc 0(4,%r1),
9a80: 2e 4c 43 31 2d 2e 4c 54 30 5f 30 28 25 72 31 33 .LC1-.LT0_0(%r13
9a90: 29 0a 20 20 20 20 20 20 20 20 6c 20 20 20 20 20 ). l
9aa0: 20 20 25 72 31 2c 2e 4c 43 32 2d 2e 4c 54 31 5f %r1,.LC2-.LT1_
9ab0: 30 28 25 72 31 33 29 0a 20 20 20 20 20 20 20 20 0(%r13).
9ac0: 6c 72 20 20 20 20 20 20 25 72 31 33 2c 25 72 30 lr %r13,%r0
9ad0: 0a 20 20 20 20 20 20 20 20 62 72 20 20 20 20 20 . br
9ae0: 20 25 72 31 0a 20 20 2a 2f 0a 20 20 2f 2a 20 57 %r1. */. /* W
9af0: 68 61 74 20 61 62 6f 75 74 20 62 69 67 20 65 6e hat about big en
9b00: 64 69 61 6e 20 2f 20 6c 69 74 74 6c 65 20 65 6e dian / little en
9b10: 64 69 61 6e 20 3f 3f 20 2a 2f 0a 20 20 2a 28 75 dian ?? */. *(u
9b20: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 nsigned short *)
9b30: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 (function + 0)
9b40: 3d 20 30 78 31 38 30 44 3b 0a 20 20 2a 28 75 6e = 0x180D;. *(un
9b50: 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 20 20 signed int *)
9b60: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 32 29 20 3d (function + 2) =
9b70: 20 30 78 41 37 44 35 30 30 30 38 3b 0a 20 20 2a 0xA7D50008;. *
9b80: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 (unsigned int *)
9b90: 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 36 (function + 6
9ba0: 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 69 6e ) = (unsigned in
9bb0: 74 29 20 76 61 72 69 61 62 6c 65 3b 0a 20 20 2a t) variable;. *
9bc0: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 (unsigned int *)
9bd0: 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 30 (function +10
9be0: 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 69 6e ) = (unsigned in
9bf0: 74 29 20 64 61 74 61 3b 0a 20 20 2a 28 75 6e 73 t) data;. *(uns
9c00: 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 20 20 28 igned int *) (
9c10: 66 75 6e 63 74 69 6f 6e 20 2b 31 34 29 20 3d 20 function +14) =
9c20: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 61 (unsigned int) a
9c30: 64 64 72 65 73 73 3b 0a 20 20 2a 28 75 6e 73 69 ddress;. *(unsi
9c40: 67 6e 65 64 20 69 6e 74 20 2a 29 20 20 20 28 66 gned int *) (f
9c50: 75 6e 63 74 69 6f 6e 20 2b 31 38 29 20 3d 20 30 unction +18) = 0
9c60: 78 35 38 31 30 44 30 30 30 3b 0a 20 20 2a 28 75 x5810D000;. *(u
9c70: 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 20 nsigned int *)
9c80: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 32 29 20 (function +22)
9c90: 3d 20 30 78 44 32 30 33 31 30 30 30 3b 0a 20 20 = 0xD2031000;.
9ca0: 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 *(unsigned short
9cb0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 *) (function +2
9cc0: 36 29 20 3d 20 30 78 44 30 30 34 3b 0a 20 20 2a 6) = 0xD004;. *
9cd0: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 (unsigned int *)
9ce0: 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 38 (function +28
9cf0: 29 20 3d 20 30 78 35 38 31 30 44 30 30 38 3b 0a ) = 0x5810D008;.
9d00: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f *(unsigned sho
9d10: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
9d20: 2b 33 32 29 20 3d 20 30 78 31 38 44 30 3b 0a 20 +32) = 0x18D0;.
9d30: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 *(unsigned shor
9d40: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
9d50: 33 34 29 20 3d 20 30 78 30 37 66 31 3b 0a 23 64 34) = 0x07f1;.#d
9d60: 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 28 66 efine is_tramp(f
9d70: 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 unction) \. *(
9d80: 73 68 6f 72 74 20 2a 29 20 20 20 20 20 20 20 20 short *)
9d90: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 (function + 0)
9da0: 20 3d 3d 20 30 78 31 38 30 44 20 26 26 20 5c 0a == 0x180D && \.
9db0: 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 20 20 20 *(int *)
9dc0: 20 20 20 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 (function
9dd0: 2b 20 32 29 20 3d 3d 20 30 78 41 37 44 35 30 30 + 2) == 0xA7D500
9de0: 30 38 20 26 26 20 5c 0a 20 20 2a 28 69 6e 74 20 08 && \. *(int
9df0: 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 28 66 *) (f
9e00: 75 6e 63 74 69 6f 6e 20 2b 31 38 29 20 3d 3d 20 unction +18) ==
9e10: 30 78 35 38 31 30 44 30 30 30 20 26 26 20 5c 0a 0x5810D000 && \.
9e20: 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 20 20 20 *(int *)
9e30: 20 20 20 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 (function
9e40: 2b 32 32 29 20 3d 3d 20 30 78 44 32 30 33 31 30 +22) == 0xD20310
9e50: 30 30 20 26 26 20 5c 0a 20 20 2a 28 73 68 6f 72 00 && \. *(shor
9e60: 74 20 2a 29 20 20 20 20 20 20 20 20 20 20 28 66 t *) (f
9e70: 75 6e 63 74 69 6f 6e 20 2b 32 36 29 20 3d 3d 20 unction +26) ==
9e80: 30 78 44 30 30 34 20 26 26 20 5c 0a 20 20 2a 28 0xD004 && \. *(
9e90: 69 6e 74 20 2a 29 20 20 20 20 20 20 20 20 20 20 int *)
9ea0: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 38 29 (function +28)
9eb0: 20 3d 3d 20 30 78 35 38 31 30 44 30 30 38 20 26 == 0x5810D008 &
9ec0: 26 20 5c 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 & \. *(short *)
9ed0: 20 20 20 20 20 20 20 20 20 20 28 66 75 6e 63 74 (funct
9ee0: 69 6f 6e 20 2b 33 32 29 20 3d 3d 20 30 78 31 38 ion +32) == 0x18
9ef0: 44 30 20 26 26 20 5c 0a 20 20 2a 28 73 68 6f 72 D0 && \. *(shor
9f00: 74 20 2a 29 20 20 20 20 20 20 20 20 20 20 28 66 t *) (f
9f10: 75 6e 63 74 69 6f 6e 20 2b 33 34 29 20 3d 3d 20 unction +34) ==
9f20: 30 78 30 37 66 31 0a 23 64 65 66 69 6e 65 20 74 0x07f1.#define t
9f30: 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75 6e ramp_address(fun
9f40: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e ction) \. *(un
9f50: 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 28 66 signed int *) (f
9f60: 75 6e 63 74 69 6f 6e 20 2b 31 34 29 0a 23 64 65 unction +14).#de
9f70: 66 69 6e 65 20 74 72 61 6d 70 5f 76 61 72 69 61 fine tramp_varia
9f80: 62 6c 65 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c ble(function) \
9f90: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e . *(unsigned in
9fa0: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
9fb0: 36 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 6).#define tramp
9fc0: 5f 64 61 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 _data(function)
9fd0: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 \. *(unsigned
9fe0: 69 6e 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e int *) (function
9ff0: 20 2b 31 30 29 0a 23 65 6e 64 69 66 0a 0a 20 20 +10).#endif..
a000: 2f 2a 20 33 2e 20 53 65 74 20 6d 65 6d 6f 72 79 /* 3. Set memory
a010: 20 70 72 6f 74 65 63 74 69 6f 6e 20 74 6f 20 22 protection to "
a020: 65 78 65 63 75 74 61 62 6c 65 22 20 2a 2f 0a 0a executable" */..
a030: 23 69 66 20 21 64 65 66 69 6e 65 64 28 43 4f 44 #if !defined(COD
a040: 45 5f 45 58 45 43 55 54 41 42 4c 45 29 20 26 26 E_EXECUTABLE) &&
a050: 20 64 65 66 69 6e 65 64 28 45 58 45 43 55 54 41 defined(EXECUTA
a060: 42 4c 45 5f 56 49 41 5f 4d 50 52 4f 54 45 43 54 BLE_VIA_MPROTECT
a070: 29 0a 20 20 2f 2a 20 43 61 6c 6c 20 6d 70 72 6f ). /* Call mpro
a080: 74 65 63 74 20 6f 6e 20 74 68 65 20 70 61 67 65 tect on the page
a090: 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 74 s that contain t
a0a0: 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 7b he range. */. {
a0b0: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 unsigned long s
a0c0: 74 61 72 74 5f 61 64 64 72 20 3d 20 28 75 6e 73 tart_addr = (uns
a0d0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 66 75 6e 63 igned long) func
a0e0: 74 69 6f 6e 3b 0a 20 20 20 20 75 6e 73 69 67 6e tion;. unsign
a0f0: 65 64 20 6c 6f 6e 67 20 65 6e 64 5f 61 64 64 72 ed long end_addr
a100: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e = (unsigned lon
a110: 67 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 54 g) (function + T
a120: 52 41 4d 50 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 RAMP_LENGTH);.
a130: 20 20 73 74 61 72 74 5f 61 64 64 72 20 3d 20 73 start_addr = s
a140: 74 61 72 74 5f 61 64 64 72 20 26 20 2d 70 61 67 tart_addr & -pag
a150: 65 73 69 7a 65 3b 0a 20 20 20 20 65 6e 64 5f 61 esize;. end_a
a160: 64 64 72 20 3d 20 28 65 6e 64 5f 61 64 64 72 20 ddr = (end_addr
a170: 2b 20 70 61 67 65 73 69 7a 65 2d 31 29 20 26 20 + pagesize-1) &
a180: 2d 70 61 67 65 73 69 7a 65 3b 0a 20 20 20 7b 75 -pagesize;. {u
a190: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 65 6e nsigned long len
a1a0: 20 3d 20 65 6e 64 5f 61 64 64 72 20 2d 20 73 74 = end_addr - st
a1b0: 61 72 74 5f 61 64 64 72 3b 0a 23 69 66 20 64 65 art_addr;.#if de
a1c0: 66 69 6e 65 64 28 48 41 56 45 5f 4d 41 43 48 5f fined(HAVE_MACH_
a1d0: 56 4d 29 0a 20 20 20 20 69 66 20 28 76 6d 5f 70 VM). if (vm_p
a1e0: 72 6f 74 65 63 74 28 74 61 73 6b 5f 73 65 6c 66 rotect(task_self
a1f0: 28 29 2c 73 74 61 72 74 5f 61 64 64 72 2c 6c 65 (),start_addr,le
a200: 6e 2c 30 2c 56 4d 5f 50 52 4f 54 5f 52 45 41 44 n,0,VM_PROT_READ
a210: 7c 56 4d 5f 50 52 4f 54 5f 57 52 49 54 45 7c 56 |VM_PROT_WRITE|V
a220: 4d 5f 50 52 4f 54 5f 45 58 45 43 55 54 45 29 20 M_PROT_EXECUTE)
a230: 21 3d 20 4b 45 52 4e 5f 53 55 43 43 45 53 53 29 != KERN_SUCCESS)
a240: 0a 23 65 6c 73 65 0a 23 69 66 20 64 65 66 69 6e .#else.#if defin
a250: 65 64 28 5f 5f 63 6f 6e 76 65 78 5f 5f 29 0a 20 ed(__convex__).
a260: 20 20 20 2f 2a 20 43 6f 6e 76 65 78 20 4f 53 20 /* Convex OS
a270: 63 61 6c 6c 73 20 69 74 20 60 6d 72 65 6d 61 70 calls it `mremap
a280: 28 29 27 2e 20 2a 2f 0a 20 20 20 20 6d 72 65 6d ()'. */. mrem
a290: 61 70 28 73 74 61 72 74 5f 61 64 64 72 2c 20 26 ap(start_addr, &
a2a0: 6c 65 6e 2c 20 50 52 4f 54 5f 52 45 41 44 7c 50 len, PROT_READ|P
a2b0: 52 4f 54 5f 57 52 49 54 45 7c 50 52 4f 54 5f 45 ROT_WRITE|PROT_E
a2c0: 58 45 43 2c 20 4d 41 50 5f 50 52 49 56 41 54 45 XEC, MAP_PRIVATE
a2d0: 29 3b 0a 20 20 20 20 69 66 20 28 30 29 0a 23 65 );. if (0).#e
a2e0: 6c 73 65 0a 23 69 66 20 64 65 66 69 6e 65 64 28 lse.#if defined(
a2f0: 48 41 56 45 5f 53 59 53 5f 4d 38 38 4b 42 43 53 HAVE_SYS_M88KBCS
a300: 5f 48 29 0a 20 20 20 20 69 66 20 28 6d 65 6d 63 _H). if (memc
a310: 74 6c 28 73 74 61 72 74 5f 61 64 64 72 2c 20 6c tl(start_addr, l
a320: 65 6e 2c 20 4d 43 54 5f 54 45 58 54 29 20 3d 3d en, MCT_TEXT) ==
a330: 20 2d 31 29 0a 23 65 6c 73 65 0a 20 20 20 20 69 -1).#else. i
a340: 66 20 28 6d 70 72 6f 74 65 63 74 28 28 76 6f 69 f (mprotect((voi
a350: 64 2a 29 73 74 61 72 74 5f 61 64 64 72 2c 20 6c d*)start_addr, l
a360: 65 6e 2c 20 50 52 4f 54 5f 52 45 41 44 7c 50 52 en, PROT_READ|PR
a370: 4f 54 5f 57 52 49 54 45 7c 50 52 4f 54 5f 45 58 OT_WRITE|PROT_EX
a380: 45 43 29 20 3c 20 30 29 0a 23 65 6e 64 69 66 0a EC) < 0).#endif.
a390: 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 20 20 #endif.#endif.
a3a0: 20 20 20 20 7b 20 66 70 72 69 6e 74 66 28 73 74 { fprintf(st
a3b0: 64 65 72 72 2c 22 74 72 61 6d 70 6f 6c 69 6e 65 derr,"trampoline
a3c0: 3a 20 63 61 6e 6e 6f 74 20 6d 61 6b 65 20 6d 65 : cannot make me
a3d0: 6d 6f 72 79 20 65 78 65 63 75 74 61 62 6c 65 5c mory executable\
a3e0: 6e 22 29 3b 20 61 62 6f 72 74 28 29 3b 20 7d 0a n"); abort(); }.
a3f0: 20 20 7d 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f }}.#endif.. /
a400: 2a 20 34 2e 20 46 6c 75 73 68 20 69 6e 73 74 72 * 4. Flush instr
a410: 75 63 74 69 6f 6e 20 63 61 63 68 65 20 2a 2f 0a uction cache */.
a420: 20 20 2f 2a 20 57 65 20 6e 65 65 64 20 74 68 69 /* We need thi
a430: 73 20 62 65 63 61 75 73 65 20 73 6f 6d 65 20 43 s because some C
a440: 50 55 73 20 68 61 76 65 20 73 65 70 61 72 61 74 PUs have separat
a450: 65 20 64 61 74 61 20 63 61 63 68 65 20 61 6e 64 e data cache and
a460: 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 instruction.
a470: 2a 20 63 61 63 68 65 2e 20 54 68 65 20 66 72 65 * cache. The fre
a480: 73 68 6c 79 20 62 75 69 6c 74 20 74 72 61 6d 70 shly built tramp
a490: 6f 6c 69 6e 65 20 69 73 20 76 69 73 69 62 6c 65 oline is visible
a4a0: 20 74 6f 20 74 68 65 20 64 61 74 61 20 63 61 63 to the data cac
a4b0: 68 65 2c 20 62 75 74 20 6e 6f 74 0a 20 20 20 2a he, but not. *
a4c0: 20 6d 61 79 62 65 20 6e 6f 74 20 74 6f 20 74 68 maybe not to th
a4d0: 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 61 e instruction ca
a4e0: 63 68 65 2e 20 54 68 69 73 20 69 73 20 68 61 69 che. This is hai
a4f0: 72 79 2e 0a 20 20 20 2a 2f 0a 23 69 66 20 21 28 ry.. */.#if !(
a500: 64 65 66 69 6e 65 64 28 5f 5f 68 70 70 61 6e 65 defined(__hppane
a510: 77 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 w__) || defined(
a520: 5f 5f 70 6f 77 65 72 70 63 61 69 78 5f 5f 29 20 __powerpcaix__)
a530: 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 70 6f 77 || defined(__pow
a540: 65 72 70 63 36 34 61 69 78 5f 5f 29 20 7c 7c 20 erpc64aix__) ||
a550: 64 65 66 69 6e 65 64 28 5f 5f 69 61 36 34 5f 5f defined(__ia64__
a560: 29 29 0a 20 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 )). /* Only nee
a570: 64 65 64 20 69 66 20 77 65 20 72 65 61 6c 6c 79 ded if we really
a580: 20 73 65 74 20 75 70 20 6d 61 63 68 69 6e 65 20 set up machine
a590: 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 2a 2f instructions. */
a5a0: 0a 23 69 66 64 65 66 20 5f 5f 69 33 38 36 5f 5f .#ifdef __i386__
a5b0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 .#if defined(_WI
a5c0: 4e 33 32 29 0a 20 20 77 68 69 6c 65 20 28 21 46 N32). while (!F
a5d0: 6c 75 73 68 49 6e 73 74 72 75 63 74 69 6f 6e 43 lushInstructionC
a5e0: 61 63 68 65 28 47 65 74 43 75 72 72 65 6e 74 50 ache(GetCurrentP
a5f0: 72 6f 63 65 73 73 28 29 2c 66 75 6e 63 74 69 6f rocess(),functio
a600: 6e 2c 54 52 41 4d 50 5f 4c 45 4e 47 54 48 29 29 n,TRAMP_LENGTH))
a610: 0a 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 . continue;.#
a620: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 endif.#endif.#if
a630: 64 65 66 20 5f 5f 6d 36 38 6b 5f 5f 0a 23 69 66 def __m68k__.#if
a640: 20 64 65 66 69 6e 65 64 28 4e 65 58 54 29 20 26 defined(NeXT) &
a650: 26 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43 & defined(__GNUC
a660: 5f 5f 29 0a 20 20 5f 5f 61 73 6d 5f 5f 20 5f 5f __). __asm__ __
a670: 76 6f 6c 61 74 69 6c 65 5f 5f 20 28 22 74 72 61 volatile__ ("tra
a680: 70 20 23 32 22 29 3b 0a 23 65 6e 64 69 66 0a 23 p #2");.#endif.#
a690: 69 66 20 64 65 66 69 6e 65 64 28 41 4d 49 47 41 if defined(AMIGA
a6a0: 29 0a 20 20 43 61 63 68 65 43 6c 65 61 72 45 28 ). CacheClearE(
a6b0: 66 75 6e 63 74 69 6f 6e 2c 54 52 41 4d 50 5f 4c function,TRAMP_L
a6c0: 45 4e 47 54 48 2c 43 41 43 52 46 5f 43 6c 65 61 ENGTH,CACRF_Clea
a6d0: 72 49 7c 43 41 43 52 46 5f 43 6c 65 61 72 44 29 rI|CACRF_ClearD)
a6e0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 ;.#endif.#if def
a6f0: 69 6e 65 64 28 61 70 6f 6c 6c 6f 29 0a 20 20 63 ined(apollo). c
a700: 61 63 68 65 5f 24 63 6c 65 61 72 28 29 3b 0a 23 ache_$clear();.#
a710: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 endif.#if define
a720: 64 28 68 70 75 78 29 0a 20 20 63 61 63 68 65 63 d(hpux). cachec
a730: 74 6c 28 43 43 5f 49 50 55 52 47 45 2c 66 75 6e tl(CC_IPURGE,fun
a740: 63 74 69 6f 6e 2c 54 52 41 4d 50 5f 4c 45 4e 47 ction,TRAMP_LENG
a750: 54 48 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 TH);.#endif.#if
a760: 64 65 66 69 6e 65 64 28 5f 5f 4e 65 74 42 53 44 defined(__NetBSD
a770: 5f 5f 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f __) && defined(_
a780: 5f 47 4e 55 43 5f 5f 29 0a 20 20 7b 20 72 65 67 _GNUC__). { reg
a790: 69 73 74 65 72 20 75 6e 73 69 67 6e 65 64 20 6c ister unsigned l
a7a0: 6f 6e 67 20 5f 62 65 67 20 5f 5f 61 73 6d 5f 5f ong _beg __asm__
a7b0: 20 28 22 25 61 31 22 29 20 3d 20 28 75 6e 73 69 ("%a1") = (unsi
a7c0: 67 6e 65 64 20 6c 6f 6e 67 29 20 66 75 6e 63 74 gned long) funct
a7d0: 69 6f 6e 3b 0a 20 20 20 20 72 65 67 69 73 74 65 ion;. registe
a7e0: 72 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 r unsigned long
a7f0: 5f 6c 65 6e 20 5f 5f 61 73 6d 5f 5f 20 28 22 25 _len __asm__ ("%
a800: 64 31 22 29 20 3d 20 54 52 41 4d 50 5f 4c 45 4e d1") = TRAMP_LEN
a810: 47 54 48 3b 0a 20 20 20 20 5f 5f 61 73 6d 5f 5f GTH;. __asm__
a820: 20 5f 5f 76 6f 6c 61 74 69 6c 65 5f 5f 20 28 0a __volatile__ (.
a830: 20 20 20 20 20 20 22 6d 6f 76 65 25 2e 6c 20 25 "move%.l %
a840: 23 30 78 38 30 30 30 30 30 30 34 2c 25 2f 64 30 #0x80000004,%/d0
a850: 5c 6e 5c 74 22 20 2f 2a 20 43 43 5f 45 58 54 50 \n\t" /* CC_EXTP
a860: 55 52 47 45 20 7c 20 43 5f 49 50 55 52 47 45 20 URGE | C_IPURGE
a870: 2a 2f 0a 20 20 20 20 20 20 22 74 72 61 70 20 23 */. "trap #
a880: 31 32 22 20 20 20 20 20 20 20 20 20 20 20 20 20 12"
a890: 20 20 20 20 20 20 20 20 20 2f 2a 20 6b 65 72 6e /* kern
a8a0: 65 6c 20 63 61 6c 6c 20 60 63 61 63 68 65 63 74 el call `cachect
a8b0: 6c 27 20 2a 2f 0a 20 20 20 20 20 20 3a 0a 20 20 l' */. :.
a8c0: 20 20 20 20 3a 20 22 61 22 20 28 5f 62 65 67 29 : "a" (_beg)
a8d0: 2c 20 22 64 22 20 28 5f 6c 65 6e 29 0a 20 20 20 , "d" (_len).
a8e0: 20 20 20 3a 20 22 25 61 30 22 2c 20 22 25 61 31 : "%a0", "%a1
a8f0: 22 2c 20 22 25 64 30 22 2c 20 22 25 64 31 22 20 ", "%d0", "%d1"
a900: 20 20 20 2f 2a 20 63 61 6c 6c 2d 75 73 65 64 20 /* call-used
a910: 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 20 registers */.
a920: 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 );. }.#endif
a930: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 6c .#if defined(__l
a940: 69 6e 75 78 5f 5f 29 20 26 26 20 64 65 66 69 6e inux__) && defin
a950: 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a 20 20 7b ed(__GNUC__). {
a960: 20 72 65 67 69 73 74 65 72 20 75 6e 73 69 67 6e register unsign
a970: 65 64 20 6c 6f 6e 67 20 5f 62 65 67 20 5f 5f 61 ed long _beg __a
a980: 73 6d 5f 5f 20 28 22 25 64 31 22 29 20 3d 20 28 sm__ ("%d1") = (
a990: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 66 unsigned long) f
a9a0: 75 6e 63 74 69 6f 6e 3b 0a 20 20 20 20 72 65 67 unction;. reg
a9b0: 69 73 74 65 72 20 75 6e 73 69 67 6e 65 64 20 6c ister unsigned l
a9c0: 6f 6e 67 20 5f 6c 65 6e 20 5f 5f 61 73 6d 5f 5f ong _len __asm__
a9d0: 20 28 22 25 64 34 22 29 20 3d 20 54 52 41 4d 50 ("%d4") = TRAMP
a9e0: 5f 4c 45 4e 47 54 48 20 2b 20 33 32 3b 0a 20 20 _LENGTH + 32;.
a9f0: 20 20 5f 5f 61 73 6d 5f 5f 20 5f 5f 76 6f 6c 61 __asm__ __vola
aa00: 74 69 6c 65 5f 5f 20 28 0a 20 20 20 20 20 20 22 tile__ (. "
aa10: 6d 6f 76 65 25 2e 6c 20 25 23 31 32 33 2c 25 2f move%.l %#123,%/
aa20: 64 30 5c 6e 5c 74 22 0a 20 20 20 20 20 20 22 6d d0\n\t". "m
aa30: 6f 76 65 25 2e 6c 20 25 23 31 2c 25 2f 64 32 5c ove%.l %#1,%/d2\
aa40: 6e 5c 74 22 0a 20 20 20 20 20 20 22 6d 6f 76 65 n\t". "move
aa50: 25 2e 6c 20 25 23 33 2c 25 2f 64 33 5c 6e 5c 74 %.l %#3,%/d3\n\t
aa60: 22 0a 20 20 20 20 20 20 22 74 72 61 70 20 25 23 ". "trap %#
aa70: 30 22 0a 20 20 20 20 20 20 3a 0a 20 20 20 20 20 0". :.
aa80: 20 3a 20 22 64 22 20 28 5f 62 65 67 29 2c 20 22 : "d" (_beg), "
aa90: 64 22 20 28 5f 6c 65 6e 29 0a 20 20 20 20 20 20 d" (_len).
aaa0: 3a 20 22 25 64 30 22 2c 20 22 25 64 32 22 2c 20 : "%d0", "%d2",
aab0: 22 25 64 33 22 0a 20 20 20 20 20 20 29 3b 0a 20 "%d3". );.
aac0: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 }.#endif.#if de
aad0: 66 69 6e 65 64 28 41 55 58 29 20 26 26 20 64 65 fined(AUX) && de
aae0: 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a fined(__GNUC__).
aaf0: 20 20 2f 2a 20 73 79 73 6d 36 38 6b 28 31 30 35 /* sysm68k(105
ab00: 2c 20 61 64 64 72 2c 20 73 63 6f 70 65 2c 20 63 , addr, scope, c
ab10: 61 63 68 65 2c 20 6c 65 6e 29 20 2a 2f 0a 20 20 ache, len) */.
ab20: 5f 5f 61 73 6d 5f 5f 20 5f 5f 76 6f 6c 61 74 69 __asm__ __volati
ab30: 6c 65 5f 5f 20 28 0a 20 20 20 20 22 6d 6f 76 65 le__ (. "move
ab40: 25 2e 6c 20 25 31 2c 25 2f 73 70 40 2d 5c 6e 5c %.l %1,%/sp@-\n\
ab50: 74 22 0a 20 20 20 20 22 6d 6f 76 65 25 2e 6c 20 t". "move%.l
ab60: 25 23 33 2c 25 2f 73 70 40 2d 5c 6e 5c 74 22 0a %#3,%/sp@-\n\t".
ab70: 20 20 20 20 22 6d 6f 76 65 25 2e 6c 20 25 23 31 "move%.l %#1
ab80: 2c 25 2f 73 70 40 2d 5c 6e 5c 74 22 0a 20 20 20 ,%/sp@-\n\t".
ab90: 20 22 6d 6f 76 65 25 2e 6c 20 25 30 2c 25 2f 73 "move%.l %0,%/s
aba0: 70 40 2d 5c 6e 5c 74 22 0a 20 20 20 20 22 6d 6f p@-\n\t". "mo
abb0: 76 65 25 2e 6c 20 25 23 31 30 35 2c 25 2f 73 70 ve%.l %#105,%/sp
abc0: 40 2d 5c 6e 5c 74 22 0a 20 20 20 20 22 6d 6f 76 @-\n\t". "mov
abd0: 65 25 2e 6c 20 25 23 30 2c 25 2f 73 70 40 2d 5c e%.l %#0,%/sp@-\
abe0: 6e 5c 74 22 0a 20 20 20 20 22 6d 6f 76 65 25 2e n\t". "move%.
abf0: 6c 20 25 23 33 38 2c 25 2f 73 70 40 2d 5c 6e 5c l %#38,%/sp@-\n\
ac00: 74 22 0a 20 20 20 20 22 74 72 61 70 20 25 23 30 t". "trap %#0
ac10: 5c 6e 5c 74 22 0a 20 20 20 20 22 61 64 64 25 2e \n\t". "add%.
ac20: 6c 20 25 23 32 34 2c 25 2f 73 70 22 0a 20 20 20 l %#24,%/sp".
ac30: 20 3a 0a 20 20 20 20 3a 20 22 72 22 20 28 66 75 :. : "r" (fu
ac40: 6e 63 74 69 6f 6e 29 2c 20 22 67 22 20 28 28 69 nction), "g" ((i
ac50: 6e 74 29 54 52 41 4d 50 5f 4c 45 4e 47 54 48 29 nt)TRAMP_LENGTH)
ac60: 0a 20 20 20 20 3a 20 22 25 64 30 22 0a 20 20 20 . : "%d0".
ac70: 20 29 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 );.#endif.#endi
ac80: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f f.#if defined(__
ac90: 6d 69 70 73 5f 5f 29 20 7c 7c 20 64 65 66 69 6e mips__) || defin
aca0: 65 64 28 5f 5f 6d 69 70 73 6e 33 32 5f 5f 29 20 ed(__mipsn32__)
acb0: 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 6d 69 70 || defined(__mip
acc0: 73 36 34 5f 5f 29 0a 20 20 63 61 63 68 65 66 6c s64__). cachefl
acd0: 75 73 68 28 66 75 6e 63 74 69 6f 6e 2c 54 52 41 ush(function,TRA
ace0: 4d 50 5f 4c 45 4e 47 54 48 2c 49 43 41 43 48 45 MP_LENGTH,ICACHE
acf0: 29 3b 0a 20 20 2f 2a 20 67 66 6f 72 74 68 2d 30 );. /* gforth-0
ad00: 2e 33 2e 30 20 75 73 65 73 20 42 43 41 43 48 45 .3.0 uses BCACHE
ad10: 20 69 6e 73 74 65 61 64 20 6f 66 20 49 43 41 43 instead of ICAC
ad20: 48 45 2e 20 57 68 79 3f 3f 20 2a 2f 0a 23 65 6e HE. Why?? */.#en
ad30: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
ad40: 5f 5f 73 70 61 72 63 5f 5f 29 20 7c 7c 20 64 65 __sparc__) || de
ad50: 66 69 6e 65 64 28 5f 5f 73 70 61 72 63 36 34 5f fined(__sparc64_
ad60: 5f 29 0a 20 20 2f 2a 20 54 68 69 73 20 61 73 73 _). /* This ass
ad70: 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 74 72 umes that the tr
ad80: 61 6d 70 6f 6c 69 6e 65 20 66 69 74 73 20 69 6e ampoline fits in
ad90: 20 61 74 20 6d 6f 73 74 20 66 6f 75 72 20 63 61 at most four ca
ada0: 63 68 65 20 6c 69 6e 65 73 2e 20 2a 2f 0a 20 20 che lines. */.
adb0: 5f 5f 54 52 5f 63 6c 65 61 72 5f 63 61 63 68 65 __TR_clear_cache
adc0: 5f 34 28 66 75 6e 63 74 69 6f 6e 2c 66 75 6e 63 _4(function,func
add0: 74 69 6f 6e 2b 54 52 41 4d 50 5f 4c 45 4e 47 54 tion+TRAMP_LENGT
ade0: 48 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 H-1);.#endif.#if
adf0: 64 65 66 20 5f 5f 61 6c 70 68 61 5f 5f 0a 20 20 def __alpha__.
ae00: 5f 5f 54 52 5f 63 6c 65 61 72 5f 63 61 63 68 65 __TR_clear_cache
ae10: 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 ();.#endif.#ifde
ae20: 66 20 5f 5f 68 70 70 61 5f 5f 0a 20 20 2f 2a 20 f __hppa__. /*
ae30: 54 68 69 73 20 61 73 73 75 6d 65 73 20 74 68 61 This assumes tha
ae40: 74 20 74 68 65 20 74 72 61 6d 70 6f 6c 69 6e 65 t the trampoline
ae50: 20 66 69 74 73 20 69 6e 20 61 74 20 6d 6f 73 74 fits in at most
ae60: 20 74 77 6f 20 63 61 63 68 65 20 6c 69 6e 65 73 two cache lines
ae70: 2e 20 2a 2f 0a 20 20 5f 5f 54 52 5f 63 6c 65 61 . */. __TR_clea
ae80: 72 5f 63 61 63 68 65 28 66 75 6e 63 74 69 6f 6e r_cache(function
ae90: 2c 66 75 6e 63 74 69 6f 6e 2b 54 52 41 4d 50 5f ,function+TRAMP_
aea0: 4c 45 4e 47 54 48 2d 31 29 3b 0a 23 65 6e 64 69 LENGTH-1);.#endi
aeb0: 66 0a 23 69 66 64 65 66 20 5f 5f 61 72 6d 5f 5f f.#ifdef __arm__
aec0: 0a 20 20 5f 5f 54 52 5f 63 6c 65 61 72 5f 63 61 . __TR_clear_ca
aed0: 63 68 65 28 66 75 6e 63 74 69 6f 6e 2c 66 75 6e che(function,fun
aee0: 63 74 69 6f 6e 2b 54 52 41 4d 50 5f 4c 45 4e 47 ction+TRAMP_LENG
aef0: 54 48 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 TH);.#endif.#if
af00: 64 65 66 69 6e 65 64 28 5f 5f 70 6f 77 65 72 70 defined(__powerp
af10: 63 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65 64 c__) && !defined
af20: 28 5f 5f 70 6f 77 65 72 70 63 36 34 5f 5f 29 0a (__powerpc64__).
af30: 20 20 5f 5f 54 52 5f 63 6c 65 61 72 5f 63 61 63 __TR_clear_cac
af40: 68 65 28 66 75 6e 63 74 69 6f 6e 29 3b 0a 23 65 he(function);.#e
af50: 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d 38 ndif.#ifdef __m8
af60: 38 6b 5f 5f 0a 20 20 73 79 73 6d 6f 74 28 53 38 8k__. sysmot(S8
af70: 38 43 41 43 48 45 46 4c 55 53 48 50 41 47 45 2c 8CACHEFLUSHPAGE,
af80: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
af90: 66 75 6e 63 74 69 6f 6e 20 26 20 2d 70 61 67 65 function & -page
afa0: 73 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 23 69 size);.#endif.#i
afb0: 66 64 65 66 20 5f 5f 63 6f 6e 76 65 78 5f 5f 0a fdef __convex__.
afc0: 20 20 5f 5f 54 52 5f 63 6c 65 61 72 5f 63 61 63 __TR_clear_cac
afd0: 68 65 28 29 3b 0a 23 65 6e 64 69 66 0a 23 65 6e he();.#endif.#en
afe0: 64 69 66 0a 0a 20 20 2f 2a 20 35 2e 20 52 65 74 dif.. /* 5. Ret
aff0: 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e urn. */. return
b000: 20 28 5f 5f 54 52 5f 66 75 6e 63 74 69 6f 6e 29 (__TR_function)
b010: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 54 52 41 (function + TRA
b020: 4d 50 5f 42 49 41 53 29 3b 0a 7d 0a 0a 76 6f 69 MP_BIAS);.}..voi
b030: 64 20 66 72 65 65 5f 74 72 61 6d 70 6f 6c 69 6e d free_trampolin
b040: 65 20 28 5f 5f 54 52 5f 66 75 6e 63 74 69 6f 6e e (__TR_function
b050: 20 66 75 6e 63 74 69 6f 6e 29 0a 7b 0a 23 69 66 function).{.#if
b060: 20 54 52 41 4d 50 5f 42 49 41 53 0a 20 20 66 75 TRAMP_BIAS. fu
b070: 6e 63 74 69 6f 6e 20 3d 20 28 5f 5f 54 52 5f 66 nction = (__TR_f
b080: 75 6e 63 74 69 6f 6e 29 28 28 63 68 61 72 2a 29 unction)((char*)
b090: 66 75 6e 63 74 69 6f 6e 20 2d 20 54 52 41 4d 50 function - TRAMP
b0a0: 5f 42 49 41 53 29 3b 0a 23 65 6e 64 69 66 0a 23 _BIAS);.#endif.#
b0b0: 69 66 20 21 64 65 66 69 6e 65 64 28 43 4f 44 45 if !defined(CODE
b0c0: 5f 45 58 45 43 55 54 41 42 4c 45 29 20 26 26 20 _EXECUTABLE) &&
b0d0: 21 64 65 66 69 6e 65 64 28 45 58 45 43 55 54 41 !defined(EXECUTA
b0e0: 42 4c 45 5f 56 49 41 5f 4d 50 52 4f 54 45 43 54 BLE_VIA_MPROTECT
b0f0: 29 0a 20 20 2a 28 63 68 61 72 2a 2a 29 66 75 6e ). *(char**)fun
b100: 63 74 69 6f 6e 20 3d 20 66 72 65 65 6c 69 73 74 ction = freelist
b110: 3b 20 66 72 65 65 6c 69 73 74 20 3d 20 28 63 68 ; freelist = (ch
b120: 61 72 2a 29 66 75 6e 63 74 69 6f 6e 3b 0a 20 20 ar*)function;.
b130: 2f 2a 20 49 74 20 69 73 20 70 72 6f 62 61 62 6c /* It is probabl
b140: 79 20 6e 6f 74 20 77 6f 72 74 68 20 63 61 6c 6c y not worth call
b150: 69 6e 67 20 6d 75 6e 6d 61 70 28 29 20 66 6f 72 ing munmap() for
b160: 20 65 6e 74 69 72 65 6c 79 20 66 72 65 65 64 20 entirely freed
b170: 70 61 67 65 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a pages. */.#else.
b180: 20 20 66 72 65 65 28 28 28 63 68 61 72 2a 2a 29 free(((char**)
b190: 66 75 6e 63 74 69 6f 6e 29 5b 2d 31 5d 29 3b 0a function)[-1]);.
b1a0: 23 65 6e 64 69 66 0a 7d 0a 0a 69 6e 74 20 69 73 #endif.}..int is
b1b0: 5f 74 72 61 6d 70 6f 6c 69 6e 65 20 28 76 6f 69 _trampoline (voi
b1c0: 64 2a 20 66 75 6e 63 74 69 6f 6e 29 0a 7b 0a 23 d* function).{.#
b1d0: 69 66 64 65 66 20 69 73 5f 74 72 61 6d 70 0a 23 ifdef is_tramp.#
b1e0: 69 66 64 65 66 20 5f 5f 68 70 70 61 6e 65 77 5f ifdef __hppanew_
b1f0: 5f 0a 20 20 76 6f 69 64 2a 20 74 72 61 6d 70 5f _. void* tramp_
b200: 61 64 64 72 65 73 73 20 3d 20 26 74 72 61 6d 70 address = &tramp
b210: 3b 0a 20 20 69 66 20 28 21 28 28 28 6c 6f 6e 67 ;. if (!(((long
b220: 29 66 75 6e 63 74 69 6f 6e 20 26 20 33 29 20 3d )function & 3) =
b230: 3d 20 28 54 52 41 4d 50 5f 42 49 41 53 20 26 20 = (TRAMP_BIAS &
b240: 33 29 29 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 3))) return 0;.#
b250: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 28 endif. return (
b260: 28 69 73 5f 74 72 61 6d 70 28 28 28 63 68 61 72 (is_tramp(((char
b270: 2a 29 66 75 6e 63 74 69 6f 6e 20 2d 20 54 52 41 *)function - TRA
b280: 4d 50 5f 42 49 41 53 29 29 29 20 3f 20 31 20 3a MP_BIAS))) ? 1 :
b290: 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 61 62 6f 0);.#else. abo
b2a0: 72 74 28 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a rt();.#endif.}..
b2b0: 5f 5f 54 52 5f 66 75 6e 63 74 69 6f 6e 20 74 72 __TR_function tr
b2c0: 61 6d 70 6f 6c 69 6e 65 5f 61 64 64 72 65 73 73 ampoline_address
b2d0: 20 28 76 6f 69 64 2a 20 66 75 6e 63 74 69 6f 6e (void* function
b2e0: 29 0a 7b 0a 23 69 66 64 65 66 20 74 72 61 6d 70 ).{.#ifdef tramp
b2f0: 5f 61 64 64 72 65 73 73 0a 20 20 72 65 74 75 72 _address. retur
b300: 6e 20 28 5f 5f 54 52 5f 66 75 6e 63 74 69 6f 6e n (__TR_function
b310: 29 28 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 )(tramp_address(
b320: 28 28 63 68 61 72 2a 29 66 75 6e 63 74 69 6f 6e ((char*)function
b330: 20 2d 20 54 52 41 4d 50 5f 42 49 41 53 29 29 29 - TRAMP_BIAS)))
b340: 3b 0a 23 65 6c 73 65 0a 20 20 61 62 6f 72 74 28 ;.#else. abort(
b350: 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 76 6f 69 );.#endif.}..voi
b360: 64 2a 20 74 72 61 6d 70 6f 6c 69 6e 65 5f 76 61 d* trampoline_va
b370: 72 69 61 62 6c 65 20 28 76 6f 69 64 2a 20 66 75 riable (void* fu
b380: 6e 63 74 69 6f 6e 29 0a 7b 0a 23 69 66 64 65 66 nction).{.#ifdef
b390: 20 74 72 61 6d 70 5f 76 61 72 69 61 62 6c 65 0a tramp_variable.
b3a0: 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 return (void*)
b3b0: 28 74 72 61 6d 70 5f 76 61 72 69 61 62 6c 65 28 (tramp_variable(
b3c0: 28 28 63 68 61 72 2a 29 66 75 6e 63 74 69 6f 6e ((char*)function
b3d0: 20 2d 20 54 52 41 4d 50 5f 42 49 41 53 29 29 29 - TRAMP_BIAS)))
b3e0: 3b 0a 23 65 6c 73 65 0a 20 20 61 62 6f 72 74 28 ;.#else. abort(
b3f0: 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 76 6f 69 );.#endif.}..voi
b400: 64 2a 20 74 72 61 6d 70 6f 6c 69 6e 65 5f 64 61 d* trampoline_da
b410: 74 61 20 28 76 6f 69 64 2a 20 66 75 6e 63 74 69 ta (void* functi
b420: 6f 6e 29 0a 7b 0a 23 69 66 64 65 66 20 74 72 61 on).{.#ifdef tra
b430: 6d 70 5f 64 61 74 61 0a 20 20 72 65 74 75 72 6e mp_data. return
b440: 20 28 76 6f 69 64 2a 29 28 74 72 61 6d 70 5f 64 (void*)(tramp_d
b450: 61 74 61 28 28 28 63 68 61 72 2a 29 66 75 6e 63 ata(((char*)func
b460: 74 69 6f 6e 20 2d 20 54 52 41 4d 50 5f 42 49 41 tion - TRAMP_BIA
b470: 53 29 29 29 3b 0a 23 65 6c 73 65 0a 20 20 61 62 S)));.#else. ab
b480: 6f 72 74 28 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a ort();.#endif.}.