0000: 2f 2a 20 54 72 61 6d 70 6f 6c 69 6e 65 20 63 6f /* Trampoline co
0010: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 2f nstruction */../
0020: 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 31 *. * Copyright 1
0030: 39 39 35 2d 31 39 39 39 2c 20 32 30 30 31 2d 32 995-1999, 2001-2
0040: 30 30 34 20 42 72 75 6e 6f 20 48 61 69 62 6c 65 004 Bruno Haible
0050: 2c 20 3c 62 72 75 6e 6f 40 63 6c 69 73 70 2e 6f , <bruno@clisp.o
0060: 72 67 3e 0a 20 2a 0a 20 2a 20 54 68 69 73 20 69 rg>. *. * This i
0070: 73 20 66 72 65 65 20 73 6f 66 74 77 61 72 65 20 s free software
0080: 64 69 73 74 72 69 62 75 74 65 64 20 75 6e 64 65 distributed unde
0090: 72 20 74 68 65 20 47 4e 55 20 47 65 6e 65 72 61 r the GNU Genera
00a0: 6c 20 50 75 62 6c 69 63 20 4c 69 63 65 6e 63 65 l Public Licence
00b0: 0a 20 2a 20 64 65 73 63 72 69 62 65 64 20 69 6e . * described in
00c0: 20 74 68 65 20 66 69 6c 65 20 43 4f 50 59 49 4e the file COPYIN
00d0: 47 2e 20 43 6f 6e 74 61 63 74 20 74 68 65 20 61 G. Contact the a
00e0: 75 74 68 6f 72 20 69 66 20 79 6f 75 20 64 6f 6e uthor if you don
00f0: 27 74 20 68 61 76 65 20 74 68 69 73 0a 20 2a 20 't have this. *
0100: 6f 72 20 63 61 6e 27 74 20 6c 69 76 65 20 77 69 or can't live wi
0110: 74 68 20 69 74 2e 20 54 68 65 72 65 20 69 73 20 th it. There is
0120: 41 42 53 4f 4c 55 54 45 4c 59 20 4e 4f 20 57 41 ABSOLUTELY NO WA
0130: 52 52 41 4e 54 59 2c 20 65 78 70 6c 69 63 69 74 RRANTY, explicit
0140: 20 6f 72 20 69 6d 70 6c 69 65 64 2c 0a 20 2a 20 or implied,. *
0150: 6f 6e 20 74 68 69 73 20 73 6f 66 74 77 61 72 65 on this software
0160: 2e 0a 20 2a 2f 0a 0a 0a 23 69 6e 63 6c 75 64 65 .. */...#include
0170: 20 22 63 6f 6e 66 69 67 2e 68 22 0a 23 69 6e 63 "config.h".#inc
0180: 6c 75 64 65 20 22 74 72 61 6d 70 6f 6c 69 6e 65 lude "trampoline
0190: 5f 72 2e 68 22 0a 0a 23 69 66 20 64 65 66 69 6e _r.h"..#if defin
01a0: 65 64 28 5f 5f 68 70 70 61 5f 5f 29 0a 23 69 66 ed(__hppa__).#if
01b0: 20 30 0a 23 64 65 66 69 6e 65 20 5f 5f 68 70 70 0.#define __hpp
01c0: 61 6f 6c 64 5f 5f 20 20 2f 2a 20 4f 6c 64 20 74 aold__ /* Old t
01d0: 72 61 6d 70 6f 6c 69 6e 65 2c 20 72 65 61 6c 20 rampoline, real
01e0: 6d 61 63 68 69 6e 65 20 63 6f 64 65 2e 20 2a 2f machine code. */
01f0: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 5f .#else.#define _
0200: 5f 68 70 70 61 6e 65 77 5f 5f 20 20 2f 2a 20 4e _hppanew__ /* N
0210: 65 77 20 74 72 61 6d 70 6f 6c 69 6e 65 2c 20 6a ew trampoline, j
0220: 75 73 74 20 61 20 63 6c 6f 73 75 72 65 2e 20 2a ust a closure. *
0230: 2f 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a /.#endif.#endif.
0240: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 72 73 #if defined(__rs
0250: 36 30 30 30 5f 5f 29 0a 23 69 66 20 64 65 66 69 6000__).#if defi
0260: 6e 65 64 28 5f 5f 4e 65 74 42 53 44 5f 5f 29 0a ned(__NetBSD__).
0270: 23 64 65 66 69 6e 65 20 5f 5f 72 73 36 30 30 30 #define __rs6000
0280: 6e 65 74 62 73 64 5f 5f 0a 23 65 6c 73 65 0a 23 netbsd__.#else.#
0290: 69 66 20 21 64 65 66 69 6e 65 64 28 5f 41 49 58 if !defined(_AIX
02a0: 29 0a 23 64 65 66 69 6e 65 20 5f 5f 72 73 36 30 ).#define __rs60
02b0: 30 30 73 79 73 76 34 5f 5f 20 20 2f 2a 20 53 79 00sysv4__ /* Sy
02c0: 73 56 2e 34 20 41 42 49 2c 20 72 65 61 6c 20 6d sV.4 ABI, real m
02d0: 61 63 68 69 6e 65 20 63 6f 64 65 2e 20 2a 2f 0a achine code. */.
02e0: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 5f 5f #else.#define __
02f0: 72 73 36 30 30 30 61 69 78 5f 5f 20 20 2f 2a 20 rs6000aix__ /*
0300: 41 49 58 20 41 42 49 2c 20 6a 75 73 74 20 61 20 AIX ABI, just a
0310: 63 6c 6f 73 75 72 65 2e 20 2a 2f 0a 23 65 6e 64 closure. */.#end
0320: 69 66 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 if.#endif.#endif
0330: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 68 .#if defined(__h
0340: 70 70 61 6e 65 77 5f 5f 29 0a 2f 2a 0a 20 2a 20 ppanew__)./*. *
0350: 41 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 A function point
0360: 65 72 20 69 73 20 61 20 62 69 61 73 65 64 20 70 er is a biased p
0370: 6f 69 6e 74 65 72 20 74 6f 20 61 20 64 61 74 61 ointer to a data
0380: 20 61 72 65 61 20 77 68 6f 73 65 20 66 69 72 73 area whose firs
0390: 74 20 77 6f 72 64 0a 20 2a 20 63 6f 6e 74 61 69 t word. * contai
03a0: 6e 73 20 74 68 65 20 61 63 74 75 61 6c 20 61 64 ns the actual ad
03b0: 64 72 65 73 73 20 6f 66 20 74 68 65 20 66 75 6e dress of the fun
03c0: 63 74 69 6f 6e 2e 0a 20 2a 2f 0a 65 78 74 65 72 ction.. */.exter
03d0: 6e 20 76 6f 69 64 20 74 72 61 6d 70 5f 72 20 28 n void tramp_r (
03e0: 29 3b 20 2f 2a 20 74 72 61 6d 70 6f 6c 69 6e 65 ); /* trampoline
03f0: 20 70 72 6f 74 6f 74 79 70 65 20 2a 2f 0a 2f 2a prototype */./*
0400: 20 57 65 20 64 6f 6e 27 74 20 6e 65 65 64 20 74 We don't need t
0410: 6f 20 74 61 6b 65 20 61 6e 79 20 73 70 65 63 69 o take any speci
0420: 61 6c 20 6d 65 61 73 75 72 65 73 20 74 6f 20 6d al measures to m
0430: 61 6b 65 20 74 68 65 20 63 6f 64 65 20 65 78 65 ake the code exe
0440: 63 75 74 61 62 6c 65 0a 20 2a 20 73 69 6e 63 65 cutable. * since
0450: 20 74 68 65 20 61 63 74 75 61 6c 20 69 6e 73 74 the actual inst
0460: 72 75 63 74 69 6f 6e 73 20 61 72 65 20 69 6e 20 ructions are in
0470: 74 68 65 20 74 65 78 74 20 73 65 67 6d 65 6e 74 the text segment
0480: 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 43 4f .. */.#ifndef CO
0490: 44 45 5f 45 58 45 43 55 54 41 42 4c 45 0a 23 64 DE_EXECUTABLE.#d
04a0: 65 66 69 6e 65 20 43 4f 44 45 5f 45 58 45 43 55 efine CODE_EXECU
04b0: 54 41 42 4c 45 0a 23 65 6e 64 69 66 0a 23 65 6e TABLE.#endif.#en
04c0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
04d0: 5f 5f 72 73 36 30 30 30 61 69 78 5f 5f 29 20 7c __rs6000aix__) |
04e0: 7c 20 64 65 66 69 6e 65 64 28 5f 5f 69 61 36 34 | defined(__ia64
04f0: 5f 5f 29 0a 2f 2a 0a 20 2a 20 41 20 66 75 6e 63 __)./*. * A func
0500: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 20 tion pointer is
0510: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 64 a pointer to a d
0520: 61 74 61 20 61 72 65 61 20 77 68 6f 73 65 20 66 ata area whose f
0530: 69 72 73 74 20 77 6f 72 64 20 63 6f 6e 74 61 69 irst word contai
0540: 6e 73 0a 20 2a 20 74 68 65 20 61 63 74 75 61 6c ns. * the actual
0550: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 address of the
0560: 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 2f 0a 65 78 function.. */.ex
0570: 74 65 72 6e 20 76 6f 69 64 20 28 2a 74 72 61 6d tern void (*tram
0580: 70 5f 72 29 20 28 29 3b 20 2f 2a 20 74 72 61 6d p_r) (); /* tram
0590: 70 6f 6c 69 6e 65 20 70 72 6f 74 6f 74 79 70 65 poline prototype
05a0: 20 2a 2f 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 */./* We don't
05b0: 6e 65 65 64 20 74 6f 20 74 61 6b 65 20 61 6e 79 need to take any
05c0: 20 73 70 65 63 69 61 6c 20 6d 65 61 73 75 72 65 special measure
05d0: 73 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 63 6f s to make the co
05e0: 64 65 20 65 78 65 63 75 74 61 62 6c 65 0a 20 2a de executable. *
05f0: 20 73 69 6e 63 65 20 74 68 65 20 61 63 74 75 61 since the actua
0600: 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 l instructions a
0610: 72 65 20 69 6e 20 74 68 65 20 74 65 78 74 20 73 re in the text s
0620: 65 67 6d 65 6e 74 2e 0a 20 2a 2f 0a 23 69 66 6e egment.. */.#ifn
0630: 64 65 66 20 43 4f 44 45 5f 45 58 45 43 55 54 41 def CODE_EXECUTA
0640: 42 4c 45 0a 23 64 65 66 69 6e 65 20 43 4f 44 45 BLE.#define CODE
0650: 5f 45 58 45 43 55 54 41 42 4c 45 0a 23 65 6e 64 _EXECUTABLE.#end
0660: 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 if.#endif.#if de
0670: 66 69 6e 65 64 28 5f 5f 6d 36 38 6b 5f 5f 29 0a fined(__m68k__).
0680: 23 69 66 20 64 65 66 69 6e 65 64 28 41 4d 49 47 #if defined(AMIG
0690: 41 29 20 2f 2a 20 41 6d 69 67 61 20 72 75 6e 6e A) /* Amiga runn
06a0: 69 6e 67 20 41 6d 69 67 61 4f 53 2c 20 6e 6f 74 ing AmigaOS, not
06b0: 20 4c 69 6e 75 78 20 2a 2f 0a 23 69 66 6e 64 65 Linux */.#ifnde
06c0: 66 20 43 4f 44 45 5f 45 58 45 43 55 54 41 42 4c f CODE_EXECUTABL
06d0: 45 20 2f 2a 20 63 6f 6e 66 69 67 75 72 65 20 67 E /* configure g
06e0: 75 65 73 73 65 73 20 77 72 6f 6e 67 3f 3f 20 2a uesses wrong?? *
06f0: 2f 0a 23 64 65 66 69 6e 65 20 43 4f 44 45 5f 45 /.#define CODE_E
0700: 58 45 43 55 54 41 42 4c 45 0a 23 65 6e 64 69 66 XECUTABLE.#endif
0710: 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a .#endif.#endif..
0720: 23 69 66 6e 64 65 66 20 43 4f 44 45 5f 45 58 45 #ifndef CODE_EXE
0730: 43 55 54 41 42 4c 45 0a 2f 2a 20 48 6f 77 20 64 CUTABLE./* How d
0740: 6f 20 77 65 20 6d 61 6b 65 20 74 68 65 20 74 72 o we make the tr
0750: 61 6d 70 6f 6c 69 6e 65 27 73 20 63 6f 64 65 20 ampoline's code
0760: 65 78 65 63 75 74 61 62 6c 65 3f 20 2a 2f 0a 23 executable? */.#
0770: 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f if defined(HAVE_
0780: 4d 41 43 48 5f 56 4d 29 20 7c 7c 20 64 65 66 69 MACH_VM) || defi
0790: 6e 65 64 28 5f 5f 63 6f 6e 76 65 78 5f 5f 29 20 ned(__convex__)
07a0: 7c 7c 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f || defined(HAVE_
07b0: 57 4f 52 4b 49 4e 47 5f 4d 50 52 4f 54 45 43 54 WORKING_MPROTECT
07c0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 48 41 56 ) || defined(HAV
07d0: 45 5f 53 59 53 5f 4d 38 38 4b 42 43 53 5f 48 29 E_SYS_M88KBCS_H)
07e0: 0a 2f 2a 20 6d 70 72 6f 74 65 63 74 28 29 20 5b ./* mprotect() [
07f0: 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 5d 20 74 or equivalent] t
0800: 68 65 20 6d 61 6c 6c 6f 63 27 65 64 20 61 72 65 he malloc'ed are
0810: 61 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 45 58 a. */.#define EX
0820: 45 43 55 54 41 42 4c 45 5f 56 49 41 5f 4d 50 52 ECUTABLE_VIA_MPR
0830: 4f 54 45 43 54 0a 23 65 6c 73 65 0a 23 69 66 64 OTECT.#else.#ifd
0840: 65 66 20 48 41 56 45 5f 4d 4d 41 50 0a 2f 2a 20 ef HAVE_MMAP./*
0850: 55 73 65 20 61 6e 20 6d 6d 61 70 27 65 64 20 70 Use an mmap'ed p
0860: 61 67 65 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 age. */.#define
0870: 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41 5f 4d EXECUTABLE_VIA_M
0880: 4d 41 50 0a 23 69 66 64 65 66 20 48 41 56 45 5f MAP.#ifdef HAVE_
0890: 4d 4d 41 50 5f 41 4e 4f 4e 59 4d 4f 55 53 0a 2f MMAP_ANONYMOUS./
08a0: 2a 20 55 73 65 20 6d 6d 61 70 20 77 69 74 68 20 * Use mmap with
08b0: 74 68 65 20 4d 41 50 5f 41 4e 4f 4e 59 4d 4f 55 the MAP_ANONYMOU
08c0: 53 20 6f 72 20 4d 41 50 5f 41 4e 4f 4e 20 66 6c S or MAP_ANON fl
08d0: 61 67 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 45 ag. */.#define E
08e0: 58 45 43 55 54 41 42 4c 45 5f 56 49 41 5f 4d 4d XECUTABLE_VIA_MM
08f0: 41 50 5f 41 4e 4f 4e 59 4d 4f 55 53 0a 23 65 6c AP_ANONYMOUS.#el
0900: 73 65 0a 2f 2a 20 55 73 65 20 6d 6d 61 70 20 6f se./* Use mmap o
0910: 6e 20 2f 64 65 76 2f 7a 65 72 6f 2e 20 2a 2f 0a n /dev/zero. */.
0920: 23 64 65 66 69 6e 65 20 45 58 45 43 55 54 41 42 #define EXECUTAB
0930: 4c 45 5f 56 49 41 5f 4d 4d 41 50 5f 44 45 56 5a LE_VIA_MMAP_DEVZ
0940: 45 52 4f 0a 23 65 6e 64 69 66 0a 23 65 6c 73 65 ERO.#endif.#else
0950: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 48 4d .#ifdef HAVE_SHM
0960: 0a 2f 2a 20 55 73 65 20 61 6e 20 73 68 6d 61 74 ./* Use an shmat
0970: 27 65 64 20 70 61 67 65 2e 20 2a 2f 0a 23 64 65 'ed page. */.#de
0980: 66 69 6e 65 20 45 58 45 43 55 54 41 42 4c 45 5f fine EXECUTABLE_
0990: 56 49 41 5f 53 48 4d 0a 23 65 6c 73 65 0a 3f 3f VIA_SHM.#else.??
09a0: 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 .#endif.#endif.#
09b0: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 23 69 endif.#endif..#i
09c0: 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e nclude <stdio.h>
09d0: 20 2f 2a 20 64 65 63 6c 61 72 65 73 20 66 70 72 /* declares fpr
09e0: 69 6e 74 66 28 29 20 2a 2f 0a 0a 23 69 6e 63 6c intf() */..#incl
09f0: 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73 2e 68 ude <sys/types.h
0a00: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c >.#include <stdl
0a10: 69 62 2e 68 3e 20 2f 2a 20 64 65 63 6c 61 72 65 ib.h> /* declare
0a20: 73 20 61 62 6f 72 74 28 29 2c 20 6d 61 6c 6c 6f s abort(), mallo
0a30: 63 28 29 2c 20 66 72 65 65 28 29 20 2a 2f 0a 23 c(), free() */.#
0a40: 69 66 64 65 66 20 48 41 56 45 5f 55 4e 49 53 54 ifdef HAVE_UNIST
0a50: 44 5f 48 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e D_H.#include <un
0a60: 69 73 74 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a istd.h>.#endif..
0a70: 2f 2a 20 44 65 63 6c 61 72 65 20 67 65 74 70 61 /* Declare getpa
0a80: 67 65 73 69 7a 65 28 29 2e 20 2a 2f 0a 23 69 66 gesize(). */.#if
0a90: 64 65 66 20 48 41 56 45 5f 47 45 54 50 41 47 45 def HAVE_GETPAGE
0aa0: 53 49 5a 45 0a 23 69 66 64 65 66 20 5f 5f 63 70 SIZE.#ifdef __cp
0ab0: 6c 75 73 70 6c 75 73 0a 65 78 74 65 72 6e 20 22 lusplus.extern "
0ac0: 43 22 20 52 45 54 47 45 54 50 41 47 45 53 49 5a C" RETGETPAGESIZ
0ad0: 45 54 59 50 45 20 67 65 74 70 61 67 65 73 69 7a ETYPE getpagesiz
0ae0: 65 20 28 76 6f 69 64 29 3b 0a 23 65 6c 69 66 20 e (void);.#elif
0af0: 64 65 66 69 6e 65 64 28 5f 5f 53 54 44 43 5f 5f defined(__STDC__
0b00: 29 0a 65 78 74 65 72 6e 20 52 45 54 47 45 54 50 ).extern RETGETP
0b10: 41 47 45 53 49 5a 45 54 59 50 45 20 67 65 74 70 AGESIZETYPE getp
0b20: 61 67 65 73 69 7a 65 20 28 76 6f 69 64 29 3b 0a agesize (void);.
0b30: 23 65 6c 73 65 0a 65 78 74 65 72 6e 20 52 45 54 #else.extern RET
0b40: 47 45 54 50 41 47 45 53 49 5a 45 54 59 50 45 20 GETPAGESIZETYPE
0b50: 67 65 74 70 61 67 65 73 69 7a 65 20 28 29 3b 0a getpagesize ();.
0b60: 23 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 69 66 #endif.#else.#if
0b70: 64 65 66 20 48 41 56 45 5f 53 59 53 5f 50 41 52 def HAVE_SYS_PAR
0b80: 41 4d 5f 48 0a 23 69 6e 63 6c 75 64 65 20 3c 73 AM_H.#include <s
0b90: 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 65 6c 73 ys/param.h>.#els
0ba0: 65 0a 2f 2a 20 4e 6f 74 20 55 6e 69 78 2c 20 65 e./* Not Unix, e
0bb0: 2e 67 2e 20 6d 69 6e 67 77 33 32 20 2a 2f 0a 23 .g. mingw32 */.#
0bc0: 64 65 66 69 6e 65 20 50 41 47 45 53 49 5a 45 20 define PAGESIZE
0bd0: 34 30 39 36 0a 23 65 6e 64 69 66 0a 23 64 65 66 4096.#endif.#def
0be0: 69 6e 65 20 67 65 74 70 61 67 65 73 69 7a 65 28 ine getpagesize(
0bf0: 29 20 50 41 47 45 53 49 5a 45 0a 23 65 6e 64 69 ) PAGESIZE.#endi
0c00: 66 0a 0a 2f 2a 20 44 65 63 6c 61 72 65 20 6d 70 f../* Declare mp
0c10: 72 6f 74 65 63 74 28 29 20 6f 72 20 65 71 75 69 rotect() or equi
0c20: 76 61 6c 65 6e 74 2e 20 2a 2f 0a 23 69 66 64 65 valent. */.#ifde
0c30: 66 20 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41 f EXECUTABLE_VIA
0c40: 5f 4d 50 52 4f 54 45 43 54 0a 23 69 66 64 65 66 _MPROTECT.#ifdef
0c50: 20 48 41 56 45 5f 4d 41 43 48 5f 56 4d 0a 23 69 HAVE_MACH_VM.#i
0c60: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 72 65 73 6f nclude <sys/reso
0c70: 75 72 63 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 urce.h>.#include
0c80: 20 3c 6d 61 63 68 2f 6d 61 63 68 5f 69 6e 74 65 <mach/mach_inte
0c90: 72 66 61 63 65 2e 68 3e 0a 23 69 66 64 65 66 20 rface.h>.#ifdef
0ca0: 4e 65 58 54 0a 23 69 6e 63 6c 75 64 65 20 3c 6d NeXT.#include <m
0cb0: 61 63 68 2f 6d 61 63 68 5f 69 6e 69 74 2e 68 3e ach/mach_init.h>
0cc0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f .#endif.#ifdef _
0cd0: 5f 6f 73 66 5f 5f 0a 23 69 6e 63 6c 75 64 65 20 _osf__.#include
0ce0: 3c 6d 61 63 68 5f 69 6e 69 74 2e 68 3e 0a 23 65 <mach_init.h>.#e
0cf0: 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20 3c 6d ndif.#include <m
0d00: 61 63 68 2f 6d 61 63 68 69 6e 65 2f 76 6d 5f 70 ach/machine/vm_p
0d10: 61 72 61 6d 2e 68 3e 0a 23 65 6c 73 65 0a 23 69 aram.h>.#else.#i
0d20: 66 64 65 66 20 48 41 56 45 5f 53 59 53 5f 4d 38 fdef HAVE_SYS_M8
0d30: 38 4b 42 43 53 5f 48 0a 23 69 6e 63 6c 75 64 65 8KBCS_H.#include
0d40: 20 3c 73 79 73 2f 6d 38 38 6b 62 63 73 2e 68 3e <sys/m88kbcs.h>
0d50: 0a 23 64 65 66 69 6e 65 20 67 65 74 70 61 67 65 .#define getpage
0d60: 73 69 7a 65 28 29 20 20 34 30 39 36 20 20 2f 2a size() 4096 /*
0d70: 20 3f 3f 20 2a 2f 0a 23 65 6c 73 65 0a 23 69 6e ?? */.#else.#in
0d80: 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73 clude <sys/types
0d90: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 .h>.#include <sy
0da0: 73 2f 6d 6d 61 6e 2e 68 3e 0a 23 65 6e 64 69 66 s/mman.h>.#endif
0db0: 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a .#endif.#endif..
0dc0: 2f 2a 20 44 65 63 6c 61 72 65 20 6d 6d 61 70 28 /* Declare mmap(
0dd0: 29 2e 20 2a 2f 0a 23 69 66 64 65 66 20 45 58 45 ). */.#ifdef EXE
0de0: 43 55 54 41 42 4c 45 5f 56 49 41 5f 4d 4d 41 50 CUTABLE_VIA_MMAP
0df0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 .#include <sys/t
0e00: 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 ypes.h>.#include
0e10: 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68 3e 0a 23 69 <sys/mman.h>.#i
0e20: 66 20 21 64 65 66 69 6e 65 64 28 50 52 4f 54 5f f !defined(PROT_
0e30: 45 58 45 43 29 20 26 26 20 64 65 66 69 6e 65 64 EXEC) && defined
0e40: 28 50 52 4f 54 5f 45 58 45 43 55 54 45 29 20 2f (PROT_EXECUTE) /
0e50: 2a 20 49 72 69 78 20 34 2e 30 2e 35 20 6e 65 65 * Irix 4.0.5 nee
0e60: 64 73 20 74 68 69 73 20 2a 2f 0a 23 64 65 66 69 ds this */.#defi
0e70: 6e 65 20 50 52 4f 54 5f 45 58 45 43 20 50 52 4f ne PROT_EXEC PRO
0e80: 54 5f 45 58 45 43 55 54 45 0a 23 65 6e 64 69 66 T_EXECUTE.#endif
0e90: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 44 65 63 6c .#endif../* Decl
0ea0: 61 72 65 20 6f 70 65 6e 28 29 2e 20 2a 2f 0a 23 are open(). */.#
0eb0: 69 66 64 65 66 20 45 58 45 43 55 54 41 42 4c 45 ifdef EXECUTABLE
0ec0: 5f 56 49 41 5f 4d 4d 41 50 5f 44 45 56 5a 45 52 _VIA_MMAP_DEVZER
0ed0: 4f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f O.#include <sys/
0ee0: 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 types.h>.#includ
0ef0: 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e e <unistd.h>.#in
0f00: 63 6c 75 64 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a clude <fcntl.h>.
0f10: 23 69 66 64 65 66 20 4f 50 45 4e 5f 4e 45 45 44 #ifdef OPEN_NEED
0f20: 53 5f 53 59 53 5f 46 49 4c 45 5f 48 0a 23 69 6e S_SYS_FILE_H.#in
0f30: 63 6c 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e clude <sys/file.
0f40: 68 3e 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 h>.#endif.#endif
0f50: 0a 0a 2f 2a 20 44 65 63 6c 61 72 65 20 73 68 6d ../* Declare shm
0f60: 67 65 74 28 29 2c 20 73 68 6d 61 74 28 29 2c 20 get(), shmat(),
0f70: 73 68 6d 63 74 6c 28 29 2e 20 2a 2f 0a 23 69 66 shmctl(). */.#if
0f80: 64 65 66 20 45 58 45 43 55 54 41 42 4c 45 5f 56 def EXECUTABLE_V
0f90: 49 41 5f 53 48 4d 0a 23 69 6e 63 6c 75 64 65 20 IA_SHM.#include
0fa0: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 <sys/types.h>.#i
0fb0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 69 70 63 2e nclude <sys/ipc.
0fc0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 h>.#include <sys
0fd0: 2f 73 68 6d 2e 68 3e 0a 23 69 66 64 65 66 20 48 /shm.h>.#ifdef H
0fe0: 41 56 45 5f 53 59 53 5f 53 59 53 4d 41 43 52 4f AVE_SYS_SYSMACRO
0ff0: 53 5f 48 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 S_H.#include <sy
1000: 73 2f 73 79 73 6d 61 63 72 6f 73 2e 68 3e 0a 23 s/sysmacros.h>.#
1010: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a endif.#endif../*
1020: 20 53 75 70 70 6f 72 74 20 66 6f 72 20 69 6e 73 Support for ins
1030: 74 72 75 63 74 69 6f 6e 20 63 61 63 68 65 20 66 truction cache f
1040: 6c 75 73 68 2e 20 2a 2f 0a 23 69 66 64 65 66 20 lush. */.#ifdef
1050: 5f 5f 69 33 38 36 5f 5f 0a 23 69 66 20 64 65 66 __i386__.#if def
1060: 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 2f 2a 20 ined(_WIN32) /*
1070: 57 69 6e 64 6f 77 73 4e 54 20 6f 72 20 57 69 6e WindowsNT or Win
1080: 64 6f 77 73 39 35 20 2a 2f 0a 23 64 65 66 69 6e dows95 */.#defin
1090: 65 20 57 49 4e 33 32 5f 4c 45 41 4e 5f 41 4e 44 e WIN32_LEAN_AND
10a0: 5f 4d 45 41 4e 0a 23 64 65 66 69 6e 65 20 57 49 _MEAN.#define WI
10b0: 4e 33 32 5f 45 58 54 52 41 5f 4c 45 41 4e 0a 23 N32_EXTRA_LEAN.#
10c0: 69 6e 63 6c 75 64 65 20 3c 77 69 6e 64 6f 77 73 include <windows
10d0: 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 .h>.#endif.#endi
10e0: 66 0a 23 69 66 64 65 66 20 5f 5f 6d 36 38 6b 5f f.#ifdef __m68k_
10f0: 5f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 41 4d _.#if defined(AM
1100: 49 47 41 29 20 2f 2a 20 41 6d 69 67 61 20 72 75 IGA) /* Amiga ru
1110: 6e 6e 69 6e 67 20 41 6d 69 67 61 4f 53 2c 20 6e nning AmigaOS, n
1120: 6f 74 20 4c 69 6e 75 78 20 2a 2f 0a 23 69 6e 63 ot Linux */.#inc
1130: 6c 75 64 65 20 3c 65 78 65 63 2f 74 79 70 65 73 lude <exec/types
1140: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 78 .h>.#include <ex
1150: 65 63 2f 65 78 65 63 62 61 73 65 2e 68 3e 0a 23 ec/execbase.h>.#
1160: 69 6e 63 6c 75 64 65 20 3c 70 72 6f 74 6f 2f 65 include <proto/e
1170: 78 65 63 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 xec.h>.#endif.#i
1180: 66 64 65 66 20 68 70 75 78 0a 23 69 6e 63 6c 75 fdef hpux.#inclu
1190: 64 65 20 3c 73 79 73 2f 63 61 63 68 65 2e 68 3e de <sys/cache.h>
11a0: 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 .#endif.#endif.#
11b0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 6d 69 70 if defined(__mip
11c0: 73 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 s__) || defined(
11d0: 5f 5f 6d 69 70 73 6e 33 32 5f 5f 29 20 7c 7c 20 __mipsn32__) ||
11e0: 64 65 66 69 6e 65 64 28 5f 5f 6d 69 70 73 36 34 defined(__mips64
11f0: 5f 5f 29 0a 23 69 66 64 65 66 20 75 6c 74 72 69 __).#ifdef ultri
1200: 78 0a 23 69 6e 63 6c 75 64 65 20 3c 6d 69 70 73 x.#include <mips
1210: 2f 63 61 63 68 65 63 74 6c 2e 68 3e 0a 23 65 6c /cachectl.h>.#el
1220: 73 65 0a 23 69 66 64 65 66 20 6c 69 6e 75 78 0a se.#ifdef linux.
1230: 23 69 6e 63 6c 75 64 65 20 3c 61 73 6d 2f 63 61 #include <asm/ca
1240: 63 68 65 63 74 6c 2e 68 3e 0a 23 65 6c 73 65 0a chectl.h>.#else.
1250: 23 69 66 64 65 66 20 48 41 56 45 5f 53 59 53 5f #ifdef HAVE_SYS_
1260: 43 41 43 48 45 43 54 4c 5f 48 0a 23 69 6e 63 6c CACHECTL_H.#incl
1270: 75 64 65 20 3c 73 79 73 2f 63 61 63 68 65 63 74 ude <sys/cachect
1280: 6c 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 65 6e 64 l.h>.#endif.#end
1290: 69 66 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 if.#endif.#endif
12a0: 0a 23 69 66 64 65 66 20 5f 5f 6d 38 38 6b 5f 5f .#ifdef __m88k__
12b0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 .#include <sys/s
12c0: 79 73 6c 6f 63 61 6c 2e 68 3e 0a 23 65 6e 64 69 yslocal.h>.#endi
12d0: 66 0a 2f 2a 20 49 6e 6c 69 6e 65 20 61 73 73 65 f./* Inline asse
12e0: 6d 62 6c 79 20 66 75 6e 63 74 69 6f 6e 20 66 6f mbly function fo
12f0: 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 61 r instruction ca
1300: 63 68 65 20 66 6c 75 73 68 2e 20 2a 2f 0a 23 69 che flush. */.#i
1310: 66 20 64 65 66 69 6e 65 64 28 5f 5f 73 70 61 72 f defined(__spar
1320: 63 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 c__) || defined(
1330: 5f 5f 73 70 61 72 63 36 34 5f 5f 29 20 7c 7c 20 __sparc64__) ||
1340: 64 65 66 69 6e 65 64 28 5f 5f 61 6c 70 68 61 5f defined(__alpha_
1350: 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f _) || defined(__
1360: 68 70 70 61 6f 6c 64 5f 5f 29 20 7c 7c 20 64 65 hppaold__) || de
1370: 66 69 6e 65 64 28 5f 5f 72 73 36 30 30 30 73 79 fined(__rs6000sy
1380: 73 76 34 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 sv4__) || define
1390: 64 28 5f 5f 72 73 36 30 30 30 6e 65 74 62 73 64 d(__rs6000netbsd
13a0: 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f __) || defined(_
13b0: 5f 63 6f 6e 76 65 78 5f 5f 29 0a 23 69 66 64 65 _convex__).#ifde
13c0: 66 20 5f 5f 47 4e 55 43 5f 5f 0a 65 78 74 65 72 f __GNUC__.exter
13d0: 6e 20 69 6e 6c 69 6e 65 0a 23 69 66 20 64 65 66 n inline.#if def
13e0: 69 6e 65 64 28 5f 5f 73 70 61 72 63 5f 5f 29 20 ined(__sparc__)
13f0: 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 73 70 61 || defined(__spa
1400: 72 63 36 34 5f 5f 29 0a 23 69 6e 63 6c 75 64 65 rc64__).#include
1410: 20 22 63 61 63 68 65 2d 73 70 61 72 63 2e 63 22 "cache-sparc.c"
1420: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f .#endif.#ifdef _
1430: 5f 61 6c 70 68 61 5f 5f 0a 23 69 6e 63 6c 75 64 _alpha__.#includ
1440: 65 20 22 63 61 63 68 65 2d 61 6c 70 68 61 2e 63 e "cache-alpha.c
1450: 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 ".#endif.#ifdef
1460: 5f 5f 68 70 70 61 5f 5f 0a 23 69 6e 63 6c 75 64 __hppa__.#includ
1470: 65 20 22 63 61 63 68 65 2d 68 70 70 61 2e 63 22 e "cache-hppa.c"
1480: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f .#endif.#ifdef _
1490: 5f 72 73 36 30 30 30 5f 5f 0a 23 69 6e 63 6c 75 _rs6000__.#inclu
14a0: 64 65 20 22 63 61 63 68 65 2d 72 73 36 30 30 30 de "cache-rs6000
14b0: 2e 63 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 .c".#endif.#ifde
14c0: 66 20 5f 5f 63 6f 6e 76 65 78 5f 5f 0a 23 69 6e f __convex__.#in
14d0: 63 6c 75 64 65 20 22 63 61 63 68 65 2d 63 6f 6e clude "cache-con
14e0: 76 65 78 2e 63 22 0a 23 65 6e 64 69 66 0a 23 65 vex.c".#endif.#e
14f0: 6c 73 65 0a 23 69 66 20 64 65 66 69 6e 65 64 28 lse.#if defined(
1500: 5f 5f 73 70 61 72 63 5f 5f 29 20 7c 7c 20 64 65 __sparc__) || de
1510: 66 69 6e 65 64 28 5f 5f 73 70 61 72 63 36 34 5f fined(__sparc64_
1520: 5f 29 0a 65 78 74 65 72 6e 20 76 6f 69 64 20 5f _).extern void _
1530: 5f 54 52 5f 63 6c 65 61 72 5f 63 61 63 68 65 5f _TR_clear_cache_
1540: 34 28 29 3b 0a 23 65 6c 73 65 0a 65 78 74 65 72 4();.#else.exter
1550: 6e 20 76 6f 69 64 20 5f 5f 54 52 5f 63 6c 65 61 n void __TR_clea
1560: 72 5f 63 61 63 68 65 28 29 3b 0a 23 65 6e 64 69 r_cache();.#endi
1570: 66 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a f.#endif.#endif.
1580: 0a 2f 2a 20 4c 65 6e 67 74 68 20 61 6e 64 20 61 ./* Length and a
1590: 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 74 72 61 6d lignment of tram
15a0: 70 6f 6c 69 6e 65 20 2a 2f 0a 23 69 66 64 65 66 poline */.#ifdef
15b0: 20 5f 5f 69 33 38 36 5f 5f 0a 23 64 65 66 69 6e __i386__.#defin
15c0: 65 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 31 e TRAMP_LENGTH 1
15d0: 36 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 6.#define TRAMP_
15e0: 41 4c 49 47 4e 20 31 36 20 20 2f 2a 20 34 20 66 ALIGN 16 /* 4 f
15f0: 6f 72 20 61 20 69 33 38 36 2c 20 31 36 20 66 6f or a i386, 16 fo
1600: 72 20 61 20 69 34 38 36 20 2a 2f 0a 23 65 6e 64 r a i486 */.#end
1610: 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d 36 38 6b if.#ifdef __m68k
1620: 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 __.#define TRAMP
1630: 5f 4c 45 4e 47 54 48 20 31 34 0a 23 64 65 66 69 _LENGTH 14.#defi
1640: 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20 31 ne TRAMP_ALIGN 1
1650: 36 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 6.#endif.#if def
1660: 69 6e 65 64 28 5f 5f 6d 69 70 73 5f 5f 29 20 26 ined(__mips__) &
1670: 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 6d 69 70 & !defined(__mip
1680: 73 6e 33 32 5f 5f 29 0a 23 64 65 66 69 6e 65 20 sn32__).#define
1690: 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 32 34 0a TRAMP_LENGTH 24.
16a0: 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c #define TRAMP_AL
16b0: 49 47 4e 20 34 0a 23 65 6e 64 69 66 0a 23 69 66 IGN 4.#endif.#if
16c0: 64 65 66 20 5f 5f 6d 69 70 73 6e 33 32 5f 5f 0a def __mipsn32__.
16d0: 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 #define TRAMP_LE
16e0: 4e 47 54 48 20 32 34 0a 23 64 65 66 69 6e 65 20 NGTH 24.#define
16f0: 54 52 41 4d 50 5f 41 4c 49 47 4e 20 34 0a 23 65 TRAMP_ALIGN 4.#e
1700: 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d 69 ndif.#ifdef __mi
1710: 70 73 36 34 6f 6c 64 5f 5f 0a 23 64 65 66 69 6e ps64old__.#defin
1720: 65 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 35 e TRAMP_LENGTH 5
1730: 36 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 6.#define TRAMP_
1740: 41 4c 49 47 4e 20 34 0a 23 65 6e 64 69 66 0a 23 ALIGN 4.#endif.#
1750: 69 66 64 65 66 20 5f 5f 6d 69 70 73 36 34 5f 5f ifdef __mips64__
1760: 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c .#define TRAMP_L
1770: 45 4e 47 54 48 20 33 32 0a 23 64 65 66 69 6e 65 ENGTH 32.#define
1780: 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20 38 0a 23 TRAMP_ALIGN 8.#
1790: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 endif.#if define
17a0: 64 28 5f 5f 73 70 61 72 63 5f 5f 29 20 26 26 20 d(__sparc__) &&
17b0: 21 64 65 66 69 6e 65 64 28 5f 5f 73 70 61 72 63 !defined(__sparc
17c0: 36 34 5f 5f 29 0a 23 64 65 66 69 6e 65 20 54 52 64__).#define TR
17d0: 41 4d 50 5f 4c 45 4e 47 54 48 20 31 36 0a 23 64 AMP_LENGTH 16.#d
17e0: 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 efine TRAMP_ALIG
17f0: 4e 20 31 36 0a 23 65 6e 64 69 66 0a 23 69 66 64 N 16.#endif.#ifd
1800: 65 66 20 5f 5f 73 70 61 72 63 36 34 5f 5f 0a 23 ef __sparc64__.#
1810: 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e define TRAMP_LEN
1820: 47 54 48 20 33 32 0a 23 64 65 66 69 6e 65 20 54 GTH 32.#define T
1830: 52 41 4d 50 5f 41 4c 49 47 4e 20 31 36 0a 23 65 RAMP_ALIGN 16.#e
1840: 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 61 6c ndif.#ifdef __al
1850: 70 68 61 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52 pha__.#define TR
1860: 41 4d 50 5f 4c 45 4e 47 54 48 20 33 32 0a 23 64 AMP_LENGTH 32.#d
1870: 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 efine TRAMP_ALIG
1880: 4e 20 38 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 N 8.#endif.#ifde
1890: 66 20 5f 5f 68 70 70 61 6f 6c 64 5f 5f 0a 23 64 f __hppaold__.#d
18a0: 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47 efine TRAMP_LENG
18b0: 54 48 20 34 38 0a 23 64 65 66 69 6e 65 20 54 52 TH 48.#define TR
18c0: 41 4d 50 5f 41 4c 49 47 4e 20 31 36 0a 23 65 6e AMP_ALIGN 16.#en
18d0: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 68 70 70 dif.#ifdef __hpp
18e0: 61 6e 65 77 5f 5f 0a 23 64 65 66 69 6e 65 20 54 anew__.#define T
18f0: 52 41 4d 50 5f 4c 45 4e 47 54 48 20 31 36 0a 23 RAMP_LENGTH 16.#
1900: 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 define TRAMP_ALI
1910: 47 4e 20 31 36 0a 23 64 65 66 69 6e 65 20 54 52 GN 16.#define TR
1920: 41 4d 50 5f 42 49 41 53 20 32 0a 23 65 6e 64 69 AMP_BIAS 2.#endi
1930: 66 0a 23 69 66 64 65 66 20 5f 5f 61 72 6d 5f 5f f.#ifdef __arm__
1940: 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c .#define TRAMP_L
1950: 45 4e 47 54 48 20 33 32 0a 23 64 65 66 69 6e 65 ENGTH 32.#define
1960: 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20 34 0a 23 TRAMP_ALIGN 4.#
1970: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 72 endif.#ifdef __r
1980: 73 36 30 30 30 73 79 73 76 34 5f 5f 0a 23 64 65 s6000sysv4__.#de
1990: 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47 54 fine TRAMP_LENGT
19a0: 48 20 32 34 0a 23 64 65 66 69 6e 65 20 54 52 41 H 24.#define TRA
19b0: 4d 50 5f 41 4c 49 47 4e 20 34 0a 23 65 6e 64 69 MP_ALIGN 4.#endi
19c0: 66 0a 23 69 66 64 65 66 20 5f 5f 72 73 36 30 30 f.#ifdef __rs600
19d0: 30 6e 65 74 62 73 64 5f 5f 0a 23 64 65 66 69 6e 0netbsd__.#defin
19e0: 65 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 32 e TRAMP_LENGTH 2
19f0: 34 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4.#define TRAMP_
1a00: 41 4c 49 47 4e 20 34 0a 23 65 6e 64 69 66 0a 23 ALIGN 4.#endif.#
1a10: 69 66 64 65 66 20 5f 5f 72 73 36 30 30 30 61 69 ifdef __rs6000ai
1a20: 78 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52 41 4d x__.#define TRAM
1a30: 50 5f 4c 45 4e 47 54 48 20 32 30 0a 23 64 65 66 P_LENGTH 20.#def
1a40: 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20 ine TRAMP_ALIGN
1a50: 34 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 4.#endif.#ifdef
1a60: 5f 5f 6d 38 38 6b 5f 5f 0a 23 64 65 66 69 6e 65 __m88k__.#define
1a70: 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 32 30 TRAMP_LENGTH 20
1a80: 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 .#define TRAMP_A
1a90: 4c 49 47 4e 20 38 0a 23 65 6e 64 69 66 0a 23 69 LIGN 8.#endif.#i
1aa0: 66 64 65 66 20 5f 5f 63 6f 6e 76 65 78 5f 5f 0a fdef __convex__.
1ab0: 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 #define TRAMP_LE
1ac0: 4e 47 54 48 20 31 34 0a 23 64 65 66 69 6e 65 20 NGTH 14.#define
1ad0: 54 52 41 4d 50 5f 41 4c 49 47 4e 20 34 0a 23 65 TRAMP_ALIGN 4.#e
1ae0: 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 69 61 ndif.#ifdef __ia
1af0: 36 34 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52 41 64__.#define TRA
1b00: 4d 50 5f 4c 45 4e 47 54 48 20 33 32 0a 23 64 65 MP_LENGTH 32.#de
1b10: 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e fine TRAMP_ALIGN
1b20: 20 31 36 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 16.#endif.#ifde
1b30: 66 20 5f 5f 78 38 36 5f 36 34 5f 5f 0a 23 64 65 f __x86_64__.#de
1b40: 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47 54 fine TRAMP_LENGT
1b50: 48 20 32 32 0a 23 64 65 66 69 6e 65 20 54 52 41 H 22.#define TRA
1b60: 4d 50 5f 41 4c 49 47 4e 20 31 36 0a 23 65 6e 64 MP_ALIGN 16.#end
1b70: 69 66 0a 23 69 66 64 65 66 20 5f 5f 73 33 39 30 if.#ifdef __s390
1b80: 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 __.#define TRAMP
1b90: 5f 4c 45 4e 47 54 48 20 32 32 0a 23 64 65 66 69 _LENGTH 22.#defi
1ba0: 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20 32 ne TRAMP_ALIGN 2
1bb0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 .#endif..#ifndef
1bc0: 20 54 52 41 4d 50 5f 42 49 41 53 0a 23 64 65 66 TRAMP_BIAS.#def
1bd0: 69 6e 65 20 54 52 41 4d 50 5f 42 49 41 53 20 30 ine TRAMP_BIAS 0
1be0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 .#endif..#define
1bf0: 20 54 52 41 4d 50 5f 54 4f 54 41 4c 5f 4c 45 4e TRAMP_TOTAL_LEN
1c00: 47 54 48 20 28 54 52 41 4d 50 5f 4c 45 4e 47 54 GTH (TRAMP_LENGT
1c10: 48 20 2b 20 32 2a 73 69 7a 65 6f 66 28 76 6f 69 H + 2*sizeof(voi
1c20: 64 2a 29 29 0a 0a 23 69 66 20 21 64 65 66 69 6e d*))..#if !defin
1c30: 65 64 28 43 4f 44 45 5f 45 58 45 43 55 54 41 42 ed(CODE_EXECUTAB
1c40: 4c 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 LE) && !defined(
1c50: 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41 5f 4d EXECUTABLE_VIA_M
1c60: 50 52 4f 54 45 43 54 29 0a 2f 2a 20 41 49 58 20 PROTECT)./* AIX
1c70: 64 6f 65 73 6e 27 74 20 73 75 70 70 6f 72 74 20 doesn't support
1c80: 6d 70 72 6f 74 65 63 74 28 29 20 69 6e 20 6d 61 mprotect() in ma
1c90: 6c 6c 6f 63 27 65 64 20 6d 65 6d 6f 72 79 2e 20 lloc'ed memory.
1ca0: 4d 75 73 74 20 67 65 74 20 70 61 67 65 73 20 6f Must get pages o
1cb0: 66 0a 20 2a 20 6d 65 6d 6f 72 79 20 77 69 74 68 f. * memory with
1cc0: 20 65 78 65 63 75 74 65 20 70 65 72 6d 69 73 73 execute permiss
1cd0: 69 6f 6e 20 76 69 61 20 6d 6d 61 70 28 29 2e 20 ion via mmap().
1ce0: 54 68 65 6e 20 6b 65 65 70 20 61 20 66 72 65 65 Then keep a free
1cf0: 20 6c 69 73 74 20 6f 66 0a 20 2a 20 66 72 65 65 list of. * free
1d00: 20 74 72 61 6d 70 6f 6c 69 6e 65 73 2e 0a 20 2a trampolines.. *
1d10: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 2a 20 66 /.static char* f
1d20: 72 65 65 6c 69 73 74 20 3d 20 4e 55 4c 4c 3b 0a reelist = NULL;.
1d30: 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 #endif..#if defi
1d40: 6e 65 64 28 5f 5f 53 54 44 43 5f 5f 29 20 7c 7c ned(__STDC__) ||
1d50: 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f defined(__GNUC_
1d60: 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f _) || defined(__
1d70: 63 70 6c 75 73 70 6c 75 73 29 0a 5f 5f 54 52 5f cplusplus).__TR_
1d80: 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 5f 74 function alloc_t
1d90: 72 61 6d 70 6f 6c 69 6e 65 5f 72 20 28 5f 5f 54 rampoline_r (__T
1da0: 52 5f 66 75 6e 63 74 69 6f 6e 20 61 64 64 72 65 R_function addre
1db0: 73 73 2c 20 76 6f 69 64 2a 20 64 61 74 61 30 2c ss, void* data0,
1dc0: 20 76 6f 69 64 2a 20 64 61 74 61 31 29 0a 23 65 void* data1).#e
1dd0: 6c 73 65 0a 5f 5f 54 52 5f 66 75 6e 63 74 69 6f lse.__TR_functio
1de0: 6e 20 61 6c 6c 6f 63 5f 74 72 61 6d 70 6f 6c 69 n alloc_trampoli
1df0: 6e 65 5f 72 20 28 61 64 64 72 65 73 73 2c 20 64 ne_r (address, d
1e00: 61 74 61 30 2c 20 64 61 74 61 31 29 0a 20 20 5f ata0, data1). _
1e10: 5f 54 52 5f 66 75 6e 63 74 69 6f 6e 20 61 64 64 _TR_function add
1e20: 72 65 73 73 3b 0a 20 20 76 6f 69 64 2a 20 64 61 ress;. void* da
1e30: 74 61 30 3b 0a 20 20 76 6f 69 64 2a 20 64 61 74 ta0;. void* dat
1e40: 61 31 3b 0a 23 65 6e 64 69 66 0a 7b 0a 20 20 63 a1;.#endif.{. c
1e50: 68 61 72 2a 20 66 75 6e 63 74 69 6f 6e 3b 0a 20 har* function;.
1e60: 20 63 68 61 72 2a 20 64 61 74 61 3b 0a 0a 23 69 char* data;..#i
1e70: 66 20 21 64 65 66 69 6e 65 64 28 43 4f 44 45 5f f !defined(CODE_
1e80: 45 58 45 43 55 54 41 42 4c 45 29 0a 20 20 73 74 EXECUTABLE). st
1e90: 61 74 69 63 20 6c 6f 6e 67 20 70 61 67 65 73 69 atic long pagesi
1ea0: 7a 65 20 3d 20 30 3b 0a 23 69 66 20 64 65 66 69 ze = 0;.#if defi
1eb0: 6e 65 64 28 45 58 45 43 55 54 41 42 4c 45 5f 56 ned(EXECUTABLE_V
1ec0: 49 41 5f 4d 4d 41 50 5f 44 45 56 5a 45 52 4f 29 IA_MMAP_DEVZERO)
1ed0: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 7a 65 . static int ze
1ee0: 72 6f 5f 66 64 3b 0a 23 65 6e 64 69 66 0a 20 20 ro_fd;.#endif.
1ef0: 2f 2a 20 46 69 72 73 74 2c 20 67 65 74 20 74 68 /* First, get th
1f00: 65 20 70 61 67 65 20 73 69 7a 65 20 6f 6e 63 65 e page size once
1f10: 20 61 6e 64 20 66 6f 72 20 61 6c 6c 2e 20 2a 2f and for all. */
1f20: 0a 20 20 69 66 20 28 21 70 61 67 65 73 69 7a 65 . if (!pagesize
1f30: 29 0a 20 20 20 20 7b 0a 23 69 66 20 64 65 66 69 ). {.#if defi
1f40: 6e 65 64 28 48 41 56 45 5f 4d 41 43 48 5f 56 4d ned(HAVE_MACH_VM
1f50: 29 0a 20 20 20 20 20 20 70 61 67 65 73 69 7a 65 ). pagesize
1f60: 20 3d 20 76 6d 5f 70 61 67 65 5f 73 69 7a 65 3b = vm_page_size;
1f70: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 70 61 67 .#else. pag
1f80: 65 73 69 7a 65 20 3d 20 67 65 74 70 61 67 65 73 esize = getpages
1f90: 69 7a 65 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69 ize();.#endif.#i
1fa0: 66 20 64 65 66 69 6e 65 64 28 45 58 45 43 55 54 f defined(EXECUT
1fb0: 41 42 4c 45 5f 56 49 41 5f 4d 4d 41 50 5f 44 45 ABLE_VIA_MMAP_DE
1fc0: 56 5a 45 52 4f 29 0a 20 20 20 20 20 20 7a 65 72 VZERO). zer
1fd0: 6f 5f 66 64 20 3d 20 6f 70 65 6e 28 22 2f 64 65 o_fd = open("/de
1fe0: 76 2f 7a 65 72 6f 22 2c 4f 5f 52 44 4f 4e 4c 59 v/zero",O_RDONLY
1ff0: 2c 30 36 34 34 29 3b 0a 20 20 20 20 20 20 69 66 ,0644);. if
2000: 20 28 7a 65 72 6f 5f 66 64 20 3c 20 30 29 0a 20 (zero_fd < 0).
2010: 20 20 20 20 20 20 20 7b 20 66 70 72 69 6e 74 66 { fprintf
2020: 28 73 74 64 65 72 72 2c 22 74 72 61 6d 70 6f 6c (stderr,"trampol
2030: 69 6e 65 3a 20 43 61 6e 6e 6f 74 20 6f 70 65 6e ine: Cannot open
2040: 20 2f 64 65 76 2f 7a 65 72 6f 21 5c 6e 22 29 3b /dev/zero!\n");
2050: 20 61 62 6f 72 74 28 29 3b 20 7d 0a 23 65 6e 64 abort(); }.#end
2060: 69 66 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a if. }.#endif.
2070: 0a 20 20 2f 2a 20 31 2e 20 41 6c 6c 6f 63 61 74 . /* 1. Allocat
2080: 65 20 72 6f 6f 6d 20 2a 2f 0a 0a 23 69 66 20 21 e room */..#if !
2090: 64 65 66 69 6e 65 64 28 43 4f 44 45 5f 45 58 45 defined(CODE_EXE
20a0: 43 55 54 41 42 4c 45 29 20 26 26 20 21 64 65 66 CUTABLE) && !def
20b0: 69 6e 65 64 28 45 58 45 43 55 54 41 42 4c 45 5f ined(EXECUTABLE_
20c0: 56 49 41 5f 4d 50 52 4f 54 45 43 54 29 0a 20 20 VIA_MPROTECT).
20d0: 2f 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 6d 65 /* Note: This me
20e0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 mory allocation
20f0: 69 73 20 6e 6f 74 20 6d 75 6c 74 69 74 68 72 65 is not multithre
2100: 61 64 2d 73 61 66 65 2e 20 57 65 20 6d 69 67 68 ad-safe. We migh
2110: 74 20 6e 65 65 64 0a 20 20 20 2a 20 74 6f 20 61 t need. * to a
2120: 64 64 20 73 70 65 63 69 61 6c 20 28 70 6c 61 74 dd special (plat
2130: 66 6f 72 6d 20 64 65 70 65 6e 64 65 6e 74 29 20 form dependent)
2140: 63 6f 64 65 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 code for locking
2150: 2e 0a 20 20 20 2a 20 46 6f 72 74 75 6e 61 74 65 .. * Fortunate
2160: 6c 79 2c 20 6d 6f 73 74 20 6d 6f 64 65 72 6e 20 ly, most modern
2170: 73 79 73 74 65 6d 73 20 77 68 65 72 65 20 6d 75 systems where mu
2180: 6c 74 69 74 68 72 65 61 64 2d 73 61 66 65 74 79 ltithread-safety
2190: 20 6d 61 74 74 65 72 73 0a 20 20 20 2a 20 68 61 matters. * ha
21a0: 76 65 20 45 58 45 43 55 54 41 42 4c 45 5f 56 49 ve EXECUTABLE_VI
21b0: 41 5f 4d 50 52 4f 54 45 43 54 2c 20 61 6e 64 20 A_MPROTECT, and
21c0: 74 68 6f 73 65 20 77 68 69 63 68 20 64 6f 6e 27 those which don'
21d0: 74 20 28 41 49 58 20 6f 6e 20 72 73 36 30 30 30 t (AIX on rs6000
21e0: 20 61 6e 64 0a 20 20 20 2a 20 48 50 2d 55 58 20 and. * HP-UX
21f0: 6f 6e 20 68 70 70 61 29 20 68 61 76 65 20 43 4f on hppa) have CO
2200: 44 45 5f 45 58 45 43 55 54 41 42 4c 45 2e 20 54 DE_EXECUTABLE. T
2210: 68 75 73 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 63 hus no locking c
2220: 6f 64 65 20 69 73 20 6e 65 65 64 65 64 0a 20 20 ode is needed.
2230: 20 2a 20 66 6f 72 20 74 68 65 20 6d 6f 6d 65 6e * for the momen
2240: 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 20 28 66 t.. */. if (f
2250: 72 65 65 6c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 reelist == NULL)
2260: 0a 20 20 20 20 7b 20 2f 2a 20 47 65 74 20 61 20 . { /* Get a
2270: 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 new page. */.
2280: 20 20 20 63 68 61 72 2a 20 70 61 67 65 3b 0a 23 char* page;.#
2290: 69 66 64 65 66 20 45 58 45 43 55 54 41 42 4c 45 ifdef EXECUTABLE
22a0: 5f 56 49 41 5f 4d 4d 41 50 5f 41 4e 4f 4e 59 4d _VIA_MMAP_ANONYM
22b0: 4f 55 53 0a 20 20 20 20 20 20 70 61 67 65 20 3d OUS. page =
22c0: 20 6d 6d 61 70 28 30 2c 20 70 61 67 65 73 69 7a mmap(0, pagesiz
22d0: 65 2c 20 50 52 4f 54 5f 52 45 41 44 20 7c 20 50 e, PROT_READ | P
22e0: 52 4f 54 5f 57 52 49 54 45 20 7c 20 50 52 4f 54 ROT_WRITE | PROT
22f0: 5f 45 58 45 43 2c 20 4d 41 50 5f 41 4e 4f 4e 59 _EXEC, MAP_ANONY
2300: 4d 4f 55 53 20 7c 20 4d 41 50 5f 56 41 52 49 41 MOUS | MAP_VARIA
2310: 42 4c 45 2c 20 2d 31 2c 20 30 29 3b 0a 23 65 6e BLE, -1, 0);.#en
2320: 64 69 66 0a 23 69 66 64 65 66 20 45 58 45 43 55 dif.#ifdef EXECU
2330: 54 41 42 4c 45 5f 56 49 41 5f 4d 4d 41 50 5f 44 TABLE_VIA_MMAP_D
2340: 45 56 5a 45 52 4f 0a 20 20 20 20 20 20 70 61 67 EVZERO. pag
2350: 65 20 3d 20 6d 6d 61 70 28 30 2c 20 70 61 67 65 e = mmap(0, page
2360: 73 69 7a 65 2c 20 50 52 4f 54 5f 52 45 41 44 20 size, PROT_READ
2370: 7c 20 50 52 4f 54 5f 57 52 49 54 45 20 7c 20 50 | PROT_WRITE | P
2380: 52 4f 54 5f 45 58 45 43 2c 20 4d 41 50 5f 50 52 ROT_EXEC, MAP_PR
2390: 49 56 41 54 45 2c 20 7a 65 72 6f 5f 66 64 2c 20 IVATE, zero_fd,
23a0: 30 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 0);.#endif.#ifde
23b0: 66 20 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41 f EXECUTABLE_VIA
23c0: 5f 53 48 4d 0a 20 20 20 20 20 20 69 6e 74 20 73 _SHM. int s
23d0: 68 6d 69 64 20 3d 20 73 68 6d 67 65 74 28 49 50 hmid = shmget(IP
23e0: 43 5f 50 52 49 56 41 54 45 2c 20 70 61 67 65 73 C_PRIVATE, pages
23f0: 69 7a 65 2c 20 30 37 30 30 7c 49 50 43 5f 43 52 ize, 0700|IPC_CR
2400: 45 41 54 29 3b 0a 20 20 20 20 20 20 69 66 20 28 EAT);. if (
2410: 73 68 6d 69 64 3c 30 29 0a 20 20 20 20 20 20 20 shmid<0).
2420: 20 7b 20 70 61 67 65 20 3d 20 28 63 68 61 72 2a { page = (char*
2430: 29 28 2d 31 29 3b 20 7d 0a 20 20 20 20 20 20 65 )(-1); }. e
2440: 6c 73 65 0a 20 20 20 20 20 20 20 20 7b 20 70 61 lse. { pa
2450: 67 65 20 3d 20 73 68 6d 61 74 28 73 68 6d 69 64 ge = shmat(shmid
2460: 2c 20 30 2c 20 30 29 3b 20 73 68 6d 63 74 6c 28 , 0, 0); shmctl(
2470: 73 68 6d 69 64 2c 20 49 50 43 5f 52 4d 49 44 2c shmid, IPC_RMID,
2480: 20 30 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0); }.#endif.
2490: 20 20 20 20 69 66 20 28 70 61 67 65 20 3d 3d 20 if (page ==
24a0: 28 63 68 61 72 2a 29 28 2d 31 29 29 0a 20 20 20 (char*)(-1)).
24b0: 20 20 20 20 20 7b 20 66 70 72 69 6e 74 66 28 73 { fprintf(s
24c0: 74 64 65 72 72 2c 22 74 72 61 6d 70 6f 6c 69 6e tderr,"trampolin
24d0: 65 3a 20 4f 75 74 20 6f 66 20 76 69 72 74 75 61 e: Out of virtua
24e0: 6c 20 6d 65 6d 6f 72 79 21 5c 6e 22 29 3b 20 61 l memory!\n"); a
24f0: 62 6f 72 74 28 29 3b 20 7d 0a 20 20 20 20 20 20 bort(); }.
2500: 2f 2a 20 46 69 6c 6c 20 69 74 20 77 69 74 68 20 /* Fill it with
2510: 66 72 65 65 20 74 72 61 6d 70 6f 6c 69 6e 65 73 free trampolines
2520: 2e 20 2a 2f 0a 20 20 20 20 20 20 7b 20 63 68 61 . */. { cha
2530: 72 2a 2a 20 6c 61 73 74 20 3d 20 26 66 72 65 65 r** last = &free
2540: 6c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 63 68 list;. ch
2550: 61 72 2a 20 70 61 67 65 5f 65 6e 64 20 3d 20 70 ar* page_end = p
2560: 61 67 65 20 2b 20 70 61 67 65 73 69 7a 65 3b 0a age + pagesize;.
2570: 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 28 70 while (p
2580: 61 67 65 2b 54 52 41 4d 50 5f 54 4f 54 41 4c 5f age+TRAMP_TOTAL_
2590: 4c 45 4e 47 54 48 20 3c 3d 20 70 61 67 65 5f 65 LENGTH <= page_e
25a0: 6e 64 29 0a 20 20 20 20 20 20 20 20 20 20 7b 20 nd). {
25b0: 2a 6c 61 73 74 20 3d 20 70 61 67 65 3b 20 6c 61 *last = page; la
25c0: 73 74 20 3d 20 28 63 68 61 72 2a 2a 29 70 61 67 st = (char**)pag
25d0: 65 3b 20 70 61 67 65 20 2b 3d 20 54 52 41 4d 50 e; page += TRAMP
25e0: 5f 54 4f 54 41 4c 5f 4c 45 4e 47 54 48 3b 20 7d _TOTAL_LENGTH; }
25f0: 0a 20 20 20 20 20 20 20 20 2a 6c 61 73 74 20 3d . *last =
2600: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 20 7d 0a 20 NULL;. } }.
2610: 20 66 75 6e 63 74 69 6f 6e 20 3d 20 66 72 65 65 function = free
2620: 6c 69 73 74 3b 20 66 72 65 65 6c 69 73 74 20 3d list; freelist =
2630: 20 2a 28 63 68 61 72 2a 2a 29 66 72 65 65 6c 69 *(char**)freeli
2640: 73 74 3b 0a 23 65 6c 73 65 0a 20 20 7b 20 63 68 st;.#else. { ch
2650: 61 72 2a 20 72 6f 6f 6d 20 3d 20 28 63 68 61 72 ar* room = (char
2660: 2a 29 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 *) malloc(sizeof
2670: 28 76 6f 69 64 2a 29 20 2b 20 54 52 41 4d 50 5f (void*) + TRAMP_
2680: 54 4f 54 41 4c 5f 4c 45 4e 47 54 48 20 2b 20 54 TOTAL_LENGTH + T
2690: 52 41 4d 50 5f 41 4c 49 47 4e 2d 31 29 3b 0a 20 RAMP_ALIGN-1);.
26a0: 20 20 20 69 66 20 28 21 72 6f 6f 6d 29 0a 20 20 if (!room).
26b0: 20 20 20 20 7b 20 66 70 72 69 6e 74 66 28 73 74 { fprintf(st
26c0: 64 65 72 72 2c 22 74 72 61 6d 70 6f 6c 69 6e 65 derr,"trampoline
26d0: 3a 20 4f 75 74 20 6f 66 20 76 69 72 74 75 61 6c : Out of virtual
26e0: 20 6d 65 6d 6f 72 79 21 5c 6e 22 29 3b 20 61 62 memory!\n"); ab
26f0: 6f 72 74 28 29 3b 20 7d 0a 20 20 20 20 66 75 6e ort(); }. fun
2700: 63 74 69 6f 6e 20 3d 20 28 63 68 61 72 2a 29 28 ction = (char*)(
2710: 28 28 6c 6f 6e 67 29 72 6f 6f 6d 20 2b 20 73 69 ((long)room + si
2720: 7a 65 6f 66 28 76 6f 69 64 2a 29 20 2b 20 54 52 zeof(void*) + TR
2730: 41 4d 50 5f 41 4c 49 47 4e 2d 31 29 20 26 20 2d AMP_ALIGN-1) & -
2740: 54 52 41 4d 50 5f 41 4c 49 47 4e 29 3b 0a 20 20 TRAMP_ALIGN);.
2750: 20 20 28 28 63 68 61 72 2a 2a 29 66 75 6e 63 74 ((char**)funct
2760: 69 6f 6e 29 5b 2d 31 5d 20 3d 20 72 6f 6f 6d 3b ion)[-1] = room;
2770: 20 2f 2a 20 62 61 63 6b 70 6f 69 6e 74 65 72 20 /* backpointer
2780: 66 6f 72 20 66 72 65 65 5f 74 72 61 6d 70 6f 6c for free_trampol
2790: 69 6e 65 28 29 20 2a 2f 0a 20 20 7d 0a 23 65 6e ine() */. }.#en
27a0: 64 69 66 0a 0a 20 20 2f 2a 20 32 2e 20 46 69 6c dif.. /* 2. Fil
27b0: 6c 20 6f 75 74 20 74 68 65 20 74 72 61 6d 70 6f l out the trampo
27c0: 6c 69 6e 65 20 2a 2f 0a 20 20 64 61 74 61 20 3d line */. data =
27d0: 20 66 75 6e 63 74 69 6f 6e 20 2b 20 54 52 41 4d function + TRAM
27e0: 50 5f 4c 45 4e 47 54 48 3b 0a 20 20 2f 2a 20 4b P_LENGTH;. /* K
27f0: 6e 6f 77 69 6e 67 20 74 68 61 74 20 64 61 74 61 nowing that data
2800: 20 3d 20 66 75 6e 63 74 69 6f 6e 20 2b 20 54 52 = function + TR
2810: 41 4d 50 5f 4c 45 4e 47 54 48 2c 20 77 65 20 63 AMP_LENGTH, we c
2820: 6f 75 6c 64 20 63 65 72 74 61 69 6e 6c 79 20 6f ould certainly o
2830: 70 74 69 6d 69 7a 65 0a 20 20 20 2a 20 74 68 65 ptimize. * the
2840: 20 74 72 61 6d 70 6f 6c 69 6e 65 73 20 61 20 6c trampolines a l
2850: 69 74 74 6c 65 20 62 69 74 20 6d 6f 72 65 2c 20 ittle bit more,
2860: 75 73 69 6e 67 20 50 43 20 72 65 6c 61 74 69 76 using PC relativ
2870: 65 20 61 64 64 72 65 73 73 69 6e 67 20 6d 6f 64 e addressing mod
2880: 65 73 2e 0a 20 20 20 2a 20 42 75 74 20 49 20 64 es.. * But I d
2890: 6f 75 62 74 20 69 74 27 73 20 72 65 61 6c 6c 79 oubt it's really
28a0: 20 77 6f 72 74 68 20 69 74 2e 0a 20 20 20 2a 2f worth it.. */
28b0: 0a 23 69 66 64 65 66 20 5f 5f 69 33 38 36 5f 5f .#ifdef __i386__
28c0: 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a . /* function:.
28d0: 20 20 20 2a 20 20 20 20 70 6f 70 6c 20 25 65 63 * popl %ec
28e0: 78 09 09 09 35 39 0a 20 20 20 2a 20 20 20 20 70 x...59. * p
28f0: 75 73 68 6c 20 24 3c 64 61 74 61 3e 09 09 09 36 ushl $<data>...6
2900: 38 20 3c 64 61 74 61 3e 0a 20 20 20 2a 20 20 20 8 <data>. *
2910: 20 70 75 73 68 6c 20 25 65 63 78 09 09 09 35 31 pushl %ecx...51
2920: 0a 20 20 20 2a 20 20 20 20 6a 6d 70 20 3c 61 64 . * jmp <ad
2930: 64 72 65 73 73 3e 09 09 09 45 39 20 3c 61 64 64 dress>...E9 <add
2940: 72 65 73 73 3e 2d 3c 68 65 72 65 3e 0a 20 20 20 ress>-<here>.
2950: 2a 20 68 65 72 65 3a 0a 20 20 20 2a 20 20 20 20 * here:. *
2960: 6e 6f 70 09 09 09 09 39 30 0a 20 20 20 2a 20 20 nop....90. *
2970: 20 20 6e 6f 70 09 09 09 09 39 30 0a 20 20 20 2a nop....90. *
2980: 20 20 20 20 6e 6f 70 09 09 09 09 39 30 0a 20 20 nop....90.
2990: 20 2a 20 20 20 20 6e 6f 70 09 09 09 09 39 30 0a * nop....90.
29a0: 20 20 20 2a 2f 0a 20 20 2a 28 73 68 6f 72 74 20 */. *(short
29b0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 *) (function + 0
29c0: 29 20 3d 20 30 78 36 38 35 39 3b 0a 20 20 2a 28 ) = 0x6859;. *(
29d0: 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 long *) (functi
29e0: 6f 6e 20 2b 20 32 29 20 3d 20 28 6c 6f 6e 67 29 on + 2) = (long)
29f0: 20 64 61 74 61 3b 0a 20 20 2a 28 73 68 6f 72 74 data;. *(short
2a00: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 *) (function +
2a10: 36 29 20 3d 20 30 78 45 39 35 31 3b 0a 20 20 2a 6) = 0xE951;. *
2a20: 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 (long *) (funct
2a30: 69 6f 6e 20 2b 20 38 29 20 3d 20 28 6c 6f 6e 67 ion + 8) = (long
2a40: 29 20 61 64 64 72 65 73 73 20 2d 20 28 6c 6f 6e ) address - (lon
2a50: 67 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 31 g) (function + 1
2a60: 32 29 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 2);. *(long *)
2a70: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 (function +12)
2a80: 3d 20 30 78 39 30 39 30 39 30 39 30 3b 20 20 20 = 0x90909090;
2a90: 2f 2a 20 6e 6f 70 20 6e 6f 70 20 6e 6f 70 20 6e /* nop nop nop n
2aa0: 6f 70 2c 20 66 6f 72 20 61 6c 69 67 6e 6d 65 6e op, for alignmen
2ab0: 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73 5f t */.#define is_
2ac0: 74 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20 tramp(function)
2ad0: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 \. *(unsigned
2ae0: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
2af0: 6f 6e 20 2b 20 30 29 20 3d 3d 20 30 78 36 38 35 on + 0) == 0x685
2b00: 39 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 9 && \. *(unsig
2b10: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 ned short *) (fu
2b20: 6e 63 74 69 6f 6e 20 2b 20 36 29 20 3d 3d 20 30 nction + 6) == 0
2b30: 78 45 39 35 31 0a 23 64 65 66 69 6e 65 20 74 72 xE951.#define tr
2b40: 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75 6e 63 amp_address(func
2b50: 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 6c 6f 6e tion) \. *(lon
2b60: 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 g *) (function
2b70: 2b 20 38 29 20 2b 20 28 6c 6f 6e 67 29 20 28 66 + 8) + (long) (f
2b80: 75 6e 63 74 69 6f 6e 20 2b 20 31 32 29 0a 23 64 unction + 12).#d
2b90: 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 efine tramp_data
2ba0: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 (function) \.
2bb0: 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 *(long *) (func
2bc0: 74 69 6f 6e 20 2b 20 32 29 0a 23 65 6e 64 69 66 tion + 2).#endif
2bd0: 0a 23 69 66 64 65 66 20 5f 5f 6d 36 38 6b 5f 5f .#ifdef __m68k__
2be0: 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a . /* function:.
2bf0: 20 20 20 2a 20 20 20 20 6d 6f 76 65 6c 20 23 3c * movel #<
2c00: 64 61 74 61 3e 2c 61 30 09 09 32 30 20 37 43 20 data>,a0..20 7C
2c10: 3c 64 61 74 61 3e 0a 20 20 20 2a 20 20 20 20 6a <data>. * j
2c20: 6d 70 20 3c 61 64 64 72 65 73 73 3e 09 09 09 34 mp <address>...4
2c30: 45 20 46 39 20 3c 61 64 64 72 65 73 73 3e 0a 20 E F9 <address>.
2c40: 20 20 2a 20 20 20 20 6e 6f 70 09 09 09 09 34 45 * nop....4E
2c50: 20 37 31 0a 20 20 20 2a 2f 0a 20 20 2a 28 73 68 71. */. *(sh
2c60: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ort *) (function
2c70: 20 2b 20 30 29 20 3d 20 30 78 32 30 37 43 3b 0a + 0) = 0x207C;.
2c80: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 *(long *) (fu
2c90: 6e 63 74 69 6f 6e 20 2b 20 32 29 20 3d 20 28 6c nction + 2) = (l
2ca0: 6f 6e 67 29 20 64 61 74 61 3b 0a 20 20 2a 28 73 ong) data;. *(s
2cb0: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f hort *) (functio
2cc0: 6e 20 2b 20 36 29 20 3d 20 30 78 34 45 46 39 3b n + 6) = 0x4EF9;
2cd0: 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 . *(long *) (f
2ce0: 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 28 unction + 8) = (
2cf0: 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 3b 0a 20 long) address;.
2d00: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e *(short *) (fun
2d10: 63 74 69 6f 6e 20 2b 31 32 29 20 3d 20 30 78 34 ction +12) = 0x4
2d20: 45 37 31 3b 0a 23 64 65 66 69 6e 65 20 69 73 5f E71;.#define is_
2d30: 74 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20 tramp(function)
2d40: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 \. *(unsigned
2d50: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
2d60: 6f 6e 20 2b 20 30 29 20 3d 3d 20 30 78 32 30 37 on + 0) == 0x207
2d70: 43 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 C && \. *(unsig
2d80: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 ned short *) (fu
2d90: 6e 63 74 69 6f 6e 20 2b 20 36 29 20 3d 3d 20 30 nction + 6) == 0
2da0: 78 34 45 46 39 20 26 26 20 5c 0a 20 20 2a 28 75 x4EF9 && \. *(u
2db0: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 nsigned short *)
2dc0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 (function +12)
2dd0: 3d 3d 20 30 78 34 45 37 31 0a 23 64 65 66 69 6e == 0x4E71.#defin
2de0: 65 20 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 e tramp_address(
2df0: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a function) \. *
2e00: 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 (long *) (funct
2e10: 69 6f 6e 20 2b 20 38 29 0a 23 64 65 66 69 6e 65 ion + 8).#define
2e20: 20 74 72 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 tramp_data(func
2e30: 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 6c 6f 6e tion) \. *(lon
2e40: 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 g *) (function
2e50: 2b 20 32 29 0a 23 65 6e 64 69 66 0a 23 69 66 20 + 2).#endif.#if
2e60: 64 65 66 69 6e 65 64 28 5f 5f 6d 69 70 73 5f 5f defined(__mips__
2e70: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f ) && !defined(__
2e80: 6d 69 70 73 6e 33 32 5f 5f 29 0a 20 20 2f 2a 20 mipsn32__). /*
2e90: 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 function:. *
2ea0: 20 20 6c 69 20 24 32 2c 3c 64 61 74 61 3e 26 30 li $2,<data>&0
2eb0: 78 66 66 66 66 30 30 30 30 09 09 33 43 20 30 32 xffff0000..3C 02
2ec0: 20 68 69 31 36 28 3c 64 61 74 61 3e 29 0a 20 20 hi16(<data>).
2ed0: 20 2a 20 20 20 20 6f 72 69 20 24 32 2c 24 32 2c * ori $2,$2,
2ee0: 3c 64 61 74 61 3e 26 30 78 66 66 66 66 09 09 33 <data>&0xffff..3
2ef0: 34 20 34 32 20 6c 6f 31 36 28 3c 64 61 74 61 3e 4 42 lo16(<data>
2f00: 29 0a 20 20 20 2a 20 20 20 20 6c 69 20 24 32 35 ). * li $25
2f10: 2c 3c 61 64 64 72 65 73 73 3e 26 30 78 66 66 66 ,<address>&0xfff
2f20: 66 30 30 30 30 09 33 43 20 31 39 20 68 69 31 36 f0000.3C 19 hi16
2f30: 28 3c 61 64 64 72 65 73 73 3e 29 0a 20 20 20 2a (<address>). *
2f40: 20 20 20 20 6f 72 69 20 24 32 35 2c 24 32 35 2c ori $25,$25,
2f50: 3c 61 64 64 72 65 73 73 3e 26 30 78 66 66 66 66 <address>&0xffff
2f60: 09 33 37 20 33 39 20 6c 6f 31 36 28 3c 61 64 64 .37 39 lo16(<add
2f70: 72 65 73 73 3e 29 0a 20 20 20 2a 20 20 20 20 6a ress>). * j
2f80: 20 24 32 35 09 09 09 09 30 33 20 32 30 20 30 30 $25....03 20 00
2f90: 20 30 38 0a 20 20 20 2a 20 20 20 20 6e 6f 70 09 08. * nop.
2fa0: 09 09 09 30 30 20 30 30 20 30 30 20 30 30 0a 20 ...00 00 00 00.
2fb0: 20 20 2a 2f 0a 20 20 2f 2a 20 57 68 61 74 20 61 */. /* What a
2fc0: 62 6f 75 74 20 62 69 67 20 65 6e 64 69 61 6e 20 bout big endian
2fd0: 2f 20 6c 69 74 74 6c 65 20 65 6e 64 69 61 6e 20 / little endian
2fe0: 3f 3f 20 2a 2f 0a 20 20 2a 28 73 68 6f 72 74 20 ?? */. *(short
2ff0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 *) (function + 0
3000: 29 20 3d 20 30 78 33 43 30 32 3b 0a 20 20 2a 28 ) = 0x3C02;. *(
3010: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
3020: 6f 6e 20 2b 20 32 29 20 3d 20 28 75 6e 73 69 67 on + 2) = (unsig
3030: 6e 65 64 20 6c 6f 6e 67 29 20 64 61 74 61 20 3e ned long) data >
3040: 3e 20 31 36 3b 0a 20 20 2a 28 73 68 6f 72 74 20 > 16;. *(short
3050: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 *) (function + 4
3060: 29 20 3d 20 30 78 33 34 34 32 3b 0a 20 20 2a 28 ) = 0x3442;. *(
3070: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
3080: 6f 6e 20 2b 20 36 29 20 3d 20 28 75 6e 73 69 67 on + 6) = (unsig
3090: 6e 65 64 20 6c 6f 6e 67 29 20 64 61 74 61 20 26 ned long) data &
30a0: 20 30 78 66 66 66 66 3b 0a 20 20 2a 28 73 68 6f 0xffff;. *(sho
30b0: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
30c0: 2b 20 38 29 20 3d 20 30 78 33 43 31 39 3b 0a 20 + 8) = 0x3C19;.
30d0: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e *(short *) (fun
30e0: 63 74 69 6f 6e 20 2b 31 30 29 20 3d 20 28 75 6e ction +10) = (un
30f0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64 signed long) add
3100: 72 65 73 73 20 3e 3e 20 31 36 3b 0a 20 20 2a 28 ress >> 16;. *(
3110: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
3120: 6f 6e 20 2b 31 32 29 20 3d 20 30 78 33 37 33 39 on +12) = 0x3739
3130: 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 ;. *(short *) (
3140: 66 75 6e 63 74 69 6f 6e 20 2b 31 34 29 20 3d 20 function +14) =
3150: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
3160: 61 64 64 72 65 73 73 20 26 20 30 78 66 66 66 66 address & 0xffff
3170: 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 ;. *(long *) (
3180: 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20 function +16) =
3190: 30 78 30 33 32 30 30 30 30 38 3b 0a 20 20 2a 28 0x03200008;. *(
31a0: 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 long *) (functi
31b0: 6f 6e 20 2b 32 30 29 20 3d 20 30 78 30 30 30 30 on +20) = 0x0000
31c0: 30 30 30 30 3b 0a 23 64 65 66 69 6e 65 20 69 73 0000;.#define is
31d0: 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29 _tramp(function)
31e0: 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 \. *(unsigned
31f0: 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 short *) (funct
3200: 69 6f 6e 20 2b 20 30 29 20 3d 3d 20 30 78 33 43 ion + 0) == 0x3C
3210: 30 32 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 02 && \. *(unsi
3220: 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 gned short *) (f
3230: 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 3d 20 unction + 4) ==
3240: 30 78 33 34 34 32 20 26 26 20 5c 0a 20 20 2a 28 0x3442 && \. *(
3250: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a unsigned short *
3260: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 ) (function + 8)
3270: 20 3d 3d 20 30 78 33 43 31 39 20 26 26 20 5c 0a == 0x3C19 && \.
3280: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f *(unsigned sho
3290: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
32a0: 2b 31 32 29 20 3d 3d 20 30 78 33 37 33 39 20 26 +12) == 0x3739 &
32b0: 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 & \. *(unsigned
32c0: 20 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 long *) (funct
32d0: 69 6f 6e 20 2b 31 36 29 20 3d 3d 20 30 78 30 33 ion +16) == 0x03
32e0: 32 30 30 30 30 38 20 26 26 20 5c 0a 20 20 2a 28 200008 && \. *(
32f0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 29 unsigned long *)
3300: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 30 29 (function +20)
3310: 20 3d 3d 20 30 78 30 30 30 30 30 30 30 30 0a 23 == 0x00000000.#
3320: 64 65 66 69 6e 65 20 68 69 6c 6f 28 68 69 77 6f define hilo(hiwo
3330: 72 64 2c 6c 6f 77 6f 72 64 29 20 20 5c 0a 20 20 rd,loword) \.
3340: 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 (((unsigned long
3350: 29 20 28 68 69 77 6f 72 64 29 20 3c 3c 20 31 36 ) (hiword) << 16
3360: 29 20 7c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f ) | (unsigned lo
3370: 6e 67 29 20 28 6c 6f 77 6f 72 64 29 29 0a 23 64 ng) (loword)).#d
3380: 65 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 efine tramp_addr
3390: 65 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c ess(function) \
33a0: 0a 20 20 68 69 6c 6f 28 2a 28 75 6e 73 69 67 6e . hilo(*(unsign
33b0: 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e ed short *) (fun
33c0: 63 74 69 6f 6e 20 2b 31 30 29 2c 20 2a 28 75 6e ction +10), *(un
33d0: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 signed short *)
33e0: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 34 29 29 0a (function +14)).
33f0: 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 #define tramp_da
3400: 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a ta(function) \.
3410: 20 20 68 69 6c 6f 28 2a 28 75 6e 73 69 67 6e 65 hilo(*(unsigne
3420: 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 d short *) (func
3430: 74 69 6f 6e 20 2b 20 32 29 2c 20 2a 28 75 6e 73 tion + 2), *(uns
3440: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 igned short *) (
3450: 66 75 6e 63 74 69 6f 6e 20 2b 20 36 29 29 0a 23 function + 6)).#
3460: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d endif.#ifdef __m
3470: 69 70 73 6e 33 32 5f 5f 0a 20 20 2f 2a 20 66 75 ipsn32__. /* fu
3480: 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 nction:. *
3490: 6c 77 20 24 32 2c 31 36 28 24 32 35 29 09 09 09 lw $2,16($25)...
34a0: 38 46 20 32 32 20 30 30 20 31 30 0a 20 20 20 2a 8F 22 00 10. *
34b0: 20 20 20 20 6c 77 20 24 32 35 2c 32 30 28 24 32 lw $25,20($2
34c0: 35 29 09 09 09 38 46 20 33 39 20 30 30 20 31 34 5)...8F 39 00 14
34d0: 0a 20 20 20 2a 20 20 20 20 6a 20 24 32 35 09 09 . * j $25..
34e0: 09 09 30 33 20 32 30 20 30 30 20 30 38 0a 20 20 ..03 20 00 08.
34f0: 20 2a 20 20 20 20 6e 6f 70 09 09 09 09 30 30 20 * nop....00
3500: 30 30 20 30 30 20 30 30 0a 20 20 20 2a 20 20 20 00 00 00. *
3510: 20 2e 77 6f 72 64 20 3c 64 61 74 61 3e 09 09 09 .word <data>...
3520: 3c 64 61 74 61 3e 0a 20 20 20 2a 20 20 20 20 2e <data>. * .
3530: 77 6f 72 64 20 3c 61 64 64 72 65 73 73 3e 09 09 word <address>..
3540: 09 3c 61 64 64 72 65 73 73 3e 0a 20 20 20 2a 2f .<address>. */
3550: 0a 20 20 2f 2a 20 57 68 61 74 20 61 62 6f 75 74 . /* What about
3560: 20 62 69 67 20 65 6e 64 69 61 6e 20 2f 20 6c 69 big endian / li
3570: 74 74 6c 65 20 65 6e 64 69 61 6e 20 3f 3f 20 2a ttle endian ?? *
3580: 2f 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 /. *(unsigned i
3590: 6e 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 nt *) (function
35a0: 2b 20 30 29 20 3d 20 30 78 38 46 32 32 30 30 31 + 0) = 0x8F22001
35b0: 30 3b 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 0;. *(unsigned
35c0: 69 6e 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e int *) (function
35d0: 20 2b 20 34 29 20 3d 20 30 78 38 46 33 39 30 30 + 4) = 0x8F3900
35e0: 31 34 3b 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 14;. *(unsigned
35f0: 20 69 6e 74 20 2a 29 20 28 66 75 6e 63 74 69 6f int *) (functio
3600: 6e 20 2b 20 38 29 20 3d 20 30 78 30 33 32 30 30 n + 8) = 0x03200
3610: 30 30 38 3b 0a 20 20 2a 28 75 6e 73 69 67 6e 65 008;. *(unsigne
3620: 64 20 69 6e 74 20 2a 29 20 28 66 75 6e 63 74 69 d int *) (functi
3630: 6f 6e 20 2b 31 32 29 20 3d 20 30 78 30 30 30 30 on +12) = 0x0000
3640: 30 30 30 30 3b 0a 20 20 2a 28 75 6e 73 69 67 6e 0000;. *(unsign
3650: 65 64 20 69 6e 74 20 2a 29 20 28 66 75 6e 63 74 ed int *) (funct
3660: 69 6f 6e 20 2b 31 36 29 20 3d 20 28 75 6e 73 69 ion +16) = (unsi
3670: 67 6e 65 64 20 69 6e 74 29 20 64 61 74 61 3b 0a gned int) data;.
3680: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 *(unsigned int
3690: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 *) (function +2
36a0: 30 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 69 0) = (unsigned i
36b0: 6e 74 29 20 61 64 64 72 65 73 73 3b 0a 23 64 65 nt) address;.#de
36c0: 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 28 66 75 fine is_tramp(fu
36d0: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 69 nction) \. *(i
36e0: 6e 74 20 2a 29 20 20 20 20 20 20 20 20 20 20 28 nt *) (
36f0: 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 3d function + 0) ==
3700: 20 30 78 38 46 32 32 30 30 31 30 20 26 26 20 5c 0x8F220010 && \
3710: 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 20 20 . *(int *)
3720: 20 20 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b (function +
3730: 20 34 29 20 3d 3d 20 30 78 38 46 33 39 30 30 31 4) == 0x8F39001
3740: 34 20 26 26 20 5c 0a 20 20 2a 28 69 6e 74 20 2a 4 && \. *(int *
3750: 29 20 20 20 20 20 20 20 20 20 20 28 66 75 6e 63 ) (func
3760: 74 69 6f 6e 20 2b 20 38 29 20 3d 3d 20 30 78 30 tion + 8) == 0x0
3770: 33 32 30 30 30 30 38 20 26 26 20 5c 0a 20 20 2a 3200008 && \. *
3780: 28 69 6e 74 20 2a 29 20 20 20 20 20 20 20 20 20 (int *)
3790: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 (function +12)
37a0: 3d 3d 20 30 78 30 30 30 30 30 30 30 30 0a 23 64 == 0x00000000.#d
37b0: 65 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 efine tramp_addr
37c0: 65 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c ess(function) \
37d0: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e . *(unsigned in
37e0: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
37f0: 32 30 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 20).#define tram
3800: 70 5f 64 61 74 61 28 66 75 6e 63 74 69 6f 6e 29 p_data(function)
3810: 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 \. *(unsigned
3820: 20 69 6e 74 20 2a 29 20 28 66 75 6e 63 74 69 6f int *) (functio
3830: 6e 20 2b 31 36 29 0a 23 65 6e 64 69 66 0a 23 69 n +16).#endif.#i
3840: 66 64 65 66 20 5f 5f 6d 69 70 73 36 34 6f 6c 64 fdef __mips64old
3850: 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e __. /* function
3860: 3a 0a 20 20 20 2a 20 20 20 20 64 6c 69 20 24 32 :. * dli $2
3870: 2c 3c 64 61 74 61 3e 09 09 09 33 43 20 30 32 20 ,<data>...3C 02
3880: 68 69 31 36 28 68 69 33 32 28 3c 64 61 74 61 3e hi16(hi32(<data>
3890: 29 29 0a 20 20 20 2a 09 09 09 09 09 33 34 20 34 )). *.....34 4
38a0: 32 20 6c 6f 31 36 28 68 69 33 32 28 3c 64 61 74 2 lo16(hi32(<dat
38b0: 61 3e 29 29 0a 20 20 20 2a 09 09 09 09 09 30 30 a>)). *.....00
38c0: 20 30 32 20 31 34 20 33 38 0a 20 20 20 2a 09 09 02 14 38. *..
38d0: 09 09 09 33 34 20 34 32 20 68 69 31 36 28 6c 6f ...34 42 hi16(lo
38e0: 33 32 28 3c 64 61 74 61 3e 29 29 0a 20 20 20 2a 32(<data>)). *
38f0: 09 09 09 09 09 30 30 20 30 32 20 31 34 20 33 38 .....00 02 14 38
3900: 0a 20 20 20 2a 09 09 09 09 09 33 34 20 34 32 20 . *.....34 42
3910: 6c 6f 31 36 28 6c 6f 33 32 28 3c 64 61 74 61 3e lo16(lo32(<data>
3920: 29 29 0a 20 20 20 2a 20 20 20 20 64 6c 69 20 24 )). * dli $
3930: 32 35 2c 3c 61 64 64 72 65 73 73 3e 09 09 33 43 25,<address>..3C
3940: 20 31 39 20 68 69 31 36 28 68 69 33 32 28 3c 61 19 hi16(hi32(<a
3950: 64 64 72 65 73 73 3e 29 29 0a 20 20 20 2a 09 09 ddress>)). *..
3960: 09 09 09 33 37 20 33 39 20 6c 6f 31 36 28 68 69 ...37 39 lo16(hi
3970: 33 32 28 3c 61 64 64 72 65 73 73 3e 29 29 0a 20 32(<address>)).
3980: 20 20 2a 09 09 09 09 09 30 30 20 31 39 20 43 43 *.....00 19 CC
3990: 20 33 38 0a 20 20 20 2a 09 09 09 09 09 33 37 20 38. *.....37
39a0: 33 39 20 68 69 31 36 28 6c 6f 33 32 28 3c 61 64 39 hi16(lo32(<ad
39b0: 64 72 65 73 73 3e 29 29 0a 20 20 20 2a 09 09 09 dress>)). *...
39c0: 09 09 30 30 20 31 39 20 43 43 20 33 38 0a 20 20 ..00 19 CC 38.
39d0: 20 2a 09 09 09 09 09 33 37 20 33 39 20 6c 6f 31 *.....37 39 lo1
39e0: 36 28 6c 6f 33 32 28 3c 61 64 64 72 65 73 73 3e 6(lo32(<address>
39f0: 29 29 0a 20 20 20 2a 20 20 20 20 6a 20 24 32 35 )). * j $25
3a00: 09 09 09 09 30 33 20 32 30 20 30 30 20 30 38 0a ....03 20 00 08.
3a10: 20 20 20 2a 20 20 20 20 6e 6f 70 09 09 09 09 30 * nop....0
3a20: 30 20 30 30 20 30 30 20 30 30 0a 20 20 20 2a 2f 0 00 00 00. */
3a30: 0a 20 20 2f 2a 20 57 68 61 74 20 61 62 6f 75 74 . /* What about
3a40: 20 62 69 67 20 65 6e 64 69 61 6e 20 2f 20 6c 69 big endian / li
3a50: 74 74 6c 65 20 65 6e 64 69 61 6e 20 3f 3f 20 2a ttle endian ?? *
3a60: 2f 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 /. *(short *) (
3a70: 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20 function + 0) =
3a80: 30 78 33 43 30 32 3b 0a 20 20 2a 28 73 68 6f 72 0x3C02;. *(shor
3a90: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
3aa0: 20 32 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 2) = (unsigned
3ab0: 6c 6f 6e 67 29 20 64 61 74 61 20 3e 3e 20 34 38 long) data >> 48
3ac0: 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 ;. *(short *) (
3ad0: 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 20 function + 4) =
3ae0: 30 78 33 34 34 32 3b 0a 20 20 2a 28 73 68 6f 72 0x3442;. *(shor
3af0: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
3b00: 20 36 29 20 3d 20 28 28 75 6e 73 69 67 6e 65 64 6) = ((unsigned
3b10: 20 6c 6f 6e 67 29 20 64 61 74 61 20 3e 3e 20 33 long) data >> 3
3b20: 32 29 20 26 20 30 78 66 66 66 66 3b 0a 20 20 2a 2) & 0xffff;. *
3b30: 28 69 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74 (int *) (funct
3b40: 69 6f 6e 20 2b 20 38 29 20 3d 20 30 78 30 30 30 ion + 8) = 0x000
3b50: 32 31 34 33 38 3b 0a 20 20 2a 28 73 68 6f 72 74 21438;. *(short
3b60: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 *) (function +1
3b70: 32 29 20 3d 20 30 78 33 34 34 32 3b 0a 20 20 2a 2) = 0x3442;. *
3b80: 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 (short *) (funct
3b90: 69 6f 6e 20 2b 31 34 29 20 3d 20 28 28 75 6e 73 ion +14) = ((uns
3ba0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 61 74 61 igned long) data
3bb0: 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66 66 66 >> 16) & 0xffff
3bc0: 3b 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 28 ;. *(int *) (
3bd0: 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20 function +16) =
3be0: 30 78 30 30 30 32 31 34 33 38 3b 0a 20 20 2a 28 0x00021438;. *(
3bf0: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
3c00: 6f 6e 20 2b 32 30 29 20 3d 20 30 78 33 34 34 32 on +20) = 0x3442
3c10: 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 ;. *(short *) (
3c20: 66 75 6e 63 74 69 6f 6e 20 2b 32 32 29 20 3d 20 function +22) =
3c30: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
3c40: 64 61 74 61 20 26 20 30 78 66 66 66 66 3b 0a 20 data & 0xffff;.
3c50: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e *(short *) (fun
3c60: 63 74 69 6f 6e 20 2b 32 34 29 20 3d 20 30 78 33 ction +24) = 0x3
3c70: 43 31 39 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a C19;. *(short *
3c80: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 36 29 ) (function +26)
3c90: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e = (unsigned lon
3ca0: 67 29 20 61 64 64 72 65 73 73 20 3e 3e 20 34 38 g) address >> 48
3cb0: 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 ;. *(short *) (
3cc0: 66 75 6e 63 74 69 6f 6e 20 2b 32 38 29 20 3d 20 function +28) =
3cd0: 30 78 33 37 33 39 3b 0a 20 20 2a 28 73 68 6f 72 0x3739;. *(shor
3ce0: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
3cf0: 33 30 29 20 3d 20 28 28 75 6e 73 69 67 6e 65 64 30) = ((unsigned
3d00: 20 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 20 3e long) address >
3d10: 3e 20 33 32 29 20 26 20 30 78 66 66 66 66 3b 0a > 32) & 0xffff;.
3d20: 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 28 66 75 *(int *) (fu
3d30: 6e 63 74 69 6f 6e 20 2b 33 32 29 20 3d 20 30 78 nction +32) = 0x
3d40: 30 30 31 39 43 43 33 38 3b 0a 20 20 2a 28 73 68 0019CC38;. *(sh
3d50: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ort *) (function
3d60: 20 2b 33 36 29 20 3d 20 30 78 33 37 33 39 3b 0a +36) = 0x3739;.
3d70: 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 *(short *) (fu
3d80: 6e 63 74 69 6f 6e 20 2b 33 38 29 20 3d 20 28 28 nction +38) = ((
3d90: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 61 unsigned long) a
3da0: 64 64 72 65 73 73 20 3e 3e 20 31 36 29 20 26 20 ddress >> 16) &
3db0: 30 78 66 66 66 66 3b 0a 20 20 2a 28 69 6e 74 20 0xffff;. *(int
3dc0: 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b *) (function +
3dd0: 34 30 29 20 3d 20 30 78 30 30 31 39 43 43 33 38 40) = 0x0019CC38
3de0: 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 ;. *(short *) (
3df0: 66 75 6e 63 74 69 6f 6e 20 2b 34 34 29 20 3d 20 function +44) =
3e00: 30 78 33 37 33 39 3b 0a 20 20 2a 28 73 68 6f 72 0x3739;. *(shor
3e10: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
3e20: 34 36 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 46) = (unsigned
3e30: 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 20 26 20 long) address &
3e40: 30 78 66 66 66 66 3b 0a 20 20 2a 28 69 6e 74 20 0xffff;. *(int
3e50: 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b *) (function +
3e60: 34 38 29 20 3d 20 30 78 30 33 32 30 30 30 30 38 48) = 0x03200008
3e70: 3b 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 28 ;. *(int *) (
3e80: 66 75 6e 63 74 69 6f 6e 20 2b 35 32 29 20 3d 20 function +52) =
3e90: 30 78 30 30 30 30 30 30 30 30 3b 0a 23 64 65 66 0x00000000;.#def
3ea0: 69 6e 65 20 69 73 5f 74 72 61 6d 70 28 66 75 6e ine is_tramp(fun
3eb0: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e ction) \. *(un
3ec0: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 signed short *)
3ed0: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d (function + 0) =
3ee0: 3d 20 30 78 33 43 30 32 20 26 26 20 5c 0a 20 20 = 0x3C02 && \.
3ef0: 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 *(unsigned short
3f00: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 *) (function +
3f10: 34 29 20 3d 3d 20 30 78 33 34 34 32 20 26 26 20 4) == 0x3442 &&
3f20: 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 \. *(unsigned i
3f30: 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f nt *) (functio
3f40: 6e 20 2b 20 38 29 20 3d 3d 20 30 78 30 30 30 32 n + 8) == 0x0002
3f50: 31 34 33 38 20 26 26 20 5c 0a 20 20 2a 28 75 6e 1438 && \. *(un
3f60: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 signed short *)
3f70: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d (function +12) =
3f80: 3d 20 30 78 33 34 34 32 20 26 26 20 5c 0a 20 20 = 0x3442 && \.
3f90: 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a *(unsigned int *
3fa0: 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 ) (function +1
3fb0: 36 29 20 3d 3d 20 30 78 30 30 30 32 31 34 33 38 6) == 0x00021438
3fc0: 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e && \. *(unsign
3fd0: 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e ed short *) (fun
3fe0: 63 74 69 6f 6e 20 2b 32 30 29 20 3d 3d 20 30 78 ction +20) == 0x
3ff0: 33 34 34 32 20 26 26 20 5c 0a 20 20 2a 28 75 6e 3442 && \. *(un
4000: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 signed short *)
4010: 28 66 75 6e 63 74 69 6f 6e 20 2b 32 34 29 20 3d (function +24) =
4020: 3d 20 30 78 33 43 31 39 20 26 26 20 5c 0a 20 20 = 0x3C19 && \.
4030: 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 *(unsigned short
4040: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 *) (function +2
4050: 38 29 20 3d 3d 20 30 78 33 37 33 39 20 26 26 20 8) == 0x3739 &&
4060: 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 \. *(unsigned i
4070: 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f nt *) (functio
4080: 6e 20 2b 33 32 29 20 3d 3d 20 30 78 30 30 31 39 n +32) == 0x0019
4090: 43 43 33 38 20 26 26 20 5c 0a 20 20 2a 28 75 6e CC38 && \. *(un
40a0: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 signed short *)
40b0: 28 66 75 6e 63 74 69 6f 6e 20 2b 33 36 29 20 3d (function +36) =
40c0: 3d 20 30 78 33 37 33 39 20 26 26 20 5c 0a 20 20 = 0x3739 && \.
40d0: 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a *(unsigned int *
40e0: 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 34 ) (function +4
40f0: 30 29 20 3d 3d 20 30 78 30 30 31 39 43 43 33 38 0) == 0x0019CC38
4100: 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e && \. *(unsign
4110: 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e ed short *) (fun
4120: 63 74 69 6f 6e 20 2b 34 34 29 20 3d 3d 20 30 78 ction +44) == 0x
4130: 33 37 33 39 20 26 26 20 5c 0a 20 20 2a 28 75 6e 3739 && \. *(un
4140: 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 20 20 signed int *)
4150: 28 66 75 6e 63 74 69 6f 6e 20 2b 34 38 29 20 3d (function +48) =
4160: 3d 20 30 78 30 33 32 30 30 30 30 38 20 26 26 20 = 0x03200008 &&
4170: 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 \. *(unsigned i
4180: 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f nt *) (functio
4190: 6e 20 2b 35 32 29 20 3d 3d 20 30 78 30 30 30 30 n +52) == 0x0000
41a0: 30 30 30 30 0a 23 64 65 66 69 6e 65 20 68 69 6c 0000.#define hil
41b0: 6f 28 77 6f 72 64 33 2c 77 6f 72 64 32 2c 77 6f o(word3,word2,wo
41c0: 72 64 31 2c 77 6f 72 64 30 29 20 20 5c 0a 20 20 rd1,word0) \.
41d0: 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 (((unsigned long
41e0: 29 20 28 77 6f 72 64 33 29 20 3c 3c 20 34 38 29 ) (word3) << 48)
41f0: 20 7c 20 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f | ((unsigned lo
4200: 6e 67 29 20 28 77 6f 72 64 32 29 20 3c 3c 20 33 ng) (word2) << 3
4210: 32 29 20 7c 20 5c 0a 20 20 20 28 28 75 6e 73 69 2) | \. ((unsi
4220: 67 6e 65 64 20 6c 6f 6e 67 29 20 28 77 6f 72 64 gned long) (word
4230: 31 29 20 3c 3c 20 31 36 29 20 7c 20 28 75 6e 73 1) << 16) | (uns
4240: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 77 6f 72 igned long) (wor
4250: 64 30 29 29 0a 23 64 65 66 69 6e 65 20 74 72 61 d0)).#define tra
4260: 6d 70 5f 61 64 64 72 65 73 73 28 66 75 6e 63 74 mp_address(funct
4270: 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c 6f 28 2a ion) \. hilo(*
4280: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 (unsigned short
4290: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 36 *) (function +26
42a0: 29 2c 20 5c 0a 20 20 20 20 20 20 20 2a 28 75 6e ), \. *(un
42b0: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 signed short *)
42c0: 28 66 75 6e 63 74 69 6f 6e 20 2b 33 30 29 2c 20 (function +30),
42d0: 5c 0a 20 20 20 20 20 20 20 2a 28 75 6e 73 69 67 \. *(unsig
42e0: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 ned short *) (fu
42f0: 6e 63 74 69 6f 6e 20 2b 33 38 29 2c 20 5c 0a 20 nction +38), \.
4300: 20 20 20 20 20 20 2a 28 75 6e 73 69 67 6e 65 64 *(unsigned
4310: 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 short *) (funct
4320: 69 6f 6e 20 2b 34 36 29 29 0a 23 64 65 66 69 6e ion +46)).#defin
4330: 65 20 74 72 61 6d 70 5f 64 61 74 61 28 66 75 6e e tramp_data(fun
4340: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c 6f ction) \. hilo
4350: 28 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 (*(unsigned shor
4360: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
4370: 20 32 29 2c 20 5c 0a 20 20 20 20 20 20 20 2a 28 2), \. *(
4380: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a unsigned short *
4390: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 36 29 ) (function + 6)
43a0: 2c 20 5c 0a 20 20 20 20 20 20 20 2a 28 75 6e 73 , \. *(uns
43b0: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 igned short *) (
43c0: 66 75 6e 63 74 69 6f 6e 20 2b 31 34 29 2c 20 5c function +14), \
43d0: 0a 20 20 20 20 20 20 20 2a 28 75 6e 73 69 67 6e . *(unsign
43e0: 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e ed short *) (fun
43f0: 63 74 69 6f 6e 20 2b 32 32 29 29 0a 23 65 6e 64 ction +22)).#end
4400: 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d 69 70 73 if.#ifdef __mips
4410: 36 34 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 69 64__. /* functi
4420: 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 6c 64 20 24 on:. * ld $
4430: 32 2c 31 36 28 24 32 35 29 09 09 09 44 46 20 32 2,16($25)...DF 2
4440: 32 20 30 30 20 31 30 0a 20 20 20 2a 20 20 20 20 2 00 10. *
4450: 6c 64 20 24 32 35 2c 32 34 28 24 32 35 29 09 09 ld $25,24($25)..
4460: 09 44 46 20 33 39 20 30 30 20 31 38 0a 20 20 20 .DF 39 00 18.
4470: 2a 20 20 20 20 6a 20 24 32 35 09 09 09 09 30 33 * j $25....03
4480: 20 32 30 20 30 30 20 30 38 0a 20 20 20 2a 20 20 20 00 08. *
4490: 20 20 6e 6f 70 09 09 09 09 30 30 20 30 30 20 30 nop....00 00 0
44a0: 30 20 30 30 0a 20 20 20 2a 20 20 20 20 2e 64 77 0 00. * .dw
44b0: 6f 72 64 20 3c 64 61 74 61 3e 09 09 09 3c 64 61 ord <data>...<da
44c0: 74 61 3e 0a 20 20 20 2a 20 20 20 20 2e 64 77 6f ta>. * .dwo
44d0: 72 64 20 3c 61 64 64 72 65 73 73 3e 09 09 3c 61 rd <address>..<a
44e0: 64 64 72 65 73 73 3e 0a 20 20 20 2a 2f 0a 20 20 ddress>. */.
44f0: 2f 2a 20 57 68 61 74 20 61 62 6f 75 74 20 62 69 /* What about bi
4500: 67 20 65 6e 64 69 61 6e 20 2f 20 6c 69 74 74 6c g endian / littl
4510: 65 20 65 6e 64 69 61 6e 20 3f 3f 20 2a 2f 0a 20 e endian ?? */.
4520: 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 20 20 20 20 *(long *)
4530: 20 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 (function +
4540: 30 29 20 3d 20 30 78 44 46 32 32 30 30 31 30 44 0) = 0xDF220010D
4550: 46 33 39 30 30 31 38 4c 3b 0a 20 20 2a 28 6c 6f F390018L;. *(lo
4560: 6e 67 20 2a 29 20 20 20 20 20 20 20 20 20 20 28 ng *) (
4570: 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 function + 8) =
4580: 30 78 30 33 32 30 30 30 30 38 30 30 30 30 30 30 0x03200008000000
4590: 30 30 4c 3b 0a 20 20 2a 28 75 6e 73 69 67 6e 65 00L;. *(unsigne
45a0: 64 20 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 d long *) (funct
45b0: 69 6f 6e 20 2b 31 36 29 20 3d 20 28 75 6e 73 69 ion +16) = (unsi
45c0: 67 6e 65 64 20 6c 6f 6e 67 29 20 64 61 74 61 3b gned long) data;
45d0: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 6c 6f . *(unsigned lo
45e0: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 ng *) (function
45f0: 2b 32 34 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 +24) = (unsigned
4600: 20 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 3b 0a long) address;.
4610: 23 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 #define is_tramp
4620: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 (function) \.
4630: 2a 28 6c 6f 6e 67 20 2a 29 20 20 20 20 20 20 20 *(long *)
4640: 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 (function + 0
4650: 29 20 3d 3d 20 30 78 44 46 32 32 30 30 31 30 44 ) == 0xDF220010D
4660: 46 33 39 30 30 31 38 4c 20 26 26 20 5c 0a 20 20 F390018L && \.
4670: 2a 28 6c 6f 6e 67 20 2a 29 20 20 20 20 20 20 20 *(long *)
4680: 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 (function + 8
4690: 29 20 3d 3d 20 30 78 30 33 32 30 30 30 30 38 30 ) == 0x032000080
46a0: 30 30 30 30 30 30 30 4c 0a 23 64 65 66 69 6e 65 0000000L.#define
46b0: 20 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66 tramp_address(f
46c0: 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 unction) \. *(
46d0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 29 unsigned long *)
46e0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 34 29 0a (function +24).
46f0: 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 #define tramp_da
4700: 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a ta(function) \.
4710: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e *(unsigned lon
4720: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b g *) (function +
4730: 31 36 29 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 16).#endif.#if d
4740: 65 66 69 6e 65 64 28 5f 5f 73 70 61 72 63 5f 5f efined(__sparc__
4750: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f ) && !defined(__
4760: 73 70 61 72 63 36 34 5f 5f 29 0a 20 20 2f 2a 20 sparc64__). /*
4770: 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 function:. *
4780: 20 20 73 65 74 68 69 20 25 68 69 28 3c 64 61 74 sethi %hi(<dat
4790: 61 3e 29 2c 25 67 32 09 09 30 35 30 30 30 30 30 a>),%g2..0500000
47a0: 30 20 7c 20 28 3c 64 61 74 61 3e 20 3e 3e 20 31 0 | (<data> >> 1
47b0: 30 29 0a 20 20 20 2a 20 20 20 20 73 65 74 68 69 0). * sethi
47c0: 20 25 68 69 28 3c 61 64 64 72 65 73 73 3e 29 2c %hi(<address>),
47d0: 25 67 31 09 30 33 30 30 30 30 30 30 20 7c 20 28 %g1.03000000 | (
47e0: 3c 61 64 64 72 65 73 73 3e 20 3e 3e 20 31 30 29 <address> >> 10)
47f0: 0a 20 20 20 2a 20 20 20 20 6a 6d 70 20 25 67 31 . * jmp %g1
4800: 2b 25 6c 6f 28 3c 61 64 64 72 65 73 73 3e 29 09 +%lo(<address>).
4810: 09 38 31 43 30 36 30 30 30 20 7c 20 28 3c 61 64 .81C06000 | (<ad
4820: 64 72 65 73 73 3e 20 26 20 30 78 33 66 66 29 0a dress> & 0x3ff).
4830: 20 20 20 2a 20 20 20 20 6f 72 20 25 67 32 2c 25 * or %g2,%
4840: 6c 6f 28 3c 64 61 74 61 3e 29 2c 25 67 32 09 09 lo(<data>),%g2..
4850: 38 34 31 30 41 30 30 30 20 7c 20 28 3c 64 61 74 8410A000 | (<dat
4860: 61 3e 20 26 20 30 78 33 66 66 29 0a 20 20 20 2a a> & 0x3ff). *
4870: 2f 0a 23 64 65 66 69 6e 65 20 68 69 28 77 6f 72 /.#define hi(wor
4880: 64 29 20 20 28 28 75 6e 73 69 67 6e 65 64 20 6c d) ((unsigned l
4890: 6f 6e 67 29 20 28 77 6f 72 64 29 20 3e 3e 20 31 ong) (word) >> 1
48a0: 30 29 0a 23 64 65 66 69 6e 65 20 6c 6f 28 77 6f 0).#define lo(wo
48b0: 72 64 29 20 20 28 28 75 6e 73 69 67 6e 65 64 20 rd) ((unsigned
48c0: 6c 6f 6e 67 29 20 28 77 6f 72 64 29 20 26 20 30 long) (word) & 0
48d0: 78 33 66 66 29 0a 20 20 2a 28 6c 6f 6e 67 20 2a x3ff). *(long *
48e0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 ) (function + 0)
48f0: 20 3d 20 30 78 30 35 30 30 30 30 30 30 20 7c 20 = 0x05000000 |
4900: 68 69 28 64 61 74 61 29 3b 0a 20 20 2a 28 6c 6f hi(data);. *(lo
4910: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 ng *) (function
4920: 2b 20 34 29 20 3d 20 30 78 30 33 30 30 30 30 30 + 4) = 0x0300000
4930: 30 20 7c 20 68 69 28 61 64 64 72 65 73 73 29 3b 0 | hi(address);
4940: 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 . *(long *) (fu
4950: 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 30 78 nction + 8) = 0x
4960: 38 31 43 30 36 30 30 30 20 7c 20 6c 6f 28 61 64 81C06000 | lo(ad
4970: 64 72 65 73 73 29 3b 0a 20 20 2a 28 6c 6f 6e 67 dress);. *(long
4980: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 *) (function +1
4990: 32 29 20 3d 20 30 78 38 34 31 30 41 30 30 30 20 2) = 0x8410A000
49a0: 7c 20 6c 6f 28 64 61 74 61 29 3b 0a 23 64 65 66 | lo(data);.#def
49b0: 69 6e 65 20 69 73 5f 74 72 61 6d 70 28 66 75 6e ine is_tramp(fun
49c0: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 2a 28 6c ction) \. (*(l
49d0: 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ong *) (function
49e0: 20 2b 20 30 29 20 26 20 30 78 66 66 63 30 30 30 + 0) & 0xffc000
49f0: 30 30 29 20 3d 3d 20 30 78 30 35 30 30 30 30 30 00) == 0x0500000
4a00: 30 20 26 26 20 5c 0a 20 20 28 2a 28 6c 6f 6e 67 0 && \. (*(long
4a10: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 *) (function +
4a20: 34 29 20 26 20 30 78 66 66 63 30 30 30 30 30 29 4) & 0xffc00000)
4a30: 20 3d 3d 20 30 78 30 33 30 30 30 30 30 30 20 26 == 0x03000000 &
4a40: 26 20 5c 0a 20 20 28 2a 28 6c 6f 6e 67 20 2a 29 & \. (*(long *)
4a50: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 (function + 8)
4a60: 26 20 30 78 66 66 66 66 66 63 30 30 29 20 3d 3d & 0xfffffc00) ==
4a70: 20 30 78 38 31 43 30 36 30 30 30 20 26 26 20 5c 0x81C06000 && \
4a80: 0a 20 20 28 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 . (*(long *) (f
4a90: 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 26 20 30 unction +12) & 0
4aa0: 78 66 66 66 66 66 63 30 30 29 20 3d 3d 20 30 78 xfffffc00) == 0x
4ab0: 38 34 31 30 41 30 30 30 0a 23 64 65 66 69 6e 65 8410A000.#define
4ac0: 20 68 69 6c 6f 28 68 69 77 6f 72 64 2c 6c 6f 77 hilo(hiword,low
4ad0: 6f 72 64 29 20 20 28 28 28 68 69 77 6f 72 64 29 ord) (((hiword)
4ae0: 20 3c 3c 20 31 30 29 20 7c 20 28 28 6c 6f 77 6f << 10) | ((lowo
4af0: 72 64 29 20 26 20 30 78 33 66 66 29 29 0a 23 64 rd) & 0x3ff)).#d
4b00: 65 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 efine tramp_addr
4b10: 65 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c ess(function) \
4b20: 0a 20 20 68 69 6c 6f 28 2a 28 6c 6f 6e 67 20 2a . hilo(*(long *
4b30: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 ) (function + 4)
4b40: 2c 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e , *(long *) (fun
4b50: 63 74 69 6f 6e 20 2b 20 38 29 29 0a 23 64 65 66 ction + 8)).#def
4b60: 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 28 66 ine tramp_data(f
4b70: 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69 unction) \. hi
4b80: 6c 6f 28 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 lo(*(long *) (fu
4b90: 6e 63 74 69 6f 6e 20 2b 20 30 29 2c 20 2a 28 6c nction + 0), *(l
4ba0: 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ong *) (function
4bb0: 20 2b 31 32 29 29 0a 23 65 6e 64 69 66 0a 23 69 +12)).#endif.#i
4bc0: 66 64 65 66 20 5f 5f 73 70 61 72 63 36 34 5f 5f fdef __sparc64__
4bd0: 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a . /* function:.
4be0: 20 20 20 2a 20 20 20 20 72 64 20 25 70 63 2c 25 * rd %pc,%
4bf0: 67 31 09 09 09 38 33 34 31 34 30 30 30 0a 20 20 g1...83414000.
4c00: 20 2a 20 20 20 20 6c 64 78 20 5b 25 67 31 2b 32 * ldx [%g1+2
4c10: 34 5d 2c 25 67 32 09 09 43 34 35 38 36 30 31 38 4],%g2..C4586018
4c20: 0a 20 20 20 2a 20 20 20 20 6a 6d 70 20 25 67 32 . * jmp %g2
4c30: 09 09 09 09 38 31 43 30 38 30 30 30 0a 20 20 20 ....81C08000.
4c40: 2a 20 20 20 20 6c 64 78 20 5b 25 67 31 2b 31 36 * ldx [%g1+16
4c50: 5d 2c 25 67 35 09 09 43 41 35 38 36 30 31 30 0a ],%g5..CA586010.
4c60: 20 20 20 2a 20 20 20 20 2e 6c 6f 6e 67 20 68 69 * .long hi
4c70: 67 68 33 32 28 3c 64 61 74 61 3e 29 09 09 3c 64 gh32(<data>)..<d
4c80: 61 74 61 3e 20 3e 3e 20 33 32 0a 20 20 20 2a 20 ata> >> 32. *
4c90: 20 20 20 2e 6c 6f 6e 67 20 6c 6f 77 33 32 28 3c .long low32(<
4ca0: 64 61 74 61 3e 29 09 09 3c 64 61 74 61 3e 20 26 data>)..<data> &
4cb0: 20 30 78 66 66 66 66 66 66 66 66 0a 20 20 20 2a 0xffffffff. *
4cc0: 20 20 20 20 2e 6c 6f 6e 67 20 68 69 67 68 33 32 .long high32
4cd0: 28 3c 61 64 64 72 65 73 73 3e 29 09 09 3c 61 64 (<address>)..<ad
4ce0: 64 72 65 73 73 3e 20 3e 3e 20 33 32 0a 20 20 20 dress> >> 32.
4cf0: 2a 20 20 20 20 2e 6c 6f 6e 67 20 6c 6f 77 33 32 * .long low32
4d00: 28 3c 61 64 64 72 65 73 73 3e 29 09 09 3c 61 64 (<address>)..<ad
4d10: 64 72 65 73 73 3e 20 26 20 30 78 66 66 66 66 66 dress> & 0xfffff
4d20: 66 66 66 0a 20 20 20 2a 2f 0a 20 20 2a 28 69 6e fff. */. *(in
4d30: 74 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 t *) (function
4d40: 2b 20 30 29 20 3d 20 30 78 38 33 34 31 34 30 30 + 0) = 0x8341400
4d50: 30 3b 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 28 0;. *(int *) (
4d60: 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 20 function + 4) =
4d70: 30 78 43 34 35 38 36 30 31 38 3b 0a 20 20 2a 28 0xC4586018;. *(
4d80: 69 6e 74 20 2a 29 20 20 28 66 75 6e 63 74 69 6f int *) (functio
4d90: 6e 20 2b 20 38 29 20 3d 20 30 78 38 31 43 30 38 n + 8) = 0x81C08
4da0: 30 30 30 3b 0a 20 20 2a 28 69 6e 74 20 2a 29 20 000;. *(int *)
4db0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 (function +12)
4dc0: 3d 20 30 78 43 41 35 38 36 30 31 30 3b 0a 20 20 = 0xCA586010;.
4dd0: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 *(long *) (funct
4de0: 69 6f 6e 20 2b 31 36 29 20 3d 20 28 6c 6f 6e 67 ion +16) = (long
4df0: 29 20 64 61 74 61 3b 0a 20 20 2a 28 6c 6f 6e 67 ) data;. *(long
4e00: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 *) (function +2
4e10: 34 29 20 3d 20 28 6c 6f 6e 67 29 20 61 64 64 72 4) = (long) addr
4e20: 65 73 73 3b 0a 23 64 65 66 69 6e 65 20 69 73 5f ess;.#define is_
4e30: 74 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20 tramp(function)
4e40: 20 5c 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 28 \. *(int *) (
4e50: 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 3d function + 0) ==
4e60: 20 30 78 38 33 34 31 34 30 30 30 20 26 26 20 5c 0x83414000 && \
4e70: 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 28 66 75 . *(int *) (fu
4e80: 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 3d 20 30 nction + 4) == 0
4e90: 78 43 34 35 38 36 30 31 38 20 26 26 20 5c 0a 20 xC4586018 && \.
4ea0: 20 2a 28 69 6e 74 20 2a 29 20 20 28 66 75 6e 63 *(int *) (func
4eb0: 74 69 6f 6e 20 2b 20 38 29 20 3d 3d 20 30 78 38 tion + 8) == 0x8
4ec0: 31 43 30 38 30 30 30 20 26 26 20 5c 0a 20 20 2a 1C08000 && \. *
4ed0: 28 69 6e 74 20 2a 29 20 20 28 66 75 6e 63 74 69 (int *) (functi
4ee0: 6f 6e 20 2b 31 32 29 20 3d 3d 20 30 78 43 41 35 on +12) == 0xCA5
4ef0: 38 36 30 31 30 0a 23 64 65 66 69 6e 65 20 74 72 86010.#define tr
4f00: 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75 6e 63 amp_address(func
4f10: 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 6c 6f 6e tion) \. *(lon
4f20: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b g *) (function +
4f30: 32 34 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 24).#define tram
4f40: 70 5f 64 61 74 61 28 66 75 6e 63 74 69 6f 6e 29 p_data(function)
4f50: 20 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 \. *(long *)
4f60: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 0a 23 (function +16).#
4f70: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 61 endif.#ifdef __a
4f80: 6c 70 68 61 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 lpha__. /* func
4f90: 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 62 72 tion:. * br
4fa0: 20 24 31 2c 66 75 6e 63 74 69 6f 6e 2e 2e 6e 67 $1,function..ng
4fb0: 09 30 30 20 30 30 20 32 30 20 43 30 0a 20 20 20 .00 00 20 C0.
4fc0: 2a 20 66 75 6e 63 74 69 6f 6e 2e 2e 6e 67 3a 0a * function..ng:.
4fd0: 20 20 20 2a 20 20 20 20 6c 64 71 20 24 32 37 2c * ldq $27,
4fe0: 32 30 28 24 31 29 09 09 31 34 20 30 30 20 36 31 20($1)..14 00 61
4ff0: 20 41 37 0a 20 20 20 2a 20 20 20 20 6c 64 71 20 A7. * ldq
5000: 24 31 2c 31 32 28 24 31 29 09 09 30 43 20 30 30 $1,12($1)..0C 00
5010: 20 32 31 20 41 34 0a 20 20 20 2a 20 20 20 20 6a 21 A4. * j
5020: 6d 70 20 24 33 31 2c 28 24 32 37 29 2c 30 09 09 mp $31,($27),0..
5030: 30 30 20 30 30 20 46 42 20 36 42 0a 20 20 20 2a 00 00 FB 6B. *
5040: 20 20 20 20 2e 71 75 61 64 20 3c 64 61 74 61 3e .quad <data>
5050: 09 09 3c 64 61 74 61 3e 0a 20 20 20 2a 20 20 20 ..<data>. *
5060: 20 2e 71 75 61 64 20 3c 61 64 64 72 65 73 73 3e .quad <address>
5070: 09 09 3c 61 64 64 72 65 73 73 3e 0a 20 20 20 2a ..<address>. *
5080: 2f 0a 20 20 7b 20 73 74 61 74 69 63 20 69 6e 74 /. { static int
5090: 20 63 6f 64 65 20 5b 34 5d 20 3d 0a 20 20 20 20 code [4] =.
50a0: 20 20 7b 20 30 78 43 30 32 30 30 30 30 30 2c 20 { 0xC0200000,
50b0: 30 78 41 37 36 31 30 30 31 34 2c 20 30 78 41 34 0xA7610014, 0xA4
50c0: 32 31 30 30 30 43 2c 20 30 78 36 42 46 42 30 30 21000C, 0x6BFB00
50d0: 30 30 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 00 };. int i;
50e0: 0a 20 20 20 20 66 6f 72 20 28 69 3d 30 3b 20 69 . for (i=0; i
50f0: 3c 34 3b 20 69 2b 2b 29 20 7b 20 28 28 69 6e 74 <4; i++) { ((int
5100: 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 69 5d *) function)[i]
5110: 20 3d 20 63 6f 64 65 5b 69 5d 3b 20 7d 0a 20 20 = code[i]; }.
5120: 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 ((long *) func
5130: 74 69 6f 6e 29 5b 32 5d 20 3d 20 28 6c 6f 6e 67 tion)[2] = (long
5140: 29 20 64 61 74 61 3b 0a 20 20 20 20 28 28 6c 6f ) data;. ((lo
5150: 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b ng *) function)[
5160: 33 5d 20 3d 20 28 6c 6f 6e 67 29 20 61 64 64 72 3] = (long) addr
5170: 65 73 73 3b 0a 20 20 7d 0a 23 64 65 66 69 6e 65 ess;. }.#define
5180: 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 is_tramp(functi
5190: 6f 6e 29 20 20 5c 0a 20 20 28 28 69 6e 74 20 2a on) \. ((int *
51a0: 29 20 66 75 6e 63 74 69 6f 6e 29 5b 30 5d 20 3d ) function)[0] =
51b0: 3d 20 30 78 43 30 32 30 30 30 30 30 20 26 26 20 = 0xC0200000 &&
51c0: 5c 0a 20 20 28 28 69 6e 74 20 2a 29 20 66 75 6e \. ((int *) fun
51d0: 63 74 69 6f 6e 29 5b 31 5d 20 3d 3d 20 30 78 41 ction)[1] == 0xA
51e0: 37 36 31 30 30 31 34 20 26 26 20 5c 0a 20 20 28 7610014 && \. (
51f0: 28 69 6e 74 20 2a 29 20 66 75 6e 63 74 69 6f 6e (int *) function
5200: 29 5b 32 5d 20 3d 3d 20 30 78 41 34 32 31 30 30 )[2] == 0xA42100
5210: 30 43 20 26 26 20 5c 0a 20 20 28 28 69 6e 74 20 0C && \. ((int
5220: 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 33 5d 20 *) function)[3]
5230: 3d 3d 20 30 78 36 42 46 42 30 30 30 30 0a 23 64 == 0x6BFB0000.#d
5240: 65 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 efine tramp_addr
5250: 65 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c ess(function) \
5260: 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e . ((long *) fun
5270: 63 74 69 6f 6e 29 5b 33 5d 0a 23 64 65 66 69 6e ction)[3].#defin
5280: 65 20 74 72 61 6d 70 5f 64 61 74 61 28 66 75 6e e tramp_data(fun
5290: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 28 6c 6f ction) \. ((lo
52a0: 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b ng *) function)[
52b0: 32 5d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 2].#endif.#ifdef
52c0: 20 5f 5f 68 70 70 61 6f 6c 64 5f 5f 0a 20 20 2f __hppaold__. /
52d0: 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a * function:. *
52e0: 20 20 20 20 6c 64 69 6c 20 4c 27 3c 64 61 74 61 ldil L'<data
52f0: 3e 2c 25 72 32 39 09 09 32 33 41 30 30 30 30 30 >,%r29..23A00000
5300: 20 7c 20 68 69 28 3c 64 61 74 61 3e 29 0a 20 20 | hi(<data>).
5310: 20 2a 20 20 20 20 6c 64 69 6c 20 4c 27 3c 61 64 * ldil L'<ad
5320: 64 72 65 73 73 3e 2c 25 72 32 31 09 09 32 32 41 dress>,%r21..22A
5330: 30 30 30 30 30 20 7c 20 68 69 28 3c 61 64 64 72 00000 | hi(<addr
5340: 65 73 73 3e 29 0a 20 20 20 2a 20 20 20 20 6c 64 ess>). * ld
5350: 6f 20 52 27 3c 64 61 74 61 3e 28 25 72 32 39 29 o R'<data>(%r29)
5360: 2c 25 72 32 39 09 09 33 37 42 44 30 30 30 30 20 ,%r29..37BD0000
5370: 7c 20 6c 6f 28 3c 64 61 74 61 3e 29 0a 20 20 20 | lo(<data>).
5380: 2a 20 20 20 20 6c 64 6f 20 52 27 3c 61 64 64 72 * ldo R'<addr
5390: 65 73 73 3e 28 25 72 32 31 29 2c 25 72 32 31 09 ess>(%r21),%r21.
53a0: 33 36 42 35 30 30 30 30 20 7c 20 6c 6f 28 3c 61 36B50000 | lo(<a
53b0: 64 64 72 65 73 73 3e 29 0a 20 20 20 2a 20 20 20 ddress>). *
53c0: 20 62 62 2c 3e 3d 2c 6e 20 25 72 32 31 2c 33 30 bb,>=,n %r21,30
53d0: 2c 66 75 6e 63 74 69 6f 6e 32 09 43 37 44 35 43 ,function2.C7D5C
53e0: 30 31 32 0a 20 20 20 2a 20 20 20 20 64 65 70 69 012. * depi
53f0: 20 30 2c 33 31 2c 32 2c 25 72 32 31 09 09 44 36 0,31,2,%r21..D6
5400: 41 30 31 43 31 45 0a 20 20 20 2a 20 20 20 20 6c A01C1E. * l
5410: 64 77 20 34 28 30 2c 25 72 32 31 29 2c 25 72 31 dw 4(0,%r21),%r1
5420: 39 09 09 34 41 42 33 30 30 30 38 0a 20 20 20 2a 9..4AB30008. *
5430: 20 20 20 20 6c 64 77 20 30 28 30 2c 25 72 32 31 ldw 0(0,%r21
5440: 29 2c 25 72 32 31 09 09 34 41 42 35 30 30 30 30 ),%r21..4AB50000
5450: 0a 20 20 20 2a 20 66 75 6e 63 74 69 6f 6e 32 3a . * function2:
5460: 0a 20 20 20 2a 20 20 20 20 6c 64 73 69 64 20 28 . * ldsid (
5470: 30 2c 25 72 32 31 29 2c 25 72 31 09 09 30 32 41 0,%r21),%r1..02A
5480: 30 31 30 41 31 0a 20 20 20 2a 20 20 20 20 6d 74 010A1. * mt
5490: 73 70 20 25 72 31 2c 25 73 72 30 09 09 09 30 30 sp %r1,%sr0...00
54a0: 30 31 31 38 32 30 0a 20 20 20 2a 20 20 20 20 62 011820. * b
54b0: 65 2c 6e 20 30 28 25 73 72 30 2c 25 72 32 31 29 e,n 0(%sr0,%r21)
54c0: 09 09 45 32 41 30 30 30 30 32 0a 20 20 20 2a 20 ..E2A00002. *
54d0: 20 20 20 6e 6f 70 09 09 09 09 30 38 30 30 30 32 nop....080002
54e0: 34 30 0a 20 20 20 2a 2f 0a 20 20 2f 2a 20 57 68 40. */. /* Wh
54f0: 65 6e 20 64 65 63 6f 64 69 6e 67 20 61 20 32 31 en decoding a 21
5500: 2d 62 69 74 20 61 72 67 75 6d 65 6e 74 20 69 6e -bit argument in
5510: 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c an instruction,
5520: 20 74 68 65 20 68 70 70 61 20 70 65 72 66 6f 72 the hppa perfor
5530: 6d 73 0a 20 20 20 2a 20 74 68 65 20 66 6f 6c 6c ms. * the foll
5540: 6f 77 69 6e 67 20 62 69 74 20 6d 61 6e 69 70 75 owing bit manipu
5550: 6c 61 74 69 6f 6e 3a 0a 20 20 20 2a 20 61 73 73 lation:. * ass
5560: 65 6d 62 6c 65 32 31 3a 20 78 5b 32 30 5d 2e 2e emble21: x[20]..
5570: 2e 78 5b 30 5d 0a 20 20 20 2a 20 20 20 20 20 20 .x[0]. *
5580: 20 2d 2d 3e 20 78 5b 30 5d 20 78 5b 31 31 5d 2e --> x[0] x[11].
5590: 2e 2e 78 5b 31 5d 20 78 5b 31 35 5d 2e 2e 78 5b ..x[1] x[15]..x[
55a0: 31 34 5d 20 78 5b 32 30 5d 2e 2e 2e 78 5b 31 36 14] x[20]...x[16
55b0: 5d 20 78 5b 31 33 5d 2e 2e 78 5b 31 32 5d 0a 20 ] x[13]..x[12].
55c0: 20 20 2a 20 57 68 65 6e 20 65 6e 63 6f 64 69 6e * When encodin
55d0: 67 20 61 20 32 31 2d 62 69 74 20 61 72 67 75 6d g a 21-bit argum
55e0: 65 6e 74 20 69 6e 74 6f 20 61 6e 20 69 6e 73 74 ent into an inst
55f0: 72 75 63 74 69 6f 6e 2c 20 77 65 20 6e 65 65 64 ruction, we need
5600: 20 74 68 65 0a 20 20 20 2a 20 74 6f 20 70 65 72 the. * to per
5610: 66 6f 72 6d 20 74 68 65 20 72 65 76 65 72 73 65 form the reverse
5620: 20 70 65 72 6d 75 74 61 74 69 6f 6e 3a 0a 20 20 permutation:.
5630: 20 2a 20 70 65 72 6d 75 74 65 32 31 3a 20 20 79 * permute21: y
5640: 5b 32 30 5d 2e 2e 2e 79 5b 30 5d 0a 20 20 20 2a [20]...y[0]. *
5650: 20 20 20 20 20 20 20 2d 2d 3e 20 79 5b 36 5d 2e --> y[6].
5660: 2e 2e 79 5b 32 5d 20 79 5b 38 5d 2e 2e 79 5b 37 ..y[2] y[8]..y[7
5670: 5d 20 79 5b 31 5d 2e 2e 79 5b 30 5d 20 79 5b 31 ] y[1]..y[0] y[1
5680: 39 5d 2e 2e 2e 79 5b 39 5d 20 79 5b 32 30 5d 0a 9]...y[9] y[20].
5690: 20 20 20 2a 2f 0a 23 64 65 66 69 6e 65 20 61 73 */.#define as
56a0: 73 65 6d 62 6c 65 32 31 28 78 29 20 20 5c 0a 20 semble21(x) \.
56b0: 20 28 28 28 28 78 29 20 26 20 30 78 31 29 20 3c ((((x) & 0x1) <
56c0: 3c 20 32 30 29 20 7c 20 28 28 28 78 29 20 26 20 < 20) | (((x) &
56d0: 30 78 46 46 45 29 20 3c 3c 20 38 29 20 7c 20 5c 0xFFE) << 8) | \
56e0: 0a 20 20 20 28 28 28 78 29 20 26 20 30 78 43 30 . (((x) & 0xC0
56f0: 30 30 29 20 3e 3e 20 37 29 20 7c 20 28 28 28 78 00) >> 7) | (((x
5700: 29 20 26 20 30 78 31 46 30 30 30 30 29 20 3e 3e ) & 0x1F0000) >>
5710: 20 31 34 29 20 7c 20 28 28 28 78 29 20 26 20 30 14) | (((x) & 0
5720: 78 33 30 30 30 29 20 3e 3e 20 31 32 29 29 0a 23 x3000) >> 12)).#
5730: 64 65 66 69 6e 65 20 70 65 72 6d 75 74 65 32 31 define permute21
5740: 28 79 29 20 20 5c 0a 20 20 28 28 28 28 79 29 20 (y) \. ((((y)
5750: 26 20 30 78 37 43 29 20 3c 3c 20 31 34 29 20 7c & 0x7C) << 14) |
5760: 20 28 28 28 79 29 20 26 20 30 78 31 38 30 29 20 (((y) & 0x180)
5770: 3c 3c 20 37 29 20 7c 20 28 28 28 79 29 20 26 20 << 7) | (((y) &
5780: 30 78 33 29 20 3c 3c 20 31 32 29 20 7c 20 5c 0a 0x3) << 12) | \.
5790: 20 20 20 28 28 28 79 29 20 26 20 30 78 46 46 45 (((y) & 0xFFE
57a0: 30 30 29 20 3e 3e 20 38 29 20 7c 20 28 28 28 79 00) >> 8) | (((y
57b0: 29 20 26 20 30 78 31 30 30 30 30 30 29 20 3e 3e ) & 0x100000) >>
57c0: 20 32 30 29 29 0a 23 64 65 66 69 6e 65 20 68 69 20)).#define hi
57d0: 28 77 6f 72 64 29 20 20 70 65 72 6d 75 74 65 32 (word) permute2
57e0: 31 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 1((unsigned long
57f0: 29 20 28 77 6f 72 64 29 20 3e 3e 20 31 31 29 0a ) (word) >> 11).
5800: 23 64 65 66 69 6e 65 20 6c 6f 28 77 6f 72 64 29 #define lo(word)
5810: 20 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f (((unsigned lo
5820: 6e 67 29 20 28 77 6f 72 64 29 20 26 20 30 78 37 ng) (word) & 0x7
5830: 46 46 29 20 3c 3c 20 31 29 0a 20 20 2a 28 6c 6f FF) << 1). *(lo
5840: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 ng *) (function
5850: 2b 20 30 29 20 3d 20 30 78 32 33 41 30 30 30 30 + 0) = 0x23A0000
5860: 30 20 7c 20 68 69 28 64 61 74 61 29 3b 0a 20 20 0 | hi(data);.
5870: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 *(long *) (funct
5880: 69 6f 6e 20 2b 20 34 29 20 3d 20 30 78 32 32 41 ion + 4) = 0x22A
5890: 30 30 30 30 30 20 7c 20 68 69 28 61 64 64 72 65 00000 | hi(addre
58a0: 73 73 29 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 ss);. *(long *)
58b0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 (function + 8)
58c0: 3d 20 30 78 33 37 42 44 30 30 30 30 20 7c 20 6c = 0x37BD0000 | l
58d0: 6f 28 64 61 74 61 29 3b 0a 20 20 2a 28 6c 6f 6e o(data);. *(lon
58e0: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b g *) (function +
58f0: 31 32 29 20 3d 20 30 78 33 36 42 35 30 30 30 30 12) = 0x36B50000
5900: 20 7c 20 6c 6f 28 61 64 64 72 65 73 73 29 3b 0a | lo(address);.
5910: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e *(long *) (fun
5920: 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20 30 78 43 ction +16) = 0xC
5930: 37 44 35 43 30 31 32 3b 0a 20 20 2a 28 6c 6f 6e 7D5C012;. *(lon
5940: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b g *) (function +
5950: 32 30 29 20 3d 20 30 78 44 36 41 30 31 43 31 45 20) = 0xD6A01C1E
5960: 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 ;. *(long *) (f
5970: 75 6e 63 74 69 6f 6e 20 2b 32 34 29 20 3d 20 30 unction +24) = 0
5980: 78 34 41 42 33 30 30 30 38 3b 0a 20 20 2a 28 6c x4AB30008;. *(l
5990: 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ong *) (function
59a0: 20 2b 32 38 29 20 3d 20 30 78 34 41 42 35 30 30 +28) = 0x4AB500
59b0: 30 30 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 00;. *(long *)
59c0: 28 66 75 6e 63 74 69 6f 6e 20 2b 33 32 29 20 3d (function +32) =
59d0: 20 30 78 30 32 41 30 31 30 41 31 3b 0a 20 20 2a 0x02A010A1;. *
59e0: 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 (long *) (functi
59f0: 6f 6e 20 2b 33 36 29 20 3d 20 30 78 30 30 30 31 on +36) = 0x0001
5a00: 31 38 32 30 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 1820;. *(long *
5a10: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 34 30 29 ) (function +40)
5a20: 20 3d 20 30 78 45 32 41 30 30 30 30 32 3b 0a 20 = 0xE2A00002;.
5a30: 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 *(long *) (func
5a40: 74 69 6f 6e 20 2b 34 34 29 20 3d 20 30 78 30 38 tion +44) = 0x08
5a50: 30 30 30 32 34 30 3b 0a 23 64 65 66 69 6e 65 20 000240;.#define
5a60: 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 6f is_tramp(functio
5a70: 6e 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 29 20 n) \. ((long)
5a80: 66 75 6e 63 74 69 6f 6e 20 26 20 33 29 20 3d 3d function & 3) ==
5a90: 20 30 20 26 26 20 5c 0a 20 20 28 2a 28 6c 6f 6e 0 && \. (*(lon
5aa0: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b g *) (function +
5ab0: 20 30 29 20 26 20 30 78 66 66 65 30 30 30 30 30 0) & 0xffe00000
5ac0: 29 20 3d 3d 20 30 78 32 33 41 30 30 30 30 30 20 ) == 0x23A00000
5ad0: 26 26 20 5c 0a 20 20 28 2a 28 6c 6f 6e 67 20 2a && \. (*(long *
5ae0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 ) (function + 4)
5af0: 20 26 20 30 78 66 66 65 30 30 30 30 30 29 20 3d & 0xffe00000) =
5b00: 3d 20 30 78 32 32 41 30 30 30 30 30 20 26 26 20 = 0x22A00000 &&
5b10: 5c 0a 20 20 28 2a 28 6c 6f 6e 67 20 2a 29 20 28 \. (*(long *) (
5b20: 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 26 20 function + 8) &
5b30: 30 78 66 66 66 66 66 30 30 30 29 20 3d 3d 20 30 0xfffff000) == 0
5b40: 78 33 37 42 44 30 30 30 30 20 26 26 20 5c 0a 20 x37BD0000 && \.
5b50: 20 28 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e (*(long *) (fun
5b60: 63 74 69 6f 6e 20 2b 31 32 29 20 26 20 30 78 66 ction +12) & 0xf
5b70: 66 66 66 66 30 30 30 29 20 3d 3d 20 30 78 33 36 ffff000) == 0x36
5b80: 42 35 30 30 30 30 20 26 26 20 5c 0a 20 20 2a 28 B50000 && \. *(
5b90: 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f long *) (functio
5ba0: 6e 20 2b 31 36 29 20 3d 3d 20 30 78 43 37 44 35 n +16) == 0xC7D5
5bb0: 43 30 31 32 20 26 26 20 5c 0a 20 20 2a 28 6c 6f C012 && \. *(lo
5bc0: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 ng *) (function
5bd0: 2b 32 30 29 20 3d 3d 20 30 78 44 36 41 30 31 43 +20) == 0xD6A01C
5be0: 31 45 20 26 26 20 5c 0a 20 20 2a 28 6c 6f 6e 67 1E && \. *(long
5bf0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 *) (function +2
5c00: 34 29 20 3d 3d 20 30 78 34 41 42 33 30 30 30 38 4) == 0x4AB30008
5c10: 20 26 26 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a && \. *(long *
5c20: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 38 29 ) (function +28)
5c30: 20 3d 3d 20 30 78 34 41 42 35 30 30 30 30 20 26 == 0x4AB50000 &
5c40: 26 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 & \. *(long *)
5c50: 28 66 75 6e 63 74 69 6f 6e 20 2b 33 32 29 20 3d (function +32) =
5c60: 3d 20 30 78 30 32 41 30 31 30 41 31 20 26 26 20 = 0x02A010A1 &&
5c70: 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 \. *(long *) (f
5c80: 75 6e 63 74 69 6f 6e 20 2b 33 36 29 20 3d 3d 20 unction +36) ==
5c90: 30 78 30 30 30 31 31 38 32 30 20 26 26 20 5c 0a 0x00011820 && \.
5ca0: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e *(long *) (fun
5cb0: 63 74 69 6f 6e 20 2b 34 30 29 20 3d 3d 20 30 78 ction +40) == 0x
5cc0: 45 32 41 30 30 30 30 32 20 26 26 20 5c 0a 20 20 E2A00002 && \.
5cd0: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 *(long *) (funct
5ce0: 69 6f 6e 20 2b 34 34 29 20 3d 3d 20 30 78 30 38 ion +44) == 0x08
5cf0: 30 30 30 32 34 30 0a 23 64 65 66 69 6e 65 20 68 000240.#define h
5d00: 69 6c 6f 28 68 69 77 6f 72 64 2c 6c 6f 77 6f 72 ilo(hiword,lowor
5d10: 64 29 20 20 5c 0a 20 20 28 28 61 73 73 65 6d 62 d) \. ((assemb
5d20: 6c 65 32 31 28 28 75 6e 73 69 67 6e 65 64 20 6c le21((unsigned l
5d30: 6f 6e 67 29 20 28 68 69 77 6f 72 64 29 29 20 3c ong) (hiword)) <
5d40: 3c 20 31 31 29 20 7c 20 5c 0a 20 20 20 28 28 28 < 11) | \. (((
5d50: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 unsigned long) (
5d60: 6c 6f 77 6f 72 64 29 20 26 20 30 78 46 46 45 29 loword) & 0xFFE)
5d70: 20 3e 3e 20 31 29 20 5c 0a 20 20 29 0a 23 64 65 >> 1) \. ).#de
5d80: 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 65 fine tramp_addre
5d90: 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a ss(function) \.
5da0: 20 20 68 69 6c 6f 28 2a 28 6c 6f 6e 67 20 2a 29 hilo(*(long *)
5db0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 2c (function + 4),
5dc0: 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 *(long *) (func
5dd0: 74 69 6f 6e 20 2b 31 32 29 29 0a 23 64 65 66 69 tion +12)).#defi
5de0: 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 28 66 75 ne tramp_data(fu
5df0: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c nction) \. hil
5e00: 6f 28 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e o(*(long *) (fun
5e10: 63 74 69 6f 6e 20 2b 20 30 29 2c 20 2a 28 6c 6f ction + 0), *(lo
5e20: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 ng *) (function
5e30: 2b 20 38 29 29 0a 23 65 6e 64 69 66 0a 23 69 66 + 8)).#endif.#if
5e40: 64 65 66 20 5f 5f 68 70 70 61 6e 65 77 5f 5f 0a def __hppanew__.
5e50: 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 /* function:.
5e60: 20 20 2a 20 20 20 20 2e 6c 6f 6e 67 20 20 20 74 * .long t
5e70: 72 61 6d 70 5f 72 0a 20 20 20 2a 20 20 20 20 2e ramp_r. * .
5e80: 6c 6f 6e 67 20 20 20 63 6c 6f 73 75 72 65 0a 20 long closure.
5e90: 20 20 2a 20 63 6c 6f 73 75 72 65 3a 0a 20 20 20 * closure:.
5ea0: 2a 20 20 20 20 2e 6c 6f 6e 67 20 20 20 3c 64 61 * .long <da
5eb0: 74 61 3e 0a 20 20 20 2a 20 20 20 20 2e 6c 6f 6e ta>. * .lon
5ec0: 67 20 20 20 3c 61 64 64 72 65 73 73 3e 0a 20 20 g <address>.
5ed0: 20 2a 2f 0a 20 20 7b 20 2f 2a 20 77 6f 72 6b 20 */. { /* work
5ee0: 61 72 6f 75 6e 64 20 61 20 62 75 67 20 69 6e 20 around a bug in
5ef0: 67 63 63 20 33 2e 2a 20 2a 2f 0a 20 20 20 20 76 gcc 3.* */. v
5f00: 6f 69 64 2a 20 74 72 61 6d 70 5f 72 5f 61 64 64 oid* tramp_r_add
5f10: 72 65 73 73 20 3d 20 26 74 72 61 6d 70 5f 72 3b ress = &tramp_r;
5f20: 0a 20 20 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 . *(long *) (
5f30: 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20 function + 0) =
5f40: 28 28 6c 6f 6e 67 20 2a 29 20 28 28 63 68 61 72 ((long *) ((char
5f50: 2a 29 74 72 61 6d 70 5f 72 5f 61 64 64 72 65 73 *)tramp_r_addres
5f60: 73 2d 32 29 29 5b 30 5d 3b 0a 20 20 20 20 2a 28 s-2))[0];. *(
5f70: 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f long *) (functio
5f80: 6e 20 2b 20 34 29 20 3d 20 28 6c 6f 6e 67 29 20 n + 4) = (long)
5f90: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 3b 0a (function + 8);.
5fa0: 20 20 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 *(long *) (f
5fb0: 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 28 unction + 8) = (
5fc0: 6c 6f 6e 67 29 20 64 61 74 61 3b 0a 20 20 20 20 long) data;.
5fd0: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 *(long *) (funct
5fe0: 69 6f 6e 20 2b 31 32 29 20 3d 20 28 6c 6f 6e 67 ion +12) = (long
5ff0: 29 20 61 64 64 72 65 73 73 3b 0a 20 20 7d 0a 23 ) address;. }.#
6000: 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 28 define is_tramp(
6010: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 function) \. (
6020: 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f (long *) functio
6030: 6e 29 5b 30 5d 20 3d 3d 20 28 28 6c 6f 6e 67 20 n)[0] == ((long
6040: 2a 29 20 28 28 63 68 61 72 2a 29 74 72 61 6d 70 *) ((char*)tramp
6050: 5f 72 5f 61 64 64 72 65 73 73 2d 32 29 29 5b 30 _r_address-2))[0
6060: 5d 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f ].#define tramp_
6070: 61 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e address(function
6080: 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 ) \. ((long *)
6090: 20 66 75 6e 63 74 69 6f 6e 29 5b 33 5d 0a 23 64 function)[3].#d
60a0: 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 efine tramp_data
60b0: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 (function) \.
60c0: 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 ((long *) functi
60d0: 6f 6e 29 5b 32 5d 0a 23 65 6e 64 69 66 0a 23 69 on)[2].#endif.#i
60e0: 66 64 65 66 20 5f 5f 61 72 6d 5f 5f 0a 20 20 2f fdef __arm__. /
60f0: 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a * function:. *
6100: 20 20 20 20 6c 64 72 20 20 20 20 20 69 70 2c 5b ldr ip,[
6110: 70 63 2c 23 5f 66 75 6e 63 74 69 6f 6e 2d 2e 2d pc,#_function-.-
6120: 38 5d 09 09 45 35 39 46 43 30 31 34 0a 20 20 20 8]..E59FC014.
6130: 2a 20 20 20 20 6c 64 72 20 20 20 20 20 69 70 2c * ldr ip,
6140: 5b 69 70 2c 23 30 5d 09 09 09 45 35 39 43 43 30 [ip,#0]...E59CC0
6150: 30 30 20 20 3f 3f 49 73 20 74 68 69 73 20 63 6f 00 ??Is this co
6160: 72 72 65 63 74 3f 3f 0a 20 20 20 2a 20 20 20 20 rrect??. *
6170: 73 74 6d 66 64 20 20 20 73 70 21 2c 7b 69 70 7d stmfd sp!,{ip}
6180: 09 09 09 45 39 32 44 31 30 30 30 0a 20 20 20 2a ...E92D1000. *
6190: 20 20 20 20 6c 64 72 20 20 20 20 20 69 70 2c 5b ldr ip,[
61a0: 70 63 2c 23 5f 64 61 74 61 2d 2e 2d 38 5d 09 09 pc,#_data-.-8]..
61b0: 45 35 39 46 43 30 30 34 0a 20 20 20 2a 20 20 20 E59FC004. *
61c0: 20 6c 64 72 20 20 20 20 20 69 70 2c 5b 69 70 2c ldr ip,[ip,
61d0: 23 30 5d 09 09 09 45 35 39 43 43 30 30 30 20 20 #0]...E59CC000
61e0: 3f 3f 49 73 20 74 68 69 73 20 63 6f 72 72 65 63 ??Is this correc
61f0: 74 3f 3f 0a 20 20 20 2a 20 20 20 20 6c 64 6d 66 t??. * ldmf
6200: 64 20 20 20 73 70 21 2c 7b 70 63 7d 5e 09 09 09 d sp!,{pc}^...
6210: 45 38 46 44 38 30 30 30 0a 20 20 20 2a 20 5f 64 E8FD8000. * _d
6220: 61 74 61 3a 0a 20 20 20 2a 20 20 20 20 2e 77 6f ata:. * .wo
6230: 72 64 20 20 20 3c 64 61 74 61 3e 09 09 09 09 3c rd <data>....<
6240: 64 61 74 61 3e 0a 20 20 20 2a 20 5f 66 75 6e 63 data>. * _func
6250: 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 2e 77 tion:. * .w
6260: 6f 72 64 20 20 20 3c 61 64 64 72 65 73 73 3e 09 ord <address>.
6270: 09 09 3c 61 64 64 72 65 73 73 3e 0a 20 20 20 2a ..<address>. *
6280: 2f 0a 20 20 7b 20 73 74 61 74 69 63 20 6c 6f 6e /. { static lon
6290: 67 20 63 6f 64 65 20 5b 36 5d 20 3d 0a 20 20 20 g code [6] =.
62a0: 20 20 20 7b 20 30 78 45 35 39 46 43 30 31 34 2c { 0xE59FC014,
62b0: 20 30 78 45 35 39 43 43 30 30 30 2c 20 30 78 45 0xE59CC000, 0xE
62c0: 39 32 44 31 30 30 30 2c 20 30 78 45 35 39 46 43 92D1000, 0xE59FC
62d0: 30 30 34 2c 0a 20 20 20 20 20 20 20 20 30 78 45 004,. 0xE
62e0: 35 39 43 43 30 30 30 2c 20 30 78 45 38 46 44 38 59CC000, 0xE8FD8
62f0: 30 30 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 000. };.
6300: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 20 int i;. for
6310: 28 69 3d 30 3b 20 69 3c 36 3b 20 69 2b 2b 29 20 (i=0; i<6; i++)
6320: 7b 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 { ((long *) func
6330: 74 69 6f 6e 29 5b 69 5d 20 3d 20 63 6f 64 65 5b tion)[i] = code[
6340: 69 5d 3b 20 7d 0a 20 20 20 20 28 28 6c 6f 6e 67 i]; }. ((long
6350: 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 36 5d *) function)[6]
6360: 20 3d 20 28 6c 6f 6e 67 29 20 64 61 74 61 3b 0a = (long) data;.
6370: 20 20 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 ((long *) fu
6380: 6e 63 74 69 6f 6e 29 5b 37 5d 20 3d 20 28 6c 6f nction)[7] = (lo
6390: 6e 67 29 20 61 64 64 72 65 73 73 3b 0a 20 20 7d ng) address;. }
63a0: 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d .#define is_tram
63b0: 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 p(function) \.
63c0: 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 ((long *) funct
63d0: 69 6f 6e 29 5b 30 5d 20 3d 3d 20 30 78 45 35 39 ion)[0] == 0xE59
63e0: 46 43 30 31 34 20 26 26 20 5c 0a 20 20 28 28 6c FC014 && \. ((l
63f0: 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 ong *) function)
6400: 5b 31 5d 20 3d 3d 20 30 78 45 35 39 43 43 30 30 [1] == 0xE59CC00
6410: 30 20 26 26 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 0 && \. ((long
6420: 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 32 5d 20 *) function)[2]
6430: 3d 3d 20 30 78 45 39 32 44 31 30 30 30 20 26 26 == 0xE92D1000 &&
6440: 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 \. ((long *) f
6450: 75 6e 63 74 69 6f 6e 29 5b 33 5d 20 3d 3d 20 30 unction)[3] == 0
6460: 78 45 35 39 46 43 30 30 34 20 26 26 20 5c 0a 20 xE59FC004 && \.
6470: 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 ((long *) funct
6480: 69 6f 6e 29 5b 34 5d 20 3d 3d 20 30 78 45 35 39 ion)[4] == 0xE59
6490: 43 43 30 30 30 20 26 26 20 5c 0a 20 20 28 28 6c CC000 && \. ((l
64a0: 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 ong *) function)
64b0: 5b 35 5d 20 3d 3d 20 30 78 45 38 46 44 38 30 30 [5] == 0xE8FD800
64c0: 30 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 0.#define tramp_
64d0: 61 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e address(function
64e0: 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 ) \. ((long *)
64f0: 20 66 75 6e 63 74 69 6f 6e 29 5b 37 5d 0a 23 64 function)[7].#d
6500: 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 efine tramp_data
6510: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 (function) \.
6520: 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 ((long *) functi
6530: 6f 6e 29 5b 36 5d 0a 23 65 6e 64 69 66 0a 23 69 on)[6].#endif.#i
6540: 66 64 65 66 20 5f 5f 72 73 36 30 30 30 73 79 73 fdef __rs6000sys
6550: 76 34 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 69 v4__. /* functi
6560: 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 7b 6c 69 75 on:. * {liu
6570: 7c 6c 69 73 7d 20 31 31 2c 68 69 31 36 28 3c 64 |lis} 11,hi16(<d
6580: 61 74 61 3e 29 09 09 33 44 20 36 30 20 68 69 31 ata>)..3D 60 hi1
6590: 36 28 3c 64 61 74 61 3e 29 0a 20 20 20 2a 20 20 6(<data>). *
65a0: 20 20 7b 6f 72 69 6c 7c 6f 72 69 7d 20 31 31 2c {oril|ori} 11,
65b0: 31 31 2c 6c 6f 31 36 28 3c 64 61 74 61 3e 29 09 11,lo16(<data>).
65c0: 09 36 31 20 36 42 20 6c 6f 31 36 28 3c 64 61 74 .61 6B lo16(<dat
65d0: 61 3e 29 0a 20 20 20 2a 20 20 20 20 7b 6c 69 75 a>). * {liu
65e0: 7c 6c 69 73 7d 20 30 2c 68 69 31 36 28 3c 61 64 |lis} 0,hi16(<ad
65f0: 64 72 65 73 73 3e 29 09 09 33 43 20 30 30 20 68 dress>)..3C 00 h
6600: 69 31 36 28 3c 61 64 64 72 65 73 73 3e 29 0a 20 i16(<address>).
6610: 20 20 2a 20 20 20 20 7b 6f 72 69 6c 7c 6f 72 69 * {oril|ori
6620: 7d 20 30 2c 30 2c 6c 6f 31 36 28 3c 61 64 64 72 } 0,0,lo16(<addr
6630: 65 73 73 3e 29 09 09 36 30 20 30 30 20 6c 6f 31 ess>)..60 00 lo1
6640: 36 28 3c 61 64 64 72 65 73 73 3e 29 0a 20 20 20 6(<address>).
6650: 2a 20 20 20 20 6d 74 63 74 72 20 30 09 09 09 09 * mtctr 0....
6660: 09 37 43 20 30 39 20 30 33 20 41 36 0a 20 20 20 .7C 09 03 A6.
6670: 2a 20 20 20 20 62 63 74 72 09 09 09 09 09 34 45 * bctr.....4E
6680: 20 38 30 20 30 34 20 32 30 0a 20 20 20 2a 2f 0a 80 04 20. */.
6690: 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 *(short *) (fu
66a0: 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20 30 78 nction + 0) = 0x
66b0: 33 44 36 30 3b 0a 20 20 2a 28 73 68 6f 72 74 20 3D60;. *(short
66c0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 32 *) (function + 2
66d0: 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f ) = (unsigned lo
66e0: 6e 67 29 20 64 61 74 61 20 3e 3e 20 31 36 3b 0a ng) data >> 16;.
66f0: 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 *(short *) (fu
6700: 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 20 30 78 nction + 4) = 0x
6710: 36 31 36 42 3b 0a 20 20 2a 28 73 68 6f 72 74 20 616B;. *(short
6720: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 36 *) (function + 6
6730: 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f ) = (unsigned lo
6740: 6e 67 29 20 64 61 74 61 20 26 20 30 78 66 66 66 ng) data & 0xfff
6750: 66 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 f;. *(short *)
6760: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d (function + 8) =
6770: 20 30 78 33 43 30 30 3b 0a 20 20 2a 28 73 68 6f 0x3C00;. *(sho
6780: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
6790: 2b 31 30 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 +10) = (unsigned
67a0: 20 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 20 3e long) address >
67b0: 3e 20 31 36 3b 0a 20 20 2a 28 73 68 6f 72 74 20 > 16;. *(short
67c0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 *) (function +12
67d0: 29 20 3d 20 30 78 36 30 30 30 3b 0a 20 20 2a 28 ) = 0x6000;. *(
67e0: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
67f0: 6f 6e 20 2b 31 34 29 20 3d 20 28 75 6e 73 69 67 on +14) = (unsig
6800: 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64 72 65 73 ned long) addres
6810: 73 20 26 20 30 78 66 66 66 66 3b 0a 20 20 2a 28 s & 0xffff;. *(
6820: 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 long *) (functi
6830: 6f 6e 20 2b 31 36 29 20 3d 20 30 78 37 43 30 39 on +16) = 0x7C09
6840: 30 33 41 36 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 03A6;. *(long *
6850: 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 30 ) (function +20
6860: 29 20 3d 20 30 78 34 45 38 30 30 34 32 30 3b 0a ) = 0x4E800420;.
6870: 23 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 #define is_tramp
6880: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 (function) \.
6890: 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 *(unsigned short
68a0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 *) (function +
68b0: 30 29 20 3d 3d 20 30 78 33 44 36 30 20 26 26 20 0) == 0x3D60 &&
68c0: 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 \. *(unsigned s
68d0: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f hort *) (functio
68e0: 6e 20 2b 20 34 29 20 3d 3d 20 30 78 36 31 36 42 n + 4) == 0x616B
68f0: 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e && \. *(unsign
6900: 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e ed short *) (fun
6910: 63 74 69 6f 6e 20 2b 20 38 29 20 3d 3d 20 30 78 ction + 8) == 0x
6920: 33 43 30 30 20 26 26 20 5c 0a 20 20 2a 28 75 6e 3C00 && \. *(un
6930: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 signed short *)
6940: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d (function +12) =
6950: 3d 20 30 78 36 30 30 30 20 26 26 20 5c 0a 20 20 = 0x6000 && \.
6960: 2a 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 *(unsigned long
6970: 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 *) (function +1
6980: 36 29 20 3d 3d 20 30 78 37 43 30 39 30 33 41 36 6) == 0x7C0903A6
6990: 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e && \. *(unsign
69a0: 65 64 20 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e ed long *) (fun
69b0: 63 74 69 6f 6e 20 2b 32 30 29 20 3d 3d 20 30 78 ction +20) == 0x
69c0: 34 45 38 30 30 34 32 30 0a 23 64 65 66 69 6e 65 4E800420.#define
69d0: 20 68 69 6c 6f 28 68 69 77 6f 72 64 2c 6c 6f 77 hilo(hiword,low
69e0: 6f 72 64 29 20 20 5c 0a 20 20 28 28 28 75 6e 73 ord) \. (((uns
69f0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 68 69 77 igned long) (hiw
6a00: 6f 72 64 29 20 3c 3c 20 31 36 29 20 7c 20 28 75 ord) << 16) | (u
6a10: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 6c nsigned long) (l
6a20: 6f 77 6f 72 64 29 29 0a 23 64 65 66 69 6e 65 20 oword)).#define
6a30: 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75 tramp_address(fu
6a40: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c nction) \. hil
6a50: 6f 28 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f o(*(unsigned sho
6a60: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
6a70: 2b 31 30 29 2c 20 2a 28 75 6e 73 69 67 6e 65 64 +10), *(unsigned
6a80: 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 short *) (funct
6a90: 69 6f 6e 20 2b 31 34 29 29 0a 23 64 65 66 69 6e ion +14)).#defin
6aa0: 65 20 74 72 61 6d 70 5f 64 61 74 61 28 66 75 6e e tramp_data(fun
6ab0: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c 6f ction) \. hilo
6ac0: 28 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 (*(unsigned shor
6ad0: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
6ae0: 20 32 29 2c 20 2a 28 75 6e 73 69 67 6e 65 64 20 2), *(unsigned
6af0: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
6b00: 6f 6e 20 2b 20 36 29 29 0a 23 65 6e 64 69 66 0a on + 6)).#endif.
6b10: 23 69 66 64 65 66 20 5f 5f 72 73 36 30 30 30 6e #ifdef __rs6000n
6b20: 65 74 62 73 64 5f 5f 0a 20 20 2f 2a 20 66 75 6e etbsd__. /* fun
6b30: 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 7b ction:. * {
6b40: 6c 69 75 7c 6c 69 73 7d 20 31 33 2c 68 69 31 36 liu|lis} 13,hi16
6b50: 28 3c 64 61 74 61 3e 29 09 09 33 44 20 41 30 20 (<data>)..3D A0
6b60: 68 69 31 36 28 3c 64 61 74 61 3e 29 0a 20 20 20 hi16(<data>).
6b70: 2a 20 20 20 20 7b 6f 72 69 6c 7c 6f 72 69 7d 20 * {oril|ori}
6b80: 31 33 2c 31 33 2c 6c 6f 31 36 28 3c 64 61 74 61 13,13,lo16(<data
6b90: 3e 29 09 09 36 31 20 41 44 20 6c 6f 31 36 28 3c >)..61 AD lo16(<
6ba0: 64 61 74 61 3e 29 0a 20 20 20 2a 20 20 20 20 7b data>). * {
6bb0: 6c 69 75 7c 6c 69 73 7d 20 30 2c 68 69 31 36 28 liu|lis} 0,hi16(
6bc0: 3c 61 64 64 72 65 73 73 3e 29 09 09 33 43 20 30 <address>)..3C 0
6bd0: 30 20 68 69 31 36 28 3c 61 64 64 72 65 73 73 3e 0 hi16(<address>
6be0: 29 0a 20 20 20 2a 20 20 20 20 7b 6f 72 69 6c 7c ). * {oril|
6bf0: 6f 72 69 7d 20 30 2c 30 2c 6c 6f 31 36 28 3c 61 ori} 0,0,lo16(<a
6c00: 64 64 72 65 73 73 3e 29 09 09 36 30 20 30 30 20 ddress>)..60 00
6c10: 6c 6f 31 36 28 3c 61 64 64 72 65 73 73 3e 29 0a lo16(<address>).
6c20: 20 20 20 2a 20 20 20 20 6d 74 63 74 72 20 30 09 * mtctr 0.
6c30: 09 09 09 09 37 43 20 30 39 20 30 33 20 41 36 0a ....7C 09 03 A6.
6c40: 20 20 20 2a 20 20 20 20 62 63 74 72 09 09 09 09 * bctr....
6c50: 09 34 45 20 38 30 20 30 34 20 32 30 0a 20 20 20 .4E 80 04 20.
6c60: 2a 2f 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 */. *(short *)
6c70: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d (function + 0) =
6c80: 20 30 78 33 44 41 30 3b 0a 20 20 2a 28 73 68 6f 0x3DA0;. *(sho
6c90: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
6ca0: 2b 20 32 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 + 2) = (unsigned
6cb0: 20 6c 6f 6e 67 29 20 64 61 74 61 20 3e 3e 20 31 long) data >> 1
6cc0: 36 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 6;. *(short *)
6cd0: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d (function + 4) =
6ce0: 20 30 78 36 31 41 44 3b 0a 20 20 2a 28 73 68 6f 0x61AD;. *(sho
6cf0: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
6d00: 2b 20 36 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 + 6) = (unsigned
6d10: 20 6c 6f 6e 67 29 20 64 61 74 61 20 26 20 30 78 long) data & 0x
6d20: 66 66 66 66 3b 0a 20 20 2a 28 73 68 6f 72 74 20 ffff;. *(short
6d30: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 *) (function + 8
6d40: 29 20 3d 20 30 78 33 43 30 30 3b 0a 20 20 2a 28 ) = 0x3C00;. *(
6d50: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
6d60: 6f 6e 20 2b 31 30 29 20 3d 20 28 75 6e 73 69 67 on +10) = (unsig
6d70: 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64 72 65 73 ned long) addres
6d80: 73 20 3e 3e 20 31 36 3b 0a 20 20 2a 28 73 68 6f s >> 16;. *(sho
6d90: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
6da0: 2b 31 32 29 20 3d 20 30 78 36 30 30 30 3b 0a 20 +12) = 0x6000;.
6db0: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e *(short *) (fun
6dc0: 63 74 69 6f 6e 20 2b 31 34 29 20 3d 20 28 75 6e ction +14) = (un
6dd0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64 signed long) add
6de0: 72 65 73 73 20 26 20 30 78 66 66 66 66 3b 0a 20 ress & 0xffff;.
6df0: 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e *(long *) (fun
6e00: 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20 30 78 37 ction +16) = 0x7
6e10: 43 30 39 30 33 41 36 3b 0a 20 20 2a 28 6c 6f 6e C0903A6;. *(lon
6e20: 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 g *) (function
6e30: 2b 32 30 29 20 3d 20 30 78 34 45 38 30 30 34 32 +20) = 0x4E80042
6e40: 30 3b 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72 0;.#define is_tr
6e50: 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c amp(function) \
6e60: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 . *(unsigned sh
6e70: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ort *) (function
6e80: 20 2b 20 30 29 20 3d 3d 20 30 78 33 44 41 30 20 + 0) == 0x3DA0
6e90: 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 && \. *(unsigne
6ea0: 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 d short *) (func
6eb0: 74 69 6f 6e 20 2b 20 34 29 20 3d 3d 20 30 78 36 tion + 4) == 0x6
6ec0: 31 41 44 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 1AD && \. *(uns
6ed0: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 igned short *) (
6ee0: 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 3d function + 8) ==
6ef0: 20 30 78 33 43 30 30 20 26 26 20 5c 0a 20 20 2a 0x3C00 && \. *
6f00: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 (unsigned short
6f10: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 *) (function +12
6f20: 29 20 3d 3d 20 30 78 36 30 30 30 20 26 26 20 5c ) == 0x6000 && \
6f30: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 6c 6f . *(unsigned lo
6f40: 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e ng *) (function
6f50: 20 2b 31 36 29 20 3d 3d 20 30 78 37 43 30 39 30 +16) == 0x7C090
6f60: 33 41 36 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 3A6 && \. *(uns
6f70: 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 29 20 20 28 igned long *) (
6f80: 66 75 6e 63 74 69 6f 6e 20 2b 32 30 29 20 3d 3d function +20) ==
6f90: 20 30 78 34 45 38 30 30 34 32 30 0a 23 64 65 66 0x4E800420.#def
6fa0: 69 6e 65 20 68 69 6c 6f 28 68 69 77 6f 72 64 2c ine hilo(hiword,
6fb0: 6c 6f 77 6f 72 64 29 20 20 5c 0a 20 20 28 28 28 loword) \. (((
6fc0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 unsigned long) (
6fd0: 68 69 77 6f 72 64 29 20 3c 3c 20 31 36 29 20 7c hiword) << 16) |
6fe0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 (unsigned long)
6ff0: 20 28 6c 6f 77 6f 72 64 29 29 0a 23 64 65 66 69 (loword)).#defi
7000: 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 65 73 73 ne tramp_address
7010: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 (function) \.
7020: 68 69 6c 6f 28 2a 28 75 6e 73 69 67 6e 65 64 20 hilo(*(unsigned
7030: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
7040: 6f 6e 20 2b 31 30 29 2c 20 2a 28 75 6e 73 69 67 on +10), *(unsig
7050: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 ned short *) (fu
7060: 6e 63 74 69 6f 6e 20 2b 31 34 29 29 0a 23 64 65 nction +14)).#de
7070: 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 28 fine tramp_data(
7080: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68 function) \. h
7090: 69 6c 6f 28 2a 28 75 6e 73 69 67 6e 65 64 20 73 ilo(*(unsigned s
70a0: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f hort *) (functio
70b0: 6e 20 2b 20 32 29 2c 20 2a 28 75 6e 73 69 67 6e n + 2), *(unsign
70c0: 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e ed short *) (fun
70d0: 63 74 69 6f 6e 20 2b 20 36 29 29 0a 23 65 6e 64 ction + 6)).#end
70e0: 69 66 0a 23 69 66 64 65 66 20 5f 5f 72 73 36 30 if.#ifdef __rs60
70f0: 30 30 61 69 78 5f 5f 0a 20 20 2f 2a 20 66 75 6e 00aix__. /* fun
7100: 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 2e ction:. * .
7110: 6c 6f 6e 67 20 2e 74 72 61 6d 70 5f 72 0a 20 20 long .tramp_r.
7120: 20 2a 20 20 20 20 2e 6c 6f 6e 67 20 2e 6d 79 74 * .long .myt
7130: 6f 63 0a 20 20 20 2a 20 20 20 20 2e 6c 6f 6e 67 oc. * .long
7140: 20 30 0a 20 20 20 2a 20 2e 6d 79 74 6f 63 3a 0a 0. * .mytoc:.
7150: 20 20 20 2a 20 20 20 20 2e 6c 6f 6e 67 20 3c 64 * .long <d
7160: 61 74 61 3e 0a 20 20 20 2a 20 20 20 20 2e 6c 6f ata>. * .lo
7170: 6e 67 20 3c 61 64 64 72 65 73 73 3e 0a 20 20 20 ng <address>.
7180: 2a 2f 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 */. *(long *)
7190: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d (function + 0) =
71a0: 20 28 28 6c 6f 6e 67 20 2a 29 20 26 74 72 61 6d ((long *) &tram
71b0: 70 5f 72 29 5b 30 5d 3b 0a 20 20 2a 28 6c 6f 6e p_r)[0];. *(lon
71c0: 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 g *) (function
71d0: 2b 20 34 29 20 3d 20 28 6c 6f 6e 67 29 20 28 66 + 4) = (long) (f
71e0: 75 6e 63 74 69 6f 6e 20 2b 20 31 32 29 3b 0a 20 unction + 12);.
71f0: 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e *(long *) (fun
7200: 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 30 3b 0a ction + 8) = 0;.
7210: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 *(long *) (fu
7220: 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d 20 28 6c nction +12) = (l
7230: 6f 6e 67 29 20 64 61 74 61 3b 0a 20 20 2a 28 6c ong) data;. *(l
7240: 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f ong *) (functio
7250: 6e 20 2b 31 36 29 20 3d 20 28 6c 6f 6e 67 29 20 n +16) = (long)
7260: 61 64 64 72 65 73 73 3b 0a 23 64 65 66 69 6e 65 address;.#define
7270: 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 is_tramp(functi
7280: 6f 6e 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 on) \. ((long
7290: 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 30 5d 20 *) function)[0]
72a0: 3d 3d 20 28 28 6c 6f 6e 67 20 2a 29 20 26 74 72 == ((long *) &tr
72b0: 61 6d 70 5f 72 29 5b 30 5d 0a 23 64 65 66 69 6e amp_r)[0].#defin
72c0: 65 20 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 e tramp_address(
72d0: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 function) \. (
72e0: 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f (long *) functio
72f0: 6e 29 5b 34 5d 0a 23 64 65 66 69 6e 65 20 74 72 n)[4].#define tr
7300: 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 74 69 6f amp_data(functio
7310: 6e 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a n) \. ((long *
7320: 29 20 66 75 6e 63 74 69 6f 6e 29 5b 33 5d 0a 23 ) function)[3].#
7330: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d endif.#ifdef __m
7340: 38 38 6b 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 88k__. /* funct
7350: 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 6f 72 2e ion:. * or.
7360: 75 20 20 20 20 23 72 31 31 2c 23 72 30 2c 68 69 u #r11,#r0,hi
7370: 31 36 28 3c 64 61 74 61 3e 29 09 09 35 44 20 36 16(<data>)..5D 6
7380: 30 20 68 69 31 36 28 3c 64 61 74 61 3e 29 0a 20 0 hi16(<data>).
7390: 20 20 2a 20 20 20 20 6f 72 20 20 20 20 20 20 23 * or #
73a0: 72 31 31 2c 23 72 31 31 2c 6c 6f 31 36 28 3c 64 r11,#r11,lo16(<d
73b0: 61 74 61 3e 29 09 09 35 39 20 36 42 20 6c 6f 31 ata>)..59 6B lo1
73c0: 36 28 3c 64 61 74 61 3e 29 0a 20 20 20 2a 20 20 6(<data>). *
73d0: 20 20 6f 72 2e 75 20 20 20 20 23 72 31 33 2c 23 or.u #r13,#
73e0: 72 30 2c 68 69 31 36 28 3c 61 64 64 72 65 73 73 r0,hi16(<address
73f0: 3e 29 09 35 44 20 41 30 20 68 69 31 36 28 3c 61 >).5D A0 hi16(<a
7400: 64 64 72 65 73 73 3e 29 0a 20 20 20 2a 20 20 20 ddress>). *
7410: 20 6f 72 20 20 20 20 20 20 23 72 31 33 2c 23 72 or #r13,#r
7420: 31 33 2c 6c 6f 31 36 28 3c 61 64 64 72 65 73 73 13,lo16(<address
7430: 3e 29 09 35 39 20 41 44 20 6c 6f 31 36 28 3c 61 >).59 AD lo16(<a
7440: 64 64 72 65 73 73 3e 29 0a 20 20 20 2a 20 20 20 ddress>). *
7450: 20 6a 6d 70 20 20 20 20 20 23 72 31 33 09 09 09 jmp #r13...
7460: 09 46 34 20 30 30 20 43 30 20 30 44 0a 20 20 20 .F4 00 C0 0D.
7470: 2a 2f 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 */. *(short *)
7480: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d (function + 0) =
7490: 20 30 78 35 44 36 30 3b 0a 20 20 2a 28 73 68 6f 0x5D60;. *(sho
74a0: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
74b0: 2b 20 32 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 + 2) = (unsigned
74c0: 20 6c 6f 6e 67 29 20 64 61 74 61 20 3e 3e 20 31 long) data >> 1
74d0: 36 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 6;. *(short *)
74e0: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d (function + 4) =
74f0: 20 30 78 35 39 36 42 3b 0a 20 20 2a 28 73 68 6f 0x596B;. *(sho
7500: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
7510: 2b 20 36 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 + 6) = (unsigned
7520: 20 6c 6f 6e 67 29 20 64 61 74 61 20 26 20 30 78 long) data & 0x
7530: 66 66 66 66 3b 0a 20 20 2a 28 73 68 6f 72 74 20 ffff;. *(short
7540: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 *) (function + 8
7550: 29 20 3d 20 30 78 35 44 41 30 3b 0a 20 20 2a 28 ) = 0x5DA0;. *(
7560: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
7570: 6f 6e 20 2b 31 30 29 20 3d 20 28 75 6e 73 69 67 on +10) = (unsig
7580: 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64 72 65 73 ned long) addres
7590: 73 20 3e 3e 20 31 36 3b 0a 20 20 2a 28 73 68 6f s >> 16;. *(sho
75a0: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
75b0: 2b 31 32 29 20 3d 20 30 78 35 39 41 44 3b 0a 20 +12) = 0x59AD;.
75c0: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e *(short *) (fun
75d0: 63 74 69 6f 6e 20 2b 31 34 29 20 3d 20 28 75 6e ction +14) = (un
75e0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64 signed long) add
75f0: 72 65 73 73 20 26 20 30 78 66 66 66 66 3b 0a 20 ress & 0xffff;.
7600: 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e *(long *) (fun
7610: 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20 30 78 46 ction +16) = 0xF
7620: 34 30 30 43 30 30 44 3b 0a 23 64 65 66 69 6e 65 400C00D;.#define
7630: 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 is_tramp(functi
7640: 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67 on) \. *(unsig
7650: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 ned short *) (fu
7660: 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 3d 20 30 nction + 0) == 0
7670: 78 35 44 36 30 20 26 26 20 5c 0a 20 20 2a 28 75 x5D60 && \. *(u
7680: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 nsigned short *)
7690: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 (function + 4)
76a0: 3d 3d 20 30 78 35 39 36 42 20 26 26 20 5c 0a 20 == 0x596B && \.
76b0: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 *(unsigned shor
76c0: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
76d0: 20 38 29 20 3d 3d 20 30 78 35 44 41 30 20 26 26 8) == 0x5DA0 &&
76e0: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 \. *(unsigned
76f0: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
7700: 6f 6e 20 2b 31 32 29 20 3d 3d 20 30 78 35 39 41 on +12) == 0x59A
7710: 44 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 D && \. *(unsig
7720: 6e 65 64 20 6c 6f 6e 67 20 2a 29 20 20 28 66 75 ned long *) (fu
7730: 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 3d 20 30 nction +16) == 0
7740: 78 46 34 30 30 43 30 30 44 0a 23 64 65 66 69 6e xF400C00D.#defin
7750: 65 20 68 69 6c 6f 28 68 69 77 6f 72 64 2c 6c 6f e hilo(hiword,lo
7760: 77 6f 72 64 29 20 20 5c 0a 20 20 28 28 28 75 6e word) \. (((un
7770: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 68 69 signed long) (hi
7780: 77 6f 72 64 29 20 3c 3c 20 31 36 29 20 7c 20 28 word) << 16) | (
7790: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 unsigned long) (
77a0: 6c 6f 77 6f 72 64 29 29 0a 23 64 65 66 69 6e 65 loword)).#define
77b0: 20 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66 tramp_address(f
77c0: 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69 unction) \. hi
77d0: 6c 6f 28 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 lo(*(unsigned sh
77e0: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ort *) (function
77f0: 20 2b 31 30 29 2c 20 2a 28 75 6e 73 69 67 6e 65 +10), *(unsigne
7800: 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 d short *) (func
7810: 74 69 6f 6e 20 2b 31 34 29 29 0a 23 64 65 66 69 tion +14)).#defi
7820: 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 28 66 75 ne tramp_data(fu
7830: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c nction) \. hil
7840: 6f 28 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f o(*(unsigned sho
7850: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
7860: 2b 20 32 29 2c 20 2a 28 75 6e 73 69 67 6e 65 64 + 2), *(unsigned
7870: 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 short *) (funct
7880: 69 6f 6e 20 2b 20 36 29 29 0a 23 65 6e 64 69 66 ion + 6)).#endif
7890: 0a 23 69 66 64 65 66 20 5f 5f 63 6f 6e 76 65 78 .#ifdef __convex
78a0: 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e __. /* function
78b0: 3a 0a 20 20 20 2a 20 20 20 20 6c 64 2e 77 20 23 :. * ld.w #
78c0: 3c 64 61 74 61 3e 2c 73 30 09 09 09 09 3f 3f 3f <data>,s0....???
78d0: 3f 20 3c 64 61 74 61 3e 0a 20 20 20 2a 20 20 20 ? <data>. *
78e0: 20 6a 6d 70 20 3c 61 64 64 72 65 73 73 3e 09 09 jmp <address>..
78f0: 09 09 30 31 34 30 20 3c 61 64 64 72 65 73 73 3e ..0140 <address>
7900: 0a 20 20 20 2a 20 20 20 20 64 73 2e 68 20 30 09 . * ds.h 0.
7910: 09 09 09 09 30 30 30 30 0a 20 20 20 2a 2f 0a 20 ....0000. */.
7920: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e *(short *) (fun
7930: 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20 30 78 3f ction + 0) = 0x?
7940: 3f 3f 3f 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 ???;. *(long *)
7950: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 32 29 (function + 2)
7960: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e = (unsigned lon
7970: 67 29 20 64 61 74 61 3b 0a 20 20 2a 28 73 68 6f g) data;. *(sho
7980: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
7990: 2b 20 36 29 20 3d 20 30 78 30 31 34 30 3b 0a 20 + 6) = 0x0140;.
79a0: 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e *(long *) (fun
79b0: 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 28 75 6e ction + 8) = (un
79c0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64 signed long) add
79d0: 72 65 73 73 3b 0a 20 20 2a 28 73 68 6f 72 74 20 ress;. *(short
79e0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 *) (function +12
79f0: 29 20 3d 20 30 78 30 30 30 30 3b 0a 23 64 65 66 ) = 0x0000;.#def
7a00: 69 6e 65 20 69 73 5f 74 72 61 6d 70 28 66 75 6e ine is_tramp(fun
7a10: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e ction) \. *(un
7a20: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 signed short *)
7a30: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d (function + 0) =
7a40: 3d 20 30 78 3f 3f 3f 3f 20 26 26 20 5c 0a 20 20 = 0x???? && \.
7a50: 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 *(unsigned short
7a60: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 *) (function +
7a70: 36 29 20 3d 3d 20 30 78 30 31 34 30 20 26 26 20 6) == 0x0140 &&
7a80: 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 \. *(unsigned s
7a90: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f hort *) (functio
7aa0: 6e 20 2b 31 32 29 20 3d 3d 20 30 78 30 30 30 30 n +12) == 0x0000
7ab0: 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 61 .#define tramp_a
7ac0: 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e 29 ddress(function)
7ad0: 20 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 \. *(long *)
7ae0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 0a (function + 8).
7af0: 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 #define tramp_da
7b00: 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a ta(function) \.
7b10: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 *(long *) (fu
7b20: 6e 63 74 69 6f 6e 20 2b 20 32 29 0a 23 65 6e 64 nction + 2).#end
7b30: 69 66 0a 23 69 66 64 65 66 20 5f 5f 69 61 36 34 if.#ifdef __ia64
7b40: 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e __. /* function
7b50: 3a 0a 20 20 20 2a 20 20 20 20 64 61 74 61 38 20 :. * data8
7b60: 20 20 74 72 61 6d 70 5f 72 0a 20 20 20 2a 20 20 tramp_r. *
7b70: 20 20 64 61 74 61 38 20 20 20 63 6c 6f 73 75 72 data8 closur
7b80: 65 0a 20 20 20 2a 20 63 6c 6f 73 75 72 65 3a 0a e. * closure:.
7b90: 20 20 20 2a 20 20 20 20 64 61 74 61 38 20 20 20 * data8
7ba0: 3c 61 64 64 72 65 73 73 3e 0a 20 20 20 2a 20 20 <address>. *
7bb0: 20 20 64 61 74 61 38 20 20 20 3c 64 61 74 61 3e data8 <data>
7bc0: 0a 20 20 20 2a 2f 0a 20 20 2a 28 6c 6f 6e 67 20 . */. *(long
7bd0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 *) (function + 0
7be0: 29 20 3d 20 28 6c 6f 6e 67 29 20 26 74 72 61 6d ) = (long) &tram
7bf0: 70 5f 72 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 p_r;. *(long *)
7c00: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 (function + 8)
7c10: 3d 20 28 6c 6f 6e 67 29 20 28 66 75 6e 63 74 69 = (long) (functi
7c20: 6f 6e 20 2b 20 31 36 29 3b 0a 20 20 2a 28 6c 6f on + 16);. *(lo
7c30: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 ng *) (function
7c40: 2b 31 36 29 20 3d 20 28 6c 6f 6e 67 29 20 61 64 +16) = (long) ad
7c50: 64 72 65 73 73 3b 0a 20 20 2a 28 6c 6f 6e 67 20 dress;. *(long
7c60: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 34 *) (function +24
7c70: 29 20 3d 20 28 6c 6f 6e 67 29 20 64 61 74 61 3b ) = (long) data;
7c80: 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d .#define is_tram
7c90: 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 p(function) \.
7ca0: 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 ((long *) funct
7cb0: 69 6f 6e 29 5b 30 5d 20 3d 3d 20 28 6c 6f 6e 67 ion)[0] == (long
7cc0: 29 20 26 74 72 61 6d 70 5f 72 0a 23 64 65 66 69 ) &tramp_r.#defi
7cd0: 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 65 73 73 ne tramp_address
7ce0: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 (function) \.
7cf0: 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 ((long *) functi
7d00: 6f 6e 29 5b 32 5d 0a 23 64 65 66 69 6e 65 20 74 on)[2].#define t
7d10: 72 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 74 69 ramp_data(functi
7d20: 6f 6e 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 on) \. ((long
7d30: 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 33 5d 0a *) function)[3].
7d40: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f #endif.#ifdef __
7d50: 78 38 36 5f 36 34 5f 5f 0a 20 20 2f 2a 20 66 75 x86_64__. /* fu
7d60: 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 nction:. *
7d70: 6d 6f 76 61 62 73 71 20 24 3c 64 61 74 61 3e 2c movabsq $<data>,
7d80: 25 72 31 30 09 09 34 39 20 42 41 20 3c 64 61 74 %r10..49 BA <dat
7d90: 61 3e 0a 20 20 20 2a 20 20 20 20 6d 6f 76 61 62 a>. * movab
7da0: 73 71 20 24 3c 61 64 64 72 65 73 73 3e 2c 25 72 sq $<address>,%r
7db0: 61 78 09 09 34 38 20 42 38 20 3c 61 64 64 72 65 ax..48 B8 <addre
7dc0: 73 73 3e 0a 20 20 20 2a 20 20 20 20 6a 6d 70 20 ss>. * jmp
7dd0: 2a 25 72 61 78 09 09 09 46 46 20 45 30 0a 20 20 *%rax...FF E0.
7de0: 20 2a 2f 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 */. *(short *)
7df0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 (function + 0)
7e00: 3d 20 30 78 42 41 34 39 3b 0a 20 20 2a 28 73 68 = 0xBA49;. *(sh
7e10: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e ort *) (function
7e20: 20 2b 20 32 29 20 3d 20 28 75 6e 73 69 67 6e 65 + 2) = (unsigne
7e30: 64 20 6c 6f 6e 67 29 20 64 61 74 61 20 26 20 30 d long) data & 0
7e40: 78 66 66 66 66 3b 0a 20 20 2a 28 69 6e 74 20 2a xffff;. *(int *
7e50: 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 ) (function +
7e60: 34 29 20 3d 20 28 28 75 6e 73 69 67 6e 65 64 20 4) = ((unsigned
7e70: 6c 6f 6e 67 29 20 64 61 74 61 20 3e 3e 20 31 36 long) data >> 16
7e80: 29 20 26 20 30 78 66 66 66 66 66 66 66 66 3b 0a ) & 0xffffffff;.
7e90: 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 *(short *) (fu
7ea0: 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 28 28 nction + 8) = ((
7eb0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 unsigned long) d
7ec0: 61 74 61 20 3e 3e 20 34 38 29 20 26 20 30 78 66 ata >> 48) & 0xf
7ed0: 66 66 66 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a fff;. *(short *
7ee0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 30 29 ) (function +10)
7ef0: 20 3d 20 30 78 42 38 34 38 3b 0a 20 20 2a 28 69 = 0xB848;. *(i
7f00: 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f nt *) (functio
7f10: 6e 20 2b 31 32 29 20 3d 20 28 75 6e 73 69 67 6e n +12) = (unsign
7f20: 65 64 20 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 ed long) address
7f30: 20 26 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20 & 0xffffffff;.
7f40: 20 2a 28 69 6e 74 20 2a 29 20 20 20 28 66 75 6e *(int *) (fun
7f50: 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20 28 28 75 ction +16) = ((u
7f60: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 61 64 nsigned long) ad
7f70: 64 72 65 73 73 20 3e 3e 20 33 32 29 20 26 20 30 dress >> 32) & 0
7f80: 78 66 66 66 66 66 66 66 66 3b 0a 20 20 2a 28 73 xffffffff;. *(s
7f90: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f hort *) (functio
7fa0: 6e 20 2b 32 30 29 20 3d 20 30 78 45 30 46 46 3b n +20) = 0xE0FF;
7fb0: 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d .#define is_tram
7fc0: 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 p(function) \.
7fd0: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 *(unsigned shor
7fe0: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b t *) (function +
7ff0: 20 30 29 20 3d 3d 20 30 78 42 41 34 39 20 26 26 0) == 0xBA49 &&
8000: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 \. *(unsigned
8010: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 short *) (functi
8020: 6f 6e 20 2b 31 30 29 20 3d 3d 20 30 78 42 38 34 on +10) == 0xB84
8030: 38 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 8 && \. *(unsig
8040: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 ned short *) (fu
8050: 6e 63 74 69 6f 6e 20 2b 32 30 29 20 3d 3d 20 30 nction +20) == 0
8060: 78 45 30 46 46 0a 23 64 65 66 69 6e 65 20 68 69 xE0FF.#define hi
8070: 6c 6f 28 68 69 77 6f 72 64 2c 6c 6f 77 6f 72 64 lo(hiword,loword
8080: 29 20 20 5c 0a 20 20 28 28 28 75 6e 73 69 67 6e ) \. (((unsign
8090: 65 64 20 6c 6f 6e 67 29 20 28 68 69 77 6f 72 64 ed long) (hiword
80a0: 29 20 3c 3c 20 33 32 29 20 7c 20 28 75 6e 73 69 ) << 32) | (unsi
80b0: 67 6e 65 64 20 6c 6f 6e 67 29 20 28 6c 6f 77 6f gned long) (lowo
80c0: 72 64 29 29 0a 23 64 65 66 69 6e 65 20 68 69 6d rd)).#define him
80d0: 69 64 6c 6f 28 68 69 73 68 6f 72 74 2c 6d 69 64 idlo(hishort,mid
80e0: 77 6f 72 64 2c 6c 6f 73 68 6f 72 74 29 20 20 5c word,loshort) \
80f0: 0a 20 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c . (((unsigned l
8100: 6f 6e 67 29 20 28 68 69 73 68 6f 72 74 29 20 3c ong) (hishort) <
8110: 3c 20 34 38 29 20 7c 20 28 75 6e 73 69 67 6e 65 < 48) | (unsigne
8120: 64 20 6c 6f 6e 67 29 20 28 6d 69 64 77 6f 72 64 d long) (midword
8130: 29 20 3c 3c 20 31 36 20 5c 0a 20 20 20 7c 20 28 ) << 16 \. | (
8140: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 unsigned long) (
8150: 6c 6f 73 68 6f 72 74 29 29 0a 23 64 65 66 69 6e loshort)).#defin
8160: 65 20 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 e tramp_address(
8170: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68 function) \. h
8180: 69 6c 6f 28 2a 28 75 6e 73 69 67 6e 65 64 20 69 ilo(*(unsigned i
8190: 6e 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 nt *) (function
81a0: 2b 31 36 29 2c 20 2a 28 75 6e 73 69 67 6e 65 64 +16), *(unsigned
81b0: 20 69 6e 74 20 2a 29 20 28 66 75 6e 63 74 69 6f int *) (functio
81c0: 6e 20 2b 31 32 29 29 0a 23 64 65 66 69 6e 65 20 n +12)).#define
81d0: 74 72 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 74 tramp_data(funct
81e0: 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6d 69 64 6c ion) \. himidl
81f0: 6f 28 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f o(*(unsigned sho
8200: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
8210: 2b 20 38 29 2c 20 5c 0a 20 20 20 20 20 20 20 20 + 8), \.
8220: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 *(unsigned int
8230: 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 *) (function
8240: 2b 20 34 29 2c 20 5c 0a 20 20 20 20 20 20 20 20 + 4), \.
8250: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f *(unsigned sho
8260: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 rt *) (function
8270: 2b 20 32 29 29 0a 23 65 6e 64 69 66 0a 23 69 66 + 2)).#endif.#if
8280: 64 65 66 20 5f 5f 73 33 39 30 5f 5f 0a 20 20 2f def __s390__. /
8290: 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 0a 20 20 20 * function:..
82a0: 20 20 20 20 20 62 72 61 73 20 20 20 20 25 72 31 bras %r1
82b0: 2c 2e 4c 54 4e 30 5f 30 0a 2e 4c 54 30 5f 30 3a ,.LTN0_0..LT0_0:
82c0: 0a 2e 4c 43 30 3a 0a 20 20 20 20 20 20 20 20 2e ..LC0:. .
82d0: 6c 6f 6e 67 20 20 20 30 78 37 33 35 35 34 37 31 long 0x7355471
82e0: 31 0a 2e 4c 43 31 3a 0a 20 20 20 20 20 20 20 20 1..LC1:.
82f0: 2e 6c 6f 6e 67 20 20 20 30 78 62 61 62 65 62 65 .long 0xbabebe
8300: 63 30 0a 2e 4c 54 4e 30 5f 30 3a 0a 20 20 20 20 c0..LTN0_0:.
8310: 20 20 20 20 6c 20 20 20 20 20 20 20 25 72 30 2c l %r0,
8320: 2e 4c 43 30 2d 2e 4c 54 30 5f 30 28 25 72 31 29 .LC0-.LT0_0(%r1)
8330: 0a 20 20 20 20 20 20 20 20 6c 20 20 20 20 20 20 . l
8340: 20 25 72 31 2c 2e 4c 43 31 2d 2e 4c 54 31 5f 30 %r1,.LC1-.LT1_0
8350: 28 25 72 31 29 0a 20 20 20 20 20 20 20 20 62 72 (%r1). br
8360: 20 20 20 20 20 20 25 72 31 0a 20 20 2a 2f 0a 20 %r1. */.
8370: 20 2f 2a 20 57 68 61 74 20 61 62 6f 75 74 20 62 /* What about b
8380: 69 67 20 65 6e 64 69 61 6e 20 2f 20 6c 69 74 74 ig endian / litt
8390: 6c 65 20 65 6e 64 69 61 6e 20 3f 3f 20 2a 2f 0a le endian ?? */.
83a0: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 *(unsigned int
83b0: 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 *) (function
83c0: 2b 20 30 29 20 3d 20 30 78 41 37 31 35 30 30 30 + 0) = 0xA715000
83d0: 36 3b 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 6;. *(unsigned
83e0: 69 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 int *) (functi
83f0: 6f 6e 20 2b 20 34 29 20 3d 20 28 75 6e 73 69 67 on + 4) = (unsig
8400: 6e 65 64 20 69 6e 74 29 20 64 61 74 61 3b 0a 20 ned int) data;.
8410: 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 *(unsigned int
8420: 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b *) (function +
8430: 20 38 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 8) = (unsigned
8440: 69 6e 74 29 20 61 64 64 72 65 73 73 3b 0a 20 20 int) address;.
8450: 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a *(unsigned int *
8460: 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 ) (function +1
8470: 32 29 20 3d 20 30 78 35 38 30 30 31 30 30 30 3b 2) = 0x58001000;
8480: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e . *(unsigned in
8490: 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e t *) (function
84a0: 20 2b 31 36 29 20 3d 20 30 78 35 38 31 30 31 30 +16) = 0x581010
84b0: 30 34 3b 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 04;. *(unsigned
84c0: 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 short *) (funct
84d0: 69 6f 6e 20 2b 32 30 29 20 3d 20 30 78 30 37 66 ion +20) = 0x07f
84e0: 31 3b 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72 1;.#define is_tr
84f0: 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c amp(function) \
8500: 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 20 20 . *(int *)
8510: 20 20 20 20 20 20 20 28 66 75 6e 63 74 69 6f 6e (function
8520: 20 2b 20 30 29 20 3d 3d 20 30 78 41 37 31 35 30 + 0) == 0xA7150
8530: 30 30 36 20 26 26 20 5c 0a 20 20 2a 28 69 6e 74 006 && \. *(int
8540: 20 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 28 *) (
8550: 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d 3d function +12) ==
8560: 20 30 78 35 38 30 30 31 30 30 30 20 26 26 20 5c 0x58001000 && \
8570: 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 20 20 . *(int *)
8580: 20 20 20 20 20 20 20 28 66 75 6e 63 74 69 6f 6e (function
8590: 20 2b 31 36 29 20 3d 3d 20 30 78 35 38 31 30 31 +16) == 0x58101
85a0: 30 30 34 20 26 26 20 5c 0a 20 20 2a 28 73 68 6f 004 && \. *(sho
85b0: 72 74 20 2a 29 20 20 20 20 20 20 20 20 20 20 28 rt *) (
85c0: 66 75 6e 63 74 69 6f 6e 20 2b 32 30 29 20 3d 3d function +20) ==
85d0: 20 30 78 30 37 66 31 0a 23 64 65 66 69 6e 65 20 0x07f1.#define
85e0: 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75 tramp_address(fu
85f0: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 nction) \. *(u
8600: 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 28 nsigned int *) (
8610: 66 75 6e 63 74 69 6f 6e 20 2b 38 29 0a 23 64 65 function +8).#de
8620: 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 28 fine tramp_data(
8630: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a function) \. *
8640: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 (unsigned int *)
8650: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 34 29 0a 23 (function +4).#
8660: 65 6e 64 69 66 0a 20 20 2f 2a 0a 20 20 20 2a 20 endif. /*. *
8670: 64 61 74 61 3a 0a 20 20 20 2a 20 20 20 20 3c 64 data:. * <d
8680: 61 74 61 30 3e 09 09 09 09 3c 64 61 74 61 30 3e ata0>....<data0>
8690: 0a 20 20 20 2a 20 20 20 20 3c 64 61 74 61 31 3e . * <data1>
86a0: 09 09 09 09 3c 64 61 74 61 31 3e 0a 20 20 20 2a ....<data1>. *
86b0: 2f 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 /. *(long *) (
86c0: 64 61 74 61 20 2b 20 30 2a 73 69 7a 65 6f 66 28 data + 0*sizeof(
86d0: 76 6f 69 64 2a 29 29 20 3d 20 28 6c 6f 6e 67 29 void*)) = (long)
86e0: 20 64 61 74 61 30 3b 0a 20 20 2a 28 6c 6f 6e 67 data0;. *(long
86f0: 20 2a 29 20 20 28 64 61 74 61 20 2b 20 31 2a 73 *) (data + 1*s
8700: 69 7a 65 6f 66 28 76 6f 69 64 2a 29 29 20 3d 20 izeof(void*)) =
8710: 28 6c 6f 6e 67 29 20 64 61 74 61 31 3b 0a 0a 20 (long) data1;..
8720: 20 2f 2a 20 33 2e 20 53 65 74 20 6d 65 6d 6f 72 /* 3. Set memor
8730: 79 20 70 72 6f 74 65 63 74 69 6f 6e 20 74 6f 20 y protection to
8740: 22 65 78 65 63 75 74 61 62 6c 65 22 20 2a 2f 0a "executable" */.
8750: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 43 4f .#if !defined(CO
8760: 44 45 5f 45 58 45 43 55 54 41 42 4c 45 29 20 26 DE_EXECUTABLE) &
8770: 26 20 64 65 66 69 6e 65 64 28 45 58 45 43 55 54 & defined(EXECUT
8780: 41 42 4c 45 5f 56 49 41 5f 4d 50 52 4f 54 45 43 ABLE_VIA_MPROTEC
8790: 54 29 0a 20 20 2f 2a 20 43 61 6c 6c 20 6d 70 72 T). /* Call mpr
87a0: 6f 74 65 63 74 20 6f 6e 20 74 68 65 20 70 61 67 otect on the pag
87b0: 65 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 es that contain
87c0: 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 the range. */.
87d0: 7b 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 { unsigned long
87e0: 73 74 61 72 74 5f 61 64 64 72 20 3d 20 28 75 6e start_addr = (un
87f0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 66 75 6e signed long) fun
8800: 63 74 69 6f 6e 3b 0a 20 20 20 20 75 6e 73 69 67 ction;. unsig
8810: 6e 65 64 20 6c 6f 6e 67 20 65 6e 64 5f 61 64 64 ned long end_add
8820: 72 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f r = (unsigned lo
8830: 6e 67 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 ng) (function +
8840: 54 52 41 4d 50 5f 4c 45 4e 47 54 48 29 3b 0a 20 TRAMP_LENGTH);.
8850: 20 20 20 73 74 61 72 74 5f 61 64 64 72 20 3d 20 start_addr =
8860: 73 74 61 72 74 5f 61 64 64 72 20 26 20 2d 70 61 start_addr & -pa
8870: 67 65 73 69 7a 65 3b 0a 20 20 20 20 65 6e 64 5f gesize;. end_
8880: 61 64 64 72 20 3d 20 28 65 6e 64 5f 61 64 64 72 addr = (end_addr
8890: 20 2b 20 70 61 67 65 73 69 7a 65 2d 31 29 20 26 + pagesize-1) &
88a0: 20 2d 70 61 67 65 73 69 7a 65 3b 0a 20 20 20 7b -pagesize;. {
88b0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 65 unsigned long le
88c0: 6e 20 3d 20 65 6e 64 5f 61 64 64 72 20 2d 20 73 n = end_addr - s
88d0: 74 61 72 74 5f 61 64 64 72 3b 0a 23 69 66 20 64 tart_addr;.#if d
88e0: 65 66 69 6e 65 64 28 48 41 56 45 5f 4d 41 43 48 efined(HAVE_MACH
88f0: 5f 56 4d 29 0a 20 20 20 20 69 66 20 28 76 6d 5f _VM). if (vm_
8900: 70 72 6f 74 65 63 74 28 74 61 73 6b 5f 73 65 6c protect(task_sel
8910: 66 28 29 2c 73 74 61 72 74 5f 61 64 64 72 2c 6c f(),start_addr,l
8920: 65 6e 2c 30 2c 56 4d 5f 50 52 4f 54 5f 52 45 41 en,0,VM_PROT_REA
8930: 44 7c 56 4d 5f 50 52 4f 54 5f 57 52 49 54 45 7c D|VM_PROT_WRITE|
8940: 56 4d 5f 50 52 4f 54 5f 45 58 45 43 55 54 45 29 VM_PROT_EXECUTE)
8950: 20 21 3d 20 4b 45 52 4e 5f 53 55 43 43 45 53 53 != KERN_SUCCESS
8960: 29 0a 23 65 6c 73 65 0a 23 69 66 20 64 65 66 69 ).#else.#if defi
8970: 6e 65 64 28 5f 5f 63 6f 6e 76 65 78 5f 5f 29 0a ned(__convex__).
8980: 20 20 20 20 2f 2a 20 43 6f 6e 76 65 78 20 4f 53 /* Convex OS
8990: 20 63 61 6c 6c 73 20 69 74 20 60 6d 72 65 6d 61 calls it `mrema
89a0: 70 28 29 27 2e 20 2a 2f 0a 20 20 20 20 6d 72 65 p()'. */. mre
89b0: 6d 61 70 28 73 74 61 72 74 5f 61 64 64 72 2c 20 map(start_addr,
89c0: 26 6c 65 6e 2c 20 50 52 4f 54 5f 52 45 41 44 7c &len, PROT_READ|
89d0: 50 52 4f 54 5f 57 52 49 54 45 7c 50 52 4f 54 5f PROT_WRITE|PROT_
89e0: 45 58 45 43 2c 20 4d 41 50 5f 50 52 49 56 41 54 EXEC, MAP_PRIVAT
89f0: 45 29 3b 0a 20 20 20 20 69 66 20 28 30 29 0a 23 E);. if (0).#
8a00: 65 6c 73 65 0a 23 69 66 20 64 65 66 69 6e 65 64 else.#if defined
8a10: 28 48 41 56 45 5f 53 59 53 5f 4d 38 38 4b 42 43 (HAVE_SYS_M88KBC
8a20: 53 5f 48 29 0a 20 20 20 20 69 66 20 28 6d 65 6d S_H). if (mem
8a30: 63 74 6c 28 73 74 61 72 74 5f 61 64 64 72 2c 20 ctl(start_addr,
8a40: 6c 65 6e 2c 20 4d 43 54 5f 54 45 58 54 29 20 3d len, MCT_TEXT) =
8a50: 3d 20 2d 31 29 0a 23 65 6c 73 65 0a 20 20 20 20 = -1).#else.
8a60: 69 66 20 28 6d 70 72 6f 74 65 63 74 28 28 76 6f if (mprotect((vo
8a70: 69 64 2a 29 73 74 61 72 74 5f 61 64 64 72 2c 20 id*)start_addr,
8a80: 6c 65 6e 2c 20 50 52 4f 54 5f 52 45 41 44 7c 50 len, PROT_READ|P
8a90: 52 4f 54 5f 57 52 49 54 45 7c 50 52 4f 54 5f 45 ROT_WRITE|PROT_E
8aa0: 58 45 43 29 20 3c 20 30 29 0a 23 65 6e 64 69 66 XEC) < 0).#endif
8ab0: 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 20 .#endif.#endif.
8ac0: 20 20 20 20 20 7b 20 66 70 72 69 6e 74 66 28 73 { fprintf(s
8ad0: 74 64 65 72 72 2c 22 74 72 61 6d 70 6f 6c 69 6e tderr,"trampolin
8ae0: 65 3a 20 63 61 6e 6e 6f 74 20 6d 61 6b 65 20 6d e: cannot make m
8af0: 65 6d 6f 72 79 20 65 78 65 63 75 74 61 62 6c 65 emory executable
8b00: 5c 6e 22 29 3b 20 61 62 6f 72 74 28 29 3b 20 7d \n"); abort(); }
8b10: 0a 20 20 7d 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 . }}.#endif..
8b20: 2f 2a 20 34 2e 20 46 6c 75 73 68 20 69 6e 73 74 /* 4. Flush inst
8b30: 72 75 63 74 69 6f 6e 20 63 61 63 68 65 20 2a 2f ruction cache */
8b40: 0a 20 20 2f 2a 20 57 65 20 6e 65 65 64 20 74 68 . /* We need th
8b50: 69 73 20 62 65 63 61 75 73 65 20 73 6f 6d 65 20 is because some
8b60: 43 50 55 73 20 68 61 76 65 20 73 65 70 61 72 61 CPUs have separa
8b70: 74 65 20 64 61 74 61 20 63 61 63 68 65 20 61 6e te data cache an
8b80: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 d instruction.
8b90: 20 2a 20 63 61 63 68 65 2e 20 54 68 65 20 66 72 * cache. The fr
8ba0: 65 73 68 6c 79 20 62 75 69 6c 74 20 74 72 61 6d eshly built tram
8bb0: 70 6f 6c 69 6e 65 20 69 73 20 76 69 73 69 62 6c poline is visibl
8bc0: 65 20 74 6f 20 74 68 65 20 64 61 74 61 20 63 61 e to the data ca
8bd0: 63 68 65 2c 20 62 75 74 20 6e 6f 74 0a 20 20 20 che, but not.
8be0: 2a 20 6d 61 79 62 65 20 6e 6f 74 20 74 6f 20 74 * maybe not to t
8bf0: 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 he instruction c
8c00: 61 63 68 65 2e 20 54 68 69 73 20 69 73 20 68 61 ache. This is ha
8c10: 69 72 79 2e 0a 20 20 20 2a 2f 0a 23 69 66 20 21 iry.. */.#if !
8c20: 28 64 65 66 69 6e 65 64 28 5f 5f 68 70 70 61 6e (defined(__hppan
8c30: 65 77 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 ew__) || defined
8c40: 28 5f 5f 72 73 36 30 30 30 61 69 78 5f 5f 29 20 (__rs6000aix__)
8c50: 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 69 61 36 || defined(__ia6
8c60: 34 5f 5f 29 29 0a 20 20 2f 2a 20 4f 6e 6c 79 20 4__)). /* Only
8c70: 6e 65 65 64 65 64 20 69 66 20 77 65 20 72 65 61 needed if we rea
8c80: 6c 6c 79 20 73 65 74 20 75 70 20 6d 61 63 68 69 lly set up machi
8c90: 6e 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e ne instructions.
8ca0: 20 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 69 33 38 */.#ifdef __i38
8cb0: 36 5f 5f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 6__.#if defined(
8cc0: 5f 57 49 4e 33 32 29 0a 20 20 77 68 69 6c 65 20 _WIN32). while
8cd0: 28 21 46 6c 75 73 68 49 6e 73 74 72 75 63 74 69 (!FlushInstructi
8ce0: 6f 6e 43 61 63 68 65 28 47 65 74 43 75 72 72 65 onCache(GetCurre
8cf0: 6e 74 50 72 6f 63 65 73 73 28 29 2c 66 75 6e 63 ntProcess(),func
8d00: 74 69 6f 6e 2c 54 52 41 4d 50 5f 4c 45 4e 47 54 tion,TRAMP_LENGT
8d10: 48 29 29 0a 20 20 20 20 63 6f 6e 74 69 6e 75 65 H)). continue
8d20: 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a ;.#endif.#endif.
8d30: 23 69 66 64 65 66 20 5f 5f 6d 36 38 6b 5f 5f 0a #ifdef __m68k__.
8d40: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 65 58 54 #if defined(NeXT
8d50: 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 47 ) && defined(__G
8d60: 4e 55 43 5f 5f 29 0a 20 20 5f 5f 61 73 6d 5f 5f NUC__). __asm__
8d70: 20 5f 5f 76 6f 6c 61 74 69 6c 65 5f 5f 20 28 22 __volatile__ ("
8d80: 74 72 61 70 20 23 32 22 29 3b 0a 23 65 6e 64 69 trap #2");.#endi
8d90: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 41 4d f.#if defined(AM
8da0: 49 47 41 29 0a 20 20 43 61 63 68 65 43 6c 65 61 IGA). CacheClea
8db0: 72 45 28 66 75 6e 63 74 69 6f 6e 2c 54 52 41 4d rE(function,TRAM
8dc0: 50 5f 4c 45 4e 47 54 48 2c 43 41 43 52 46 5f 43 P_LENGTH,CACRF_C
8dd0: 6c 65 61 72 49 7c 43 41 43 52 46 5f 43 6c 65 61 learI|CACRF_Clea
8de0: 72 44 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 rD);.#endif.#if
8df0: 64 65 66 69 6e 65 64 28 61 70 6f 6c 6c 6f 29 0a defined(apollo).
8e00: 20 20 63 61 63 68 65 5f 24 63 6c 65 61 72 28 29 cache_$clear()
8e10: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 ;.#endif.#if def
8e20: 69 6e 65 64 28 68 70 75 78 29 0a 20 20 63 61 63 ined(hpux). cac
8e30: 68 65 63 74 6c 28 43 43 5f 49 50 55 52 47 45 2c hectl(CC_IPURGE,
8e40: 66 75 6e 63 74 69 6f 6e 2c 54 52 41 4d 50 5f 4c function,TRAMP_L
8e50: 45 4e 47 54 48 29 3b 0a 23 65 6e 64 69 66 0a 23 ENGTH);.#endif.#
8e60: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 4e 65 74 if defined(__Net
8e70: 42 53 44 5f 5f 29 20 26 26 20 64 65 66 69 6e 65 BSD__) && define
8e80: 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a 20 20 7b 20 d(__GNUC__). {
8e90: 72 65 67 69 73 74 65 72 20 75 6e 73 69 67 6e 65 register unsigne
8ea0: 64 20 6c 6f 6e 67 20 5f 62 65 67 20 5f 5f 61 73 d long _beg __as
8eb0: 6d 5f 5f 20 28 22 25 61 31 22 29 20 3d 20 28 75 m__ ("%a1") = (u
8ec0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 66 75 nsigned long) fu
8ed0: 6e 63 74 69 6f 6e 3b 0a 20 20 20 20 72 65 67 69 nction;. regi
8ee0: 73 74 65 72 20 75 6e 73 69 67 6e 65 64 20 6c 6f ster unsigned lo
8ef0: 6e 67 20 5f 6c 65 6e 20 5f 5f 61 73 6d 5f 5f 20 ng _len __asm__
8f00: 28 22 25 64 31 22 29 20 3d 20 54 52 41 4d 50 5f ("%d1") = TRAMP_
8f10: 4c 45 4e 47 54 48 3b 0a 20 20 20 20 5f 5f 61 73 LENGTH;. __as
8f20: 6d 5f 5f 20 5f 5f 76 6f 6c 61 74 69 6c 65 5f 5f m__ __volatile__
8f30: 20 28 0a 20 20 20 20 20 20 22 6d 6f 76 65 25 2e (. "move%.
8f40: 6c 20 25 23 30 78 38 30 30 30 30 30 30 34 2c 25 l %#0x80000004,%
8f50: 2f 64 30 5c 6e 5c 74 22 20 2f 2a 20 43 43 5f 45 /d0\n\t" /* CC_E
8f60: 58 54 50 55 52 47 45 20 7c 20 43 5f 49 50 55 52 XTPURGE | C_IPUR
8f70: 47 45 20 2a 2f 0a 20 20 20 20 20 20 22 74 72 61 GE */. "tra
8f80: 70 20 23 31 32 22 20 20 20 20 20 20 20 20 20 20 p #12"
8f90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6b /* k
8fa0: 65 72 6e 65 6c 20 63 61 6c 6c 20 60 63 61 63 68 ernel call `cach
8fb0: 65 63 74 6c 27 20 2a 2f 0a 20 20 20 20 20 20 3a ectl' */. :
8fc0: 0a 20 20 20 20 20 20 3a 20 22 61 22 20 28 5f 62 . : "a" (_b
8fd0: 65 67 29 2c 20 22 64 22 20 28 5f 6c 65 6e 29 0a eg), "d" (_len).
8fe0: 20 20 20 20 20 20 3a 20 22 25 61 30 22 2c 20 22 : "%a0", "
8ff0: 25 61 31 22 2c 20 22 25 64 30 22 2c 20 22 25 64 %a1", "%d0", "%d
9000: 31 22 20 20 20 20 2f 2a 20 63 61 6c 6c 2d 75 73 1" /* call-us
9010: 65 64 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a ed registers */.
9020: 20 20 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e );. }.#en
9030: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 dif.#if defined(
9040: 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20 64 65 __linux__) && de
9050: 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a fined(__GNUC__).
9060: 20 20 7b 20 72 65 67 69 73 74 65 72 20 75 6e 73 { register uns
9070: 69 67 6e 65 64 20 6c 6f 6e 67 20 5f 62 65 67 20 igned long _beg
9080: 5f 5f 61 73 6d 5f 5f 20 28 22 25 64 31 22 29 20 __asm__ ("%d1")
9090: 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 = (unsigned long
90a0: 29 20 66 75 6e 63 74 69 6f 6e 3b 0a 20 20 20 20 ) function;.
90b0: 72 65 67 69 73 74 65 72 20 75 6e 73 69 67 6e 65 register unsigne
90c0: 64 20 6c 6f 6e 67 20 5f 6c 65 6e 20 5f 5f 61 73 d long _len __as
90d0: 6d 5f 5f 20 28 22 25 64 34 22 29 20 3d 20 54 52 m__ ("%d4") = TR
90e0: 41 4d 50 5f 4c 45 4e 47 54 48 20 2b 20 33 32 3b AMP_LENGTH + 32;
90f0: 0a 20 20 20 20 5f 5f 61 73 6d 5f 5f 20 5f 5f 76 . __asm__ __v
9100: 6f 6c 61 74 69 6c 65 5f 5f 20 28 0a 20 20 20 20 olatile__ (.
9110: 20 20 22 6d 6f 76 65 25 2e 6c 20 25 23 31 32 33 "move%.l %#123
9120: 2c 25 2f 64 30 5c 6e 5c 74 22 0a 20 20 20 20 20 ,%/d0\n\t".
9130: 20 22 6d 6f 76 65 25 2e 6c 20 25 23 31 2c 25 2f "move%.l %#1,%/
9140: 64 32 5c 6e 5c 74 22 0a 20 20 20 20 20 20 22 6d d2\n\t". "m
9150: 6f 76 65 25 2e 6c 20 25 23 33 2c 25 2f 64 33 5c ove%.l %#3,%/d3\
9160: 6e 5c 74 22 0a 20 20 20 20 20 20 22 74 72 61 70 n\t". "trap
9170: 20 25 23 30 22 0a 20 20 20 20 20 20 3a 0a 20 20 %#0". :.
9180: 20 20 20 20 3a 20 22 64 22 20 28 5f 62 65 67 29 : "d" (_beg)
9190: 2c 20 22 64 22 20 28 5f 6c 65 6e 29 0a 20 20 20 , "d" (_len).
91a0: 20 20 20 3a 20 22 25 64 30 22 2c 20 22 25 64 32 : "%d0", "%d2
91b0: 22 2c 20 22 25 64 33 22 0a 20 20 20 20 20 20 29 ", "%d3". )
91c0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 ;. }.#endif.#if
91d0: 20 64 65 66 69 6e 65 64 28 41 55 58 29 20 26 26 defined(AUX) &&
91e0: 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f defined(__GNUC_
91f0: 5f 29 0a 20 20 2f 2a 20 73 79 73 6d 36 38 6b 28 _). /* sysm68k(
9200: 31 30 35 2c 20 61 64 64 72 2c 20 73 63 6f 70 65 105, addr, scope
9210: 2c 20 63 61 63 68 65 2c 20 6c 65 6e 29 20 2a 2f , cache, len) */
9220: 0a 20 20 5f 5f 61 73 6d 5f 5f 20 5f 5f 76 6f 6c . __asm__ __vol
9230: 61 74 69 6c 65 5f 5f 20 28 0a 20 20 20 20 22 6d atile__ (. "m
9240: 6f 76 65 25 2e 6c 20 25 31 2c 25 2f 73 70 40 2d ove%.l %1,%/sp@-
9250: 5c 6e 5c 74 22 0a 20 20 20 20 22 6d 6f 76 65 25 \n\t". "move%
9260: 2e 6c 20 25 23 33 2c 25 2f 73 70 40 2d 5c 6e 5c .l %#3,%/sp@-\n\
9270: 74 22 0a 20 20 20 20 22 6d 6f 76 65 25 2e 6c 20 t". "move%.l
9280: 25 23 31 2c 25 2f 73 70 40 2d 5c 6e 5c 74 22 0a %#1,%/sp@-\n\t".
9290: 20 20 20 20 22 6d 6f 76 65 25 2e 6c 20 25 30 2c "move%.l %0,
92a0: 25 2f 73 70 40 2d 5c 6e 5c 74 22 0a 20 20 20 20 %/sp@-\n\t".
92b0: 22 6d 6f 76 65 25 2e 6c 20 25 23 31 30 35 2c 25 "move%.l %#105,%
92c0: 2f 73 70 40 2d 5c 6e 5c 74 22 0a 20 20 20 20 22 /sp@-\n\t". "
92d0: 6d 6f 76 65 25 2e 6c 20 25 23 30 2c 25 2f 73 70 move%.l %#0,%/sp
92e0: 40 2d 5c 6e 5c 74 22 0a 20 20 20 20 22 6d 6f 76 @-\n\t". "mov
92f0: 65 25 2e 6c 20 25 23 33 38 2c 25 2f 73 70 40 2d e%.l %#38,%/sp@-
9300: 5c 6e 5c 74 22 0a 20 20 20 20 22 74 72 61 70 20 \n\t". "trap
9310: 25 23 30 5c 6e 5c 74 22 0a 20 20 20 20 22 61 64 %#0\n\t". "ad
9320: 64 25 2e 6c 20 25 23 32 34 2c 25 2f 73 70 22 0a d%.l %#24,%/sp".
9330: 20 20 20 20 3a 0a 20 20 20 20 3a 20 22 72 22 20 :. : "r"
9340: 28 66 75 6e 63 74 69 6f 6e 29 2c 20 22 67 22 20 (function), "g"
9350: 28 28 69 6e 74 29 54 52 41 4d 50 5f 4c 45 4e 47 ((int)TRAMP_LENG
9360: 54 48 29 0a 20 20 20 20 3a 20 22 25 64 30 22 0a TH). : "%d0".
9370: 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a 23 65 );.#endif.#e
9380: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 ndif.#if defined
9390: 28 5f 5f 6d 69 70 73 5f 5f 29 20 7c 7c 20 64 65 (__mips__) || de
93a0: 66 69 6e 65 64 28 5f 5f 6d 69 70 73 6e 33 32 5f fined(__mipsn32_
93b0: 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f _) || defined(__
93c0: 6d 69 70 73 36 34 5f 5f 29 0a 20 20 63 61 63 68 mips64__). cach
93d0: 65 66 6c 75 73 68 28 66 75 6e 63 74 69 6f 6e 2c eflush(function,
93e0: 54 52 41 4d 50 5f 4c 45 4e 47 54 48 2c 49 43 41 TRAMP_LENGTH,ICA
93f0: 43 48 45 29 3b 0a 20 20 2f 2a 20 67 66 6f 72 74 CHE);. /* gfort
9400: 68 2d 30 2e 33 2e 30 20 75 73 65 73 20 42 43 41 h-0.3.0 uses BCA
9410: 43 48 45 20 69 6e 73 74 65 61 64 20 6f 66 20 49 CHE instead of I
9420: 43 41 43 48 45 2e 20 57 68 79 3f 3f 20 2a 2f 0a CACHE. Why?? */.
9430: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e #endif.#if defin
9440: 65 64 28 5f 5f 73 70 61 72 63 5f 5f 29 20 7c 7c ed(__sparc__) ||
9450: 20 64 65 66 69 6e 65 64 28 5f 5f 73 70 61 72 63 defined(__sparc
9460: 36 34 5f 5f 29 0a 20 20 2f 2a 20 54 68 69 73 20 64__). /* This
9470: 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 assumes that the
9480: 20 74 72 61 6d 70 6f 6c 69 6e 65 20 66 69 74 73 trampoline fits
9490: 20 69 6e 20 61 74 20 6d 6f 73 74 20 74 77 6f 20 in at most two
94a0: 63 61 63 68 65 20 6c 69 6e 65 73 2e 20 2a 2f 0a cache lines. */.
94b0: 20 20 5f 5f 54 52 5f 63 6c 65 61 72 5f 63 61 63 __TR_clear_cac
94c0: 68 65 5f 32 28 66 75 6e 63 74 69 6f 6e 2c 66 75 he_2(function,fu
94d0: 6e 63 74 69 6f 6e 2b 54 52 41 4d 50 5f 4c 45 4e nction+TRAMP_LEN
94e0: 47 54 48 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 23 GTH-1);.#endif.#
94f0: 69 66 64 65 66 20 5f 5f 61 6c 70 68 61 5f 5f 0a ifdef __alpha__.
9500: 20 20 5f 5f 54 52 5f 63 6c 65 61 72 5f 63 61 63 __TR_clear_cac
9510: 68 65 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 he();.#endif.#if
9520: 64 65 66 20 5f 5f 68 70 70 61 5f 5f 0a 20 20 2f def __hppa__. /
9530: 2a 20 54 68 69 73 20 61 73 73 75 6d 65 73 20 74 * This assumes t
9540: 68 61 74 20 74 68 65 20 74 72 61 6d 70 6f 6c 69 hat the trampoli
9550: 6e 65 20 66 69 74 73 20 69 6e 20 61 74 20 6d 6f ne fits in at mo
9560: 73 74 20 74 77 6f 20 63 61 63 68 65 20 6c 69 6e st two cache lin
9570: 65 73 2e 20 2a 2f 0a 20 20 5f 5f 54 52 5f 63 6c es. */. __TR_cl
9580: 65 61 72 5f 63 61 63 68 65 28 66 75 6e 63 74 69 ear_cache(functi
9590: 6f 6e 2c 66 75 6e 63 74 69 6f 6e 2b 54 52 41 4d on,function+TRAM
95a0: 50 5f 4c 45 4e 47 54 48 2d 31 29 3b 0a 23 65 6e P_LENGTH-1);.#en
95b0: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 61 72 6d dif.#ifdef __arm
95c0: 5f 5f 0a 20 20 2f 2a 20 54 68 69 73 20 43 50 55 __. /* This CPU
95d0: 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 does not have a
95e0: 20 73 65 70 61 72 61 74 65 20 69 6e 73 74 72 75 separate instru
95f0: 63 74 69 6f 6e 20 63 61 63 68 65 2e 20 28 49 20 ction cache. (I
9600: 74 68 69 6e 6b 2e 29 20 2a 2f 0a 23 65 6e 64 69 think.) */.#endi
9610: 66 0a 23 69 66 64 65 66 20 5f 5f 72 73 36 30 30 f.#ifdef __rs600
9620: 30 5f 5f 0a 20 20 5f 5f 54 52 5f 63 6c 65 61 72 0__. __TR_clear
9630: 5f 63 61 63 68 65 28 66 75 6e 63 74 69 6f 6e 29 _cache(function)
9640: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 ;.#endif.#ifdef
9650: 5f 5f 6d 38 38 6b 5f 5f 0a 20 20 73 79 73 6d 6f __m88k__. sysmo
9660: 74 28 53 38 38 43 41 43 48 45 46 4c 55 53 48 50 t(S88CACHEFLUSHP
9670: 41 47 45 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c AGE, (unsigned l
9680: 6f 6e 67 29 66 75 6e 63 74 69 6f 6e 20 26 20 2d ong)function & -
9690: 70 61 67 65 73 69 7a 65 29 3b 0a 23 65 6e 64 69 pagesize);.#endi
96a0: 66 0a 23 69 66 64 65 66 20 5f 5f 63 6f 6e 76 65 f.#ifdef __conve
96b0: 78 5f 5f 0a 20 20 5f 5f 54 52 5f 63 6c 65 61 72 x__. __TR_clear
96c0: 5f 63 61 63 68 65 28 29 3b 0a 23 65 6e 64 69 66 _cache();.#endif
96d0: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 35 2e .#endif.. /* 5.
96e0: 20 52 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 Return. */. re
96f0: 74 75 72 6e 20 28 5f 5f 54 52 5f 66 75 6e 63 74 turn (__TR_funct
9700: 69 6f 6e 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b ion) (function +
9710: 20 54 52 41 4d 50 5f 42 49 41 53 29 3b 0a 7d 0a TRAMP_BIAS);.}.
9720: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 53 .#if defined(__S
9730: 54 44 43 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 TDC__) || define
9740: 64 28 5f 5f 47 4e 55 43 5f 5f 29 20 7c 7c 20 64 d(__GNUC__) || d
9750: 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75 73 70 6c efined(__cpluspl
9760: 75 73 29 0a 76 6f 69 64 20 66 72 65 65 5f 74 72 us).void free_tr
9770: 61 6d 70 6f 6c 69 6e 65 5f 72 20 28 5f 5f 54 52 ampoline_r (__TR
9780: 5f 66 75 6e 63 74 69 6f 6e 20 66 75 6e 63 74 69 _function functi
9790: 6f 6e 29 0a 23 65 6c 73 65 0a 76 6f 69 64 20 66 on).#else.void f
97a0: 72 65 65 5f 74 72 61 6d 70 6f 6c 69 6e 65 5f 72 ree_trampoline_r
97b0: 20 28 66 75 6e 63 74 69 6f 6e 29 0a 20 20 5f 5f (function). __
97c0: 54 52 5f 66 75 6e 63 74 69 6f 6e 20 66 75 6e 63 TR_function func
97d0: 74 69 6f 6e 3b 0a 23 65 6e 64 69 66 0a 7b 0a 23 tion;.#endif.{.#
97e0: 69 66 20 54 52 41 4d 50 5f 42 49 41 53 0a 20 20 if TRAMP_BIAS.
97f0: 66 75 6e 63 74 69 6f 6e 20 3d 20 28 5f 5f 54 52 function = (__TR
9800: 5f 66 75 6e 63 74 69 6f 6e 29 28 28 63 68 61 72 _function)((char
9810: 2a 29 66 75 6e 63 74 69 6f 6e 20 2d 20 54 52 41 *)function - TRA
9820: 4d 50 5f 42 49 41 53 29 3b 0a 23 65 6e 64 69 66 MP_BIAS);.#endif
9830: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 43 4f .#if !defined(CO
9840: 44 45 5f 45 58 45 43 55 54 41 42 4c 45 29 20 26 DE_EXECUTABLE) &
9850: 26 20 21 64 65 66 69 6e 65 64 28 45 58 45 43 55 & !defined(EXECU
9860: 54 41 42 4c 45 5f 56 49 41 5f 4d 50 52 4f 54 45 TABLE_VIA_MPROTE
9870: 43 54 29 0a 20 20 2a 28 63 68 61 72 2a 2a 29 66 CT). *(char**)f
9880: 75 6e 63 74 69 6f 6e 20 3d 20 66 72 65 65 6c 69 unction = freeli
9890: 73 74 3b 20 66 72 65 65 6c 69 73 74 20 3d 20 28 st; freelist = (
98a0: 63 68 61 72 2a 29 66 75 6e 63 74 69 6f 6e 3b 0a char*)function;.
98b0: 20 20 2f 2a 20 49 74 20 69 73 20 70 72 6f 62 61 /* It is proba
98c0: 62 6c 79 20 6e 6f 74 20 77 6f 72 74 68 20 63 61 bly not worth ca
98d0: 6c 6c 69 6e 67 20 6d 75 6e 6d 61 70 28 29 20 66 lling munmap() f
98e0: 6f 72 20 65 6e 74 69 72 65 6c 79 20 66 72 65 65 or entirely free
98f0: 64 20 70 61 67 65 73 2e 20 2a 2f 0a 23 65 6c 73 d pages. */.#els
9900: 65 0a 20 20 66 72 65 65 28 28 28 63 68 61 72 2a e. free(((char*
9910: 2a 29 66 75 6e 63 74 69 6f 6e 29 5b 2d 31 5d 29 *)function)[-1])
9920: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 20 ;.#endif.}..#if
9930: 64 65 66 69 6e 65 64 28 5f 5f 53 54 44 43 5f 5f defined(__STDC__
9940: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 47 ) || defined(__G
9950: 4e 55 43 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 NUC__) || define
9960: 64 28 5f 5f 63 70 6c 75 73 70 6c 75 73 29 0a 69 d(__cplusplus).i
9970: 6e 74 20 69 73 5f 74 72 61 6d 70 6f 6c 69 6e 65 nt is_trampoline
9980: 5f 72 20 28 76 6f 69 64 2a 20 66 75 6e 63 74 69 _r (void* functi
9990: 6f 6e 29 0a 23 65 6c 73 65 0a 69 6e 74 20 69 73 on).#else.int is
99a0: 5f 74 72 61 6d 70 6f 6c 69 6e 65 5f 72 20 28 66 _trampoline_r (f
99b0: 75 6e 63 74 69 6f 6e 29 0a 20 20 76 6f 69 64 2a unction). void*
99c0: 20 66 75 6e 63 74 69 6f 6e 3b 0a 23 65 6e 64 69 function;.#endi
99d0: 66 0a 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 f.{.#if defined(
99e0: 69 73 5f 74 72 61 6d 70 29 20 26 26 20 64 65 66 is_tramp) && def
99f0: 69 6e 65 64 28 74 72 61 6d 70 5f 64 61 74 61 29 ined(tramp_data)
9a00: 0a 23 69 66 64 65 66 20 5f 5f 68 70 70 61 6e 65 .#ifdef __hppane
9a10: 77 5f 5f 0a 20 20 76 6f 69 64 2a 20 74 72 61 6d w__. void* tram
9a20: 70 5f 72 5f 61 64 64 72 65 73 73 20 3d 20 26 74 p_r_address = &t
9a30: 72 61 6d 70 5f 72 3b 0a 20 20 69 66 20 28 21 28 ramp_r;. if (!(
9a40: 28 28 6c 6f 6e 67 29 66 75 6e 63 74 69 6f 6e 20 ((long)function
9a50: 26 20 33 29 20 3d 3d 20 28 54 52 41 4d 50 5f 42 & 3) == (TRAMP_B
9a60: 49 41 53 20 26 20 33 29 29 29 20 72 65 74 75 72 IAS & 3))) retur
9a70: 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 n 0;.#endif. re
9a80: 74 75 72 6e 0a 20 20 20 28 28 69 73 5f 74 72 61 turn. ((is_tra
9a90: 6d 70 28 28 28 63 68 61 72 2a 29 66 75 6e 63 74 mp(((char*)funct
9aa0: 69 6f 6e 20 2d 20 54 52 41 4d 50 5f 42 49 41 53 ion - TRAMP_BIAS
9ab0: 29 29 29 0a 20 20 20 20 26 26 20 28 28 74 72 61 ))). && ((tra
9ac0: 6d 70 5f 64 61 74 61 28 28 28 63 68 61 72 2a 29 mp_data(((char*)
9ad0: 66 75 6e 63 74 69 6f 6e 20 2d 20 54 52 41 4d 50 function - TRAMP
9ae0: 5f 42 49 41 53 29 29 29 20 3d 3d 20 28 6c 6f 6e _BIAS))) == (lon
9af0: 67 29 28 28 63 68 61 72 2a 29 66 75 6e 63 74 69 g)((char*)functi
9b00: 6f 6e 20 2d 20 54 52 41 4d 50 5f 42 49 41 53 20 on - TRAMP_BIAS
9b10: 2b 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 29 29 + TRAMP_LENGTH))
9b20: 0a 20 20 20 20 3f 20 31 20 3a 20 30 0a 20 20 20 . ? 1 : 0.
9b30: 29 3b 0a 23 65 6c 73 65 0a 20 20 61 62 6f 72 74 );.#else. abort
9b40: 28 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 ();.#endif.}..#i
9b50: 66 20 64 65 66 69 6e 65 64 28 5f 5f 53 54 44 43 f defined(__STDC
9b60: 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f __) || defined(_
9b70: 5f 47 4e 55 43 5f 5f 29 20 7c 7c 20 64 65 66 69 _GNUC__) || defi
9b80: 6e 65 64 28 5f 5f 63 70 6c 75 73 70 6c 75 73 29 ned(__cplusplus)
9b90: 0a 5f 5f 54 52 5f 66 75 6e 63 74 69 6f 6e 20 74 .__TR_function t
9ba0: 72 61 6d 70 6f 6c 69 6e 65 5f 72 5f 61 64 64 72 rampoline_r_addr
9bb0: 65 73 73 20 28 76 6f 69 64 2a 20 66 75 6e 63 74 ess (void* funct
9bc0: 69 6f 6e 29 0a 23 65 6c 73 65 0a 5f 5f 54 52 5f ion).#else.__TR_
9bd0: 66 75 6e 63 74 69 6f 6e 20 74 72 61 6d 70 6f 6c function trampol
9be0: 69 6e 65 5f 72 5f 61 64 64 72 65 73 73 20 28 66 ine_r_address (f
9bf0: 75 6e 63 74 69 6f 6e 29 0a 20 20 76 6f 69 64 2a unction). void*
9c00: 20 66 75 6e 63 74 69 6f 6e 3b 0a 23 65 6e 64 69 function;.#endi
9c10: 66 0a 7b 0a 23 69 66 64 65 66 20 74 72 61 6d 70 f.{.#ifdef tramp
9c20: 5f 61 64 64 72 65 73 73 0a 20 20 72 65 74 75 72 _address. retur
9c30: 6e 20 28 5f 5f 54 52 5f 66 75 6e 63 74 69 6f 6e n (__TR_function
9c40: 29 28 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 )(tramp_address(
9c50: 28 28 63 68 61 72 2a 29 66 75 6e 63 74 69 6f 6e ((char*)function
9c60: 20 2d 20 54 52 41 4d 50 5f 42 49 41 53 29 29 29 - TRAMP_BIAS)))
9c70: 3b 0a 23 65 6c 73 65 0a 20 20 61 62 6f 72 74 28 ;.#else. abort(
9c80: 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 );.#endif.}..#if
9c90: 20 64 65 66 69 6e 65 64 28 5f 5f 53 54 44 43 5f defined(__STDC_
9ca0: 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f _) || defined(__
9cb0: 47 4e 55 43 5f 5f 29 20 7c 7c 20 64 65 66 69 6e GNUC__) || defin
9cc0: 65 64 28 5f 5f 63 70 6c 75 73 70 6c 75 73 29 0a ed(__cplusplus).
9cd0: 76 6f 69 64 2a 20 74 72 61 6d 70 6f 6c 69 6e 65 void* trampoline
9ce0: 5f 72 5f 64 61 74 61 30 20 28 76 6f 69 64 2a 20 _r_data0 (void*
9cf0: 66 75 6e 63 74 69 6f 6e 29 0a 23 65 6c 73 65 0a function).#else.
9d00: 76 6f 69 64 2a 20 74 72 61 6d 70 6f 6c 69 6e 65 void* trampoline
9d10: 5f 72 5f 64 61 74 61 30 20 28 66 75 6e 63 74 69 _r_data0 (functi
9d20: 6f 6e 29 0a 20 20 76 6f 69 64 2a 20 66 75 6e 63 on). void* func
9d30: 74 69 6f 6e 3b 0a 23 65 6e 64 69 66 0a 7b 0a 23 tion;.#endif.{.#
9d40: 69 66 64 65 66 20 74 72 61 6d 70 5f 64 61 74 61 ifdef tramp_data
9d50: 0a 20 20 72 65 74 75 72 6e 20 28 28 76 6f 69 64 . return ((void
9d60: 2a 2a 29 28 28 63 68 61 72 2a 29 66 75 6e 63 74 **)((char*)funct
9d70: 69 6f 6e 2d 54 52 41 4d 50 5f 42 49 41 53 2b 54 ion-TRAMP_BIAS+T
9d80: 52 41 4d 50 5f 4c 45 4e 47 54 48 29 29 5b 30 5d RAMP_LENGTH))[0]
9d90: 3b 0a 23 65 6c 73 65 0a 20 20 61 62 6f 72 74 28 ;.#else. abort(
9da0: 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 );.#endif.}..#if
9db0: 20 64 65 66 69 6e 65 64 28 5f 5f 53 54 44 43 5f defined(__STDC_
9dc0: 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f _) || defined(__
9dd0: 47 4e 55 43 5f 5f 29 20 7c 7c 20 64 65 66 69 6e GNUC__) || defin
9de0: 65 64 28 5f 5f 63 70 6c 75 73 70 6c 75 73 29 0a ed(__cplusplus).
9df0: 76 6f 69 64 2a 20 74 72 61 6d 70 6f 6c 69 6e 65 void* trampoline
9e00: 5f 72 5f 64 61 74 61 31 20 28 76 6f 69 64 2a 20 _r_data1 (void*
9e10: 66 75 6e 63 74 69 6f 6e 29 0a 23 65 6c 73 65 0a function).#else.
9e20: 76 6f 69 64 2a 20 74 72 61 6d 70 6f 6c 69 6e 65 void* trampoline
9e30: 5f 72 5f 64 61 74 61 31 20 28 66 75 6e 63 74 69 _r_data1 (functi
9e40: 6f 6e 29 0a 20 20 76 6f 69 64 2a 20 66 75 6e 63 on). void* func
9e50: 74 69 6f 6e 3b 0a 23 65 6e 64 69 66 0a 7b 0a 23 tion;.#endif.{.#
9e60: 69 66 64 65 66 20 74 72 61 6d 70 5f 64 61 74 61 ifdef tramp_data
9e70: 0a 20 20 72 65 74 75 72 6e 20 28 28 76 6f 69 64 . return ((void
9e80: 2a 2a 29 28 28 63 68 61 72 2a 29 66 75 6e 63 74 **)((char*)funct
9e90: 69 6f 6e 2d 54 52 41 4d 50 5f 42 49 41 53 2b 54 ion-TRAMP_BIAS+T
9ea0: 52 41 4d 50 5f 4c 45 4e 47 54 48 29 29 5b 31 5d RAMP_LENGTH))[1]
9eb0: 3b 0a 23 65 6c 73 65 0a 20 20 61 62 6f 72 74 28 ;.#else. abort(
9ec0: 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a );.#endif.}.