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: 5f 72 2e 68 22 0a 0a 23 69 66 20 64 65 66 69 6e _r.h"..#if defin
01a0: 65 64 28 5f 5f 68 70 70 61 5f 5f 29 0a 23 69 66 ed(__hppa__).#if
01b0: 20 30 0a 23 64 65 66 69 6e 65 20 5f 5f 68 70 70 0.#define __hpp
01c0: 61 6f 6c 64 5f 5f 20 20 2f 2a 20 4f 6c 64 20 74 aold__ /* Old t
01d0: 72 61 6d 70 6f 6c 69 6e 65 2c 20 72 65 61 6c 20 rampoline, real
01e0: 6d 61 63 68 69 6e 65 20 63 6f 64 65 2e 20 2a 2f machine code. */
01f0: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 5f .#else.#define _
0200: 5f 68 70 70 61 6e 65 77 5f 5f 20 20 2f 2a 20 4e _hppanew__ /* N
0210: 65 77 20 74 72 61 6d 70 6f 6c 69 6e 65 2c 20 6a ew trampoline, j
0220: 75 73 74 20 61 20 63 6c 6f 73 75 72 65 2e 20 2a ust a closure. *
0230: 2f 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a /.#endif.#endif.
0240: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 70 6f #if defined(__po
0250: 77 65 72 70 63 5f 5f 29 20 26 26 20 21 64 65 66 werpc__) && !def
0260: 69 6e 65 64 28 5f 5f 70 6f 77 65 72 70 63 36 34 ined(__powerpc64
0270: 5f 5f 29 0a 23 69 66 20 21 64 65 66 69 6e 65 64 __).#if !defined
0280: 28 5f 41 49 58 29 0a 23 64 65 66 69 6e 65 20 5f (_AIX).#define _
0290: 5f 70 6f 77 65 72 70 63 73 79 73 76 34 5f 5f 20 _powerpcsysv4__
02a0: 20 2f 2a 20 53 79 73 56 2e 34 20 41 42 49 2c 20 /* SysV.4 ABI,
02b0: 72 65 61 6c 20 6d 61 63 68 69 6e 65 20 63 6f 64 real machine cod
02c0: 65 2e 20 2a 2f 0a 23 65 6c 73 65 0a 23 64 65 66 e. */.#else.#def
02d0: 69 6e 65 20 5f 5f 70 6f 77 65 72 70 63 61 69 78 ine __powerpcaix
02e0: 5f 5f 20 20 2f 2a 20 41 49 58 20 41 42 49 2c 20 __ /* AIX ABI,
02f0: 6a 75 73 74 20 61 20 63 6c 6f 73 75 72 65 2e 20 just a closure.
0300: 2a 2f 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 */.#endif.#endif
0310: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 70 .#if defined(__p
0320: 6f 77 65 72 70 63 36 34 5f 5f 29 0a 2f 2a 20 54 owerpc64__)./* T
0330: 68 65 20 6f 6e 6c 79 20 41 42 49 20 6f 6e 20 70 he only ABI on p
0340: 6f 77 65 72 70 63 36 34 20 6b 6e 6f 77 6e 20 73 owerpc64 known s
0350: 6f 20 66 61 72 20 69 73 20 74 68 65 20 41 49 58 o far is the AIX
0360: 20 41 42 49 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 ABI. */.#define
0370: 20 5f 5f 70 6f 77 65 72 70 63 36 34 61 69 78 5f __powerpc64aix_
0380: 5f 20 20 2f 2a 20 41 49 58 20 41 42 49 2c 20 6a _ /* AIX ABI, j
0390: 75 73 74 20 61 20 63 6c 6f 73 75 72 65 2e 20 2a ust a closure. *
03a0: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 /.#endif.#if def
03b0: 69 6e 65 64 28 5f 5f 68 70 70 61 6e 65 77 5f 5f ined(__hppanew__
03c0: 29 0a 2f 2a 0a 20 2a 20 41 20 66 75 6e 63 74 69 )./*. * A functi
03d0: 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 20 61 20 on pointer is a
03e0: 62 69 61 73 65 64 20 70 6f 69 6e 74 65 72 20 74 biased pointer t
03f0: 6f 20 61 20 64 61 74 61 20 61 72 65 61 20 77 68 o a data area wh
0400: 6f 73 65 20 66 69 72 73 74 20 77 6f 72 64 0a 20 ose first word.
0410: 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 61 * contains the a
0420: 63 74 75 61 6c 20 61 64 64 72 65 73 73 20 6f 66 ctual address of
0430: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 the function..
0440: 2a 2f 0a 65 78 74 65 72 6e 20 76 6f 69 64 20 74 */.extern void t
0450: 72 61 6d 70 5f 72 20 28 29 3b 20 2f 2a 20 74 72 ramp_r (); /* tr
0460: 61 6d 70 6f 6c 69 6e 65 20 70 72 6f 74 6f 74 79 ampoline prototy
0470: 70 65 20 2a 2f 0a 2f 2a 20 57 65 20 64 6f 6e 27 pe */./* We don'
0480: 74 20 6e 65 65 64 20 74 6f 20 74 61 6b 65 20 61 t need to take a
0490: 6e 79 20 73 70 65 63 69 61 6c 20 6d 65 61 73 75 ny special measu
04a0: 72 65 73 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 res to make the
04b0: 63 6f 64 65 20 65 78 65 63 75 74 61 62 6c 65 0a code executable.
04c0: 20 2a 20 73 69 6e 63 65 20 74 68 65 20 61 63 74 * since the act
04d0: 75 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 ual instructions
04e0: 20 61 72 65 20 69 6e 20 74 68 65 20 74 65 78 74 are in the text
04f0: 20 73 65 67 6d 65 6e 74 2e 0a 20 2a 2f 0a 23 69 segment.. */.#i
0500: 66 6e 64 65 66 20 43 4f 44 45 5f 45 58 45 43 55 fndef CODE_EXECU
0510: 54 41 42 4c 45 0a 23 64 65 66 69 6e 65 20 43 4f TABLE.#define CO
0520: 44 45 5f 45 58 45 43 55 54 41 42 4c 45 0a 23 65 DE_EXECUTABLE.#e
0530: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 20 ndif.#endif.#if
0540: 64 65 66 69 6e 65 64 28 5f 5f 70 6f 77 65 72 70 defined(__powerp
0550: 63 61 69 78 5f 5f 29 20 7c 7c 20 64 65 66 69 6e caix__) || defin
0560: 65 64 28 5f 5f 70 6f 77 65 72 70 63 36 34 61 69 ed(__powerpc64ai
0570: 78 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 x__) || defined(
0580: 5f 5f 69 61 36 34 5f 5f 29 0a 2f 2a 0a 20 2a 20 __ia64__)./*. *
0590: 41 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 A function point
05a0: 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 er is a pointer
05b0: 74 6f 20 61 20 64 61 74 61 20 61 72 65 61 20 77 to a data area w
05c0: 68 6f 73 65 20 66 69 72 73 74 20 77 6f 72 64 20 hose first word
05d0: 63 6f 6e 74 61 69 6e 73 0a 20 2a 20 74 68 65 20 contains. * the
05e0: 61 63 74 75 61 6c 20 61 64 64 72 65 73 73 20 6f actual address o
05f0: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a f the function..
0600: 20 2a 2f 0a 65 78 74 65 72 6e 20 76 6f 69 64 20 */.extern void
0610: 28 2a 74 72 61 6d 70 5f 72 29 20 28 29 3b 20 2f (*tramp_r) (); /
0620: 2a 20 74 72 61 6d 70 6f 6c 69 6e 65 20 70 72 6f * trampoline pro
0630: 74 6f 74 79 70 65 20 2a 2f 0a 2f 2a 20 57 65 20 totype */./* We
0640: 64 6f 6e 27 74 20 6e 65 65 64 20 74 6f 20 74 61 don't need to ta
0650: 6b 65 20 61 6e 79 20 73 70 65 63 69 61 6c 20 6d ke any special m
0660: 65 61 73 75 72 65 73 20 74 6f 20 6d 61 6b 65 20 easures to make
0670: 74 68 65 20 63 6f 64 65 20 65 78 65 63 75 74 61 the code executa
0680: 62 6c 65 0a 20 2a 20 73 69 6e 63 65 20 74 68 65 ble. * since the
0690: 20 61 63 74 75 61 6c 20 69 6e 73 74 72 75 63 74 actual instruct
06a0: 69 6f 6e 73 20 61 72 65 20 69 6e 20 74 68 65 20 ions are in the
06b0: 74 65 78 74 20 73 65 67 6d 65 6e 74 2e 0a 20 2a text segment.. *
06c0: 2f 0a 23 69 66 6e 64 65 66 20 43 4f 44 45 5f 45 /.#ifndef CODE_E
06d0: 58 45 43 55 54 41 42 4c 45 0a 23 64 65 66 69 6e XECUTABLE.#defin
06e0: 65 20 43 4f 44 45 5f 45 58 45 43 55 54 41 42 4c e CODE_EXECUTABL
06f0: 45 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a E.#endif.#endif.
0700: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 6d 36 #if defined(__m6
0710: 38 6b 5f 5f 29 0a 23 69 66 20 64 65 66 69 6e 65 8k__).#if define
0720: 64 28 41 4d 49 47 41 29 20 2f 2a 20 41 6d 69 67 d(AMIGA) /* Amig
0730: 61 20 72 75 6e 6e 69 6e 67 20 41 6d 69 67 61 4f a running AmigaO
0740: 53 2c 20 6e 6f 74 20 4c 69 6e 75 78 20 2a 2f 0a S, not Linux */.
0750: 23 69 66 6e 64 65 66 20 43 4f 44 45 5f 45 58 45 #ifndef CODE_EXE
0760: 43 55 54 41 42 4c 45 20 2f 2a 20 63 6f 6e 66 69 CUTABLE /* confi
0770: 67 75 72 65 20 67 75 65 73 73 65 73 20 77 72 6f gure guesses wro
0780: 6e 67 3f 3f 20 2a 2f 0a 23 64 65 66 69 6e 65 20 ng?? */.#define
0790: 43 4f 44 45 5f 45 58 45 43 55 54 41 42 4c 45 0a CODE_EXECUTABLE.
07a0: 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 65 #endif.#endif.#e
07b0: 6e 64 69 66 0a 0a 2f 2a 20 41 73 20 6f 66 20 57 ndif../* As of W
07c0: 69 6e 64 6f 77 73 20 58 50 20 53 50 20 32 2c 20 indows XP SP 2,
07d0: 6d 61 6c 6c 6f 63 27 64 20 6d 65 6d 6f 72 79 20 malloc'd memory
07e0: 69 73 20 6e 6f 74 20 65 78 65 63 75 74 61 62 6c is not executabl
07f0: 65 20 2a 2f 0a 23 69 66 64 65 66 20 5f 57 49 4e e */.#ifdef _WIN
0800: 33 32 0a 23 75 6e 64 65 66 20 43 4f 44 45 5f 45 32.#undef CODE_E
0810: 58 45 43 55 54 41 42 4c 45 0a 23 65 6e 64 69 66 XECUTABLE.#endif
0820: 0a 0a 23 69 66 6e 64 65 66 20 43 4f 44 45 5f 45 ..#ifndef CODE_E
0830: 58 45 43 55 54 41 42 4c 45 0a 2f 2a 20 48 6f 77 XECUTABLE./* How
0840: 20 64 6f 20 77 65 20 6d 61 6b 65 20 74 68 65 20 do we make the
0850: 74 72 61 6d 70 6f 6c 69 6e 65 27 73 20 63 6f 64 trampoline's cod
0860: 65 20 65 78 65 63 75 74 61 62 6c 65 3f 20 2a 2f e executable? */
0870: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 .#if defined(HAV
0880: 45 5f 4d 41 43 48 5f 56 4d 29 20 7c 7c 20 64 65 E_MACH_VM) || de
0890: 66 69 6e 65 64 28 5f 5f 63 6f 6e 76 65 78 5f 5f fined(__convex__
08a0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 48 41 56 ) || defined(HAV
08b0: 45 5f 57 4f 52 4b 49 4e 47 5f 4d 50 52 4f 54 45 E_WORKING_MPROTE
08c0: 43 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 48 CT) || defined(H
08d0: 41 56 45 5f 53 59 53 5f 4d 38 38 4b 42 43 53 5f AVE_SYS_M88KBCS_
08e0: 48 29 0a 2f 2a 20 6d 70 72 6f 74 65 63 74 28 29 H)./* mprotect()
08f0: 20 5b 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 5d [or equivalent]
0900: 20 74 68 65 20 6d 61 6c 6c 6f 63 27 65 64 20 61 the malloc'ed a
0910: 72 65 61 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 rea. */.#define
0920: 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41 5f 4d EXECUTABLE_VIA_M
0930: 50 52 4f 54 45 43 54 0a 23 65 6c 73 65 0a 23 69 PROTECT.#else.#i
0940: 66 64 65 66 20 48 41 56 45 5f 4d 4d 41 50 0a 2f fdef HAVE_MMAP./
0950: 2a 20 55 73 65 20 61 6e 20 6d 6d 61 70 27 65 64 * Use an mmap'ed
0960: 20 70 61 67 65 2e 20 2a 2f 0a 23 64 65 66 69 6e page. */.#defin
0970: 65 20 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41 e EXECUTABLE_VIA
0980: 5f 4d 4d 41 50 0a 23 69 66 64 65 66 20 48 41 56 _MMAP.#ifdef HAV
0990: 45 5f 4d 4d 41 50 5f 41 4e 4f 4e 59 4d 4f 55 53 E_MMAP_ANONYMOUS
09a0: 0a 2f 2a 20 55 73 65 20 6d 6d 61 70 20 77 69 74 ./* Use mmap wit
09b0: 68 20 74 68 65 20 4d 41 50 5f 41 4e 4f 4e 59 4d h the MAP_ANONYM
09c0: 4f 55 53 20 6f 72 20 4d 41 50 5f 41 4e 4f 4e 20 OUS or MAP_ANON
09d0: 66 6c 61 67 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 flag. */.#define
09e0: 20 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41 5f EXECUTABLE_VIA_
09f0: 4d 4d 41 50 5f 41 4e 4f 4e 59 4d 4f 55 53 0a 23 MMAP_ANONYMOUS.#
0a00: 65 6c 73 65 0a 2f 2a 20 55 73 65 20 6d 6d 61 70 else./* Use mmap
0a10: 20 6f 6e 20 2f 64 65 76 2f 7a 65 72 6f 2e 20 2a on /dev/zero. *
0a20: 2f 0a 23 64 65 66 69 6e 65 20 45 58 45 43 55 54 /.#define EXECUT
0a30: 41 42 4c 45 5f 56 49 41 5f 4d 4d 41 50 5f 44 45 ABLE_VIA_MMAP_DE
0a40: 56 5a 45 52 4f 0a 23 65 6e 64 69 66 0a 23 65 6c VZERO.#endif.#el
0a50: 73 65 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 se.#ifdef HAVE_S
0a60: 48 4d 0a 2f 2a 20 55 73 65 20 61 6e 20 73 68 6d HM./* Use an shm
0a70: 61 74 27 65 64 20 70 61 67 65 2e 20 2a 2f 0a 23 at'ed page. */.#
0a80: 64 65 66 69 6e 65 20 45 58 45 43 55 54 41 42 4c define EXECUTABL
0a90: 45 5f 56 49 41 5f 53 48 4d 0a 23 65 6c 73 65 0a E_VIA_SHM.#else.
0aa0: 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 2f 2a #ifdef _WIN32./*
0ab0: 20 55 73 65 20 56 69 72 74 75 61 6c 41 6c 6c 6f Use VirtualAllo
0ac0: 63 20 2a 2f 0a 23 65 6c 73 65 0a 3f 3f 0a 23 65 c */.#else.??.#e
0ad0: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 65 6e 64 ndif.#endif.#end
0ae0: 69 66 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 if.#endif.#endif
0af0: 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 ..#include <stdi
0b00: 6f 2e 68 3e 20 2f 2a 20 64 65 63 6c 61 72 65 73 o.h> /* declares
0b10: 20 66 70 72 69 6e 74 66 28 29 20 2a 2f 0a 0a 23 fprintf() */..#
0b20: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 include <sys/typ
0b30: 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c es.h>.#include <
0b40: 73 74 64 6c 69 62 2e 68 3e 20 2f 2a 20 64 65 63 stdlib.h> /* dec
0b50: 6c 61 72 65 73 20 61 62 6f 72 74 28 29 2c 20 6d lares abort(), m
0b60: 61 6c 6c 6f 63 28 29 2c 20 66 72 65 65 28 29 20 alloc(), free()
0b70: 2a 2f 0a 23 69 66 64 65 66 20 48 41 56 45 5f 55 */.#ifdef HAVE_U
0b80: 4e 49 53 54 44 5f 48 0a 23 69 6e 63 6c 75 64 65 NISTD_H.#include
0b90: 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 65 6e 64 <unistd.h>.#end
0ba0: 69 66 0a 0a 2f 2a 20 44 65 63 6c 61 72 65 20 67 if../* Declare g
0bb0: 65 74 70 61 67 65 73 69 7a 65 28 29 2e 20 2a 2f etpagesize(). */
0bc0: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 47 45 54 .#ifdef HAVE_GET
0bd0: 50 41 47 45 53 49 5a 45 0a 23 69 66 64 65 66 20 PAGESIZE.#ifdef
0be0: 5f 5f 63 70 6c 75 73 70 6c 75 73 0a 65 78 74 65 __cplusplus.exte
0bf0: 72 6e 20 22 43 22 20 52 45 54 47 45 54 50 41 47 rn "C" RETGETPAG
0c00: 45 53 49 5a 45 54 59 50 45 20 67 65 74 70 61 67 ESIZETYPE getpag
0c10: 65 73 69 7a 65 20 28 76 6f 69 64 29 3b 0a 23 65 esize (void);.#e
0c20: 6c 73 65 0a 65 78 74 65 72 6e 20 52 45 54 47 45 lse.extern RETGE
0c30: 54 50 41 47 45 53 49 5a 45 54 59 50 45 20 67 65 TPAGESIZETYPE ge
0c40: 74 70 61 67 65 73 69 7a 65 20 28 76 6f 69 64 29 tpagesize (void)
0c50: 3b 0a 23 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 ;.#endif.#else.#
0c60: 69 66 64 65 66 20 48 41 56 45 5f 53 59 53 5f 50 ifdef HAVE_SYS_P
0c70: 41 52 41 4d 5f 48 0a 23 69 6e 63 6c 75 64 65 20 ARAM_H.#include
0c80: 3c 73 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 65 <sys/param.h>.#e
0c90: 6c 73 65 0a 2f 2a 20 4e 6f 74 20 55 6e 69 78 2c lse./* Not Unix,
0ca0: 20 65 2e 67 2e 20 6d 69 6e 67 77 33 32 20 2a 2f e.g. mingw32 */
0cb0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 53 49 5a .#define PAGESIZ
0cc0: 45 20 34 30 39 36 0a 23 65 6e 64 69 66 0a 23 64 E 4096.#endif.#d
0cd0: 65 66 69 6e 65 20 67 65 74 70 61 67 65 73 69 7a efine getpagesiz
0ce0: 65 28 29 20 50 41 47 45 53 49 5a 45 0a 23 65 6e e() PAGESIZE.#en
0cf0: 64 69 66 0a 0a 2f 2a 20 44 65 63 6c 61 72 65 20 dif../* Declare
0d00: 6d 70 72 6f 74 65 63 74 28 29 20 6f 72 20 65 71 mprotect() or eq
0d10: 75 69 76 61 6c 65 6e 74 2e 20 2a 2f 0a 23 69 66 uivalent. */.#if
0d20: 64 65 66 20 45 58 45 43 55 54 41 42 4c 45 5f 56 def EXECUTABLE_V
0d30: 49 41 5f 4d 50 52 4f 54 45 43 54 0a 23 69 66 64 IA_MPROTECT.#ifd
0d40: 65 66 20 48 41 56 45 5f 4d 41 43 48 5f 56 4d 0a ef HAVE_MACH_VM.
0d50: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 72 65 #include <sys/re
0d60: 73 6f 75 72 63 65 2e 68 3e 0a 23 69 6e 63 6c 75 source.h>.#inclu
0d70: 64 65 20 3c 6d 61 63 68 2f 6d 61 63 68 5f 69 6e de <mach/mach_in
0d80: 74 65 72 66 61 63 65 2e 68 3e 0a 23 69 66 64 65 terface.h>.#ifde
0d90: 66 20 4e 65 58 54 0a 23 69 6e 63 6c 75 64 65 20 f NeXT.#include
0da0: 3c 6d 61 63 68 2f 6d 61 63 68 5f 69 6e 69 74 2e <mach/mach_init.
0db0: 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 h>.#endif.#ifdef
0dc0: 20 5f 5f 6f 73 66 5f 5f 0a 23 69 6e 63 6c 75 64 __osf__.#includ
0dd0: 65 20 3c 6d 61 63 68 5f 69 6e 69 74 2e 68 3e 0a e <mach_init.h>.
0de0: 23 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20 #endif.#include
0df0: 3c 6d 61 63 68 2f 6d 61 63 68 69 6e 65 2f 76 6d <mach/machine/vm
0e00: 5f 70 61 72 61 6d 2e 68 3e 0a 23 65 6c 73 65 0a _param.h>.#else.
0e10: 23 69 66 64 65 66 20 48 41 56 45 5f 53 59 53 5f #ifdef HAVE_SYS_
0e20: 4d 38 38 4b 42 43 53 5f 48 0a 23 69 6e 63 6c 75 M88KBCS_H.#inclu
0e30: 64 65 20 3c 73 79 73 2f 6d 38 38 6b 62 63 73 2e de <sys/m88kbcs.
0e40: 68 3e 0a 23 64 65 66 69 6e 65 20 67 65 74 70 61 h>.#define getpa
0e50: 67 65 73 69 7a 65 28 29 20 20 34 30 39 36 20 20 gesize() 4096
0e60: 2f 2a 20 3f 3f 20 2a 2f 0a 23 65 6c 73 65 0a 23 /* ?? */.#else.#
0e70: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 include <sys/typ
0e80: 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c es.h>.#include <
0e90: 73 79 73 2f 6d 6d 61 6e 2e 68 3e 0a 23 65 6e 64 sys/mman.h>.#end
0ea0: 69 66 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 if.#endif.#endif
0eb0: 0a 0a 2f 2a 20 44 65 63 6c 61 72 65 20 6d 6d 61 ../* Declare mma
0ec0: 70 28 29 2e 20 2a 2f 0a 23 69 66 64 65 66 20 45 p(). */.#ifdef E
0ed0: 58 45 43 55 54 41 42 4c 45 5f 56 49 41 5f 4d 4d XECUTABLE_VIA_MM
0ee0: 41 50 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 AP.#include <sys
0ef0: 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 /types.h>.#inclu
0f00: 64 65 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68 3e 0a de <sys/mman.h>.
0f10: 23 69 66 20 21 64 65 66 69 6e 65 64 28 50 52 4f #if !defined(PRO
0f20: 54 5f 45 58 45 43 29 20 26 26 20 64 65 66 69 6e T_EXEC) && defin
0f30: 65 64 28 50 52 4f 54 5f 45 58 45 43 55 54 45 29 ed(PROT_EXECUTE)
0f40: 20 2f 2a 20 49 72 69 78 20 34 2e 30 2e 35 20 6e /* Irix 4.0.5 n
0f50: 65 65 64 73 20 74 68 69 73 20 2a 2f 0a 23 64 65 eeds this */.#de
0f60: 66 69 6e 65 20 50 52 4f 54 5f 45 58 45 43 20 50 fine PROT_EXEC P
0f70: 52 4f 54 5f 45 58 45 43 55 54 45 0a 23 65 6e 64 ROT_EXECUTE.#end
0f80: 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 44 65 if.#endif../* De
0f90: 63 6c 61 72 65 20 6f 70 65 6e 28 29 2e 20 2a 2f clare open(). */
0fa0: 0a 23 69 66 64 65 66 20 45 58 45 43 55 54 41 42 .#ifdef EXECUTAB
0fb0: 4c 45 5f 56 49 41 5f 4d 4d 41 50 5f 44 45 56 5a LE_VIA_MMAP_DEVZ
0fc0: 45 52 4f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 ERO.#include <sy
0fd0: 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c s/types.h>.#incl
0fe0: 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 ude <unistd.h>.#
0ff0: 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c 2e 68 include <fcntl.h
1000: 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 44 65 63 >.#endif../* Dec
1010: 6c 61 72 65 20 73 68 6d 67 65 74 28 29 2c 20 73 lare shmget(), s
1020: 68 6d 61 74 28 29 2c 20 73 68 6d 63 74 6c 28 29 hmat(), shmctl()
1030: 2e 20 2a 2f 0a 23 69 66 64 65 66 20 45 58 45 43 . */.#ifdef EXEC
1040: 55 54 41 42 4c 45 5f 56 49 41 5f 53 48 4d 0a 23 UTABLE_VIA_SHM.#
1050: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 include <sys/typ
1060: 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c es.h>.#include <
1070: 73 79 73 2f 69 70 63 2e 68 3e 0a 23 69 6e 63 6c sys/ipc.h>.#incl
1080: 75 64 65 20 3c 73 79 73 2f 73 68 6d 2e 68 3e 0a ude <sys/shm.h>.
1090: 23 69 66 64 65 66 20 48 41 56 45 5f 53 59 53 5f #ifdef HAVE_SYS_
10a0: 53 59 53 4d 41 43 52 4f 53 5f 48 0a 23 69 6e 63 SYSMACROS_H.#inc
10b0: 6c 75 64 65 20 3c 73 79 73 2f 73 79 73 6d 61 63 lude <sys/sysmac
10c0: 72 6f 73 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 65 ros.h>.#endif.#e
10d0: 6e 64 69 66 0a 0a 2f 2a 20 53 75 70 70 6f 72 74 ndif../* Support
10e0: 20 66 6f 72 20 69 6e 73 74 72 75 63 74 69 6f 6e for instruction
10f0: 20 63 61 63 68 65 20 66 6c 75 73 68 2e 20 2a 2f cache flush. */
1100: 0a 23 69 66 64 65 66 20 5f 5f 69 33 38 36 5f 5f .#ifdef __i386__
1110: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 .#if defined(_WI
1120: 4e 33 32 29 20 2f 2a 20 57 69 6e 64 6f 77 73 4e N32) /* WindowsN
1130: 54 20 6f 72 20 57 69 6e 64 6f 77 73 39 35 20 2a T or Windows95 *
1140: 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 33 32 5f /.#define WIN32_
1150: 4c 45 41 4e 5f 41 4e 44 5f 4d 45 41 4e 0a 23 64 LEAN_AND_MEAN.#d
1160: 65 66 69 6e 65 20 57 49 4e 33 32 5f 45 58 54 52 efine WIN32_EXTR
1170: 41 5f 4c 45 41 4e 0a 23 69 6e 63 6c 75 64 65 20 A_LEAN.#include
1180: 3c 77 69 6e 64 6f 77 73 2e 68 3e 0a 23 65 6e 64 <windows.h>.#end
1190: 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 if.#endif.#ifdef
11a0: 20 5f 5f 6d 36 38 6b 5f 5f 0a 23 69 66 20 64 65 __m68k__.#if de
11b0: 66 69 6e 65 64 28 41 4d 49 47 41 29 20 2f 2a 20 fined(AMIGA) /*
11c0: 41 6d 69 67 61 20 72 75 6e 6e 69 6e 67 20 41 6d Amiga running Am
11d0: 69 67 61 4f 53 2c 20 6e 6f 74 20 4c 69 6e 75 78 igaOS, not Linux
11e0: 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 65 78 */.#include <ex
11f0: 65 63 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 ec/types.h>.#inc
1200: 6c 75 64 65 20 3c 65 78 65 63 2f 65 78 65 63 62 lude <exec/execb
1210: 61 73 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 ase.h>.#include
1220: 3c 70 72 6f 74 6f 2f 65 78 65 63 2e 68 3e 0a 23 <proto/exec.h>.#
1230: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 68 70 75 endif.#ifdef hpu
1240: 78 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f x.#include <sys/
1250: 63 61 63 68 65 2e 68 3e 0a 23 65 6e 64 69 66 0a cache.h>.#endif.
1260: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
1270: 65 64 28 5f 5f 6d 69 70 73 5f 5f 29 20 7c 7c 20 ed(__mips__) ||
1280: 64 65 66 69 6e 65 64 28 5f 5f 6d 69 70 73 6e 33 defined(__mipsn3
1290: 32 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 2__) || defined(
12a0: 5f 5f 6d 69 70 73 36 34 5f 5f 29 0a 23 69 66 64 __mips64__).#ifd
12b0: 65 66 20 75 6c 74 72 69 78 0a 23 69 6e 63 6c 75 ef ultrix.#inclu
12c0: 64 65 20 3c 6d 69 70 73 2f 63 61 63 68 65 63 74 de <mips/cachect
12d0: 6c 2e 68 3e 0a 23 65 6c 73 65 0a 23 69 66 64 65 l.h>.#else.#ifde
12e0: 66 20 6c 69 6e 75 78 0a 23 69 6e 63 6c 75 64 65 f linux.#include
12f0: 20 3c 61 73 6d 2f 63 61 63 68 65 63 74 6c 2e 68 <asm/cachectl.h
1300: 3e 0a 23 65 6c 73 65 0a 23 69 66 64 65 66 20 48 >.#else.#ifdef H
1310: 41 56 45 5f 53 59 53 5f 43 41 43 48 45 43 54 4c AVE_SYS_CACHECTL
1320: 5f 48 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 _H.#include <sys
1330: 2f 63 61 63 68 65 63 74 6c 2e 68 3e 0a 23 65 6e /cachectl.h>.#en
1340: 64 69 66 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 dif.#endif.#endi
1350: 66 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 f.#endif.#ifdef
1360: 5f 5f 6d 38 38 6b 5f 5f 0a 23 69 6e 63 6c 75 64 __m88k__.#includ
1370: 65 20 3c 73 79 73 2f 73 79 73 6c 6f 63 61 6c 2e e <sys/syslocal.
1380: 68 3e 0a 23 65 6e 64 69 66 0a 2f 2a 20 49 6e 6c h>.#endif./* Inl
1390: 69 6e 65 20 61 73 73 65 6d 62 6c 79 20 66 75 6e ine assembly fun
13a0: 63 74 69 6f 6e 20 66 6f 72 20 69 6e 73 74 72 75 ction for instru
13b0: 63 74 69 6f 6e 20 63 61 63 68 65 20 66 6c 75 73 ction cache flus
13c0: 68 2e 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 h. */.#if define
13d0: 64 28 5f 5f 73 70 61 72 63 5f 5f 29 20 7c 7c 20 d(__sparc__) ||
13e0: 64 65 66 69 6e 65 64 28 5f 5f 73 70 61 72 63 36 defined(__sparc6
13f0: 34 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4__) || defined(
1400: 5f 5f 61 6c 70 68 61 5f 5f 29 20 7c 7c 20 64 65 __alpha__) || de
1410: 66 69 6e 65 64 28 5f 5f 68 70 70 61 6f 6c 64 5f fined(__hppaold_
1420: 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f _) || defined(__
1430: 70 6f 77 65 72 70 63 73 79 73 76 34 5f 5f 29 20 powerpcsysv4__)
1440: 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 63 6f 6e || defined(__con
1450: 76 65 78 5f 5f 29 0a 23 69 66 64 65 66 20 5f 5f vex__).#ifdef __
1460: 47 4e 55 43 5f 5f 0a 65 78 74 65 72 6e 20 69 6e GNUC__.extern in
1470: 6c 69 6e 65 0a 23 69 66 20 64 65 66 69 6e 65 64 line.#if defined
1480: 28 5f 5f 73 70 61 72 63 5f 5f 29 20 7c 7c 20 64 (__sparc__) || d
1490: 65 66 69 6e 65 64 28 5f 5f 73 70 61 72 63 36 34 efined(__sparc64
14a0: 5f 5f 29 0a 23 69 6e 63 6c 75 64 65 20 22 63 61 __).#include "ca
14b0: 63 68 65 2d 73 70 61 72 63 2e 63 22 0a 23 65 6e che-sparc.c".#en
14c0: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 61 6c 70 dif.#ifdef __alp
14d0: 68 61 5f 5f 0a 23 69 6e 63 6c 75 64 65 20 22 63 ha__.#include "c
14e0: 61 63 68 65 2d 61 6c 70 68 61 2e 63 22 0a 23 65 ache-alpha.c".#e
14f0: 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 68 70 ndif.#ifdef __hp
1500: 70 61 5f 5f 0a 23 69 6e 63 6c 75 64 65 20 22 63 pa__.#include "c
1510: 61 63 68 65 2d 68 70 70 61 2e 63 22 0a 23 65 6e ache-hppa.c".#en
1520: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
1530: 5f 5f 70 6f 77 65 72 70 63 5f 5f 29 20 26 26 20 __powerpc__) &&
1540: 21 64 65 66 69 6e 65 64 28 5f 5f 70 6f 77 65 72 !defined(__power
1550: 70 63 36 34 5f 5f 29 0a 23 69 6e 63 6c 75 64 65 pc64__).#include
1560: 20 22 63 61 63 68 65 2d 70 6f 77 65 72 70 63 2e "cache-powerpc.
1570: 63 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 c".#endif.#ifdef
1580: 20 5f 5f 63 6f 6e 76 65 78 5f 5f 0a 23 69 6e 63 __convex__.#inc
1590: 6c 75 64 65 20 22 63 61 63 68 65 2d 63 6f 6e 76 lude "cache-conv
15a0: 65 78 2e 63 22 0a 23 65 6e 64 69 66 0a 23 65 6c ex.c".#endif.#el
15b0: 73 65 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f se.#if defined(_
15c0: 5f 73 70 61 72 63 5f 5f 29 20 7c 7c 20 64 65 66 _sparc__) || def
15d0: 69 6e 65 64 28 5f 5f 73 70 61 72 63 36 34 5f 5f ined(__sparc64__
15e0: 29 0a 65 78 74 65 72 6e 20 76 6f 69 64 20 5f 5f ).extern void __
15f0: 54 52 5f 63 6c 65 61 72 5f 63 61 63 68 65 5f 34 TR_clear_cache_4
1600: 28 29 3b 0a 23 65 6c 73 65 0a 65 78 74 65 72 6e ();.#else.extern
1610: 20 76 6f 69 64 20 5f 5f 54 52 5f 63 6c 65 61 72 void __TR_clear
1620: 5f 63 61 63 68 65 28 29 3b 0a 23 65 6e 64 69 66 _cache();.#endif
1630: 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a .#endif.#endif..
1640: 2f 2a 20 4c 65 6e 67 74 68 20 61 6e 64 20 61 6c /* Length and al
1650: 69 67 6e 6d 65 6e 74 20 6f 66 20 74 72 61 6d 70 ignment of tramp
1660: 6f 6c 69 6e 65 20 2a 2f 0a 23 69 66 64 65 66 20 oline */.#ifdef
1670: 5f 5f 69 33 38 36 5f 5f 0a 23 64 65 66 69 6e 65 __i386__.#define
1680: 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 31 36 TRAMP_LENGTH 16
1690: 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 .#define TRAMP_A
16a0: 4c 49 47 4e 20 31 36 20 20 2f 2a 20 34 20 66 6f LIGN 16 /* 4 fo
16b0: 72 20 61 20 69 33 38 36 2c 20 31 36 20 66 6f 72 r a i386, 16 for
16c0: 20 61 20 69 34 38 36 20 2a 2f 0a 23 65 6e 64 69 a i486 */.#endi
16d0: 66 0a 23 69 66 64 65 66 20 5f 5f 6d 36 38 6b 5f f.#ifdef __m68k_
16e0: 5f 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f _.#define TRAMP_
16f0: 4c 45 4e 47 54 48 20 31 34 0a 23 64 65 66 69 6e LENGTH 14.#defin
1700: 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20 31 36 e TRAMP_ALIGN 16
1710: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
1720: 6e 65 64 28 5f 5f 6d 69 70 73 5f 5f 29 20 7c 7c ned(__mips__) ||
1730: 20 64 65 66 69 6e 65 64 28 5f 5f 6d 69 70 73 6e defined(__mipsn
1740: 33 32 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65 32__) && !define
1750: 64 28 5f 5f 6d 69 70 73 36 34 5f 5f 29 0a 23 64 d(__mips64__).#d
1760: 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47 efine TRAMP_LENG
1770: 54 48 20 32 34 0a 23 64 65 66 69 6e 65 20 54 52 TH 24.#define TR
1780: 41 4d 50 5f 41 4c 49 47 4e 20 34 0a 23 65 6e 64 AMP_ALIGN 4.#end
1790: 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d 69 70 73 if.#ifdef __mips
17a0: 36 34 6f 6c 64 5f 5f 0a 23 64 65 66 69 6e 65 20 64old__.#define
17b0: 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 35 36 0a TRAMP_LENGTH 56.
17c0: 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c #define TRAMP_AL
17d0: 49 47 4e 20 34 0a 23 65 6e 64 69 66 0a 23 69 66 IGN 4.#endif.#if
17e0: 64 65 66 20 5f 5f 6d 69 70 73 36 34 5f 5f 0a 23 def __mips64__.#
17f0: 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e define TRAMP_LEN
1800: 47 54 48 20 33 32 0a 23 64 65 66 69 6e 65 20 54 GTH 32.#define T
1810: 52 41 4d 50 5f 41 4c 49 47 4e 20 38 0a 23 65 6e RAMP_ALIGN 8.#en
1820: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
1830: 5f 5f 73 70 61 72 63 5f 5f 29 20 26 26 20 21 64 __sparc__) && !d
1840: 65 66 69 6e 65 64 28 5f 5f 73 70 61 72 63 36 34 efined(__sparc64
1850: 5f 5f 29 0a 23 64 65 66 69 6e 65 20 54 52 41 4d __).#define TRAM
1860: 50 5f 4c 45 4e 47 54 48 20 31 36 0a 23 64 65 66 P_LENGTH 16.#def
1870: 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20 ine TRAMP_ALIGN
1880: 31 36 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 16.#endif.#ifdef
1890: 20 5f 5f 73 70 61 72 63 36 34 5f 5f 0a 23 64 65 __sparc64__.#de
18a0: 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47 54 fine TRAMP_LENGT
18b0: 48 20 33 32 0a 23 64 65 66 69 6e 65 20 54 52 41 H 32.#define TRA
18c0: 4d 50 5f 41 4c 49 47 4e 20 31 36 0a 23 65 6e 64 MP_ALIGN 16.#end
18d0: 69 66 0a 23 69 66 64 65 66 20 5f 5f 61 6c 70 68 if.#ifdef __alph
18e0: 61 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52 41 4d a__.#define TRAM
18f0: 50 5f 4c 45 4e 47 54 48 20 33 32 0a 23 64 65 66 P_LENGTH 32.#def
1900: 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20 ine TRAMP_ALIGN
1910: 38 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 8.#endif.#ifdef
1920: 5f 5f 68 70 70 61 6f 6c 64 5f 5f 0a 23 64 65 66 __hppaold__.#def
1930: 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 ine TRAMP_LENGTH
1940: 20 34 38 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 48.#define TRAM
1950: 50 5f 41 4c 49 47 4e 20 31 36 0a 23 65 6e 64 69 P_ALIGN 16.#endi
1960: 66 0a 23 69 66 64 65 66 20 5f 5f 68 70 70 61 6e f.#ifdef __hppan
1970: 65 77 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52 41 ew__.#define TRA
1980: 4d 50 5f 4c 45 4e 47 54 48 20 31 36 0a 23 64 65 MP_LENGTH 16.#de
1990: 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e fine TRAMP_ALIGN
19a0: 20 31 36 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 16.#define TRAM
19b0: 50 5f 42 49 41 53 20 32 0a 23 65 6e 64 69 66 0a P_BIAS 2.#endif.
19c0: 23 69 66 64 65 66 20 5f 5f 61 72 6d 5f 5f 0a 23 #ifdef __arm__.#
19d0: 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e define TRAMP_LEN
19e0: 47 54 48 20 31 36 0a 23 64 65 66 69 6e 65 20 54 GTH 16.#define T
19f0: 52 41 4d 50 5f 41 4c 49 47 4e 20 34 0a 23 65 6e RAMP_ALIGN 4.#en
1a00: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 70 6f 77 dif.#ifdef __pow
1a10: 65 72 70 63 73 79 73 76 34 5f 5f 0a 23 64 65 66 erpcsysv4__.#def
1a20: 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 ine TRAMP_LENGTH
1a30: 20 32 34 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 24.#define TRAM
1a40: 50 5f 41 4c 49 47 4e 20 34 0a 23 65 6e 64 69 66 P_ALIGN 4.#endif
1a50: 0a 23 69 66 64 65 66 20 5f 5f 70 6f 77 65 72 70 .#ifdef __powerp
1a60: 63 61 69 78 5f 5f 0a 23 64 65 66 69 6e 65 20 54 caix__.#define T
1a70: 52 41 4d 50 5f 4c 45 4e 47 54 48 20 32 30 0a 23 RAMP_LENGTH 20.#
1a80: 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 define TRAMP_ALI
1a90: 47 4e 20 34 0a 23 65 6e 64 69 66 0a 23 69 66 64 GN 4.#endif.#ifd
1aa0: 65 66 20 5f 5f 70 6f 77 65 72 70 63 36 34 61 69 ef __powerpc64ai
1ab0: 78 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52 41 4d x__.#define TRAM
1ac0: 50 5f 4c 45 4e 47 54 48 20 34 30 0a 23 64 65 66 P_LENGTH 40.#def
1ad0: 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20 ine TRAMP_ALIGN
1ae0: 38 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 8.#endif.#ifdef
1af0: 5f 5f 6d 38 38 6b 5f 5f 0a 23 64 65 66 69 6e 65 __m88k__.#define
1b00: 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 32 30 TRAMP_LENGTH 20
1b10: 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 .#define TRAMP_A
1b20: 4c 49 47 4e 20 38 0a 23 65 6e 64 69 66 0a 23 69 LIGN 8.#endif.#i
1b30: 66 64 65 66 20 5f 5f 63 6f 6e 76 65 78 5f 5f 0a fdef __convex__.
1b40: 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 #define TRAMP_LE
1b50: 4e 47 54 48 20 31 34 0a 23 64 65 66 69 6e 65 20 NGTH 14.#define
1b60: 54 52 41 4d 50 5f 41 4c 49 47 4e 20 34 0a 23 65 TRAMP_ALIGN 4.#e
1b70: 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 69 61 ndif.#ifdef __ia
1b80: 36 34 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52 41 64__.#define TRA
1b90: 4d 50 5f 4c 45 4e 47 54 48 20 33 32 0a 23 64 65 MP_LENGTH 32.#de
1ba0: 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e fine TRAMP_ALIGN
1bb0: 20 31 36 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 16.#endif.#ifde
1bc0: 66 20 5f 5f 78 38 36 5f 36 34 5f 5f 0a 23 64 65 f __x86_64__.#de
1bd0: 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47 54 fine TRAMP_LENGT
1be0: 48 20 32 32 0a 23 64 65 66 69 6e 65 20 54 52 41 H 22.#define TRA
1bf0: 4d 50 5f 41 4c 49 47 4e 20 31 36 0a 23 65 6e 64 MP_ALIGN 16.#end
1c00: 69 66 0a 23 69 66 64 65 66 20 5f 5f 73 33 39 30 if.#ifdef __s390
1c10: 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 __.#define TRAMP
1c20: 5f 4c 45 4e 47 54 48 20 32 32 0a 23 64 65 66 69 _LENGTH 22.#defi
1c30: 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20 32 ne TRAMP_ALIGN 2
1c40: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 .#endif..#ifndef
1c50: 20 54 52 41 4d 50 5f 42 49 41 53 0a 23 64 65 66 TRAMP_BIAS.#def
1c60: 69 6e 65 20 54 52 41 4d 50 5f 42 49 41 53 20 30 ine TRAMP_BIAS 0
1c70: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 .#endif..#define
1c80: 20 54 52 41 4d 50 5f 54 4f 54 41 4c 5f 4c 45 4e TRAMP_TOTAL_LEN
1c90: 47 54 48 20 28 54 52 41 4d 50 5f 4c 45 4e 47 54 GTH (TRAMP_LENGT
1ca0: 48 20 2b 20 32 2a 73 69 7a 65 6f 66 28 76 6f 69 H + 2*sizeof(voi
1cb0: 64 2a 29 29 0a 0a 23 69 66 20 21 64 65 66 69 6e d*))..#if !defin
1cc0: 65 64 28 43 4f 44 45 5f 45 58 45 43 55 54 41 42 ed(CODE_EXECUTAB
1cd0: 4c 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 LE) && !defined(
1ce0: 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41 5f 4d EXECUTABLE_VIA_M
1cf0: 50 52 4f 54 45 43 54 29 0a 2f 2a 20 41 49 58 20 PROTECT)./* AIX
1d00: 64 6f 65 73 6e 27 74 20 73 75 70 70 6f 72 74 20 doesn't support
1d10: 6d 70 72 6f 74 65 63 74 28 29 20 69 6e 20 6d 61 mprotect() in ma
1d20: 6c 6c 6f 63 27 65 64 20 6d 65 6d 6f 72 79 2e 20 lloc'ed memory.
1d30: 4d 75 73 74 20 67 65 74 20 70 61 67 65 73 20 6f Must get pages o
1d40: 66 0a 20 2a 20 6d 65 6d 6f 72 79 20 77 69 74 68 f. * memory with
1d50: 20 65 78 65 63 75 74 65 20 70 65 72 6d 69 73 73 execute permiss
1d60: 69 6f 6e 20 76 69 61 20 6d 6d 61 70 28 29 2e 20 ion via mmap().
1d70: 54 68 65 6e 20 6b 65 65 70 20 61 20 66 72 65 65 Then keep a free
1d80: 20 6c 69 73 74 20 6f 66 0a 20 2a 20 66 72 65 65 list of. * free
1d90: 20 74 72 61 6d 70 6f 6c 69 6e 65 73 2e 0a 20 2a trampolines.. *
1da0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 2a 20 66 /.static char* f
1db0: 72 65 65 6c 69 73 74 20 3d 20 4e 55 4c 4c 3b 0a reelist = NULL;.
1dc0: 23 65 6e 64 69 66 0a 0a 5f 5f 54 52 5f 66 75 6e #endif..__TR_fun
1dd0: 63 74 69 6f 6e 20 61 6c 6c 6f 63 5f 74 72 61 6d ction alloc_tram
1de0: 70 6f 6c 69 6e 65 5f 72 20 28 5f 5f 54 52 5f 66 poline_r (__TR_f
1df0: 75 6e 63 74 69 6f 6e 20 61 64 64 72 65 73 73 2c unction address,
1e00: 20 76 6f 69 64 2a 20 64 61 74 61 30 2c 20 76 6f void* data0, vo
1e10: 69 64 2a 20 64 61 74 61 31 29 0a 7b 0a 20 20 63 id* data1).{. c
1e20: 68 61 72 2a 20 66 75 6e 63 74 69 6f 6e 3b 0a 20 har* function;.
1e30: 20 63 68 61 72 2a 20 64 61 74 61 3b 0a 0a 23 69 char* data;..#i
1e40: 66 20 21 64 65 66 69 6e 65 64 28 43 4f 44 45 5f f !defined(CODE_
1e50: 45 58 45 43 55 54 41 42 4c 45 29 0a 20 20 73 74 EXECUTABLE). st
1e60: 61 74 69 63 20 6c 6f 6e 67 20 70 61 67 65 73 69 atic long pagesi
1e70: 7a 65 20 3d 20 30 3b 0a 23 69 66 20 64 65 66 69 ze = 0;.#if defi
1e80: 6e 65 64 28 45 58 45 43 55 54 41 42 4c 45 5f 56 ned(EXECUTABLE_V
1e90: 49 41 5f 4d 4d 41 50 5f 44 45 56 5a 45 52 4f 29 IA_MMAP_DEVZERO)
1ea0: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 7a 65 . static int ze
1eb0: 72 6f 5f 66 64 3b 0a 23 65 6e 64 69 66 0a 20 20 ro_fd;.#endif.
1ec0: 2f 2a 20 46 69 72 73 74 2c 20 67 65 74 20 74 68 /* First, get th
1ed0: 65 20 70 61 67 65 20 73 69 7a 65 20 6f 6e 63 65 e page size once
1ee0: 20 61 6e 64 20 66 6f 72 20 61 6c 6c 2e 20 2a 2f and for all. */
1ef0: 0a 20 20 69 66 20 28 21 70 61 67 65 73 69 7a 65 . if (!pagesize
1f00: 29 0a 20 20 20 20 7b 0a 23 69 66 20 64 65 66 69 ). {.#if defi
1f10: 6e 65 64 28 48 41 56 45 5f 4d 41 43 48 5f 56 4d ned(HAVE_MACH_VM
1f20: 29 0a 20 20 20 20 20 20 70 61 67 65 73 69 7a 65 ). pagesize
1f30: 20 3d 20 76 6d 5f 70 61 67 65 5f 73 69 7a 65 3b = vm_page_size;
1f40: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 70 61 67 .#else. pag
1f50: 65 73 69 7a 65 20 3d 20 67 65 74 70 61 67 65 73 esize = getpages
1f60: 69 7a 65 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69 ize();.#endif.#i
1f70: 66 20 64 65 66 69 6e 65 64 28 45 58 45 43 55 54 f defined(EXECUT
1f80: 41 42 4c 45 5f 56 49 41 5f 4d 4d 41 50 5f 44 45 ABLE_VIA_MMAP_DE
1f90: 56 5a 45 52 4f 29 0a 20 20 20 20 20 20 7a 65 72 VZERO). zer
1fa0: 6f 5f 66 64 20 3d 20 6f 70 65 6e 28 22 2f 64 65 o_fd = open("/de
1fb0: 76 2f 7a 65 72 6f 22 2c 4f 5f 52 44 4f 4e 4c 59 v/zero",O_RDONLY
1fc0: 2c 30 36 34 34 29 3b 0a 20 20 20 20 20 20 69 66 ,0644);. if
1fd0: 20 28 7a 65 72 6f 5f 66 64 20 3c 20 30 29 0a 20 (zero_fd < 0).
1fe0: 20 20 20 20 20 20 20 7b 20 66 70 72 69 6e 74 66 { fprintf
1ff0: 28 73 74 64 65 72 72 2c 22 74 72 61 6d 70 6f 6c (stderr,"trampol
2000: 69 6e 65 3a 20 43 61 6e 6e 6f 74 20 6f 70 65 6e ine: Cannot open
2010: 20 2f 64 65 76 2f 7a 65 72 6f 21 5c 6e 22 29 3b /dev/zero!\n");
2020: 20 61 62 6f 72 74 28 29 3b 20 7d 0a 23 65 6e 64 abort(); }.#end
2030: 69 66 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a if. }.#endif.
2040: 0a 20 20 2f 2a 20 31 2e 20 41 6c 6c 6f 63 61 74 . /* 1. Allocat
2050: 65 20 72 6f 6f 6d 20 2a 2f 0a 0a 23 69 66 20 21 e room */..#if !
2060: 64 65 66 69 6e 65 64 28 43 4f 44 45 5f 45 58 45 defined(CODE_EXE
2070: 43 55 54 41 42 4c 45 29 20 26 26 20 21 64 65 66 CUTABLE) && !def
2080: 69 6e 65 64 28 45 58 45 43 55 54 41 42 4c 45 5f ined(EXECUTABLE_
2090: 56 49 41 5f 4d 50 52 4f 54 45 43 54 29 0a 20 20 VIA_MPROTECT).
20a0: 2f 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 6d 65 /* Note: This me
20b0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 mory allocation
20c0: 69 73 20 6e 6f 74 20 6d 75 6c 74 69 74 68 72 65 is not multithre
20d0: 61 64 2d 73 61 66 65 2e 20 57 65 20 6d 69 67 68 ad-safe. We migh
20e0: 74 20 6e 65 65 64 0a 20 20 20 2a 20 74 6f 20 61 t need. * to a
20f0: 64 64 20 73 70 65 63 69 61 6c 20 28 70 6c 61 74 dd special (plat
2100: 66 6f 72 6d 20 64 65 70 65 6e 64 65 6e 74 29 20 form dependent)
2110: 63 6f 64 65 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 code for locking
2120: 2e 0a 20 20 20 2a 20 46 6f 72 74 75 6e 61 74 65 .. * Fortunate
2130: 6c 79 2c 20 6d 6f 73 74 20 6d 6f 64 65 72 6e 20 ly, most modern
2140: 73 79 73 74 65 6d 73 20 77 68 65 72 65 20 6d 75 systems where mu
2150: 6c 74 69 74 68 72 65 61 64 2d 73 61 66 65 74 79 ltithread-safety
2160: 20 6d 61 74 74 65 72 73 0a 20 20 20 2a 20 68 61 matters. * ha
2170: 76 65 20 45 58 45 43 55 54 41 42 4c 45 5f 56 49 ve EXECUTABLE_VI
2180: 41 5f 4d 50 52 4f 54 45 43 54 2c 20 61 6e 64 20 A_MPROTECT, and
2190: 74 68 6f 73 65 20 77 68 69 63 68 20 64 6f 6e 27 those which don'
21a0: 74 20 28 41 49 58 20 6f 6e 20 70 6f 77 65 72 70 t (AIX on powerp
21b0: 63 20 61 6e 64 0a 20 20 20 2a 20 48 50 2d 55 58 c and. * HP-UX
21c0: 20 6f 6e 20 68 70 70 61 29 20 68 61 76 65 20 43 on hppa) have C
21d0: 4f 44 45 5f 45 58 45 43 55 54 41 42 4c 45 2e 20 ODE_EXECUTABLE.
21e0: 54 68 75 73 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 Thus no locking
21f0: 63 6f 64 65 20 69 73 20 6e 65 65 64 65 64 0a 20 code is needed.
2200: 20 20 2a 20 66 6f 72 20 74 68 65 20 6d 6f 6d 65 * for the mome
2210: 6e 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 20 28 nt.. */. if (
2220: 66 72 65 65 6c 69 73 74 20 3d 3d 20 4e 55 4c 4c freelist == NULL
2230: 29 0a 20 20 20 20 7b 20 2f 2a 20 47 65 74 20 61 ). { /* Get a
2240: 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 new page. */.
2250: 20 20 20 20 63 68 61 72 2a 20 70 61 67 65 3b 0a char* page;.
2260: 23 69 66 64 65 66 20 45 58 45 43 55 54 41 42 4c #ifdef EXECUTABL
2270: 45 5f 56 49 41 5f 4d 4d 41 50 5f 41 4e 4f 4e 59 E_VIA_MMAP_ANONY
2280: 4d 4f 55 53 0a 20 20 20 20 20 20 70 61 67 65 20 MOUS. page
2290: 3d 20 6d 6d 61 70 28 30 2c 20 70 61 67 65 73 69 = mmap(0, pagesi
22a0: 7a 65 2c 20 50 52 4f 54 5f 52 45 41 44 20 7c 20 ze, PROT_READ |
22b0: 50 52 4f 54 5f 57 52 49 54 45 20 7c 20 50 52 4f PROT_WRITE | PRO
22c0: 54 5f 45 58 45 43 2c 20 4d 41 50 5f 41 4e 4f 4e T_EXEC, MAP_ANON
22d0: 59 4d 4f 55 53 20 7c 20 4d 41 50 5f 56 41 52 49 YMOUS | MAP_VARI
22e0: 41 42 4c 45 2c 20 2d 31 2c 20 30 29 3b 0a 23 65 ABLE, -1, 0);.#e
22f0: 6e 64 69 66 0a 23 69 66 64 65 66 20 45 58 45 43 ndif.#ifdef EXEC
2300: 55 54 41 42 4c 45 5f 56 49 41 5f 4d 4d 41 50 5f UTABLE_VIA_MMAP_
2310: 44 45 56 5a 45 52 4f 0a 20 20 20 20 20 20 70 61 DEVZERO. pa
2320: 67 65 20 3d 20 6d 6d 61 70 28 30 2c 20 70 61 67 ge = mmap(0, pag
2330: 65 73 69 7a 65 2c 20 50 52 4f 54 5f 52 45 41 44 esize, PROT_READ
2340: 20 7c 20 50 52 4f 54 5f 57 52 49 54 45 20 7c 20 | PROT_WRITE |
2350: 50 52 4f 54 5f 45 58 45 43 2c 20 4d 41 50 5f 50 PROT_EXEC, MAP_P
2360: 52 49 56 41 54 45 2c 20 7a 65 72 6f 5f 66 64 2c RIVATE, zero_fd,
2370: 20 30 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 0);.#endif.#ifd
2380: 65 66 20 45 58 45 43 55 54 41 42 4c 45 5f 56 49 ef EXECUTABLE_VI
2390: 41 5f 53 48 4d 0a 20 20 20 20 20 20 69 6e 74 20 A_SHM. int
23a0: 73 68 6d 69 64 20 3d 20 73 68 6d 67 65 74 28 49 shmid = shmget(I
23b0: 50 43 5f 50 52 49 56 41 54 45 2c 20 70 61 67 65 PC_PRIVATE, page
23c0: 73 69 7a 65 2c 20 30 37 30 30 7c 49 50 43 5f 43 size, 0700|IPC_C
23d0: 52 45 41 54 29 3b 0a 20 20 20 20 20 20 69 66 20 REAT);. if
23e0: 28 73 68 6d 69 64 3c 30 29 0a 20 20 20 20 20 20 (shmid<0).
23f0: 20 20 7b 20 70 61 67 65 20 3d 20 28 63 68 61 72 { page = (char
2400: 2a 29 28 2d 31 29 3b 20 7d 0a 20 20 20 20 20 20 *)(-1); }.
2410: 65 6c 73 65 0a 20 20 20 20 20 20 20 20 7b 20 70 else. { p
2420: 61 67 65 20 3d 20 73 68 6d 61 74 28 73 68 6d 69 age = shmat(shmi
2430: 64 2c 20 30 2c 20 30 29 3b 20 73 68 6d 63 74 6c d, 0, 0); shmctl
2440: 28 73 68 6d 69 64 2c 20 49 50 43 5f 52 4d 49 44 (shmid, IPC_RMID
2450: 2c 20 30 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 23 , 0); }.#endif.#
2460: 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 20 20 20 ifdef _WIN32.
2470: 20 20 20 70 61 67 65 20 3d 20 56 69 72 74 75 61 page = Virtua
2480: 6c 41 6c 6c 6f 63 28 4e 55 4c 4c 2c 20 70 61 67 lAlloc(NULL, pag
2490: 65 73 69 7a 65 2c 20 4d 45 4d 5f 43 4f 4d 4d 49 esize, MEM_COMMI
24a0: 54 2c 20 50 41 47 45 5f 45 58 45 43 55 54 45 5f T, PAGE_EXECUTE_
24b0: 52 45 41 44 57 52 49 54 45 29 3b 0a 20 20 20 20 READWRITE);.
24c0: 20 20 69 66 20 28 70 61 67 65 20 3d 3d 20 30 29 if (page == 0)
24d0: 0a 20 20 20 20 20 20 09 7b 20 70 61 67 65 20 3d . .{ page =
24e0: 20 28 63 68 61 72 2a 29 28 2d 31 29 3b 20 7d 0a (char*)(-1); }.
24f0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 20 #endif. if
2500: 28 70 61 67 65 20 3d 3d 20 28 63 68 61 72 2a 29 (page == (char*)
2510: 28 2d 31 29 29 0a 20 20 20 20 20 20 20 20 7b 20 (-1)). {
2520: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 fprintf(stderr,"
2530: 74 72 61 6d 70 6f 6c 69 6e 65 3a 20 4f 75 74 20 trampoline: Out
2540: 6f 66 20 76 69 72 74 75 61 6c 20 6d 65 6d 6f 72 of virtual memor
2550: 79 21 5c 6e 22 29 3b 20 61 62 6f 72 74 28 29 3b y!\n"); abort();
2560: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c }. /* Fill
2570: 20 69 74 20 77 69 74 68 20 66 72 65 65 20 74 72 it with free tr
2580: 61 6d 70 6f 6c 69 6e 65 73 2e 20 2a 2f 0a 20 20 ampolines. */.
2590: 20 20 20 20 7b 20 63 68 61 72 2a 2a 20 6c 61 73 { char** las
25a0: 74 20 3d 20 26 66 72 65 65 6c 69 73 74 3b 0a 20 t = &freelist;.
25b0: 20 20 20 20 20 20 20 63 68 61 72 2a 20 70 61 67 char* pag
25c0: 65 5f 65 6e 64 20 3d 20 70 61 67 65 20 2b 20 70 e_end = page + p
25d0: 61 67 65 73 69 7a 65 3b 0a 20 20 20 20 20 20 20 agesize;.
25e0: 20 77 68 69 6c 65 20 28 70 61 67 65 2b 54 52 41 while (page+TRA
25f0: 4d 50 5f 54 4f 54 41 4c 5f 4c 45 4e 47 54 48 20 MP_TOTAL_LENGTH
2600: 3c 3d 20 70 61 67 65 5f 65 6e 64 29 0a 20 20 20 <= page_end).
2610: 20 20 20 20 20 20 20 7b 20 2a 6c 61 73 74 20 3d { *last =
2620: 20 70 61 67 65 3b 20 6c 61 73 74 20 3d 20 28 63 page; last = (c
2630: 68 61 72 2a 2a 29 70 61 67 65 3b 20 70 61 67 65 har**)page; page
2640: 20 2b 3d 20 54 52 41 4d 50 5f 54 4f 54 41 4c 5f += TRAMP_TOTAL_
2650: 4c 45 4e 47 54 48 3b 20 7d 0a 20 20 20 20 20 20 LENGTH; }.
2660: 20 20 2a 6c 61 73 74 20 3d 20 4e 55 4c 4c 3b 0a *last = NULL;.
2670: 20 20 20 20 7d 20 7d 0a 20 20 66 75 6e 63 74 69 } }. functi
2680: 6f 6e 20 3d 20 66 72 65 65 6c 69 73 74 3b 20 66 on = freelist; f
2690: 72 65 65 6c 69 73 74 20 3d 20 2a 28 63 68 61 72 reelist = *(char
26a0: 2a 2a 29 66 72 65 65 6c 69 73 74 3b 0a 23 65 6c **)freelist;.#el
26b0: 73 65 0a 20 20 7b 20 63 68 61 72 2a 20 72 6f 6f se. { char* roo
26c0: 6d 20 3d 20 28 63 68 61 72 2a 29 20 6d 61 6c 6c m = (char*) mall
26d0: 6f 63 28 73 69 7a 65 6f 66 28 76 6f 69 64 2a 29 oc(sizeof(void*)
26e0: 20 2b 20 54 52 41 4d 50 5f 54 4f 54 41 4c 5f 4c + TRAMP_TOTAL_L
26f0: 45 4e 47 54 48 20 2b 20 54 52 41 4d 50 5f 41 4c ENGTH + TRAMP_AL
2700: 49 47 4e 2d 31 29 3b 0a 20 20 20 20 69 66 20 28 IGN-1);. if (
2710: 21 72 6f 6f 6d 29 0a 20 20 20 20 20 20 7b 20 66 !room). { f
2720: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 74 printf(stderr,"t
2730: 72 61 6d 70 6f 6c 69 6e 65 3a 20 4f 75 74 20 6f rampoline: Out o
2740: 66 20 76 69 72 74 75 61 6c 20 6d 65 6d 6f 72 79 f virtual memory
2750: 21 5c 6e 22 29 3b 20 61 62 6f 72 74 28 29 3b 20 !\n"); abort();
2760: 7d 0a 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 3d }. function =
2770: 20 28 63 68 61 72 2a 29 28 28 28 6c 6f 6e 67 29 (char*)(((long)
2780: 72 6f 6f 6d 20 2b 20 73 69 7a 65 6f 66 28 76 6f room + sizeof(vo
2790: 69 64 2a 29 20 2b 20 54 52 41 4d 50 5f 41 4c 49 id*) + TRAMP_ALI
27a0: 47 4e 2d 31 29 20 26 20 2d 54 52 41 4d 50 5f 41 GN-1) & -TRAMP_A
27b0: 4c 49 47 4e 29 3b 0a 20 20 20 20 28 28 63 68 61 LIGN);. ((cha
27c0: 72 2a 2a 29 66 75 6e 63 74 69 6f 6e 29 5b 2d 31 r**)function)[-1
27d0: 5d 20 3d 20 72 6f 6f 6d 3b 20 2f 2a 20 62 61 63 ] = room; /* bac
27e0: 6b 70 6f 69 6e 74 65 72 20 66 6f 72 20 66 72 65 kpointer for fre
27f0: 65 5f 74 72 61 6d 70 6f 6c 69 6e 65 28 29 20 2a e_trampoline() *
2800: 2f 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 /. }.#endif..
2810: 2f 2a 20 32 2e 20 46 69 6c 6c 20 6f 75 74 20 74 /* 2. Fill out t
2820: 68 65 20 74 72 61 6d 70 6f 6c 69 6e 65 20 2a 2f he trampoline */
2830: 0a 20 20 64 61 74 61 20 3d 20 66 75 6e 63 74 69 . data = functi
2840: 6f 6e 20 2b 20 54 52 41 4d 50 5f 4c 45 4e 47 54 on + TRAMP_LENGT
2850: 48 3b 0a 20 20 2f 2a 20 4b 6e 6f 77 69 6e 67 20 H;. /* Knowing
2860: 74 68 61 74 20 64 61 74 61 20 3d 20 66 75 6e 63 that data = func
2870: 74 69 6f 6e 20 2b 20 54 52 41 4d 50 5f 4c 45 4e tion + TRAMP_LEN
2880: 47 54 48 2c 20 77 65 20 63 6f 75 6c 64 20 63 65 GTH, we could ce
2890: 72 74 61 69 6e 6c 79 20 6f 70 74 69 6d 69 7a 65 rtainly optimize
28a0: 0a 20 20 20 2a 20 74 68 65 20 74 72 61 6d 70 6f . * the trampo
28b0: 6c 69 6e 65 73 20 61 20 6c 69 74 74 6c 65 20 62 lines a little b
28c0: 69 74 20 6d 6f 72 65 2c 20 75 73 69 6e 67 20 50 it more, using P
28d0: 43 20 72 65 6c 61 74 69 76 65 20 61 64 64 72 65 C relative addre
28e0: 73 73 69 6e 67 20 6d 6f 64 65 73 2e 0a 20 20 20 ssing modes..
28f0: 2a 20 42 75 74 20 49 20 64 6f 75 62 74 20 69 74 * But I doubt it
2900: 27 73 20 72 65 61 6c 6c 79 20 77 6f 72 74 68 20 's really worth
2910: 69 74 2e 0a 20 20 20 2a 2f 0a 23 69 66 64 65 66 it.. */.#ifdef
2920: 20 5f 5f 69 33 38 36 5f 5f 0a 20 20 2f 2a 20 66 __i386__. /* f
2930: 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 unction:. *
2940: 20 70 6f 70 6c 20 25 65 63 78 09 09 09 35 39 0a popl %ecx...59.
2950: 20 20 20 2a 20 20 20 20 70 75 73 68 6c 20 24 3c * pushl $<
2960: 64 61 74 61 3e 09 09 09 36 38 20 3c 64 61 74 61 data>...68 <data
2970: 3e 0a 20 20 20 2a 20 20 20 20 70 75 73 68 6c 20 >. * pushl
2980: 25 65 63 78 09 09 09 35 31 0a 20 20 20 2a 20 20 %ecx...51. *
2990: 20 20 6a 6d 70 20 3c 61 64 64 72 65 73 73 3e 09 jmp <address>.
29a0: 09 09 45 39 20 3c 61 64 64 72 65 73 73 3e 2d 3c ..E9 <address>-<
29b0: 68 65 72 65 3e 0a 20 20 20 2a 20 68 65 72 65 3a here>. * here:
29c0: 0a 20 20 20 2a 20 20 20 20 6e 6f 70 09 09 09 09 . * nop....
29d0: 39 30 0a 20 20 20 2a 20 20 20 20 6e 6f 70 09 09 90. * nop..
29e0: 09 09 39 30 0a 20 20 20 2a 20 20 20 20 6e 6f 70 ..90. * nop
29f0: 09 09 09 09 39 30 0a 20 20 20 2a 20 20 20 20 6e ....90. * n
2a00: 6f 70 09 09 09 09 39 30 0a 20 20 20 2a 2f 0a 20 op....90. */.
2a10: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e *(short *) (fun
2a20: 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20 30 78 36 ction + 0) = 0x6
2a30: 38 35 39 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 859;. *(long *)
2a40: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 32 29 (function + 2)
2a50: 20 3d 20 28 6c 6f 6e 67 29 20 64 61 74 61 3b 0a = (long) data;.
2a60: 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 *(short *) (fu
2a70: 6e 63 74 69 6f 6e 20 2b 20 36 29 20 3d 20 30 78 nction + 6) = 0x
2a80: 45 39 35 31 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a E951;. *(long *
2a90: 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 ) (function + 8
2aa0: 29 20 3d 20 28 6c 6f 6e 67 29 20 61 64 64 72 65 ) = (long) addre
2ab0: 73 73 20 2d 20 28 6c 6f 6e 67 29 20 28 66 75 6e ss - (long) (fun
2ac0: 63 74 69 6f 6e 20 2b 20 31 32 29 3b 0a 20 20 2a ction + 12);. *
2ad0: 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 (long *) (funct
2ae0: 69 6f 6e 20 2b 31 32 29 20 3d 20 30 78 39 30 39 ion +12) = 0x909
2af0: 30 39 30 39 30 3b 20 20 20 2f 2a 20 6e 6f 70 20 09090; /* nop
2b00: 6e 6f 70 20 6e 6f 70 20 6e 6f 70 2c 20 66 6f 72 nop nop nop, for
2b10: 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 23 64 alignment */.#d
2b20: 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 28 66 efine is_tramp(f
2b30: 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 unction) \. *(
2b40: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a unsigned short *
2b50: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 ) (function + 0)
2b60: 20 3d 3d 20 30 78 36 38 35 39 20 26 26 20 5c 0a == 0x6859 && \.
2b70: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f *(unsigned sho
2b80: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
2b90: 2b 20 36 29 20 3d 3d 20 30 78 45 39 35 31 0a 23 + 6) == 0xE951.#
2ba0: 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 define tramp_add
2bb0: 72 65 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 ress(function)
2bc0: 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 \. *(long *) (
2bd0: 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 2b 20 function + 8) +
2be0: 28 6c 6f 6e 67 29 20 28 66 75 6e 63 74 69 6f 6e (long) (function
2bf0: 20 2b 20 31 32 29 0a 23 64 65 66 69 6e 65 20 74 + 12).#define t
2c00: 72 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 74 69 ramp_data(functi
2c10: 6f 6e 29 20 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 on) \. *(long
2c20: 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 *) (function +
2c30: 32 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 2).#endif.#ifdef
2c40: 20 5f 5f 6d 36 38 6b 5f 5f 0a 23 69 66 64 65 66 __m68k__.#ifdef
2c50: 20 5f 5f 4e 65 74 42 53 44 5f 5f 0a 20 20 2f 2a __NetBSD__. /*
2c60: 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 function:. *
2c70: 20 20 20 6d 6f 76 65 6c 20 23 3c 64 61 74 61 3e movel #<data>
2c80: 2c 61 31 09 09 32 32 20 37 43 20 3c 64 61 74 61 ,a1..22 7C <data
2c90: 3e 0a 20 20 20 2a 20 20 20 20 6a 6d 70 20 3c 61 >. * jmp <a
2ca0: 64 64 72 65 73 73 3e 09 09 09 34 45 20 46 39 20 ddress>...4E F9
2cb0: 3c 61 64 64 72 65 73 73 3e 0a 20 20 20 2a 20 20 <address>. *
2cc0: 20 20 6e 6f 70 09 09 09 09 34 45 20 37 31 0a 20 nop....4E 71.
2cd0: 20 20 2a 2f 0a 20 20 2a 28 73 68 6f 72 74 20 2a */. *(short *
2ce0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 ) (function + 0)
2cf0: 20 3d 20 30 78 32 32 37 43 3b 0a 20 20 2a 28 6c = 0x227C;. *(l
2d00: 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f ong *) (functio
2d10: 6e 20 2b 20 32 29 20 3d 20 28 6c 6f 6e 67 29 20 n + 2) = (long)
2d20: 64 61 74 61 3b 0a 20 20 2a 28 73 68 6f 72 74 20 data;. *(short
2d30: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 36 *) (function + 6
2d40: 29 20 3d 20 30 78 34 45 46 39 3b 0a 20 20 2a 28 ) = 0x4EF9;. *(
2d50: 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 long *) (functi
2d60: 6f 6e 20 2b 20 38 29 20 3d 20 28 6c 6f 6e 67 29 on + 8) = (long)
2d70: 20 61 64 64 72 65 73 73 3b 0a 20 20 2a 28 73 68 address;. *(sh
2d80: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ort *) (function
2d90: 20 2b 31 32 29 20 3d 20 30 78 34 45 37 31 3b 0a +12) = 0x4E71;.
2da0: 23 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 #define is_tramp
2db0: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 (function) \.
2dc0: 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 *(unsigned short
2dd0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 *) (function +
2de0: 30 29 20 3d 3d 20 30 78 32 32 37 43 20 26 26 20 0) == 0x227C &&
2df0: 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 \. *(unsigned s
2e00: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f hort *) (functio
2e10: 6e 20 2b 20 36 29 20 3d 3d 20 30 78 34 45 46 39 n + 6) == 0x4EF9
2e20: 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e && \. *(unsign
2e30: 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e ed short *) (fun
2e40: 63 74 69 6f 6e 20 2b 31 32 29 20 3d 3d 20 30 78 ction +12) == 0x
2e50: 34 45 37 31 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4E71.#else. /*
2e60: 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 function:. *
2e70: 20 20 6d 6f 76 65 6c 20 23 3c 64 61 74 61 3e 2c movel #<data>,
2e80: 61 30 09 09 32 30 20 37 43 20 3c 64 61 74 61 3e a0..20 7C <data>
2e90: 0a 20 20 20 2a 20 20 20 20 6a 6d 70 20 3c 61 64 . * jmp <ad
2ea0: 64 72 65 73 73 3e 09 09 09 34 45 20 46 39 20 3c dress>...4E F9 <
2eb0: 61 64 64 72 65 73 73 3e 0a 20 20 20 2a 20 20 20 address>. *
2ec0: 20 6e 6f 70 09 09 09 09 34 45 20 37 31 0a 20 20 nop....4E 71.
2ed0: 20 2a 2f 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 */. *(short *)
2ee0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 (function + 0)
2ef0: 3d 20 30 78 32 30 37 43 3b 0a 20 20 2a 28 6c 6f = 0x207C;. *(lo
2f00: 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e ng *) (function
2f10: 20 2b 20 32 29 20 3d 20 28 6c 6f 6e 67 29 20 64 + 2) = (long) d
2f20: 61 74 61 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a ata;. *(short *
2f30: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 36 29 ) (function + 6)
2f40: 20 3d 20 30 78 34 45 46 39 3b 0a 20 20 2a 28 6c = 0x4EF9;. *(l
2f50: 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f ong *) (functio
2f60: 6e 20 2b 20 38 29 20 3d 20 28 6c 6f 6e 67 29 20 n + 8) = (long)
2f70: 61 64 64 72 65 73 73 3b 0a 20 20 2a 28 73 68 6f address;. *(sho
2f80: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
2f90: 2b 31 32 29 20 3d 20 30 78 34 45 37 31 3b 0a 23 +12) = 0x4E71;.#
2fa0: 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 28 define is_tramp(
2fb0: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a function) \. *
2fc0: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 (unsigned short
2fd0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 *) (function + 0
2fe0: 29 20 3d 3d 20 30 78 32 30 37 43 20 26 26 20 5c ) == 0x207C && \
2ff0: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 . *(unsigned sh
3000: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ort *) (function
3010: 20 2b 20 36 29 20 3d 3d 20 30 78 34 45 46 39 20 + 6) == 0x4EF9
3020: 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 && \. *(unsigne
3030: 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 d short *) (func
3040: 74 69 6f 6e 20 2b 31 32 29 20 3d 3d 20 30 78 34 tion +12) == 0x4
3050: 45 37 31 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 E71.#endif.#defi
3060: 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 65 73 73 ne tramp_address
3070: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 (function) \.
3080: 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 *(long *) (func
3090: 74 69 6f 6e 20 2b 20 38 29 0a 23 64 65 66 69 6e tion + 8).#defin
30a0: 65 20 74 72 61 6d 70 5f 64 61 74 61 28 66 75 6e e tramp_data(fun
30b0: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 6c 6f ction) \. *(lo
30c0: 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e ng *) (function
30d0: 20 2b 20 32 29 0a 23 65 6e 64 69 66 0a 23 69 66 + 2).#endif.#if
30e0: 20 64 65 66 69 6e 65 64 28 5f 5f 6d 69 70 73 5f defined(__mips_
30f0: 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f _) || defined(__
3100: 6d 69 70 73 6e 33 32 5f 5f 29 20 26 26 20 21 64 mipsn32__) && !d
3110: 65 66 69 6e 65 64 28 5f 5f 6d 69 70 73 36 34 5f efined(__mips64_
3120: 5f 29 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e _). /* function
3130: 3a 0a 20 20 20 2a 20 20 20 20 6c 77 20 24 32 2c :. * lw $2,
3140: 31 36 28 24 32 35 29 09 09 09 38 46 20 32 32 20 16($25)...8F 22
3150: 30 30 20 31 30 0a 20 20 20 2a 20 20 20 20 6c 77 00 10. * lw
3160: 20 24 32 35 2c 32 30 28 24 32 35 29 09 09 09 38 $25,20($25)...8
3170: 46 20 33 39 20 30 30 20 31 34 0a 20 20 20 2a 20 F 39 00 14. *
3180: 20 20 20 6a 20 24 32 35 09 09 09 09 30 33 20 32 j $25....03 2
3190: 30 20 30 30 20 30 38 0a 20 20 20 2a 20 20 20 20 0 00 08. *
31a0: 6e 6f 70 09 09 09 09 30 30 20 30 30 20 30 30 20 nop....00 00 00
31b0: 30 30 0a 20 20 20 2a 20 20 20 20 2e 77 6f 72 64 00. * .word
31c0: 20 3c 64 61 74 61 3e 09 09 09 3c 64 61 74 61 3e <data>...<data>
31d0: 0a 20 20 20 2a 20 20 20 20 2e 77 6f 72 64 20 3c . * .word <
31e0: 61 64 64 72 65 73 73 3e 09 09 09 3c 61 64 64 72 address>...<addr
31f0: 65 73 73 3e 0a 20 20 20 2a 2f 0a 20 20 2a 28 75 ess>. */. *(u
3200: 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 28 nsigned int *) (
3210: 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20 function + 0) =
3220: 30 78 38 46 32 32 30 30 31 30 3b 0a 20 20 2a 28 0x8F220010;. *(
3230: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 unsigned int *)
3240: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d (function + 4) =
3250: 20 30 78 38 46 33 39 30 30 31 34 3b 0a 20 20 2a 0x8F390014;. *
3260: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 (unsigned int *)
3270: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 (function + 8)
3280: 3d 20 30 78 30 33 32 30 30 30 30 38 3b 0a 20 20 = 0x03200008;.
3290: 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a *(unsigned int *
32a0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 ) (function +12)
32b0: 20 3d 20 30 78 30 30 30 30 30 30 30 30 3b 0a 20 = 0x00000000;.
32c0: 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 *(unsigned int
32d0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 *) (function +16
32e0: 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 69 6e ) = (unsigned in
32f0: 74 29 20 64 61 74 61 3b 0a 20 20 2a 28 75 6e 73 t) data;. *(uns
3300: 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 28 66 75 igned int *) (fu
3310: 6e 63 74 69 6f 6e 20 2b 32 30 29 20 3d 20 28 75 nction +20) = (u
3320: 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 61 64 64 nsigned int) add
3330: 72 65 73 73 3b 0a 23 64 65 66 69 6e 65 20 69 73 ress;.#define is
3340: 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29 _tramp(function)
3350: 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 \. *(unsigned
3360: 20 69 6e 74 20 2a 29 20 28 66 75 6e 63 74 69 6f int *) (functio
3370: 6e 20 2b 20 30 29 20 3d 3d 20 30 78 38 46 32 32 n + 0) == 0x8F22
3380: 30 30 31 30 20 26 26 20 5c 0a 20 20 2a 28 75 6e 0010 && \. *(un
3390: 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 28 66 signed int *) (f
33a0: 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 3d 20 unction + 4) ==
33b0: 30 78 38 46 33 39 30 30 31 34 20 26 26 20 5c 0a 0x8F390014 && \.
33c0: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 *(unsigned int
33d0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 *) (function +
33e0: 38 29 20 3d 3d 20 30 78 30 33 32 30 30 30 30 38 8) == 0x03200008
33f0: 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e && \. *(unsign
3400: 65 64 20 69 6e 74 20 2a 29 20 28 66 75 6e 63 74 ed int *) (funct
3410: 69 6f 6e 20 2b 31 32 29 20 3d 3d 20 30 78 30 30 ion +12) == 0x00
3420: 30 30 30 30 30 30 0a 23 64 65 66 69 6e 65 20 74 000000.#define t
3430: 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75 6e ramp_address(fun
3440: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e ction) \. *(un
3450: 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 28 66 signed int *) (f
3460: 75 6e 63 74 69 6f 6e 20 2b 32 30 29 0a 23 64 65 unction +20).#de
3470: 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 28 fine tramp_data(
3480: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a function) \. *
3490: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 (unsigned int *)
34a0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 0a (function +16).
34b0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f #endif.#ifdef __
34c0: 6d 69 70 73 36 34 6f 6c 64 5f 5f 0a 20 20 2f 2a mips64old__. /*
34d0: 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 function:. *
34e0: 20 20 20 64 6c 69 20 24 32 2c 3c 64 61 74 61 3e dli $2,<data>
34f0: 09 09 09 33 43 20 30 32 20 68 69 31 36 28 68 69 ...3C 02 hi16(hi
3500: 33 32 28 3c 64 61 74 61 3e 29 29 0a 20 20 20 2a 32(<data>)). *
3510: 09 09 09 09 09 33 34 20 34 32 20 6c 6f 31 36 28 .....34 42 lo16(
3520: 68 69 33 32 28 3c 64 61 74 61 3e 29 29 0a 20 20 hi32(<data>)).
3530: 20 2a 09 09 09 09 09 30 30 20 30 32 20 31 34 20 *.....00 02 14
3540: 33 38 0a 20 20 20 2a 09 09 09 09 09 33 34 20 34 38. *.....34 4
3550: 32 20 68 69 31 36 28 6c 6f 33 32 28 3c 64 61 74 2 hi16(lo32(<dat
3560: 61 3e 29 29 0a 20 20 20 2a 09 09 09 09 09 30 30 a>)). *.....00
3570: 20 30 32 20 31 34 20 33 38 0a 20 20 20 2a 09 09 02 14 38. *..
3580: 09 09 09 33 34 20 34 32 20 6c 6f 31 36 28 6c 6f ...34 42 lo16(lo
3590: 33 32 28 3c 64 61 74 61 3e 29 29 0a 20 20 20 2a 32(<data>)). *
35a0: 20 20 20 20 64 6c 69 20 24 32 35 2c 3c 61 64 64 dli $25,<add
35b0: 72 65 73 73 3e 09 09 33 43 20 31 39 20 68 69 31 ress>..3C 19 hi1
35c0: 36 28 68 69 33 32 28 3c 61 64 64 72 65 73 73 3e 6(hi32(<address>
35d0: 29 29 0a 20 20 20 2a 09 09 09 09 09 33 37 20 33 )). *.....37 3
35e0: 39 20 6c 6f 31 36 28 68 69 33 32 28 3c 61 64 64 9 lo16(hi32(<add
35f0: 72 65 73 73 3e 29 29 0a 20 20 20 2a 09 09 09 09 ress>)). *....
3600: 09 30 30 20 31 39 20 43 43 20 33 38 0a 20 20 20 .00 19 CC 38.
3610: 2a 09 09 09 09 09 33 37 20 33 39 20 68 69 31 36 *.....37 39 hi16
3620: 28 6c 6f 33 32 28 3c 61 64 64 72 65 73 73 3e 29 (lo32(<address>)
3630: 29 0a 20 20 20 2a 09 09 09 09 09 30 30 20 31 39 ). *.....00 19
3640: 20 43 43 20 33 38 0a 20 20 20 2a 09 09 09 09 09 CC 38. *.....
3650: 33 37 20 33 39 20 6c 6f 31 36 28 6c 6f 33 32 28 37 39 lo16(lo32(
3660: 3c 61 64 64 72 65 73 73 3e 29 29 0a 20 20 20 2a <address>)). *
3670: 20 20 20 20 6a 20 24 32 35 09 09 09 09 30 33 20 j $25....03
3680: 32 30 20 30 30 20 30 38 0a 20 20 20 2a 20 20 20 20 00 08. *
3690: 20 6e 6f 70 09 09 09 09 30 30 20 30 30 20 30 30 nop....00 00 00
36a0: 20 30 30 0a 20 20 20 2a 2f 0a 20 20 2f 2a 20 57 00. */. /* W
36b0: 68 61 74 20 61 62 6f 75 74 20 62 69 67 20 65 6e hat about big en
36c0: 64 69 61 6e 20 2f 20 6c 69 74 74 6c 65 20 65 6e dian / little en
36d0: 64 69 61 6e 20 3f 3f 20 2a 2f 0a 20 20 2a 28 73 dian ?? */. *(s
36e0: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f hort *) (functio
36f0: 6e 20 2b 20 30 29 20 3d 20 30 78 33 43 30 32 3b n + 0) = 0x3C02;
3700: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 . *(short *) (f
3710: 75 6e 63 74 69 6f 6e 20 2b 20 32 29 20 3d 20 28 unction + 2) = (
3720: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 unsigned long) d
3730: 61 74 61 20 3e 3e 20 34 38 3b 0a 20 20 2a 28 73 ata >> 48;. *(s
3740: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f hort *) (functio
3750: 6e 20 2b 20 34 29 20 3d 20 30 78 33 34 34 32 3b n + 4) = 0x3442;
3760: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 . *(short *) (f
3770: 75 6e 63 74 69 6f 6e 20 2b 20 36 29 20 3d 20 28 unction + 6) = (
3780: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
3790: 64 61 74 61 20 3e 3e 20 33 32 29 20 26 20 30 78 data >> 32) & 0x
37a0: 66 66 66 66 3b 0a 20 20 2a 28 69 6e 74 20 2a 29 ffff;. *(int *)
37b0: 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 (function + 8
37c0: 29 20 3d 20 30 78 30 30 30 32 31 34 33 38 3b 0a ) = 0x00021438;.
37d0: 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 *(short *) (fu
37e0: 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d 20 30 78 nction +12) = 0x
37f0: 33 34 34 32 3b 0a 20 20 2a 28 73 68 6f 72 74 20 3442;. *(short
3800: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 34 *) (function +14
3810: 29 20 3d 20 28 28 75 6e 73 69 67 6e 65 64 20 6c ) = ((unsigned l
3820: 6f 6e 67 29 20 64 61 74 61 20 3e 3e 20 31 36 29 ong) data >> 16)
3830: 20 26 20 30 78 66 66 66 66 3b 0a 20 20 2a 28 69 & 0xffff;. *(i
3840: 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f nt *) (functio
3850: 6e 20 2b 31 36 29 20 3d 20 30 78 30 30 30 32 31 n +16) = 0x00021
3860: 34 33 38 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 438;. *(short *
3870: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 30 29 ) (function +20)
3880: 20 3d 20 30 78 33 34 34 32 3b 0a 20 20 2a 28 73 = 0x3442;. *(s
3890: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f hort *) (functio
38a0: 6e 20 2b 32 32 29 20 3d 20 28 75 6e 73 69 67 6e n +22) = (unsign
38b0: 65 64 20 6c 6f 6e 67 29 20 64 61 74 61 20 26 20 ed long) data &
38c0: 30 78 66 66 66 66 3b 0a 20 20 2a 28 73 68 6f 72 0xffff;. *(shor
38d0: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
38e0: 32 34 29 20 3d 20 30 78 33 43 31 39 3b 0a 20 20 24) = 0x3C19;.
38f0: 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 *(short *) (func
3900: 74 69 6f 6e 20 2b 32 36 29 20 3d 20 28 75 6e 73 tion +26) = (uns
3910: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64 72 igned long) addr
3920: 65 73 73 20 3e 3e 20 34 38 3b 0a 20 20 2a 28 73 ess >> 48;. *(s
3930: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f hort *) (functio
3940: 6e 20 2b 32 38 29 20 3d 20 30 78 33 37 33 39 3b n +28) = 0x3739;
3950: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 . *(short *) (f
3960: 75 6e 63 74 69 6f 6e 20 2b 33 30 29 20 3d 20 28 unction +30) = (
3970: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
3980: 61 64 64 72 65 73 73 20 3e 3e 20 33 32 29 20 26 address >> 32) &
3990: 20 30 78 66 66 66 66 3b 0a 20 20 2a 28 69 6e 74 0xffff;. *(int
39a0: 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 *) (function
39b0: 2b 33 32 29 20 3d 20 30 78 30 30 31 39 43 43 33 +32) = 0x0019CC3
39c0: 38 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 8;. *(short *)
39d0: 28 66 75 6e 63 74 69 6f 6e 20 2b 33 36 29 20 3d (function +36) =
39e0: 20 30 78 33 37 33 39 3b 0a 20 20 2a 28 73 68 6f 0x3739;. *(sho
39f0: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
3a00: 2b 33 38 29 20 3d 20 28 28 75 6e 73 69 67 6e 65 +38) = ((unsigne
3a10: 64 20 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 20 d long) address
3a20: 3e 3e 20 31 36 29 20 26 20 30 78 66 66 66 66 3b >> 16) & 0xffff;
3a30: 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 28 66 . *(int *) (f
3a40: 75 6e 63 74 69 6f 6e 20 2b 34 30 29 20 3d 20 30 unction +40) = 0
3a50: 78 30 30 31 39 43 43 33 38 3b 0a 20 20 2a 28 73 x0019CC38;. *(s
3a60: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f hort *) (functio
3a70: 6e 20 2b 34 34 29 20 3d 20 30 78 33 37 33 39 3b n +44) = 0x3739;
3a80: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 . *(short *) (f
3a90: 75 6e 63 74 69 6f 6e 20 2b 34 36 29 20 3d 20 28 unction +46) = (
3aa0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 61 unsigned long) a
3ab0: 64 64 72 65 73 73 20 26 20 30 78 66 66 66 66 3b ddress & 0xffff;
3ac0: 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 28 66 . *(int *) (f
3ad0: 75 6e 63 74 69 6f 6e 20 2b 34 38 29 20 3d 20 30 unction +48) = 0
3ae0: 78 30 33 32 30 30 30 30 38 3b 0a 20 20 2a 28 69 x03200008;. *(i
3af0: 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f nt *) (functio
3b00: 6e 20 2b 35 32 29 20 3d 20 30 78 30 30 30 30 30 n +52) = 0x00000
3b10: 30 30 30 3b 0a 23 64 65 66 69 6e 65 20 69 73 5f 000;.#define is_
3b20: 74 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20 tramp(function)
3b30: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 \. *(unsigned
3b40: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
3b50: 6f 6e 20 2b 20 30 29 20 3d 3d 20 30 78 33 43 30 on + 0) == 0x3C0
3b60: 32 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 2 && \. *(unsig
3b70: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 ned short *) (fu
3b80: 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 3d 20 30 nction + 4) == 0
3b90: 78 33 34 34 32 20 26 26 20 5c 0a 20 20 2a 28 75 x3442 && \. *(u
3ba0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 20 nsigned int *)
3bb0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 (function + 8)
3bc0: 3d 3d 20 30 78 30 30 30 32 31 34 33 38 20 26 26 == 0x00021438 &&
3bd0: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 \. *(unsigned
3be0: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
3bf0: 6f 6e 20 2b 31 32 29 20 3d 3d 20 30 78 33 34 34 on +12) == 0x344
3c00: 32 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 2 && \. *(unsig
3c10: 6e 65 64 20 69 6e 74 20 2a 29 20 20 20 28 66 75 ned int *) (fu
3c20: 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 3d 20 30 nction +16) == 0
3c30: 78 30 30 30 32 31 34 33 38 20 26 26 20 5c 0a 20 x00021438 && \.
3c40: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 *(unsigned shor
3c50: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
3c60: 32 30 29 20 3d 3d 20 30 78 33 34 34 32 20 26 26 20) == 0x3442 &&
3c70: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 \. *(unsigned
3c80: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
3c90: 6f 6e 20 2b 32 34 29 20 3d 3d 20 30 78 33 43 31 on +24) == 0x3C1
3ca0: 39 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 9 && \. *(unsig
3cb0: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 ned short *) (fu
3cc0: 6e 63 74 69 6f 6e 20 2b 32 38 29 20 3d 3d 20 30 nction +28) == 0
3cd0: 78 33 37 33 39 20 26 26 20 5c 0a 20 20 2a 28 75 x3739 && \. *(u
3ce0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 20 nsigned int *)
3cf0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 33 32 29 20 (function +32)
3d00: 3d 3d 20 30 78 30 30 31 39 43 43 33 38 20 26 26 == 0x0019CC38 &&
3d10: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 \. *(unsigned
3d20: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
3d30: 6f 6e 20 2b 33 36 29 20 3d 3d 20 30 78 33 37 33 on +36) == 0x373
3d40: 39 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 9 && \. *(unsig
3d50: 6e 65 64 20 69 6e 74 20 2a 29 20 20 20 28 66 75 ned int *) (fu
3d60: 6e 63 74 69 6f 6e 20 2b 34 30 29 20 3d 3d 20 30 nction +40) == 0
3d70: 78 30 30 31 39 43 43 33 38 20 26 26 20 5c 0a 20 x0019CC38 && \.
3d80: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 *(unsigned shor
3d90: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
3da0: 34 34 29 20 3d 3d 20 30 78 33 37 33 39 20 26 26 44) == 0x3739 &&
3db0: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 \. *(unsigned
3dc0: 69 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 int *) (functi
3dd0: 6f 6e 20 2b 34 38 29 20 3d 3d 20 30 78 30 33 32 on +48) == 0x032
3de0: 30 30 30 30 38 20 26 26 20 5c 0a 20 20 2a 28 75 00008 && \. *(u
3df0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 20 nsigned int *)
3e00: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 35 32 29 20 (function +52)
3e10: 3d 3d 20 30 78 30 30 30 30 30 30 30 30 0a 23 64 == 0x00000000.#d
3e20: 65 66 69 6e 65 20 68 69 6c 6f 28 77 6f 72 64 33 efine hilo(word3
3e30: 2c 77 6f 72 64 32 2c 77 6f 72 64 31 2c 77 6f 72 ,word2,word1,wor
3e40: 64 30 29 20 20 5c 0a 20 20 28 28 28 75 6e 73 69 d0) \. (((unsi
3e50: 67 6e 65 64 20 6c 6f 6e 67 29 20 28 77 6f 72 64 gned long) (word
3e60: 33 29 20 3c 3c 20 34 38 29 20 7c 20 28 28 75 6e 3) << 48) | ((un
3e70: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 77 6f signed long) (wo
3e80: 72 64 32 29 20 3c 3c 20 33 32 29 20 7c 20 5c 0a rd2) << 32) | \.
3e90: 20 20 20 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f ((unsigned lo
3ea0: 6e 67 29 20 28 77 6f 72 64 31 29 20 3c 3c 20 31 ng) (word1) << 1
3eb0: 36 29 20 7c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6) | (unsigned l
3ec0: 6f 6e 67 29 20 28 77 6f 72 64 30 29 29 0a 23 64 ong) (word0)).#d
3ed0: 65 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 efine tramp_addr
3ee0: 65 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c ess(function) \
3ef0: 0a 20 20 68 69 6c 6f 28 2a 28 75 6e 73 69 67 6e . hilo(*(unsign
3f00: 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e ed short *) (fun
3f10: 63 74 69 6f 6e 20 2b 32 36 29 2c 20 5c 0a 20 20 ction +26), \.
3f20: 20 20 20 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 *(unsigned
3f30: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
3f40: 6f 6e 20 2b 33 30 29 2c 20 5c 0a 20 20 20 20 20 on +30), \.
3f50: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f *(unsigned sho
3f60: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
3f70: 2b 33 38 29 2c 20 5c 0a 20 20 20 20 20 20 20 2a +38), \. *
3f80: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 (unsigned short
3f90: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 34 36 *) (function +46
3fa0: 29 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 )).#define tramp
3fb0: 5f 64 61 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 _data(function)
3fc0: 20 5c 0a 20 20 68 69 6c 6f 28 2a 28 75 6e 73 69 \. hilo(*(unsi
3fd0: 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 gned short *) (f
3fe0: 75 6e 63 74 69 6f 6e 20 2b 20 32 29 2c 20 5c 0a unction + 2), \.
3ff0: 20 20 20 20 20 20 20 2a 28 75 6e 73 69 67 6e 65 *(unsigne
4000: 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 d short *) (func
4010: 74 69 6f 6e 20 2b 20 36 29 2c 20 5c 0a 20 20 20 tion + 6), \.
4020: 20 20 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 *(unsigned s
4030: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f hort *) (functio
4040: 6e 20 2b 31 34 29 2c 20 5c 0a 20 20 20 20 20 20 n +14), \.
4050: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 *(unsigned shor
4060: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
4070: 32 32 29 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 22)).#endif.#ifd
4080: 65 66 20 5f 5f 6d 69 70 73 36 34 5f 5f 0a 20 20 ef __mips64__.
4090: 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 /* function:.
40a0: 2a 20 20 20 20 6c 64 20 24 32 2c 31 36 28 24 32 * ld $2,16($2
40b0: 35 29 09 09 09 44 46 20 32 32 20 30 30 20 31 30 5)...DF 22 00 10
40c0: 0a 20 20 20 2a 20 20 20 20 6c 64 20 24 32 35 2c . * ld $25,
40d0: 32 34 28 24 32 35 29 09 09 09 44 46 20 33 39 20 24($25)...DF 39
40e0: 30 30 20 31 38 0a 20 20 20 2a 20 20 20 20 6a 20 00 18. * j
40f0: 24 32 35 09 09 09 09 30 33 20 32 30 20 30 30 20 $25....03 20 00
4100: 30 38 0a 20 20 20 2a 20 20 20 20 6e 6f 70 09 09 08. * nop..
4110: 09 09 30 30 20 30 30 20 30 30 20 30 30 0a 20 20 ..00 00 00 00.
4120: 20 2a 20 20 20 20 2e 64 77 6f 72 64 20 3c 64 61 * .dword <da
4130: 74 61 3e 09 09 09 3c 64 61 74 61 3e 0a 20 20 20 ta>...<data>.
4140: 2a 20 20 20 20 2e 64 77 6f 72 64 20 3c 61 64 64 * .dword <add
4150: 72 65 73 73 3e 09 09 3c 61 64 64 72 65 73 73 3e ress>..<address>
4160: 0a 20 20 20 2a 2f 0a 20 20 2a 28 75 6e 73 69 67 . */. *(unsig
4170: 6e 65 64 20 69 6e 74 20 2a 29 20 20 28 66 75 6e ned int *) (fun
4180: 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20 30 78 44 ction + 0) = 0xD
4190: 46 32 32 30 30 31 30 3b 0a 20 20 2a 28 75 6e 73 F220010;. *(uns
41a0: 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 20 28 66 igned int *) (f
41b0: 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 20 30 unction + 4) = 0
41c0: 78 44 46 33 39 30 30 31 38 3b 0a 20 20 2a 28 75 xDF390018;. *(u
41d0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 20 nsigned int *)
41e0: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d (function + 8) =
41f0: 20 30 78 30 33 32 30 30 30 30 38 3b 0a 20 20 2a 0x03200008;. *
4200: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 (unsigned int *)
4210: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 (function +12)
4220: 20 3d 20 30 78 30 30 30 30 30 30 30 30 3b 0a 20 = 0x00000000;.
4230: 20 2a 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 *(unsigned long
4240: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 *) (function +1
4250: 36 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6) = (unsigned l
4260: 6f 6e 67 29 20 64 61 74 61 3b 0a 20 20 2a 28 75 ong) data;. *(u
4270: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 29 20 nsigned long *)
4280: 28 66 75 6e 63 74 69 6f 6e 20 2b 32 34 29 20 3d (function +24) =
4290: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
42a0: 20 61 64 64 72 65 73 73 3b 0a 23 64 65 66 69 6e address;.#defin
42b0: 65 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 e is_tramp(funct
42c0: 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e 73 69 ion) \. *(unsi
42d0: 67 6e 65 64 20 69 6e 74 20 2a 29 20 20 28 66 75 gned int *) (fu
42e0: 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 3d 20 30 nction + 0) == 0
42f0: 78 44 46 32 32 30 30 31 30 20 26 26 20 5c 0a 20 xDF220010 && \.
4300: 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 *(unsigned int
4310: 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 *) (function +
4320: 34 29 20 3d 3d 20 30 78 44 46 33 39 30 30 31 38 4) == 0xDF390018
4330: 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e && \. *(unsign
4340: 65 64 20 69 6e 74 20 2a 29 20 20 28 66 75 6e 63 ed int *) (func
4350: 74 69 6f 6e 20 2b 20 38 29 20 3d 3d 20 30 78 30 tion + 8) == 0x0
4360: 33 32 30 30 30 30 38 20 26 26 20 5c 0a 20 20 2a 3200008 && \. *
4370: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 (unsigned int *)
4380: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 (function +12)
4390: 20 3d 3d 20 30 78 30 30 30 30 30 30 30 30 0a 23 == 0x00000000.#
43a0: 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 define tramp_add
43b0: 72 65 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 ress(function)
43c0: 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 6c \. *(unsigned l
43d0: 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ong *) (function
43e0: 20 2b 32 34 29 0a 23 64 65 66 69 6e 65 20 74 72 +24).#define tr
43f0: 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 74 69 6f amp_data(functio
4400: 6e 29 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e n) \. *(unsign
4410: 65 64 20 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 ed long *) (func
4420: 74 69 6f 6e 20 2b 31 36 29 0a 23 65 6e 64 69 66 tion +16).#endif
4430: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 73 .#if defined(__s
4440: 70 61 72 63 5f 5f 29 20 26 26 20 21 64 65 66 69 parc__) && !defi
4450: 6e 65 64 28 5f 5f 73 70 61 72 63 36 34 5f 5f 29 ned(__sparc64__)
4460: 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a . /* function:.
4470: 20 20 20 2a 20 20 20 20 73 65 74 68 69 20 25 68 * sethi %h
4480: 69 28 3c 64 61 74 61 3e 29 2c 25 67 32 09 09 30 i(<data>),%g2..0
4490: 35 30 30 30 30 30 30 20 7c 20 28 3c 64 61 74 61 5000000 | (<data
44a0: 3e 20 3e 3e 20 31 30 29 0a 20 20 20 2a 20 20 20 > >> 10). *
44b0: 20 73 65 74 68 69 20 25 68 69 28 3c 61 64 64 72 sethi %hi(<addr
44c0: 65 73 73 3e 29 2c 25 67 31 09 30 33 30 30 30 30 ess>),%g1.030000
44d0: 30 30 20 7c 20 28 3c 61 64 64 72 65 73 73 3e 20 00 | (<address>
44e0: 3e 3e 20 31 30 29 0a 20 20 20 2a 20 20 20 20 6a >> 10). * j
44f0: 6d 70 20 25 67 31 2b 25 6c 6f 28 3c 61 64 64 72 mp %g1+%lo(<addr
4500: 65 73 73 3e 29 09 09 38 31 43 30 36 30 30 30 20 ess>)..81C06000
4510: 7c 20 28 3c 61 64 64 72 65 73 73 3e 20 26 20 30 | (<address> & 0
4520: 78 33 66 66 29 0a 20 20 20 2a 20 20 20 20 6f 72 x3ff). * or
4530: 20 25 67 32 2c 25 6c 6f 28 3c 64 61 74 61 3e 29 %g2,%lo(<data>)
4540: 2c 25 67 32 09 09 38 34 31 30 41 30 30 30 20 7c ,%g2..8410A000 |
4550: 20 28 3c 64 61 74 61 3e 20 26 20 30 78 33 66 66 (<data> & 0x3ff
4560: 29 0a 20 20 20 2a 2f 0a 23 64 65 66 69 6e 65 20 ). */.#define
4570: 68 69 28 77 6f 72 64 29 20 20 28 28 75 6e 73 69 hi(word) ((unsi
4580: 67 6e 65 64 20 6c 6f 6e 67 29 20 28 77 6f 72 64 gned long) (word
4590: 29 20 3e 3e 20 31 30 29 0a 23 64 65 66 69 6e 65 ) >> 10).#define
45a0: 20 6c 6f 28 77 6f 72 64 29 20 20 28 28 75 6e 73 lo(word) ((uns
45b0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 77 6f 72 igned long) (wor
45c0: 64 29 20 26 20 30 78 33 66 66 29 0a 20 20 2a 28 d) & 0x3ff). *(
45d0: 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f long *) (functio
45e0: 6e 20 2b 20 30 29 20 3d 20 30 78 30 35 30 30 30 n + 0) = 0x05000
45f0: 30 30 30 20 7c 20 68 69 28 64 61 74 61 29 3b 0a 000 | hi(data);.
4600: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e *(long *) (fun
4610: 63 74 69 6f 6e 20 2b 20 34 29 20 3d 20 30 78 30 ction + 4) = 0x0
4620: 33 30 30 30 30 30 30 20 7c 20 68 69 28 61 64 64 3000000 | hi(add
4630: 72 65 73 73 29 3b 0a 20 20 2a 28 6c 6f 6e 67 20 ress);. *(long
4640: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 *) (function + 8
4650: 29 20 3d 20 30 78 38 31 43 30 36 30 30 30 20 7c ) = 0x81C06000 |
4660: 20 6c 6f 28 61 64 64 72 65 73 73 29 3b 0a 20 20 lo(address);.
4670: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 *(long *) (funct
4680: 69 6f 6e 20 2b 31 32 29 20 3d 20 30 78 38 34 31 ion +12) = 0x841
4690: 30 41 30 30 30 20 7c 20 6c 6f 28 64 61 74 61 29 0A000 | lo(data)
46a0: 3b 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72 61 ;.#define is_tra
46b0: 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a mp(function) \.
46c0: 20 20 28 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 (*(long *) (fu
46d0: 6e 63 74 69 6f 6e 20 2b 20 30 29 20 26 20 30 78 nction + 0) & 0x
46e0: 66 66 63 30 30 30 30 30 29 20 3d 3d 20 30 78 30 ffc00000) == 0x0
46f0: 35 30 30 30 30 30 30 20 26 26 20 5c 0a 20 20 28 5000000 && \. (
4700: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 *(long *) (funct
4710: 69 6f 6e 20 2b 20 34 29 20 26 20 30 78 66 66 63 ion + 4) & 0xffc
4720: 30 30 30 30 30 29 20 3d 3d 20 30 78 30 33 30 30 00000) == 0x0300
4730: 30 30 30 30 20 26 26 20 5c 0a 20 20 28 2a 28 6c 0000 && \. (*(l
4740: 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ong *) (function
4750: 20 2b 20 38 29 20 26 20 30 78 66 66 66 66 66 63 + 8) & 0xfffffc
4760: 30 30 29 20 3d 3d 20 30 78 38 31 43 30 36 30 30 00) == 0x81C0600
4770: 30 20 26 26 20 5c 0a 20 20 28 2a 28 6c 6f 6e 67 0 && \. (*(long
4780: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 *) (function +1
4790: 32 29 20 26 20 30 78 66 66 66 66 66 63 30 30 29 2) & 0xfffffc00)
47a0: 20 3d 3d 20 30 78 38 34 31 30 41 30 30 30 0a 23 == 0x8410A000.#
47b0: 64 65 66 69 6e 65 20 68 69 6c 6f 28 68 69 77 6f define hilo(hiwo
47c0: 72 64 2c 6c 6f 77 6f 72 64 29 20 20 28 28 28 68 rd,loword) (((h
47d0: 69 77 6f 72 64 29 20 3c 3c 20 31 30 29 20 7c 20 iword) << 10) |
47e0: 28 28 6c 6f 77 6f 72 64 29 20 26 20 30 78 33 66 ((loword) & 0x3f
47f0: 66 29 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d f)).#define tram
4800: 70 5f 61 64 64 72 65 73 73 28 66 75 6e 63 74 69 p_address(functi
4810: 6f 6e 29 20 20 5c 0a 20 20 68 69 6c 6f 28 2a 28 on) \. hilo(*(
4820: 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f long *) (functio
4830: 6e 20 2b 20 34 29 2c 20 2a 28 6c 6f 6e 67 20 2a n + 4), *(long *
4840: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 ) (function + 8)
4850: 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f ).#define tramp_
4860: 64 61 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 20 data(function)
4870: 5c 0a 20 20 68 69 6c 6f 28 2a 28 6c 6f 6e 67 20 \. hilo(*(long
4880: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 *) (function + 0
4890: 29 2c 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 ), *(long *) (fu
48a0: 6e 63 74 69 6f 6e 20 2b 31 32 29 29 0a 23 65 6e nction +12)).#en
48b0: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 73 70 61 dif.#ifdef __spa
48c0: 72 63 36 34 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 rc64__. /* func
48d0: 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 72 64 tion:. * rd
48e0: 20 25 70 63 2c 25 67 31 09 09 09 38 33 34 31 34 %pc,%g1...83414
48f0: 30 30 30 0a 20 20 20 2a 20 20 20 20 6c 64 78 20 000. * ldx
4900: 5b 25 67 31 2b 32 34 5d 2c 25 67 32 09 09 43 34 [%g1+24],%g2..C4
4910: 35 38 36 30 31 38 0a 20 20 20 2a 20 20 20 20 6a 586018. * j
4920: 6d 70 20 25 67 32 09 09 09 09 38 31 43 30 38 30 mp %g2....81C080
4930: 30 30 0a 20 20 20 2a 20 20 20 20 6c 64 78 20 5b 00. * ldx [
4940: 25 67 31 2b 31 36 5d 2c 25 67 35 09 09 43 41 35 %g1+16],%g5..CA5
4950: 38 36 30 31 30 0a 20 20 20 2a 20 20 20 20 2e 6c 86010. * .l
4960: 6f 6e 67 20 68 69 67 68 33 32 28 3c 64 61 74 61 ong high32(<data
4970: 3e 29 09 09 3c 64 61 74 61 3e 20 3e 3e 20 33 32 >)..<data> >> 32
4980: 0a 20 20 20 2a 20 20 20 20 2e 6c 6f 6e 67 20 6c . * .long l
4990: 6f 77 33 32 28 3c 64 61 74 61 3e 29 09 09 3c 64 ow32(<data>)..<d
49a0: 61 74 61 3e 20 26 20 30 78 66 66 66 66 66 66 66 ata> & 0xfffffff
49b0: 66 0a 20 20 20 2a 20 20 20 20 2e 6c 6f 6e 67 20 f. * .long
49c0: 68 69 67 68 33 32 28 3c 61 64 64 72 65 73 73 3e high32(<address>
49d0: 29 09 09 3c 61 64 64 72 65 73 73 3e 20 3e 3e 20 )..<address> >>
49e0: 33 32 0a 20 20 20 2a 20 20 20 20 2e 6c 6f 6e 67 32. * .long
49f0: 20 6c 6f 77 33 32 28 3c 61 64 64 72 65 73 73 3e low32(<address>
4a00: 29 09 09 3c 61 64 64 72 65 73 73 3e 20 26 20 30 )..<address> & 0
4a10: 78 66 66 66 66 66 66 66 66 0a 20 20 20 2a 2f 0a xffffffff. */.
4a20: 20 20 2a 28 69 6e 74 20 2a 29 20 20 28 66 75 6e *(int *) (fun
4a30: 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20 30 78 38 ction + 0) = 0x8
4a40: 33 34 31 34 30 30 30 3b 0a 20 20 2a 28 69 6e 74 3414000;. *(int
4a50: 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b *) (function +
4a60: 20 34 29 20 3d 20 30 78 43 34 35 38 36 30 31 38 4) = 0xC4586018
4a70: 3b 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 28 66 ;. *(int *) (f
4a80: 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 30 unction + 8) = 0
4a90: 78 38 31 43 30 38 30 30 30 3b 0a 20 20 2a 28 69 x81C08000;. *(i
4aa0: 6e 74 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e nt *) (function
4ab0: 20 2b 31 32 29 20 3d 20 30 78 43 41 35 38 36 30 +12) = 0xCA5860
4ac0: 31 30 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 10;. *(long *)
4ad0: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d (function +16) =
4ae0: 20 28 6c 6f 6e 67 29 20 64 61 74 61 3b 0a 20 20 (long) data;.
4af0: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 *(long *) (funct
4b00: 69 6f 6e 20 2b 32 34 29 20 3d 20 28 6c 6f 6e 67 ion +24) = (long
4b10: 29 20 61 64 64 72 65 73 73 3b 0a 23 64 65 66 69 ) address;.#defi
4b20: 6e 65 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 ne is_tramp(func
4b30: 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 69 6e 74 tion) \. *(int
4b40: 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b *) (function +
4b50: 20 30 29 20 3d 3d 20 30 78 38 33 34 31 34 30 30 0) == 0x8341400
4b60: 30 20 26 26 20 5c 0a 20 20 2a 28 69 6e 74 20 2a 0 && \. *(int *
4b70: 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 ) (function + 4
4b80: 29 20 3d 3d 20 30 78 43 34 35 38 36 30 31 38 20 ) == 0xC4586018
4b90: 26 26 20 5c 0a 20 20 2a 28 69 6e 74 20 2a 29 20 && \. *(int *)
4ba0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 (function + 8)
4bb0: 3d 3d 20 30 78 38 31 43 30 38 30 30 30 20 26 26 == 0x81C08000 &&
4bc0: 20 5c 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 28 \. *(int *) (
4bd0: 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d 3d function +12) ==
4be0: 20 30 78 43 41 35 38 36 30 31 30 0a 23 64 65 66 0xCA586010.#def
4bf0: 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 65 73 ine tramp_addres
4c00: 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 s(function) \.
4c10: 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 *(long *) (func
4c20: 74 69 6f 6e 20 2b 32 34 29 0a 23 64 65 66 69 6e tion +24).#defin
4c30: 65 20 74 72 61 6d 70 5f 64 61 74 61 28 66 75 6e e tramp_data(fun
4c40: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 6c 6f ction) \. *(lo
4c50: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 ng *) (function
4c60: 2b 31 36 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 +16).#endif.#ifd
4c70: 65 66 20 5f 5f 61 6c 70 68 61 5f 5f 0a 20 20 2f ef __alpha__. /
4c80: 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a * function:. *
4c90: 20 20 20 20 62 72 20 24 31 2c 66 75 6e 63 74 69 br $1,functi
4ca0: 6f 6e 2e 2e 6e 67 09 30 30 20 30 30 20 32 30 20 on..ng.00 00 20
4cb0: 43 30 0a 20 20 20 2a 20 66 75 6e 63 74 69 6f 6e C0. * function
4cc0: 2e 2e 6e 67 3a 0a 20 20 20 2a 20 20 20 20 6c 64 ..ng:. * ld
4cd0: 71 20 24 32 37 2c 32 30 28 24 31 29 09 09 31 34 q $27,20($1)..14
4ce0: 20 30 30 20 36 31 20 41 37 0a 20 20 20 2a 20 20 00 61 A7. *
4cf0: 20 20 6c 64 71 20 24 31 2c 31 32 28 24 31 29 09 ldq $1,12($1).
4d00: 09 30 43 20 30 30 20 32 31 20 41 34 0a 20 20 20 .0C 00 21 A4.
4d10: 2a 20 20 20 20 6a 6d 70 20 24 33 31 2c 28 24 32 * jmp $31,($2
4d20: 37 29 2c 30 09 09 30 30 20 30 30 20 46 42 20 36 7),0..00 00 FB 6
4d30: 42 0a 20 20 20 2a 20 20 20 20 2e 71 75 61 64 20 B. * .quad
4d40: 3c 64 61 74 61 3e 09 09 3c 64 61 74 61 3e 0a 20 <data>..<data>.
4d50: 20 20 2a 20 20 20 20 2e 71 75 61 64 20 3c 61 64 * .quad <ad
4d60: 64 72 65 73 73 3e 09 09 3c 61 64 64 72 65 73 73 dress>..<address
4d70: 3e 0a 20 20 20 2a 2f 0a 20 20 7b 20 73 74 61 74 >. */. { stat
4d80: 69 63 20 69 6e 74 20 63 6f 64 65 20 5b 34 5d 20 ic int code [4]
4d90: 3d 0a 20 20 20 20 20 20 7b 20 30 78 43 30 32 30 =. { 0xC020
4da0: 30 30 30 30 2c 20 30 78 41 37 36 31 30 30 31 34 0000, 0xA7610014
4db0: 2c 20 30 78 41 34 32 31 30 30 30 43 2c 20 30 78 , 0xA421000C, 0x
4dc0: 36 42 46 42 30 30 30 30 20 7d 3b 0a 20 20 20 20 6BFB0000 };.
4dd0: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 20 28 int i;. for (
4de0: 69 3d 30 3b 20 69 3c 34 3b 20 69 2b 2b 29 20 7b i=0; i<4; i++) {
4df0: 20 28 28 69 6e 74 20 2a 29 20 66 75 6e 63 74 69 ((int *) functi
4e00: 6f 6e 29 5b 69 5d 20 3d 20 63 6f 64 65 5b 69 5d on)[i] = code[i]
4e10: 3b 20 7d 0a 20 20 20 20 28 28 6c 6f 6e 67 20 2a ; }. ((long *
4e20: 29 20 66 75 6e 63 74 69 6f 6e 29 5b 32 5d 20 3d ) function)[2] =
4e30: 20 28 6c 6f 6e 67 29 20 64 61 74 61 3b 0a 20 20 (long) data;.
4e40: 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 ((long *) func
4e50: 74 69 6f 6e 29 5b 33 5d 20 3d 20 28 6c 6f 6e 67 tion)[3] = (long
4e60: 29 20 61 64 64 72 65 73 73 3b 0a 20 20 7d 0a 23 ) address;. }.#
4e70: 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 28 define is_tramp(
4e80: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 function) \. (
4e90: 28 69 6e 74 20 2a 29 20 66 75 6e 63 74 69 6f 6e (int *) function
4ea0: 29 5b 30 5d 20 3d 3d 20 30 78 43 30 32 30 30 30 )[0] == 0xC02000
4eb0: 30 30 20 26 26 20 5c 0a 20 20 28 28 69 6e 74 20 00 && \. ((int
4ec0: 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 31 5d 20 *) function)[1]
4ed0: 3d 3d 20 30 78 41 37 36 31 30 30 31 34 20 26 26 == 0xA7610014 &&
4ee0: 20 5c 0a 20 20 28 28 69 6e 74 20 2a 29 20 66 75 \. ((int *) fu
4ef0: 6e 63 74 69 6f 6e 29 5b 32 5d 20 3d 3d 20 30 78 nction)[2] == 0x
4f00: 41 34 32 31 30 30 30 43 20 26 26 20 5c 0a 20 20 A421000C && \.
4f10: 28 28 69 6e 74 20 2a 29 20 66 75 6e 63 74 69 6f ((int *) functio
4f20: 6e 29 5b 33 5d 20 3d 3d 20 30 78 36 42 46 42 30 n)[3] == 0x6BFB0
4f30: 30 30 30 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 000.#define tram
4f40: 70 5f 61 64 64 72 65 73 73 28 66 75 6e 63 74 69 p_address(functi
4f50: 6f 6e 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 on) \. ((long
4f60: 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 33 5d 0a *) function)[3].
4f70: 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 #define tramp_da
4f80: 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a ta(function) \.
4f90: 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 ((long *) func
4fa0: 74 69 6f 6e 29 5b 32 5d 0a 23 65 6e 64 69 66 0a tion)[2].#endif.
4fb0: 23 69 66 64 65 66 20 5f 5f 68 70 70 61 6f 6c 64 #ifdef __hppaold
4fc0: 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e __. /* function
4fd0: 3a 0a 20 20 20 2a 20 20 20 20 6c 64 69 6c 20 4c :. * ldil L
4fe0: 27 3c 64 61 74 61 3e 2c 25 72 32 39 09 09 32 33 '<data>,%r29..23
4ff0: 41 30 30 30 30 30 20 7c 20 68 69 28 3c 64 61 74 A00000 | hi(<dat
5000: 61 3e 29 0a 20 20 20 2a 20 20 20 20 6c 64 69 6c a>). * ldil
5010: 20 4c 27 3c 61 64 64 72 65 73 73 3e 2c 25 72 32 L'<address>,%r2
5020: 31 09 09 32 32 41 30 30 30 30 30 20 7c 20 68 69 1..22A00000 | hi
5030: 28 3c 61 64 64 72 65 73 73 3e 29 0a 20 20 20 2a (<address>). *
5040: 20 20 20 20 6c 64 6f 20 52 27 3c 64 61 74 61 3e ldo R'<data>
5050: 28 25 72 32 39 29 2c 25 72 32 39 09 09 33 37 42 (%r29),%r29..37B
5060: 44 30 30 30 30 20 7c 20 6c 6f 28 3c 64 61 74 61 D0000 | lo(<data
5070: 3e 29 0a 20 20 20 2a 20 20 20 20 6c 64 6f 20 52 >). * ldo R
5080: 27 3c 61 64 64 72 65 73 73 3e 28 25 72 32 31 29 '<address>(%r21)
5090: 2c 25 72 32 31 09 33 36 42 35 30 30 30 30 20 7c ,%r21.36B50000 |
50a0: 20 6c 6f 28 3c 61 64 64 72 65 73 73 3e 29 0a 20 lo(<address>).
50b0: 20 20 2a 20 20 20 20 62 62 2c 3e 3d 2c 6e 20 25 * bb,>=,n %
50c0: 72 32 31 2c 33 30 2c 66 75 6e 63 74 69 6f 6e 32 r21,30,function2
50d0: 09 43 37 44 35 43 30 31 32 0a 20 20 20 2a 20 20 .C7D5C012. *
50e0: 20 20 64 65 70 69 20 30 2c 33 31 2c 32 2c 25 72 depi 0,31,2,%r
50f0: 32 31 09 09 44 36 41 30 31 43 31 45 0a 20 20 20 21..D6A01C1E.
5100: 2a 20 20 20 20 6c 64 77 20 34 28 30 2c 25 72 32 * ldw 4(0,%r2
5110: 31 29 2c 25 72 31 39 09 09 34 41 42 33 30 30 30 1),%r19..4AB3000
5120: 38 0a 20 20 20 2a 20 20 20 20 6c 64 77 20 30 28 8. * ldw 0(
5130: 30 2c 25 72 32 31 29 2c 25 72 32 31 09 09 34 41 0,%r21),%r21..4A
5140: 42 35 30 30 30 30 0a 20 20 20 2a 20 66 75 6e 63 B50000. * func
5150: 74 69 6f 6e 32 3a 0a 20 20 20 2a 20 20 20 20 6c tion2:. * l
5160: 64 73 69 64 20 28 30 2c 25 72 32 31 29 2c 25 72 dsid (0,%r21),%r
5170: 31 09 09 30 32 41 30 31 30 41 31 0a 20 20 20 2a 1..02A010A1. *
5180: 20 20 20 20 6d 74 73 70 20 25 72 31 2c 25 73 72 mtsp %r1,%sr
5190: 30 09 09 09 30 30 30 31 31 38 32 30 0a 20 20 20 0...00011820.
51a0: 2a 20 20 20 20 62 65 2c 6e 20 30 28 25 73 72 30 * be,n 0(%sr0
51b0: 2c 25 72 32 31 29 09 09 45 32 41 30 30 30 30 32 ,%r21)..E2A00002
51c0: 0a 20 20 20 2a 20 20 20 20 6e 6f 70 09 09 09 09 . * nop....
51d0: 30 38 30 30 30 32 34 30 0a 20 20 20 2a 2f 0a 20 08000240. */.
51e0: 20 2f 2a 20 57 68 65 6e 20 64 65 63 6f 64 69 6e /* When decodin
51f0: 67 20 61 20 32 31 2d 62 69 74 20 61 72 67 75 6d g a 21-bit argum
5200: 65 6e 74 20 69 6e 20 61 6e 20 69 6e 73 74 72 75 ent in an instru
5210: 63 74 69 6f 6e 2c 20 74 68 65 20 68 70 70 61 20 ction, the hppa
5220: 70 65 72 66 6f 72 6d 73 0a 20 20 20 2a 20 74 68 performs. * th
5230: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20 e following bit
5240: 6d 61 6e 69 70 75 6c 61 74 69 6f 6e 3a 0a 20 20 manipulation:.
5250: 20 2a 20 61 73 73 65 6d 62 6c 65 32 31 3a 20 78 * assemble21: x
5260: 5b 32 30 5d 2e 2e 2e 78 5b 30 5d 0a 20 20 20 2a [20]...x[0]. *
5270: 20 20 20 20 20 20 20 2d 2d 3e 20 78 5b 30 5d 20 --> x[0]
5280: 78 5b 31 31 5d 2e 2e 2e 78 5b 31 5d 20 78 5b 31 x[11]...x[1] x[1
5290: 35 5d 2e 2e 78 5b 31 34 5d 20 78 5b 32 30 5d 2e 5]..x[14] x[20].
52a0: 2e 2e 78 5b 31 36 5d 20 78 5b 31 33 5d 2e 2e 78 ..x[16] x[13]..x
52b0: 5b 31 32 5d 0a 20 20 20 2a 20 57 68 65 6e 20 65 [12]. * When e
52c0: 6e 63 6f 64 69 6e 67 20 61 20 32 31 2d 62 69 74 ncoding a 21-bit
52d0: 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 61 argument into a
52e0: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 77 n instruction, w
52f0: 65 20 6e 65 65 64 20 74 68 65 0a 20 20 20 2a 20 e need the. *
5300: 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65 20 72 to perform the r
5310: 65 76 65 72 73 65 20 70 65 72 6d 75 74 61 74 69 everse permutati
5320: 6f 6e 3a 0a 20 20 20 2a 20 70 65 72 6d 75 74 65 on:. * permute
5330: 32 31 3a 20 20 79 5b 32 30 5d 2e 2e 2e 79 5b 30 21: y[20]...y[0
5340: 5d 0a 20 20 20 2a 20 20 20 20 20 20 20 2d 2d 3e ]. * -->
5350: 20 79 5b 36 5d 2e 2e 2e 79 5b 32 5d 20 79 5b 38 y[6]...y[2] y[8
5360: 5d 2e 2e 79 5b 37 5d 20 79 5b 31 5d 2e 2e 79 5b ]..y[7] y[1]..y[
5370: 30 5d 20 79 5b 31 39 5d 2e 2e 2e 79 5b 39 5d 20 0] y[19]...y[9]
5380: 79 5b 32 30 5d 0a 20 20 20 2a 2f 0a 23 64 65 66 y[20]. */.#def
5390: 69 6e 65 20 61 73 73 65 6d 62 6c 65 32 31 28 78 ine assemble21(x
53a0: 29 20 20 5c 0a 20 20 28 28 28 28 78 29 20 26 20 ) \. ((((x) &
53b0: 30 78 31 29 20 3c 3c 20 32 30 29 20 7c 20 28 28 0x1) << 20) | ((
53c0: 28 78 29 20 26 20 30 78 46 46 45 29 20 3c 3c 20 (x) & 0xFFE) <<
53d0: 38 29 20 7c 20 5c 0a 20 20 20 28 28 28 78 29 20 8) | \. (((x)
53e0: 26 20 30 78 43 30 30 30 29 20 3e 3e 20 37 29 20 & 0xC000) >> 7)
53f0: 7c 20 28 28 28 78 29 20 26 20 30 78 31 46 30 30 | (((x) & 0x1F00
5400: 30 30 29 20 3e 3e 20 31 34 29 20 7c 20 28 28 28 00) >> 14) | (((
5410: 78 29 20 26 20 30 78 33 30 30 30 29 20 3e 3e 20 x) & 0x3000) >>
5420: 31 32 29 29 0a 23 64 65 66 69 6e 65 20 70 65 72 12)).#define per
5430: 6d 75 74 65 32 31 28 79 29 20 20 5c 0a 20 20 28 mute21(y) \. (
5440: 28 28 28 79 29 20 26 20 30 78 37 43 29 20 3c 3c (((y) & 0x7C) <<
5450: 20 31 34 29 20 7c 20 28 28 28 79 29 20 26 20 30 14) | (((y) & 0
5460: 78 31 38 30 29 20 3c 3c 20 37 29 20 7c 20 28 28 x180) << 7) | ((
5470: 28 79 29 20 26 20 30 78 33 29 20 3c 3c 20 31 32 (y) & 0x3) << 12
5480: 29 20 7c 20 5c 0a 20 20 20 28 28 28 79 29 20 26 ) | \. (((y) &
5490: 20 30 78 46 46 45 30 30 29 20 3e 3e 20 38 29 20 0xFFE00) >> 8)
54a0: 7c 20 28 28 28 79 29 20 26 20 30 78 31 30 30 30 | (((y) & 0x1000
54b0: 30 30 29 20 3e 3e 20 32 30 29 29 0a 23 64 65 66 00) >> 20)).#def
54c0: 69 6e 65 20 68 69 28 77 6f 72 64 29 20 20 70 65 ine hi(word) pe
54d0: 72 6d 75 74 65 32 31 28 28 75 6e 73 69 67 6e 65 rmute21((unsigne
54e0: 64 20 6c 6f 6e 67 29 20 28 77 6f 72 64 29 20 3e d long) (word) >
54f0: 3e 20 31 31 29 0a 23 64 65 66 69 6e 65 20 6c 6f > 11).#define lo
5500: 28 77 6f 72 64 29 20 20 28 28 28 75 6e 73 69 67 (word) (((unsig
5510: 6e 65 64 20 6c 6f 6e 67 29 20 28 77 6f 72 64 29 ned long) (word)
5520: 20 26 20 30 78 37 46 46 29 20 3c 3c 20 31 29 0a & 0x7FF) << 1).
5530: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e *(long *) (fun
5540: 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20 30 78 32 ction + 0) = 0x2
5550: 33 41 30 30 30 30 30 20 7c 20 68 69 28 64 61 74 3A00000 | hi(dat
5560: 61 29 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 a);. *(long *)
5570: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d (function + 4) =
5580: 20 30 78 32 32 41 30 30 30 30 30 20 7c 20 68 69 0x22A00000 | hi
5590: 28 61 64 64 72 65 73 73 29 3b 0a 20 20 2a 28 6c (address);. *(l
55a0: 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ong *) (function
55b0: 20 2b 20 38 29 20 3d 20 30 78 33 37 42 44 30 30 + 8) = 0x37BD00
55c0: 30 30 20 7c 20 6c 6f 28 64 61 74 61 29 3b 0a 20 00 | lo(data);.
55d0: 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 *(long *) (func
55e0: 74 69 6f 6e 20 2b 31 32 29 20 3d 20 30 78 33 36 tion +12) = 0x36
55f0: 42 35 30 30 30 30 20 7c 20 6c 6f 28 61 64 64 72 B50000 | lo(addr
5600: 65 73 73 29 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a ess);. *(long *
5610: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 ) (function +16)
5620: 20 3d 20 30 78 43 37 44 35 43 30 31 32 3b 0a 20 = 0xC7D5C012;.
5630: 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 *(long *) (func
5640: 74 69 6f 6e 20 2b 32 30 29 20 3d 20 30 78 44 36 tion +20) = 0xD6
5650: 41 30 31 43 31 45 3b 0a 20 20 2a 28 6c 6f 6e 67 A01C1E;. *(long
5660: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 *) (function +2
5670: 34 29 20 3d 20 30 78 34 41 42 33 30 30 30 38 3b 4) = 0x4AB30008;
5680: 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 . *(long *) (fu
5690: 6e 63 74 69 6f 6e 20 2b 32 38 29 20 3d 20 30 78 nction +28) = 0x
56a0: 34 41 42 35 30 30 30 30 3b 0a 20 20 2a 28 6c 6f 4AB50000;. *(lo
56b0: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 ng *) (function
56c0: 2b 33 32 29 20 3d 20 30 78 30 32 41 30 31 30 41 +32) = 0x02A010A
56d0: 31 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 1;. *(long *) (
56e0: 66 75 6e 63 74 69 6f 6e 20 2b 33 36 29 20 3d 20 function +36) =
56f0: 30 78 30 30 30 31 31 38 32 30 3b 0a 20 20 2a 28 0x00011820;. *(
5700: 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f long *) (functio
5710: 6e 20 2b 34 30 29 20 3d 20 30 78 45 32 41 30 30 n +40) = 0xE2A00
5720: 30 30 32 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 002;. *(long *)
5730: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 34 34 29 20 (function +44)
5740: 3d 20 30 78 30 38 30 30 30 32 34 30 3b 0a 23 64 = 0x08000240;.#d
5750: 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 28 66 efine is_tramp(f
5760: 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 28 unction) \. ((
5770: 6c 6f 6e 67 29 20 66 75 6e 63 74 69 6f 6e 20 26 long) function &
5780: 20 33 29 20 3d 3d 20 30 20 26 26 20 5c 0a 20 20 3) == 0 && \.
5790: 28 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 (*(long *) (func
57a0: 74 69 6f 6e 20 2b 20 30 29 20 26 20 30 78 66 66 tion + 0) & 0xff
57b0: 65 30 30 30 30 30 29 20 3d 3d 20 30 78 32 33 41 e00000) == 0x23A
57c0: 30 30 30 30 30 20 26 26 20 5c 0a 20 20 28 2a 28 00000 && \. (*(
57d0: 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f long *) (functio
57e0: 6e 20 2b 20 34 29 20 26 20 30 78 66 66 65 30 30 n + 4) & 0xffe00
57f0: 30 30 30 29 20 3d 3d 20 30 78 32 32 41 30 30 30 000) == 0x22A000
5800: 30 30 20 26 26 20 5c 0a 20 20 28 2a 28 6c 6f 6e 00 && \. (*(lon
5810: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b g *) (function +
5820: 20 38 29 20 26 20 30 78 66 66 66 66 66 30 30 30 8) & 0xfffff000
5830: 29 20 3d 3d 20 30 78 33 37 42 44 30 30 30 30 20 ) == 0x37BD0000
5840: 26 26 20 5c 0a 20 20 28 2a 28 6c 6f 6e 67 20 2a && \. (*(long *
5850: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 ) (function +12)
5860: 20 26 20 30 78 66 66 66 66 66 30 30 30 29 20 3d & 0xfffff000) =
5870: 3d 20 30 78 33 36 42 35 30 30 30 30 20 26 26 20 = 0x36B50000 &&
5880: 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 \. *(long *) (f
5890: 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 3d 20 unction +16) ==
58a0: 30 78 43 37 44 35 43 30 31 32 20 26 26 20 5c 0a 0xC7D5C012 && \.
58b0: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e *(long *) (fun
58c0: 63 74 69 6f 6e 20 2b 32 30 29 20 3d 3d 20 30 78 ction +20) == 0x
58d0: 44 36 41 30 31 43 31 45 20 26 26 20 5c 0a 20 20 D6A01C1E && \.
58e0: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 *(long *) (funct
58f0: 69 6f 6e 20 2b 32 34 29 20 3d 3d 20 30 78 34 41 ion +24) == 0x4A
5900: 42 33 30 30 30 38 20 26 26 20 5c 0a 20 20 2a 28 B30008 && \. *(
5910: 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f long *) (functio
5920: 6e 20 2b 32 38 29 20 3d 3d 20 30 78 34 41 42 35 n +28) == 0x4AB5
5930: 30 30 30 30 20 26 26 20 5c 0a 20 20 2a 28 6c 6f 0000 && \. *(lo
5940: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 ng *) (function
5950: 2b 33 32 29 20 3d 3d 20 30 78 30 32 41 30 31 30 +32) == 0x02A010
5960: 41 31 20 26 26 20 5c 0a 20 20 2a 28 6c 6f 6e 67 A1 && \. *(long
5970: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 33 *) (function +3
5980: 36 29 20 3d 3d 20 30 78 30 30 30 31 31 38 32 30 6) == 0x00011820
5990: 20 26 26 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a && \. *(long *
59a0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 34 30 29 ) (function +40)
59b0: 20 3d 3d 20 30 78 45 32 41 30 30 30 30 32 20 26 == 0xE2A00002 &
59c0: 26 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 & \. *(long *)
59d0: 28 66 75 6e 63 74 69 6f 6e 20 2b 34 34 29 20 3d (function +44) =
59e0: 3d 20 30 78 30 38 30 30 30 32 34 30 0a 23 64 65 = 0x08000240.#de
59f0: 66 69 6e 65 20 68 69 6c 6f 28 68 69 77 6f 72 64 fine hilo(hiword
5a00: 2c 6c 6f 77 6f 72 64 29 20 20 5c 0a 20 20 28 28 ,loword) \. ((
5a10: 61 73 73 65 6d 62 6c 65 32 31 28 28 75 6e 73 69 assemble21((unsi
5a20: 67 6e 65 64 20 6c 6f 6e 67 29 20 28 68 69 77 6f gned long) (hiwo
5a30: 72 64 29 29 20 3c 3c 20 31 31 29 20 7c 20 5c 0a rd)) << 11) | \.
5a40: 20 20 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c (((unsigned l
5a50: 6f 6e 67 29 20 28 6c 6f 77 6f 72 64 29 20 26 20 ong) (loword) &
5a60: 30 78 46 46 45 29 20 3e 3e 20 31 29 20 5c 0a 20 0xFFE) >> 1) \.
5a70: 20 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 ).#define tramp
5a80: 5f 61 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f _address(functio
5a90: 6e 29 20 20 5c 0a 20 20 68 69 6c 6f 28 2a 28 6c n) \. hilo(*(l
5aa0: 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ong *) (function
5ab0: 20 2b 20 34 29 2c 20 2a 28 6c 6f 6e 67 20 2a 29 + 4), *(long *)
5ac0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 29 (function +12))
5ad0: 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 .#define tramp_d
5ae0: 61 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c ata(function) \
5af0: 0a 20 20 68 69 6c 6f 28 2a 28 6c 6f 6e 67 20 2a . hilo(*(long *
5b00: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 ) (function + 0)
5b10: 2c 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e , *(long *) (fun
5b20: 63 74 69 6f 6e 20 2b 20 38 29 29 0a 23 65 6e 64 ction + 8)).#end
5b30: 69 66 0a 23 69 66 64 65 66 20 5f 5f 68 70 70 61 if.#ifdef __hppa
5b40: 6e 65 77 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 new__. /* funct
5b50: 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 2e 6c 6f ion:. * .lo
5b60: 6e 67 20 20 20 74 72 61 6d 70 5f 72 0a 20 20 20 ng tramp_r.
5b70: 2a 20 20 20 20 2e 6c 6f 6e 67 20 20 20 63 6c 6f * .long clo
5b80: 73 75 72 65 0a 20 20 20 2a 20 63 6c 6f 73 75 72 sure. * closur
5b90: 65 3a 0a 20 20 20 2a 20 20 20 20 2e 6c 6f 6e 67 e:. * .long
5ba0: 20 20 20 3c 64 61 74 61 3e 0a 20 20 20 2a 20 20 <data>. *
5bb0: 20 20 2e 6c 6f 6e 67 20 20 20 3c 61 64 64 72 65 .long <addre
5bc0: 73 73 3e 0a 20 20 20 2a 2f 0a 20 20 7b 20 2f 2a ss>. */. { /*
5bd0: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 62 work around a b
5be0: 75 67 20 69 6e 20 67 63 63 20 33 2e 2a 20 2a 2f ug in gcc 3.* */
5bf0: 0a 20 20 20 20 76 6f 69 64 2a 20 74 72 61 6d 70 . void* tramp
5c00: 5f 72 5f 61 64 64 72 65 73 73 20 3d 20 26 74 72 _r_address = &tr
5c10: 61 6d 70 5f 72 3b 0a 20 20 20 20 2a 28 6c 6f 6e amp_r;. *(lon
5c20: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b g *) (function +
5c30: 20 30 29 20 3d 20 28 28 6c 6f 6e 67 20 2a 29 20 0) = ((long *)
5c40: 28 28 63 68 61 72 2a 29 74 72 61 6d 70 5f 72 5f ((char*)tramp_r_
5c50: 61 64 64 72 65 73 73 2d 32 29 29 5b 30 5d 3b 0a address-2))[0];.
5c60: 20 20 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 *(long *) (f
5c70: 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 20 28 unction + 4) = (
5c80: 6c 6f 6e 67 29 20 28 66 75 6e 63 74 69 6f 6e 20 long) (function
5c90: 2b 20 38 29 3b 0a 20 20 20 20 2a 28 6c 6f 6e 67 + 8);. *(long
5ca0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 *) (function +
5cb0: 38 29 20 3d 20 28 6c 6f 6e 67 29 20 64 61 74 61 8) = (long) data
5cc0: 3b 0a 20 20 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 ;. *(long *)
5cd0: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d (function +12) =
5ce0: 20 28 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 3b (long) address;
5cf0: 0a 20 20 7d 0a 23 64 65 66 69 6e 65 20 69 73 5f . }.#define is_
5d00: 74 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20 tramp(function)
5d10: 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 \. ((long *) f
5d20: 75 6e 63 74 69 6f 6e 29 5b 30 5d 20 3d 3d 20 28 unction)[0] == (
5d30: 28 6c 6f 6e 67 20 2a 29 20 28 28 63 68 61 72 2a (long *) ((char*
5d40: 29 74 72 61 6d 70 5f 72 5f 61 64 64 72 65 73 73 )tramp_r_address
5d50: 2d 32 29 29 5b 30 5d 0a 23 64 65 66 69 6e 65 20 -2))[0].#define
5d60: 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75 tramp_address(fu
5d70: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 28 6c nction) \. ((l
5d80: 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 ong *) function)
5d90: 5b 33 5d 0a 23 64 65 66 69 6e 65 20 74 72 61 6d [3].#define tram
5da0: 70 5f 64 61 74 61 28 66 75 6e 63 74 69 6f 6e 29 p_data(function)
5db0: 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 20 \. ((long *)
5dc0: 66 75 6e 63 74 69 6f 6e 29 5b 32 5d 0a 23 65 6e function)[2].#en
5dd0: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 61 72 6d dif.#ifdef __arm
5de0: 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e __. /* function
5df0: 3a 0a 20 20 20 2a 09 61 64 64 09 72 31 32 2c 70 :. *.add.r12,p
5e00: 63 2c 23 38 09 09 09 45 32 38 46 43 30 30 38 0a c,#8...E28FC008.
5e10: 20 20 20 2a 09 6c 64 72 09 70 63 2c 5b 70 63 5d *.ldr.pc,[pc]
5e20: 09 09 09 09 45 35 39 46 46 30 30 30 0a 20 20 20 ....E59FF000.
5e30: 2a 20 5f 64 61 74 61 3a 0a 20 20 20 2a 09 2e 77 * _data:. *..w
5e40: 6f 72 64 09 3c 64 61 74 61 3e 0a 20 20 20 2a 20 ord.<data>. *
5e50: 5f 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 09 _function:. *.
5e60: 2e 77 6f 72 64 09 3c 61 64 64 72 65 73 73 3e 0a .word.<address>.
5e70: 20 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 28 28 */. {. ((
5e80: 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e long *) function
5e90: 29 5b 30 5d 20 3d 20 30 78 45 32 38 46 43 30 30 )[0] = 0xE28FC00
5ea0: 38 3b 0a 20 20 20 20 28 28 6c 6f 6e 67 20 2a 29 8;. ((long *)
5eb0: 20 66 75 6e 63 74 69 6f 6e 29 5b 31 5d 20 3d 20 function)[1] =
5ec0: 30 78 45 35 39 46 46 30 30 30 3b 0a 20 20 20 20 0xE59FF000;.
5ed0: 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 ((long *) functi
5ee0: 6f 6e 29 5b 32 5d 20 3d 20 28 6c 6f 6e 67 29 20 on)[2] = (long)
5ef0: 64 61 74 61 3b 0a 20 20 20 20 28 28 6c 6f 6e 67 data;. ((long
5f00: 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 33 5d *) function)[3]
5f10: 20 3d 20 28 6c 6f 6e 67 29 20 61 64 64 72 65 73 = (long) addres
5f20: 73 3b 0a 20 20 7d 0a 23 64 65 66 69 6e 65 20 69 s;. }.#define i
5f30: 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e s_tramp(function
5f40: 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 ) \. ((long *)
5f50: 20 66 75 6e 63 74 69 6f 6e 29 5b 30 5d 20 3d 3d function)[0] ==
5f60: 20 30 78 45 32 38 46 43 30 30 38 20 26 26 20 5c 0xE28FC008 && \
5f70: 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e . ((long *) fun
5f80: 63 74 69 6f 6e 29 5b 31 5d 20 3d 3d 20 30 78 45 ction)[1] == 0xE
5f90: 35 39 46 46 30 30 30 0a 23 64 65 66 69 6e 65 20 59FF000.#define
5fa0: 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75 tramp_address(fu
5fb0: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 28 6c nction) \. ((l
5fc0: 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 ong *) function)
5fd0: 5b 33 5d 0a 23 64 65 66 69 6e 65 20 74 72 61 6d [3].#define tram
5fe0: 70 5f 64 61 74 61 28 66 75 6e 63 74 69 6f 6e 29 p_data(function)
5ff0: 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 20 \. ((long *)
6000: 66 75 6e 63 74 69 6f 6e 29 5b 32 5d 0a 23 65 6e function)[2].#en
6010: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 70 6f 77 dif.#ifdef __pow
6020: 65 72 70 63 73 79 73 76 34 5f 5f 0a 23 69 66 64 erpcsysv4__.#ifd
6030: 65 66 20 5f 5f 4e 65 74 42 53 44 5f 5f 0a 20 20 ef __NetBSD__.
6040: 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 /* function:.
6050: 2a 20 20 20 20 7b 6c 69 75 7c 6c 69 73 7d 20 31 * {liu|lis} 1
6060: 33 2c 68 69 31 36 28 3c 64 61 74 61 3e 29 09 09 3,hi16(<data>)..
6070: 33 44 20 41 30 20 68 69 31 36 28 3c 64 61 74 61 3D A0 hi16(<data
6080: 3e 29 0a 20 20 20 2a 20 20 20 20 7b 6f 72 69 6c >). * {oril
6090: 7c 6f 72 69 7d 20 31 33 2c 31 33 2c 6c 6f 31 36 |ori} 13,13,lo16
60a0: 28 3c 64 61 74 61 3e 29 09 09 36 31 20 41 44 20 (<data>)..61 AD
60b0: 6c 6f 31 36 28 3c 64 61 74 61 3e 29 0a 20 20 20 lo16(<data>).
60c0: 2a 20 20 20 20 7b 6c 69 75 7c 6c 69 73 7d 20 30 * {liu|lis} 0
60d0: 2c 68 69 31 36 28 3c 61 64 64 72 65 73 73 3e 29 ,hi16(<address>)
60e0: 09 09 33 43 20 30 30 20 68 69 31 36 28 3c 61 64 ..3C 00 hi16(<ad
60f0: 64 72 65 73 73 3e 29 0a 20 20 20 2a 20 20 20 20 dress>). *
6100: 7b 6f 72 69 6c 7c 6f 72 69 7d 20 30 2c 30 2c 6c {oril|ori} 0,0,l
6110: 6f 31 36 28 3c 61 64 64 72 65 73 73 3e 29 09 09 o16(<address>)..
6120: 36 30 20 30 30 20 6c 6f 31 36 28 3c 61 64 64 72 60 00 lo16(<addr
6130: 65 73 73 3e 29 0a 20 20 20 2a 20 20 20 20 6d 74 ess>). * mt
6140: 63 74 72 20 30 09 09 09 09 09 37 43 20 30 39 20 ctr 0.....7C 09
6150: 30 33 20 41 36 0a 20 20 20 2a 20 20 20 20 62 63 03 A6. * bc
6160: 74 72 09 09 09 09 09 34 45 20 38 30 20 30 34 20 tr.....4E 80 04
6170: 32 30 0a 20 20 20 2a 2f 0a 20 20 2a 28 73 68 6f 20. */. *(sho
6180: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
6190: 2b 20 30 29 20 3d 20 30 78 33 44 41 30 3b 0a 20 + 0) = 0x3DA0;.
61a0: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e *(short *) (fun
61b0: 63 74 69 6f 6e 20 2b 20 32 29 20 3d 20 28 75 6e ction + 2) = (un
61c0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 61 74 signed long) dat
61d0: 61 20 3e 3e 20 31 36 3b 0a 20 20 2a 28 73 68 6f a >> 16;. *(sho
61e0: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
61f0: 2b 20 34 29 20 3d 20 30 78 36 31 41 44 3b 0a 20 + 4) = 0x61AD;.
6200: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e *(short *) (fun
6210: 63 74 69 6f 6e 20 2b 20 36 29 20 3d 20 28 75 6e ction + 6) = (un
6220: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 61 74 signed long) dat
6230: 61 20 26 20 30 78 66 66 66 66 3b 0a 20 20 2a 28 a & 0xffff;. *(
6240: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
6250: 6f 6e 20 2b 20 38 29 20 3d 20 30 78 33 43 30 30 on + 8) = 0x3C00
6260: 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 ;. *(short *) (
6270: 66 75 6e 63 74 69 6f 6e 20 2b 31 30 29 20 3d 20 function +10) =
6280: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
6290: 61 64 64 72 65 73 73 20 3e 3e 20 31 36 3b 0a 20 address >> 16;.
62a0: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e *(short *) (fun
62b0: 63 74 69 6f 6e 20 2b 31 32 29 20 3d 20 30 78 36 ction +12) = 0x6
62c0: 30 30 30 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 000;. *(short *
62d0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 34 29 ) (function +14)
62e0: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e = (unsigned lon
62f0: 67 29 20 61 64 64 72 65 73 73 20 26 20 30 78 66 g) address & 0xf
6300: 66 66 66 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 fff;. *(long *)
6310: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 (function +16)
6320: 20 3d 20 30 78 37 43 30 39 30 33 41 36 3b 0a 20 = 0x7C0903A6;.
6330: 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e *(long *) (fun
6340: 63 74 69 6f 6e 20 2b 32 30 29 20 3d 20 30 78 34 ction +20) = 0x4
6350: 45 38 30 30 34 32 30 3b 0a 23 64 65 66 69 6e 65 E800420;.#define
6360: 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 is_tramp(functi
6370: 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67 on) \. *(unsig
6380: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 ned short *) (fu
6390: 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 3d 20 30 nction + 0) == 0
63a0: 78 33 44 41 30 20 26 26 20 5c 0a 20 20 2a 28 75 x3DA0 && \. *(u
63b0: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 nsigned short *)
63c0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 (function + 4)
63d0: 3d 3d 20 30 78 36 31 41 44 20 26 26 20 5c 0a 20 == 0x61AD && \.
63e0: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 *(unsigned shor
63f0: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
6400: 20 38 29 20 3d 3d 20 30 78 33 43 30 30 20 26 26 8) == 0x3C00 &&
6410: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 \. *(unsigned
6420: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
6430: 6f 6e 20 2b 31 32 29 20 3d 3d 20 30 78 36 30 30 on +12) == 0x600
6440: 30 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 0 && \. *(unsig
6450: 6e 65 64 20 6c 6f 6e 67 20 2a 29 20 20 28 66 75 ned long *) (fu
6460: 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 3d 20 30 nction +16) == 0
6470: 78 37 43 30 39 30 33 41 36 20 26 26 20 5c 0a 20 x7C0903A6 && \.
6480: 20 2a 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 *(unsigned long
6490: 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b *) (function +
64a0: 32 30 29 20 3d 3d 20 30 78 34 45 38 30 30 34 32 20) == 0x4E80042
64b0: 30 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 66 75 6e 0.#else. /* fun
64c0: 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 7b ction:. * {
64d0: 6c 69 75 7c 6c 69 73 7d 20 31 31 2c 68 69 31 36 liu|lis} 11,hi16
64e0: 28 3c 64 61 74 61 3e 29 09 09 33 44 20 36 30 20 (<data>)..3D 60
64f0: 68 69 31 36 28 3c 64 61 74 61 3e 29 0a 20 20 20 hi16(<data>).
6500: 2a 20 20 20 20 7b 6f 72 69 6c 7c 6f 72 69 7d 20 * {oril|ori}
6510: 31 31 2c 31 31 2c 6c 6f 31 36 28 3c 64 61 74 61 11,11,lo16(<data
6520: 3e 29 09 09 36 31 20 36 42 20 6c 6f 31 36 28 3c >)..61 6B lo16(<
6530: 64 61 74 61 3e 29 0a 20 20 20 2a 20 20 20 20 7b data>). * {
6540: 6c 69 75 7c 6c 69 73 7d 20 30 2c 68 69 31 36 28 liu|lis} 0,hi16(
6550: 3c 61 64 64 72 65 73 73 3e 29 09 09 33 43 20 30 <address>)..3C 0
6560: 30 20 68 69 31 36 28 3c 61 64 64 72 65 73 73 3e 0 hi16(<address>
6570: 29 0a 20 20 20 2a 20 20 20 20 7b 6f 72 69 6c 7c ). * {oril|
6580: 6f 72 69 7d 20 30 2c 30 2c 6c 6f 31 36 28 3c 61 ori} 0,0,lo16(<a
6590: 64 64 72 65 73 73 3e 29 09 09 36 30 20 30 30 20 ddress>)..60 00
65a0: 6c 6f 31 36 28 3c 61 64 64 72 65 73 73 3e 29 0a lo16(<address>).
65b0: 20 20 20 2a 20 20 20 20 6d 74 63 74 72 20 30 09 * mtctr 0.
65c0: 09 09 09 09 37 43 20 30 39 20 30 33 20 41 36 0a ....7C 09 03 A6.
65d0: 20 20 20 2a 20 20 20 20 62 63 74 72 09 09 09 09 * bctr....
65e0: 09 34 45 20 38 30 20 30 34 20 32 30 0a 20 20 20 .4E 80 04 20.
65f0: 2a 2f 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 */. *(short *)
6600: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d (function + 0) =
6610: 20 30 78 33 44 36 30 3b 0a 20 20 2a 28 73 68 6f 0x3D60;. *(sho
6620: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
6630: 2b 20 32 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 + 2) = (unsigned
6640: 20 6c 6f 6e 67 29 20 64 61 74 61 20 3e 3e 20 31 long) data >> 1
6650: 36 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 6;. *(short *)
6660: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d (function + 4) =
6670: 20 30 78 36 31 36 42 3b 0a 20 20 2a 28 73 68 6f 0x616B;. *(sho
6680: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
6690: 2b 20 36 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 + 6) = (unsigned
66a0: 20 6c 6f 6e 67 29 20 64 61 74 61 20 26 20 30 78 long) data & 0x
66b0: 66 66 66 66 3b 0a 20 20 2a 28 73 68 6f 72 74 20 ffff;. *(short
66c0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 *) (function + 8
66d0: 29 20 3d 20 30 78 33 43 30 30 3b 0a 20 20 2a 28 ) = 0x3C00;. *(
66e0: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
66f0: 6f 6e 20 2b 31 30 29 20 3d 20 28 75 6e 73 69 67 on +10) = (unsig
6700: 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64 72 65 73 ned long) addres
6710: 73 20 3e 3e 20 31 36 3b 0a 20 20 2a 28 73 68 6f s >> 16;. *(sho
6720: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
6730: 2b 31 32 29 20 3d 20 30 78 36 30 30 30 3b 0a 20 +12) = 0x6000;.
6740: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e *(short *) (fun
6750: 63 74 69 6f 6e 20 2b 31 34 29 20 3d 20 28 75 6e ction +14) = (un
6760: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64 signed long) add
6770: 72 65 73 73 20 26 20 30 78 66 66 66 66 3b 0a 20 ress & 0xffff;.
6780: 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e *(long *) (fun
6790: 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20 30 78 37 ction +16) = 0x7
67a0: 43 30 39 30 33 41 36 3b 0a 20 20 2a 28 6c 6f 6e C0903A6;. *(lon
67b0: 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 g *) (function
67c0: 2b 32 30 29 20 3d 20 30 78 34 45 38 30 30 34 32 +20) = 0x4E80042
67d0: 30 3b 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72 0;.#define is_tr
67e0: 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c amp(function) \
67f0: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 . *(unsigned sh
6800: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ort *) (function
6810: 20 2b 20 30 29 20 3d 3d 20 30 78 33 44 36 30 20 + 0) == 0x3D60
6820: 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 && \. *(unsigne
6830: 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 d short *) (func
6840: 74 69 6f 6e 20 2b 20 34 29 20 3d 3d 20 30 78 36 tion + 4) == 0x6
6850: 31 36 42 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 16B && \. *(uns
6860: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 igned short *) (
6870: 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 3d function + 8) ==
6880: 20 30 78 33 43 30 30 20 26 26 20 5c 0a 20 20 2a 0x3C00 && \. *
6890: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 (unsigned short
68a0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 *) (function +12
68b0: 29 20 3d 3d 20 30 78 36 30 30 30 20 26 26 20 5c ) == 0x6000 && \
68c0: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 6c 6f . *(unsigned lo
68d0: 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e ng *) (function
68e0: 20 2b 31 36 29 20 3d 3d 20 30 78 37 43 30 39 30 +16) == 0x7C090
68f0: 33 41 36 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 3A6 && \. *(uns
6900: 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 29 20 20 28 igned long *) (
6910: 66 75 6e 63 74 69 6f 6e 20 2b 32 30 29 20 3d 3d function +20) ==
6920: 20 30 78 34 45 38 30 30 34 32 30 0a 23 65 6e 64 0x4E800420.#end
6930: 69 66 0a 23 64 65 66 69 6e 65 20 68 69 6c 6f 28 if.#define hilo(
6940: 68 69 77 6f 72 64 2c 6c 6f 77 6f 72 64 29 20 20 hiword,loword)
6950: 5c 0a 20 20 28 28 28 75 6e 73 69 67 6e 65 64 20 \. (((unsigned
6960: 6c 6f 6e 67 29 20 28 68 69 77 6f 72 64 29 20 3c long) (hiword) <
6970: 3c 20 31 36 29 20 7c 20 28 75 6e 73 69 67 6e 65 < 16) | (unsigne
6980: 64 20 6c 6f 6e 67 29 20 28 6c 6f 77 6f 72 64 29 d long) (loword)
6990: 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f ).#define tramp_
69a0: 61 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e address(function
69b0: 29 20 20 5c 0a 20 20 68 69 6c 6f 28 2a 28 75 6e ) \. hilo(*(un
69c0: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 signed short *)
69d0: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 30 29 2c 20 (function +10),
69e0: 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 *(unsigned short
69f0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 *) (function +1
6a00: 34 29 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 4)).#define tram
6a10: 70 5f 64 61 74 61 28 66 75 6e 63 74 69 6f 6e 29 p_data(function)
6a20: 20 20 5c 0a 20 20 68 69 6c 6f 28 2a 28 75 6e 73 \. hilo(*(uns
6a30: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 igned short *) (
6a40: 66 75 6e 63 74 69 6f 6e 20 2b 20 32 29 2c 20 2a function + 2), *
6a50: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 (unsigned short
6a60: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 36 *) (function + 6
6a70: 29 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 )).#endif.#ifdef
6a80: 20 5f 5f 70 6f 77 65 72 70 63 61 69 78 5f 5f 0a __powerpcaix__.
6a90: 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 /* function:.
6aa0: 20 20 2a 20 20 20 20 2e 6c 6f 6e 67 20 2e 74 72 * .long .tr
6ab0: 61 6d 70 5f 72 0a 20 20 20 2a 20 20 20 20 2e 6c amp_r. * .l
6ac0: 6f 6e 67 20 2e 6d 79 74 6f 63 0a 20 20 20 2a 20 ong .mytoc. *
6ad0: 20 20 20 2e 6c 6f 6e 67 20 30 0a 20 20 20 2a 20 .long 0. *
6ae0: 2e 6d 79 74 6f 63 3a 0a 20 20 20 2a 20 20 20 20 .mytoc:. *
6af0: 2e 6c 6f 6e 67 20 3c 64 61 74 61 3e 0a 20 20 20 .long <data>.
6b00: 2a 20 20 20 20 2e 6c 6f 6e 67 20 3c 61 64 64 72 * .long <addr
6b10: 65 73 73 3e 0a 20 20 20 2a 2f 0a 20 20 2a 28 6c ess>. */. *(l
6b20: 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f ong *) (functio
6b30: 6e 20 2b 20 30 29 20 3d 20 28 28 6c 6f 6e 67 20 n + 0) = ((long
6b40: 2a 29 20 26 74 72 61 6d 70 5f 72 29 5b 30 5d 3b *) &tramp_r)[0];
6b50: 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 . *(long *) (f
6b60: 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 20 28 unction + 4) = (
6b70: 6c 6f 6e 67 29 20 28 66 75 6e 63 74 69 6f 6e 20 long) (function
6b80: 2b 20 31 32 29 3b 0a 20 20 2a 28 6c 6f 6e 67 20 + 12);. *(long
6b90: 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 *) (function +
6ba0: 38 29 20 3d 20 30 3b 0a 20 20 2a 28 6c 6f 6e 67 8) = 0;. *(long
6bb0: 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b *) (function +
6bc0: 31 32 29 20 3d 20 28 6c 6f 6e 67 29 20 64 61 74 12) = (long) dat
6bd0: 61 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 a;. *(long *)
6be0: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d (function +16) =
6bf0: 20 28 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 3b (long) address;
6c00: 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d .#define is_tram
6c10: 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 p(function) \.
6c20: 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 ((long *) funct
6c30: 69 6f 6e 29 5b 30 5d 20 3d 3d 20 28 28 6c 6f 6e ion)[0] == ((lon
6c40: 67 20 2a 29 20 26 74 72 61 6d 70 5f 72 29 5b 30 g *) &tramp_r)[0
6c50: 5d 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f ].#define tramp_
6c60: 61 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e address(function
6c70: 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 ) \. ((long *)
6c80: 20 66 75 6e 63 74 69 6f 6e 29 5b 34 5d 0a 23 64 function)[4].#d
6c90: 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 efine tramp_data
6ca0: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 (function) \.
6cb0: 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 ((long *) functi
6cc0: 6f 6e 29 5b 33 5d 0a 23 65 6e 64 69 66 0a 23 69 on)[3].#endif.#i
6cd0: 66 64 65 66 20 5f 5f 70 6f 77 65 72 70 63 36 34 fdef __powerpc64
6ce0: 61 69 78 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 aix__. /* funct
6cf0: 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 2e 71 75 ion:. * .qu
6d00: 61 64 20 2e 74 72 61 6d 70 5f 72 0a 20 20 20 2a ad .tramp_r. *
6d10: 20 20 20 20 2e 71 75 61 64 20 2e 6d 79 74 6f 63 .quad .mytoc
6d20: 0a 20 20 20 2a 20 20 20 20 2e 71 75 61 64 20 30 . * .quad 0
6d30: 0a 20 20 20 2a 20 2e 6d 79 74 6f 63 3a 0a 20 20 . * .mytoc:.
6d40: 20 2a 20 20 20 20 2e 71 75 61 64 20 3c 64 61 74 * .quad <dat
6d50: 61 3e 0a 20 20 20 2a 20 20 20 20 2e 71 75 61 64 a>. * .quad
6d60: 20 3c 61 64 64 72 65 73 73 3e 0a 20 20 20 2a 2f <address>. */
6d70: 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 . *(long *) (f
6d80: 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20 28 unction + 0) = (
6d90: 28 6c 6f 6e 67 20 2a 29 20 26 74 72 61 6d 70 5f (long *) &tramp_
6da0: 72 29 5b 30 5d 3b 0a 20 20 2a 28 6c 6f 6e 67 20 r)[0];. *(long
6db0: 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 *) (function +
6dc0: 38 29 20 3d 20 28 6c 6f 6e 67 29 20 28 66 75 6e 8) = (long) (fun
6dd0: 63 74 69 6f 6e 20 2b 20 32 34 29 3b 0a 20 20 2a ction + 24);. *
6de0: 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 (long *) (funct
6df0: 69 6f 6e 20 2b 31 36 29 20 3d 20 30 3b 0a 20 20 ion +16) = 0;.
6e00: 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 *(long *) (func
6e10: 74 69 6f 6e 20 2b 32 34 29 20 3d 20 28 6c 6f 6e tion +24) = (lon
6e20: 67 29 20 64 61 74 61 3b 0a 20 20 2a 28 6c 6f 6e g) data;. *(lon
6e30: 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 g *) (function
6e40: 2b 33 32 29 20 3d 20 28 6c 6f 6e 67 29 20 61 64 +32) = (long) ad
6e50: 64 72 65 73 73 3b 0a 23 64 65 66 69 6e 65 20 69 dress;.#define i
6e60: 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e s_tramp(function
6e70: 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 ) \. ((long *)
6e80: 20 66 75 6e 63 74 69 6f 6e 29 5b 30 5d 20 3d 3d function)[0] ==
6e90: 20 28 28 6c 6f 6e 67 20 2a 29 20 26 74 72 61 6d ((long *) &tram
6ea0: 70 5f 72 29 5b 30 5d 0a 23 64 65 66 69 6e 65 20 p_r)[0].#define
6eb0: 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75 tramp_address(fu
6ec0: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 28 6c nction) \. ((l
6ed0: 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 ong *) function)
6ee0: 5b 34 5d 0a 23 64 65 66 69 6e 65 20 74 72 61 6d [4].#define tram
6ef0: 70 5f 64 61 74 61 28 66 75 6e 63 74 69 6f 6e 29 p_data(function)
6f00: 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 20 \. ((long *)
6f10: 66 75 6e 63 74 69 6f 6e 29 5b 33 5d 0a 23 65 6e function)[3].#en
6f20: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d 38 38 dif.#ifdef __m88
6f30: 6b 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f k__. /* functio
6f40: 6e 3a 0a 20 20 20 2a 20 20 20 20 6f 72 2e 75 20 n:. * or.u
6f50: 20 20 20 23 72 31 31 2c 23 72 30 2c 68 69 31 36 #r11,#r0,hi16
6f60: 28 3c 64 61 74 61 3e 29 09 09 35 44 20 36 30 20 (<data>)..5D 60
6f70: 68 69 31 36 28 3c 64 61 74 61 3e 29 0a 20 20 20 hi16(<data>).
6f80: 2a 20 20 20 20 6f 72 20 20 20 20 20 20 23 72 31 * or #r1
6f90: 31 2c 23 72 31 31 2c 6c 6f 31 36 28 3c 64 61 74 1,#r11,lo16(<dat
6fa0: 61 3e 29 09 09 35 39 20 36 42 20 6c 6f 31 36 28 a>)..59 6B lo16(
6fb0: 3c 64 61 74 61 3e 29 0a 20 20 20 2a 20 20 20 20 <data>). *
6fc0: 6f 72 2e 75 20 20 20 20 23 72 31 33 2c 23 72 30 or.u #r13,#r0
6fd0: 2c 68 69 31 36 28 3c 61 64 64 72 65 73 73 3e 29 ,hi16(<address>)
6fe0: 09 35 44 20 41 30 20 68 69 31 36 28 3c 61 64 64 .5D A0 hi16(<add
6ff0: 72 65 73 73 3e 29 0a 20 20 20 2a 20 20 20 20 6f ress>). * o
7000: 72 20 20 20 20 20 20 23 72 31 33 2c 23 72 31 33 r #r13,#r13
7010: 2c 6c 6f 31 36 28 3c 61 64 64 72 65 73 73 3e 29 ,lo16(<address>)
7020: 09 35 39 20 41 44 20 6c 6f 31 36 28 3c 61 64 64 .59 AD lo16(<add
7030: 72 65 73 73 3e 29 0a 20 20 20 2a 20 20 20 20 6a ress>). * j
7040: 6d 70 20 20 20 20 20 23 72 31 33 09 09 09 09 46 mp #r13....F
7050: 34 20 30 30 20 43 30 20 30 44 0a 20 20 20 2a 2f 4 00 C0 0D. */
7060: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 . *(short *) (f
7070: 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20 30 unction + 0) = 0
7080: 78 35 44 36 30 3b 0a 20 20 2a 28 73 68 6f 72 74 x5D60;. *(short
7090: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 *) (function +
70a0: 32 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 2) = (unsigned l
70b0: 6f 6e 67 29 20 64 61 74 61 20 3e 3e 20 31 36 3b ong) data >> 16;
70c0: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 . *(short *) (f
70d0: 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 20 30 unction + 4) = 0
70e0: 78 35 39 36 42 3b 0a 20 20 2a 28 73 68 6f 72 74 x596B;. *(short
70f0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 *) (function +
7100: 36 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6) = (unsigned l
7110: 6f 6e 67 29 20 64 61 74 61 20 26 20 30 78 66 66 ong) data & 0xff
7120: 66 66 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 ff;. *(short *)
7130: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 (function + 8)
7140: 3d 20 30 78 35 44 41 30 3b 0a 20 20 2a 28 73 68 = 0x5DA0;. *(sh
7150: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ort *) (function
7160: 20 2b 31 30 29 20 3d 20 28 75 6e 73 69 67 6e 65 +10) = (unsigne
7170: 64 20 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 20 d long) address
7180: 3e 3e 20 31 36 3b 0a 20 20 2a 28 73 68 6f 72 74 >> 16;. *(short
7190: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 *) (function +1
71a0: 32 29 20 3d 20 30 78 35 39 41 44 3b 0a 20 20 2a 2) = 0x59AD;. *
71b0: 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 (short *) (funct
71c0: 69 6f 6e 20 2b 31 34 29 20 3d 20 28 75 6e 73 69 ion +14) = (unsi
71d0: 67 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64 72 65 gned long) addre
71e0: 73 73 20 26 20 30 78 66 66 66 66 3b 0a 20 20 2a ss & 0xffff;. *
71f0: 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 (long *) (funct
7200: 69 6f 6e 20 2b 31 36 29 20 3d 20 30 78 46 34 30 ion +16) = 0xF40
7210: 30 43 30 30 44 3b 0a 23 64 65 66 69 6e 65 20 69 0C00D;.#define i
7220: 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e s_tramp(function
7230: 29 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 ) \. *(unsigne
7240: 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 d short *) (func
7250: 74 69 6f 6e 20 2b 20 30 29 20 3d 3d 20 30 78 35 tion + 0) == 0x5
7260: 44 36 30 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 D60 && \. *(uns
7270: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 igned short *) (
7280: 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 3d function + 4) ==
7290: 20 30 78 35 39 36 42 20 26 26 20 5c 0a 20 20 2a 0x596B && \. *
72a0: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 (unsigned short
72b0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 *) (function + 8
72c0: 29 20 3d 3d 20 30 78 35 44 41 30 20 26 26 20 5c ) == 0x5DA0 && \
72d0: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 . *(unsigned sh
72e0: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ort *) (function
72f0: 20 2b 31 32 29 20 3d 3d 20 30 78 35 39 41 44 20 +12) == 0x59AD
7300: 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 && \. *(unsigne
7310: 64 20 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 d long *) (func
7320: 74 69 6f 6e 20 2b 31 36 29 20 3d 3d 20 30 78 46 tion +16) == 0xF
7330: 34 30 30 43 30 30 44 0a 23 64 65 66 69 6e 65 20 400C00D.#define
7340: 68 69 6c 6f 28 68 69 77 6f 72 64 2c 6c 6f 77 6f hilo(hiword,lowo
7350: 72 64 29 20 20 5c 0a 20 20 28 28 28 75 6e 73 69 rd) \. (((unsi
7360: 67 6e 65 64 20 6c 6f 6e 67 29 20 28 68 69 77 6f gned long) (hiwo
7370: 72 64 29 20 3c 3c 20 31 36 29 20 7c 20 28 75 6e rd) << 16) | (un
7380: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 6c 6f signed long) (lo
7390: 77 6f 72 64 29 29 0a 23 64 65 66 69 6e 65 20 74 word)).#define t
73a0: 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75 6e ramp_address(fun
73b0: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c 6f ction) \. hilo
73c0: 28 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 (*(unsigned shor
73d0: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
73e0: 31 30 29 2c 20 2a 28 75 6e 73 69 67 6e 65 64 20 10), *(unsigned
73f0: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
7400: 6f 6e 20 2b 31 34 29 29 0a 23 64 65 66 69 6e 65 on +14)).#define
7410: 20 74 72 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 tramp_data(func
7420: 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c 6f 28 tion) \. hilo(
7430: 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 *(unsigned short
7440: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 *) (function +
7450: 32 29 2c 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 2), *(unsigned s
7460: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f hort *) (functio
7470: 6e 20 2b 20 36 29 29 0a 23 65 6e 64 69 66 0a 23 n + 6)).#endif.#
7480: 69 66 64 65 66 20 5f 5f 63 6f 6e 76 65 78 5f 5f ifdef __convex__
7490: 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a . /* function:.
74a0: 20 20 20 2a 20 20 20 20 6c 64 2e 77 20 23 3c 64 * ld.w #<d
74b0: 61 74 61 3e 2c 73 30 09 09 09 09 3f 3f 3f 3f 20 ata>,s0....????
74c0: 3c 64 61 74 61 3e 0a 20 20 20 2a 20 20 20 20 6a <data>. * j
74d0: 6d 70 20 3c 61 64 64 72 65 73 73 3e 09 09 09 09 mp <address>....
74e0: 30 31 34 30 20 3c 61 64 64 72 65 73 73 3e 0a 20 0140 <address>.
74f0: 20 20 2a 20 20 20 20 64 73 2e 68 20 30 09 09 09 * ds.h 0...
7500: 09 09 30 30 30 30 0a 20 20 20 2a 2f 0a 20 20 2a ..0000. */. *
7510: 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 (short *) (funct
7520: 69 6f 6e 20 2b 20 30 29 20 3d 20 30 78 3f 3f 3f ion + 0) = 0x???
7530: 3f 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 ?;. *(long *)
7540: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 32 29 20 3d (function + 2) =
7550: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
7560: 20 64 61 74 61 3b 0a 20 20 2a 28 73 68 6f 72 74 data;. *(short
7570: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 *) (function +
7580: 36 29 20 3d 20 30 78 30 31 34 30 3b 0a 20 20 2a 6) = 0x0140;. *
7590: 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 (long *) (funct
75a0: 69 6f 6e 20 2b 20 38 29 20 3d 20 28 75 6e 73 69 ion + 8) = (unsi
75b0: 67 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64 72 65 gned long) addre
75c0: 73 73 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 ss;. *(short *)
75d0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 (function +12)
75e0: 3d 20 30 78 30 30 30 30 3b 0a 23 64 65 66 69 6e = 0x0000;.#defin
75f0: 65 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 e is_tramp(funct
7600: 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e 73 69 ion) \. *(unsi
7610: 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 gned short *) (f
7620: 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 3d 20 unction + 0) ==
7630: 30 78 3f 3f 3f 3f 20 26 26 20 5c 0a 20 20 2a 28 0x???? && \. *(
7640: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a unsigned short *
7650: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 36 29 ) (function + 6)
7660: 20 3d 3d 20 30 78 30 31 34 30 20 26 26 20 5c 0a == 0x0140 && \.
7670: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f *(unsigned sho
7680: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
7690: 2b 31 32 29 20 3d 3d 20 30 78 30 30 30 30 0a 23 +12) == 0x0000.#
76a0: 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 define tramp_add
76b0: 72 65 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 ress(function)
76c0: 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 \. *(long *) (
76d0: 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 0a 23 64 function + 8).#d
76e0: 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 efine tramp_data
76f0: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 (function) \.
7700: 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 *(long *) (func
7710: 74 69 6f 6e 20 2b 20 32 29 0a 23 65 6e 64 69 66 tion + 2).#endif
7720: 0a 23 69 66 64 65 66 20 5f 5f 69 61 36 34 5f 5f .#ifdef __ia64__
7730: 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a . /* function:.
7740: 20 20 20 2a 20 20 20 20 64 61 74 61 38 20 20 20 * data8
7750: 74 72 61 6d 70 5f 72 0a 20 20 20 2a 20 20 20 20 tramp_r. *
7760: 64 61 74 61 38 20 20 20 63 6c 6f 73 75 72 65 0a data8 closure.
7770: 20 20 20 2a 20 63 6c 6f 73 75 72 65 3a 0a 20 20 * closure:.
7780: 20 2a 20 20 20 20 64 61 74 61 38 20 20 20 3c 61 * data8 <a
7790: 64 64 72 65 73 73 3e 0a 20 20 20 2a 20 20 20 20 ddress>. *
77a0: 64 61 74 61 38 20 20 20 3c 64 61 74 61 3e 0a 20 data8 <data>.
77b0: 20 20 2a 2f 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 */. *(long *)
77c0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 (function + 0)
77d0: 3d 20 28 6c 6f 6e 67 29 20 26 74 72 61 6d 70 5f = (long) &tramp_
77e0: 72 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 r;. *(long *) (
77f0: 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 function + 8) =
7800: 28 6c 6f 6e 67 29 20 28 66 75 6e 63 74 69 6f 6e (long) (function
7810: 20 2b 20 31 36 29 3b 0a 20 20 2a 28 6c 6f 6e 67 + 16);. *(long
7820: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 *) (function +1
7830: 36 29 20 3d 20 28 6c 6f 6e 67 29 20 61 64 64 72 6) = (long) addr
7840: 65 73 73 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 ess;. *(long *)
7850: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 34 29 20 (function +24)
7860: 3d 20 28 6c 6f 6e 67 29 20 64 61 74 61 3b 0a 23 = (long) data;.#
7870: 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 28 define is_tramp(
7880: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 function) \. (
7890: 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f (long *) functio
78a0: 6e 29 5b 30 5d 20 3d 3d 20 28 6c 6f 6e 67 29 20 n)[0] == (long)
78b0: 26 74 72 61 6d 70 5f 72 0a 23 64 65 66 69 6e 65 &tramp_r.#define
78c0: 20 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66 tramp_address(f
78d0: 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 28 unction) \. ((
78e0: 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e long *) function
78f0: 29 5b 32 5d 0a 23 64 65 66 69 6e 65 20 74 72 61 )[2].#define tra
7900: 6d 70 5f 64 61 74 61 28 66 75 6e 63 74 69 6f 6e mp_data(function
7910: 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 ) \. ((long *)
7920: 20 66 75 6e 63 74 69 6f 6e 29 5b 33 5d 0a 23 65 function)[3].#e
7930: 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 78 38 ndif.#ifdef __x8
7940: 36 5f 36 34 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 6_64__. /* func
7950: 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 6d 6f tion:. * mo
7960: 76 61 62 73 71 20 24 3c 64 61 74 61 3e 2c 25 72 vabsq $<data>,%r
7970: 31 30 09 09 34 39 20 42 41 20 3c 64 61 74 61 3e 10..49 BA <data>
7980: 0a 20 20 20 2a 20 20 20 20 6d 6f 76 61 62 73 71 . * movabsq
7990: 20 24 3c 61 64 64 72 65 73 73 3e 2c 25 72 61 78 $<address>,%rax
79a0: 09 09 34 38 20 42 38 20 3c 61 64 64 72 65 73 73 ..48 B8 <address
79b0: 3e 0a 20 20 20 2a 20 20 20 20 6a 6d 70 20 2a 25 >. * jmp *%
79c0: 72 61 78 09 09 09 46 46 20 45 30 0a 20 20 20 2a rax...FF E0. *
79d0: 2f 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 /. *(short *) (
79e0: 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20 function + 0) =
79f0: 30 78 42 41 34 39 3b 0a 20 20 2a 28 73 68 6f 72 0xBA49;. *(shor
7a00: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
7a10: 20 32 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 2) = (unsigned
7a20: 6c 6f 6e 67 29 20 64 61 74 61 20 26 20 30 78 66 long) data & 0xf
7a30: 66 66 66 3b 0a 20 20 2a 28 69 6e 74 20 2a 29 20 fff;. *(int *)
7a40: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 (function + 4)
7a50: 20 3d 20 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f = ((unsigned lo
7a60: 6e 67 29 20 64 61 74 61 20 3e 3e 20 31 36 29 20 ng) data >> 16)
7a70: 26 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20 & 0xffffffff;.
7a80: 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 *(short *) (func
7a90: 74 69 6f 6e 20 2b 20 38 29 20 3d 20 28 28 75 6e tion + 8) = ((un
7aa0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 61 74 signed long) dat
7ab0: 61 20 3e 3e 20 34 38 29 20 26 20 30 78 66 66 66 a >> 48) & 0xfff
7ac0: 66 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 f;. *(short *)
7ad0: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 30 29 20 3d (function +10) =
7ae0: 20 30 78 42 38 34 38 3b 0a 20 20 2a 28 69 6e 74 0xB848;. *(int
7af0: 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 *) (function
7b00: 2b 31 32 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 +12) = (unsigned
7b10: 20 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 20 26 long) address &
7b20: 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20 2a 0xffffffff;. *
7b30: 28 69 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74 (int *) (funct
7b40: 69 6f 6e 20 2b 31 36 29 20 3d 20 28 28 75 6e 73 ion +16) = ((uns
7b50: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64 72 igned long) addr
7b60: 65 73 73 20 3e 3e 20 33 32 29 20 26 20 30 78 66 ess >> 32) & 0xf
7b70: 66 66 66 66 66 66 66 3b 0a 20 20 2a 28 73 68 6f fffffff;. *(sho
7b80: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
7b90: 2b 32 30 29 20 3d 20 30 78 45 30 46 46 3b 0a 23 +20) = 0xE0FF;.#
7ba0: 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 28 define is_tramp(
7bb0: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a function) \. *
7bc0: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 (unsigned short
7bd0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 *) (function + 0
7be0: 29 20 3d 3d 20 30 78 42 41 34 39 20 26 26 20 5c ) == 0xBA49 && \
7bf0: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 . *(unsigned sh
7c00: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ort *) (function
7c10: 20 2b 31 30 29 20 3d 3d 20 30 78 42 38 34 38 20 +10) == 0xB848
7c20: 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 && \. *(unsigne
7c30: 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 d short *) (func
7c40: 74 69 6f 6e 20 2b 32 30 29 20 3d 3d 20 30 78 45 tion +20) == 0xE
7c50: 30 46 46 0a 23 64 65 66 69 6e 65 20 68 69 6c 6f 0FF.#define hilo
7c60: 28 68 69 77 6f 72 64 2c 6c 6f 77 6f 72 64 29 20 (hiword,loword)
7c70: 20 5c 0a 20 20 28 28 28 75 6e 73 69 67 6e 65 64 \. (((unsigned
7c80: 20 6c 6f 6e 67 29 20 28 68 69 77 6f 72 64 29 20 long) (hiword)
7c90: 3c 3c 20 33 32 29 20 7c 20 28 75 6e 73 69 67 6e << 32) | (unsign
7ca0: 65 64 20 6c 6f 6e 67 29 20 28 6c 6f 77 6f 72 64 ed long) (loword
7cb0: 29 29 0a 23 64 65 66 69 6e 65 20 68 69 6d 69 64 )).#define himid
7cc0: 6c 6f 28 68 69 73 68 6f 72 74 2c 6d 69 64 77 6f lo(hishort,midwo
7cd0: 72 64 2c 6c 6f 73 68 6f 72 74 29 20 20 5c 0a 20 rd,loshort) \.
7ce0: 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e (((unsigned lon
7cf0: 67 29 20 28 68 69 73 68 6f 72 74 29 20 3c 3c 20 g) (hishort) <<
7d00: 34 38 29 20 7c 20 28 75 6e 73 69 67 6e 65 64 20 48) | (unsigned
7d10: 6c 6f 6e 67 29 20 28 6d 69 64 77 6f 72 64 29 20 long) (midword)
7d20: 3c 3c 20 31 36 20 5c 0a 20 20 20 7c 20 28 75 6e << 16 \. | (un
7d30: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 6c 6f signed long) (lo
7d40: 73 68 6f 72 74 29 29 0a 23 64 65 66 69 6e 65 20 short)).#define
7d50: 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75 tramp_address(fu
7d60: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c nction) \. hil
7d70: 6f 28 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 o(*(unsigned int
7d80: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 *) (function +1
7d90: 36 29 2c 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6), *(unsigned i
7da0: 6e 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 nt *) (function
7db0: 2b 31 32 29 29 0a 23 64 65 66 69 6e 65 20 74 72 +12)).#define tr
7dc0: 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 74 69 6f amp_data(functio
7dd0: 6e 29 20 20 5c 0a 20 20 68 69 6d 69 64 6c 6f 28 n) \. himidlo(
7de0: 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 *(unsigned short
7df0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 *) (function +
7e00: 38 29 2c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 8), \.
7e10: 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a *(unsigned int *
7e20: 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 ) (function +
7e30: 34 29 2c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 4), \.
7e40: 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 *(unsigned short
7e50: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 *) (function +
7e60: 32 29 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 2)).#endif.#ifde
7e70: 66 20 5f 5f 73 33 39 30 5f 5f 0a 20 20 2f 2a 20 f __s390__. /*
7e80: 66 75 6e 63 74 69 6f 6e 3a 0a 0a 20 20 20 20 20 function:..
7e90: 20 20 20 62 72 61 73 20 20 20 20 25 72 31 2c 2e bras %r1,.
7ea0: 4c 54 4e 30 5f 30 0a 2e 4c 54 30 5f 30 3a 0a 2e LTN0_0..LT0_0:..
7eb0: 4c 43 30 3a 0a 20 20 20 20 20 20 20 20 2e 6c 6f LC0:. .lo
7ec0: 6e 67 20 20 20 30 78 37 33 35 35 34 37 31 31 0a ng 0x73554711.
7ed0: 2e 4c 43 31 3a 0a 20 20 20 20 20 20 20 20 2e 6c .LC1:. .l
7ee0: 6f 6e 67 20 20 20 30 78 62 61 62 65 62 65 63 30 ong 0xbabebec0
7ef0: 0a 2e 4c 54 4e 30 5f 30 3a 0a 20 20 20 20 20 20 ..LTN0_0:.
7f00: 20 20 6c 20 20 20 20 20 20 20 25 72 30 2c 2e 4c l %r0,.L
7f10: 43 30 2d 2e 4c 54 30 5f 30 28 25 72 31 29 0a 20 C0-.LT0_0(%r1).
7f20: 20 20 20 20 20 20 20 6c 20 20 20 20 20 20 20 25 l %
7f30: 72 31 2c 2e 4c 43 31 2d 2e 4c 54 31 5f 30 28 25 r1,.LC1-.LT1_0(%
7f40: 72 31 29 0a 20 20 20 20 20 20 20 20 62 72 20 20 r1). br
7f50: 20 20 20 20 25 72 31 0a 20 20 2a 2f 0a 20 20 2f %r1. */. /
7f60: 2a 20 57 68 61 74 20 61 62 6f 75 74 20 62 69 67 * What about big
7f70: 20 65 6e 64 69 61 6e 20 2f 20 6c 69 74 74 6c 65 endian / little
7f80: 20 65 6e 64 69 61 6e 20 3f 3f 20 2a 2f 0a 20 20 endian ?? */.
7f90: 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a *(unsigned int *
7fa0: 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 ) (function +
7fb0: 30 29 20 3d 20 30 78 41 37 31 35 30 30 30 36 3b 0) = 0xA7150006;
7fc0: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e . *(unsigned in
7fd0: 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e t *) (function
7fe0: 20 2b 20 34 29 20 3d 20 28 75 6e 73 69 67 6e 65 + 4) = (unsigne
7ff0: 64 20 69 6e 74 29 20 64 61 74 61 3b 0a 20 20 2a d int) data;. *
8000: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 (unsigned int *)
8010: 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 (function + 8
8020: 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 69 6e ) = (unsigned in
8030: 74 29 20 61 64 64 72 65 73 73 3b 0a 20 20 2a 28 t) address;. *(
8040: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 unsigned int *)
8050: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 (function +12)
8060: 20 3d 20 30 78 35 38 30 30 31 30 30 30 3b 0a 20 = 0x58001000;.
8070: 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 *(unsigned int
8080: 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b *) (function +
8090: 31 36 29 20 3d 20 30 78 35 38 31 30 31 30 30 34 16) = 0x58101004
80a0: 3b 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 ;. *(unsigned s
80b0: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f hort *) (functio
80c0: 6e 20 2b 32 30 29 20 3d 20 30 78 30 37 66 31 3b n +20) = 0x07f1;
80d0: 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d .#define is_tram
80e0: 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 p(function) \.
80f0: 20 2a 28 69 6e 74 20 2a 29 20 20 20 20 20 20 20 *(int *)
8100: 20 20 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b (function +
8110: 20 30 29 20 3d 3d 20 30 78 41 37 31 35 30 30 30 0) == 0xA715000
8120: 36 20 26 26 20 5c 0a 20 20 2a 28 69 6e 74 20 2a 6 && \. *(int *
8130: 29 20 20 20 20 20 20 20 20 20 20 20 20 28 66 75 ) (fu
8140: 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d 3d 20 30 nction +12) == 0
8150: 78 35 38 30 30 31 30 30 30 20 26 26 20 5c 0a 20 x58001000 && \.
8160: 20 2a 28 69 6e 74 20 2a 29 20 20 20 20 20 20 20 *(int *)
8170: 20 20 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b (function +
8180: 31 36 29 20 3d 3d 20 30 78 35 38 31 30 31 30 30 16) == 0x5810100
8190: 34 20 26 26 20 5c 0a 20 20 2a 28 73 68 6f 72 74 4 && \. *(short
81a0: 20 2a 29 20 20 20 20 20 20 20 20 20 20 28 66 75 *) (fu
81b0: 6e 63 74 69 6f 6e 20 2b 32 30 29 20 3d 3d 20 30 nction +20) == 0
81c0: 78 30 37 66 31 0a 23 64 65 66 69 6e 65 20 74 72 x07f1.#define tr
81d0: 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75 6e 63 amp_address(func
81e0: 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e 73 tion) \. *(uns
81f0: 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 28 66 75 igned int *) (fu
8200: 6e 63 74 69 6f 6e 20 2b 38 29 0a 23 64 65 66 69 nction +8).#defi
8210: 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 28 66 75 ne tramp_data(fu
8220: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 nction) \. *(u
8230: 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 28 nsigned int *) (
8240: 66 75 6e 63 74 69 6f 6e 20 2b 34 29 0a 23 65 6e function +4).#en
8250: 64 69 66 0a 20 20 2f 2a 0a 20 20 20 2a 20 64 61 dif. /*. * da
8260: 74 61 3a 0a 20 20 20 2a 20 20 20 20 3c 64 61 74 ta:. * <dat
8270: 61 30 3e 09 09 09 09 3c 64 61 74 61 30 3e 0a 20 a0>....<data0>.
8280: 20 20 2a 20 20 20 20 3c 64 61 74 61 31 3e 09 09 * <data1>..
8290: 09 09 3c 64 61 74 61 31 3e 0a 20 20 20 2a 2f 0a ..<data1>. */.
82a0: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 64 61 *(long *) (da
82b0: 74 61 20 2b 20 30 2a 73 69 7a 65 6f 66 28 76 6f ta + 0*sizeof(vo
82c0: 69 64 2a 29 29 20 3d 20 28 6c 6f 6e 67 29 20 64 id*)) = (long) d
82d0: 61 74 61 30 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a ata0;. *(long *
82e0: 29 20 20 28 64 61 74 61 20 2b 20 31 2a 73 69 7a ) (data + 1*siz
82f0: 65 6f 66 28 76 6f 69 64 2a 29 29 20 3d 20 28 6c eof(void*)) = (l
8300: 6f 6e 67 29 20 64 61 74 61 31 3b 0a 0a 20 20 2f ong) data1;.. /
8310: 2a 20 33 2e 20 53 65 74 20 6d 65 6d 6f 72 79 20 * 3. Set memory
8320: 70 72 6f 74 65 63 74 69 6f 6e 20 74 6f 20 22 65 protection to "e
8330: 78 65 63 75 74 61 62 6c 65 22 20 2a 2f 0a 0a 23 xecutable" */..#
8340: 69 66 20 21 64 65 66 69 6e 65 64 28 43 4f 44 45 if !defined(CODE
8350: 5f 45 58 45 43 55 54 41 42 4c 45 29 20 26 26 20 _EXECUTABLE) &&
8360: 64 65 66 69 6e 65 64 28 45 58 45 43 55 54 41 42 defined(EXECUTAB
8370: 4c 45 5f 56 49 41 5f 4d 50 52 4f 54 45 43 54 29 LE_VIA_MPROTECT)
8380: 0a 20 20 2f 2a 20 43 61 6c 6c 20 6d 70 72 6f 74 . /* Call mprot
8390: 65 63 74 20 6f 6e 20 74 68 65 20 70 61 67 65 73 ect on the pages
83a0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 74 68 that contain th
83b0: 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 7b 20 e range. */. {
83c0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 74 unsigned long st
83d0: 61 72 74 5f 61 64 64 72 20 3d 20 28 75 6e 73 69 art_addr = (unsi
83e0: 67 6e 65 64 20 6c 6f 6e 67 29 20 66 75 6e 63 74 gned long) funct
83f0: 69 6f 6e 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 ion;. unsigne
8400: 64 20 6c 6f 6e 67 20 65 6e 64 5f 61 64 64 72 20 d long end_addr
8410: 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 = (unsigned long
8420: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 54 52 ) (function + TR
8430: 41 4d 50 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 20 AMP_LENGTH);.
8440: 20 73 74 61 72 74 5f 61 64 64 72 20 3d 20 73 74 start_addr = st
8450: 61 72 74 5f 61 64 64 72 20 26 20 2d 70 61 67 65 art_addr & -page
8460: 73 69 7a 65 3b 0a 20 20 20 20 65 6e 64 5f 61 64 size;. end_ad
8470: 64 72 20 3d 20 28 65 6e 64 5f 61 64 64 72 20 2b dr = (end_addr +
8480: 20 70 61 67 65 73 69 7a 65 2d 31 29 20 26 20 2d pagesize-1) & -
8490: 70 61 67 65 73 69 7a 65 3b 0a 20 20 20 7b 75 6e pagesize;. {un
84a0: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 65 6e 20 signed long len
84b0: 3d 20 65 6e 64 5f 61 64 64 72 20 2d 20 73 74 61 = end_addr - sta
84c0: 72 74 5f 61 64 64 72 3b 0a 23 69 66 20 64 65 66 rt_addr;.#if def
84d0: 69 6e 65 64 28 48 41 56 45 5f 4d 41 43 48 5f 56 ined(HAVE_MACH_V
84e0: 4d 29 0a 20 20 20 20 69 66 20 28 76 6d 5f 70 72 M). if (vm_pr
84f0: 6f 74 65 63 74 28 74 61 73 6b 5f 73 65 6c 66 28 otect(task_self(
8500: 29 2c 73 74 61 72 74 5f 61 64 64 72 2c 6c 65 6e ),start_addr,len
8510: 2c 30 2c 56 4d 5f 50 52 4f 54 5f 52 45 41 44 7c ,0,VM_PROT_READ|
8520: 56 4d 5f 50 52 4f 54 5f 57 52 49 54 45 7c 56 4d VM_PROT_WRITE|VM
8530: 5f 50 52 4f 54 5f 45 58 45 43 55 54 45 29 20 21 _PROT_EXECUTE) !
8540: 3d 20 4b 45 52 4e 5f 53 55 43 43 45 53 53 29 0a = KERN_SUCCESS).
8550: 23 65 6c 73 65 0a 23 69 66 20 64 65 66 69 6e 65 #else.#if define
8560: 64 28 5f 5f 63 6f 6e 76 65 78 5f 5f 29 0a 20 20 d(__convex__).
8570: 20 20 2f 2a 20 43 6f 6e 76 65 78 20 4f 53 20 63 /* Convex OS c
8580: 61 6c 6c 73 20 69 74 20 60 6d 72 65 6d 61 70 28 alls it `mremap(
8590: 29 27 2e 20 2a 2f 0a 20 20 20 20 6d 72 65 6d 61 )'. */. mrema
85a0: 70 28 73 74 61 72 74 5f 61 64 64 72 2c 20 26 6c p(start_addr, &l
85b0: 65 6e 2c 20 50 52 4f 54 5f 52 45 41 44 7c 50 52 en, PROT_READ|PR
85c0: 4f 54 5f 57 52 49 54 45 7c 50 52 4f 54 5f 45 58 OT_WRITE|PROT_EX
85d0: 45 43 2c 20 4d 41 50 5f 50 52 49 56 41 54 45 29 EC, MAP_PRIVATE)
85e0: 3b 0a 20 20 20 20 69 66 20 28 30 29 0a 23 65 6c ;. if (0).#el
85f0: 73 65 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 se.#if defined(H
8600: 41 56 45 5f 53 59 53 5f 4d 38 38 4b 42 43 53 5f AVE_SYS_M88KBCS_
8610: 48 29 0a 20 20 20 20 69 66 20 28 6d 65 6d 63 74 H). if (memct
8620: 6c 28 73 74 61 72 74 5f 61 64 64 72 2c 20 6c 65 l(start_addr, le
8630: 6e 2c 20 4d 43 54 5f 54 45 58 54 29 20 3d 3d 20 n, MCT_TEXT) ==
8640: 2d 31 29 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 -1).#else. if
8650: 20 28 6d 70 72 6f 74 65 63 74 28 28 76 6f 69 64 (mprotect((void
8660: 2a 29 73 74 61 72 74 5f 61 64 64 72 2c 20 6c 65 *)start_addr, le
8670: 6e 2c 20 50 52 4f 54 5f 52 45 41 44 7c 50 52 4f n, PROT_READ|PRO
8680: 54 5f 57 52 49 54 45 7c 50 52 4f 54 5f 45 58 45 T_WRITE|PROT_EXE
8690: 43 29 20 3c 20 30 29 0a 23 65 6e 64 69 66 0a 23 C) < 0).#endif.#
86a0: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 20 20 20 endif.#endif.
86b0: 20 20 20 7b 20 66 70 72 69 6e 74 66 28 73 74 64 { fprintf(std
86c0: 65 72 72 2c 22 74 72 61 6d 70 6f 6c 69 6e 65 3a err,"trampoline:
86d0: 20 63 61 6e 6e 6f 74 20 6d 61 6b 65 20 6d 65 6d cannot make mem
86e0: 6f 72 79 20 65 78 65 63 75 74 61 62 6c 65 5c 6e ory executable\n
86f0: 22 29 3b 20 61 62 6f 72 74 28 29 3b 20 7d 0a 20 "); abort(); }.
8700: 20 7d 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a }}.#endif.. /*
8710: 20 34 2e 20 46 6c 75 73 68 20 69 6e 73 74 72 75 4. Flush instru
8720: 63 74 69 6f 6e 20 63 61 63 68 65 20 2a 2f 0a 20 ction cache */.
8730: 20 2f 2a 20 57 65 20 6e 65 65 64 20 74 68 69 73 /* We need this
8740: 20 62 65 63 61 75 73 65 20 73 6f 6d 65 20 43 50 because some CP
8750: 55 73 20 68 61 76 65 20 73 65 70 61 72 61 74 65 Us have separate
8760: 20 64 61 74 61 20 63 61 63 68 65 20 61 6e 64 20 data cache and
8770: 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 2a instruction. *
8780: 20 63 61 63 68 65 2e 20 54 68 65 20 66 72 65 73 cache. The fres
8790: 68 6c 79 20 62 75 69 6c 74 20 74 72 61 6d 70 6f hly built trampo
87a0: 6c 69 6e 65 20 69 73 20 76 69 73 69 62 6c 65 20 line is visible
87b0: 74 6f 20 74 68 65 20 64 61 74 61 20 63 61 63 68 to the data cach
87c0: 65 2c 20 62 75 74 20 6e 6f 74 0a 20 20 20 2a 20 e, but not. *
87d0: 6d 61 79 62 65 20 6e 6f 74 20 74 6f 20 74 68 65 maybe not to the
87e0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 61 63 instruction cac
87f0: 68 65 2e 20 54 68 69 73 20 69 73 20 68 61 69 72 he. This is hair
8800: 79 2e 0a 20 20 20 2a 2f 0a 23 69 66 20 21 28 64 y.. */.#if !(d
8810: 65 66 69 6e 65 64 28 5f 5f 68 70 70 61 6e 65 77 efined(__hppanew
8820: 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f __) || defined(_
8830: 5f 70 6f 77 65 72 70 63 61 69 78 5f 5f 29 20 7c _powerpcaix__) |
8840: 7c 20 64 65 66 69 6e 65 64 28 5f 5f 70 6f 77 65 | defined(__powe
8850: 72 70 63 36 34 61 69 78 5f 5f 29 20 7c 7c 20 64 rpc64aix__) || d
8860: 65 66 69 6e 65 64 28 5f 5f 69 61 36 34 5f 5f 29 efined(__ia64__)
8870: 29 0a 20 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 ). /* Only need
8880: 65 64 20 69 66 20 77 65 20 72 65 61 6c 6c 79 20 ed if we really
8890: 73 65 74 20 75 70 20 6d 61 63 68 69 6e 65 20 69 set up machine i
88a0: 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 2a 2f 0a nstructions. */.
88b0: 23 69 66 64 65 66 20 5f 5f 69 33 38 36 5f 5f 0a #ifdef __i386__.
88c0: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e #if defined(_WIN
88d0: 33 32 29 0a 20 20 77 68 69 6c 65 20 28 21 46 6c 32). while (!Fl
88e0: 75 73 68 49 6e 73 74 72 75 63 74 69 6f 6e 43 61 ushInstructionCa
88f0: 63 68 65 28 47 65 74 43 75 72 72 65 6e 74 50 72 che(GetCurrentPr
8900: 6f 63 65 73 73 28 29 2c 66 75 6e 63 74 69 6f 6e ocess(),function
8910: 2c 54 52 41 4d 50 5f 4c 45 4e 47 54 48 29 29 0a ,TRAMP_LENGTH)).
8920: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 65 continue;.#e
8930: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 64 ndif.#endif.#ifd
8940: 65 66 20 5f 5f 6d 36 38 6b 5f 5f 0a 23 69 66 20 ef __m68k__.#if
8950: 64 65 66 69 6e 65 64 28 4e 65 58 54 29 20 26 26 defined(NeXT) &&
8960: 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f defined(__GNUC_
8970: 5f 29 0a 20 20 5f 5f 61 73 6d 5f 5f 20 5f 5f 76 _). __asm__ __v
8980: 6f 6c 61 74 69 6c 65 5f 5f 20 28 22 74 72 61 70 olatile__ ("trap
8990: 20 23 32 22 29 3b 0a 23 65 6e 64 69 66 0a 23 69 #2");.#endif.#i
89a0: 66 20 64 65 66 69 6e 65 64 28 41 4d 49 47 41 29 f defined(AMIGA)
89b0: 0a 20 20 43 61 63 68 65 43 6c 65 61 72 45 28 66 . CacheClearE(f
89c0: 75 6e 63 74 69 6f 6e 2c 54 52 41 4d 50 5f 4c 45 unction,TRAMP_LE
89d0: 4e 47 54 48 2c 43 41 43 52 46 5f 43 6c 65 61 72 NGTH,CACRF_Clear
89e0: 49 7c 43 41 43 52 46 5f 43 6c 65 61 72 44 29 3b I|CACRF_ClearD);
89f0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
8a00: 6e 65 64 28 61 70 6f 6c 6c 6f 29 0a 20 20 63 61 ned(apollo). ca
8a10: 63 68 65 5f 24 63 6c 65 61 72 28 29 3b 0a 23 65 che_$clear();.#e
8a20: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
8a30: 28 68 70 75 78 29 0a 20 20 63 61 63 68 65 63 74 (hpux). cachect
8a40: 6c 28 43 43 5f 49 50 55 52 47 45 2c 66 75 6e 63 l(CC_IPURGE,func
8a50: 74 69 6f 6e 2c 54 52 41 4d 50 5f 4c 45 4e 47 54 tion,TRAMP_LENGT
8a60: 48 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 H);.#endif.#if d
8a70: 65 66 69 6e 65 64 28 5f 5f 4e 65 74 42 53 44 5f efined(__NetBSD_
8a80: 5f 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f _) && defined(__
8a90: 47 4e 55 43 5f 5f 29 0a 20 20 7b 20 72 65 67 69 GNUC__). { regi
8aa0: 73 74 65 72 20 75 6e 73 69 67 6e 65 64 20 6c 6f ster unsigned lo
8ab0: 6e 67 20 5f 62 65 67 20 5f 5f 61 73 6d 5f 5f 20 ng _beg __asm__
8ac0: 28 22 25 61 31 22 29 20 3d 20 28 75 6e 73 69 67 ("%a1") = (unsig
8ad0: 6e 65 64 20 6c 6f 6e 67 29 20 66 75 6e 63 74 69 ned long) functi
8ae0: 6f 6e 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 on;. register
8af0: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 5f unsigned long _
8b00: 6c 65 6e 20 5f 5f 61 73 6d 5f 5f 20 28 22 25 64 len __asm__ ("%d
8b10: 31 22 29 20 3d 20 54 52 41 4d 50 5f 4c 45 4e 47 1") = TRAMP_LENG
8b20: 54 48 3b 0a 20 20 20 20 5f 5f 61 73 6d 5f 5f 20 TH;. __asm__
8b30: 5f 5f 76 6f 6c 61 74 69 6c 65 5f 5f 20 28 0a 20 __volatile__ (.
8b40: 20 20 20 20 20 22 6d 6f 76 65 25 2e 6c 20 25 23 "move%.l %#
8b50: 30 78 38 30 30 30 30 30 30 34 2c 25 2f 64 30 5c 0x80000004,%/d0\
8b60: 6e 5c 74 22 20 2f 2a 20 43 43 5f 45 58 54 50 55 n\t" /* CC_EXTPU
8b70: 52 47 45 20 7c 20 43 5f 49 50 55 52 47 45 20 2a RGE | C_IPURGE *
8b80: 2f 0a 20 20 20 20 20 20 22 74 72 61 70 20 23 31 /. "trap #1
8b90: 32 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2"
8ba0: 20 20 20 20 20 20 20 20 2f 2a 20 6b 65 72 6e 65 /* kerne
8bb0: 6c 20 63 61 6c 6c 20 60 63 61 63 68 65 63 74 6c l call `cachectl
8bc0: 27 20 2a 2f 0a 20 20 20 20 20 20 3a 0a 20 20 20 ' */. :.
8bd0: 20 20 20 3a 20 22 61 22 20 28 5f 62 65 67 29 2c : "a" (_beg),
8be0: 20 22 64 22 20 28 5f 6c 65 6e 29 0a 20 20 20 20 "d" (_len).
8bf0: 20 20 3a 20 22 25 61 30 22 2c 20 22 25 61 31 22 : "%a0", "%a1"
8c00: 2c 20 22 25 64 30 22 2c 20 22 25 64 31 22 20 20 , "%d0", "%d1"
8c10: 20 20 2f 2a 20 63 61 6c 6c 2d 75 73 65 64 20 72 /* call-used r
8c20: 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 20 20 egisters */.
8c30: 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a );. }.#endif.
8c40: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 #if defined(__li
8c50: 6e 75 78 5f 5f 29 20 26 26 20 64 65 66 69 6e 65 nux__) && define
8c60: 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a 20 20 7b 20 d(__GNUC__). {
8c70: 72 65 67 69 73 74 65 72 20 75 6e 73 69 67 6e 65 register unsigne
8c80: 64 20 6c 6f 6e 67 20 5f 62 65 67 20 5f 5f 61 73 d long _beg __as
8c90: 6d 5f 5f 20 28 22 25 64 31 22 29 20 3d 20 28 75 m__ ("%d1") = (u
8ca0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 66 75 nsigned long) fu
8cb0: 6e 63 74 69 6f 6e 3b 0a 20 20 20 20 72 65 67 69 nction;. regi
8cc0: 73 74 65 72 20 75 6e 73 69 67 6e 65 64 20 6c 6f ster unsigned lo
8cd0: 6e 67 20 5f 6c 65 6e 20 5f 5f 61 73 6d 5f 5f 20 ng _len __asm__
8ce0: 28 22 25 64 34 22 29 20 3d 20 54 52 41 4d 50 5f ("%d4") = TRAMP_
8cf0: 4c 45 4e 47 54 48 20 2b 20 33 32 3b 0a 20 20 20 LENGTH + 32;.
8d00: 20 5f 5f 61 73 6d 5f 5f 20 5f 5f 76 6f 6c 61 74 __asm__ __volat
8d10: 69 6c 65 5f 5f 20 28 0a 20 20 20 20 20 20 22 6d ile__ (. "m
8d20: 6f 76 65 25 2e 6c 20 25 23 31 32 33 2c 25 2f 64 ove%.l %#123,%/d
8d30: 30 5c 6e 5c 74 22 0a 20 20 20 20 20 20 22 6d 6f 0\n\t". "mo
8d40: 76 65 25 2e 6c 20 25 23 31 2c 25 2f 64 32 5c 6e ve%.l %#1,%/d2\n
8d50: 5c 74 22 0a 20 20 20 20 20 20 22 6d 6f 76 65 25 \t". "move%
8d60: 2e 6c 20 25 23 33 2c 25 2f 64 33 5c 6e 5c 74 22 .l %#3,%/d3\n\t"
8d70: 0a 20 20 20 20 20 20 22 74 72 61 70 20 25 23 30 . "trap %#0
8d80: 22 0a 20 20 20 20 20 20 3a 0a 20 20 20 20 20 20 ". :.
8d90: 3a 20 22 64 22 20 28 5f 62 65 67 29 2c 20 22 64 : "d" (_beg), "d
8da0: 22 20 28 5f 6c 65 6e 29 0a 20 20 20 20 20 20 3a " (_len). :
8db0: 20 22 25 64 30 22 2c 20 22 25 64 32 22 2c 20 22 "%d0", "%d2", "
8dc0: 25 64 33 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 %d3". );.
8dd0: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 }.#endif.#if def
8de0: 69 6e 65 64 28 41 55 58 29 20 26 26 20 64 65 66 ined(AUX) && def
8df0: 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a 20 ined(__GNUC__).
8e00: 20 2f 2a 20 73 79 73 6d 36 38 6b 28 31 30 35 2c /* sysm68k(105,
8e10: 20 61 64 64 72 2c 20 73 63 6f 70 65 2c 20 63 61 addr, scope, ca
8e20: 63 68 65 2c 20 6c 65 6e 29 20 2a 2f 0a 20 20 5f che, len) */. _
8e30: 5f 61 73 6d 5f 5f 20 5f 5f 76 6f 6c 61 74 69 6c _asm__ __volatil
8e40: 65 5f 5f 20 28 0a 20 20 20 20 22 6d 6f 76 65 25 e__ (. "move%
8e50: 2e 6c 20 25 31 2c 25 2f 73 70 40 2d 5c 6e 5c 74 .l %1,%/sp@-\n\t
8e60: 22 0a 20 20 20 20 22 6d 6f 76 65 25 2e 6c 20 25 ". "move%.l %
8e70: 23 33 2c 25 2f 73 70 40 2d 5c 6e 5c 74 22 0a 20 #3,%/sp@-\n\t".
8e80: 20 20 20 22 6d 6f 76 65 25 2e 6c 20 25 23 31 2c "move%.l %#1,
8e90: 25 2f 73 70 40 2d 5c 6e 5c 74 22 0a 20 20 20 20 %/sp@-\n\t".
8ea0: 22 6d 6f 76 65 25 2e 6c 20 25 30 2c 25 2f 73 70 "move%.l %0,%/sp
8eb0: 40 2d 5c 6e 5c 74 22 0a 20 20 20 20 22 6d 6f 76 @-\n\t". "mov
8ec0: 65 25 2e 6c 20 25 23 31 30 35 2c 25 2f 73 70 40 e%.l %#105,%/sp@
8ed0: 2d 5c 6e 5c 74 22 0a 20 20 20 20 22 6d 6f 76 65 -\n\t". "move
8ee0: 25 2e 6c 20 25 23 30 2c 25 2f 73 70 40 2d 5c 6e %.l %#0,%/sp@-\n
8ef0: 5c 74 22 0a 20 20 20 20 22 6d 6f 76 65 25 2e 6c \t". "move%.l
8f00: 20 25 23 33 38 2c 25 2f 73 70 40 2d 5c 6e 5c 74 %#38,%/sp@-\n\t
8f10: 22 0a 20 20 20 20 22 74 72 61 70 20 25 23 30 5c ". "trap %#0\
8f20: 6e 5c 74 22 0a 20 20 20 20 22 61 64 64 25 2e 6c n\t". "add%.l
8f30: 20 25 23 32 34 2c 25 2f 73 70 22 0a 20 20 20 20 %#24,%/sp".
8f40: 3a 0a 20 20 20 20 3a 20 22 72 22 20 28 66 75 6e :. : "r" (fun
8f50: 63 74 69 6f 6e 29 2c 20 22 67 22 20 28 28 69 6e ction), "g" ((in
8f60: 74 29 54 52 41 4d 50 5f 4c 45 4e 47 54 48 29 0a t)TRAMP_LENGTH).
8f70: 20 20 20 20 3a 20 22 25 64 30 22 0a 20 20 20 20 : "%d0".
8f80: 29 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 );.#endif.#endif
8f90: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 6d .#if defined(__m
8fa0: 69 70 73 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 ips__) || define
8fb0: 64 28 5f 5f 6d 69 70 73 6e 33 32 5f 5f 29 20 7c d(__mipsn32__) |
8fc0: 7c 20 64 65 66 69 6e 65 64 28 5f 5f 6d 69 70 73 | defined(__mips
8fd0: 36 34 5f 5f 29 0a 20 20 63 61 63 68 65 66 6c 75 64__). cacheflu
8fe0: 73 68 28 66 75 6e 63 74 69 6f 6e 2c 54 52 41 4d sh(function,TRAM
8ff0: 50 5f 4c 45 4e 47 54 48 2c 49 43 41 43 48 45 29 P_LENGTH,ICACHE)
9000: 3b 0a 20 20 2f 2a 20 67 66 6f 72 74 68 2d 30 2e ;. /* gforth-0.
9010: 33 2e 30 20 75 73 65 73 20 42 43 41 43 48 45 20 3.0 uses BCACHE
9020: 69 6e 73 74 65 61 64 20 6f 66 20 49 43 41 43 48 instead of ICACH
9030: 45 2e 20 57 68 79 3f 3f 20 2a 2f 0a 23 65 6e 64 E. Why?? */.#end
9040: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f if.#if defined(_
9050: 5f 73 70 61 72 63 5f 5f 29 20 7c 7c 20 64 65 66 _sparc__) || def
9060: 69 6e 65 64 28 5f 5f 73 70 61 72 63 36 34 5f 5f ined(__sparc64__
9070: 29 0a 20 20 2f 2a 20 54 68 69 73 20 61 73 73 75 ). /* This assu
9080: 6d 65 73 20 74 68 61 74 20 74 68 65 20 74 72 61 mes that the tra
9090: 6d 70 6f 6c 69 6e 65 20 66 69 74 73 20 69 6e 20 mpoline fits in
90a0: 61 74 20 6d 6f 73 74 20 74 77 6f 20 63 61 63 68 at most two cach
90b0: 65 20 6c 69 6e 65 73 2e 20 2a 2f 0a 20 20 5f 5f e lines. */. __
90c0: 54 52 5f 63 6c 65 61 72 5f 63 61 63 68 65 5f 32 TR_clear_cache_2
90d0: 28 66 75 6e 63 74 69 6f 6e 2c 66 75 6e 63 74 69 (function,functi
90e0: 6f 6e 2b 54 52 41 4d 50 5f 4c 45 4e 47 54 48 2d on+TRAMP_LENGTH-
90f0: 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 1);.#endif.#ifde
9100: 66 20 5f 5f 61 6c 70 68 61 5f 5f 0a 20 20 5f 5f f __alpha__. __
9110: 54 52 5f 63 6c 65 61 72 5f 63 61 63 68 65 28 29 TR_clear_cache()
9120: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 ;.#endif.#ifdef
9130: 5f 5f 68 70 70 61 5f 5f 0a 20 20 2f 2a 20 54 68 __hppa__. /* Th
9140: 69 73 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 is assumes that
9150: 74 68 65 20 74 72 61 6d 70 6f 6c 69 6e 65 20 66 the trampoline f
9160: 69 74 73 20 69 6e 20 61 74 20 6d 6f 73 74 20 74 its in at most t
9170: 77 6f 20 63 61 63 68 65 20 6c 69 6e 65 73 2e 20 wo cache lines.
9180: 2a 2f 0a 20 20 5f 5f 54 52 5f 63 6c 65 61 72 5f */. __TR_clear_
9190: 63 61 63 68 65 28 66 75 6e 63 74 69 6f 6e 2c 66 cache(function,f
91a0: 75 6e 63 74 69 6f 6e 2b 54 52 41 4d 50 5f 4c 45 unction+TRAMP_LE
91b0: 4e 47 54 48 2d 31 29 3b 0a 23 65 6e 64 69 66 0a NGTH-1);.#endif.
91c0: 23 69 66 64 65 66 20 5f 5f 61 72 6d 5f 5f 0a 20 #ifdef __arm__.
91d0: 20 5f 5f 54 52 5f 63 6c 65 61 72 5f 63 61 63 68 __TR_clear_cach
91e0: 65 28 66 75 6e 63 74 69 6f 6e 2c 66 75 6e 63 74 e(function,funct
91f0: 69 6f 6e 2b 54 52 41 4d 50 5f 4c 45 4e 47 54 48 ion+TRAMP_LENGTH
9200: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 );.#endif.#if de
9210: 66 69 6e 65 64 28 5f 5f 70 6f 77 65 72 70 63 5f fined(__powerpc_
9220: 5f 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f _) && !defined(_
9230: 5f 70 6f 77 65 72 70 63 36 34 5f 5f 29 0a 20 20 _powerpc64__).
9240: 5f 5f 54 52 5f 63 6c 65 61 72 5f 63 61 63 68 65 __TR_clear_cache
9250: 28 66 75 6e 63 74 69 6f 6e 29 3b 0a 23 65 6e 64 (function);.#end
9260: 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d 38 38 6b if.#ifdef __m88k
9270: 5f 5f 0a 20 20 73 79 73 6d 6f 74 28 53 38 38 43 __. sysmot(S88C
9280: 41 43 48 45 46 4c 55 53 48 50 41 47 45 2c 20 28 ACHEFLUSHPAGE, (
9290: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 66 75 unsigned long)fu
92a0: 6e 63 74 69 6f 6e 20 26 20 2d 70 61 67 65 73 69 nction & -pagesi
92b0: 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 ze);.#endif.#ifd
92c0: 65 66 20 5f 5f 63 6f 6e 76 65 78 5f 5f 0a 20 20 ef __convex__.
92d0: 5f 5f 54 52 5f 63 6c 65 61 72 5f 63 61 63 68 65 __TR_clear_cache
92e0: 28 29 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 ();.#endif.#endi
92f0: 66 0a 0a 20 20 2f 2a 20 35 2e 20 52 65 74 75 72 f.. /* 5. Retur
9300: 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 n. */. return (
9310: 5f 5f 54 52 5f 66 75 6e 63 74 69 6f 6e 29 20 28 __TR_function) (
9320: 66 75 6e 63 74 69 6f 6e 20 2b 20 54 52 41 4d 50 function + TRAMP
9330: 5f 42 49 41 53 29 3b 0a 7d 0a 0a 76 6f 69 64 20 _BIAS);.}..void
9340: 66 72 65 65 5f 74 72 61 6d 70 6f 6c 69 6e 65 5f free_trampoline_
9350: 72 20 28 5f 5f 54 52 5f 66 75 6e 63 74 69 6f 6e r (__TR_function
9360: 20 66 75 6e 63 74 69 6f 6e 29 0a 7b 0a 23 69 66 function).{.#if
9370: 20 54 52 41 4d 50 5f 42 49 41 53 0a 20 20 66 75 TRAMP_BIAS. fu
9380: 6e 63 74 69 6f 6e 20 3d 20 28 5f 5f 54 52 5f 66 nction = (__TR_f
9390: 75 6e 63 74 69 6f 6e 29 28 28 63 68 61 72 2a 29 unction)((char*)
93a0: 66 75 6e 63 74 69 6f 6e 20 2d 20 54 52 41 4d 50 function - TRAMP
93b0: 5f 42 49 41 53 29 3b 0a 23 65 6e 64 69 66 0a 23 _BIAS);.#endif.#
93c0: 69 66 20 21 64 65 66 69 6e 65 64 28 43 4f 44 45 if !defined(CODE
93d0: 5f 45 58 45 43 55 54 41 42 4c 45 29 20 26 26 20 _EXECUTABLE) &&
93e0: 21 64 65 66 69 6e 65 64 28 45 58 45 43 55 54 41 !defined(EXECUTA
93f0: 42 4c 45 5f 56 49 41 5f 4d 50 52 4f 54 45 43 54 BLE_VIA_MPROTECT
9400: 29 0a 20 20 2a 28 63 68 61 72 2a 2a 29 66 75 6e ). *(char**)fun
9410: 63 74 69 6f 6e 20 3d 20 66 72 65 65 6c 69 73 74 ction = freelist
9420: 3b 20 66 72 65 65 6c 69 73 74 20 3d 20 28 63 68 ; freelist = (ch
9430: 61 72 2a 29 66 75 6e 63 74 69 6f 6e 3b 0a 20 20 ar*)function;.
9440: 2f 2a 20 49 74 20 69 73 20 70 72 6f 62 61 62 6c /* It is probabl
9450: 79 20 6e 6f 74 20 77 6f 72 74 68 20 63 61 6c 6c y not worth call
9460: 69 6e 67 20 6d 75 6e 6d 61 70 28 29 20 66 6f 72 ing munmap() for
9470: 20 65 6e 74 69 72 65 6c 79 20 66 72 65 65 64 20 entirely freed
9480: 70 61 67 65 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a pages. */.#else.
9490: 20 20 66 72 65 65 28 28 28 63 68 61 72 2a 2a 29 free(((char**)
94a0: 66 75 6e 63 74 69 6f 6e 29 5b 2d 31 5d 29 3b 0a function)[-1]);.
94b0: 23 65 6e 64 69 66 0a 7d 0a 0a 69 6e 74 20 69 73 #endif.}..int is
94c0: 5f 74 72 61 6d 70 6f 6c 69 6e 65 5f 72 20 28 76 _trampoline_r (v
94d0: 6f 69 64 2a 20 66 75 6e 63 74 69 6f 6e 29 0a 7b oid* function).{
94e0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 69 73 5f .#if defined(is_
94f0: 74 72 61 6d 70 29 20 26 26 20 64 65 66 69 6e 65 tramp) && define
9500: 64 28 74 72 61 6d 70 5f 64 61 74 61 29 0a 23 69 d(tramp_data).#i
9510: 66 64 65 66 20 5f 5f 68 70 70 61 6e 65 77 5f 5f fdef __hppanew__
9520: 0a 20 20 76 6f 69 64 2a 20 74 72 61 6d 70 5f 72 . void* tramp_r
9530: 5f 61 64 64 72 65 73 73 20 3d 20 26 74 72 61 6d _address = &tram
9540: 70 5f 72 3b 0a 20 20 69 66 20 28 21 28 28 28 6c p_r;. if (!(((l
9550: 6f 6e 67 29 66 75 6e 63 74 69 6f 6e 20 26 20 33 ong)function & 3
9560: 29 20 3d 3d 20 28 54 52 41 4d 50 5f 42 49 41 53 ) == (TRAMP_BIAS
9570: 20 26 20 33 29 29 29 20 72 65 74 75 72 6e 20 30 & 3))) return 0
9580: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 ;.#endif. retur
9590: 6e 0a 20 20 20 28 28 69 73 5f 74 72 61 6d 70 28 n. ((is_tramp(
95a0: 28 28 63 68 61 72 2a 29 66 75 6e 63 74 69 6f 6e ((char*)function
95b0: 20 2d 20 54 52 41 4d 50 5f 42 49 41 53 29 29 29 - TRAMP_BIAS)))
95c0: 0a 20 20 20 20 26 26 20 28 28 74 72 61 6d 70 5f . && ((tramp_
95d0: 64 61 74 61 28 28 28 63 68 61 72 2a 29 66 75 6e data(((char*)fun
95e0: 63 74 69 6f 6e 20 2d 20 54 52 41 4d 50 5f 42 49 ction - TRAMP_BI
95f0: 41 53 29 29 29 20 3d 3d 20 28 6c 6f 6e 67 29 28 AS))) == (long)(
9600: 28 63 68 61 72 2a 29 66 75 6e 63 74 69 6f 6e 20 (char*)function
9610: 2d 20 54 52 41 4d 50 5f 42 49 41 53 20 2b 20 54 - TRAMP_BIAS + T
9620: 52 41 4d 50 5f 4c 45 4e 47 54 48 29 29 0a 20 20 RAMP_LENGTH)).
9630: 20 20 3f 20 31 20 3a 20 30 0a 20 20 20 29 3b 0a ? 1 : 0. );.
9640: 23 65 6c 73 65 0a 20 20 61 62 6f 72 74 28 29 3b #else. abort();
9650: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 5f 5f 54 52 5f .#endif.}..__TR_
9660: 66 75 6e 63 74 69 6f 6e 20 74 72 61 6d 70 6f 6c function trampol
9670: 69 6e 65 5f 72 5f 61 64 64 72 65 73 73 20 28 76 ine_r_address (v
9680: 6f 69 64 2a 20 66 75 6e 63 74 69 6f 6e 29 0a 7b oid* function).{
9690: 0a 23 69 66 64 65 66 20 74 72 61 6d 70 5f 61 64 .#ifdef tramp_ad
96a0: 64 72 65 73 73 0a 20 20 72 65 74 75 72 6e 20 28 dress. return (
96b0: 5f 5f 54 52 5f 66 75 6e 63 74 69 6f 6e 29 28 74 __TR_function)(t
96c0: 72 61 6d 70 5f 61 64 64 72 65 73 73 28 28 28 63 ramp_address(((c
96d0: 68 61 72 2a 29 66 75 6e 63 74 69 6f 6e 20 2d 20 har*)function -
96e0: 54 52 41 4d 50 5f 42 49 41 53 29 29 29 3b 0a 23 TRAMP_BIAS)));.#
96f0: 65 6c 73 65 0a 20 20 61 62 6f 72 74 28 29 3b 0a else. abort();.
9700: 23 65 6e 64 69 66 0a 7d 0a 0a 76 6f 69 64 2a 20 #endif.}..void*
9710: 74 72 61 6d 70 6f 6c 69 6e 65 5f 72 5f 64 61 74 trampoline_r_dat
9720: 61 30 20 28 76 6f 69 64 2a 20 66 75 6e 63 74 69 a0 (void* functi
9730: 6f 6e 29 0a 7b 0a 23 69 66 64 65 66 20 74 72 61 on).{.#ifdef tra
9740: 6d 70 5f 64 61 74 61 0a 20 20 72 65 74 75 72 6e mp_data. return
9750: 20 28 28 76 6f 69 64 2a 2a 29 28 28 63 68 61 72 ((void**)((char
9760: 2a 29 66 75 6e 63 74 69 6f 6e 2d 54 52 41 4d 50 *)function-TRAMP
9770: 5f 42 49 41 53 2b 54 52 41 4d 50 5f 4c 45 4e 47 _BIAS+TRAMP_LENG
9780: 54 48 29 29 5b 30 5d 3b 0a 23 65 6c 73 65 0a 20 TH))[0];.#else.
9790: 20 61 62 6f 72 74 28 29 3b 0a 23 65 6e 64 69 66 abort();.#endif
97a0: 0a 7d 0a 0a 76 6f 69 64 2a 20 74 72 61 6d 70 6f .}..void* trampo
97b0: 6c 69 6e 65 5f 72 5f 64 61 74 61 31 20 28 76 6f line_r_data1 (vo
97c0: 69 64 2a 20 66 75 6e 63 74 69 6f 6e 29 0a 7b 0a id* function).{.
97d0: 23 69 66 64 65 66 20 74 72 61 6d 70 5f 64 61 74 #ifdef tramp_dat
97e0: 61 0a 20 20 72 65 74 75 72 6e 20 28 28 76 6f 69 a. return ((voi
97f0: 64 2a 2a 29 28 28 63 68 61 72 2a 29 66 75 6e 63 d**)((char*)func
9800: 74 69 6f 6e 2d 54 52 41 4d 50 5f 42 49 41 53 2b tion-TRAMP_BIAS+
9810: 54 52 41 4d 50 5f 4c 45 4e 47 54 48 29 29 5b 31 TRAMP_LENGTH))[1
9820: 5d 3b 0a 23 65 6c 73 65 0a 20 20 61 62 6f 72 74 ];.#else. abort
9830: 28 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a ();.#endif.}.