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 23 69 66 6e 64 65 66 20 43 4f ndif..#ifndef CO
07c0: 44 45 5f 45 58 45 43 55 54 41 42 4c 45 0a 2f 2a DE_EXECUTABLE./*
07d0: 20 48 6f 77 20 64 6f 20 77 65 20 6d 61 6b 65 20 How do we make
07e0: 74 68 65 20 74 72 61 6d 70 6f 6c 69 6e 65 27 73 the trampoline's
07f0: 20 63 6f 64 65 20 65 78 65 63 75 74 61 62 6c 65 code executable
0800: 3f 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 ? */.#if defined
0810: 28 48 41 56 45 5f 4d 41 43 48 5f 56 4d 29 20 7c (HAVE_MACH_VM) |
0820: 7c 20 64 65 66 69 6e 65 64 28 5f 5f 63 6f 6e 76 | defined(__conv
0830: 65 78 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 ex__) || defined
0840: 28 48 41 56 45 5f 57 4f 52 4b 49 4e 47 5f 4d 50 (HAVE_WORKING_MP
0850: 52 4f 54 45 43 54 29 20 7c 7c 20 64 65 66 69 6e ROTECT) || defin
0860: 65 64 28 48 41 56 45 5f 53 59 53 5f 4d 38 38 4b ed(HAVE_SYS_M88K
0870: 42 43 53 5f 48 29 0a 2f 2a 20 6d 70 72 6f 74 65 BCS_H)./* mprote
0880: 63 74 28 29 20 5b 6f 72 20 65 71 75 69 76 61 6c ct() [or equival
0890: 65 6e 74 5d 20 74 68 65 20 6d 61 6c 6c 6f 63 27 ent] the malloc'
08a0: 65 64 20 61 72 65 61 2e 20 2a 2f 0a 23 64 65 66 ed area. */.#def
08b0: 69 6e 65 20 45 58 45 43 55 54 41 42 4c 45 5f 56 ine EXECUTABLE_V
08c0: 49 41 5f 4d 50 52 4f 54 45 43 54 0a 23 65 6c 73 IA_MPROTECT.#els
08d0: 65 0a 23 69 66 64 65 66 20 48 41 56 45 5f 4d 4d e.#ifdef HAVE_MM
08e0: 41 50 0a 2f 2a 20 55 73 65 20 61 6e 20 6d 6d 61 AP./* Use an mma
08f0: 70 27 65 64 20 70 61 67 65 2e 20 2a 2f 0a 23 64 p'ed page. */.#d
0900: 65 66 69 6e 65 20 45 58 45 43 55 54 41 42 4c 45 efine EXECUTABLE
0910: 5f 56 49 41 5f 4d 4d 41 50 0a 23 69 66 64 65 66 _VIA_MMAP.#ifdef
0920: 20 48 41 56 45 5f 4d 4d 41 50 5f 41 4e 4f 4e 59 HAVE_MMAP_ANONY
0930: 4d 4f 55 53 0a 2f 2a 20 55 73 65 20 6d 6d 61 70 MOUS./* Use mmap
0940: 20 77 69 74 68 20 74 68 65 20 4d 41 50 5f 41 4e with the MAP_AN
0950: 4f 4e 59 4d 4f 55 53 20 6f 72 20 4d 41 50 5f 41 ONYMOUS or MAP_A
0960: 4e 4f 4e 20 66 6c 61 67 2e 20 2a 2f 0a 23 64 65 NON flag. */.#de
0970: 66 69 6e 65 20 45 58 45 43 55 54 41 42 4c 45 5f fine EXECUTABLE_
0980: 56 49 41 5f 4d 4d 41 50 5f 41 4e 4f 4e 59 4d 4f VIA_MMAP_ANONYMO
0990: 55 53 0a 23 65 6c 73 65 0a 2f 2a 20 55 73 65 20 US.#else./* Use
09a0: 6d 6d 61 70 20 6f 6e 20 2f 64 65 76 2f 7a 65 72 mmap on /dev/zer
09b0: 6f 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 45 58 o. */.#define EX
09c0: 45 43 55 54 41 42 4c 45 5f 56 49 41 5f 4d 4d 41 ECUTABLE_VIA_MMA
09d0: 50 5f 44 45 56 5a 45 52 4f 0a 23 65 6e 64 69 66 P_DEVZERO.#endif
09e0: 0a 23 65 6c 73 65 0a 23 69 66 64 65 66 20 48 41 .#else.#ifdef HA
09f0: 56 45 5f 53 48 4d 0a 2f 2a 20 55 73 65 20 61 6e VE_SHM./* Use an
0a00: 20 73 68 6d 61 74 27 65 64 20 70 61 67 65 2e 20 shmat'ed page.
0a10: 2a 2f 0a 23 64 65 66 69 6e 65 20 45 58 45 43 55 */.#define EXECU
0a20: 54 41 42 4c 45 5f 56 49 41 5f 53 48 4d 0a 23 65 TABLE_VIA_SHM.#e
0a30: 6c 73 65 0a 3f 3f 0a 23 65 6e 64 69 66 0a 23 65 lse.??.#endif.#e
0a40: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 65 6e 64 ndif.#endif.#end
0a50: 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 if..#include <st
0a60: 64 69 6f 2e 68 3e 20 2f 2a 20 64 65 63 6c 61 72 dio.h> /* declar
0a70: 65 73 20 66 70 72 69 6e 74 66 28 29 20 2a 2f 0a es fprintf() */.
0a80: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 .#include <sys/t
0a90: 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 ypes.h>.#include
0aa0: 20 3c 73 74 64 6c 69 62 2e 68 3e 20 2f 2a 20 64 <stdlib.h> /* d
0ab0: 65 63 6c 61 72 65 73 20 61 62 6f 72 74 28 29 2c eclares abort(),
0ac0: 20 6d 61 6c 6c 6f 63 28 29 2c 20 66 72 65 65 28 malloc(), free(
0ad0: 29 20 2a 2f 0a 23 69 66 64 65 66 20 48 41 56 45 ) */.#ifdef HAVE
0ae0: 5f 55 4e 49 53 54 44 5f 48 0a 23 69 6e 63 6c 75 _UNISTD_H.#inclu
0af0: 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 65 de <unistd.h>.#e
0b00: 6e 64 69 66 0a 0a 2f 2a 20 44 65 63 6c 61 72 65 ndif../* Declare
0b10: 20 67 65 74 70 61 67 65 73 69 7a 65 28 29 2e 20 getpagesize().
0b20: 2a 2f 0a 23 69 66 64 65 66 20 48 41 56 45 5f 47 */.#ifdef HAVE_G
0b30: 45 54 50 41 47 45 53 49 5a 45 0a 23 69 66 64 65 ETPAGESIZE.#ifde
0b40: 66 20 5f 5f 63 70 6c 75 73 70 6c 75 73 0a 65 78 f __cplusplus.ex
0b50: 74 65 72 6e 20 22 43 22 20 52 45 54 47 45 54 50 tern "C" RETGETP
0b60: 41 47 45 53 49 5a 45 54 59 50 45 20 67 65 74 70 AGESIZETYPE getp
0b70: 61 67 65 73 69 7a 65 20 28 76 6f 69 64 29 3b 0a agesize (void);.
0b80: 23 65 6c 73 65 0a 65 78 74 65 72 6e 20 52 45 54 #else.extern RET
0b90: 47 45 54 50 41 47 45 53 49 5a 45 54 59 50 45 20 GETPAGESIZETYPE
0ba0: 67 65 74 70 61 67 65 73 69 7a 65 20 28 76 6f 69 getpagesize (voi
0bb0: 64 29 3b 0a 23 65 6e 64 69 66 0a 23 65 6c 73 65 d);.#endif.#else
0bc0: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 59 53 .#ifdef HAVE_SYS
0bd0: 5f 50 41 52 41 4d 5f 48 0a 23 69 6e 63 6c 75 64 _PARAM_H.#includ
0be0: 65 20 3c 73 79 73 2f 70 61 72 61 6d 2e 68 3e 0a e <sys/param.h>.
0bf0: 23 65 6c 73 65 0a 2f 2a 20 4e 6f 74 20 55 6e 69 #else./* Not Uni
0c00: 78 2c 20 65 2e 67 2e 20 6d 69 6e 67 77 33 32 20 x, e.g. mingw32
0c10: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 53 */.#define PAGES
0c20: 49 5a 45 20 34 30 39 36 0a 23 65 6e 64 69 66 0a IZE 4096.#endif.
0c30: 23 64 65 66 69 6e 65 20 67 65 74 70 61 67 65 73 #define getpages
0c40: 69 7a 65 28 29 20 50 41 47 45 53 49 5a 45 0a 23 ize() PAGESIZE.#
0c50: 65 6e 64 69 66 0a 0a 2f 2a 20 44 65 63 6c 61 72 endif../* Declar
0c60: 65 20 6d 70 72 6f 74 65 63 74 28 29 20 6f 72 20 e mprotect() or
0c70: 65 71 75 69 76 61 6c 65 6e 74 2e 20 2a 2f 0a 23 equivalent. */.#
0c80: 69 66 64 65 66 20 45 58 45 43 55 54 41 42 4c 45 ifdef EXECUTABLE
0c90: 5f 56 49 41 5f 4d 50 52 4f 54 45 43 54 0a 23 69 _VIA_MPROTECT.#i
0ca0: 66 64 65 66 20 48 41 56 45 5f 4d 41 43 48 5f 56 fdef HAVE_MACH_V
0cb0: 4d 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f M.#include <sys/
0cc0: 72 65 73 6f 75 72 63 65 2e 68 3e 0a 23 69 6e 63 resource.h>.#inc
0cd0: 6c 75 64 65 20 3c 6d 61 63 68 2f 6d 61 63 68 5f lude <mach/mach_
0ce0: 69 6e 74 65 72 66 61 63 65 2e 68 3e 0a 23 69 66 interface.h>.#if
0cf0: 64 65 66 20 4e 65 58 54 0a 23 69 6e 63 6c 75 64 def NeXT.#includ
0d00: 65 20 3c 6d 61 63 68 2f 6d 61 63 68 5f 69 6e 69 e <mach/mach_ini
0d10: 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 t.h>.#endif.#ifd
0d20: 65 66 20 5f 5f 6f 73 66 5f 5f 0a 23 69 6e 63 6c ef __osf__.#incl
0d30: 75 64 65 20 3c 6d 61 63 68 5f 69 6e 69 74 2e 68 ude <mach_init.h
0d40: 3e 0a 23 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 >.#endif.#includ
0d50: 65 20 3c 6d 61 63 68 2f 6d 61 63 68 69 6e 65 2f e <mach/machine/
0d60: 76 6d 5f 70 61 72 61 6d 2e 68 3e 0a 23 65 6c 73 vm_param.h>.#els
0d70: 65 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 59 e.#ifdef HAVE_SY
0d80: 53 5f 4d 38 38 4b 42 43 53 5f 48 0a 23 69 6e 63 S_M88KBCS_H.#inc
0d90: 6c 75 64 65 20 3c 73 79 73 2f 6d 38 38 6b 62 63 lude <sys/m88kbc
0da0: 73 2e 68 3e 0a 23 64 65 66 69 6e 65 20 67 65 74 s.h>.#define get
0db0: 70 61 67 65 73 69 7a 65 28 29 20 20 34 30 39 36 pagesize() 4096
0dc0: 20 20 2f 2a 20 3f 3f 20 2a 2f 0a 23 65 6c 73 65 /* ?? */.#else
0dd0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 .#include <sys/t
0de0: 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 ypes.h>.#include
0df0: 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68 3e 0a 23 65 <sys/mman.h>.#e
0e00: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 65 6e 64 ndif.#endif.#end
0e10: 69 66 0a 0a 2f 2a 20 44 65 63 6c 61 72 65 20 6d if../* Declare m
0e20: 6d 61 70 28 29 2e 20 2a 2f 0a 23 69 66 64 65 66 map(). */.#ifdef
0e30: 20 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41 5f EXECUTABLE_VIA_
0e40: 4d 4d 41 50 0a 23 69 6e 63 6c 75 64 65 20 3c 73 MMAP.#include <s
0e50: 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 ys/types.h>.#inc
0e60: 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68 lude <sys/mman.h
0e70: 3e 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 50 >.#if !defined(P
0e80: 52 4f 54 5f 45 58 45 43 29 20 26 26 20 64 65 66 ROT_EXEC) && def
0e90: 69 6e 65 64 28 50 52 4f 54 5f 45 58 45 43 55 54 ined(PROT_EXECUT
0ea0: 45 29 20 2f 2a 20 49 72 69 78 20 34 2e 30 2e 35 E) /* Irix 4.0.5
0eb0: 20 6e 65 65 64 73 20 74 68 69 73 20 2a 2f 0a 23 needs this */.#
0ec0: 64 65 66 69 6e 65 20 50 52 4f 54 5f 45 58 45 43 define PROT_EXEC
0ed0: 20 50 52 4f 54 5f 45 58 45 43 55 54 45 0a 23 65 PROT_EXECUTE.#e
0ee0: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 ndif.#endif../*
0ef0: 44 65 63 6c 61 72 65 20 6f 70 65 6e 28 29 2e 20 Declare open().
0f00: 2a 2f 0a 23 69 66 64 65 66 20 45 58 45 43 55 54 */.#ifdef EXECUT
0f10: 41 42 4c 45 5f 56 49 41 5f 4d 4d 41 50 5f 44 45 ABLE_VIA_MMAP_DE
0f20: 56 5a 45 52 4f 0a 23 69 6e 63 6c 75 64 65 20 3c VZERO.#include <
0f30: 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e sys/types.h>.#in
0f40: 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e clude <unistd.h>
0f50: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c .#include <fcntl
0f60: 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 44 .h>.#endif../* D
0f70: 65 63 6c 61 72 65 20 73 68 6d 67 65 74 28 29 2c eclare shmget(),
0f80: 20 73 68 6d 61 74 28 29 2c 20 73 68 6d 63 74 6c shmat(), shmctl
0f90: 28 29 2e 20 2a 2f 0a 23 69 66 64 65 66 20 45 58 (). */.#ifdef EX
0fa0: 45 43 55 54 41 42 4c 45 5f 56 49 41 5f 53 48 4d ECUTABLE_VIA_SHM
0fb0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 .#include <sys/t
0fc0: 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 ypes.h>.#include
0fd0: 20 3c 73 79 73 2f 69 70 63 2e 68 3e 0a 23 69 6e <sys/ipc.h>.#in
0fe0: 63 6c 75 64 65 20 3c 73 79 73 2f 73 68 6d 2e 68 clude <sys/shm.h
0ff0: 3e 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 59 >.#ifdef HAVE_SY
1000: 53 5f 53 59 53 4d 41 43 52 4f 53 5f 48 0a 23 69 S_SYSMACROS_H.#i
1010: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 79 73 6d nclude <sys/sysm
1020: 61 63 72 6f 73 2e 68 3e 0a 23 65 6e 64 69 66 0a acros.h>.#endif.
1030: 23 65 6e 64 69 66 0a 0a 2f 2a 20 53 75 70 70 6f #endif../* Suppo
1040: 72 74 20 66 6f 72 20 69 6e 73 74 72 75 63 74 69 rt for instructi
1050: 6f 6e 20 63 61 63 68 65 20 66 6c 75 73 68 2e 20 on cache flush.
1060: 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 69 33 38 36 */.#ifdef __i386
1070: 5f 5f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f __.#if defined(_
1080: 57 49 4e 33 32 29 20 2f 2a 20 57 69 6e 64 6f 77 WIN32) /* Window
1090: 73 4e 54 20 6f 72 20 57 69 6e 64 6f 77 73 39 35 sNT or Windows95
10a0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 33 */.#define WIN3
10b0: 32 5f 4c 45 41 4e 5f 41 4e 44 5f 4d 45 41 4e 0a 2_LEAN_AND_MEAN.
10c0: 23 64 65 66 69 6e 65 20 57 49 4e 33 32 5f 45 58 #define WIN32_EX
10d0: 54 52 41 5f 4c 45 41 4e 0a 23 69 6e 63 6c 75 64 TRA_LEAN.#includ
10e0: 65 20 3c 77 69 6e 64 6f 77 73 2e 68 3e 0a 23 65 e <windows.h>.#e
10f0: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 64 ndif.#endif.#ifd
1100: 65 66 20 5f 5f 6d 36 38 6b 5f 5f 0a 23 69 66 20 ef __m68k__.#if
1110: 64 65 66 69 6e 65 64 28 41 4d 49 47 41 29 20 2f defined(AMIGA) /
1120: 2a 20 41 6d 69 67 61 20 72 75 6e 6e 69 6e 67 20 * Amiga running
1130: 41 6d 69 67 61 4f 53 2c 20 6e 6f 74 20 4c 69 6e AmigaOS, not Lin
1140: 75 78 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c ux */.#include <
1150: 65 78 65 63 2f 74 79 70 65 73 2e 68 3e 0a 23 69 exec/types.h>.#i
1160: 6e 63 6c 75 64 65 20 3c 65 78 65 63 2f 65 78 65 nclude <exec/exe
1170: 63 62 61 73 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 cbase.h>.#includ
1180: 65 20 3c 70 72 6f 74 6f 2f 65 78 65 63 2e 68 3e e <proto/exec.h>
1190: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 68 .#endif.#ifdef h
11a0: 70 75 78 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 pux.#include <sy
11b0: 73 2f 63 61 63 68 65 2e 68 3e 0a 23 65 6e 64 69 s/cache.h>.#endi
11c0: 66 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 f.#endif.#if def
11d0: 69 6e 65 64 28 5f 5f 6d 69 70 73 5f 5f 29 20 7c ined(__mips__) |
11e0: 7c 20 64 65 66 69 6e 65 64 28 5f 5f 6d 69 70 73 | defined(__mips
11f0: 6e 33 32 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 n32__) || define
1200: 64 28 5f 5f 6d 69 70 73 36 34 5f 5f 29 0a 23 69 d(__mips64__).#i
1210: 66 64 65 66 20 75 6c 74 72 69 78 0a 23 69 6e 63 fdef ultrix.#inc
1220: 6c 75 64 65 20 3c 6d 69 70 73 2f 63 61 63 68 65 lude <mips/cache
1230: 63 74 6c 2e 68 3e 0a 23 65 6c 73 65 0a 23 69 66 ctl.h>.#else.#if
1240: 64 65 66 20 6c 69 6e 75 78 0a 23 69 6e 63 6c 75 def linux.#inclu
1250: 64 65 20 3c 61 73 6d 2f 63 61 63 68 65 63 74 6c de <asm/cachectl
1260: 2e 68 3e 0a 23 65 6c 73 65 0a 23 69 66 64 65 66 .h>.#else.#ifdef
1270: 20 48 41 56 45 5f 53 59 53 5f 43 41 43 48 45 43 HAVE_SYS_CACHEC
1280: 54 4c 5f 48 0a 23 69 6e 63 6c 75 64 65 20 3c 73 TL_H.#include <s
1290: 79 73 2f 63 61 63 68 65 63 74 6c 2e 68 3e 0a 23 ys/cachectl.h>.#
12a0: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 65 6e endif.#endif.#en
12b0: 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 dif.#endif.#ifde
12c0: 66 20 5f 5f 6d 38 38 6b 5f 5f 0a 23 69 6e 63 6c f __m88k__.#incl
12d0: 75 64 65 20 3c 73 79 73 2f 73 79 73 6c 6f 63 61 ude <sys/sysloca
12e0: 6c 2e 68 3e 0a 23 65 6e 64 69 66 0a 2f 2a 20 49 l.h>.#endif./* I
12f0: 6e 6c 69 6e 65 20 61 73 73 65 6d 62 6c 79 20 66 nline assembly f
1300: 75 6e 63 74 69 6f 6e 20 66 6f 72 20 69 6e 73 74 unction for inst
1310: 72 75 63 74 69 6f 6e 20 63 61 63 68 65 20 66 6c ruction cache fl
1320: 75 73 68 2e 20 2a 2f 0a 23 69 66 20 64 65 66 69 ush. */.#if defi
1330: 6e 65 64 28 5f 5f 73 70 61 72 63 5f 5f 29 20 7c ned(__sparc__) |
1340: 7c 20 64 65 66 69 6e 65 64 28 5f 5f 73 70 61 72 | defined(__spar
1350: 63 36 34 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 c64__) || define
1360: 64 28 5f 5f 61 6c 70 68 61 5f 5f 29 20 7c 7c 20 d(__alpha__) ||
1370: 64 65 66 69 6e 65 64 28 5f 5f 68 70 70 61 6f 6c defined(__hppaol
1380: 64 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 d__) || defined(
1390: 5f 5f 70 6f 77 65 72 70 63 73 79 73 76 34 5f 5f __powerpcsysv4__
13a0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 63 ) || defined(__c
13b0: 6f 6e 76 65 78 5f 5f 29 0a 23 69 66 64 65 66 20 onvex__).#ifdef
13c0: 5f 5f 47 4e 55 43 5f 5f 0a 65 78 74 65 72 6e 20 __GNUC__.extern
13d0: 69 6e 6c 69 6e 65 0a 23 69 66 20 64 65 66 69 6e inline.#if defin
13e0: 65 64 28 5f 5f 73 70 61 72 63 5f 5f 29 20 7c 7c ed(__sparc__) ||
13f0: 20 64 65 66 69 6e 65 64 28 5f 5f 73 70 61 72 63 defined(__sparc
1400: 36 34 5f 5f 29 0a 23 69 6e 63 6c 75 64 65 20 22 64__).#include "
1410: 63 61 63 68 65 2d 73 70 61 72 63 2e 63 22 0a 23 cache-sparc.c".#
1420: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 61 endif.#ifdef __a
1430: 6c 70 68 61 5f 5f 0a 23 69 6e 63 6c 75 64 65 20 lpha__.#include
1440: 22 63 61 63 68 65 2d 61 6c 70 68 61 2e 63 22 0a "cache-alpha.c".
1450: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f #endif.#ifdef __
1460: 68 70 70 61 5f 5f 0a 23 69 6e 63 6c 75 64 65 20 hppa__.#include
1470: 22 63 61 63 68 65 2d 68 70 70 61 2e 63 22 0a 23 "cache-hppa.c".#
1480: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 endif.#if define
1490: 64 28 5f 5f 70 6f 77 65 72 70 63 5f 5f 29 20 26 d(__powerpc__) &
14a0: 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 70 6f 77 & !defined(__pow
14b0: 65 72 70 63 36 34 5f 5f 29 0a 23 69 6e 63 6c 75 erpc64__).#inclu
14c0: 64 65 20 22 63 61 63 68 65 2d 70 6f 77 65 72 70 de "cache-powerp
14d0: 63 2e 63 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 c.c".#endif.#ifd
14e0: 65 66 20 5f 5f 63 6f 6e 76 65 78 5f 5f 0a 23 69 ef __convex__.#i
14f0: 6e 63 6c 75 64 65 20 22 63 61 63 68 65 2d 63 6f nclude "cache-co
1500: 6e 76 65 78 2e 63 22 0a 23 65 6e 64 69 66 0a 23 nvex.c".#endif.#
1510: 65 6c 73 65 0a 23 69 66 20 64 65 66 69 6e 65 64 else.#if defined
1520: 28 5f 5f 73 70 61 72 63 5f 5f 29 20 7c 7c 20 64 (__sparc__) || d
1530: 65 66 69 6e 65 64 28 5f 5f 73 70 61 72 63 36 34 efined(__sparc64
1540: 5f 5f 29 0a 65 78 74 65 72 6e 20 76 6f 69 64 20 __).extern void
1550: 5f 5f 54 52 5f 63 6c 65 61 72 5f 63 61 63 68 65 __TR_clear_cache
1560: 5f 34 28 29 3b 0a 23 65 6c 73 65 0a 65 78 74 65 _4();.#else.exte
1570: 72 6e 20 76 6f 69 64 20 5f 5f 54 52 5f 63 6c 65 rn void __TR_cle
1580: 61 72 5f 63 61 63 68 65 28 29 3b 0a 23 65 6e 64 ar_cache();.#end
1590: 69 66 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 if.#endif.#endif
15a0: 0a 0a 2f 2a 20 4c 65 6e 67 74 68 20 61 6e 64 20 ../* Length and
15b0: 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 74 72 61 alignment of tra
15c0: 6d 70 6f 6c 69 6e 65 20 2a 2f 0a 23 69 66 64 65 mpoline */.#ifde
15d0: 66 20 5f 5f 69 33 38 36 5f 5f 0a 23 64 65 66 69 f __i386__.#defi
15e0: 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 ne TRAMP_LENGTH
15f0: 31 36 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 16.#define TRAMP
1600: 5f 41 4c 49 47 4e 20 31 36 20 20 2f 2a 20 34 20 _ALIGN 16 /* 4
1610: 66 6f 72 20 61 20 69 33 38 36 2c 20 31 36 20 66 for a i386, 16 f
1620: 6f 72 20 61 20 69 34 38 36 20 2a 2f 0a 23 65 6e or a i486 */.#en
1630: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d 36 38 dif.#ifdef __m68
1640: 6b 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52 41 4d k__.#define TRAM
1650: 50 5f 4c 45 4e 47 54 48 20 31 34 0a 23 64 65 66 P_LENGTH 14.#def
1660: 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20 ine TRAMP_ALIGN
1670: 31 36 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 16.#endif.#if de
1680: 66 69 6e 65 64 28 5f 5f 6d 69 70 73 5f 5f 29 20 fined(__mips__)
1690: 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 6d 69 70 || defined(__mip
16a0: 73 6e 33 32 5f 5f 29 20 26 26 20 21 64 65 66 69 sn32__) && !defi
16b0: 6e 65 64 28 5f 5f 6d 69 70 73 36 34 5f 5f 29 0a ned(__mips64__).
16c0: 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 #define TRAMP_LE
16d0: 4e 47 54 48 20 32 34 0a 23 64 65 66 69 6e 65 20 NGTH 24.#define
16e0: 54 52 41 4d 50 5f 41 4c 49 47 4e 20 34 0a 23 65 TRAMP_ALIGN 4.#e
16f0: 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d 69 ndif.#ifdef __mi
1700: 70 73 36 34 6f 6c 64 5f 5f 0a 23 64 65 66 69 6e ps64old__.#defin
1710: 65 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 35 e TRAMP_LENGTH 5
1720: 36 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 6.#define TRAMP_
1730: 41 4c 49 47 4e 20 34 0a 23 65 6e 64 69 66 0a 23 ALIGN 4.#endif.#
1740: 69 66 64 65 66 20 5f 5f 6d 69 70 73 36 34 5f 5f ifdef __mips64__
1750: 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c .#define TRAMP_L
1760: 45 4e 47 54 48 20 33 32 0a 23 64 65 66 69 6e 65 ENGTH 32.#define
1770: 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20 38 0a 23 TRAMP_ALIGN 8.#
1780: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 endif.#if define
1790: 64 28 5f 5f 73 70 61 72 63 5f 5f 29 20 26 26 20 d(__sparc__) &&
17a0: 21 64 65 66 69 6e 65 64 28 5f 5f 73 70 61 72 63 !defined(__sparc
17b0: 36 34 5f 5f 29 0a 23 64 65 66 69 6e 65 20 54 52 64__).#define TR
17c0: 41 4d 50 5f 4c 45 4e 47 54 48 20 31 36 0a 23 64 AMP_LENGTH 16.#d
17d0: 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 efine TRAMP_ALIG
17e0: 4e 20 31 36 0a 23 65 6e 64 69 66 0a 23 69 66 64 N 16.#endif.#ifd
17f0: 65 66 20 5f 5f 73 70 61 72 63 36 34 5f 5f 0a 23 ef __sparc64__.#
1800: 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e define TRAMP_LEN
1810: 47 54 48 20 33 32 0a 23 64 65 66 69 6e 65 20 54 GTH 32.#define T
1820: 52 41 4d 50 5f 41 4c 49 47 4e 20 31 36 0a 23 65 RAMP_ALIGN 16.#e
1830: 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 61 6c ndif.#ifdef __al
1840: 70 68 61 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52 pha__.#define TR
1850: 41 4d 50 5f 4c 45 4e 47 54 48 20 33 32 0a 23 64 AMP_LENGTH 32.#d
1860: 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 efine TRAMP_ALIG
1870: 4e 20 38 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 N 8.#endif.#ifde
1880: 66 20 5f 5f 68 70 70 61 6f 6c 64 5f 5f 0a 23 64 f __hppaold__.#d
1890: 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47 efine TRAMP_LENG
18a0: 54 48 20 34 38 0a 23 64 65 66 69 6e 65 20 54 52 TH 48.#define TR
18b0: 41 4d 50 5f 41 4c 49 47 4e 20 31 36 0a 23 65 6e AMP_ALIGN 16.#en
18c0: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 68 70 70 dif.#ifdef __hpp
18d0: 61 6e 65 77 5f 5f 0a 23 64 65 66 69 6e 65 20 54 anew__.#define T
18e0: 52 41 4d 50 5f 4c 45 4e 47 54 48 20 31 36 0a 23 RAMP_LENGTH 16.#
18f0: 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 define TRAMP_ALI
1900: 47 4e 20 31 36 0a 23 64 65 66 69 6e 65 20 54 52 GN 16.#define TR
1910: 41 4d 50 5f 42 49 41 53 20 32 0a 23 65 6e 64 69 AMP_BIAS 2.#endi
1920: 66 0a 23 69 66 64 65 66 20 5f 5f 61 72 6d 5f 5f f.#ifdef __arm__
1930: 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c .#define TRAMP_L
1940: 45 4e 47 54 48 20 31 36 0a 23 64 65 66 69 6e 65 ENGTH 16.#define
1950: 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20 34 0a 23 TRAMP_ALIGN 4.#
1960: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 70 endif.#ifdef __p
1970: 6f 77 65 72 70 63 73 79 73 76 34 5f 5f 0a 23 64 owerpcsysv4__.#d
1980: 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47 efine TRAMP_LENG
1990: 54 48 20 32 34 0a 23 64 65 66 69 6e 65 20 54 52 TH 24.#define TR
19a0: 41 4d 50 5f 41 4c 49 47 4e 20 34 0a 23 65 6e 64 AMP_ALIGN 4.#end
19b0: 69 66 0a 23 69 66 64 65 66 20 5f 5f 70 6f 77 65 if.#ifdef __powe
19c0: 72 70 63 61 69 78 5f 5f 0a 23 64 65 66 69 6e 65 rpcaix__.#define
19d0: 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 32 30 TRAMP_LENGTH 20
19e0: 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 .#define TRAMP_A
19f0: 4c 49 47 4e 20 34 0a 23 65 6e 64 69 66 0a 23 69 LIGN 4.#endif.#i
1a00: 66 64 65 66 20 5f 5f 70 6f 77 65 72 70 63 36 34 fdef __powerpc64
1a10: 61 69 78 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52 aix__.#define TR
1a20: 41 4d 50 5f 4c 45 4e 47 54 48 20 34 30 0a 23 64 AMP_LENGTH 40.#d
1a30: 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 efine TRAMP_ALIG
1a40: 4e 20 38 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 N 8.#endif.#ifde
1a50: 66 20 5f 5f 6d 38 38 6b 5f 5f 0a 23 64 65 66 69 f __m88k__.#defi
1a60: 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 ne TRAMP_LENGTH
1a70: 32 30 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 20.#define TRAMP
1a80: 5f 41 4c 49 47 4e 20 38 0a 23 65 6e 64 69 66 0a _ALIGN 8.#endif.
1a90: 23 69 66 64 65 66 20 5f 5f 63 6f 6e 76 65 78 5f #ifdef __convex_
1aa0: 5f 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f _.#define TRAMP_
1ab0: 4c 45 4e 47 54 48 20 31 34 0a 23 64 65 66 69 6e LENGTH 14.#defin
1ac0: 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20 34 0a e TRAMP_ALIGN 4.
1ad0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f #endif.#ifdef __
1ae0: 69 61 36 34 5f 5f 0a 23 64 65 66 69 6e 65 20 54 ia64__.#define T
1af0: 52 41 4d 50 5f 4c 45 4e 47 54 48 20 33 32 0a 23 RAMP_LENGTH 32.#
1b00: 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 define TRAMP_ALI
1b10: 47 4e 20 31 36 0a 23 65 6e 64 69 66 0a 23 69 66 GN 16.#endif.#if
1b20: 64 65 66 20 5f 5f 78 38 36 5f 36 34 5f 5f 0a 23 def __x86_64__.#
1b30: 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e define TRAMP_LEN
1b40: 47 54 48 20 32 32 0a 23 64 65 66 69 6e 65 20 54 GTH 22.#define T
1b50: 52 41 4d 50 5f 41 4c 49 47 4e 20 31 36 0a 23 65 RAMP_ALIGN 16.#e
1b60: 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 73 33 ndif.#ifdef __s3
1b70: 39 30 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52 41 90__.#define TRA
1b80: 4d 50 5f 4c 45 4e 47 54 48 20 32 32 0a 23 64 65 MP_LENGTH 22.#de
1b90: 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e fine TRAMP_ALIGN
1ba0: 20 32 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 2.#endif..#ifnd
1bb0: 65 66 20 54 52 41 4d 50 5f 42 49 41 53 0a 23 64 ef TRAMP_BIAS.#d
1bc0: 65 66 69 6e 65 20 54 52 41 4d 50 5f 42 49 41 53 efine TRAMP_BIAS
1bd0: 20 30 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 0.#endif..#defi
1be0: 6e 65 20 54 52 41 4d 50 5f 54 4f 54 41 4c 5f 4c ne TRAMP_TOTAL_L
1bf0: 45 4e 47 54 48 20 28 54 52 41 4d 50 5f 4c 45 4e ENGTH (TRAMP_LEN
1c00: 47 54 48 20 2b 20 32 2a 73 69 7a 65 6f 66 28 76 GTH + 2*sizeof(v
1c10: 6f 69 64 2a 29 29 0a 0a 23 69 66 20 21 64 65 66 oid*))..#if !def
1c20: 69 6e 65 64 28 43 4f 44 45 5f 45 58 45 43 55 54 ined(CODE_EXECUT
1c30: 41 42 4c 45 29 20 26 26 20 21 64 65 66 69 6e 65 ABLE) && !define
1c40: 64 28 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41 d(EXECUTABLE_VIA
1c50: 5f 4d 50 52 4f 54 45 43 54 29 0a 2f 2a 20 41 49 _MPROTECT)./* AI
1c60: 58 20 64 6f 65 73 6e 27 74 20 73 75 70 70 6f 72 X doesn't suppor
1c70: 74 20 6d 70 72 6f 74 65 63 74 28 29 20 69 6e 20 t mprotect() in
1c80: 6d 61 6c 6c 6f 63 27 65 64 20 6d 65 6d 6f 72 79 malloc'ed memory
1c90: 2e 20 4d 75 73 74 20 67 65 74 20 70 61 67 65 73 . Must get pages
1ca0: 20 6f 66 0a 20 2a 20 6d 65 6d 6f 72 79 20 77 69 of. * memory wi
1cb0: 74 68 20 65 78 65 63 75 74 65 20 70 65 72 6d 69 th execute permi
1cc0: 73 73 69 6f 6e 20 76 69 61 20 6d 6d 61 70 28 29 ssion via mmap()
1cd0: 2e 20 54 68 65 6e 20 6b 65 65 70 20 61 20 66 72 . Then keep a fr
1ce0: 65 65 20 6c 69 73 74 20 6f 66 0a 20 2a 20 66 72 ee list of. * fr
1cf0: 65 65 20 74 72 61 6d 70 6f 6c 69 6e 65 73 2e 0a ee trampolines..
1d00: 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 2a */.static char*
1d10: 20 66 72 65 65 6c 69 73 74 20 3d 20 4e 55 4c 4c freelist = NULL
1d20: 3b 0a 23 65 6e 64 69 66 0a 0a 5f 5f 54 52 5f 66 ;.#endif..__TR_f
1d30: 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 5f 74 72 unction alloc_tr
1d40: 61 6d 70 6f 6c 69 6e 65 5f 72 20 28 5f 5f 54 52 ampoline_r (__TR
1d50: 5f 66 75 6e 63 74 69 6f 6e 20 61 64 64 72 65 73 _function addres
1d60: 73 2c 20 76 6f 69 64 2a 20 64 61 74 61 30 2c 20 s, void* data0,
1d70: 76 6f 69 64 2a 20 64 61 74 61 31 29 0a 7b 0a 20 void* data1).{.
1d80: 20 63 68 61 72 2a 20 66 75 6e 63 74 69 6f 6e 3b char* function;
1d90: 0a 20 20 63 68 61 72 2a 20 64 61 74 61 3b 0a 0a . char* data;..
1da0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 43 4f 44 #if !defined(COD
1db0: 45 5f 45 58 45 43 55 54 41 42 4c 45 29 0a 20 20 E_EXECUTABLE).
1dc0: 73 74 61 74 69 63 20 6c 6f 6e 67 20 70 61 67 65 static long page
1dd0: 73 69 7a 65 20 3d 20 30 3b 0a 23 69 66 20 64 65 size = 0;.#if de
1de0: 66 69 6e 65 64 28 45 58 45 43 55 54 41 42 4c 45 fined(EXECUTABLE
1df0: 5f 56 49 41 5f 4d 4d 41 50 5f 44 45 56 5a 45 52 _VIA_MMAP_DEVZER
1e00: 4f 29 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 O). static int
1e10: 7a 65 72 6f 5f 66 64 3b 0a 23 65 6e 64 69 66 0a zero_fd;.#endif.
1e20: 20 20 2f 2a 20 46 69 72 73 74 2c 20 67 65 74 20 /* First, get
1e30: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 6f 6e the page size on
1e40: 63 65 20 61 6e 64 20 66 6f 72 20 61 6c 6c 2e 20 ce and for all.
1e50: 2a 2f 0a 20 20 69 66 20 28 21 70 61 67 65 73 69 */. if (!pagesi
1e60: 7a 65 29 0a 20 20 20 20 7b 0a 23 69 66 20 64 65 ze). {.#if de
1e70: 66 69 6e 65 64 28 48 41 56 45 5f 4d 41 43 48 5f fined(HAVE_MACH_
1e80: 56 4d 29 0a 20 20 20 20 20 20 70 61 67 65 73 69 VM). pagesi
1e90: 7a 65 20 3d 20 76 6d 5f 70 61 67 65 5f 73 69 7a ze = vm_page_siz
1ea0: 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 70 e;.#else. p
1eb0: 61 67 65 73 69 7a 65 20 3d 20 67 65 74 70 61 67 agesize = getpag
1ec0: 65 73 69 7a 65 28 29 3b 0a 23 65 6e 64 69 66 0a esize();.#endif.
1ed0: 23 69 66 20 64 65 66 69 6e 65 64 28 45 58 45 43 #if defined(EXEC
1ee0: 55 54 41 42 4c 45 5f 56 49 41 5f 4d 4d 41 50 5f UTABLE_VIA_MMAP_
1ef0: 44 45 56 5a 45 52 4f 29 0a 20 20 20 20 20 20 7a DEVZERO). z
1f00: 65 72 6f 5f 66 64 20 3d 20 6f 70 65 6e 28 22 2f ero_fd = open("/
1f10: 64 65 76 2f 7a 65 72 6f 22 2c 4f 5f 52 44 4f 4e dev/zero",O_RDON
1f20: 4c 59 2c 30 36 34 34 29 3b 0a 20 20 20 20 20 20 LY,0644);.
1f30: 69 66 20 28 7a 65 72 6f 5f 66 64 20 3c 20 30 29 if (zero_fd < 0)
1f40: 0a 20 20 20 20 20 20 20 20 7b 20 66 70 72 69 6e . { fprin
1f50: 74 66 28 73 74 64 65 72 72 2c 22 74 72 61 6d 70 tf(stderr,"tramp
1f60: 6f 6c 69 6e 65 3a 20 43 61 6e 6e 6f 74 20 6f 70 oline: Cannot op
1f70: 65 6e 20 2f 64 65 76 2f 7a 65 72 6f 21 5c 6e 22 en /dev/zero!\n"
1f80: 29 3b 20 61 62 6f 72 74 28 29 3b 20 7d 0a 23 65 ); abort(); }.#e
1f90: 6e 64 69 66 0a 20 20 20 20 7d 0a 23 65 6e 64 69 ndif. }.#endi
1fa0: 66 0a 0a 20 20 2f 2a 20 31 2e 20 41 6c 6c 6f 63 f.. /* 1. Alloc
1fb0: 61 74 65 20 72 6f 6f 6d 20 2a 2f 0a 0a 23 69 66 ate room */..#if
1fc0: 20 21 64 65 66 69 6e 65 64 28 43 4f 44 45 5f 45 !defined(CODE_E
1fd0: 58 45 43 55 54 41 42 4c 45 29 20 26 26 20 21 64 XECUTABLE) && !d
1fe0: 65 66 69 6e 65 64 28 45 58 45 43 55 54 41 42 4c efined(EXECUTABL
1ff0: 45 5f 56 49 41 5f 4d 50 52 4f 54 45 43 54 29 0a E_VIA_MPROTECT).
2000: 20 20 2f 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 /* Note: This
2010: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f memory allocatio
2020: 6e 20 69 73 20 6e 6f 74 20 6d 75 6c 74 69 74 68 n is not multith
2030: 72 65 61 64 2d 73 61 66 65 2e 20 57 65 20 6d 69 read-safe. We mi
2040: 67 68 74 20 6e 65 65 64 0a 20 20 20 2a 20 74 6f ght need. * to
2050: 20 61 64 64 20 73 70 65 63 69 61 6c 20 28 70 6c add special (pl
2060: 61 74 66 6f 72 6d 20 64 65 70 65 6e 64 65 6e 74 atform dependent
2070: 29 20 63 6f 64 65 20 66 6f 72 20 6c 6f 63 6b 69 ) code for locki
2080: 6e 67 2e 0a 20 20 20 2a 20 46 6f 72 74 75 6e 61 ng.. * Fortuna
2090: 74 65 6c 79 2c 20 6d 6f 73 74 20 6d 6f 64 65 72 tely, most moder
20a0: 6e 20 73 79 73 74 65 6d 73 20 77 68 65 72 65 20 n systems where
20b0: 6d 75 6c 74 69 74 68 72 65 61 64 2d 73 61 66 65 multithread-safe
20c0: 74 79 20 6d 61 74 74 65 72 73 0a 20 20 20 2a 20 ty matters. *
20d0: 68 61 76 65 20 45 58 45 43 55 54 41 42 4c 45 5f have EXECUTABLE_
20e0: 56 49 41 5f 4d 50 52 4f 54 45 43 54 2c 20 61 6e VIA_MPROTECT, an
20f0: 64 20 74 68 6f 73 65 20 77 68 69 63 68 20 64 6f d those which do
2100: 6e 27 74 20 28 41 49 58 20 6f 6e 20 70 6f 77 65 n't (AIX on powe
2110: 72 70 63 20 61 6e 64 0a 20 20 20 2a 20 48 50 2d rpc and. * HP-
2120: 55 58 20 6f 6e 20 68 70 70 61 29 20 68 61 76 65 UX on hppa) have
2130: 20 43 4f 44 45 5f 45 58 45 43 55 54 41 42 4c 45 CODE_EXECUTABLE
2140: 2e 20 54 68 75 73 20 6e 6f 20 6c 6f 63 6b 69 6e . Thus no lockin
2150: 67 20 63 6f 64 65 20 69 73 20 6e 65 65 64 65 64 g code is needed
2160: 0a 20 20 20 2a 20 66 6f 72 20 74 68 65 20 6d 6f . * for the mo
2170: 6d 65 6e 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 ment.. */. if
2180: 20 28 66 72 65 65 6c 69 73 74 20 3d 3d 20 4e 55 (freelist == NU
2190: 4c 4c 29 0a 20 20 20 20 7b 20 2f 2a 20 47 65 74 LL). { /* Get
21a0: 20 61 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a a new page. */.
21b0: 20 20 20 20 20 20 63 68 61 72 2a 20 70 61 67 65 char* page
21c0: 3b 0a 23 69 66 64 65 66 20 45 58 45 43 55 54 41 ;.#ifdef EXECUTA
21d0: 42 4c 45 5f 56 49 41 5f 4d 4d 41 50 5f 41 4e 4f BLE_VIA_MMAP_ANO
21e0: 4e 59 4d 4f 55 53 0a 20 20 20 20 20 20 70 61 67 NYMOUS. pag
21f0: 65 20 3d 20 6d 6d 61 70 28 30 2c 20 70 61 67 65 e = mmap(0, page
2200: 73 69 7a 65 2c 20 50 52 4f 54 5f 52 45 41 44 20 size, PROT_READ
2210: 7c 20 50 52 4f 54 5f 57 52 49 54 45 20 7c 20 50 | PROT_WRITE | P
2220: 52 4f 54 5f 45 58 45 43 2c 20 4d 41 50 5f 41 4e ROT_EXEC, MAP_AN
2230: 4f 4e 59 4d 4f 55 53 20 7c 20 4d 41 50 5f 56 41 ONYMOUS | MAP_VA
2240: 52 49 41 42 4c 45 2c 20 2d 31 2c 20 30 29 3b 0a RIABLE, -1, 0);.
2250: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 45 58 #endif.#ifdef EX
2260: 45 43 55 54 41 42 4c 45 5f 56 49 41 5f 4d 4d 41 ECUTABLE_VIA_MMA
2270: 50 5f 44 45 56 5a 45 52 4f 0a 20 20 20 20 20 20 P_DEVZERO.
2280: 70 61 67 65 20 3d 20 6d 6d 61 70 28 30 2c 20 70 page = mmap(0, p
2290: 61 67 65 73 69 7a 65 2c 20 50 52 4f 54 5f 52 45 agesize, PROT_RE
22a0: 41 44 20 7c 20 50 52 4f 54 5f 57 52 49 54 45 20 AD | PROT_WRITE
22b0: 7c 20 50 52 4f 54 5f 45 58 45 43 2c 20 4d 41 50 | PROT_EXEC, MAP
22c0: 5f 50 52 49 56 41 54 45 2c 20 7a 65 72 6f 5f 66 _PRIVATE, zero_f
22d0: 64 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 23 69 d, 0);.#endif.#i
22e0: 66 64 65 66 20 45 58 45 43 55 54 41 42 4c 45 5f fdef EXECUTABLE_
22f0: 56 49 41 5f 53 48 4d 0a 20 20 20 20 20 20 69 6e VIA_SHM. in
2300: 74 20 73 68 6d 69 64 20 3d 20 73 68 6d 67 65 74 t shmid = shmget
2310: 28 49 50 43 5f 50 52 49 56 41 54 45 2c 20 70 61 (IPC_PRIVATE, pa
2320: 67 65 73 69 7a 65 2c 20 30 37 30 30 7c 49 50 43 gesize, 0700|IPC
2330: 5f 43 52 45 41 54 29 3b 0a 20 20 20 20 20 20 69 _CREAT);. i
2340: 66 20 28 73 68 6d 69 64 3c 30 29 0a 20 20 20 20 f (shmid<0).
2350: 20 20 20 20 7b 20 70 61 67 65 20 3d 20 28 63 68 { page = (ch
2360: 61 72 2a 29 28 2d 31 29 3b 20 7d 0a 20 20 20 20 ar*)(-1); }.
2370: 20 20 65 6c 73 65 0a 20 20 20 20 20 20 20 20 7b else. {
2380: 20 70 61 67 65 20 3d 20 73 68 6d 61 74 28 73 68 page = shmat(sh
2390: 6d 69 64 2c 20 30 2c 20 30 29 3b 20 73 68 6d 63 mid, 0, 0); shmc
23a0: 74 6c 28 73 68 6d 69 64 2c 20 49 50 43 5f 52 4d tl(shmid, IPC_RM
23b0: 49 44 2c 20 30 29 3b 20 7d 0a 23 65 6e 64 69 66 ID, 0); }.#endif
23c0: 0a 20 20 20 20 20 20 69 66 20 28 70 61 67 65 20 . if (page
23d0: 3d 3d 20 28 63 68 61 72 2a 29 28 2d 31 29 29 0a == (char*)(-1)).
23e0: 20 20 20 20 20 20 20 20 7b 20 66 70 72 69 6e 74 { fprint
23f0: 66 28 73 74 64 65 72 72 2c 22 74 72 61 6d 70 6f f(stderr,"trampo
2400: 6c 69 6e 65 3a 20 4f 75 74 20 6f 66 20 76 69 72 line: Out of vir
2410: 74 75 61 6c 20 6d 65 6d 6f 72 79 21 5c 6e 22 29 tual memory!\n")
2420: 3b 20 61 62 6f 72 74 28 29 3b 20 7d 0a 20 20 20 ; abort(); }.
2430: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 74 20 77 69 /* Fill it wi
2440: 74 68 20 66 72 65 65 20 74 72 61 6d 70 6f 6c 69 th free trampoli
2450: 6e 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 7b 20 nes. */. {
2460: 63 68 61 72 2a 2a 20 6c 61 73 74 20 3d 20 26 66 char** last = &f
2470: 72 65 65 6c 69 73 74 3b 0a 20 20 20 20 20 20 20 reelist;.
2480: 20 63 68 61 72 2a 20 70 61 67 65 5f 65 6e 64 20 char* page_end
2490: 3d 20 70 61 67 65 20 2b 20 70 61 67 65 73 69 7a = page + pagesiz
24a0: 65 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 e;. while
24b0: 20 28 70 61 67 65 2b 54 52 41 4d 50 5f 54 4f 54 (page+TRAMP_TOT
24c0: 41 4c 5f 4c 45 4e 47 54 48 20 3c 3d 20 70 61 67 AL_LENGTH <= pag
24d0: 65 5f 65 6e 64 29 0a 20 20 20 20 20 20 20 20 20 e_end).
24e0: 20 7b 20 2a 6c 61 73 74 20 3d 20 70 61 67 65 3b { *last = page;
24f0: 20 6c 61 73 74 20 3d 20 28 63 68 61 72 2a 2a 29 last = (char**)
2500: 70 61 67 65 3b 20 70 61 67 65 20 2b 3d 20 54 52 page; page += TR
2510: 41 4d 50 5f 54 4f 54 41 4c 5f 4c 45 4e 47 54 48 AMP_TOTAL_LENGTH
2520: 3b 20 7d 0a 20 20 20 20 20 20 20 20 2a 6c 61 73 ; }. *las
2530: 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 20 t = NULL;. }
2540: 7d 0a 20 20 66 75 6e 63 74 69 6f 6e 20 3d 20 66 }. function = f
2550: 72 65 65 6c 69 73 74 3b 20 66 72 65 65 6c 69 73 reelist; freelis
2560: 74 20 3d 20 2a 28 63 68 61 72 2a 2a 29 66 72 65 t = *(char**)fre
2570: 65 6c 69 73 74 3b 0a 23 65 6c 73 65 0a 20 20 7b elist;.#else. {
2580: 20 63 68 61 72 2a 20 72 6f 6f 6d 20 3d 20 28 63 char* room = (c
2590: 68 61 72 2a 29 20 6d 61 6c 6c 6f 63 28 73 69 7a har*) malloc(siz
25a0: 65 6f 66 28 76 6f 69 64 2a 29 20 2b 20 54 52 41 eof(void*) + TRA
25b0: 4d 50 5f 54 4f 54 41 4c 5f 4c 45 4e 47 54 48 20 MP_TOTAL_LENGTH
25c0: 2b 20 54 52 41 4d 50 5f 41 4c 49 47 4e 2d 31 29 + TRAMP_ALIGN-1)
25d0: 3b 0a 20 20 20 20 69 66 20 28 21 72 6f 6f 6d 29 ;. if (!room)
25e0: 0a 20 20 20 20 20 20 7b 20 66 70 72 69 6e 74 66 . { fprintf
25f0: 28 73 74 64 65 72 72 2c 22 74 72 61 6d 70 6f 6c (stderr,"trampol
2600: 69 6e 65 3a 20 4f 75 74 20 6f 66 20 76 69 72 74 ine: Out of virt
2610: 75 61 6c 20 6d 65 6d 6f 72 79 21 5c 6e 22 29 3b ual memory!\n");
2620: 20 61 62 6f 72 74 28 29 3b 20 7d 0a 20 20 20 20 abort(); }.
2630: 66 75 6e 63 74 69 6f 6e 20 3d 20 28 63 68 61 72 function = (char
2640: 2a 29 28 28 28 6c 6f 6e 67 29 72 6f 6f 6d 20 2b *)(((long)room +
2650: 20 73 69 7a 65 6f 66 28 76 6f 69 64 2a 29 20 2b sizeof(void*) +
2660: 20 54 52 41 4d 50 5f 41 4c 49 47 4e 2d 31 29 20 TRAMP_ALIGN-1)
2670: 26 20 2d 54 52 41 4d 50 5f 41 4c 49 47 4e 29 3b & -TRAMP_ALIGN);
2680: 0a 20 20 20 20 28 28 63 68 61 72 2a 2a 29 66 75 . ((char**)fu
2690: 6e 63 74 69 6f 6e 29 5b 2d 31 5d 20 3d 20 72 6f nction)[-1] = ro
26a0: 6f 6d 3b 20 2f 2a 20 62 61 63 6b 70 6f 69 6e 74 om; /* backpoint
26b0: 65 72 20 66 6f 72 20 66 72 65 65 5f 74 72 61 6d er for free_tram
26c0: 70 6f 6c 69 6e 65 28 29 20 2a 2f 0a 20 20 7d 0a poline() */. }.
26d0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 32 2e 20 #endif.. /* 2.
26e0: 46 69 6c 6c 20 6f 75 74 20 74 68 65 20 74 72 61 Fill out the tra
26f0: 6d 70 6f 6c 69 6e 65 20 2a 2f 0a 20 20 64 61 74 mpoline */. dat
2700: 61 20 3d 20 66 75 6e 63 74 69 6f 6e 20 2b 20 54 a = function + T
2710: 52 41 4d 50 5f 4c 45 4e 47 54 48 3b 0a 20 20 2f RAMP_LENGTH;. /
2720: 2a 20 4b 6e 6f 77 69 6e 67 20 74 68 61 74 20 64 * Knowing that d
2730: 61 74 61 20 3d 20 66 75 6e 63 74 69 6f 6e 20 2b ata = function +
2740: 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 2c 20 77 TRAMP_LENGTH, w
2750: 65 20 63 6f 75 6c 64 20 63 65 72 74 61 69 6e 6c e could certainl
2760: 79 20 6f 70 74 69 6d 69 7a 65 0a 20 20 20 2a 20 y optimize. *
2770: 74 68 65 20 74 72 61 6d 70 6f 6c 69 6e 65 73 20 the trampolines
2780: 61 20 6c 69 74 74 6c 65 20 62 69 74 20 6d 6f 72 a little bit mor
2790: 65 2c 20 75 73 69 6e 67 20 50 43 20 72 65 6c 61 e, using PC rela
27a0: 74 69 76 65 20 61 64 64 72 65 73 73 69 6e 67 20 tive addressing
27b0: 6d 6f 64 65 73 2e 0a 20 20 20 2a 20 42 75 74 20 modes.. * But
27c0: 49 20 64 6f 75 62 74 20 69 74 27 73 20 72 65 61 I doubt it's rea
27d0: 6c 6c 79 20 77 6f 72 74 68 20 69 74 2e 0a 20 20 lly worth it..
27e0: 20 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 69 33 38 */.#ifdef __i38
27f0: 36 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6__. /* functio
2800: 6e 3a 0a 20 20 20 2a 20 20 20 20 70 6f 70 6c 20 n:. * popl
2810: 25 65 63 78 09 09 09 35 39 0a 20 20 20 2a 20 20 %ecx...59. *
2820: 20 20 70 75 73 68 6c 20 24 3c 64 61 74 61 3e 09 pushl $<data>.
2830: 09 09 36 38 20 3c 64 61 74 61 3e 0a 20 20 20 2a ..68 <data>. *
2840: 20 20 20 20 70 75 73 68 6c 20 25 65 63 78 09 09 pushl %ecx..
2850: 09 35 31 0a 20 20 20 2a 20 20 20 20 6a 6d 70 20 .51. * jmp
2860: 3c 61 64 64 72 65 73 73 3e 09 09 09 45 39 20 3c <address>...E9 <
2870: 61 64 64 72 65 73 73 3e 2d 3c 68 65 72 65 3e 0a address>-<here>.
2880: 20 20 20 2a 20 68 65 72 65 3a 0a 20 20 20 2a 20 * here:. *
2890: 20 20 20 6e 6f 70 09 09 09 09 39 30 0a 20 20 20 nop....90.
28a0: 2a 20 20 20 20 6e 6f 70 09 09 09 09 39 30 0a 20 * nop....90.
28b0: 20 20 2a 20 20 20 20 6e 6f 70 09 09 09 09 39 30 * nop....90
28c0: 0a 20 20 20 2a 20 20 20 20 6e 6f 70 09 09 09 09 . * nop....
28d0: 39 30 0a 20 20 20 2a 2f 0a 20 20 2a 28 73 68 6f 90. */. *(sho
28e0: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
28f0: 2b 20 30 29 20 3d 20 30 78 36 38 35 39 3b 0a 20 + 0) = 0x6859;.
2900: 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e *(long *) (fun
2910: 63 74 69 6f 6e 20 2b 20 32 29 20 3d 20 28 6c 6f ction + 2) = (lo
2920: 6e 67 29 20 64 61 74 61 3b 0a 20 20 2a 28 73 68 ng) data;. *(sh
2930: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ort *) (function
2940: 20 2b 20 36 29 20 3d 20 30 78 45 39 35 31 3b 0a + 6) = 0xE951;.
2950: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 *(long *) (fu
2960: 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 28 6c nction + 8) = (l
2970: 6f 6e 67 29 20 61 64 64 72 65 73 73 20 2d 20 28 ong) address - (
2980: 6c 6f 6e 67 29 20 28 66 75 6e 63 74 69 6f 6e 20 long) (function
2990: 2b 20 31 32 29 3b 0a 20 20 2a 28 6c 6f 6e 67 20 + 12);. *(long
29a0: 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 *) (function +1
29b0: 32 29 20 3d 20 30 78 39 30 39 30 39 30 39 30 3b 2) = 0x90909090;
29c0: 20 20 20 2f 2a 20 6e 6f 70 20 6e 6f 70 20 6e 6f /* nop nop no
29d0: 70 20 6e 6f 70 2c 20 66 6f 72 20 61 6c 69 67 6e p nop, for align
29e0: 6d 65 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 ment */.#define
29f0: 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 6f is_tramp(functio
2a00: 6e 29 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e n) \. *(unsign
2a10: 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e ed short *) (fun
2a20: 63 74 69 6f 6e 20 2b 20 30 29 20 3d 3d 20 30 78 ction + 0) == 0x
2a30: 36 38 35 39 20 26 26 20 5c 0a 20 20 2a 28 75 6e 6859 && \. *(un
2a40: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 signed short *)
2a50: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 36 29 20 3d (function + 6) =
2a60: 3d 20 30 78 45 39 35 31 0a 23 64 65 66 69 6e 65 = 0xE951.#define
2a70: 20 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66 tramp_address(f
2a80: 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 unction) \. *(
2a90: 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 long *) (functi
2aa0: 6f 6e 20 2b 20 38 29 20 2b 20 28 6c 6f 6e 67 29 on + 8) + (long)
2ab0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 31 32 29 (function + 12)
2ac0: 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 .#define tramp_d
2ad0: 61 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c ata(function) \
2ae0: 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 . *(long *) (f
2af0: 75 6e 63 74 69 6f 6e 20 2b 20 32 29 0a 23 65 6e unction + 2).#en
2b00: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d 36 38 dif.#ifdef __m68
2b10: 6b 5f 5f 0a 23 69 66 64 65 66 20 5f 5f 4e 65 74 k__.#ifdef __Net
2b20: 42 53 44 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 BSD__. /* funct
2b30: 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 6d 6f 76 ion:. * mov
2b40: 65 6c 20 23 3c 64 61 74 61 3e 2c 61 31 09 09 32 el #<data>,a1..2
2b50: 32 20 37 43 20 3c 64 61 74 61 3e 0a 20 20 20 2a 2 7C <data>. *
2b60: 20 20 20 20 6a 6d 70 20 3c 61 64 64 72 65 73 73 jmp <address
2b70: 3e 09 09 09 34 45 20 46 39 20 3c 61 64 64 72 65 >...4E F9 <addre
2b80: 73 73 3e 0a 20 20 20 2a 20 20 20 20 6e 6f 70 09 ss>. * nop.
2b90: 09 09 09 34 45 20 37 31 0a 20 20 20 2a 2f 0a 20 ...4E 71. */.
2ba0: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e *(short *) (fun
2bb0: 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20 30 78 32 ction + 0) = 0x2
2bc0: 32 37 43 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 27C;. *(long *)
2bd0: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 32 29 (function + 2)
2be0: 20 3d 20 28 6c 6f 6e 67 29 20 64 61 74 61 3b 0a = (long) data;.
2bf0: 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 *(short *) (fu
2c00: 6e 63 74 69 6f 6e 20 2b 20 36 29 20 3d 20 30 78 nction + 6) = 0x
2c10: 34 45 46 39 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 4EF9;. *(long *
2c20: 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 ) (function + 8
2c30: 29 20 3d 20 28 6c 6f 6e 67 29 20 61 64 64 72 65 ) = (long) addre
2c40: 73 73 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 ss;. *(short *)
2c50: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 (function +12)
2c60: 3d 20 30 78 34 45 37 31 3b 0a 23 64 65 66 69 6e = 0x4E71;.#defin
2c70: 65 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 e is_tramp(funct
2c80: 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e 73 69 ion) \. *(unsi
2c90: 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 gned short *) (f
2ca0: 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 3d 20 unction + 0) ==
2cb0: 30 78 32 32 37 43 20 26 26 20 5c 0a 20 20 2a 28 0x227C && \. *(
2cc0: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a unsigned short *
2cd0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 36 29 ) (function + 6)
2ce0: 20 3d 3d 20 30 78 34 45 46 39 20 26 26 20 5c 0a == 0x4EF9 && \.
2cf0: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f *(unsigned sho
2d00: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
2d10: 2b 31 32 29 20 3d 3d 20 30 78 34 45 37 31 0a 23 +12) == 0x4E71.#
2d20: 65 6c 73 65 0a 20 20 2f 2a 20 66 75 6e 63 74 69 else. /* functi
2d30: 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 6d 6f 76 65 on:. * move
2d40: 6c 20 23 3c 64 61 74 61 3e 2c 61 30 09 09 32 30 l #<data>,a0..20
2d50: 20 37 43 20 3c 64 61 74 61 3e 0a 20 20 20 2a 20 7C <data>. *
2d60: 20 20 20 6a 6d 70 20 3c 61 64 64 72 65 73 73 3e jmp <address>
2d70: 09 09 09 34 45 20 46 39 20 3c 61 64 64 72 65 73 ...4E F9 <addres
2d80: 73 3e 0a 20 20 20 2a 20 20 20 20 6e 6f 70 09 09 s>. * nop..
2d90: 09 09 34 45 20 37 31 0a 20 20 20 2a 2f 0a 20 20 ..4E 71. */.
2da0: 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 *(short *) (func
2db0: 74 69 6f 6e 20 2b 20 30 29 20 3d 20 30 78 32 30 tion + 0) = 0x20
2dc0: 37 43 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 7C;. *(long *)
2dd0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 32 29 20 (function + 2)
2de0: 3d 20 28 6c 6f 6e 67 29 20 64 61 74 61 3b 0a 20 = (long) data;.
2df0: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e *(short *) (fun
2e00: 63 74 69 6f 6e 20 2b 20 36 29 20 3d 20 30 78 34 ction + 6) = 0x4
2e10: 45 46 39 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 EF9;. *(long *)
2e20: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 (function + 8)
2e30: 20 3d 20 28 6c 6f 6e 67 29 20 61 64 64 72 65 73 = (long) addres
2e40: 73 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 s;. *(short *)
2e50: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d (function +12) =
2e60: 20 30 78 34 45 37 31 3b 0a 23 64 65 66 69 6e 65 0x4E71;.#define
2e70: 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 is_tramp(functi
2e80: 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67 on) \. *(unsig
2e90: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 ned short *) (fu
2ea0: 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 3d 20 30 nction + 0) == 0
2eb0: 78 32 30 37 43 20 26 26 20 5c 0a 20 20 2a 28 75 x207C && \. *(u
2ec0: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 nsigned short *)
2ed0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 36 29 20 (function + 6)
2ee0: 3d 3d 20 30 78 34 45 46 39 20 26 26 20 5c 0a 20 == 0x4EF9 && \.
2ef0: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 *(unsigned shor
2f00: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
2f10: 31 32 29 20 3d 3d 20 30 78 34 45 37 31 0a 23 65 12) == 0x4E71.#e
2f20: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 74 72 61 ndif.#define tra
2f30: 6d 70 5f 61 64 64 72 65 73 73 28 66 75 6e 63 74 mp_address(funct
2f40: 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 6c 6f 6e 67 ion) \. *(long
2f50: 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b *) (function +
2f60: 20 38 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 8).#define tram
2f70: 70 5f 64 61 74 61 28 66 75 6e 63 74 69 6f 6e 29 p_data(function)
2f80: 20 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 \. *(long *)
2f90: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 32 29 0a (function + 2).
2fa0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
2fb0: 65 64 28 5f 5f 6d 69 70 73 5f 5f 29 20 7c 7c 20 ed(__mips__) ||
2fc0: 64 65 66 69 6e 65 64 28 5f 5f 6d 69 70 73 6e 33 defined(__mipsn3
2fd0: 32 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65 64 2__) && !defined
2fe0: 28 5f 5f 6d 69 70 73 36 34 5f 5f 29 0a 20 20 2f (__mips64__). /
2ff0: 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a * function:. *
3000: 20 20 20 20 6c 77 20 24 32 2c 31 36 28 24 32 35 lw $2,16($25
3010: 29 09 09 09 38 46 20 32 32 20 30 30 20 31 30 0a )...8F 22 00 10.
3020: 20 20 20 2a 20 20 20 20 6c 77 20 24 32 35 2c 32 * lw $25,2
3030: 30 28 24 32 35 29 09 09 09 38 46 20 33 39 20 30 0($25)...8F 39 0
3040: 30 20 31 34 0a 20 20 20 2a 20 20 20 20 6a 20 24 0 14. * j $
3050: 32 35 09 09 09 09 30 33 20 32 30 20 30 30 20 30 25....03 20 00 0
3060: 38 0a 20 20 20 2a 20 20 20 20 6e 6f 70 09 09 09 8. * nop...
3070: 09 30 30 20 30 30 20 30 30 20 30 30 0a 20 20 20 .00 00 00 00.
3080: 2a 20 20 20 20 2e 77 6f 72 64 20 3c 64 61 74 61 * .word <data
3090: 3e 09 09 09 3c 64 61 74 61 3e 0a 20 20 20 2a 20 >...<data>. *
30a0: 20 20 20 2e 77 6f 72 64 20 3c 61 64 64 72 65 73 .word <addres
30b0: 73 3e 09 09 09 3c 61 64 64 72 65 73 73 3e 0a 20 s>...<address>.
30c0: 20 20 2a 2f 0a 20 20 2a 28 75 6e 73 69 67 6e 65 */. *(unsigne
30d0: 64 20 69 6e 74 20 2a 29 20 28 66 75 6e 63 74 69 d int *) (functi
30e0: 6f 6e 20 2b 20 30 29 20 3d 20 30 78 38 46 32 32 on + 0) = 0x8F22
30f0: 30 30 31 30 3b 0a 20 20 2a 28 75 6e 73 69 67 6e 0010;. *(unsign
3100: 65 64 20 69 6e 74 20 2a 29 20 28 66 75 6e 63 74 ed int *) (funct
3110: 69 6f 6e 20 2b 20 34 29 20 3d 20 30 78 38 46 33 ion + 4) = 0x8F3
3120: 39 30 30 31 34 3b 0a 20 20 2a 28 75 6e 73 69 67 90014;. *(unsig
3130: 6e 65 64 20 69 6e 74 20 2a 29 20 28 66 75 6e 63 ned int *) (func
3140: 74 69 6f 6e 20 2b 20 38 29 20 3d 20 30 78 30 33 tion + 8) = 0x03
3150: 32 30 30 30 30 38 3b 0a 20 20 2a 28 75 6e 73 69 200008;. *(unsi
3160: 67 6e 65 64 20 69 6e 74 20 2a 29 20 28 66 75 6e gned int *) (fun
3170: 63 74 69 6f 6e 20 2b 31 32 29 20 3d 20 30 78 30 ction +12) = 0x0
3180: 30 30 30 30 30 30 30 3b 0a 20 20 2a 28 75 6e 73 0000000;. *(uns
3190: 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 28 66 75 igned int *) (fu
31a0: 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20 28 75 nction +16) = (u
31b0: 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 64 61 74 nsigned int) dat
31c0: 61 3b 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 a;. *(unsigned
31d0: 69 6e 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e int *) (function
31e0: 20 2b 32 30 29 20 3d 20 28 75 6e 73 69 67 6e 65 +20) = (unsigne
31f0: 64 20 69 6e 74 29 20 61 64 64 72 65 73 73 3b 0a d int) address;.
3200: 23 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 #define is_tramp
3210: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 (function) \.
3220: 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a *(unsigned int *
3230: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 ) (function + 0)
3240: 20 3d 3d 20 30 78 38 46 32 32 30 30 31 30 20 26 == 0x8F220010 &
3250: 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 & \. *(unsigned
3260: 20 69 6e 74 20 2a 29 20 28 66 75 6e 63 74 69 6f int *) (functio
3270: 6e 20 2b 20 34 29 20 3d 3d 20 30 78 38 46 33 39 n + 4) == 0x8F39
3280: 30 30 31 34 20 26 26 20 5c 0a 20 20 2a 28 75 6e 0014 && \. *(un
3290: 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 28 66 signed int *) (f
32a0: 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 3d 20 unction + 8) ==
32b0: 30 78 30 33 32 30 30 30 30 38 20 26 26 20 5c 0a 0x03200008 && \.
32c0: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 *(unsigned int
32d0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 *) (function +1
32e0: 32 29 20 3d 3d 20 30 78 30 30 30 30 30 30 30 30 2) == 0x00000000
32f0: 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 61 .#define tramp_a
3300: 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e 29 ddress(function)
3310: 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 \. *(unsigned
3320: 20 69 6e 74 20 2a 29 20 28 66 75 6e 63 74 69 6f int *) (functio
3330: 6e 20 2b 32 30 29 0a 23 64 65 66 69 6e 65 20 74 n +20).#define t
3340: 72 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 74 69 ramp_data(functi
3350: 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67 on) \. *(unsig
3360: 6e 65 64 20 69 6e 74 20 2a 29 20 28 66 75 6e 63 ned int *) (func
3370: 74 69 6f 6e 20 2b 31 36 29 0a 23 65 6e 64 69 66 tion +16).#endif
3380: 0a 23 69 66 64 65 66 20 5f 5f 6d 69 70 73 36 34 .#ifdef __mips64
3390: 6f 6c 64 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 old__. /* funct
33a0: 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 64 6c 69 ion:. * dli
33b0: 20 24 32 2c 3c 64 61 74 61 3e 09 09 09 33 43 20 $2,<data>...3C
33c0: 30 32 20 68 69 31 36 28 68 69 33 32 28 3c 64 61 02 hi16(hi32(<da
33d0: 74 61 3e 29 29 0a 20 20 20 2a 09 09 09 09 09 33 ta>)). *.....3
33e0: 34 20 34 32 20 6c 6f 31 36 28 68 69 33 32 28 3c 4 42 lo16(hi32(<
33f0: 64 61 74 61 3e 29 29 0a 20 20 20 2a 09 09 09 09 data>)). *....
3400: 09 30 30 20 30 32 20 31 34 20 33 38 0a 20 20 20 .00 02 14 38.
3410: 2a 09 09 09 09 09 33 34 20 34 32 20 68 69 31 36 *.....34 42 hi16
3420: 28 6c 6f 33 32 28 3c 64 61 74 61 3e 29 29 0a 20 (lo32(<data>)).
3430: 20 20 2a 09 09 09 09 09 30 30 20 30 32 20 31 34 *.....00 02 14
3440: 20 33 38 0a 20 20 20 2a 09 09 09 09 09 33 34 20 38. *.....34
3450: 34 32 20 6c 6f 31 36 28 6c 6f 33 32 28 3c 64 61 42 lo16(lo32(<da
3460: 74 61 3e 29 29 0a 20 20 20 2a 20 20 20 20 64 6c ta>)). * dl
3470: 69 20 24 32 35 2c 3c 61 64 64 72 65 73 73 3e 09 i $25,<address>.
3480: 09 33 43 20 31 39 20 68 69 31 36 28 68 69 33 32 .3C 19 hi16(hi32
3490: 28 3c 61 64 64 72 65 73 73 3e 29 29 0a 20 20 20 (<address>)).
34a0: 2a 09 09 09 09 09 33 37 20 33 39 20 6c 6f 31 36 *.....37 39 lo16
34b0: 28 68 69 33 32 28 3c 61 64 64 72 65 73 73 3e 29 (hi32(<address>)
34c0: 29 0a 20 20 20 2a 09 09 09 09 09 30 30 20 31 39 ). *.....00 19
34d0: 20 43 43 20 33 38 0a 20 20 20 2a 09 09 09 09 09 CC 38. *.....
34e0: 33 37 20 33 39 20 68 69 31 36 28 6c 6f 33 32 28 37 39 hi16(lo32(
34f0: 3c 61 64 64 72 65 73 73 3e 29 29 0a 20 20 20 2a <address>)). *
3500: 09 09 09 09 09 30 30 20 31 39 20 43 43 20 33 38 .....00 19 CC 38
3510: 0a 20 20 20 2a 09 09 09 09 09 33 37 20 33 39 20 . *.....37 39
3520: 6c 6f 31 36 28 6c 6f 33 32 28 3c 61 64 64 72 65 lo16(lo32(<addre
3530: 73 73 3e 29 29 0a 20 20 20 2a 20 20 20 20 6a 20 ss>)). * j
3540: 24 32 35 09 09 09 09 30 33 20 32 30 20 30 30 20 $25....03 20 00
3550: 30 38 0a 20 20 20 2a 20 20 20 20 6e 6f 70 09 09 08. * nop..
3560: 09 09 30 30 20 30 30 20 30 30 20 30 30 0a 20 20 ..00 00 00 00.
3570: 20 2a 2f 0a 20 20 2f 2a 20 57 68 61 74 20 61 62 */. /* What ab
3580: 6f 75 74 20 62 69 67 20 65 6e 64 69 61 6e 20 2f out big endian /
3590: 20 6c 69 74 74 6c 65 20 65 6e 64 69 61 6e 20 3f little endian ?
35a0: 3f 20 2a 2f 0a 20 20 2a 28 73 68 6f 72 74 20 2a ? */. *(short *
35b0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 ) (function + 0)
35c0: 20 3d 20 30 78 33 43 30 32 3b 0a 20 20 2a 28 73 = 0x3C02;. *(s
35d0: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f hort *) (functio
35e0: 6e 20 2b 20 32 29 20 3d 20 28 75 6e 73 69 67 6e n + 2) = (unsign
35f0: 65 64 20 6c 6f 6e 67 29 20 64 61 74 61 20 3e 3e ed long) data >>
3600: 20 34 38 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 48;. *(short *
3610: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 ) (function + 4)
3620: 20 3d 20 30 78 33 34 34 32 3b 0a 20 20 2a 28 73 = 0x3442;. *(s
3630: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f hort *) (functio
3640: 6e 20 2b 20 36 29 20 3d 20 28 28 75 6e 73 69 67 n + 6) = ((unsig
3650: 6e 65 64 20 6c 6f 6e 67 29 20 64 61 74 61 20 3e ned long) data >
3660: 3e 20 33 32 29 20 26 20 30 78 66 66 66 66 3b 0a > 32) & 0xffff;.
3670: 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 28 66 75 *(int *) (fu
3680: 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 30 78 nction + 8) = 0x
3690: 30 30 30 32 31 34 33 38 3b 0a 20 20 2a 28 73 68 00021438;. *(sh
36a0: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ort *) (function
36b0: 20 2b 31 32 29 20 3d 20 30 78 33 34 34 32 3b 0a +12) = 0x3442;.
36c0: 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 *(short *) (fu
36d0: 6e 63 74 69 6f 6e 20 2b 31 34 29 20 3d 20 28 28 nction +14) = ((
36e0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 unsigned long) d
36f0: 61 74 61 20 3e 3e 20 31 36 29 20 26 20 30 78 66 ata >> 16) & 0xf
3700: 66 66 66 3b 0a 20 20 2a 28 69 6e 74 20 2a 29 20 fff;. *(int *)
3710: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 (function +16)
3720: 20 3d 20 30 78 30 30 30 32 31 34 33 38 3b 0a 20 = 0x00021438;.
3730: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e *(short *) (fun
3740: 63 74 69 6f 6e 20 2b 32 30 29 20 3d 20 30 78 33 ction +20) = 0x3
3750: 34 34 32 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 442;. *(short *
3760: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 32 29 ) (function +22)
3770: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e = (unsigned lon
3780: 67 29 20 64 61 74 61 20 26 20 30 78 66 66 66 66 g) data & 0xffff
3790: 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 ;. *(short *) (
37a0: 66 75 6e 63 74 69 6f 6e 20 2b 32 34 29 20 3d 20 function +24) =
37b0: 30 78 33 43 31 39 3b 0a 20 20 2a 28 73 68 6f 72 0x3C19;. *(shor
37c0: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
37d0: 32 36 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 26) = (unsigned
37e0: 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 20 3e 3e long) address >>
37f0: 20 34 38 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 48;. *(short *
3800: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 38 29 ) (function +28)
3810: 20 3d 20 30 78 33 37 33 39 3b 0a 20 20 2a 28 73 = 0x3739;. *(s
3820: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f hort *) (functio
3830: 6e 20 2b 33 30 29 20 3d 20 28 28 75 6e 73 69 67 n +30) = ((unsig
3840: 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64 72 65 73 ned long) addres
3850: 73 20 3e 3e 20 33 32 29 20 26 20 30 78 66 66 66 s >> 32) & 0xfff
3860: 66 3b 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 f;. *(int *)
3870: 28 66 75 6e 63 74 69 6f 6e 20 2b 33 32 29 20 3d (function +32) =
3880: 20 30 78 30 30 31 39 43 43 33 38 3b 0a 20 20 2a 0x0019CC38;. *
3890: 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 (short *) (funct
38a0: 69 6f 6e 20 2b 33 36 29 20 3d 20 30 78 33 37 33 ion +36) = 0x373
38b0: 39 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 9;. *(short *)
38c0: 28 66 75 6e 63 74 69 6f 6e 20 2b 33 38 29 20 3d (function +38) =
38d0: 20 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 ((unsigned long
38e0: 29 20 61 64 64 72 65 73 73 20 3e 3e 20 31 36 29 ) address >> 16)
38f0: 20 26 20 30 78 66 66 66 66 3b 0a 20 20 2a 28 69 & 0xffff;. *(i
3900: 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f nt *) (functio
3910: 6e 20 2b 34 30 29 20 3d 20 30 78 30 30 31 39 43 n +40) = 0x0019C
3920: 43 33 38 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a C38;. *(short *
3930: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 34 34 29 ) (function +44)
3940: 20 3d 20 30 78 33 37 33 39 3b 0a 20 20 2a 28 73 = 0x3739;. *(s
3950: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f hort *) (functio
3960: 6e 20 2b 34 36 29 20 3d 20 28 75 6e 73 69 67 6e n +46) = (unsign
3970: 65 64 20 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 ed long) address
3980: 20 26 20 30 78 66 66 66 66 3b 0a 20 20 2a 28 69 & 0xffff;. *(i
3990: 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f nt *) (functio
39a0: 6e 20 2b 34 38 29 20 3d 20 30 78 30 33 32 30 30 n +48) = 0x03200
39b0: 30 30 38 3b 0a 20 20 2a 28 69 6e 74 20 2a 29 20 008;. *(int *)
39c0: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 35 32 29 (function +52)
39d0: 20 3d 20 30 78 30 30 30 30 30 30 30 30 3b 0a 23 = 0x00000000;.#
39e0: 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 28 define is_tramp(
39f0: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a function) \. *
3a00: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 (unsigned short
3a10: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 *) (function + 0
3a20: 29 20 3d 3d 20 30 78 33 43 30 32 20 26 26 20 5c ) == 0x3C02 && \
3a30: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 . *(unsigned sh
3a40: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ort *) (function
3a50: 20 2b 20 34 29 20 3d 3d 20 30 78 33 34 34 32 20 + 4) == 0x3442
3a60: 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 && \. *(unsigne
3a70: 64 20 69 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 d int *) (func
3a80: 74 69 6f 6e 20 2b 20 38 29 20 3d 3d 20 30 78 30 tion + 8) == 0x0
3a90: 30 30 32 31 34 33 38 20 26 26 20 5c 0a 20 20 2a 0021438 && \. *
3aa0: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 (unsigned short
3ab0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 *) (function +12
3ac0: 29 20 3d 3d 20 30 78 33 34 34 32 20 26 26 20 5c ) == 0x3442 && \
3ad0: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e . *(unsigned in
3ae0: 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e t *) (function
3af0: 20 2b 31 36 29 20 3d 3d 20 30 78 30 30 30 32 31 +16) == 0x00021
3b00: 34 33 38 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 438 && \. *(uns
3b10: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 igned short *) (
3b20: 66 75 6e 63 74 69 6f 6e 20 2b 32 30 29 20 3d 3d function +20) ==
3b30: 20 30 78 33 34 34 32 20 26 26 20 5c 0a 20 20 2a 0x3442 && \. *
3b40: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 (unsigned short
3b50: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 34 *) (function +24
3b60: 29 20 3d 3d 20 30 78 33 43 31 39 20 26 26 20 5c ) == 0x3C19 && \
3b70: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 . *(unsigned sh
3b80: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ort *) (function
3b90: 20 2b 32 38 29 20 3d 3d 20 30 78 33 37 33 39 20 +28) == 0x3739
3ba0: 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 && \. *(unsigne
3bb0: 64 20 69 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 d int *) (func
3bc0: 74 69 6f 6e 20 2b 33 32 29 20 3d 3d 20 30 78 30 tion +32) == 0x0
3bd0: 30 31 39 43 43 33 38 20 26 26 20 5c 0a 20 20 2a 019CC38 && \. *
3be0: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 (unsigned short
3bf0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 33 36 *) (function +36
3c00: 29 20 3d 3d 20 30 78 33 37 33 39 20 26 26 20 5c ) == 0x3739 && \
3c10: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e . *(unsigned in
3c20: 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e t *) (function
3c30: 20 2b 34 30 29 20 3d 3d 20 30 78 30 30 31 39 43 +40) == 0x0019C
3c40: 43 33 38 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 C38 && \. *(uns
3c50: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 igned short *) (
3c60: 66 75 6e 63 74 69 6f 6e 20 2b 34 34 29 20 3d 3d function +44) ==
3c70: 20 30 78 33 37 33 39 20 26 26 20 5c 0a 20 20 2a 0x3739 && \. *
3c80: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 (unsigned int *)
3c90: 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 34 38 (function +48
3ca0: 29 20 3d 3d 20 30 78 30 33 32 30 30 30 30 38 20 ) == 0x03200008
3cb0: 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 && \. *(unsigne
3cc0: 64 20 69 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 d int *) (func
3cd0: 74 69 6f 6e 20 2b 35 32 29 20 3d 3d 20 30 78 30 tion +52) == 0x0
3ce0: 30 30 30 30 30 30 30 0a 23 64 65 66 69 6e 65 20 0000000.#define
3cf0: 68 69 6c 6f 28 77 6f 72 64 33 2c 77 6f 72 64 32 hilo(word3,word2
3d00: 2c 77 6f 72 64 31 2c 77 6f 72 64 30 29 20 20 5c ,word1,word0) \
3d10: 0a 20 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c . (((unsigned l
3d20: 6f 6e 67 29 20 28 77 6f 72 64 33 29 20 3c 3c 20 ong) (word3) <<
3d30: 34 38 29 20 7c 20 28 28 75 6e 73 69 67 6e 65 64 48) | ((unsigned
3d40: 20 6c 6f 6e 67 29 20 28 77 6f 72 64 32 29 20 3c long) (word2) <
3d50: 3c 20 33 32 29 20 7c 20 5c 0a 20 20 20 28 28 75 < 32) | \. ((u
3d60: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 77 nsigned long) (w
3d70: 6f 72 64 31 29 20 3c 3c 20 31 36 29 20 7c 20 28 ord1) << 16) | (
3d80: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 unsigned long) (
3d90: 77 6f 72 64 30 29 29 0a 23 64 65 66 69 6e 65 20 word0)).#define
3da0: 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75 tramp_address(fu
3db0: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c nction) \. hil
3dc0: 6f 28 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f o(*(unsigned sho
3dd0: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
3de0: 2b 32 36 29 2c 20 5c 0a 20 20 20 20 20 20 20 2a +26), \. *
3df0: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 (unsigned short
3e00: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 33 30 *) (function +30
3e10: 29 2c 20 5c 0a 20 20 20 20 20 20 20 2a 28 75 6e ), \. *(un
3e20: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 signed short *)
3e30: 28 66 75 6e 63 74 69 6f 6e 20 2b 33 38 29 2c 20 (function +38),
3e40: 5c 0a 20 20 20 20 20 20 20 2a 28 75 6e 73 69 67 \. *(unsig
3e50: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 ned short *) (fu
3e60: 6e 63 74 69 6f 6e 20 2b 34 36 29 29 0a 23 64 65 nction +46)).#de
3e70: 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 28 fine tramp_data(
3e80: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68 function) \. h
3e90: 69 6c 6f 28 2a 28 75 6e 73 69 67 6e 65 64 20 73 ilo(*(unsigned s
3ea0: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f hort *) (functio
3eb0: 6e 20 2b 20 32 29 2c 20 5c 0a 20 20 20 20 20 20 n + 2), \.
3ec0: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 *(unsigned shor
3ed0: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
3ee0: 20 36 29 2c 20 5c 0a 20 20 20 20 20 20 20 2a 28 6), \. *(
3ef0: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a unsigned short *
3f00: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 34 29 ) (function +14)
3f10: 2c 20 5c 0a 20 20 20 20 20 20 20 2a 28 75 6e 73 , \. *(uns
3f20: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 igned short *) (
3f30: 66 75 6e 63 74 69 6f 6e 20 2b 32 32 29 29 0a 23 function +22)).#
3f40: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d endif.#ifdef __m
3f50: 69 70 73 36 34 5f 5f 0a 20 20 2f 2a 20 66 75 6e ips64__. /* fun
3f60: 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 6c ction:. * l
3f70: 64 20 24 32 2c 31 36 28 24 32 35 29 09 09 09 44 d $2,16($25)...D
3f80: 46 20 32 32 20 30 30 20 31 30 0a 20 20 20 2a 20 F 22 00 10. *
3f90: 20 20 20 6c 64 20 24 32 35 2c 32 34 28 24 32 35 ld $25,24($25
3fa0: 29 09 09 09 44 46 20 33 39 20 30 30 20 31 38 0a )...DF 39 00 18.
3fb0: 20 20 20 2a 20 20 20 20 6a 20 24 32 35 09 09 09 * j $25...
3fc0: 09 30 33 20 32 30 20 30 30 20 30 38 0a 20 20 20 .03 20 00 08.
3fd0: 2a 20 20 20 20 6e 6f 70 09 09 09 09 30 30 20 30 * nop....00 0
3fe0: 30 20 30 30 20 30 30 0a 20 20 20 2a 20 20 20 20 0 00 00. *
3ff0: 2e 64 77 6f 72 64 20 3c 64 61 74 61 3e 09 09 09 .dword <data>...
4000: 3c 64 61 74 61 3e 0a 20 20 20 2a 20 20 20 20 2e <data>. * .
4010: 64 77 6f 72 64 20 3c 61 64 64 72 65 73 73 3e 09 dword <address>.
4020: 09 3c 61 64 64 72 65 73 73 3e 0a 20 20 20 2a 2f .<address>. */
4030: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e . *(unsigned in
4040: 74 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 t *) (function
4050: 2b 20 30 29 20 3d 20 30 78 44 46 32 32 30 30 31 + 0) = 0xDF22001
4060: 30 3b 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 0;. *(unsigned
4070: 69 6e 74 20 2a 29 20 20 28 66 75 6e 63 74 69 6f int *) (functio
4080: 6e 20 2b 20 34 29 20 3d 20 30 78 44 46 33 39 30 n + 4) = 0xDF390
4090: 30 31 38 3b 0a 20 20 2a 28 75 6e 73 69 67 6e 65 018;. *(unsigne
40a0: 64 20 69 6e 74 20 2a 29 20 20 28 66 75 6e 63 74 d int *) (funct
40b0: 69 6f 6e 20 2b 20 38 29 20 3d 20 30 78 30 33 32 ion + 8) = 0x032
40c0: 30 30 30 30 38 3b 0a 20 20 2a 28 75 6e 73 69 67 00008;. *(unsig
40d0: 6e 65 64 20 69 6e 74 20 2a 29 20 20 28 66 75 6e ned int *) (fun
40e0: 63 74 69 6f 6e 20 2b 31 32 29 20 3d 20 30 78 30 ction +12) = 0x0
40f0: 30 30 30 30 30 30 30 3b 0a 20 20 2a 28 75 6e 73 0000000;. *(uns
4100: 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 29 20 28 66 igned long *) (f
4110: 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20 28 unction +16) = (
4120: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 unsigned long) d
4130: 61 74 61 3b 0a 20 20 2a 28 75 6e 73 69 67 6e 65 ata;. *(unsigne
4140: 64 20 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 d long *) (funct
4150: 69 6f 6e 20 2b 32 34 29 20 3d 20 28 75 6e 73 69 ion +24) = (unsi
4160: 67 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64 72 65 gned long) addre
4170: 73 73 3b 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 ss;.#define is_t
4180: 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 ramp(function)
4190: 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 \. *(unsigned i
41a0: 6e 74 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e nt *) (function
41b0: 20 2b 20 30 29 20 3d 3d 20 30 78 44 46 32 32 30 + 0) == 0xDF220
41c0: 30 31 30 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 010 && \. *(uns
41d0: 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 20 28 66 igned int *) (f
41e0: 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 3d 20 unction + 4) ==
41f0: 30 78 44 46 33 39 30 30 31 38 20 26 26 20 5c 0a 0xDF390018 && \.
4200: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 *(unsigned int
4210: 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b *) (function +
4220: 20 38 29 20 3d 3d 20 30 78 30 33 32 30 30 30 30 8) == 0x0320000
4230: 38 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 8 && \. *(unsig
4240: 6e 65 64 20 69 6e 74 20 2a 29 20 20 28 66 75 6e ned int *) (fun
4250: 63 74 69 6f 6e 20 2b 31 32 29 20 3d 3d 20 30 78 ction +12) == 0x
4260: 30 30 30 30 30 30 30 30 0a 23 64 65 66 69 6e 65 00000000.#define
4270: 20 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66 tramp_address(f
4280: 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 unction) \. *(
4290: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 29 unsigned long *)
42a0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 34 29 0a (function +24).
42b0: 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 #define tramp_da
42c0: 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a ta(function) \.
42d0: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e *(unsigned lon
42e0: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b g *) (function +
42f0: 31 36 29 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 16).#endif.#if d
4300: 65 66 69 6e 65 64 28 5f 5f 73 70 61 72 63 5f 5f efined(__sparc__
4310: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f ) && !defined(__
4320: 73 70 61 72 63 36 34 5f 5f 29 0a 20 20 2f 2a 20 sparc64__). /*
4330: 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 function:. *
4340: 20 20 73 65 74 68 69 20 25 68 69 28 3c 64 61 74 sethi %hi(<dat
4350: 61 3e 29 2c 25 67 32 09 09 30 35 30 30 30 30 30 a>),%g2..0500000
4360: 30 20 7c 20 28 3c 64 61 74 61 3e 20 3e 3e 20 31 0 | (<data> >> 1
4370: 30 29 0a 20 20 20 2a 20 20 20 20 73 65 74 68 69 0). * sethi
4380: 20 25 68 69 28 3c 61 64 64 72 65 73 73 3e 29 2c %hi(<address>),
4390: 25 67 31 09 30 33 30 30 30 30 30 30 20 7c 20 28 %g1.03000000 | (
43a0: 3c 61 64 64 72 65 73 73 3e 20 3e 3e 20 31 30 29 <address> >> 10)
43b0: 0a 20 20 20 2a 20 20 20 20 6a 6d 70 20 25 67 31 . * jmp %g1
43c0: 2b 25 6c 6f 28 3c 61 64 64 72 65 73 73 3e 29 09 +%lo(<address>).
43d0: 09 38 31 43 30 36 30 30 30 20 7c 20 28 3c 61 64 .81C06000 | (<ad
43e0: 64 72 65 73 73 3e 20 26 20 30 78 33 66 66 29 0a dress> & 0x3ff).
43f0: 20 20 20 2a 20 20 20 20 6f 72 20 25 67 32 2c 25 * or %g2,%
4400: 6c 6f 28 3c 64 61 74 61 3e 29 2c 25 67 32 09 09 lo(<data>),%g2..
4410: 38 34 31 30 41 30 30 30 20 7c 20 28 3c 64 61 74 8410A000 | (<dat
4420: 61 3e 20 26 20 30 78 33 66 66 29 0a 20 20 20 2a a> & 0x3ff). *
4430: 2f 0a 23 64 65 66 69 6e 65 20 68 69 28 77 6f 72 /.#define hi(wor
4440: 64 29 20 20 28 28 75 6e 73 69 67 6e 65 64 20 6c d) ((unsigned l
4450: 6f 6e 67 29 20 28 77 6f 72 64 29 20 3e 3e 20 31 ong) (word) >> 1
4460: 30 29 0a 23 64 65 66 69 6e 65 20 6c 6f 28 77 6f 0).#define lo(wo
4470: 72 64 29 20 20 28 28 75 6e 73 69 67 6e 65 64 20 rd) ((unsigned
4480: 6c 6f 6e 67 29 20 28 77 6f 72 64 29 20 26 20 30 long) (word) & 0
4490: 78 33 66 66 29 0a 20 20 2a 28 6c 6f 6e 67 20 2a x3ff). *(long *
44a0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 ) (function + 0)
44b0: 20 3d 20 30 78 30 35 30 30 30 30 30 30 20 7c 20 = 0x05000000 |
44c0: 68 69 28 64 61 74 61 29 3b 0a 20 20 2a 28 6c 6f hi(data);. *(lo
44d0: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 ng *) (function
44e0: 2b 20 34 29 20 3d 20 30 78 30 33 30 30 30 30 30 + 4) = 0x0300000
44f0: 30 20 7c 20 68 69 28 61 64 64 72 65 73 73 29 3b 0 | hi(address);
4500: 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 . *(long *) (fu
4510: 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 30 78 nction + 8) = 0x
4520: 38 31 43 30 36 30 30 30 20 7c 20 6c 6f 28 61 64 81C06000 | lo(ad
4530: 64 72 65 73 73 29 3b 0a 20 20 2a 28 6c 6f 6e 67 dress);. *(long
4540: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 *) (function +1
4550: 32 29 20 3d 20 30 78 38 34 31 30 41 30 30 30 20 2) = 0x8410A000
4560: 7c 20 6c 6f 28 64 61 74 61 29 3b 0a 23 64 65 66 | lo(data);.#def
4570: 69 6e 65 20 69 73 5f 74 72 61 6d 70 28 66 75 6e ine is_tramp(fun
4580: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 2a 28 6c ction) \. (*(l
4590: 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ong *) (function
45a0: 20 2b 20 30 29 20 26 20 30 78 66 66 63 30 30 30 + 0) & 0xffc000
45b0: 30 30 29 20 3d 3d 20 30 78 30 35 30 30 30 30 30 00) == 0x0500000
45c0: 30 20 26 26 20 5c 0a 20 20 28 2a 28 6c 6f 6e 67 0 && \. (*(long
45d0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 *) (function +
45e0: 34 29 20 26 20 30 78 66 66 63 30 30 30 30 30 29 4) & 0xffc00000)
45f0: 20 3d 3d 20 30 78 30 33 30 30 30 30 30 30 20 26 == 0x03000000 &
4600: 26 20 5c 0a 20 20 28 2a 28 6c 6f 6e 67 20 2a 29 & \. (*(long *)
4610: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 (function + 8)
4620: 26 20 30 78 66 66 66 66 66 63 30 30 29 20 3d 3d & 0xfffffc00) ==
4630: 20 30 78 38 31 43 30 36 30 30 30 20 26 26 20 5c 0x81C06000 && \
4640: 0a 20 20 28 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 . (*(long *) (f
4650: 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 26 20 30 unction +12) & 0
4660: 78 66 66 66 66 66 63 30 30 29 20 3d 3d 20 30 78 xfffffc00) == 0x
4670: 38 34 31 30 41 30 30 30 0a 23 64 65 66 69 6e 65 8410A000.#define
4680: 20 68 69 6c 6f 28 68 69 77 6f 72 64 2c 6c 6f 77 hilo(hiword,low
4690: 6f 72 64 29 20 20 28 28 28 68 69 77 6f 72 64 29 ord) (((hiword)
46a0: 20 3c 3c 20 31 30 29 20 7c 20 28 28 6c 6f 77 6f << 10) | ((lowo
46b0: 72 64 29 20 26 20 30 78 33 66 66 29 29 0a 23 64 rd) & 0x3ff)).#d
46c0: 65 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 efine tramp_addr
46d0: 65 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c ess(function) \
46e0: 0a 20 20 68 69 6c 6f 28 2a 28 6c 6f 6e 67 20 2a . hilo(*(long *
46f0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 ) (function + 4)
4700: 2c 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e , *(long *) (fun
4710: 63 74 69 6f 6e 20 2b 20 38 29 29 0a 23 64 65 66 ction + 8)).#def
4720: 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 28 66 ine tramp_data(f
4730: 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69 unction) \. hi
4740: 6c 6f 28 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 lo(*(long *) (fu
4750: 6e 63 74 69 6f 6e 20 2b 20 30 29 2c 20 2a 28 6c nction + 0), *(l
4760: 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ong *) (function
4770: 20 2b 31 32 29 29 0a 23 65 6e 64 69 66 0a 23 69 +12)).#endif.#i
4780: 66 64 65 66 20 5f 5f 73 70 61 72 63 36 34 5f 5f fdef __sparc64__
4790: 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a . /* function:.
47a0: 20 20 20 2a 20 20 20 20 72 64 20 25 70 63 2c 25 * rd %pc,%
47b0: 67 31 09 09 09 38 33 34 31 34 30 30 30 0a 20 20 g1...83414000.
47c0: 20 2a 20 20 20 20 6c 64 78 20 5b 25 67 31 2b 32 * ldx [%g1+2
47d0: 34 5d 2c 25 67 32 09 09 43 34 35 38 36 30 31 38 4],%g2..C4586018
47e0: 0a 20 20 20 2a 20 20 20 20 6a 6d 70 20 25 67 32 . * jmp %g2
47f0: 09 09 09 09 38 31 43 30 38 30 30 30 0a 20 20 20 ....81C08000.
4800: 2a 20 20 20 20 6c 64 78 20 5b 25 67 31 2b 31 36 * ldx [%g1+16
4810: 5d 2c 25 67 35 09 09 43 41 35 38 36 30 31 30 0a ],%g5..CA586010.
4820: 20 20 20 2a 20 20 20 20 2e 6c 6f 6e 67 20 68 69 * .long hi
4830: 67 68 33 32 28 3c 64 61 74 61 3e 29 09 09 3c 64 gh32(<data>)..<d
4840: 61 74 61 3e 20 3e 3e 20 33 32 0a 20 20 20 2a 20 ata> >> 32. *
4850: 20 20 20 2e 6c 6f 6e 67 20 6c 6f 77 33 32 28 3c .long low32(<
4860: 64 61 74 61 3e 29 09 09 3c 64 61 74 61 3e 20 26 data>)..<data> &
4870: 20 30 78 66 66 66 66 66 66 66 66 0a 20 20 20 2a 0xffffffff. *
4880: 20 20 20 20 2e 6c 6f 6e 67 20 68 69 67 68 33 32 .long high32
4890: 28 3c 61 64 64 72 65 73 73 3e 29 09 09 3c 61 64 (<address>)..<ad
48a0: 64 72 65 73 73 3e 20 3e 3e 20 33 32 0a 20 20 20 dress> >> 32.
48b0: 2a 20 20 20 20 2e 6c 6f 6e 67 20 6c 6f 77 33 32 * .long low32
48c0: 28 3c 61 64 64 72 65 73 73 3e 29 09 09 3c 61 64 (<address>)..<ad
48d0: 64 72 65 73 73 3e 20 26 20 30 78 66 66 66 66 66 dress> & 0xfffff
48e0: 66 66 66 0a 20 20 20 2a 2f 0a 20 20 2a 28 69 6e fff. */. *(in
48f0: 74 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 t *) (function
4900: 2b 20 30 29 20 3d 20 30 78 38 33 34 31 34 30 30 + 0) = 0x8341400
4910: 30 3b 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 28 0;. *(int *) (
4920: 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 20 function + 4) =
4930: 30 78 43 34 35 38 36 30 31 38 3b 0a 20 20 2a 28 0xC4586018;. *(
4940: 69 6e 74 20 2a 29 20 20 28 66 75 6e 63 74 69 6f int *) (functio
4950: 6e 20 2b 20 38 29 20 3d 20 30 78 38 31 43 30 38 n + 8) = 0x81C08
4960: 30 30 30 3b 0a 20 20 2a 28 69 6e 74 20 2a 29 20 000;. *(int *)
4970: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 (function +12)
4980: 3d 20 30 78 43 41 35 38 36 30 31 30 3b 0a 20 20 = 0xCA586010;.
4990: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 *(long *) (funct
49a0: 69 6f 6e 20 2b 31 36 29 20 3d 20 28 6c 6f 6e 67 ion +16) = (long
49b0: 29 20 64 61 74 61 3b 0a 20 20 2a 28 6c 6f 6e 67 ) data;. *(long
49c0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 *) (function +2
49d0: 34 29 20 3d 20 28 6c 6f 6e 67 29 20 61 64 64 72 4) = (long) addr
49e0: 65 73 73 3b 0a 23 64 65 66 69 6e 65 20 69 73 5f ess;.#define is_
49f0: 74 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20 tramp(function)
4a00: 20 5c 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 28 \. *(int *) (
4a10: 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 3d function + 0) ==
4a20: 20 30 78 38 33 34 31 34 30 30 30 20 26 26 20 5c 0x83414000 && \
4a30: 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 28 66 75 . *(int *) (fu
4a40: 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 3d 20 30 nction + 4) == 0
4a50: 78 43 34 35 38 36 30 31 38 20 26 26 20 5c 0a 20 xC4586018 && \.
4a60: 20 2a 28 69 6e 74 20 2a 29 20 20 28 66 75 6e 63 *(int *) (func
4a70: 74 69 6f 6e 20 2b 20 38 29 20 3d 3d 20 30 78 38 tion + 8) == 0x8
4a80: 31 43 30 38 30 30 30 20 26 26 20 5c 0a 20 20 2a 1C08000 && \. *
4a90: 28 69 6e 74 20 2a 29 20 20 28 66 75 6e 63 74 69 (int *) (functi
4aa0: 6f 6e 20 2b 31 32 29 20 3d 3d 20 30 78 43 41 35 on +12) == 0xCA5
4ab0: 38 36 30 31 30 0a 23 64 65 66 69 6e 65 20 74 72 86010.#define tr
4ac0: 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75 6e 63 amp_address(func
4ad0: 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 6c 6f 6e tion) \. *(lon
4ae0: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b g *) (function +
4af0: 32 34 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 24).#define tram
4b00: 70 5f 64 61 74 61 28 66 75 6e 63 74 69 6f 6e 29 p_data(function)
4b10: 20 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 \. *(long *)
4b20: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 0a 23 (function +16).#
4b30: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 61 endif.#ifdef __a
4b40: 6c 70 68 61 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 lpha__. /* func
4b50: 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 62 72 tion:. * br
4b60: 20 24 31 2c 66 75 6e 63 74 69 6f 6e 2e 2e 6e 67 $1,function..ng
4b70: 09 30 30 20 30 30 20 32 30 20 43 30 0a 20 20 20 .00 00 20 C0.
4b80: 2a 20 66 75 6e 63 74 69 6f 6e 2e 2e 6e 67 3a 0a * function..ng:.
4b90: 20 20 20 2a 20 20 20 20 6c 64 71 20 24 32 37 2c * ldq $27,
4ba0: 32 30 28 24 31 29 09 09 31 34 20 30 30 20 36 31 20($1)..14 00 61
4bb0: 20 41 37 0a 20 20 20 2a 20 20 20 20 6c 64 71 20 A7. * ldq
4bc0: 24 31 2c 31 32 28 24 31 29 09 09 30 43 20 30 30 $1,12($1)..0C 00
4bd0: 20 32 31 20 41 34 0a 20 20 20 2a 20 20 20 20 6a 21 A4. * j
4be0: 6d 70 20 24 33 31 2c 28 24 32 37 29 2c 30 09 09 mp $31,($27),0..
4bf0: 30 30 20 30 30 20 46 42 20 36 42 0a 20 20 20 2a 00 00 FB 6B. *
4c00: 20 20 20 20 2e 71 75 61 64 20 3c 64 61 74 61 3e .quad <data>
4c10: 09 09 3c 64 61 74 61 3e 0a 20 20 20 2a 20 20 20 ..<data>. *
4c20: 20 2e 71 75 61 64 20 3c 61 64 64 72 65 73 73 3e .quad <address>
4c30: 09 09 3c 61 64 64 72 65 73 73 3e 0a 20 20 20 2a ..<address>. *
4c40: 2f 0a 20 20 7b 20 73 74 61 74 69 63 20 69 6e 74 /. { static int
4c50: 20 63 6f 64 65 20 5b 34 5d 20 3d 0a 20 20 20 20 code [4] =.
4c60: 20 20 7b 20 30 78 43 30 32 30 30 30 30 30 2c 20 { 0xC0200000,
4c70: 30 78 41 37 36 31 30 30 31 34 2c 20 30 78 41 34 0xA7610014, 0xA4
4c80: 32 31 30 30 30 43 2c 20 30 78 36 42 46 42 30 30 21000C, 0x6BFB00
4c90: 30 30 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 00 };. int i;
4ca0: 0a 20 20 20 20 66 6f 72 20 28 69 3d 30 3b 20 69 . for (i=0; i
4cb0: 3c 34 3b 20 69 2b 2b 29 20 7b 20 28 28 69 6e 74 <4; i++) { ((int
4cc0: 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 69 5d *) function)[i]
4cd0: 20 3d 20 63 6f 64 65 5b 69 5d 3b 20 7d 0a 20 20 = code[i]; }.
4ce0: 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 ((long *) func
4cf0: 74 69 6f 6e 29 5b 32 5d 20 3d 20 28 6c 6f 6e 67 tion)[2] = (long
4d00: 29 20 64 61 74 61 3b 0a 20 20 20 20 28 28 6c 6f ) data;. ((lo
4d10: 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b ng *) function)[
4d20: 33 5d 20 3d 20 28 6c 6f 6e 67 29 20 61 64 64 72 3] = (long) addr
4d30: 65 73 73 3b 0a 20 20 7d 0a 23 64 65 66 69 6e 65 ess;. }.#define
4d40: 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 is_tramp(functi
4d50: 6f 6e 29 20 20 5c 0a 20 20 28 28 69 6e 74 20 2a on) \. ((int *
4d60: 29 20 66 75 6e 63 74 69 6f 6e 29 5b 30 5d 20 3d ) function)[0] =
4d70: 3d 20 30 78 43 30 32 30 30 30 30 30 20 26 26 20 = 0xC0200000 &&
4d80: 5c 0a 20 20 28 28 69 6e 74 20 2a 29 20 66 75 6e \. ((int *) fun
4d90: 63 74 69 6f 6e 29 5b 31 5d 20 3d 3d 20 30 78 41 ction)[1] == 0xA
4da0: 37 36 31 30 30 31 34 20 26 26 20 5c 0a 20 20 28 7610014 && \. (
4db0: 28 69 6e 74 20 2a 29 20 66 75 6e 63 74 69 6f 6e (int *) function
4dc0: 29 5b 32 5d 20 3d 3d 20 30 78 41 34 32 31 30 30 )[2] == 0xA42100
4dd0: 30 43 20 26 26 20 5c 0a 20 20 28 28 69 6e 74 20 0C && \. ((int
4de0: 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 33 5d 20 *) function)[3]
4df0: 3d 3d 20 30 78 36 42 46 42 30 30 30 30 0a 23 64 == 0x6BFB0000.#d
4e00: 65 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 efine tramp_addr
4e10: 65 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c ess(function) \
4e20: 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e . ((long *) fun
4e30: 63 74 69 6f 6e 29 5b 33 5d 0a 23 64 65 66 69 6e ction)[3].#defin
4e40: 65 20 74 72 61 6d 70 5f 64 61 74 61 28 66 75 6e e tramp_data(fun
4e50: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 28 6c 6f ction) \. ((lo
4e60: 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b ng *) function)[
4e70: 32 5d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 2].#endif.#ifdef
4e80: 20 5f 5f 68 70 70 61 6f 6c 64 5f 5f 0a 20 20 2f __hppaold__. /
4e90: 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a * function:. *
4ea0: 20 20 20 20 6c 64 69 6c 20 4c 27 3c 64 61 74 61 ldil L'<data
4eb0: 3e 2c 25 72 32 39 09 09 32 33 41 30 30 30 30 30 >,%r29..23A00000
4ec0: 20 7c 20 68 69 28 3c 64 61 74 61 3e 29 0a 20 20 | hi(<data>).
4ed0: 20 2a 20 20 20 20 6c 64 69 6c 20 4c 27 3c 61 64 * ldil L'<ad
4ee0: 64 72 65 73 73 3e 2c 25 72 32 31 09 09 32 32 41 dress>,%r21..22A
4ef0: 30 30 30 30 30 20 7c 20 68 69 28 3c 61 64 64 72 00000 | hi(<addr
4f00: 65 73 73 3e 29 0a 20 20 20 2a 20 20 20 20 6c 64 ess>). * ld
4f10: 6f 20 52 27 3c 64 61 74 61 3e 28 25 72 32 39 29 o R'<data>(%r29)
4f20: 2c 25 72 32 39 09 09 33 37 42 44 30 30 30 30 20 ,%r29..37BD0000
4f30: 7c 20 6c 6f 28 3c 64 61 74 61 3e 29 0a 20 20 20 | lo(<data>).
4f40: 2a 20 20 20 20 6c 64 6f 20 52 27 3c 61 64 64 72 * ldo R'<addr
4f50: 65 73 73 3e 28 25 72 32 31 29 2c 25 72 32 31 09 ess>(%r21),%r21.
4f60: 33 36 42 35 30 30 30 30 20 7c 20 6c 6f 28 3c 61 36B50000 | lo(<a
4f70: 64 64 72 65 73 73 3e 29 0a 20 20 20 2a 20 20 20 ddress>). *
4f80: 20 62 62 2c 3e 3d 2c 6e 20 25 72 32 31 2c 33 30 bb,>=,n %r21,30
4f90: 2c 66 75 6e 63 74 69 6f 6e 32 09 43 37 44 35 43 ,function2.C7D5C
4fa0: 30 31 32 0a 20 20 20 2a 20 20 20 20 64 65 70 69 012. * depi
4fb0: 20 30 2c 33 31 2c 32 2c 25 72 32 31 09 09 44 36 0,31,2,%r21..D6
4fc0: 41 30 31 43 31 45 0a 20 20 20 2a 20 20 20 20 6c A01C1E. * l
4fd0: 64 77 20 34 28 30 2c 25 72 32 31 29 2c 25 72 31 dw 4(0,%r21),%r1
4fe0: 39 09 09 34 41 42 33 30 30 30 38 0a 20 20 20 2a 9..4AB30008. *
4ff0: 20 20 20 20 6c 64 77 20 30 28 30 2c 25 72 32 31 ldw 0(0,%r21
5000: 29 2c 25 72 32 31 09 09 34 41 42 35 30 30 30 30 ),%r21..4AB50000
5010: 0a 20 20 20 2a 20 66 75 6e 63 74 69 6f 6e 32 3a . * function2:
5020: 0a 20 20 20 2a 20 20 20 20 6c 64 73 69 64 20 28 . * ldsid (
5030: 30 2c 25 72 32 31 29 2c 25 72 31 09 09 30 32 41 0,%r21),%r1..02A
5040: 30 31 30 41 31 0a 20 20 20 2a 20 20 20 20 6d 74 010A1. * mt
5050: 73 70 20 25 72 31 2c 25 73 72 30 09 09 09 30 30 sp %r1,%sr0...00
5060: 30 31 31 38 32 30 0a 20 20 20 2a 20 20 20 20 62 011820. * b
5070: 65 2c 6e 20 30 28 25 73 72 30 2c 25 72 32 31 29 e,n 0(%sr0,%r21)
5080: 09 09 45 32 41 30 30 30 30 32 0a 20 20 20 2a 20 ..E2A00002. *
5090: 20 20 20 6e 6f 70 09 09 09 09 30 38 30 30 30 32 nop....080002
50a0: 34 30 0a 20 20 20 2a 2f 0a 20 20 2f 2a 20 57 68 40. */. /* Wh
50b0: 65 6e 20 64 65 63 6f 64 69 6e 67 20 61 20 32 31 en decoding a 21
50c0: 2d 62 69 74 20 61 72 67 75 6d 65 6e 74 20 69 6e -bit argument in
50d0: 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c an instruction,
50e0: 20 74 68 65 20 68 70 70 61 20 70 65 72 66 6f 72 the hppa perfor
50f0: 6d 73 0a 20 20 20 2a 20 74 68 65 20 66 6f 6c 6c ms. * the foll
5100: 6f 77 69 6e 67 20 62 69 74 20 6d 61 6e 69 70 75 owing bit manipu
5110: 6c 61 74 69 6f 6e 3a 0a 20 20 20 2a 20 61 73 73 lation:. * ass
5120: 65 6d 62 6c 65 32 31 3a 20 78 5b 32 30 5d 2e 2e emble21: x[20]..
5130: 2e 78 5b 30 5d 0a 20 20 20 2a 20 20 20 20 20 20 .x[0]. *
5140: 20 2d 2d 3e 20 78 5b 30 5d 20 78 5b 31 31 5d 2e --> x[0] x[11].
5150: 2e 2e 78 5b 31 5d 20 78 5b 31 35 5d 2e 2e 78 5b ..x[1] x[15]..x[
5160: 31 34 5d 20 78 5b 32 30 5d 2e 2e 2e 78 5b 31 36 14] x[20]...x[16
5170: 5d 20 78 5b 31 33 5d 2e 2e 78 5b 31 32 5d 0a 20 ] x[13]..x[12].
5180: 20 20 2a 20 57 68 65 6e 20 65 6e 63 6f 64 69 6e * When encodin
5190: 67 20 61 20 32 31 2d 62 69 74 20 61 72 67 75 6d g a 21-bit argum
51a0: 65 6e 74 20 69 6e 74 6f 20 61 6e 20 69 6e 73 74 ent into an inst
51b0: 72 75 63 74 69 6f 6e 2c 20 77 65 20 6e 65 65 64 ruction, we need
51c0: 20 74 68 65 0a 20 20 20 2a 20 74 6f 20 70 65 72 the. * to per
51d0: 66 6f 72 6d 20 74 68 65 20 72 65 76 65 72 73 65 form the reverse
51e0: 20 70 65 72 6d 75 74 61 74 69 6f 6e 3a 0a 20 20 permutation:.
51f0: 20 2a 20 70 65 72 6d 75 74 65 32 31 3a 20 20 79 * permute21: y
5200: 5b 32 30 5d 2e 2e 2e 79 5b 30 5d 0a 20 20 20 2a [20]...y[0]. *
5210: 20 20 20 20 20 20 20 2d 2d 3e 20 79 5b 36 5d 2e --> y[6].
5220: 2e 2e 79 5b 32 5d 20 79 5b 38 5d 2e 2e 79 5b 37 ..y[2] y[8]..y[7
5230: 5d 20 79 5b 31 5d 2e 2e 79 5b 30 5d 20 79 5b 31 ] y[1]..y[0] y[1
5240: 39 5d 2e 2e 2e 79 5b 39 5d 20 79 5b 32 30 5d 0a 9]...y[9] y[20].
5250: 20 20 20 2a 2f 0a 23 64 65 66 69 6e 65 20 61 73 */.#define as
5260: 73 65 6d 62 6c 65 32 31 28 78 29 20 20 5c 0a 20 semble21(x) \.
5270: 20 28 28 28 28 78 29 20 26 20 30 78 31 29 20 3c ((((x) & 0x1) <
5280: 3c 20 32 30 29 20 7c 20 28 28 28 78 29 20 26 20 < 20) | (((x) &
5290: 30 78 46 46 45 29 20 3c 3c 20 38 29 20 7c 20 5c 0xFFE) << 8) | \
52a0: 0a 20 20 20 28 28 28 78 29 20 26 20 30 78 43 30 . (((x) & 0xC0
52b0: 30 30 29 20 3e 3e 20 37 29 20 7c 20 28 28 28 78 00) >> 7) | (((x
52c0: 29 20 26 20 30 78 31 46 30 30 30 30 29 20 3e 3e ) & 0x1F0000) >>
52d0: 20 31 34 29 20 7c 20 28 28 28 78 29 20 26 20 30 14) | (((x) & 0
52e0: 78 33 30 30 30 29 20 3e 3e 20 31 32 29 29 0a 23 x3000) >> 12)).#
52f0: 64 65 66 69 6e 65 20 70 65 72 6d 75 74 65 32 31 define permute21
5300: 28 79 29 20 20 5c 0a 20 20 28 28 28 28 79 29 20 (y) \. ((((y)
5310: 26 20 30 78 37 43 29 20 3c 3c 20 31 34 29 20 7c & 0x7C) << 14) |
5320: 20 28 28 28 79 29 20 26 20 30 78 31 38 30 29 20 (((y) & 0x180)
5330: 3c 3c 20 37 29 20 7c 20 28 28 28 79 29 20 26 20 << 7) | (((y) &
5340: 30 78 33 29 20 3c 3c 20 31 32 29 20 7c 20 5c 0a 0x3) << 12) | \.
5350: 20 20 20 28 28 28 79 29 20 26 20 30 78 46 46 45 (((y) & 0xFFE
5360: 30 30 29 20 3e 3e 20 38 29 20 7c 20 28 28 28 79 00) >> 8) | (((y
5370: 29 20 26 20 30 78 31 30 30 30 30 30 29 20 3e 3e ) & 0x100000) >>
5380: 20 32 30 29 29 0a 23 64 65 66 69 6e 65 20 68 69 20)).#define hi
5390: 28 77 6f 72 64 29 20 20 70 65 72 6d 75 74 65 32 (word) permute2
53a0: 31 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 1((unsigned long
53b0: 29 20 28 77 6f 72 64 29 20 3e 3e 20 31 31 29 0a ) (word) >> 11).
53c0: 23 64 65 66 69 6e 65 20 6c 6f 28 77 6f 72 64 29 #define lo(word)
53d0: 20 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f (((unsigned lo
53e0: 6e 67 29 20 28 77 6f 72 64 29 20 26 20 30 78 37 ng) (word) & 0x7
53f0: 46 46 29 20 3c 3c 20 31 29 0a 20 20 2a 28 6c 6f FF) << 1). *(lo
5400: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 ng *) (function
5410: 2b 20 30 29 20 3d 20 30 78 32 33 41 30 30 30 30 + 0) = 0x23A0000
5420: 30 20 7c 20 68 69 28 64 61 74 61 29 3b 0a 20 20 0 | hi(data);.
5430: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 *(long *) (funct
5440: 69 6f 6e 20 2b 20 34 29 20 3d 20 30 78 32 32 41 ion + 4) = 0x22A
5450: 30 30 30 30 30 20 7c 20 68 69 28 61 64 64 72 65 00000 | hi(addre
5460: 73 73 29 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 ss);. *(long *)
5470: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 (function + 8)
5480: 3d 20 30 78 33 37 42 44 30 30 30 30 20 7c 20 6c = 0x37BD0000 | l
5490: 6f 28 64 61 74 61 29 3b 0a 20 20 2a 28 6c 6f 6e o(data);. *(lon
54a0: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b g *) (function +
54b0: 31 32 29 20 3d 20 30 78 33 36 42 35 30 30 30 30 12) = 0x36B50000
54c0: 20 7c 20 6c 6f 28 61 64 64 72 65 73 73 29 3b 0a | lo(address);.
54d0: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e *(long *) (fun
54e0: 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20 30 78 43 ction +16) = 0xC
54f0: 37 44 35 43 30 31 32 3b 0a 20 20 2a 28 6c 6f 6e 7D5C012;. *(lon
5500: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b g *) (function +
5510: 32 30 29 20 3d 20 30 78 44 36 41 30 31 43 31 45 20) = 0xD6A01C1E
5520: 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 ;. *(long *) (f
5530: 75 6e 63 74 69 6f 6e 20 2b 32 34 29 20 3d 20 30 unction +24) = 0
5540: 78 34 41 42 33 30 30 30 38 3b 0a 20 20 2a 28 6c x4AB30008;. *(l
5550: 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ong *) (function
5560: 20 2b 32 38 29 20 3d 20 30 78 34 41 42 35 30 30 +28) = 0x4AB500
5570: 30 30 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 00;. *(long *)
5580: 28 66 75 6e 63 74 69 6f 6e 20 2b 33 32 29 20 3d (function +32) =
5590: 20 30 78 30 32 41 30 31 30 41 31 3b 0a 20 20 2a 0x02A010A1;. *
55a0: 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 (long *) (functi
55b0: 6f 6e 20 2b 33 36 29 20 3d 20 30 78 30 30 30 31 on +36) = 0x0001
55c0: 31 38 32 30 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 1820;. *(long *
55d0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 34 30 29 ) (function +40)
55e0: 20 3d 20 30 78 45 32 41 30 30 30 30 32 3b 0a 20 = 0xE2A00002;.
55f0: 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 *(long *) (func
5600: 74 69 6f 6e 20 2b 34 34 29 20 3d 20 30 78 30 38 tion +44) = 0x08
5610: 30 30 30 32 34 30 3b 0a 23 64 65 66 69 6e 65 20 000240;.#define
5620: 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 6f is_tramp(functio
5630: 6e 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 29 20 n) \. ((long)
5640: 66 75 6e 63 74 69 6f 6e 20 26 20 33 29 20 3d 3d function & 3) ==
5650: 20 30 20 26 26 20 5c 0a 20 20 28 2a 28 6c 6f 6e 0 && \. (*(lon
5660: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b g *) (function +
5670: 20 30 29 20 26 20 30 78 66 66 65 30 30 30 30 30 0) & 0xffe00000
5680: 29 20 3d 3d 20 30 78 32 33 41 30 30 30 30 30 20 ) == 0x23A00000
5690: 26 26 20 5c 0a 20 20 28 2a 28 6c 6f 6e 67 20 2a && \. (*(long *
56a0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 ) (function + 4)
56b0: 20 26 20 30 78 66 66 65 30 30 30 30 30 29 20 3d & 0xffe00000) =
56c0: 3d 20 30 78 32 32 41 30 30 30 30 30 20 26 26 20 = 0x22A00000 &&
56d0: 5c 0a 20 20 28 2a 28 6c 6f 6e 67 20 2a 29 20 28 \. (*(long *) (
56e0: 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 26 20 function + 8) &
56f0: 30 78 66 66 66 66 66 30 30 30 29 20 3d 3d 20 30 0xfffff000) == 0
5700: 78 33 37 42 44 30 30 30 30 20 26 26 20 5c 0a 20 x37BD0000 && \.
5710: 20 28 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e (*(long *) (fun
5720: 63 74 69 6f 6e 20 2b 31 32 29 20 26 20 30 78 66 ction +12) & 0xf
5730: 66 66 66 66 30 30 30 29 20 3d 3d 20 30 78 33 36 ffff000) == 0x36
5740: 42 35 30 30 30 30 20 26 26 20 5c 0a 20 20 2a 28 B50000 && \. *(
5750: 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f long *) (functio
5760: 6e 20 2b 31 36 29 20 3d 3d 20 30 78 43 37 44 35 n +16) == 0xC7D5
5770: 43 30 31 32 20 26 26 20 5c 0a 20 20 2a 28 6c 6f C012 && \. *(lo
5780: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 ng *) (function
5790: 2b 32 30 29 20 3d 3d 20 30 78 44 36 41 30 31 43 +20) == 0xD6A01C
57a0: 31 45 20 26 26 20 5c 0a 20 20 2a 28 6c 6f 6e 67 1E && \. *(long
57b0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 *) (function +2
57c0: 34 29 20 3d 3d 20 30 78 34 41 42 33 30 30 30 38 4) == 0x4AB30008
57d0: 20 26 26 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a && \. *(long *
57e0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 38 29 ) (function +28)
57f0: 20 3d 3d 20 30 78 34 41 42 35 30 30 30 30 20 26 == 0x4AB50000 &
5800: 26 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 & \. *(long *)
5810: 28 66 75 6e 63 74 69 6f 6e 20 2b 33 32 29 20 3d (function +32) =
5820: 3d 20 30 78 30 32 41 30 31 30 41 31 20 26 26 20 = 0x02A010A1 &&
5830: 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 \. *(long *) (f
5840: 75 6e 63 74 69 6f 6e 20 2b 33 36 29 20 3d 3d 20 unction +36) ==
5850: 30 78 30 30 30 31 31 38 32 30 20 26 26 20 5c 0a 0x00011820 && \.
5860: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e *(long *) (fun
5870: 63 74 69 6f 6e 20 2b 34 30 29 20 3d 3d 20 30 78 ction +40) == 0x
5880: 45 32 41 30 30 30 30 32 20 26 26 20 5c 0a 20 20 E2A00002 && \.
5890: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 *(long *) (funct
58a0: 69 6f 6e 20 2b 34 34 29 20 3d 3d 20 30 78 30 38 ion +44) == 0x08
58b0: 30 30 30 32 34 30 0a 23 64 65 66 69 6e 65 20 68 000240.#define h
58c0: 69 6c 6f 28 68 69 77 6f 72 64 2c 6c 6f 77 6f 72 ilo(hiword,lowor
58d0: 64 29 20 20 5c 0a 20 20 28 28 61 73 73 65 6d 62 d) \. ((assemb
58e0: 6c 65 32 31 28 28 75 6e 73 69 67 6e 65 64 20 6c le21((unsigned l
58f0: 6f 6e 67 29 20 28 68 69 77 6f 72 64 29 29 20 3c ong) (hiword)) <
5900: 3c 20 31 31 29 20 7c 20 5c 0a 20 20 20 28 28 28 < 11) | \. (((
5910: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 unsigned long) (
5920: 6c 6f 77 6f 72 64 29 20 26 20 30 78 46 46 45 29 loword) & 0xFFE)
5930: 20 3e 3e 20 31 29 20 5c 0a 20 20 29 0a 23 64 65 >> 1) \. ).#de
5940: 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 65 fine tramp_addre
5950: 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a ss(function) \.
5960: 20 20 68 69 6c 6f 28 2a 28 6c 6f 6e 67 20 2a 29 hilo(*(long *)
5970: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 2c (function + 4),
5980: 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 *(long *) (func
5990: 74 69 6f 6e 20 2b 31 32 29 29 0a 23 64 65 66 69 tion +12)).#defi
59a0: 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 28 66 75 ne tramp_data(fu
59b0: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c nction) \. hil
59c0: 6f 28 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e o(*(long *) (fun
59d0: 63 74 69 6f 6e 20 2b 20 30 29 2c 20 2a 28 6c 6f ction + 0), *(lo
59e0: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 ng *) (function
59f0: 2b 20 38 29 29 0a 23 65 6e 64 69 66 0a 23 69 66 + 8)).#endif.#if
5a00: 64 65 66 20 5f 5f 68 70 70 61 6e 65 77 5f 5f 0a def __hppanew__.
5a10: 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 /* function:.
5a20: 20 20 2a 20 20 20 20 2e 6c 6f 6e 67 20 20 20 74 * .long t
5a30: 72 61 6d 70 5f 72 0a 20 20 20 2a 20 20 20 20 2e ramp_r. * .
5a40: 6c 6f 6e 67 20 20 20 63 6c 6f 73 75 72 65 0a 20 long closure.
5a50: 20 20 2a 20 63 6c 6f 73 75 72 65 3a 0a 20 20 20 * closure:.
5a60: 2a 20 20 20 20 2e 6c 6f 6e 67 20 20 20 3c 64 61 * .long <da
5a70: 74 61 3e 0a 20 20 20 2a 20 20 20 20 2e 6c 6f 6e ta>. * .lon
5a80: 67 20 20 20 3c 61 64 64 72 65 73 73 3e 0a 20 20 g <address>.
5a90: 20 2a 2f 0a 20 20 7b 20 2f 2a 20 77 6f 72 6b 20 */. { /* work
5aa0: 61 72 6f 75 6e 64 20 61 20 62 75 67 20 69 6e 20 around a bug in
5ab0: 67 63 63 20 33 2e 2a 20 2a 2f 0a 20 20 20 20 76 gcc 3.* */. v
5ac0: 6f 69 64 2a 20 74 72 61 6d 70 5f 72 5f 61 64 64 oid* tramp_r_add
5ad0: 72 65 73 73 20 3d 20 26 74 72 61 6d 70 5f 72 3b ress = &tramp_r;
5ae0: 0a 20 20 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 . *(long *) (
5af0: 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20 function + 0) =
5b00: 28 28 6c 6f 6e 67 20 2a 29 20 28 28 63 68 61 72 ((long *) ((char
5b10: 2a 29 74 72 61 6d 70 5f 72 5f 61 64 64 72 65 73 *)tramp_r_addres
5b20: 73 2d 32 29 29 5b 30 5d 3b 0a 20 20 20 20 2a 28 s-2))[0];. *(
5b30: 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f long *) (functio
5b40: 6e 20 2b 20 34 29 20 3d 20 28 6c 6f 6e 67 29 20 n + 4) = (long)
5b50: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 3b 0a (function + 8);.
5b60: 20 20 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 *(long *) (f
5b70: 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 28 unction + 8) = (
5b80: 6c 6f 6e 67 29 20 64 61 74 61 3b 0a 20 20 20 20 long) data;.
5b90: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 *(long *) (funct
5ba0: 69 6f 6e 20 2b 31 32 29 20 3d 20 28 6c 6f 6e 67 ion +12) = (long
5bb0: 29 20 61 64 64 72 65 73 73 3b 0a 20 20 7d 0a 23 ) address;. }.#
5bc0: 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 28 define is_tramp(
5bd0: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 function) \. (
5be0: 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f (long *) functio
5bf0: 6e 29 5b 30 5d 20 3d 3d 20 28 28 6c 6f 6e 67 20 n)[0] == ((long
5c00: 2a 29 20 28 28 63 68 61 72 2a 29 74 72 61 6d 70 *) ((char*)tramp
5c10: 5f 72 5f 61 64 64 72 65 73 73 2d 32 29 29 5b 30 _r_address-2))[0
5c20: 5d 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f ].#define tramp_
5c30: 61 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e address(function
5c40: 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 ) \. ((long *)
5c50: 20 66 75 6e 63 74 69 6f 6e 29 5b 33 5d 0a 23 64 function)[3].#d
5c60: 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 efine tramp_data
5c70: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 (function) \.
5c80: 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 ((long *) functi
5c90: 6f 6e 29 5b 32 5d 0a 23 65 6e 64 69 66 0a 23 69 on)[2].#endif.#i
5ca0: 66 64 65 66 20 5f 5f 61 72 6d 5f 5f 0a 20 20 2f fdef __arm__. /
5cb0: 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a * function:. *
5cc0: 09 61 64 64 09 72 31 32 2c 70 63 2c 23 38 09 09 .add.r12,pc,#8..
5cd0: 09 45 32 38 46 43 30 30 38 0a 20 20 20 2a 09 6c .E28FC008. *.l
5ce0: 64 72 09 70 63 2c 5b 70 63 5d 09 09 09 09 45 35 dr.pc,[pc]....E5
5cf0: 39 46 46 30 30 30 0a 20 20 20 2a 20 5f 64 61 74 9FF000. * _dat
5d00: 61 3a 0a 20 20 20 2a 09 2e 77 6f 72 64 09 3c 64 a:. *..word.<d
5d10: 61 74 61 3e 0a 20 20 20 2a 20 5f 66 75 6e 63 74 ata>. * _funct
5d20: 69 6f 6e 3a 0a 20 20 20 2a 09 2e 77 6f 72 64 09 ion:. *..word.
5d30: 3c 61 64 64 72 65 73 73 3e 0a 20 20 20 2a 2f 0a <address>. */.
5d40: 20 20 7b 0a 20 20 20 20 28 28 6c 6f 6e 67 20 2a {. ((long *
5d50: 29 20 66 75 6e 63 74 69 6f 6e 29 5b 30 5d 20 3d ) function)[0] =
5d60: 20 30 78 45 32 38 46 43 30 30 38 3b 0a 20 20 20 0xE28FC008;.
5d70: 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 ((long *) funct
5d80: 69 6f 6e 29 5b 31 5d 20 3d 20 30 78 45 35 39 46 ion)[1] = 0xE59F
5d90: 46 30 30 30 3b 0a 20 20 20 20 28 28 6c 6f 6e 67 F000;. ((long
5da0: 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 32 5d *) function)[2]
5db0: 20 3d 20 28 6c 6f 6e 67 29 20 64 61 74 61 3b 0a = (long) data;.
5dc0: 20 20 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 ((long *) fu
5dd0: 6e 63 74 69 6f 6e 29 5b 33 5d 20 3d 20 28 6c 6f nction)[3] = (lo
5de0: 6e 67 29 20 61 64 64 72 65 73 73 3b 0a 20 20 7d ng) address;. }
5df0: 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d .#define is_tram
5e00: 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 p(function) \.
5e10: 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 ((long *) funct
5e20: 69 6f 6e 29 5b 30 5d 20 3d 3d 20 30 78 45 32 38 ion)[0] == 0xE28
5e30: 46 43 30 30 38 20 26 26 20 5c 0a 20 20 28 28 6c FC008 && \. ((l
5e40: 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 ong *) function)
5e50: 5b 31 5d 20 3d 3d 20 30 78 45 35 39 46 46 30 30 [1] == 0xE59FF00
5e60: 30 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 0.#define tramp_
5e70: 61 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e address(function
5e80: 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 ) \. ((long *)
5e90: 20 66 75 6e 63 74 69 6f 6e 29 5b 33 5d 0a 23 64 function)[3].#d
5ea0: 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 efine tramp_data
5eb0: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 (function) \.
5ec0: 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 ((long *) functi
5ed0: 6f 6e 29 5b 32 5d 0a 23 65 6e 64 69 66 0a 23 69 on)[2].#endif.#i
5ee0: 66 64 65 66 20 5f 5f 70 6f 77 65 72 70 63 73 79 fdef __powerpcsy
5ef0: 73 76 34 5f 5f 0a 23 69 66 64 65 66 20 5f 5f 4e sv4__.#ifdef __N
5f00: 65 74 42 53 44 5f 5f 0a 20 20 2f 2a 20 66 75 6e etBSD__. /* fun
5f10: 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 7b ction:. * {
5f20: 6c 69 75 7c 6c 69 73 7d 20 31 33 2c 68 69 31 36 liu|lis} 13,hi16
5f30: 28 3c 64 61 74 61 3e 29 09 09 33 44 20 41 30 20 (<data>)..3D A0
5f40: 68 69 31 36 28 3c 64 61 74 61 3e 29 0a 20 20 20 hi16(<data>).
5f50: 2a 20 20 20 20 7b 6f 72 69 6c 7c 6f 72 69 7d 20 * {oril|ori}
5f60: 31 33 2c 31 33 2c 6c 6f 31 36 28 3c 64 61 74 61 13,13,lo16(<data
5f70: 3e 29 09 09 36 31 20 41 44 20 6c 6f 31 36 28 3c >)..61 AD lo16(<
5f80: 64 61 74 61 3e 29 0a 20 20 20 2a 20 20 20 20 7b data>). * {
5f90: 6c 69 75 7c 6c 69 73 7d 20 30 2c 68 69 31 36 28 liu|lis} 0,hi16(
5fa0: 3c 61 64 64 72 65 73 73 3e 29 09 09 33 43 20 30 <address>)..3C 0
5fb0: 30 20 68 69 31 36 28 3c 61 64 64 72 65 73 73 3e 0 hi16(<address>
5fc0: 29 0a 20 20 20 2a 20 20 20 20 7b 6f 72 69 6c 7c ). * {oril|
5fd0: 6f 72 69 7d 20 30 2c 30 2c 6c 6f 31 36 28 3c 61 ori} 0,0,lo16(<a
5fe0: 64 64 72 65 73 73 3e 29 09 09 36 30 20 30 30 20 ddress>)..60 00
5ff0: 6c 6f 31 36 28 3c 61 64 64 72 65 73 73 3e 29 0a lo16(<address>).
6000: 20 20 20 2a 20 20 20 20 6d 74 63 74 72 20 30 09 * mtctr 0.
6010: 09 09 09 09 37 43 20 30 39 20 30 33 20 41 36 0a ....7C 09 03 A6.
6020: 20 20 20 2a 20 20 20 20 62 63 74 72 09 09 09 09 * bctr....
6030: 09 34 45 20 38 30 20 30 34 20 32 30 0a 20 20 20 .4E 80 04 20.
6040: 2a 2f 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 */. *(short *)
6050: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d (function + 0) =
6060: 20 30 78 33 44 41 30 3b 0a 20 20 2a 28 73 68 6f 0x3DA0;. *(sho
6070: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
6080: 2b 20 32 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 + 2) = (unsigned
6090: 20 6c 6f 6e 67 29 20 64 61 74 61 20 3e 3e 20 31 long) data >> 1
60a0: 36 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 6;. *(short *)
60b0: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d (function + 4) =
60c0: 20 30 78 36 31 41 44 3b 0a 20 20 2a 28 73 68 6f 0x61AD;. *(sho
60d0: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
60e0: 2b 20 36 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 + 6) = (unsigned
60f0: 20 6c 6f 6e 67 29 20 64 61 74 61 20 26 20 30 78 long) data & 0x
6100: 66 66 66 66 3b 0a 20 20 2a 28 73 68 6f 72 74 20 ffff;. *(short
6110: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 *) (function + 8
6120: 29 20 3d 20 30 78 33 43 30 30 3b 0a 20 20 2a 28 ) = 0x3C00;. *(
6130: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
6140: 6f 6e 20 2b 31 30 29 20 3d 20 28 75 6e 73 69 67 on +10) = (unsig
6150: 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64 72 65 73 ned long) addres
6160: 73 20 3e 3e 20 31 36 3b 0a 20 20 2a 28 73 68 6f s >> 16;. *(sho
6170: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
6180: 2b 31 32 29 20 3d 20 30 78 36 30 30 30 3b 0a 20 +12) = 0x6000;.
6190: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e *(short *) (fun
61a0: 63 74 69 6f 6e 20 2b 31 34 29 20 3d 20 28 75 6e ction +14) = (un
61b0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64 signed long) add
61c0: 72 65 73 73 20 26 20 30 78 66 66 66 66 3b 0a 20 ress & 0xffff;.
61d0: 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e *(long *) (fun
61e0: 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20 30 78 37 ction +16) = 0x7
61f0: 43 30 39 30 33 41 36 3b 0a 20 20 2a 28 6c 6f 6e C0903A6;. *(lon
6200: 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 g *) (function
6210: 2b 32 30 29 20 3d 20 30 78 34 45 38 30 30 34 32 +20) = 0x4E80042
6220: 30 3b 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72 0;.#define is_tr
6230: 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c amp(function) \
6240: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 . *(unsigned sh
6250: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ort *) (function
6260: 20 2b 20 30 29 20 3d 3d 20 30 78 33 44 41 30 20 + 0) == 0x3DA0
6270: 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 && \. *(unsigne
6280: 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 d short *) (func
6290: 74 69 6f 6e 20 2b 20 34 29 20 3d 3d 20 30 78 36 tion + 4) == 0x6
62a0: 31 41 44 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 1AD && \. *(uns
62b0: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 igned short *) (
62c0: 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 3d function + 8) ==
62d0: 20 30 78 33 43 30 30 20 26 26 20 5c 0a 20 20 2a 0x3C00 && \. *
62e0: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 (unsigned short
62f0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 *) (function +12
6300: 29 20 3d 3d 20 30 78 36 30 30 30 20 26 26 20 5c ) == 0x6000 && \
6310: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 6c 6f . *(unsigned lo
6320: 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e ng *) (function
6330: 20 2b 31 36 29 20 3d 3d 20 30 78 37 43 30 39 30 +16) == 0x7C090
6340: 33 41 36 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 3A6 && \. *(uns
6350: 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 29 20 20 28 igned long *) (
6360: 66 75 6e 63 74 69 6f 6e 20 2b 32 30 29 20 3d 3d function +20) ==
6370: 20 30 78 34 45 38 30 30 34 32 30 0a 23 65 6c 73 0x4E800420.#els
6380: 65 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a e. /* function:
6390: 0a 20 20 20 2a 20 20 20 20 7b 6c 69 75 7c 6c 69 . * {liu|li
63a0: 73 7d 20 31 31 2c 68 69 31 36 28 3c 64 61 74 61 s} 11,hi16(<data
63b0: 3e 29 09 09 33 44 20 36 30 20 68 69 31 36 28 3c >)..3D 60 hi16(<
63c0: 64 61 74 61 3e 29 0a 20 20 20 2a 20 20 20 20 7b data>). * {
63d0: 6f 72 69 6c 7c 6f 72 69 7d 20 31 31 2c 31 31 2c oril|ori} 11,11,
63e0: 6c 6f 31 36 28 3c 64 61 74 61 3e 29 09 09 36 31 lo16(<data>)..61
63f0: 20 36 42 20 6c 6f 31 36 28 3c 64 61 74 61 3e 29 6B lo16(<data>)
6400: 0a 20 20 20 2a 20 20 20 20 7b 6c 69 75 7c 6c 69 . * {liu|li
6410: 73 7d 20 30 2c 68 69 31 36 28 3c 61 64 64 72 65 s} 0,hi16(<addre
6420: 73 73 3e 29 09 09 33 43 20 30 30 20 68 69 31 36 ss>)..3C 00 hi16
6430: 28 3c 61 64 64 72 65 73 73 3e 29 0a 20 20 20 2a (<address>). *
6440: 20 20 20 20 7b 6f 72 69 6c 7c 6f 72 69 7d 20 30 {oril|ori} 0
6450: 2c 30 2c 6c 6f 31 36 28 3c 61 64 64 72 65 73 73 ,0,lo16(<address
6460: 3e 29 09 09 36 30 20 30 30 20 6c 6f 31 36 28 3c >)..60 00 lo16(<
6470: 61 64 64 72 65 73 73 3e 29 0a 20 20 20 2a 20 20 address>). *
6480: 20 20 6d 74 63 74 72 20 30 09 09 09 09 09 37 43 mtctr 0.....7C
6490: 20 30 39 20 30 33 20 41 36 0a 20 20 20 2a 20 20 09 03 A6. *
64a0: 20 20 62 63 74 72 09 09 09 09 09 34 45 20 38 30 bctr.....4E 80
64b0: 20 30 34 20 32 30 0a 20 20 20 2a 2f 0a 20 20 2a 04 20. */. *
64c0: 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 (short *) (funct
64d0: 69 6f 6e 20 2b 20 30 29 20 3d 20 30 78 33 44 36 ion + 0) = 0x3D6
64e0: 30 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 0;. *(short *)
64f0: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 32 29 20 3d (function + 2) =
6500: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
6510: 20 64 61 74 61 20 3e 3e 20 31 36 3b 0a 20 20 2a data >> 16;. *
6520: 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 (short *) (funct
6530: 69 6f 6e 20 2b 20 34 29 20 3d 20 30 78 36 31 36 ion + 4) = 0x616
6540: 42 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 B;. *(short *)
6550: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 36 29 20 3d (function + 6) =
6560: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
6570: 20 64 61 74 61 20 26 20 30 78 66 66 66 66 3b 0a data & 0xffff;.
6580: 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 *(short *) (fu
6590: 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 30 78 nction + 8) = 0x
65a0: 33 43 30 30 3b 0a 20 20 2a 28 73 68 6f 72 74 20 3C00;. *(short
65b0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 30 *) (function +10
65c0: 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f ) = (unsigned lo
65d0: 6e 67 29 20 61 64 64 72 65 73 73 20 3e 3e 20 31 ng) address >> 1
65e0: 36 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 6;. *(short *)
65f0: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d (function +12) =
6600: 20 30 78 36 30 30 30 3b 0a 20 20 2a 28 73 68 6f 0x6000;. *(sho
6610: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
6620: 2b 31 34 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 +14) = (unsigned
6630: 20 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 20 26 long) address &
6640: 20 30 78 66 66 66 66 3b 0a 20 20 2a 28 6c 6f 6e 0xffff;. *(lon
6650: 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 g *) (function
6660: 2b 31 36 29 20 3d 20 30 78 37 43 30 39 30 33 41 +16) = 0x7C0903A
6670: 36 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 6;. *(long *)
6680: 28 66 75 6e 63 74 69 6f 6e 20 2b 32 30 29 20 3d (function +20) =
6690: 20 30 78 34 45 38 30 30 34 32 30 3b 0a 23 64 65 0x4E800420;.#de
66a0: 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 28 66 75 fine is_tramp(fu
66b0: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 nction) \. *(u
66c0: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 nsigned short *)
66d0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 (function + 0)
66e0: 3d 3d 20 30 78 33 44 36 30 20 26 26 20 5c 0a 20 == 0x3D60 && \.
66f0: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 *(unsigned shor
6700: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
6710: 20 34 29 20 3d 3d 20 30 78 36 31 36 42 20 26 26 4) == 0x616B &&
6720: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 \. *(unsigned
6730: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
6740: 6f 6e 20 2b 20 38 29 20 3d 3d 20 30 78 33 43 30 on + 8) == 0x3C0
6750: 30 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 0 && \. *(unsig
6760: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 ned short *) (fu
6770: 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d 3d 20 30 nction +12) == 0
6780: 78 36 30 30 30 20 26 26 20 5c 0a 20 20 2a 28 75 x6000 && \. *(u
6790: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 29 20 nsigned long *)
67a0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20 (function +16)
67b0: 3d 3d 20 30 78 37 43 30 39 30 33 41 36 20 26 26 == 0x7C0903A6 &&
67c0: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 \. *(unsigned
67d0: 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 long *) (functi
67e0: 6f 6e 20 2b 32 30 29 20 3d 3d 20 30 78 34 45 38 on +20) == 0x4E8
67f0: 30 30 34 32 30 0a 23 65 6e 64 69 66 0a 23 64 65 00420.#endif.#de
6800: 66 69 6e 65 20 68 69 6c 6f 28 68 69 77 6f 72 64 fine hilo(hiword
6810: 2c 6c 6f 77 6f 72 64 29 20 20 5c 0a 20 20 28 28 ,loword) \. ((
6820: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
6830: 28 68 69 77 6f 72 64 29 20 3c 3c 20 31 36 29 20 (hiword) << 16)
6840: 7c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 | (unsigned long
6850: 29 20 28 6c 6f 77 6f 72 64 29 29 0a 23 64 65 66 ) (loword)).#def
6860: 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 65 73 ine tramp_addres
6870: 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 s(function) \.
6880: 20 68 69 6c 6f 28 2a 28 75 6e 73 69 67 6e 65 64 hilo(*(unsigned
6890: 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 short *) (funct
68a0: 69 6f 6e 20 2b 31 30 29 2c 20 2a 28 75 6e 73 69 ion +10), *(unsi
68b0: 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 gned short *) (f
68c0: 75 6e 63 74 69 6f 6e 20 2b 31 34 29 29 0a 23 64 unction +14)).#d
68d0: 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 efine tramp_data
68e0: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 (function) \.
68f0: 68 69 6c 6f 28 2a 28 75 6e 73 69 67 6e 65 64 20 hilo(*(unsigned
6900: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
6910: 6f 6e 20 2b 20 32 29 2c 20 2a 28 75 6e 73 69 67 on + 2), *(unsig
6920: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 ned short *) (fu
6930: 6e 63 74 69 6f 6e 20 2b 20 36 29 29 0a 23 65 6e nction + 6)).#en
6940: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 70 6f 77 dif.#ifdef __pow
6950: 65 72 70 63 61 69 78 5f 5f 0a 20 20 2f 2a 20 66 erpcaix__. /* f
6960: 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 unction:. *
6970: 20 2e 6c 6f 6e 67 20 2e 74 72 61 6d 70 5f 72 0a .long .tramp_r.
6980: 20 20 20 2a 20 20 20 20 2e 6c 6f 6e 67 20 2e 6d * .long .m
6990: 79 74 6f 63 0a 20 20 20 2a 20 20 20 20 2e 6c 6f ytoc. * .lo
69a0: 6e 67 20 30 0a 20 20 20 2a 20 2e 6d 79 74 6f 63 ng 0. * .mytoc
69b0: 3a 0a 20 20 20 2a 20 20 20 20 2e 6c 6f 6e 67 20 :. * .long
69c0: 3c 64 61 74 61 3e 0a 20 20 20 2a 20 20 20 20 2e <data>. * .
69d0: 6c 6f 6e 67 20 3c 61 64 64 72 65 73 73 3e 0a 20 long <address>.
69e0: 20 20 2a 2f 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 */. *(long *)
69f0: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 (function + 0)
6a00: 20 3d 20 28 28 6c 6f 6e 67 20 2a 29 20 26 74 72 = ((long *) &tr
6a10: 61 6d 70 5f 72 29 5b 30 5d 3b 0a 20 20 2a 28 6c amp_r)[0];. *(l
6a20: 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f ong *) (functio
6a30: 6e 20 2b 20 34 29 20 3d 20 28 6c 6f 6e 67 29 20 n + 4) = (long)
6a40: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 31 32 29 3b (function + 12);
6a50: 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 . *(long *) (f
6a60: 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 30 unction + 8) = 0
6a70: 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 ;. *(long *) (
6a80: 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d 20 function +12) =
6a90: 28 6c 6f 6e 67 29 20 64 61 74 61 3b 0a 20 20 2a (long) data;. *
6aa0: 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 (long *) (funct
6ab0: 69 6f 6e 20 2b 31 36 29 20 3d 20 28 6c 6f 6e 67 ion +16) = (long
6ac0: 29 20 61 64 64 72 65 73 73 3b 0a 23 64 65 66 69 ) address;.#defi
6ad0: 6e 65 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 ne is_tramp(func
6ae0: 74 69 6f 6e 29 20 20 5c 0a 20 20 28 28 6c 6f 6e tion) \. ((lon
6af0: 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 30 g *) function)[0
6b00: 5d 20 3d 3d 20 28 28 6c 6f 6e 67 20 2a 29 20 26 ] == ((long *) &
6b10: 74 72 61 6d 70 5f 72 29 5b 30 5d 0a 23 64 65 66 tramp_r)[0].#def
6b20: 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 65 73 ine tramp_addres
6b30: 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 s(function) \.
6b40: 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 ((long *) funct
6b50: 69 6f 6e 29 5b 34 5d 0a 23 64 65 66 69 6e 65 20 ion)[4].#define
6b60: 74 72 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 74 tramp_data(funct
6b70: 69 6f 6e 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 ion) \. ((long
6b80: 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 33 5d *) function)[3]
6b90: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f .#endif.#ifdef _
6ba0: 5f 70 6f 77 65 72 70 63 36 34 61 69 78 5f 5f 0a _powerpc64aix__.
6bb0: 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 /* function:.
6bc0: 20 20 2a 20 20 20 20 2e 71 75 61 64 20 2e 74 72 * .quad .tr
6bd0: 61 6d 70 5f 72 0a 20 20 20 2a 20 20 20 20 2e 71 amp_r. * .q
6be0: 75 61 64 20 2e 6d 79 74 6f 63 0a 20 20 20 2a 20 uad .mytoc. *
6bf0: 20 20 20 2e 71 75 61 64 20 30 0a 20 20 20 2a 20 .quad 0. *
6c00: 2e 6d 79 74 6f 63 3a 0a 20 20 20 2a 20 20 20 20 .mytoc:. *
6c10: 2e 71 75 61 64 20 3c 64 61 74 61 3e 0a 20 20 20 .quad <data>.
6c20: 2a 20 20 20 20 2e 71 75 61 64 20 3c 61 64 64 72 * .quad <addr
6c30: 65 73 73 3e 0a 20 20 20 2a 2f 0a 20 20 2a 28 6c ess>. */. *(l
6c40: 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f ong *) (functio
6c50: 6e 20 2b 20 30 29 20 3d 20 28 28 6c 6f 6e 67 20 n + 0) = ((long
6c60: 2a 29 20 26 74 72 61 6d 70 5f 72 29 5b 30 5d 3b *) &tramp_r)[0];
6c70: 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 . *(long *) (f
6c80: 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 28 unction + 8) = (
6c90: 6c 6f 6e 67 29 20 28 66 75 6e 63 74 69 6f 6e 20 long) (function
6ca0: 2b 20 32 34 29 3b 0a 20 20 2a 28 6c 6f 6e 67 20 + 24);. *(long
6cb0: 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 *) (function +1
6cc0: 36 29 20 3d 20 30 3b 0a 20 20 2a 28 6c 6f 6e 67 6) = 0;. *(long
6cd0: 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b *) (function +
6ce0: 32 34 29 20 3d 20 28 6c 6f 6e 67 29 20 64 61 74 24) = (long) dat
6cf0: 61 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 a;. *(long *)
6d00: 28 66 75 6e 63 74 69 6f 6e 20 2b 33 32 29 20 3d (function +32) =
6d10: 20 28 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 3b (long) address;
6d20: 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d .#define is_tram
6d30: 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 p(function) \.
6d40: 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 ((long *) funct
6d50: 69 6f 6e 29 5b 30 5d 20 3d 3d 20 28 28 6c 6f 6e ion)[0] == ((lon
6d60: 67 20 2a 29 20 26 74 72 61 6d 70 5f 72 29 5b 30 g *) &tramp_r)[0
6d70: 5d 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f ].#define tramp_
6d80: 61 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e address(function
6d90: 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 ) \. ((long *)
6da0: 20 66 75 6e 63 74 69 6f 6e 29 5b 34 5d 0a 23 64 function)[4].#d
6db0: 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 efine tramp_data
6dc0: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 (function) \.
6dd0: 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 ((long *) functi
6de0: 6f 6e 29 5b 33 5d 0a 23 65 6e 64 69 66 0a 23 69 on)[3].#endif.#i
6df0: 66 64 65 66 20 5f 5f 6d 38 38 6b 5f 5f 0a 20 20 fdef __m88k__.
6e00: 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 /* function:.
6e10: 2a 20 20 20 20 6f 72 2e 75 20 20 20 20 23 72 31 * or.u #r1
6e20: 31 2c 23 72 30 2c 68 69 31 36 28 3c 64 61 74 61 1,#r0,hi16(<data
6e30: 3e 29 09 09 35 44 20 36 30 20 68 69 31 36 28 3c >)..5D 60 hi16(<
6e40: 64 61 74 61 3e 29 0a 20 20 20 2a 20 20 20 20 6f data>). * o
6e50: 72 20 20 20 20 20 20 23 72 31 31 2c 23 72 31 31 r #r11,#r11
6e60: 2c 6c 6f 31 36 28 3c 64 61 74 61 3e 29 09 09 35 ,lo16(<data>)..5
6e70: 39 20 36 42 20 6c 6f 31 36 28 3c 64 61 74 61 3e 9 6B lo16(<data>
6e80: 29 0a 20 20 20 2a 20 20 20 20 6f 72 2e 75 20 20 ). * or.u
6e90: 20 20 23 72 31 33 2c 23 72 30 2c 68 69 31 36 28 #r13,#r0,hi16(
6ea0: 3c 61 64 64 72 65 73 73 3e 29 09 35 44 20 41 30 <address>).5D A0
6eb0: 20 68 69 31 36 28 3c 61 64 64 72 65 73 73 3e 29 hi16(<address>)
6ec0: 0a 20 20 20 2a 20 20 20 20 6f 72 20 20 20 20 20 . * or
6ed0: 20 23 72 31 33 2c 23 72 31 33 2c 6c 6f 31 36 28 #r13,#r13,lo16(
6ee0: 3c 61 64 64 72 65 73 73 3e 29 09 35 39 20 41 44 <address>).59 AD
6ef0: 20 6c 6f 31 36 28 3c 61 64 64 72 65 73 73 3e 29 lo16(<address>)
6f00: 0a 20 20 20 2a 20 20 20 20 6a 6d 70 20 20 20 20 . * jmp
6f10: 20 23 72 31 33 09 09 09 09 46 34 20 30 30 20 43 #r13....F4 00 C
6f20: 30 20 30 44 0a 20 20 20 2a 2f 0a 20 20 2a 28 73 0 0D. */. *(s
6f30: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f hort *) (functio
6f40: 6e 20 2b 20 30 29 20 3d 20 30 78 35 44 36 30 3b n + 0) = 0x5D60;
6f50: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 . *(short *) (f
6f60: 75 6e 63 74 69 6f 6e 20 2b 20 32 29 20 3d 20 28 unction + 2) = (
6f70: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 unsigned long) d
6f80: 61 74 61 20 3e 3e 20 31 36 3b 0a 20 20 2a 28 73 ata >> 16;. *(s
6f90: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f hort *) (functio
6fa0: 6e 20 2b 20 34 29 20 3d 20 30 78 35 39 36 42 3b n + 4) = 0x596B;
6fb0: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 . *(short *) (f
6fc0: 75 6e 63 74 69 6f 6e 20 2b 20 36 29 20 3d 20 28 unction + 6) = (
6fd0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 unsigned long) d
6fe0: 61 74 61 20 26 20 30 78 66 66 66 66 3b 0a 20 20 ata & 0xffff;.
6ff0: 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 *(short *) (func
7000: 74 69 6f 6e 20 2b 20 38 29 20 3d 20 30 78 35 44 tion + 8) = 0x5D
7010: 41 30 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 A0;. *(short *)
7020: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 30 29 20 (function +10)
7030: 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 = (unsigned long
7040: 29 20 61 64 64 72 65 73 73 20 3e 3e 20 31 36 3b ) address >> 16;
7050: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 . *(short *) (f
7060: 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d 20 30 unction +12) = 0
7070: 78 35 39 41 44 3b 0a 20 20 2a 28 73 68 6f 72 74 x59AD;. *(short
7080: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 *) (function +1
7090: 34 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 4) = (unsigned l
70a0: 6f 6e 67 29 20 61 64 64 72 65 73 73 20 26 20 30 ong) address & 0
70b0: 78 66 66 66 66 3b 0a 20 20 2a 28 6c 6f 6e 67 20 xffff;. *(long
70c0: 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 *) (function +1
70d0: 36 29 20 3d 20 30 78 46 34 30 30 43 30 30 44 3b 6) = 0xF400C00D;
70e0: 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d .#define is_tram
70f0: 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 p(function) \.
7100: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 *(unsigned shor
7110: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
7120: 20 30 29 20 3d 3d 20 30 78 35 44 36 30 20 26 26 0) == 0x5D60 &&
7130: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 \. *(unsigned
7140: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
7150: 6f 6e 20 2b 20 34 29 20 3d 3d 20 30 78 35 39 36 on + 4) == 0x596
7160: 42 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 B && \. *(unsig
7170: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 ned short *) (fu
7180: 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 3d 20 30 nction + 8) == 0
7190: 78 35 44 41 30 20 26 26 20 5c 0a 20 20 2a 28 75 x5DA0 && \. *(u
71a0: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 nsigned short *)
71b0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 (function +12)
71c0: 3d 3d 20 30 78 35 39 41 44 20 26 26 20 5c 0a 20 == 0x59AD && \.
71d0: 20 2a 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 *(unsigned long
71e0: 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b *) (function +
71f0: 31 36 29 20 3d 3d 20 30 78 46 34 30 30 43 30 30 16) == 0xF400C00
7200: 44 0a 23 64 65 66 69 6e 65 20 68 69 6c 6f 28 68 D.#define hilo(h
7210: 69 77 6f 72 64 2c 6c 6f 77 6f 72 64 29 20 20 5c iword,loword) \
7220: 0a 20 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c . (((unsigned l
7230: 6f 6e 67 29 20 28 68 69 77 6f 72 64 29 20 3c 3c ong) (hiword) <<
7240: 20 31 36 29 20 7c 20 28 75 6e 73 69 67 6e 65 64 16) | (unsigned
7250: 20 6c 6f 6e 67 29 20 28 6c 6f 77 6f 72 64 29 29 long) (loword))
7260: 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 61 .#define tramp_a
7270: 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e 29 ddress(function)
7280: 20 20 5c 0a 20 20 68 69 6c 6f 28 2a 28 75 6e 73 \. hilo(*(uns
7290: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 igned short *) (
72a0: 66 75 6e 63 74 69 6f 6e 20 2b 31 30 29 2c 20 2a function +10), *
72b0: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 (unsigned short
72c0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 34 *) (function +14
72d0: 29 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 )).#define tramp
72e0: 5f 64 61 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 _data(function)
72f0: 20 5c 0a 20 20 68 69 6c 6f 28 2a 28 75 6e 73 69 \. hilo(*(unsi
7300: 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 gned short *) (f
7310: 75 6e 63 74 69 6f 6e 20 2b 20 32 29 2c 20 2a 28 unction + 2), *(
7320: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a unsigned short *
7330: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 36 29 ) (function + 6)
7340: 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 ).#endif.#ifdef
7350: 5f 5f 63 6f 6e 76 65 78 5f 5f 0a 20 20 2f 2a 20 __convex__. /*
7360: 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 function:. *
7370: 20 20 6c 64 2e 77 20 23 3c 64 61 74 61 3e 2c 73 ld.w #<data>,s
7380: 30 09 09 09 09 3f 3f 3f 3f 20 3c 64 61 74 61 3e 0....???? <data>
7390: 0a 20 20 20 2a 20 20 20 20 6a 6d 70 20 3c 61 64 . * jmp <ad
73a0: 64 72 65 73 73 3e 09 09 09 09 30 31 34 30 20 3c dress>....0140 <
73b0: 61 64 64 72 65 73 73 3e 0a 20 20 20 2a 20 20 20 address>. *
73c0: 20 64 73 2e 68 20 30 09 09 09 09 09 30 30 30 30 ds.h 0.....0000
73d0: 0a 20 20 20 2a 2f 0a 20 20 2a 28 73 68 6f 72 74 . */. *(short
73e0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 *) (function +
73f0: 30 29 20 3d 20 30 78 3f 3f 3f 3f 3b 0a 20 20 2a 0) = 0x????;. *
7400: 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 (long *) (funct
7410: 69 6f 6e 20 2b 20 32 29 20 3d 20 28 75 6e 73 69 ion + 2) = (unsi
7420: 67 6e 65 64 20 6c 6f 6e 67 29 20 64 61 74 61 3b gned long) data;
7430: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 . *(short *) (f
7440: 75 6e 63 74 69 6f 6e 20 2b 20 36 29 20 3d 20 30 unction + 6) = 0
7450: 78 30 31 34 30 3b 0a 20 20 2a 28 6c 6f 6e 67 20 x0140;. *(long
7460: 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 *) (function +
7470: 38 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 8) = (unsigned l
7480: 6f 6e 67 29 20 61 64 64 72 65 73 73 3b 0a 20 20 ong) address;.
7490: 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 *(short *) (func
74a0: 74 69 6f 6e 20 2b 31 32 29 20 3d 20 30 78 30 30 tion +12) = 0x00
74b0: 30 30 3b 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 00;.#define is_t
74c0: 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 ramp(function)
74d0: 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 \. *(unsigned s
74e0: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f hort *) (functio
74f0: 6e 20 2b 20 30 29 20 3d 3d 20 30 78 3f 3f 3f 3f n + 0) == 0x????
7500: 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e && \. *(unsign
7510: 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e ed short *) (fun
7520: 63 74 69 6f 6e 20 2b 20 36 29 20 3d 3d 20 30 78 ction + 6) == 0x
7530: 30 31 34 30 20 26 26 20 5c 0a 20 20 2a 28 75 6e 0140 && \. *(un
7540: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 signed short *)
7550: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d (function +12) =
7560: 3d 20 30 78 30 30 30 30 0a 23 64 65 66 69 6e 65 = 0x0000.#define
7570: 20 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66 tramp_address(f
7580: 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 unction) \. *(
7590: 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 long *) (functi
75a0: 6f 6e 20 2b 20 38 29 0a 23 64 65 66 69 6e 65 20 on + 8).#define
75b0: 74 72 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 74 tramp_data(funct
75c0: 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 6c 6f 6e 67 ion) \. *(long
75d0: 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b *) (function +
75e0: 20 32 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 2).#endif.#ifde
75f0: 66 20 5f 5f 69 61 36 34 5f 5f 0a 20 20 2f 2a 20 f __ia64__. /*
7600: 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 function:. *
7610: 20 20 64 61 74 61 38 20 20 20 74 72 61 6d 70 5f data8 tramp_
7620: 72 0a 20 20 20 2a 20 20 20 20 64 61 74 61 38 20 r. * data8
7630: 20 20 63 6c 6f 73 75 72 65 0a 20 20 20 2a 20 63 closure. * c
7640: 6c 6f 73 75 72 65 3a 0a 20 20 20 2a 20 20 20 20 losure:. *
7650: 64 61 74 61 38 20 20 20 3c 61 64 64 72 65 73 73 data8 <address
7660: 3e 0a 20 20 20 2a 20 20 20 20 64 61 74 61 38 20 >. * data8
7670: 20 20 3c 64 61 74 61 3e 0a 20 20 20 2a 2f 0a 20 <data>. */.
7680: 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 *(long *) (func
7690: 74 69 6f 6e 20 2b 20 30 29 20 3d 20 28 6c 6f 6e tion + 0) = (lon
76a0: 67 29 20 26 74 72 61 6d 70 5f 72 3b 0a 20 20 2a g) &tramp_r;. *
76b0: 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 (long *) (functi
76c0: 6f 6e 20 2b 20 38 29 20 3d 20 28 6c 6f 6e 67 29 on + 8) = (long)
76d0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 31 36 29 (function + 16)
76e0: 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 ;. *(long *) (f
76f0: 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20 28 unction +16) = (
7700: 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 3b 0a 20 long) address;.
7710: 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 *(long *) (func
7720: 74 69 6f 6e 20 2b 32 34 29 20 3d 20 28 6c 6f 6e tion +24) = (lon
7730: 67 29 20 64 61 74 61 3b 0a 23 64 65 66 69 6e 65 g) data;.#define
7740: 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 is_tramp(functi
7750: 6f 6e 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 on) \. ((long
7760: 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 30 5d 20 *) function)[0]
7770: 3d 3d 20 28 6c 6f 6e 67 29 20 26 74 72 61 6d 70 == (long) &tramp
7780: 5f 72 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 _r.#define tramp
7790: 5f 61 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f _address(functio
77a0: 6e 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a n) \. ((long *
77b0: 29 20 66 75 6e 63 74 69 6f 6e 29 5b 32 5d 0a 23 ) function)[2].#
77c0: 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 define tramp_dat
77d0: 61 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 a(function) \.
77e0: 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 ((long *) funct
77f0: 69 6f 6e 29 5b 33 5d 0a 23 65 6e 64 69 66 0a 23 ion)[3].#endif.#
7800: 69 66 64 65 66 20 5f 5f 78 38 36 5f 36 34 5f 5f ifdef __x86_64__
7810: 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a . /* function:.
7820: 20 20 20 2a 20 20 20 20 6d 6f 76 61 62 73 71 20 * movabsq
7830: 24 3c 64 61 74 61 3e 2c 25 72 31 30 09 09 34 39 $<data>,%r10..49
7840: 20 42 41 20 3c 64 61 74 61 3e 0a 20 20 20 2a 20 BA <data>. *
7850: 20 20 20 6d 6f 76 61 62 73 71 20 24 3c 61 64 64 movabsq $<add
7860: 72 65 73 73 3e 2c 25 72 61 78 09 09 34 38 20 42 ress>,%rax..48 B
7870: 38 20 3c 61 64 64 72 65 73 73 3e 0a 20 20 20 2a 8 <address>. *
7880: 20 20 20 20 6a 6d 70 20 2a 25 72 61 78 09 09 09 jmp *%rax...
7890: 46 46 20 45 30 0a 20 20 20 2a 2f 0a 20 20 2a 28 FF E0. */. *(
78a0: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
78b0: 6f 6e 20 2b 20 30 29 20 3d 20 30 78 42 41 34 39 on + 0) = 0xBA49
78c0: 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 ;. *(short *) (
78d0: 66 75 6e 63 74 69 6f 6e 20 2b 20 32 29 20 3d 20 function + 2) =
78e0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
78f0: 64 61 74 61 20 26 20 30 78 66 66 66 66 3b 0a 20 data & 0xffff;.
7900: 20 2a 28 69 6e 74 20 2a 29 20 20 20 28 66 75 6e *(int *) (fun
7910: 63 74 69 6f 6e 20 2b 20 34 29 20 3d 20 28 28 75 ction + 4) = ((u
7920: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 61 nsigned long) da
7930: 74 61 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66 ta >> 16) & 0xff
7940: 66 66 66 66 66 66 3b 0a 20 20 2a 28 73 68 6f 72 ffffff;. *(shor
7950: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
7960: 20 38 29 20 3d 20 28 28 75 6e 73 69 67 6e 65 64 8) = ((unsigned
7970: 20 6c 6f 6e 67 29 20 64 61 74 61 20 3e 3e 20 34 long) data >> 4
7980: 38 29 20 26 20 30 78 66 66 66 66 3b 0a 20 20 2a 8) & 0xffff;. *
7990: 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 (short *) (funct
79a0: 69 6f 6e 20 2b 31 30 29 20 3d 20 30 78 42 38 34 ion +10) = 0xB84
79b0: 38 3b 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 8;. *(int *)
79c0: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d (function +12) =
79d0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
79e0: 20 61 64 64 72 65 73 73 20 26 20 30 78 66 66 66 address & 0xfff
79f0: 66 66 66 66 66 3b 0a 20 20 2a 28 69 6e 74 20 2a fffff;. *(int *
7a00: 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 ) (function +1
7a10: 36 29 20 3d 20 28 28 75 6e 73 69 67 6e 65 64 20 6) = ((unsigned
7a20: 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 20 3e 3e long) address >>
7a30: 20 33 32 29 20 26 20 30 78 66 66 66 66 66 66 66 32) & 0xfffffff
7a40: 66 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 f;. *(short *)
7a50: 28 66 75 6e 63 74 69 6f 6e 20 2b 32 30 29 20 3d (function +20) =
7a60: 20 30 78 45 30 46 46 3b 0a 23 64 65 66 69 6e 65 0xE0FF;.#define
7a70: 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 is_tramp(functi
7a80: 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67 on) \. *(unsig
7a90: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 ned short *) (fu
7aa0: 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 3d 20 30 nction + 0) == 0
7ab0: 78 42 41 34 39 20 26 26 20 5c 0a 20 20 2a 28 75 xBA49 && \. *(u
7ac0: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 nsigned short *)
7ad0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 30 29 20 (function +10)
7ae0: 3d 3d 20 30 78 42 38 34 38 20 26 26 20 5c 0a 20 == 0xB848 && \.
7af0: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 *(unsigned shor
7b00: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
7b10: 32 30 29 20 3d 3d 20 30 78 45 30 46 46 0a 23 64 20) == 0xE0FF.#d
7b20: 65 66 69 6e 65 20 68 69 6c 6f 28 68 69 77 6f 72 efine hilo(hiwor
7b30: 64 2c 6c 6f 77 6f 72 64 29 20 20 5c 0a 20 20 28 d,loword) \. (
7b40: 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 ((unsigned long)
7b50: 20 28 68 69 77 6f 72 64 29 20 3c 3c 20 33 32 29 (hiword) << 32)
7b60: 20 7c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e | (unsigned lon
7b70: 67 29 20 28 6c 6f 77 6f 72 64 29 29 0a 23 64 65 g) (loword)).#de
7b80: 66 69 6e 65 20 68 69 6d 69 64 6c 6f 28 68 69 73 fine himidlo(his
7b90: 68 6f 72 74 2c 6d 69 64 77 6f 72 64 2c 6c 6f 73 hort,midword,los
7ba0: 68 6f 72 74 29 20 20 5c 0a 20 20 28 28 28 75 6e hort) \. (((un
7bb0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 68 69 signed long) (hi
7bc0: 73 68 6f 72 74 29 20 3c 3c 20 34 38 29 20 7c 20 short) << 48) |
7bd0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
7be0: 28 6d 69 64 77 6f 72 64 29 20 3c 3c 20 31 36 20 (midword) << 16
7bf0: 5c 0a 20 20 20 7c 20 28 75 6e 73 69 67 6e 65 64 \. | (unsigned
7c00: 20 6c 6f 6e 67 29 20 28 6c 6f 73 68 6f 72 74 29 long) (loshort)
7c10: 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f ).#define tramp_
7c20: 61 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e address(function
7c30: 29 20 20 5c 0a 20 20 68 69 6c 6f 28 2a 28 75 6e ) \. hilo(*(un
7c40: 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 28 66 signed int *) (f
7c50: 75 6e 63 74 69 6f 6e 20 2b 31 36 29 2c 20 2a 28 unction +16), *(
7c60: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 unsigned int *)
7c70: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 29 0a (function +12)).
7c80: 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 #define tramp_da
7c90: 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a ta(function) \.
7ca0: 20 20 68 69 6d 69 64 6c 6f 28 2a 28 75 6e 73 69 himidlo(*(unsi
7cb0: 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 gned short *) (f
7cc0: 75 6e 63 74 69 6f 6e 20 2b 20 38 29 2c 20 5c 0a unction + 8), \.
7cd0: 20 20 20 20 20 20 20 20 20 20 2a 28 75 6e 73 69 *(unsi
7ce0: 67 6e 65 64 20 69 6e 74 20 2a 29 20 20 20 28 66 gned int *) (f
7cf0: 75 6e 63 74 69 6f 6e 20 2b 20 34 29 2c 20 5c 0a unction + 4), \.
7d00: 20 20 20 20 20 20 20 20 20 20 2a 28 75 6e 73 69 *(unsi
7d10: 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 gned short *) (f
7d20: 75 6e 63 74 69 6f 6e 20 2b 20 32 29 29 0a 23 65 unction + 2)).#e
7d30: 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 73 33 ndif.#ifdef __s3
7d40: 39 30 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 69 90__. /* functi
7d50: 6f 6e 3a 0a 0a 20 20 20 20 20 20 20 20 62 72 61 on:.. bra
7d60: 73 20 20 20 20 25 72 31 2c 2e 4c 54 4e 30 5f 30 s %r1,.LTN0_0
7d70: 0a 2e 4c 54 30 5f 30 3a 0a 2e 4c 43 30 3a 0a 20 ..LT0_0:..LC0:.
7d80: 20 20 20 20 20 20 20 2e 6c 6f 6e 67 20 20 20 30 .long 0
7d90: 78 37 33 35 35 34 37 31 31 0a 2e 4c 43 31 3a 0a x73554711..LC1:.
7da0: 20 20 20 20 20 20 20 20 2e 6c 6f 6e 67 20 20 20 .long
7db0: 30 78 62 61 62 65 62 65 63 30 0a 2e 4c 54 4e 30 0xbabebec0..LTN0
7dc0: 5f 30 3a 0a 20 20 20 20 20 20 20 20 6c 20 20 20 _0:. l
7dd0: 20 20 20 20 25 72 30 2c 2e 4c 43 30 2d 2e 4c 54 %r0,.LC0-.LT
7de0: 30 5f 30 28 25 72 31 29 0a 20 20 20 20 20 20 20 0_0(%r1).
7df0: 20 6c 20 20 20 20 20 20 20 25 72 31 2c 2e 4c 43 l %r1,.LC
7e00: 31 2d 2e 4c 54 31 5f 30 28 25 72 31 29 0a 20 20 1-.LT1_0(%r1).
7e10: 20 20 20 20 20 20 62 72 20 20 20 20 20 20 25 72 br %r
7e20: 31 0a 20 20 2a 2f 0a 20 20 2f 2a 20 57 68 61 74 1. */. /* What
7e30: 20 61 62 6f 75 74 20 62 69 67 20 65 6e 64 69 61 about big endia
7e40: 6e 20 2f 20 6c 69 74 74 6c 65 20 65 6e 64 69 61 n / little endia
7e50: 6e 20 3f 3f 20 2a 2f 0a 20 20 2a 28 75 6e 73 69 n ?? */. *(unsi
7e60: 67 6e 65 64 20 69 6e 74 20 2a 29 20 20 20 28 66 gned int *) (f
7e70: 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20 30 unction + 0) = 0
7e80: 78 41 37 31 35 30 30 30 36 3b 0a 20 20 2a 28 75 xA7150006;. *(u
7e90: 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 20 nsigned int *)
7ea0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 (function + 4)
7eb0: 3d 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 = (unsigned int)
7ec0: 20 64 61 74 61 3b 0a 20 20 2a 28 75 6e 73 69 67 data;. *(unsig
7ed0: 6e 65 64 20 69 6e 74 20 2a 29 20 20 20 28 66 75 ned int *) (fu
7ee0: 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 28 75 nction + 8) = (u
7ef0: 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 61 64 64 nsigned int) add
7f00: 72 65 73 73 3b 0a 20 20 2a 28 75 6e 73 69 67 6e ress;. *(unsign
7f10: 65 64 20 69 6e 74 20 2a 29 20 20 20 28 66 75 6e ed int *) (fun
7f20: 63 74 69 6f 6e 20 2b 31 32 29 20 3d 20 30 78 35 ction +12) = 0x5
7f30: 38 30 30 31 30 30 30 3b 0a 20 20 2a 28 75 6e 73 8001000;. *(uns
7f40: 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 20 20 28 igned int *) (
7f50: 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20 function +16) =
7f60: 30 78 35 38 31 30 31 30 30 34 3b 0a 20 20 2a 28 0x58101004;. *(
7f70: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a unsigned short *
7f80: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 30 29 ) (function +20)
7f90: 20 3d 20 30 78 30 37 66 31 3b 0a 23 64 65 66 69 = 0x07f1;.#defi
7fa0: 6e 65 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 ne is_tramp(func
7fb0: 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 69 6e 74 tion) \. *(int
7fc0: 20 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 28 *) (
7fd0: 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 3d function + 0) ==
7fe0: 20 30 78 41 37 31 35 30 30 30 36 20 26 26 20 5c 0xA7150006 && \
7ff0: 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 20 20 . *(int *)
8000: 20 20 20 20 20 20 20 28 66 75 6e 63 74 69 6f 6e (function
8010: 20 2b 31 32 29 20 3d 3d 20 30 78 35 38 30 30 31 +12) == 0x58001
8020: 30 30 30 20 26 26 20 5c 0a 20 20 2a 28 69 6e 74 000 && \. *(int
8030: 20 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 28 *) (
8040: 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 3d function +16) ==
8050: 20 30 78 35 38 31 30 31 30 30 34 20 26 26 20 5c 0x58101004 && \
8060: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 20 20 . *(short *)
8070: 20 20 20 20 20 20 20 28 66 75 6e 63 74 69 6f 6e (function
8080: 20 2b 32 30 29 20 3d 3d 20 30 78 30 37 66 31 0a +20) == 0x07f1.
8090: 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 #define tramp_ad
80a0: 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 dress(function)
80b0: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 \. *(unsigned
80c0: 69 6e 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e int *) (function
80d0: 20 2b 38 29 0a 23 64 65 66 69 6e 65 20 74 72 61 +8).#define tra
80e0: 6d 70 5f 64 61 74 61 28 66 75 6e 63 74 69 6f 6e mp_data(function
80f0: 29 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 ) \. *(unsigne
8100: 64 20 69 6e 74 20 2a 29 20 28 66 75 6e 63 74 69 d int *) (functi
8110: 6f 6e 20 2b 34 29 0a 23 65 6e 64 69 66 0a 20 20 on +4).#endif.
8120: 2f 2a 0a 20 20 20 2a 20 64 61 74 61 3a 0a 20 20 /*. * data:.
8130: 20 2a 20 20 20 20 3c 64 61 74 61 30 3e 09 09 09 * <data0>...
8140: 09 3c 64 61 74 61 30 3e 0a 20 20 20 2a 20 20 20 .<data0>. *
8150: 20 3c 64 61 74 61 31 3e 09 09 09 09 3c 64 61 74 <data1>....<dat
8160: 61 31 3e 0a 20 20 20 2a 2f 0a 20 20 2a 28 6c 6f a1>. */. *(lo
8170: 6e 67 20 2a 29 20 20 28 64 61 74 61 20 2b 20 30 ng *) (data + 0
8180: 2a 73 69 7a 65 6f 66 28 76 6f 69 64 2a 29 29 20 *sizeof(void*))
8190: 3d 20 28 6c 6f 6e 67 29 20 64 61 74 61 30 3b 0a = (long) data0;.
81a0: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 64 61 *(long *) (da
81b0: 74 61 20 2b 20 31 2a 73 69 7a 65 6f 66 28 76 6f ta + 1*sizeof(vo
81c0: 69 64 2a 29 29 20 3d 20 28 6c 6f 6e 67 29 20 64 id*)) = (long) d
81d0: 61 74 61 31 3b 0a 0a 20 20 2f 2a 20 33 2e 20 53 ata1;.. /* 3. S
81e0: 65 74 20 6d 65 6d 6f 72 79 20 70 72 6f 74 65 63 et memory protec
81f0: 74 69 6f 6e 20 74 6f 20 22 65 78 65 63 75 74 61 tion to "executa
8200: 62 6c 65 22 20 2a 2f 0a 0a 23 69 66 20 21 64 65 ble" */..#if !de
8210: 66 69 6e 65 64 28 43 4f 44 45 5f 45 58 45 43 55 fined(CODE_EXECU
8220: 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 TABLE) && define
8230: 64 28 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41 d(EXECUTABLE_VIA
8240: 5f 4d 50 52 4f 54 45 43 54 29 0a 20 20 2f 2a 20 _MPROTECT). /*
8250: 43 61 6c 6c 20 6d 70 72 6f 74 65 63 74 20 6f 6e Call mprotect on
8260: 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20 the pages that
8270: 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 61 6e 67 contain the rang
8280: 65 2e 20 2a 2f 0a 20 20 7b 20 75 6e 73 69 67 6e e. */. { unsign
8290: 65 64 20 6c 6f 6e 67 20 73 74 61 72 74 5f 61 64 ed long start_ad
82a0: 64 72 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c dr = (unsigned l
82b0: 6f 6e 67 29 20 66 75 6e 63 74 69 6f 6e 3b 0a 20 ong) function;.
82c0: 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 unsigned long
82d0: 20 65 6e 64 5f 61 64 64 72 20 3d 20 28 75 6e 73 end_addr = (uns
82e0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 66 75 6e igned long) (fun
82f0: 63 74 69 6f 6e 20 2b 20 54 52 41 4d 50 5f 4c 45 ction + TRAMP_LE
8300: 4e 47 54 48 29 3b 0a 20 20 20 20 73 74 61 72 74 NGTH);. start
8310: 5f 61 64 64 72 20 3d 20 73 74 61 72 74 5f 61 64 _addr = start_ad
8320: 64 72 20 26 20 2d 70 61 67 65 73 69 7a 65 3b 0a dr & -pagesize;.
8330: 20 20 20 20 65 6e 64 5f 61 64 64 72 20 3d 20 28 end_addr = (
8340: 65 6e 64 5f 61 64 64 72 20 2b 20 70 61 67 65 73 end_addr + pages
8350: 69 7a 65 2d 31 29 20 26 20 2d 70 61 67 65 73 69 ize-1) & -pagesi
8360: 7a 65 3b 0a 20 20 20 7b 75 6e 73 69 67 6e 65 64 ze;. {unsigned
8370: 20 6c 6f 6e 67 20 6c 65 6e 20 3d 20 65 6e 64 5f long len = end_
8380: 61 64 64 72 20 2d 20 73 74 61 72 74 5f 61 64 64 addr - start_add
8390: 72 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 r;.#if defined(H
83a0: 41 56 45 5f 4d 41 43 48 5f 56 4d 29 0a 20 20 20 AVE_MACH_VM).
83b0: 20 69 66 20 28 76 6d 5f 70 72 6f 74 65 63 74 28 if (vm_protect(
83c0: 74 61 73 6b 5f 73 65 6c 66 28 29 2c 73 74 61 72 task_self(),star
83d0: 74 5f 61 64 64 72 2c 6c 65 6e 2c 30 2c 56 4d 5f t_addr,len,0,VM_
83e0: 50 52 4f 54 5f 52 45 41 44 7c 56 4d 5f 50 52 4f PROT_READ|VM_PRO
83f0: 54 5f 57 52 49 54 45 7c 56 4d 5f 50 52 4f 54 5f T_WRITE|VM_PROT_
8400: 45 58 45 43 55 54 45 29 20 21 3d 20 4b 45 52 4e EXECUTE) != KERN
8410: 5f 53 55 43 43 45 53 53 29 0a 23 65 6c 73 65 0a _SUCCESS).#else.
8420: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 6f #if defined(__co
8430: 6e 76 65 78 5f 5f 29 0a 20 20 20 20 2f 2a 20 43 nvex__). /* C
8440: 6f 6e 76 65 78 20 4f 53 20 63 61 6c 6c 73 20 69 onvex OS calls i
8450: 74 20 60 6d 72 65 6d 61 70 28 29 27 2e 20 2a 2f t `mremap()'. */
8460: 0a 20 20 20 20 6d 72 65 6d 61 70 28 73 74 61 72 . mremap(star
8470: 74 5f 61 64 64 72 2c 20 26 6c 65 6e 2c 20 50 52 t_addr, &len, PR
8480: 4f 54 5f 52 45 41 44 7c 50 52 4f 54 5f 57 52 49 OT_READ|PROT_WRI
8490: 54 45 7c 50 52 4f 54 5f 45 58 45 43 2c 20 4d 41 TE|PROT_EXEC, MA
84a0: 50 5f 50 52 49 56 41 54 45 29 3b 0a 20 20 20 20 P_PRIVATE);.
84b0: 69 66 20 28 30 29 0a 23 65 6c 73 65 0a 23 69 66 if (0).#else.#if
84c0: 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 53 59 defined(HAVE_SY
84d0: 53 5f 4d 38 38 4b 42 43 53 5f 48 29 0a 20 20 20 S_M88KBCS_H).
84e0: 20 69 66 20 28 6d 65 6d 63 74 6c 28 73 74 61 72 if (memctl(star
84f0: 74 5f 61 64 64 72 2c 20 6c 65 6e 2c 20 4d 43 54 t_addr, len, MCT
8500: 5f 54 45 58 54 29 20 3d 3d 20 2d 31 29 0a 23 65 _TEXT) == -1).#e
8510: 6c 73 65 0a 20 20 20 20 69 66 20 28 6d 70 72 6f lse. if (mpro
8520: 74 65 63 74 28 28 76 6f 69 64 2a 29 73 74 61 72 tect((void*)star
8530: 74 5f 61 64 64 72 2c 20 6c 65 6e 2c 20 50 52 4f t_addr, len, PRO
8540: 54 5f 52 45 41 44 7c 50 52 4f 54 5f 57 52 49 54 T_READ|PROT_WRIT
8550: 45 7c 50 52 4f 54 5f 45 58 45 43 29 20 3c 20 30 E|PROT_EXEC) < 0
8560: 29 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a ).#endif.#endif.
8570: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 20 66 #endif. { f
8580: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 74 printf(stderr,"t
8590: 72 61 6d 70 6f 6c 69 6e 65 3a 20 63 61 6e 6e 6f rampoline: canno
85a0: 74 20 6d 61 6b 65 20 6d 65 6d 6f 72 79 20 65 78 t make memory ex
85b0: 65 63 75 74 61 62 6c 65 5c 6e 22 29 3b 20 61 62 ecutable\n"); ab
85c0: 6f 72 74 28 29 3b 20 7d 0a 20 20 7d 7d 0a 23 65 ort(); }. }}.#e
85d0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 34 2e 20 46 6c ndif.. /* 4. Fl
85e0: 75 73 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 ush instruction
85f0: 63 61 63 68 65 20 2a 2f 0a 20 20 2f 2a 20 57 65 cache */. /* We
8600: 20 6e 65 65 64 20 74 68 69 73 20 62 65 63 61 75 need this becau
8610: 73 65 20 73 6f 6d 65 20 43 50 55 73 20 68 61 76 se some CPUs hav
8620: 65 20 73 65 70 61 72 61 74 65 20 64 61 74 61 20 e separate data
8630: 63 61 63 68 65 20 61 6e 64 20 69 6e 73 74 72 75 cache and instru
8640: 63 74 69 6f 6e 0a 20 20 20 2a 20 63 61 63 68 65 ction. * cache
8650: 2e 20 54 68 65 20 66 72 65 73 68 6c 79 20 62 75 . The freshly bu
8660: 69 6c 74 20 74 72 61 6d 70 6f 6c 69 6e 65 20 69 ilt trampoline i
8670: 73 20 76 69 73 69 62 6c 65 20 74 6f 20 74 68 65 s visible to the
8680: 20 64 61 74 61 20 63 61 63 68 65 2c 20 62 75 74 data cache, but
8690: 20 6e 6f 74 0a 20 20 20 2a 20 6d 61 79 62 65 20 not. * maybe
86a0: 6e 6f 74 20 74 6f 20 74 68 65 20 69 6e 73 74 72 not to the instr
86b0: 75 63 74 69 6f 6e 20 63 61 63 68 65 2e 20 54 68 uction cache. Th
86c0: 69 73 20 69 73 20 68 61 69 72 79 2e 0a 20 20 20 is is hairy..
86d0: 2a 2f 0a 23 69 66 20 21 28 64 65 66 69 6e 65 64 */.#if !(defined
86e0: 28 5f 5f 68 70 70 61 6e 65 77 5f 5f 29 20 7c 7c (__hppanew__) ||
86f0: 20 64 65 66 69 6e 65 64 28 5f 5f 70 6f 77 65 72 defined(__power
8700: 70 63 61 69 78 5f 5f 29 20 7c 7c 20 64 65 66 69 pcaix__) || defi
8710: 6e 65 64 28 5f 5f 70 6f 77 65 72 70 63 36 34 61 ned(__powerpc64a
8720: 69 78 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 ix__) || defined
8730: 28 5f 5f 69 61 36 34 5f 5f 29 29 0a 20 20 2f 2a (__ia64__)). /*
8740: 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 69 66 20 Only needed if
8750: 77 65 20 72 65 61 6c 6c 79 20 73 65 74 20 75 70 we really set up
8760: 20 6d 61 63 68 69 6e 65 20 69 6e 73 74 72 75 63 machine instruc
8770: 74 69 6f 6e 73 2e 20 2a 2f 0a 23 69 66 64 65 66 tions. */.#ifdef
8780: 20 5f 5f 69 33 38 36 5f 5f 0a 23 69 66 20 64 65 __i386__.#if de
8790: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a 20 20 fined(_WIN32).
87a0: 77 68 69 6c 65 20 28 21 46 6c 75 73 68 49 6e 73 while (!FlushIns
87b0: 74 72 75 63 74 69 6f 6e 43 61 63 68 65 28 47 65 tructionCache(Ge
87c0: 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 28 tCurrentProcess(
87d0: 29 2c 66 75 6e 63 74 69 6f 6e 2c 54 52 41 4d 50 ),function,TRAMP
87e0: 5f 4c 45 4e 47 54 48 29 29 0a 20 20 20 20 63 6f _LENGTH)). co
87f0: 6e 74 69 6e 75 65 3b 0a 23 65 6e 64 69 66 0a 23 ntinue;.#endif.#
8800: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d endif.#ifdef __m
8810: 36 38 6b 5f 5f 0a 23 69 66 20 64 65 66 69 6e 65 68k__.#if define
8820: 64 28 4e 65 58 54 29 20 26 26 20 64 65 66 69 6e d(NeXT) && defin
8830: 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a 20 20 5f ed(__GNUC__). _
8840: 5f 61 73 6d 5f 5f 20 5f 5f 76 6f 6c 61 74 69 6c _asm__ __volatil
8850: 65 5f 5f 20 28 22 74 72 61 70 20 23 32 22 29 3b e__ ("trap #2");
8860: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 .#endif.#if defi
8870: 6e 65 64 28 41 4d 49 47 41 29 0a 20 20 43 61 63 ned(AMIGA). Cac
8880: 68 65 43 6c 65 61 72 45 28 66 75 6e 63 74 69 6f heClearE(functio
8890: 6e 2c 54 52 41 4d 50 5f 4c 45 4e 47 54 48 2c 43 n,TRAMP_LENGTH,C
88a0: 41 43 52 46 5f 43 6c 65 61 72 49 7c 43 41 43 52 ACRF_ClearI|CACR
88b0: 46 5f 43 6c 65 61 72 44 29 3b 0a 23 65 6e 64 69 F_ClearD);.#endi
88c0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 61 70 f.#if defined(ap
88d0: 6f 6c 6c 6f 29 0a 20 20 63 61 63 68 65 5f 24 63 ollo). cache_$c
88e0: 6c 65 61 72 28 29 3b 0a 23 65 6e 64 69 66 0a 23 lear();.#endif.#
88f0: 69 66 20 64 65 66 69 6e 65 64 28 68 70 75 78 29 if defined(hpux)
8900: 0a 20 20 63 61 63 68 65 63 74 6c 28 43 43 5f 49 . cachectl(CC_I
8910: 50 55 52 47 45 2c 66 75 6e 63 74 69 6f 6e 2c 54 PURGE,function,T
8920: 52 41 4d 50 5f 4c 45 4e 47 54 48 29 3b 0a 23 65 RAMP_LENGTH);.#e
8930: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
8940: 28 5f 5f 4e 65 74 42 53 44 5f 5f 29 20 26 26 20 (__NetBSD__) &&
8950: 64 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f defined(__GNUC__
8960: 29 0a 20 20 7b 20 72 65 67 69 73 74 65 72 20 75 ). { register u
8970: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 5f 62 65 nsigned long _be
8980: 67 20 5f 5f 61 73 6d 5f 5f 20 28 22 25 61 31 22 g __asm__ ("%a1"
8990: 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f ) = (unsigned lo
89a0: 6e 67 29 20 66 75 6e 63 74 69 6f 6e 3b 0a 20 20 ng) function;.
89b0: 20 20 72 65 67 69 73 74 65 72 20 75 6e 73 69 67 register unsig
89c0: 6e 65 64 20 6c 6f 6e 67 20 5f 6c 65 6e 20 5f 5f ned long _len __
89d0: 61 73 6d 5f 5f 20 28 22 25 64 31 22 29 20 3d 20 asm__ ("%d1") =
89e0: 54 52 41 4d 50 5f 4c 45 4e 47 54 48 3b 0a 20 20 TRAMP_LENGTH;.
89f0: 20 20 5f 5f 61 73 6d 5f 5f 20 5f 5f 76 6f 6c 61 __asm__ __vola
8a00: 74 69 6c 65 5f 5f 20 28 0a 20 20 20 20 20 20 22 tile__ (. "
8a10: 6d 6f 76 65 25 2e 6c 20 25 23 30 78 38 30 30 30 move%.l %#0x8000
8a20: 30 30 30 34 2c 25 2f 64 30 5c 6e 5c 74 22 20 2f 0004,%/d0\n\t" /
8a30: 2a 20 43 43 5f 45 58 54 50 55 52 47 45 20 7c 20 * CC_EXTPURGE |
8a40: 43 5f 49 50 55 52 47 45 20 2a 2f 0a 20 20 20 20 C_IPURGE */.
8a50: 20 20 22 74 72 61 70 20 23 31 32 22 20 20 20 20 "trap #12"
8a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8a70: 20 20 2f 2a 20 6b 65 72 6e 65 6c 20 63 61 6c 6c /* kernel call
8a80: 20 60 63 61 63 68 65 63 74 6c 27 20 2a 2f 0a 20 `cachectl' */.
8a90: 20 20 20 20 20 3a 0a 20 20 20 20 20 20 3a 20 22 :. : "
8aa0: 61 22 20 28 5f 62 65 67 29 2c 20 22 64 22 20 28 a" (_beg), "d" (
8ab0: 5f 6c 65 6e 29 0a 20 20 20 20 20 20 3a 20 22 25 _len). : "%
8ac0: 61 30 22 2c 20 22 25 61 31 22 2c 20 22 25 64 30 a0", "%a1", "%d0
8ad0: 22 2c 20 22 25 64 31 22 20 20 20 20 2f 2a 20 63 ", "%d1" /* c
8ae0: 61 6c 6c 2d 75 73 65 64 20 72 65 67 69 73 74 65 all-used registe
8af0: 72 73 20 2a 2f 0a 20 20 20 20 20 20 29 3b 0a 20 rs */. );.
8b00: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 }.#endif.#if de
8b10: 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 fined(__linux__)
8b20: 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e && defined(__GN
8b30: 55 43 5f 5f 29 0a 20 20 7b 20 72 65 67 69 73 74 UC__). { regist
8b40: 65 72 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 er unsigned long
8b50: 20 5f 62 65 67 20 5f 5f 61 73 6d 5f 5f 20 28 22 _beg __asm__ ("
8b60: 25 64 31 22 29 20 3d 20 28 75 6e 73 69 67 6e 65 %d1") = (unsigne
8b70: 64 20 6c 6f 6e 67 29 20 66 75 6e 63 74 69 6f 6e d long) function
8b80: 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 75 ;. register u
8b90: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 5f 6c 65 nsigned long _le
8ba0: 6e 20 5f 5f 61 73 6d 5f 5f 20 28 22 25 64 34 22 n __asm__ ("%d4"
8bb0: 29 20 3d 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 ) = TRAMP_LENGTH
8bc0: 20 2b 20 33 32 3b 0a 20 20 20 20 5f 5f 61 73 6d + 32;. __asm
8bd0: 5f 5f 20 5f 5f 76 6f 6c 61 74 69 6c 65 5f 5f 20 __ __volatile__
8be0: 28 0a 20 20 20 20 20 20 22 6d 6f 76 65 25 2e 6c (. "move%.l
8bf0: 20 25 23 31 32 33 2c 25 2f 64 30 5c 6e 5c 74 22 %#123,%/d0\n\t"
8c00: 0a 20 20 20 20 20 20 22 6d 6f 76 65 25 2e 6c 20 . "move%.l
8c10: 25 23 31 2c 25 2f 64 32 5c 6e 5c 74 22 0a 20 20 %#1,%/d2\n\t".
8c20: 20 20 20 20 22 6d 6f 76 65 25 2e 6c 20 25 23 33 "move%.l %#3
8c30: 2c 25 2f 64 33 5c 6e 5c 74 22 0a 20 20 20 20 20 ,%/d3\n\t".
8c40: 20 22 74 72 61 70 20 25 23 30 22 0a 20 20 20 20 "trap %#0".
8c50: 20 20 3a 0a 20 20 20 20 20 20 3a 20 22 64 22 20 :. : "d"
8c60: 28 5f 62 65 67 29 2c 20 22 64 22 20 28 5f 6c 65 (_beg), "d" (_le
8c70: 6e 29 0a 20 20 20 20 20 20 3a 20 22 25 64 30 22 n). : "%d0"
8c80: 2c 20 22 25 64 32 22 2c 20 22 25 64 33 22 0a 20 , "%d2", "%d3".
8c90: 20 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 );. }.#end
8ca0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 41 if.#if defined(A
8cb0: 55 58 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f UX) && defined(_
8cc0: 5f 47 4e 55 43 5f 5f 29 0a 20 20 2f 2a 20 73 79 _GNUC__). /* sy
8cd0: 73 6d 36 38 6b 28 31 30 35 2c 20 61 64 64 72 2c sm68k(105, addr,
8ce0: 20 73 63 6f 70 65 2c 20 63 61 63 68 65 2c 20 6c scope, cache, l
8cf0: 65 6e 29 20 2a 2f 0a 20 20 5f 5f 61 73 6d 5f 5f en) */. __asm__
8d00: 20 5f 5f 76 6f 6c 61 74 69 6c 65 5f 5f 20 28 0a __volatile__ (.
8d10: 20 20 20 20 22 6d 6f 76 65 25 2e 6c 20 25 31 2c "move%.l %1,
8d20: 25 2f 73 70 40 2d 5c 6e 5c 74 22 0a 20 20 20 20 %/sp@-\n\t".
8d30: 22 6d 6f 76 65 25 2e 6c 20 25 23 33 2c 25 2f 73 "move%.l %#3,%/s
8d40: 70 40 2d 5c 6e 5c 74 22 0a 20 20 20 20 22 6d 6f p@-\n\t". "mo
8d50: 76 65 25 2e 6c 20 25 23 31 2c 25 2f 73 70 40 2d ve%.l %#1,%/sp@-
8d60: 5c 6e 5c 74 22 0a 20 20 20 20 22 6d 6f 76 65 25 \n\t". "move%
8d70: 2e 6c 20 25 30 2c 25 2f 73 70 40 2d 5c 6e 5c 74 .l %0,%/sp@-\n\t
8d80: 22 0a 20 20 20 20 22 6d 6f 76 65 25 2e 6c 20 25 ". "move%.l %
8d90: 23 31 30 35 2c 25 2f 73 70 40 2d 5c 6e 5c 74 22 #105,%/sp@-\n\t"
8da0: 0a 20 20 20 20 22 6d 6f 76 65 25 2e 6c 20 25 23 . "move%.l %#
8db0: 30 2c 25 2f 73 70 40 2d 5c 6e 5c 74 22 0a 20 20 0,%/sp@-\n\t".
8dc0: 20 20 22 6d 6f 76 65 25 2e 6c 20 25 23 33 38 2c "move%.l %#38,
8dd0: 25 2f 73 70 40 2d 5c 6e 5c 74 22 0a 20 20 20 20 %/sp@-\n\t".
8de0: 22 74 72 61 70 20 25 23 30 5c 6e 5c 74 22 0a 20 "trap %#0\n\t".
8df0: 20 20 20 22 61 64 64 25 2e 6c 20 25 23 32 34 2c "add%.l %#24,
8e00: 25 2f 73 70 22 0a 20 20 20 20 3a 0a 20 20 20 20 %/sp". :.
8e10: 3a 20 22 72 22 20 28 66 75 6e 63 74 69 6f 6e 29 : "r" (function)
8e20: 2c 20 22 67 22 20 28 28 69 6e 74 29 54 52 41 4d , "g" ((int)TRAM
8e30: 50 5f 4c 45 4e 47 54 48 29 0a 20 20 20 20 3a 20 P_LENGTH). :
8e40: 22 25 64 30 22 0a 20 20 20 20 29 3b 0a 23 65 6e "%d0". );.#en
8e50: 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 dif.#endif.#if d
8e60: 65 66 69 6e 65 64 28 5f 5f 6d 69 70 73 5f 5f 29 efined(__mips__)
8e70: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 6d 69 || defined(__mi
8e80: 70 73 6e 33 32 5f 5f 29 20 7c 7c 20 64 65 66 69 psn32__) || defi
8e90: 6e 65 64 28 5f 5f 6d 69 70 73 36 34 5f 5f 29 0a ned(__mips64__).
8ea0: 20 20 63 61 63 68 65 66 6c 75 73 68 28 66 75 6e cacheflush(fun
8eb0: 63 74 69 6f 6e 2c 54 52 41 4d 50 5f 4c 45 4e 47 ction,TRAMP_LENG
8ec0: 54 48 2c 49 43 41 43 48 45 29 3b 0a 20 20 2f 2a TH,ICACHE);. /*
8ed0: 20 67 66 6f 72 74 68 2d 30 2e 33 2e 30 20 75 73 gforth-0.3.0 us
8ee0: 65 73 20 42 43 41 43 48 45 20 69 6e 73 74 65 61 es BCACHE instea
8ef0: 64 20 6f 66 20 49 43 41 43 48 45 2e 20 57 68 79 d of ICACHE. Why
8f00: 3f 3f 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 ?? */.#endif.#if
8f10: 20 64 65 66 69 6e 65 64 28 5f 5f 73 70 61 72 63 defined(__sparc
8f20: 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f __) || defined(_
8f30: 5f 73 70 61 72 63 36 34 5f 5f 29 0a 20 20 2f 2a _sparc64__). /*
8f40: 20 54 68 69 73 20 61 73 73 75 6d 65 73 20 74 68 This assumes th
8f50: 61 74 20 74 68 65 20 74 72 61 6d 70 6f 6c 69 6e at the trampolin
8f60: 65 20 66 69 74 73 20 69 6e 20 61 74 20 6d 6f 73 e fits in at mos
8f70: 74 20 74 77 6f 20 63 61 63 68 65 20 6c 69 6e 65 t two cache line
8f80: 73 2e 20 2a 2f 0a 20 20 5f 5f 54 52 5f 63 6c 65 s. */. __TR_cle
8f90: 61 72 5f 63 61 63 68 65 5f 32 28 66 75 6e 63 74 ar_cache_2(funct
8fa0: 69 6f 6e 2c 66 75 6e 63 74 69 6f 6e 2b 54 52 41 ion,function+TRA
8fb0: 4d 50 5f 4c 45 4e 47 54 48 2d 31 29 3b 0a 23 65 MP_LENGTH-1);.#e
8fc0: 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 61 6c ndif.#ifdef __al
8fd0: 70 68 61 5f 5f 0a 20 20 5f 5f 54 52 5f 63 6c 65 pha__. __TR_cle
8fe0: 61 72 5f 63 61 63 68 65 28 29 3b 0a 23 65 6e 64 ar_cache();.#end
8ff0: 69 66 0a 23 69 66 64 65 66 20 5f 5f 68 70 70 61 if.#ifdef __hppa
9000: 5f 5f 0a 20 20 2f 2a 20 54 68 69 73 20 61 73 73 __. /* This ass
9010: 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 74 72 umes that the tr
9020: 61 6d 70 6f 6c 69 6e 65 20 66 69 74 73 20 69 6e ampoline fits in
9030: 20 61 74 20 6d 6f 73 74 20 74 77 6f 20 63 61 63 at most two cac
9040: 68 65 20 6c 69 6e 65 73 2e 20 2a 2f 0a 20 20 5f he lines. */. _
9050: 5f 54 52 5f 63 6c 65 61 72 5f 63 61 63 68 65 28 _TR_clear_cache(
9060: 66 75 6e 63 74 69 6f 6e 2c 66 75 6e 63 74 69 6f function,functio
9070: 6e 2b 54 52 41 4d 50 5f 4c 45 4e 47 54 48 2d 31 n+TRAMP_LENGTH-1
9080: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 );.#endif.#ifdef
9090: 20 5f 5f 61 72 6d 5f 5f 0a 20 20 5f 5f 54 52 5f __arm__. __TR_
90a0: 63 6c 65 61 72 5f 63 61 63 68 65 28 66 75 6e 63 clear_cache(func
90b0: 74 69 6f 6e 2c 66 75 6e 63 74 69 6f 6e 2b 54 52 tion,function+TR
90c0: 41 4d 50 5f 4c 45 4e 47 54 48 29 3b 0a 23 65 6e AMP_LENGTH);.#en
90d0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
90e0: 5f 5f 70 6f 77 65 72 70 63 5f 5f 29 20 26 26 20 __powerpc__) &&
90f0: 21 64 65 66 69 6e 65 64 28 5f 5f 70 6f 77 65 72 !defined(__power
9100: 70 63 36 34 5f 5f 29 0a 20 20 5f 5f 54 52 5f 63 pc64__). __TR_c
9110: 6c 65 61 72 5f 63 61 63 68 65 28 66 75 6e 63 74 lear_cache(funct
9120: 69 6f 6e 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 ion);.#endif.#if
9130: 64 65 66 20 5f 5f 6d 38 38 6b 5f 5f 0a 20 20 73 def __m88k__. s
9140: 79 73 6d 6f 74 28 53 38 38 43 41 43 48 45 46 4c ysmot(S88CACHEFL
9150: 55 53 48 50 41 47 45 2c 20 28 75 6e 73 69 67 6e USHPAGE, (unsign
9160: 65 64 20 6c 6f 6e 67 29 66 75 6e 63 74 69 6f 6e ed long)function
9170: 20 26 20 2d 70 61 67 65 73 69 7a 65 29 3b 0a 23 & -pagesize);.#
9180: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 63 endif.#ifdef __c
9190: 6f 6e 76 65 78 5f 5f 0a 20 20 5f 5f 54 52 5f 63 onvex__. __TR_c
91a0: 6c 65 61 72 5f 63 61 63 68 65 28 29 3b 0a 23 65 lear_cache();.#e
91b0: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 2f ndif.#endif.. /
91c0: 2a 20 35 2e 20 52 65 74 75 72 6e 2e 20 2a 2f 0a * 5. Return. */.
91d0: 20 20 72 65 74 75 72 6e 20 28 5f 5f 54 52 5f 66 return (__TR_f
91e0: 75 6e 63 74 69 6f 6e 29 20 28 66 75 6e 63 74 69 unction) (functi
91f0: 6f 6e 20 2b 20 54 52 41 4d 50 5f 42 49 41 53 29 on + TRAMP_BIAS)
9200: 3b 0a 7d 0a 0a 76 6f 69 64 20 66 72 65 65 5f 74 ;.}..void free_t
9210: 72 61 6d 70 6f 6c 69 6e 65 5f 72 20 28 5f 5f 54 rampoline_r (__T
9220: 52 5f 66 75 6e 63 74 69 6f 6e 20 66 75 6e 63 74 R_function funct
9230: 69 6f 6e 29 0a 7b 0a 23 69 66 20 54 52 41 4d 50 ion).{.#if TRAMP
9240: 5f 42 49 41 53 0a 20 20 66 75 6e 63 74 69 6f 6e _BIAS. function
9250: 20 3d 20 28 5f 5f 54 52 5f 66 75 6e 63 74 69 6f = (__TR_functio
9260: 6e 29 28 28 63 68 61 72 2a 29 66 75 6e 63 74 69 n)((char*)functi
9270: 6f 6e 20 2d 20 54 52 41 4d 50 5f 42 49 41 53 29 on - TRAMP_BIAS)
9280: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 ;.#endif.#if !de
9290: 66 69 6e 65 64 28 43 4f 44 45 5f 45 58 45 43 55 fined(CODE_EXECU
92a0: 54 41 42 4c 45 29 20 26 26 20 21 64 65 66 69 6e TABLE) && !defin
92b0: 65 64 28 45 58 45 43 55 54 41 42 4c 45 5f 56 49 ed(EXECUTABLE_VI
92c0: 41 5f 4d 50 52 4f 54 45 43 54 29 0a 20 20 2a 28 A_MPROTECT). *(
92d0: 63 68 61 72 2a 2a 29 66 75 6e 63 74 69 6f 6e 20 char**)function
92e0: 3d 20 66 72 65 65 6c 69 73 74 3b 20 66 72 65 65 = freelist; free
92f0: 6c 69 73 74 20 3d 20 28 63 68 61 72 2a 29 66 75 list = (char*)fu
9300: 6e 63 74 69 6f 6e 3b 0a 20 20 2f 2a 20 49 74 20 nction;. /* It
9310: 69 73 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 is probably not
9320: 77 6f 72 74 68 20 63 61 6c 6c 69 6e 67 20 6d 75 worth calling mu
9330: 6e 6d 61 70 28 29 20 66 6f 72 20 65 6e 74 69 72 nmap() for entir
9340: 65 6c 79 20 66 72 65 65 64 20 70 61 67 65 73 2e ely freed pages.
9350: 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 66 72 65 65 */.#else. free
9360: 28 28 28 63 68 61 72 2a 2a 29 66 75 6e 63 74 69 (((char**)functi
9370: 6f 6e 29 5b 2d 31 5d 29 3b 0a 23 65 6e 64 69 66 on)[-1]);.#endif
9380: 0a 7d 0a 0a 69 6e 74 20 69 73 5f 74 72 61 6d 70 .}..int is_tramp
9390: 6f 6c 69 6e 65 5f 72 20 28 76 6f 69 64 2a 20 66 oline_r (void* f
93a0: 75 6e 63 74 69 6f 6e 29 0a 7b 0a 23 69 66 20 64 unction).{.#if d
93b0: 65 66 69 6e 65 64 28 69 73 5f 74 72 61 6d 70 29 efined(is_tramp)
93c0: 20 26 26 20 64 65 66 69 6e 65 64 28 74 72 61 6d && defined(tram
93d0: 70 5f 64 61 74 61 29 0a 23 69 66 64 65 66 20 5f p_data).#ifdef _
93e0: 5f 68 70 70 61 6e 65 77 5f 5f 0a 20 20 76 6f 69 _hppanew__. voi
93f0: 64 2a 20 74 72 61 6d 70 5f 72 5f 61 64 64 72 65 d* tramp_r_addre
9400: 73 73 20 3d 20 26 74 72 61 6d 70 5f 72 3b 0a 20 ss = &tramp_r;.
9410: 20 69 66 20 28 21 28 28 28 6c 6f 6e 67 29 66 75 if (!(((long)fu
9420: 6e 63 74 69 6f 6e 20 26 20 33 29 20 3d 3d 20 28 nction & 3) == (
9430: 54 52 41 4d 50 5f 42 49 41 53 20 26 20 33 29 29 TRAMP_BIAS & 3))
9440: 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 ) return 0;.#end
9450: 69 66 0a 20 20 72 65 74 75 72 6e 0a 20 20 20 28 if. return. (
9460: 28 69 73 5f 74 72 61 6d 70 28 28 28 63 68 61 72 (is_tramp(((char
9470: 2a 29 66 75 6e 63 74 69 6f 6e 20 2d 20 54 52 41 *)function - TRA
9480: 4d 50 5f 42 49 41 53 29 29 29 0a 20 20 20 20 26 MP_BIAS))). &
9490: 26 20 28 28 74 72 61 6d 70 5f 64 61 74 61 28 28 & ((tramp_data((
94a0: 28 63 68 61 72 2a 29 66 75 6e 63 74 69 6f 6e 20 (char*)function
94b0: 2d 20 54 52 41 4d 50 5f 42 49 41 53 29 29 29 20 - TRAMP_BIAS)))
94c0: 3d 3d 20 28 6c 6f 6e 67 29 28 28 63 68 61 72 2a == (long)((char*
94d0: 29 66 75 6e 63 74 69 6f 6e 20 2d 20 54 52 41 4d )function - TRAM
94e0: 50 5f 42 49 41 53 20 2b 20 54 52 41 4d 50 5f 4c P_BIAS + TRAMP_L
94f0: 45 4e 47 54 48 29 29 0a 20 20 20 20 3f 20 31 20 ENGTH)). ? 1
9500: 3a 20 30 0a 20 20 20 29 3b 0a 23 65 6c 73 65 0a : 0. );.#else.
9510: 20 20 61 62 6f 72 74 28 29 3b 0a 23 65 6e 64 69 abort();.#endi
9520: 66 0a 7d 0a 0a 5f 5f 54 52 5f 66 75 6e 63 74 69 f.}..__TR_functi
9530: 6f 6e 20 74 72 61 6d 70 6f 6c 69 6e 65 5f 72 5f on trampoline_r_
9540: 61 64 64 72 65 73 73 20 28 76 6f 69 64 2a 20 66 address (void* f
9550: 75 6e 63 74 69 6f 6e 29 0a 7b 0a 23 69 66 64 65 unction).{.#ifde
9560: 66 20 74 72 61 6d 70 5f 61 64 64 72 65 73 73 0a f tramp_address.
9570: 20 20 72 65 74 75 72 6e 20 28 5f 5f 54 52 5f 66 return (__TR_f
9580: 75 6e 63 74 69 6f 6e 29 28 74 72 61 6d 70 5f 61 unction)(tramp_a
9590: 64 64 72 65 73 73 28 28 28 63 68 61 72 2a 29 66 ddress(((char*)f
95a0: 75 6e 63 74 69 6f 6e 20 2d 20 54 52 41 4d 50 5f unction - TRAMP_
95b0: 42 49 41 53 29 29 29 3b 0a 23 65 6c 73 65 0a 20 BIAS)));.#else.
95c0: 20 61 62 6f 72 74 28 29 3b 0a 23 65 6e 64 69 66 abort();.#endif
95d0: 0a 7d 0a 0a 76 6f 69 64 2a 20 74 72 61 6d 70 6f .}..void* trampo
95e0: 6c 69 6e 65 5f 72 5f 64 61 74 61 30 20 28 76 6f line_r_data0 (vo
95f0: 69 64 2a 20 66 75 6e 63 74 69 6f 6e 29 0a 7b 0a id* function).{.
9600: 23 69 66 64 65 66 20 74 72 61 6d 70 5f 64 61 74 #ifdef tramp_dat
9610: 61 0a 20 20 72 65 74 75 72 6e 20 28 28 76 6f 69 a. return ((voi
9620: 64 2a 2a 29 28 28 63 68 61 72 2a 29 66 75 6e 63 d**)((char*)func
9630: 74 69 6f 6e 2d 54 52 41 4d 50 5f 42 49 41 53 2b tion-TRAMP_BIAS+
9640: 54 52 41 4d 50 5f 4c 45 4e 47 54 48 29 29 5b 30 TRAMP_LENGTH))[0
9650: 5d 3b 0a 23 65 6c 73 65 0a 20 20 61 62 6f 72 74 ];.#else. abort
9660: 28 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 76 6f ();.#endif.}..vo
9670: 69 64 2a 20 74 72 61 6d 70 6f 6c 69 6e 65 5f 72 id* trampoline_r
9680: 5f 64 61 74 61 31 20 28 76 6f 69 64 2a 20 66 75 _data1 (void* fu
9690: 6e 63 74 69 6f 6e 29 0a 7b 0a 23 69 66 64 65 66 nction).{.#ifdef
96a0: 20 74 72 61 6d 70 5f 64 61 74 61 0a 20 20 72 65 tramp_data. re
96b0: 74 75 72 6e 20 28 28 76 6f 69 64 2a 2a 29 28 28 turn ((void**)((
96c0: 63 68 61 72 2a 29 66 75 6e 63 74 69 6f 6e 2d 54 char*)function-T
96d0: 52 41 4d 50 5f 42 49 41 53 2b 54 52 41 4d 50 5f RAMP_BIAS+TRAMP_
96e0: 4c 45 4e 47 54 48 29 29 5b 31 5d 3b 0a 23 65 6c LENGTH))[1];.#el
96f0: 73 65 0a 20 20 61 62 6f 72 74 28 29 3b 0a 23 65 se. abort();.#e
9700: 6e 64 69 66 0a 7d 0a ndif.}.