Artifact 44289e18964f888d260fad48d6101e40e1cdc62f:


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: 2e 68 22 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  .h"..#if defined
01a0: 28 5f 5f 68 70 70 61 5f 5f 29 0a 23 69 66 20 30  (__hppa__).#if 0
01b0: 0a 23 64 65 66 69 6e 65 20 5f 5f 68 70 70 61 6f  .#define __hppao
01c0: 6c 64 5f 5f 20 20 2f 2a 20 4f 6c 64 20 74 72 61  ld__  /* Old tra
01d0: 6d 70 6f 6c 69 6e 65 2c 20 72 65 61 6c 20 6d 61  mpoline, real ma
01e0: 63 68 69 6e 65 20 63 6f 64 65 2e 20 2a 2f 0a 23  chine code. */.#
01f0: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 5f 5f 68  else.#define __h
0200: 70 70 61 6e 65 77 5f 5f 20 20 2f 2a 20 4e 65 77  ppanew__  /* New
0210: 20 74 72 61 6d 70 6f 6c 69 6e 65 2c 20 6a 75 73   trampoline, jus
0220: 74 20 61 20 63 6c 6f 73 75 72 65 2e 20 2a 2f 0a  t a closure. */.
0230: 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69  #endif.#endif.#i
0240: 66 20 64 65 66 69 6e 65 64 28 5f 5f 72 73 36 30  f defined(__rs60
0250: 30 30 5f 5f 29 0a 23 69 66 20 21 64 65 66 69 6e  00__).#if !defin
0260: 65 64 28 5f 41 49 58 29 0a 23 64 65 66 69 6e 65  ed(_AIX).#define
0270: 20 5f 5f 72 73 36 30 30 30 73 79 73 76 34 5f 5f   __rs6000sysv4__
0280: 20 20 2f 2a 20 53 79 73 56 2e 34 20 41 42 49 2c    /* SysV.4 ABI,
0290: 20 72 65 61 6c 20 6d 61 63 68 69 6e 65 20 63 6f   real machine co
02a0: 64 65 2e 20 2a 2f 0a 23 65 6c 73 65 0a 23 64 65  de. */.#else.#de
02b0: 66 69 6e 65 20 5f 5f 72 73 36 30 30 30 61 69 78  fine __rs6000aix
02c0: 5f 5f 20 20 2f 2a 20 41 49 58 20 41 42 49 2c 20  __  /* AIX ABI, 
02d0: 6a 75 73 74 20 61 20 63 6c 6f 73 75 72 65 2e 20  just a closure. 
02e0: 2a 2f 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66  */.#endif.#endif
02f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 68  .#if defined(__h
0300: 70 70 61 6e 65 77 5f 5f 29 0a 2f 2a 0a 20 2a 20  ppanew__)./*. * 
0310: 41 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74  A function point
0320: 65 72 20 69 73 20 61 20 62 69 61 73 65 64 20 70  er is a biased p
0330: 6f 69 6e 74 65 72 20 74 6f 20 61 20 64 61 74 61  ointer to a data
0340: 20 61 72 65 61 20 77 68 6f 73 65 20 66 69 72 73   area whose firs
0350: 74 20 77 6f 72 64 0a 20 2a 20 63 6f 6e 74 61 69  t word. * contai
0360: 6e 73 20 74 68 65 20 61 63 74 75 61 6c 20 61 64  ns the actual ad
0370: 64 72 65 73 73 20 6f 66 20 74 68 65 20 66 75 6e  dress of the fun
0380: 63 74 69 6f 6e 2e 0a 20 2a 2f 0a 65 78 74 65 72  ction.. */.exter
0390: 6e 20 76 6f 69 64 20 74 72 61 6d 70 20 28 29 3b  n void tramp ();
03a0: 20 2f 2a 20 74 72 61 6d 70 6f 6c 69 6e 65 20 70   /* trampoline p
03b0: 72 6f 74 6f 74 79 70 65 20 2a 2f 0a 2f 2a 20 57  rototype */./* W
03c0: 65 20 64 6f 6e 27 74 20 6e 65 65 64 20 74 6f 20  e don't need to 
03d0: 74 61 6b 65 20 61 6e 79 20 73 70 65 63 69 61 6c  take any special
03e0: 20 6d 65 61 73 75 72 65 73 20 74 6f 20 6d 61 6b   measures to mak
03f0: 65 20 74 68 65 20 63 6f 64 65 20 65 78 65 63 75  e the code execu
0400: 74 61 62 6c 65 0a 20 2a 20 73 69 6e 63 65 20 74  table. * since t
0410: 68 65 20 61 63 74 75 61 6c 20 69 6e 73 74 72 75  he actual instru
0420: 63 74 69 6f 6e 73 20 61 72 65 20 69 6e 20 74 68  ctions are in th
0430: 65 20 74 65 78 74 20 73 65 67 6d 65 6e 74 2e 0a  e text segment..
0440: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 43 4f 44 45   */.#ifndef CODE
0450: 5f 45 58 45 43 55 54 41 42 4c 45 0a 23 64 65 66  _EXECUTABLE.#def
0460: 69 6e 65 20 43 4f 44 45 5f 45 58 45 43 55 54 41  ine CODE_EXECUTA
0470: 42 4c 45 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69  BLE.#endif.#endi
0480: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  f.#if defined(__
0490: 72 73 36 30 30 30 61 69 78 5f 5f 29 20 7c 7c 20  rs6000aix__) || 
04a0: 64 65 66 69 6e 65 64 28 5f 5f 69 61 36 34 5f 5f  defined(__ia64__
04b0: 29 0a 2f 2a 0a 20 2a 20 41 20 66 75 6e 63 74 69  )./*. * A functi
04c0: 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 20 61 20  on pointer is a 
04d0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 64 61 74  pointer to a dat
04e0: 61 20 61 72 65 61 20 77 68 6f 73 65 20 66 69 72  a area whose fir
04f0: 73 74 20 77 6f 72 64 20 63 6f 6e 74 61 69 6e 73  st word contains
0500: 0a 20 2a 20 74 68 65 20 61 63 74 75 61 6c 20 61  . * the actual a
0510: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 66 75  ddress of the fu
0520: 6e 63 74 69 6f 6e 2e 0a 20 2a 2f 0a 65 78 74 65  nction.. */.exte
0530: 72 6e 20 76 6f 69 64 20 28 2a 74 72 61 6d 70 29  rn void (*tramp)
0540: 20 28 29 3b 20 2f 2a 20 74 72 61 6d 70 6f 6c 69   (); /* trampoli
0550: 6e 65 20 70 72 6f 74 6f 74 79 70 65 20 2a 2f 0a  ne prototype */.
0560: 2f 2a 20 57 65 20 64 6f 6e 27 74 20 6e 65 65 64  /* We don't need
0570: 20 74 6f 20 74 61 6b 65 20 61 6e 79 20 73 70 65   to take any spe
0580: 63 69 61 6c 20 6d 65 61 73 75 72 65 73 20 74 6f  cial measures to
0590: 20 6d 61 6b 65 20 74 68 65 20 63 6f 64 65 20 65   make the code e
05a0: 78 65 63 75 74 61 62 6c 65 0a 20 2a 20 73 69 6e  xecutable. * sin
05b0: 63 65 20 74 68 65 20 61 63 74 75 61 6c 20 69 6e  ce the actual in
05c0: 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20 69  structions are i
05d0: 6e 20 74 68 65 20 74 65 78 74 20 73 65 67 6d 65  n the text segme
05e0: 6e 74 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  nt.. */.#ifndef 
05f0: 43 4f 44 45 5f 45 58 45 43 55 54 41 42 4c 45 0a  CODE_EXECUTABLE.
0600: 23 64 65 66 69 6e 65 20 43 4f 44 45 5f 45 58 45  #define CODE_EXE
0610: 43 55 54 41 42 4c 45 0a 23 65 6e 64 69 66 0a 23  CUTABLE.#endif.#
0620: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
0630: 64 28 5f 5f 6d 36 38 6b 5f 5f 29 0a 23 69 66 20  d(__m68k__).#if 
0640: 64 65 66 69 6e 65 64 28 41 4d 49 47 41 29 20 2f  defined(AMIGA) /
0650: 2a 20 41 6d 69 67 61 20 72 75 6e 6e 69 6e 67 20  * Amiga running 
0660: 41 6d 69 67 61 4f 53 2c 20 6e 6f 74 20 4c 69 6e  AmigaOS, not Lin
0670: 75 78 20 2a 2f 0a 23 69 66 6e 64 65 66 20 43 4f  ux */.#ifndef CO
0680: 44 45 5f 45 58 45 43 55 54 41 42 4c 45 20 2f 2a  DE_EXECUTABLE /*
0690: 20 63 6f 6e 66 69 67 75 72 65 20 67 75 65 73 73   configure guess
06a0: 65 73 20 77 72 6f 6e 67 3f 3f 20 2a 2f 0a 23 64  es wrong?? */.#d
06b0: 65 66 69 6e 65 20 43 4f 44 45 5f 45 58 45 43 55  efine CODE_EXECU
06c0: 54 41 42 4c 45 0a 23 65 6e 64 69 66 0a 23 65 6e  TABLE.#endif.#en
06d0: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  dif.#endif..#ifn
06e0: 64 65 66 20 43 4f 44 45 5f 45 58 45 43 55 54 41  def CODE_EXECUTA
06f0: 42 4c 45 0a 2f 2a 20 48 6f 77 20 64 6f 20 77 65  BLE./* How do we
0700: 20 6d 61 6b 65 20 74 68 65 20 74 72 61 6d 70 6f   make the trampo
0710: 6c 69 6e 65 27 73 20 63 6f 64 65 20 65 78 65 63  line's code exec
0720: 75 74 61 62 6c 65 3f 20 2a 2f 0a 23 69 66 20 64  utable? */.#if d
0730: 65 66 69 6e 65 64 28 48 41 56 45 5f 4d 41 43 48  efined(HAVE_MACH
0740: 5f 56 4d 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  _VM) || defined(
0750: 5f 5f 63 6f 6e 76 65 78 5f 5f 29 20 7c 7c 20 64  __convex__) || d
0760: 65 66 69 6e 65 64 28 48 41 56 45 5f 57 4f 52 4b  efined(HAVE_WORK
0770: 49 4e 47 5f 4d 50 52 4f 54 45 43 54 29 20 7c 7c  ING_MPROTECT) ||
0780: 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 53 59   defined(HAVE_SY
0790: 53 5f 4d 38 38 4b 42 43 53 5f 48 29 0a 2f 2a 20  S_M88KBCS_H)./* 
07a0: 6d 70 72 6f 74 65 63 74 28 29 20 5b 6f 72 20 65  mprotect() [or e
07b0: 71 75 69 76 61 6c 65 6e 74 5d 20 74 68 65 20 6d  quivalent] the m
07c0: 61 6c 6c 6f 63 27 65 64 20 61 72 65 61 2e 20 2a  alloc'ed area. *
07d0: 2f 0a 23 64 65 66 69 6e 65 20 45 58 45 43 55 54  /.#define EXECUT
07e0: 41 42 4c 45 5f 56 49 41 5f 4d 50 52 4f 54 45 43  ABLE_VIA_MPROTEC
07f0: 54 0a 23 65 6c 73 65 0a 23 69 66 64 65 66 20 48  T.#else.#ifdef H
0800: 41 56 45 5f 4d 4d 41 50 0a 2f 2a 20 55 73 65 20  AVE_MMAP./* Use 
0810: 61 6e 20 6d 6d 61 70 27 65 64 20 70 61 67 65 2e  an mmap'ed page.
0820: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 45 58 45 43   */.#define EXEC
0830: 55 54 41 42 4c 45 5f 56 49 41 5f 4d 4d 41 50 0a  UTABLE_VIA_MMAP.
0840: 23 69 66 64 65 66 20 48 41 56 45 5f 4d 4d 41 50  #ifdef HAVE_MMAP
0850: 5f 41 4e 4f 4e 59 4d 4f 55 53 0a 2f 2a 20 55 73  _ANONYMOUS./* Us
0860: 65 20 6d 6d 61 70 20 77 69 74 68 20 74 68 65 20  e mmap with the 
0870: 4d 41 50 5f 41 4e 4f 4e 59 4d 4f 55 53 20 6f 72  MAP_ANONYMOUS or
0880: 20 4d 41 50 5f 41 4e 4f 4e 20 66 6c 61 67 2e 20   MAP_ANON flag. 
0890: 2a 2f 0a 23 64 65 66 69 6e 65 20 45 58 45 43 55  */.#define EXECU
08a0: 54 41 42 4c 45 5f 56 49 41 5f 4d 4d 41 50 5f 41  TABLE_VIA_MMAP_A
08b0: 4e 4f 4e 59 4d 4f 55 53 0a 23 65 6c 73 65 0a 2f  NONYMOUS.#else./
08c0: 2a 20 55 73 65 20 6d 6d 61 70 20 6f 6e 20 2f 64  * Use mmap on /d
08d0: 65 76 2f 7a 65 72 6f 2e 20 2a 2f 0a 23 64 65 66  ev/zero. */.#def
08e0: 69 6e 65 20 45 58 45 43 55 54 41 42 4c 45 5f 56  ine EXECUTABLE_V
08f0: 49 41 5f 4d 4d 41 50 5f 44 45 56 5a 45 52 4f 0a  IA_MMAP_DEVZERO.
0900: 23 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 69 66  #endif.#else.#if
0910: 64 65 66 20 48 41 56 45 5f 53 48 4d 0a 2f 2a 20  def HAVE_SHM./* 
0920: 55 73 65 20 61 6e 20 73 68 6d 61 74 27 65 64 20  Use an shmat'ed 
0930: 70 61 67 65 2e 20 2a 2f 0a 23 64 65 66 69 6e 65  page. */.#define
0940: 20 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41 5f   EXECUTABLE_VIA_
0950: 53 48 4d 0a 23 65 6c 73 65 0a 3f 3f 0a 23 65 6e  SHM.#else.??.#en
0960: 64 69 66 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69  dif.#endif.#endi
0970: 66 0a 23 65 6e 64 69 66 0a 0a 23 69 6e 63 6c 75  f.#endif..#inclu
0980: 64 65 20 3c 73 74 64 69 6f 2e 68 3e 20 2f 2a 20  de <stdio.h> /* 
0990: 64 65 63 6c 61 72 65 73 20 66 70 72 69 6e 74 66  declares fprintf
09a0: 28 29 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20  () */..#include 
09b0: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
09c0: 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68  nclude <stdlib.h
09d0: 3e 20 2f 2a 20 64 65 63 6c 61 72 65 73 20 61 62  > /* declares ab
09e0: 6f 72 74 28 29 2c 20 6d 61 6c 6c 6f 63 28 29 2c  ort(), malloc(),
09f0: 20 66 72 65 65 28 29 20 2a 2f 0a 23 69 66 64 65   free() */.#ifde
0a00: 66 20 48 41 56 45 5f 55 4e 49 53 54 44 5f 48 0a  f HAVE_UNISTD_H.
0a10: 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 64  #include <unistd
0a20: 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 44  .h>.#endif../* D
0a30: 65 63 6c 61 72 65 20 67 65 74 70 61 67 65 73 69  eclare getpagesi
0a40: 7a 65 28 29 2e 20 2a 2f 0a 23 69 66 64 65 66 20  ze(). */.#ifdef 
0a50: 48 41 56 45 5f 47 45 54 50 41 47 45 53 49 5a 45  HAVE_GETPAGESIZE
0a60: 0a 23 69 66 64 65 66 20 5f 5f 63 70 6c 75 73 70  .#ifdef __cplusp
0a70: 6c 75 73 0a 65 78 74 65 72 6e 20 22 43 22 20 52  lus.extern "C" R
0a80: 45 54 47 45 54 50 41 47 45 53 49 5a 45 54 59 50  ETGETPAGESIZETYP
0a90: 45 20 67 65 74 70 61 67 65 73 69 7a 65 20 28 76  E getpagesize (v
0aa0: 6f 69 64 29 3b 0a 23 65 6c 69 66 20 64 65 66 69  oid);.#elif defi
0ab0: 6e 65 64 28 5f 5f 53 54 44 43 5f 5f 29 0a 65 78  ned(__STDC__).ex
0ac0: 74 65 72 6e 20 52 45 54 47 45 54 50 41 47 45 53  tern RETGETPAGES
0ad0: 49 5a 45 54 59 50 45 20 67 65 74 70 61 67 65 73  IZETYPE getpages
0ae0: 69 7a 65 20 28 76 6f 69 64 29 3b 0a 23 65 6c 73  ize (void);.#els
0af0: 65 0a 65 78 74 65 72 6e 20 52 45 54 47 45 54 50  e.extern RETGETP
0b00: 41 47 45 53 49 5a 45 54 59 50 45 20 67 65 74 70  AGESIZETYPE getp
0b10: 61 67 65 73 69 7a 65 20 28 29 3b 0a 23 65 6e 64  agesize ();.#end
0b20: 69 66 0a 23 65 6c 73 65 0a 23 69 66 64 65 66 20  if.#else.#ifdef 
0b30: 48 41 56 45 5f 53 59 53 5f 50 41 52 41 4d 5f 48  HAVE_SYS_PARAM_H
0b40: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 70  .#include <sys/p
0b50: 61 72 61 6d 2e 68 3e 0a 23 65 6c 73 65 0a 2f 2a  aram.h>.#else./*
0b60: 20 4e 6f 74 20 55 6e 69 78 2c 20 65 2e 67 2e 20   Not Unix, e.g. 
0b70: 6d 69 6e 67 77 33 32 20 2a 2f 0a 23 64 65 66 69  mingw32 */.#defi
0b80: 6e 65 20 50 41 47 45 53 49 5a 45 20 34 30 39 36  ne PAGESIZE 4096
0b90: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
0ba0: 67 65 74 70 61 67 65 73 69 7a 65 28 29 20 50 41  getpagesize() PA
0bb0: 47 45 53 49 5a 45 0a 23 65 6e 64 69 66 0a 0a 2f  GESIZE.#endif../
0bc0: 2a 20 44 65 63 6c 61 72 65 20 6d 70 72 6f 74 65  * Declare mprote
0bd0: 63 74 28 29 20 6f 72 20 65 71 75 69 76 61 6c 65  ct() or equivale
0be0: 6e 74 2e 20 2a 2f 0a 23 69 66 64 65 66 20 45 58  nt. */.#ifdef EX
0bf0: 45 43 55 54 41 42 4c 45 5f 56 49 41 5f 4d 50 52  ECUTABLE_VIA_MPR
0c00: 4f 54 45 43 54 0a 23 69 66 64 65 66 20 48 41 56  OTECT.#ifdef HAV
0c10: 45 5f 4d 41 43 48 5f 56 4d 0a 23 69 6e 63 6c 75  E_MACH_VM.#inclu
0c20: 64 65 20 3c 73 79 73 2f 72 65 73 6f 75 72 63 65  de <sys/resource
0c30: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6d 61  .h>.#include <ma
0c40: 63 68 2f 6d 61 63 68 5f 69 6e 74 65 72 66 61 63  ch/mach_interfac
0c50: 65 2e 68 3e 0a 23 69 66 64 65 66 20 4e 65 58 54  e.h>.#ifdef NeXT
0c60: 0a 23 69 6e 63 6c 75 64 65 20 3c 6d 61 63 68 2f  .#include <mach/
0c70: 6d 61 63 68 5f 69 6e 69 74 2e 68 3e 0a 23 65 6e  mach_init.h>.#en
0c80: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 6f 73 66  dif.#ifdef __osf
0c90: 5f 5f 0a 23 69 6e 63 6c 75 64 65 20 3c 6d 61 63  __.#include <mac
0ca0: 68 5f 69 6e 69 74 2e 68 3e 0a 23 65 6e 64 69 66  h_init.h>.#endif
0cb0: 0a 23 69 6e 63 6c 75 64 65 20 3c 6d 61 63 68 2f  .#include <mach/
0cc0: 6d 61 63 68 69 6e 65 2f 76 6d 5f 70 61 72 61 6d  machine/vm_param
0cd0: 2e 68 3e 0a 23 65 6c 73 65 0a 23 69 66 64 65 66  .h>.#else.#ifdef
0ce0: 20 48 41 56 45 5f 53 59 53 5f 4d 38 38 4b 42 43   HAVE_SYS_M88KBC
0cf0: 53 5f 48 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  S_H.#include <sy
0d00: 73 2f 6d 38 38 6b 62 63 73 2e 68 3e 0a 23 64 65  s/m88kbcs.h>.#de
0d10: 66 69 6e 65 20 67 65 74 70 61 67 65 73 69 7a 65  fine getpagesize
0d20: 28 29 20 20 34 30 39 36 20 20 2f 2a 20 3f 3f 20  ()  4096  /* ?? 
0d30: 2a 2f 0a 23 65 6c 73 65 0a 23 69 6e 63 6c 75 64  */.#else.#includ
0d40: 65 20 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a  e <sys/types.h>.
0d50: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6d  #include <sys/mm
0d60: 61 6e 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 65 6e  an.h>.#endif.#en
0d70: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 44  dif.#endif../* D
0d80: 65 63 6c 61 72 65 20 6d 6d 61 70 28 29 2e 20 2a  eclare mmap(). *
0d90: 2f 0a 23 69 66 64 65 66 20 45 58 45 43 55 54 41  /.#ifdef EXECUTA
0da0: 42 4c 45 5f 56 49 41 5f 4d 4d 41 50 0a 23 69 6e  BLE_VIA_MMAP.#in
0db0: 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73  clude <sys/types
0dc0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
0dd0: 73 2f 6d 6d 61 6e 2e 68 3e 0a 23 69 66 20 21 64  s/mman.h>.#if !d
0de0: 65 66 69 6e 65 64 28 50 52 4f 54 5f 45 58 45 43  efined(PROT_EXEC
0df0: 29 20 26 26 20 64 65 66 69 6e 65 64 28 50 52 4f  ) && defined(PRO
0e00: 54 5f 45 58 45 43 55 54 45 29 20 2f 2a 20 49 72  T_EXECUTE) /* Ir
0e10: 69 78 20 34 2e 30 2e 35 20 6e 65 65 64 73 20 74  ix 4.0.5 needs t
0e20: 68 69 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  his */.#define P
0e30: 52 4f 54 5f 45 58 45 43 20 50 52 4f 54 5f 45 58  ROT_EXEC PROT_EX
0e40: 45 43 55 54 45 0a 23 65 6e 64 69 66 0a 23 65 6e  ECUTE.#endif.#en
0e50: 64 69 66 0a 0a 2f 2a 20 44 65 63 6c 61 72 65 20  dif../* Declare 
0e60: 6f 70 65 6e 28 29 2e 20 2a 2f 0a 23 69 66 64 65  open(). */.#ifde
0e70: 66 20 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41  f EXECUTABLE_VIA
0e80: 5f 4d 4d 41 50 5f 44 45 56 5a 45 52 4f 0a 23 69  _MMAP_DEVZERO.#i
0e90: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65  nclude <sys/type
0ea0: 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75  s.h>.#include <u
0eb0: 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64  nistd.h>.#includ
0ec0: 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23 69 66 64  e <fcntl.h>.#ifd
0ed0: 65 66 20 4f 50 45 4e 5f 4e 45 45 44 53 5f 53 59  ef OPEN_NEEDS_SY
0ee0: 53 5f 46 49 4c 45 5f 48 0a 23 69 6e 63 6c 75 64  S_FILE_H.#includ
0ef0: 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68 3e 0a 23  e <sys/file.h>.#
0f00: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
0f10: 20 44 65 63 6c 61 72 65 20 73 68 6d 67 65 74 28   Declare shmget(
0f20: 29 2c 20 73 68 6d 61 74 28 29 2c 20 73 68 6d 63  ), shmat(), shmc
0f30: 74 6c 28 29 2e 20 2a 2f 0a 23 69 66 64 65 66 20  tl(). */.#ifdef 
0f40: 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41 5f 53  EXECUTABLE_VIA_S
0f50: 48 4d 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  HM.#include <sys
0f60: 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75  /types.h>.#inclu
0f70: 64 65 20 3c 73 79 73 2f 69 70 63 2e 68 3e 0a 23  de <sys/ipc.h>.#
0f80: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 68 6d  include <sys/shm
0f90: 2e 68 3e 0a 23 69 66 64 65 66 20 48 41 56 45 5f  .h>.#ifdef HAVE_
0fa0: 53 59 53 5f 53 59 53 4d 41 43 52 4f 53 5f 48 0a  SYS_SYSMACROS_H.
0fb0: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 79  #include <sys/sy
0fc0: 73 6d 61 63 72 6f 73 2e 68 3e 0a 23 65 6e 64 69  smacros.h>.#endi
0fd0: 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 53 75 70  f.#endif../* Sup
0fe0: 70 6f 72 74 20 66 6f 72 20 69 6e 73 74 72 75 63  port for instruc
0ff0: 74 69 6f 6e 20 63 61 63 68 65 20 66 6c 75 73 68  tion cache flush
1000: 2e 20 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 69 33  . */.#ifdef __i3
1010: 38 36 5f 5f 0a 23 69 66 20 64 65 66 69 6e 65 64  86__.#if defined
1020: 28 5f 57 49 4e 33 32 29 20 2f 2a 20 57 69 6e 64  (_WIN32) /* Wind
1030: 6f 77 73 4e 54 20 6f 72 20 57 69 6e 64 6f 77 73  owsNT or Windows
1040: 39 35 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49  95 */.#define WI
1050: 4e 33 32 5f 4c 45 41 4e 5f 41 4e 44 5f 4d 45 41  N32_LEAN_AND_MEA
1060: 4e 0a 23 64 65 66 69 6e 65 20 57 49 4e 33 32 5f  N.#define WIN32_
1070: 45 58 54 52 41 5f 4c 45 41 4e 0a 23 69 6e 63 6c  EXTRA_LEAN.#incl
1080: 75 64 65 20 3c 77 69 6e 64 6f 77 73 2e 68 3e 0a  ude <windows.h>.
1090: 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69  #endif.#endif.#i
10a0: 66 64 65 66 20 5f 5f 6d 36 38 6b 5f 5f 0a 23 69  fdef __m68k__.#i
10b0: 66 20 64 65 66 69 6e 65 64 28 41 4d 49 47 41 29  f defined(AMIGA)
10c0: 20 2f 2a 20 41 6d 69 67 61 20 72 75 6e 6e 69 6e   /* Amiga runnin
10d0: 67 20 41 6d 69 67 61 4f 53 2c 20 6e 6f 74 20 4c  g AmigaOS, not L
10e0: 69 6e 75 78 20 2a 2f 0a 23 69 6e 63 6c 75 64 65  inux */.#include
10f0: 20 3c 65 78 65 63 2f 74 79 70 65 73 2e 68 3e 0a   <exec/types.h>.
1100: 23 69 6e 63 6c 75 64 65 20 3c 65 78 65 63 2f 65  #include <exec/e
1110: 78 65 63 62 61 73 65 2e 68 3e 0a 23 69 6e 63 6c  xecbase.h>.#incl
1120: 75 64 65 20 3c 70 72 6f 74 6f 2f 65 78 65 63 2e  ude <proto/exec.
1130: 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  h>.#endif.#ifdef
1140: 20 68 70 75 78 0a 23 69 6e 63 6c 75 64 65 20 3c   hpux.#include <
1150: 73 79 73 2f 63 61 63 68 65 2e 68 3e 0a 23 65 6e  sys/cache.h>.#en
1160: 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  dif.#endif.#if d
1170: 65 66 69 6e 65 64 28 5f 5f 6d 69 70 73 5f 5f 29  efined(__mips__)
1180: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 6d 69   || defined(__mi
1190: 70 73 6e 33 32 5f 5f 29 20 7c 7c 20 64 65 66 69  psn32__) || defi
11a0: 6e 65 64 28 5f 5f 6d 69 70 73 36 34 5f 5f 29 0a  ned(__mips64__).
11b0: 23 69 66 64 65 66 20 75 6c 74 72 69 78 0a 23 69  #ifdef ultrix.#i
11c0: 6e 63 6c 75 64 65 20 3c 6d 69 70 73 2f 63 61 63  nclude <mips/cac
11d0: 68 65 63 74 6c 2e 68 3e 0a 23 65 6c 73 65 0a 23  hectl.h>.#else.#
11e0: 69 66 64 65 66 20 6c 69 6e 75 78 0a 23 69 6e 63  ifdef linux.#inc
11f0: 6c 75 64 65 20 3c 61 73 6d 2f 63 61 63 68 65 63  lude <asm/cachec
1200: 74 6c 2e 68 3e 0a 23 65 6c 73 65 0a 23 69 66 64  tl.h>.#else.#ifd
1210: 65 66 20 48 41 56 45 5f 53 59 53 5f 43 41 43 48  ef HAVE_SYS_CACH
1220: 45 43 54 4c 5f 48 0a 23 69 6e 63 6c 75 64 65 20  ECTL_H.#include 
1230: 3c 73 79 73 2f 63 61 63 68 65 63 74 6c 2e 68 3e  <sys/cachectl.h>
1240: 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23  .#endif.#endif.#
1250: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66  endif.#endif.#if
1260: 64 65 66 20 5f 5f 6d 38 38 6b 5f 5f 0a 23 69 6e  def __m88k__.#in
1270: 63 6c 75 64 65 20 3c 73 79 73 2f 73 79 73 6c 6f  clude <sys/syslo
1280: 63 61 6c 2e 68 3e 0a 23 65 6e 64 69 66 0a 2f 2a  cal.h>.#endif./*
1290: 20 49 6e 6c 69 6e 65 20 61 73 73 65 6d 62 6c 79   Inline assembly
12a0: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 69 6e   function for in
12b0: 73 74 72 75 63 74 69 6f 6e 20 63 61 63 68 65 20  struction cache 
12c0: 66 6c 75 73 68 2e 20 2a 2f 0a 23 69 66 20 64 65  flush. */.#if de
12d0: 66 69 6e 65 64 28 5f 5f 73 70 61 72 63 5f 5f 29  fined(__sparc__)
12e0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 73 70   || defined(__sp
12f0: 61 72 63 36 34 5f 5f 29 20 7c 7c 20 64 65 66 69  arc64__) || defi
1300: 6e 65 64 28 5f 5f 61 6c 70 68 61 5f 5f 29 20 7c  ned(__alpha__) |
1310: 7c 20 64 65 66 69 6e 65 64 28 5f 5f 68 70 70 61  | defined(__hppa
1320: 6f 6c 64 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65  old__) || define
1330: 64 28 5f 5f 72 73 36 30 30 30 73 79 73 76 34 5f  d(__rs6000sysv4_
1340: 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f  _) || defined(__
1350: 63 6f 6e 76 65 78 5f 5f 29 0a 23 69 66 64 65 66  convex__).#ifdef
1360: 20 5f 5f 47 4e 55 43 5f 5f 0a 65 78 74 65 72 6e   __GNUC__.extern
1370: 20 69 6e 6c 69 6e 65 0a 23 69 66 20 64 65 66 69   inline.#if defi
1380: 6e 65 64 28 5f 5f 73 70 61 72 63 5f 5f 29 20 7c  ned(__sparc__) |
1390: 7c 20 64 65 66 69 6e 65 64 28 5f 5f 73 70 61 72  | defined(__spar
13a0: 63 36 34 5f 5f 29 0a 23 69 6e 63 6c 75 64 65 20  c64__).#include 
13b0: 22 63 61 63 68 65 2d 73 70 61 72 63 2e 63 22 0a  "cache-sparc.c".
13c0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f  #endif.#ifdef __
13d0: 61 6c 70 68 61 5f 5f 0a 23 69 6e 63 6c 75 64 65  alpha__.#include
13e0: 20 22 63 61 63 68 65 2d 61 6c 70 68 61 2e 63 22   "cache-alpha.c"
13f0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f  .#endif.#ifdef _
1400: 5f 68 70 70 61 5f 5f 0a 23 69 6e 63 6c 75 64 65  _hppa__.#include
1410: 20 22 63 61 63 68 65 2d 68 70 70 61 2e 63 22 0a   "cache-hppa.c".
1420: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f  #endif.#ifdef __
1430: 72 73 36 30 30 30 5f 5f 0a 23 69 6e 63 6c 75 64  rs6000__.#includ
1440: 65 20 22 63 61 63 68 65 2d 72 73 36 30 30 30 2e  e "cache-rs6000.
1450: 63 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  c".#endif.#ifdef
1460: 20 5f 5f 63 6f 6e 76 65 78 5f 5f 0a 23 69 6e 63   __convex__.#inc
1470: 6c 75 64 65 20 22 63 61 63 68 65 2d 63 6f 6e 76  lude "cache-conv
1480: 65 78 2e 63 22 0a 23 65 6e 64 69 66 0a 23 65 6c  ex.c".#endif.#el
1490: 73 65 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  se.#if defined(_
14a0: 5f 73 70 61 72 63 5f 5f 29 20 7c 7c 20 64 65 66  _sparc__) || def
14b0: 69 6e 65 64 28 5f 5f 73 70 61 72 63 36 34 5f 5f  ined(__sparc64__
14c0: 29 0a 65 78 74 65 72 6e 20 76 6f 69 64 20 5f 5f  ).extern void __
14d0: 54 52 5f 63 6c 65 61 72 5f 63 61 63 68 65 5f 34  TR_clear_cache_4
14e0: 28 29 3b 0a 23 65 6c 73 65 0a 65 78 74 65 72 6e  ();.#else.extern
14f0: 20 76 6f 69 64 20 5f 5f 54 52 5f 63 6c 65 61 72   void __TR_clear
1500: 5f 63 61 63 68 65 28 29 3b 0a 23 65 6e 64 69 66  _cache();.#endif
1510: 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a  .#endif.#endif..
1520: 2f 2a 20 4c 65 6e 67 74 68 20 61 6e 64 20 61 6c  /* Length and al
1530: 69 67 6e 6d 65 6e 74 20 6f 66 20 74 72 61 6d 70  ignment of tramp
1540: 6f 6c 69 6e 65 20 2a 2f 0a 23 69 66 64 65 66 20  oline */.#ifdef 
1550: 5f 5f 69 33 38 36 5f 5f 0a 23 64 65 66 69 6e 65  __i386__.#define
1560: 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 31 35   TRAMP_LENGTH 15
1570: 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 41  .#define TRAMP_A
1580: 4c 49 47 4e 20 31 36 20 20 2f 2a 20 34 20 66 6f  LIGN 16  /* 4 fo
1590: 72 20 61 20 69 33 38 36 2c 20 31 36 20 66 6f 72  r a i386, 16 for
15a0: 20 61 20 69 34 38 36 20 2a 2f 0a 23 65 6e 64 69   a i486 */.#endi
15b0: 66 0a 23 69 66 64 65 66 20 5f 5f 6d 36 38 6b 5f  f.#ifdef __m68k_
15c0: 5f 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f  _.#define TRAMP_
15d0: 4c 45 4e 47 54 48 20 31 38 0a 23 64 65 66 69 6e  LENGTH 18.#defin
15e0: 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20 31 36  e TRAMP_ALIGN 16
15f0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
1600: 6e 65 64 28 5f 5f 6d 69 70 73 5f 5f 29 20 26 26  ned(__mips__) &&
1610: 20 21 64 65 66 69 6e 65 64 28 5f 5f 6d 69 70 73   !defined(__mips
1620: 6e 33 32 5f 5f 29 0a 23 64 65 66 69 6e 65 20 54  n32__).#define T
1630: 52 41 4d 50 5f 4c 45 4e 47 54 48 20 33 32 0a 23  RAMP_LENGTH 32.#
1640: 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49  define TRAMP_ALI
1650: 47 4e 20 34 0a 23 65 6e 64 69 66 0a 23 69 66 64  GN 4.#endif.#ifd
1660: 65 66 20 5f 5f 6d 69 70 73 6e 33 32 5f 5f 0a 23  ef __mipsn32__.#
1670: 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e  define TRAMP_LEN
1680: 47 54 48 20 33 36 0a 23 64 65 66 69 6e 65 20 54  GTH 36.#define T
1690: 52 41 4d 50 5f 41 4c 49 47 4e 20 34 0a 23 65 6e  RAMP_ALIGN 4.#en
16a0: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d 69 70  dif.#ifdef __mip
16b0: 73 36 34 6f 6c 64 5f 5f 0a 23 64 65 66 69 6e 65  s64old__.#define
16c0: 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 38 34   TRAMP_LENGTH 84
16d0: 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 41  .#define TRAMP_A
16e0: 4c 49 47 4e 20 34 0a 23 65 6e 64 69 66 0a 23 69  LIGN 4.#endif.#i
16f0: 66 64 65 66 20 5f 5f 6d 69 70 73 36 34 5f 5f 0a  fdef __mips64__.
1700: 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45  #define TRAMP_LE
1710: 4e 47 54 48 20 34 38 0a 23 64 65 66 69 6e 65 20  NGTH 48.#define 
1720: 54 52 41 4d 50 5f 41 4c 49 47 4e 20 38 0a 23 65  TRAMP_ALIGN 8.#e
1730: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
1740: 28 5f 5f 73 70 61 72 63 5f 5f 29 20 26 26 20 21  (__sparc__) && !
1750: 64 65 66 69 6e 65 64 28 5f 5f 73 70 61 72 63 36  defined(__sparc6
1760: 34 5f 5f 29 0a 23 64 65 66 69 6e 65 20 54 52 41  4__).#define TRA
1770: 4d 50 5f 4c 45 4e 47 54 48 20 32 38 0a 23 64 65  MP_LENGTH 28.#de
1780: 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e  fine TRAMP_ALIGN
1790: 20 31 36 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   16.#endif.#ifde
17a0: 66 20 5f 5f 73 70 61 72 63 36 34 5f 5f 0a 23 64  f __sparc64__.#d
17b0: 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47  efine TRAMP_LENG
17c0: 54 48 20 34 38 0a 23 64 65 66 69 6e 65 20 54 52  TH 48.#define TR
17d0: 41 4d 50 5f 41 4c 49 47 4e 20 31 36 0a 23 65 6e  AMP_ALIGN 16.#en
17e0: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 61 6c 70  dif.#ifdef __alp
17f0: 68 61 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52 41  ha__.#define TRA
1800: 4d 50 5f 4c 45 4e 47 54 48 20 34 38 0a 23 64 65  MP_LENGTH 48.#de
1810: 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e  fine TRAMP_ALIGN
1820: 20 38 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66   8.#endif.#ifdef
1830: 20 5f 5f 68 70 70 61 6f 6c 64 5f 5f 0a 23 64 65   __hppaold__.#de
1840: 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47 54  fine TRAMP_LENGT
1850: 48 20 35 36 0a 23 64 65 66 69 6e 65 20 54 52 41  H 56.#define TRA
1860: 4d 50 5f 41 4c 49 47 4e 20 31 36 0a 23 65 6e 64  MP_ALIGN 16.#end
1870: 69 66 0a 23 69 66 64 65 66 20 5f 5f 68 70 70 61  if.#ifdef __hppa
1880: 6e 65 77 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52  new__.#define TR
1890: 41 4d 50 5f 4c 45 4e 47 54 48 20 32 30 0a 23 64  AMP_LENGTH 20.#d
18a0: 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47  efine TRAMP_ALIG
18b0: 4e 20 31 36 0a 23 64 65 66 69 6e 65 20 54 52 41  N 16.#define TRA
18c0: 4d 50 5f 42 49 41 53 20 32 0a 23 65 6e 64 69 66  MP_BIAS 2.#endif
18d0: 0a 23 69 66 64 65 66 20 5f 5f 61 72 6d 5f 5f 0a  .#ifdef __arm__.
18e0: 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45  #define TRAMP_LE
18f0: 4e 47 54 48 20 34 34 0a 23 64 65 66 69 6e 65 20  NGTH 44.#define 
1900: 54 52 41 4d 50 5f 41 4c 49 47 4e 20 34 0a 23 65  TRAMP_ALIGN 4.#e
1910: 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 72 73  ndif.#ifdef __rs
1920: 36 30 30 30 73 79 73 76 34 5f 5f 0a 23 64 65 66  6000sysv4__.#def
1930: 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48  ine TRAMP_LENGTH
1940: 20 33 36 0a 23 64 65 66 69 6e 65 20 54 52 41 4d   36.#define TRAM
1950: 50 5f 41 4c 49 47 4e 20 34 0a 23 65 6e 64 69 66  P_ALIGN 4.#endif
1960: 0a 23 69 66 64 65 66 20 5f 5f 72 73 36 30 30 30  .#ifdef __rs6000
1970: 61 69 78 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52  aix__.#define TR
1980: 41 4d 50 5f 4c 45 4e 47 54 48 20 32 34 0a 23 64  AMP_LENGTH 24.#d
1990: 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47  efine TRAMP_ALIG
19a0: 4e 20 34 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  N 4.#endif.#ifde
19b0: 66 20 5f 5f 6d 38 38 6b 5f 5f 0a 23 64 65 66 69  f __m88k__.#defi
19c0: 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20  ne TRAMP_LENGTH 
19d0: 33 32 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50  32.#define TRAMP
19e0: 5f 41 4c 49 47 4e 20 38 0a 23 65 6e 64 69 66 0a  _ALIGN 8.#endif.
19f0: 23 69 66 64 65 66 20 5f 5f 63 6f 6e 76 65 78 5f  #ifdef __convex_
1a00: 5f 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f  _.#define TRAMP_
1a10: 4c 45 4e 47 54 48 20 32 30 0a 23 64 65 66 69 6e  LENGTH 20.#defin
1a20: 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20 34 0a  e TRAMP_ALIGN 4.
1a30: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f  #endif.#ifdef __
1a40: 69 61 36 34 5f 5f 0a 23 64 65 66 69 6e 65 20 54  ia64__.#define T
1a50: 52 41 4d 50 5f 4c 45 4e 47 54 48 20 34 30 0a 23  RAMP_LENGTH 40.#
1a60: 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49  define TRAMP_ALI
1a70: 47 4e 20 31 36 0a 23 65 6e 64 69 66 0a 23 69 66  GN 16.#endif.#if
1a80: 64 65 66 20 5f 5f 78 38 36 5f 36 34 5f 5f 0a 23  def __x86_64__.#
1a90: 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e  define TRAMP_LEN
1aa0: 47 54 48 20 33 32 0a 23 64 65 66 69 6e 65 20 54  GTH 32.#define T
1ab0: 52 41 4d 50 5f 41 4c 49 47 4e 20 31 36 0a 23 65  RAMP_ALIGN 16.#e
1ac0: 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 73 33  ndif.#ifdef __s3
1ad0: 39 30 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52 41  90__.#define TRA
1ae0: 4d 50 5f 4c 45 4e 47 54 48 20 33 36 0a 23 64 65  MP_LENGTH 36.#de
1af0: 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e  fine TRAMP_ALIGN
1b00: 20 32 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64   2.#endif..#ifnd
1b10: 65 66 20 54 52 41 4d 50 5f 42 49 41 53 0a 23 64  ef TRAMP_BIAS.#d
1b20: 65 66 69 6e 65 20 54 52 41 4d 50 5f 42 49 41 53  efine TRAMP_BIAS
1b30: 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21   0.#endif..#if !
1b40: 64 65 66 69 6e 65 64 28 43 4f 44 45 5f 45 58 45  defined(CODE_EXE
1b50: 43 55 54 41 42 4c 45 29 20 26 26 20 21 64 65 66  CUTABLE) && !def
1b60: 69 6e 65 64 28 45 58 45 43 55 54 41 42 4c 45 5f  ined(EXECUTABLE_
1b70: 56 49 41 5f 4d 50 52 4f 54 45 43 54 29 0a 2f 2a  VIA_MPROTECT)./*
1b80: 20 41 49 58 20 64 6f 65 73 6e 27 74 20 73 75 70   AIX doesn't sup
1b90: 70 6f 72 74 20 6d 70 72 6f 74 65 63 74 28 29 20  port mprotect() 
1ba0: 69 6e 20 6d 61 6c 6c 6f 63 27 65 64 20 6d 65 6d  in malloc'ed mem
1bb0: 6f 72 79 2e 20 4d 75 73 74 20 67 65 74 20 70 61  ory. Must get pa
1bc0: 67 65 73 20 6f 66 0a 20 2a 20 6d 65 6d 6f 72 79  ges of. * memory
1bd0: 20 77 69 74 68 20 65 78 65 63 75 74 65 20 70 65   with execute pe
1be0: 72 6d 69 73 73 69 6f 6e 20 76 69 61 20 6d 6d 61  rmission via mma
1bf0: 70 28 29 2e 20 54 68 65 6e 20 6b 65 65 70 20 61  p(). Then keep a
1c00: 20 66 72 65 65 20 6c 69 73 74 20 6f 66 0a 20 2a   free list of. *
1c10: 20 66 72 65 65 20 74 72 61 6d 70 6f 6c 69 6e 65   free trampoline
1c20: 73 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 68  s.. */.static ch
1c30: 61 72 2a 20 66 72 65 65 6c 69 73 74 20 3d 20 4e  ar* freelist = N
1c40: 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ULL;.#endif..#if
1c50: 20 64 65 66 69 6e 65 64 28 5f 5f 53 54 44 43 5f   defined(__STDC_
1c60: 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f  _) || defined(__
1c70: 47 4e 55 43 5f 5f 29 20 7c 7c 20 64 65 66 69 6e  GNUC__) || defin
1c80: 65 64 28 5f 5f 63 70 6c 75 73 70 6c 75 73 29 0a  ed(__cplusplus).
1c90: 5f 5f 54 52 5f 66 75 6e 63 74 69 6f 6e 20 61 6c  __TR_function al
1ca0: 6c 6f 63 5f 74 72 61 6d 70 6f 6c 69 6e 65 20 28  loc_trampoline (
1cb0: 5f 5f 54 52 5f 66 75 6e 63 74 69 6f 6e 20 61 64  __TR_function ad
1cc0: 64 72 65 73 73 2c 20 76 6f 69 64 2a 20 76 61 72  dress, void* var
1cd0: 69 61 62 6c 65 2c 20 76 6f 69 64 2a 20 64 61 74  iable, void* dat
1ce0: 61 29 0a 23 65 6c 73 65 0a 5f 5f 54 52 5f 66 75  a).#else.__TR_fu
1cf0: 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 5f 74 72 61  nction alloc_tra
1d00: 6d 70 6f 6c 69 6e 65 20 28 61 64 64 72 65 73 73  mpoline (address
1d10: 2c 20 76 61 72 69 61 62 6c 65 2c 20 64 61 74 61  , variable, data
1d20: 29 0a 20 20 5f 5f 54 52 5f 66 75 6e 63 74 69 6f  ).  __TR_functio
1d30: 6e 20 61 64 64 72 65 73 73 3b 0a 20 20 76 6f 69  n address;.  voi
1d40: 64 2a 20 76 61 72 69 61 62 6c 65 3b 0a 20 20 76  d* variable;.  v
1d50: 6f 69 64 2a 20 64 61 74 61 3b 0a 23 65 6e 64 69  oid* data;.#endi
1d60: 66 0a 7b 0a 20 20 63 68 61 72 2a 20 66 75 6e 63  f.{.  char* func
1d70: 74 69 6f 6e 3b 0a 0a 23 69 66 20 21 64 65 66 69  tion;..#if !defi
1d80: 6e 65 64 28 43 4f 44 45 5f 45 58 45 43 55 54 41  ned(CODE_EXECUTA
1d90: 42 4c 45 29 0a 20 20 73 74 61 74 69 63 20 6c 6f  BLE).  static lo
1da0: 6e 67 20 70 61 67 65 73 69 7a 65 20 3d 20 30 3b  ng pagesize = 0;
1db0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 45 58 45  .#if defined(EXE
1dc0: 43 55 54 41 42 4c 45 5f 56 49 41 5f 4d 4d 41 50  CUTABLE_VIA_MMAP
1dd0: 5f 44 45 56 5a 45 52 4f 29 0a 20 20 73 74 61 74  _DEVZERO).  stat
1de0: 69 63 20 69 6e 74 20 7a 65 72 6f 5f 66 64 3b 0a  ic int zero_fd;.
1df0: 23 65 6e 64 69 66 0a 20 20 2f 2a 20 46 69 72 73  #endif.  /* Firs
1e00: 74 2c 20 67 65 74 20 74 68 65 20 70 61 67 65 20  t, get the page 
1e10: 73 69 7a 65 20 6f 6e 63 65 20 61 6e 64 20 66 6f  size once and fo
1e20: 72 20 61 6c 6c 2e 20 2a 2f 0a 20 20 69 66 20 28  r all. */.  if (
1e30: 21 70 61 67 65 73 69 7a 65 29 0a 20 20 20 20 7b  !pagesize).    {
1e40: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56  .#if defined(HAV
1e50: 45 5f 4d 41 43 48 5f 56 4d 29 0a 20 20 20 20 20  E_MACH_VM).     
1e60: 20 70 61 67 65 73 69 7a 65 20 3d 20 76 6d 5f 70   pagesize = vm_p
1e70: 61 67 65 5f 73 69 7a 65 3b 0a 23 65 6c 73 65 0a  age_size;.#else.
1e80: 20 20 20 20 20 20 70 61 67 65 73 69 7a 65 20 3d        pagesize =
1e90: 20 67 65 74 70 61 67 65 73 69 7a 65 28 29 3b 0a   getpagesize();.
1ea0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
1eb0: 65 64 28 45 58 45 43 55 54 41 42 4c 45 5f 56 49  ed(EXECUTABLE_VI
1ec0: 41 5f 4d 4d 41 50 5f 44 45 56 5a 45 52 4f 29 0a  A_MMAP_DEVZERO).
1ed0: 20 20 20 20 20 20 7a 65 72 6f 5f 66 64 20 3d 20        zero_fd = 
1ee0: 6f 70 65 6e 28 22 2f 64 65 76 2f 7a 65 72 6f 22  open("/dev/zero"
1ef0: 2c 4f 5f 52 44 4f 4e 4c 59 2c 30 36 34 34 29 3b  ,O_RDONLY,0644);
1f00: 0a 20 20 20 20 20 20 69 66 20 28 7a 65 72 6f 5f  .      if (zero_
1f10: 66 64 20 3c 20 30 29 0a 20 20 20 20 20 20 20 20  fd < 0).        
1f20: 7b 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72  { fprintf(stderr
1f30: 2c 22 74 72 61 6d 70 6f 6c 69 6e 65 3a 20 43 61  ,"trampoline: Ca
1f40: 6e 6e 6f 74 20 6f 70 65 6e 20 2f 64 65 76 2f 7a  nnot open /dev/z
1f50: 65 72 6f 21 5c 6e 22 29 3b 20 61 62 6f 72 74 28  ero!\n"); abort(
1f60: 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20  ); }.#endif.    
1f70: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 31  }.#endif..  /* 1
1f80: 2e 20 41 6c 6c 6f 63 61 74 65 20 72 6f 6f 6d 20  . Allocate room 
1f90: 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
1fa0: 28 43 4f 44 45 5f 45 58 45 43 55 54 41 42 4c 45  (CODE_EXECUTABLE
1fb0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 45 58  ) && !defined(EX
1fc0: 45 43 55 54 41 42 4c 45 5f 56 49 41 5f 4d 50 52  ECUTABLE_VIA_MPR
1fd0: 4f 54 45 43 54 29 0a 20 20 69 66 20 28 66 72 65  OTECT).  if (fre
1fe0: 65 6c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 0a 20  elist == NULL). 
1ff0: 20 20 20 7b 20 2f 2a 20 47 65 74 20 61 20 6e 65     { /* Get a ne
2000: 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  w page. */.     
2010: 20 63 68 61 72 2a 20 70 61 67 65 3b 0a 23 69 66   char* page;.#if
2020: 64 65 66 20 45 58 45 43 55 54 41 42 4c 45 5f 56  def EXECUTABLE_V
2030: 49 41 5f 4d 4d 41 50 5f 41 4e 4f 4e 59 4d 4f 55  IA_MMAP_ANONYMOU
2040: 53 0a 20 20 20 20 20 20 70 61 67 65 20 3d 20 6d  S.      page = m
2050: 6d 61 70 28 30 2c 20 70 61 67 65 73 69 7a 65 2c  map(0, pagesize,
2060: 20 50 52 4f 54 5f 52 45 41 44 20 7c 20 50 52 4f   PROT_READ | PRO
2070: 54 5f 57 52 49 54 45 20 7c 20 50 52 4f 54 5f 45  T_WRITE | PROT_E
2080: 58 45 43 2c 20 4d 41 50 5f 41 4e 4f 4e 59 4d 4f  XEC, MAP_ANONYMO
2090: 55 53 20 7c 20 4d 41 50 5f 56 41 52 49 41 42 4c  US | MAP_VARIABL
20a0: 45 2c 20 2d 31 2c 20 30 29 3b 0a 23 65 6e 64 69  E, -1, 0);.#endi
20b0: 66 0a 23 69 66 64 65 66 20 45 58 45 43 55 54 41  f.#ifdef EXECUTA
20c0: 42 4c 45 5f 56 49 41 5f 4d 4d 41 50 5f 44 45 56  BLE_VIA_MMAP_DEV
20d0: 5a 45 52 4f 0a 20 20 20 20 20 20 70 61 67 65 20  ZERO.      page 
20e0: 3d 20 6d 6d 61 70 28 30 2c 20 70 61 67 65 73 69  = mmap(0, pagesi
20f0: 7a 65 2c 20 50 52 4f 54 5f 52 45 41 44 20 7c 20  ze, PROT_READ | 
2100: 50 52 4f 54 5f 57 52 49 54 45 20 7c 20 50 52 4f  PROT_WRITE | PRO
2110: 54 5f 45 58 45 43 2c 20 4d 41 50 5f 50 52 49 56  T_EXEC, MAP_PRIV
2120: 41 54 45 2c 20 7a 65 72 6f 5f 66 64 2c 20 30 29  ATE, zero_fd, 0)
2130: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
2140: 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41 5f 53  EXECUTABLE_VIA_S
2150: 48 4d 0a 20 20 20 20 20 20 69 6e 74 20 73 68 6d  HM.      int shm
2160: 69 64 20 3d 20 73 68 6d 67 65 74 28 49 50 43 5f  id = shmget(IPC_
2170: 50 52 49 56 41 54 45 2c 20 70 61 67 65 73 69 7a  PRIVATE, pagesiz
2180: 65 2c 20 30 37 30 30 7c 49 50 43 5f 43 52 45 41  e, 0700|IPC_CREA
2190: 54 29 3b 0a 20 20 20 20 20 20 69 66 20 28 73 68  T);.      if (sh
21a0: 6d 69 64 3c 30 29 0a 20 20 20 20 20 20 20 20 7b  mid<0).        {
21b0: 20 70 61 67 65 20 3d 20 28 63 68 61 72 2a 29 28   page = (char*)(
21c0: 2d 31 29 3b 20 7d 0a 20 20 20 20 20 20 65 6c 73  -1); }.      els
21d0: 65 0a 20 20 20 20 20 20 20 20 7b 20 70 61 67 65  e.        { page
21e0: 20 3d 20 73 68 6d 61 74 28 73 68 6d 69 64 2c 20   = shmat(shmid, 
21f0: 30 2c 20 30 29 3b 20 73 68 6d 63 74 6c 28 73 68  0, 0); shmctl(sh
2200: 6d 69 64 2c 20 49 50 43 5f 52 4d 49 44 2c 20 30  mid, IPC_RMID, 0
2210: 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20  ); }.#endif.    
2220: 20 20 69 66 20 28 70 61 67 65 20 3d 3d 20 28 63    if (page == (c
2230: 68 61 72 2a 29 28 2d 31 29 29 0a 20 20 20 20 20  har*)(-1)).     
2240: 20 20 20 7b 20 66 70 72 69 6e 74 66 28 73 74 64     { fprintf(std
2250: 65 72 72 2c 22 74 72 61 6d 70 6f 6c 69 6e 65 3a  err,"trampoline:
2260: 20 4f 75 74 20 6f 66 20 76 69 72 74 75 61 6c 20   Out of virtual 
2270: 6d 65 6d 6f 72 79 21 5c 6e 22 29 3b 20 61 62 6f  memory!\n"); abo
2280: 72 74 28 29 3b 20 7d 0a 20 20 20 20 20 20 2f 2a  rt(); }.      /*
2290: 20 46 69 6c 6c 20 69 74 20 77 69 74 68 20 66 72   Fill it with fr
22a0: 65 65 20 74 72 61 6d 70 6f 6c 69 6e 65 73 2e 20  ee trampolines. 
22b0: 2a 2f 0a 20 20 20 20 20 20 7b 20 63 68 61 72 2a  */.      { char*
22c0: 2a 20 6c 61 73 74 20 3d 20 26 66 72 65 65 6c 69  * last = &freeli
22d0: 73 74 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  st;.        char
22e0: 2a 20 70 61 67 65 5f 65 6e 64 20 3d 20 70 61 67  * page_end = pag
22f0: 65 20 2b 20 70 61 67 65 73 69 7a 65 3b 0a 20 20  e + pagesize;.  
2300: 20 20 20 20 20 20 77 68 69 6c 65 20 28 70 61 67        while (pag
2310: 65 2b 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 3c  e+TRAMP_LENGTH <
2320: 3d 20 70 61 67 65 5f 65 6e 64 29 0a 20 20 20 20  = page_end).    
2330: 20 20 20 20 20 20 7b 20 2a 6c 61 73 74 20 3d 20        { *last = 
2340: 70 61 67 65 3b 20 6c 61 73 74 20 3d 20 28 63 68  page; last = (ch
2350: 61 72 2a 2a 29 70 61 67 65 3b 20 70 61 67 65 20  ar**)page; page 
2360: 2b 3d 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 3b  += TRAMP_LENGTH;
2370: 20 7d 0a 20 20 20 20 20 20 20 20 2a 6c 61 73 74   }.        *last
2380: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 20 7d   = NULL;.    } }
2390: 0a 20 20 66 75 6e 63 74 69 6f 6e 20 3d 20 66 72  .  function = fr
23a0: 65 65 6c 69 73 74 3b 20 66 72 65 65 6c 69 73 74  eelist; freelist
23b0: 20 3d 20 2a 28 63 68 61 72 2a 2a 29 66 72 65 65   = *(char**)free
23c0: 6c 69 73 74 3b 0a 23 65 6c 73 65 0a 20 20 7b 20  list;.#else.  { 
23d0: 63 68 61 72 2a 20 72 6f 6f 6d 20 3d 20 28 63 68  char* room = (ch
23e0: 61 72 2a 29 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  ar*) malloc(size
23f0: 6f 66 28 76 6f 69 64 2a 29 20 2b 20 54 52 41 4d  of(void*) + TRAM
2400: 50 5f 4c 45 4e 47 54 48 20 2b 20 54 52 41 4d 50  P_LENGTH + TRAMP
2410: 5f 41 4c 49 47 4e 2d 31 29 3b 0a 20 20 20 20 69  _ALIGN-1);.    i
2420: 66 20 28 21 72 6f 6f 6d 29 0a 20 20 20 20 20 20  f (!room).      
2430: 7b 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72  { fprintf(stderr
2440: 2c 22 74 72 61 6d 70 6f 6c 69 6e 65 3a 20 4f 75  ,"trampoline: Ou
2450: 74 20 6f 66 20 76 69 72 74 75 61 6c 20 6d 65 6d  t of virtual mem
2460: 6f 72 79 21 5c 6e 22 29 3b 20 61 62 6f 72 74 28  ory!\n"); abort(
2470: 29 3b 20 7d 0a 20 20 20 20 66 75 6e 63 74 69 6f  ); }.    functio
2480: 6e 20 3d 20 28 63 68 61 72 2a 29 28 28 28 6c 6f  n = (char*)(((lo
2490: 6e 67 29 72 6f 6f 6d 20 2b 20 73 69 7a 65 6f 66  ng)room + sizeof
24a0: 28 76 6f 69 64 2a 29 20 2b 20 54 52 41 4d 50 5f  (void*) + TRAMP_
24b0: 41 4c 49 47 4e 2d 31 29 20 26 20 2d 54 52 41 4d  ALIGN-1) & -TRAM
24c0: 50 5f 41 4c 49 47 4e 29 3b 0a 20 20 20 20 28 28  P_ALIGN);.    ((
24d0: 63 68 61 72 2a 2a 29 66 75 6e 63 74 69 6f 6e 29  char**)function)
24e0: 5b 2d 31 5d 20 3d 20 72 6f 6f 6d 3b 20 2f 2a 20  [-1] = room; /* 
24f0: 62 61 63 6b 70 6f 69 6e 74 65 72 20 66 6f 72 20  backpointer for 
2500: 66 72 65 65 5f 74 72 61 6d 70 6f 6c 69 6e 65 28  free_trampoline(
2510: 29 20 2a 2f 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ) */.  }.#endif.
2520: 0a 20 20 2f 2a 20 32 2e 20 46 69 6c 6c 20 6f 75  .  /* 2. Fill ou
2530: 74 20 74 68 65 20 74 72 61 6d 70 6f 6c 69 6e 65  t the trampoline
2540: 20 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 69 33 38   */.#ifdef __i38
2550: 36 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f  6__.  /* functio
2560: 6e 3a 0a 20 20 20 2a 20 20 20 20 6d 6f 76 6c 20  n:.   *    movl 
2570: 24 3c 64 61 74 61 3e 2c 3c 76 61 72 69 61 62 6c  $<data>,<variabl
2580: 65 3e 09 09 43 37 20 30 35 20 3c 76 61 72 69 61  e>..C7 05 <varia
2590: 62 6c 65 3e 20 3c 64 61 74 61 3e 0a 20 20 20 2a  ble> <data>.   *
25a0: 20 20 20 20 6a 6d 70 20 3c 61 64 64 72 65 73 73      jmp <address
25b0: 3e 09 09 09 45 39 20 3c 61 64 64 72 65 73 73 3e  >...E9 <address>
25c0: 2d 3c 68 65 72 65 3e 0a 20 20 20 2a 20 68 65 72  -<here>.   * her
25d0: 65 3a 0a 20 20 20 2a 2f 0a 20 20 2a 28 73 68 6f  e:.   */.  *(sho
25e0: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
25f0: 2b 20 30 29 20 3d 20 30 78 30 35 43 37 3b 0a 20  + 0) = 0x05C7;. 
2600: 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e   *(long *)  (fun
2610: 63 74 69 6f 6e 20 2b 20 32 29 20 3d 20 28 6c 6f  ction + 2) = (lo
2620: 6e 67 29 20 76 61 72 69 61 62 6c 65 3b 0a 20 20  ng) variable;.  
2630: 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63  *(long *)  (func
2640: 74 69 6f 6e 20 2b 20 36 29 20 3d 20 28 6c 6f 6e  tion + 6) = (lon
2650: 67 29 20 64 61 74 61 3b 0a 20 20 2a 28 63 68 61  g) data;.  *(cha
2660: 72 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20  r *)  (function 
2670: 2b 31 30 29 20 3d 20 30 78 45 39 3b 0a 20 20 2a  +10) = 0xE9;.  *
2680: 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74  (long *)  (funct
2690: 69 6f 6e 20 2b 31 31 29 20 3d 20 28 6c 6f 6e 67  ion +11) = (long
26a0: 29 20 61 64 64 72 65 73 73 20 2d 20 28 6c 6f 6e  ) address - (lon
26b0: 67 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 31  g) (function + 1
26c0: 35 29 3b 0a 23 64 65 66 69 6e 65 20 69 73 5f 74  5);.#define is_t
26d0: 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20 20  ramp(function)  
26e0: 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73  \.  *(unsigned s
26f0: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
2700: 6e 20 2b 20 30 29 20 3d 3d 20 30 78 30 35 43 37  n + 0) == 0x05C7
2710: 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e   && \.  *(unsign
2720: 65 64 20 63 68 61 72 20 2a 29 20 20 28 66 75 6e  ed char *)  (fun
2730: 63 74 69 6f 6e 20 2b 31 30 29 20 3d 3d 20 30 78  ction +10) == 0x
2740: 45 39 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70  E9.#define tramp
2750: 5f 61 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f  _address(functio
2760: 6e 29 20 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a  n)  \.  *(long *
2770: 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 31  )  (function +11
2780: 29 20 2b 20 28 6c 6f 6e 67 29 20 28 66 75 6e 63  ) + (long) (func
2790: 74 69 6f 6e 20 2b 20 31 35 29 0a 23 64 65 66 69  tion + 15).#defi
27a0: 6e 65 20 74 72 61 6d 70 5f 76 61 72 69 61 62 6c  ne tramp_variabl
27b0: 65 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20  e(function)  \. 
27c0: 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e   *(long *)  (fun
27d0: 63 74 69 6f 6e 20 2b 20 32 29 0a 23 64 65 66 69  ction + 2).#defi
27e0: 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 28 66 75  ne tramp_data(fu
27f0: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 6c  nction)  \.  *(l
2800: 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f  ong *)  (functio
2810: 6e 20 2b 20 36 29 0a 23 65 6e 64 69 66 0a 23 69  n + 6).#endif.#i
2820: 66 64 65 66 20 5f 5f 6d 36 38 6b 5f 5f 0a 20 20  fdef __m68k__.  
2830: 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20  /* function:.   
2840: 2a 20 20 20 20 6d 6f 76 65 6c 20 23 3c 64 61 74  *    movel #<dat
2850: 61 3e 2c 3c 76 61 72 69 61 62 6c 65 3e 09 32 33  a>,<variable>.23
2860: 20 46 43 20 3c 64 61 74 61 3e 20 3c 76 61 72 69   FC <data> <vari
2870: 61 62 6c 65 3e 0a 20 20 20 2a 20 20 20 20 6a 6d  able>.   *    jm
2880: 70 20 3c 61 64 64 72 65 73 73 3e 09 09 09 34 45  p <address>...4E
2890: 20 46 39 20 3c 61 64 64 72 65 73 73 3e 0a 20 20   F9 <address>.  
28a0: 20 2a 20 20 20 20 6e 6f 70 09 09 09 09 34 45 20   *    nop....4E 
28b0: 37 31 0a 20 20 20 2a 2f 0a 20 20 2a 28 73 68 6f  71.   */.  *(sho
28c0: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
28d0: 2b 20 30 29 20 3d 20 30 78 32 33 46 43 3b 0a 20  + 0) = 0x23FC;. 
28e0: 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e   *(long *)  (fun
28f0: 63 74 69 6f 6e 20 2b 20 32 29 20 3d 20 28 6c 6f  ction + 2) = (lo
2900: 6e 67 29 20 64 61 74 61 3b 0a 20 20 2a 28 6c 6f  ng) data;.  *(lo
2910: 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e  ng *)  (function
2920: 20 2b 20 36 29 20 3d 20 28 6c 6f 6e 67 29 20 76   + 6) = (long) v
2930: 61 72 69 61 62 6c 65 3b 0a 20 20 2a 28 73 68 6f  ariable;.  *(sho
2940: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
2950: 2b 31 30 29 20 3d 20 30 78 34 45 46 39 3b 0a 20  +10) = 0x4EF9;. 
2960: 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e   *(long *)  (fun
2970: 63 74 69 6f 6e 20 2b 31 32 29 20 3d 20 28 6c 6f  ction +12) = (lo
2980: 6e 67 29 20 61 64 64 72 65 73 73 3b 0a 20 20 2a  ng) address;.  *
2990: 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74  (short *) (funct
29a0: 69 6f 6e 20 2b 31 36 29 20 3d 20 30 78 34 45 37  ion +16) = 0x4E7
29b0: 31 3b 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72  1;.#define is_tr
29c0: 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c  amp(function)  \
29d0: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68  .  *(unsigned sh
29e0: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ort *) (function
29f0: 20 2b 20 30 29 20 3d 3d 20 30 78 32 33 46 43 20   + 0) == 0x23FC 
2a00: 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65  && \.  *(unsigne
2a10: 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63  d short *) (func
2a20: 74 69 6f 6e 20 2b 31 30 29 20 3d 3d 20 30 78 34  tion +10) == 0x4
2a30: 45 46 39 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73  EF9 && \.  *(uns
2a40: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28  igned short *) (
2a50: 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 3d  function +16) ==
2a60: 20 30 78 34 45 37 31 0a 23 64 65 66 69 6e 65 20   0x4E71.#define 
2a70: 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75  tramp_address(fu
2a80: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 6c  nction)  \.  *(l
2a90: 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f  ong *)  (functio
2aa0: 6e 20 2b 31 32 29 0a 23 64 65 66 69 6e 65 20 74  n +12).#define t
2ab0: 72 61 6d 70 5f 76 61 72 69 61 62 6c 65 28 66 75  ramp_variable(fu
2ac0: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 6c  nction)  \.  *(l
2ad0: 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f  ong *)  (functio
2ae0: 6e 20 2b 20 36 29 0a 23 64 65 66 69 6e 65 20 74  n + 6).#define t
2af0: 72 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 74 69  ramp_data(functi
2b00: 6f 6e 29 20 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20  on)  \.  *(long 
2b10: 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20  *)  (function + 
2b20: 32 29 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  2).#endif.#if de
2b30: 66 69 6e 65 64 28 5f 5f 6d 69 70 73 5f 5f 29 20  fined(__mips__) 
2b40: 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 6d 69  && !defined(__mi
2b50: 70 73 6e 33 32 5f 5f 29 0a 20 20 2f 2a 20 66 75  psn32__).  /* fu
2b60: 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20  nction:.   *    
2b70: 6c 69 20 24 32 2c 3c 64 61 74 61 3e 26 30 78 66  li $2,<data>&0xf
2b80: 66 66 66 30 30 30 30 09 09 33 43 20 30 32 20 68  fff0000..3C 02 h
2b90: 69 31 36 28 3c 64 61 74 61 3e 29 0a 20 20 20 2a  i16(<data>).   *
2ba0: 20 20 20 20 6f 72 69 20 24 32 2c 24 32 2c 3c 64      ori $2,$2,<d
2bb0: 61 74 61 3e 26 30 78 66 66 66 66 09 09 33 34 20  ata>&0xffff..34 
2bc0: 34 32 20 6c 6f 31 36 28 3c 64 61 74 61 3e 29 0a  42 lo16(<data>).
2bd0: 20 20 20 2a 20 20 20 20 73 77 20 24 32 2c 3c 76     *    sw $2,<v
2be0: 61 72 69 61 62 6c 65 3e 09 09 33 43 20 30 31 20  ariable>..3C 01 
2bf0: 68 69 31 36 28 3c 76 61 72 69 61 62 6c 65 3e 29  hi16(<variable>)
2c00: 0a 20 20 20 2a 20 20 20 20 09 09 09 09 41 43 20  .   *    ....AC 
2c10: 32 32 20 6c 6f 31 36 28 3c 76 61 72 69 61 62 6c  22 lo16(<variabl
2c20: 65 3e 29 0a 20 20 20 2a 20 20 20 20 6c 69 20 24  e>).   *    li $
2c30: 32 35 2c 3c 61 64 64 72 65 73 73 3e 26 30 78 66  25,<address>&0xf
2c40: 66 66 66 30 30 30 30 09 33 43 20 31 39 20 68 69  fff0000.3C 19 hi
2c50: 31 36 28 3c 61 64 64 72 65 73 73 3e 29 0a 20 20  16(<address>).  
2c60: 20 2a 20 20 20 20 6f 72 69 20 24 32 35 2c 24 32   *    ori $25,$2
2c70: 35 2c 3c 61 64 64 72 65 73 73 3e 26 30 78 66 66  5,<address>&0xff
2c80: 66 66 09 33 37 20 33 39 20 6c 6f 31 36 28 3c 61  ff.37 39 lo16(<a
2c90: 64 64 72 65 73 73 3e 29 0a 20 20 20 2a 20 20 20  ddress>).   *   
2ca0: 20 6a 20 24 32 35 09 09 09 09 30 33 20 32 30 20   j $25....03 20 
2cb0: 30 30 20 30 38 0a 20 20 20 2a 20 20 20 20 6e 6f  00 08.   *    no
2cc0: 70 09 09 09 09 30 30 20 30 30 20 30 30 20 30 30  p....00 00 00 00
2cd0: 0a 20 20 20 2a 2f 0a 20 20 2f 2a 20 57 68 61 74  .   */.  /* What
2ce0: 20 61 62 6f 75 74 20 62 69 67 20 65 6e 64 69 61   about big endia
2cf0: 6e 20 2f 20 6c 69 74 74 6c 65 20 65 6e 64 69 61  n / little endia
2d00: 6e 20 3f 3f 20 2a 2f 0a 20 20 2a 28 73 68 6f 72  n ?? */.  *(shor
2d10: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
2d20: 20 30 29 20 3d 20 30 78 33 43 30 32 3b 0a 20 20   0) = 0x3C02;.  
2d30: 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63  *(short *) (func
2d40: 74 69 6f 6e 20 2b 20 32 29 20 3d 20 28 75 6e 73  tion + 2) = (uns
2d50: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 61 74 61  igned long) data
2d60: 20 3e 3e 20 31 36 3b 0a 20 20 2a 28 73 68 6f 72   >> 16;.  *(shor
2d70: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
2d80: 20 34 29 20 3d 20 30 78 33 34 34 32 3b 0a 20 20   4) = 0x3442;.  
2d90: 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63  *(short *) (func
2da0: 74 69 6f 6e 20 2b 20 36 29 20 3d 20 28 75 6e 73  tion + 6) = (uns
2db0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 61 74 61  igned long) data
2dc0: 20 26 20 30 78 66 66 66 66 3b 0a 20 20 2a 28 73   & 0xffff;.  *(s
2dd0: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
2de0: 6e 20 2b 20 38 29 20 3d 20 30 78 33 43 30 31 3b  n + 8) = 0x3C01;
2df0: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66  .  *(short *) (f
2e00: 75 6e 63 74 69 6f 6e 20 2b 31 30 29 20 3d 20 28  unction +10) = (
2e10: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 76  unsigned long) v
2e20: 61 72 69 61 62 6c 65 20 3e 3e 20 31 36 3b 0a 20  ariable >> 16;. 
2e30: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e   *(short *) (fun
2e40: 63 74 69 6f 6e 20 2b 31 32 29 20 3d 20 30 78 41  ction +12) = 0xA
2e50: 43 32 32 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a  C22;.  *(short *
2e60: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 34 29  ) (function +14)
2e70: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e   = (unsigned lon
2e80: 67 29 20 76 61 72 69 61 62 6c 65 20 26 20 30 78  g) variable & 0x
2e90: 66 66 66 66 3b 0a 20 20 2a 28 73 68 6f 72 74 20  ffff;.  *(short 
2ea0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36  *) (function +16
2eb0: 29 20 3d 20 30 78 33 43 31 39 3b 0a 20 20 2a 28  ) = 0x3C19;.  *(
2ec0: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
2ed0: 6f 6e 20 2b 31 38 29 20 3d 20 28 75 6e 73 69 67  on +18) = (unsig
2ee0: 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64 72 65 73  ned long) addres
2ef0: 73 20 3e 3e 20 31 36 3b 0a 20 20 2a 28 73 68 6f  s >> 16;.  *(sho
2f00: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
2f10: 2b 32 30 29 20 3d 20 30 78 33 37 33 39 3b 0a 20  +20) = 0x3739;. 
2f20: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e   *(short *) (fun
2f30: 63 74 69 6f 6e 20 2b 32 32 29 20 3d 20 28 75 6e  ction +22) = (un
2f40: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64  signed long) add
2f50: 72 65 73 73 20 26 20 30 78 66 66 66 66 3b 0a 20  ress & 0xffff;. 
2f60: 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e   *(long *)  (fun
2f70: 63 74 69 6f 6e 20 2b 32 34 29 20 3d 20 30 78 30  ction +24) = 0x0
2f80: 33 32 30 30 30 30 38 3b 0a 20 20 2a 28 6c 6f 6e  3200008;.  *(lon
2f90: 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20  g *)  (function 
2fa0: 2b 32 38 29 20 3d 20 30 78 30 30 30 30 30 30 30  +28) = 0x0000000
2fb0: 30 3b 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72  0;.#define is_tr
2fc0: 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c  amp(function)  \
2fd0: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68  .  *(unsigned sh
2fe0: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ort *) (function
2ff0: 20 2b 20 30 29 20 3d 3d 20 30 78 33 43 30 32 20   + 0) == 0x3C02 
3000: 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65  && \.  *(unsigne
3010: 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63  d short *) (func
3020: 74 69 6f 6e 20 2b 20 34 29 20 3d 3d 20 30 78 33  tion + 4) == 0x3
3030: 34 34 32 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73  442 && \.  *(uns
3040: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28  igned short *) (
3050: 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 3d  function + 8) ==
3060: 20 30 78 33 43 30 31 20 26 26 20 5c 0a 20 20 2a   0x3C01 && \.  *
3070: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20  (unsigned short 
3080: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32  *) (function +12
3090: 29 20 3d 3d 20 30 78 41 43 32 32 20 26 26 20 5c  ) == 0xAC22 && \
30a0: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68  .  *(unsigned sh
30b0: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ort *) (function
30c0: 20 2b 31 36 29 20 3d 3d 20 30 78 33 43 31 39 20   +16) == 0x3C19 
30d0: 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65  && \.  *(unsigne
30e0: 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63  d short *) (func
30f0: 74 69 6f 6e 20 2b 32 30 29 20 3d 3d 20 30 78 33  tion +20) == 0x3
3100: 37 33 39 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73  739 && \.  *(uns
3110: 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 29 20 20 28  igned long *)  (
3120: 66 75 6e 63 74 69 6f 6e 20 2b 32 34 29 20 3d 3d  function +24) ==
3130: 20 30 78 30 33 32 30 30 30 30 38 20 26 26 20 5c   0x03200008 && \
3140: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .  *(unsigned lo
3150: 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e  ng *)  (function
3160: 20 2b 32 38 29 20 3d 3d 20 30 78 30 30 30 30 30   +28) == 0x00000
3170: 30 30 30 0a 23 64 65 66 69 6e 65 20 68 69 6c 6f  000.#define hilo
3180: 28 68 69 77 6f 72 64 2c 6c 6f 77 6f 72 64 29 20  (hiword,loword) 
3190: 20 5c 0a 20 20 28 28 28 75 6e 73 69 67 6e 65 64   \.  (((unsigned
31a0: 20 6c 6f 6e 67 29 20 28 68 69 77 6f 72 64 29 20   long) (hiword) 
31b0: 3c 3c 20 31 36 29 20 7c 20 28 75 6e 73 69 67 6e  << 16) | (unsign
31c0: 65 64 20 6c 6f 6e 67 29 20 28 6c 6f 77 6f 72 64  ed long) (loword
31d0: 29 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70  )).#define tramp
31e0: 5f 61 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f  _address(functio
31f0: 6e 29 20 20 5c 0a 20 20 68 69 6c 6f 28 2a 28 75  n)  \.  hilo(*(u
3200: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29  nsigned short *)
3210: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 38 29 2c   (function +18),
3220: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72   *(unsigned shor
3230: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
3240: 32 32 29 29 0a 23 64 65 66 69 6e 65 20 74 72 61  22)).#define tra
3250: 6d 70 5f 76 61 72 69 61 62 6c 65 28 66 75 6e 63  mp_variable(func
3260: 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c 6f 28  tion)  \.  hilo(
3270: 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74  *(unsigned short
3280: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31   *) (function +1
3290: 30 29 2c 20 2a 28 75 6e 73 69 67 6e 65 64 20 73  0), *(unsigned s
32a0: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
32b0: 6e 20 2b 31 34 29 29 0a 23 64 65 66 69 6e 65 20  n +14)).#define 
32c0: 74 72 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 74  tramp_data(funct
32d0: 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c 6f 28 2a  ion)  \.  hilo(*
32e0: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20  (unsigned short 
32f0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 32  *) (function + 2
3300: 29 2c 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68  ), *(unsigned sh
3310: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ort *) (function
3320: 20 2b 20 36 29 29 0a 23 65 6e 64 69 66 0a 23 69   + 6)).#endif.#i
3330: 66 64 65 66 20 5f 5f 6d 69 70 73 6e 33 32 5f 5f  fdef __mipsn32__
3340: 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a  .  /* function:.
3350: 20 20 20 2a 20 20 20 20 6c 77 20 24 32 2c 32 34     *    lw $2,24
3360: 28 24 32 35 29 09 09 09 38 46 20 32 32 20 30 30  ($25)...8F 22 00
3370: 20 31 38 0a 20 20 20 2a 20 20 20 20 6c 77 20 24   18.   *    lw $
3380: 33 2c 32 38 28 24 32 35 29 09 09 09 38 46 20 32  3,28($25)...8F 2
3390: 33 20 30 30 20 31 43 0a 20 20 20 2a 20 20 20 20  3 00 1C.   *    
33a0: 73 77 20 24 33 2c 30 28 24 32 29 09 09 09 41 43  sw $3,0($2)...AC
33b0: 20 34 33 20 30 30 20 30 30 0a 20 20 20 2a 20 20   43 00 00.   *  
33c0: 20 20 6c 77 20 24 32 35 2c 33 32 28 24 32 35 29    lw $25,32($25)
33d0: 09 09 09 38 46 20 33 39 20 30 30 20 32 30 0a 20  ...8F 39 00 20. 
33e0: 20 20 2a 20 20 20 20 6a 20 24 32 35 09 09 09 09    *    j $25....
33f0: 30 33 20 32 30 20 30 30 20 30 38 0a 20 20 20 2a  03 20 00 08.   *
3400: 20 20 20 20 6e 6f 70 09 09 09 09 30 30 20 30 30      nop....00 00
3410: 20 30 30 20 30 30 0a 20 20 20 2a 20 20 20 20 2e   00 00.   *    .
3420: 77 6f 72 64 20 3c 76 61 72 69 61 62 6c 65 3e 09  word <variable>.
3430: 09 3c 76 61 72 69 61 62 6c 65 3e 0a 20 20 20 2a  .<variable>.   *
3440: 20 20 20 20 2e 77 6f 72 64 20 3c 64 61 74 61 3e      .word <data>
3450: 09 09 09 3c 64 61 74 61 3e 0a 20 20 20 2a 20 20  ...<data>.   *  
3460: 20 20 2e 77 6f 72 64 20 3c 61 64 64 72 65 73 73    .word <address
3470: 3e 09 09 09 3c 61 64 64 72 65 73 73 3e 0a 20 20  >...<address>.  
3480: 20 2a 2f 0a 20 20 2f 2a 20 57 68 61 74 20 61 62   */.  /* What ab
3490: 6f 75 74 20 62 69 67 20 65 6e 64 69 61 6e 20 2f  out big endian /
34a0: 20 6c 69 74 74 6c 65 20 65 6e 64 69 61 6e 20 3f   little endian ?
34b0: 3f 20 2a 2f 0a 20 20 2a 28 75 6e 73 69 67 6e 65  ? */.  *(unsigne
34c0: 64 20 69 6e 74 20 2a 29 20 28 66 75 6e 63 74 69  d int *) (functi
34d0: 6f 6e 20 2b 20 30 29 20 3d 20 30 78 38 46 32 32  on + 0) = 0x8F22
34e0: 30 30 31 38 3b 0a 20 20 2a 28 75 6e 73 69 67 6e  0018;.  *(unsign
34f0: 65 64 20 69 6e 74 20 2a 29 20 28 66 75 6e 63 74  ed int *) (funct
3500: 69 6f 6e 20 2b 20 34 29 20 3d 20 30 78 38 46 32  ion + 4) = 0x8F2
3510: 33 30 30 31 43 3b 0a 20 20 2a 28 75 6e 73 69 67  3001C;.  *(unsig
3520: 6e 65 64 20 69 6e 74 20 2a 29 20 28 66 75 6e 63  ned int *) (func
3530: 74 69 6f 6e 20 2b 20 38 29 20 3d 20 30 78 41 43  tion + 8) = 0xAC
3540: 34 33 30 30 30 30 3b 0a 20 20 2a 28 75 6e 73 69  430000;.  *(unsi
3550: 67 6e 65 64 20 69 6e 74 20 2a 29 20 28 66 75 6e  gned int *) (fun
3560: 63 74 69 6f 6e 20 2b 31 32 29 20 3d 20 30 78 38  ction +12) = 0x8
3570: 46 33 39 30 30 32 30 3b 0a 20 20 2a 28 75 6e 73  F390020;.  *(uns
3580: 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 28 66 75  igned int *) (fu
3590: 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20 30 78  nction +16) = 0x
35a0: 30 33 32 30 30 30 30 38 3b 0a 20 20 2a 28 75 6e  03200008;.  *(un
35b0: 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 28 66  signed int *) (f
35c0: 75 6e 63 74 69 6f 6e 20 2b 32 30 29 20 3d 20 30  unction +20) = 0
35d0: 78 30 30 30 30 30 30 30 30 3b 0a 20 20 2a 28 75  x00000000;.  *(u
35e0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 28  nsigned int *) (
35f0: 66 75 6e 63 74 69 6f 6e 20 2b 32 34 29 20 3d 20  function +24) = 
3600: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 76  (unsigned int) v
3610: 61 72 69 61 62 6c 65 3b 0a 20 20 2a 28 75 6e 73  ariable;.  *(uns
3620: 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 28 66 75  igned int *) (fu
3630: 6e 63 74 69 6f 6e 20 2b 32 38 29 20 3d 20 28 75  nction +28) = (u
3640: 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 64 61 74  nsigned int) dat
3650: 61 3b 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20  a;.  *(unsigned 
3660: 69 6e 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  int *) (function
3670: 20 2b 33 32 29 20 3d 20 28 75 6e 73 69 67 6e 65   +32) = (unsigne
3680: 64 20 69 6e 74 29 20 61 64 64 72 65 73 73 3b 0a  d int) address;.
3690: 23 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70  #define is_tramp
36a0: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20  (function)  \.  
36b0: 2a 28 69 6e 74 20 2a 29 20 20 20 20 20 20 20 20  *(int *)        
36c0: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29    (function + 0)
36d0: 20 3d 3d 20 30 78 38 46 32 32 30 30 31 38 20 26   == 0x8F220018 &
36e0: 26 20 5c 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20  & \.  *(int *)  
36f0: 20 20 20 20 20 20 20 20 28 66 75 6e 63 74 69 6f          (functio
3700: 6e 20 2b 20 34 29 20 3d 3d 20 30 78 38 46 32 33  n + 4) == 0x8F23
3710: 30 30 31 43 20 26 26 20 5c 0a 20 20 2a 28 69 6e  001C && \.  *(in
3720: 74 20 2a 29 20 20 20 20 20 20 20 20 20 20 28 66  t *)          (f
3730: 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 3d 20  unction + 8) == 
3740: 30 78 41 43 34 33 30 30 30 30 20 26 26 20 5c 0a  0xAC430000 && \.
3750: 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 20 20 20    *(int *)      
3760: 20 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31      (function +1
3770: 32 29 20 3d 3d 20 30 78 38 46 33 39 30 30 32 30  2) == 0x8F390020
3780: 20 26 26 20 5c 0a 20 20 2a 28 69 6e 74 20 2a 29   && \.  *(int *)
3790: 20 20 20 20 20 20 20 20 20 20 28 66 75 6e 63 74            (funct
37a0: 69 6f 6e 20 2b 31 36 29 20 3d 3d 20 30 78 30 33  ion +16) == 0x03
37b0: 32 30 30 30 30 38 20 26 26 20 5c 0a 20 20 2a 28  200008 && \.  *(
37c0: 69 6e 74 20 2a 29 20 20 20 20 20 20 20 20 20 20  int *)          
37d0: 28 66 75 6e 63 74 69 6f 6e 20 2b 32 30 29 20 3d  (function +20) =
37e0: 3d 20 30 78 30 30 30 30 30 30 30 30 0a 23 64 65  = 0x00000000.#de
37f0: 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 65  fine tramp_addre
3800: 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a  ss(function)  \.
3810: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74    *(unsigned int
3820: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 33   *) (function +3
3830: 32 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70  2).#define tramp
3840: 5f 76 61 72 69 61 62 6c 65 28 66 75 6e 63 74 69  _variable(functi
3850: 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67  on)  \.  *(unsig
3860: 6e 65 64 20 69 6e 74 20 2a 29 20 28 66 75 6e 63  ned int *) (func
3870: 74 69 6f 6e 20 2b 32 34 29 0a 23 64 65 66 69 6e  tion +24).#defin
3880: 65 20 74 72 61 6d 70 5f 64 61 74 61 28 66 75 6e  e tramp_data(fun
3890: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e  ction)  \.  *(un
38a0: 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 28 66  signed int *) (f
38b0: 75 6e 63 74 69 6f 6e 20 2b 32 38 29 0a 23 65 6e  unction +28).#en
38c0: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d 69 70  dif.#ifdef __mip
38d0: 73 36 34 6f 6c 64 5f 5f 0a 20 20 2f 2a 20 66 75  s64old__.  /* fu
38e0: 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20  nction:.   *    
38f0: 64 6c 69 20 24 32 2c 3c 76 61 72 69 61 62 6c 65  dli $2,<variable
3900: 3e 09 09 33 43 20 30 32 20 68 69 31 36 28 68 69  >..3C 02 hi16(hi
3910: 33 32 28 3c 76 61 72 69 61 62 6c 65 3e 29 29 0a  32(<variable>)).
3920: 20 20 20 2a 09 09 09 09 09 33 34 20 34 32 20 6c     *.....34 42 l
3930: 6f 31 36 28 68 69 33 32 28 3c 76 61 72 69 61 62  o16(hi32(<variab
3940: 6c 65 3e 29 29 0a 20 20 20 2a 09 09 09 09 09 30  le>)).   *.....0
3950: 30 20 30 32 20 31 34 20 33 38 0a 20 20 20 2a 09  0 02 14 38.   *.
3960: 09 09 09 09 33 34 20 34 32 20 68 69 31 36 28 6c  ....34 42 hi16(l
3970: 6f 33 32 28 3c 76 61 72 69 61 62 6c 65 3e 29 29  o32(<variable>))
3980: 0a 20 20 20 2a 09 09 09 09 09 30 30 20 30 32 20  .   *.....00 02 
3990: 31 34 20 33 38 0a 20 20 20 2a 09 09 09 09 09 33  14 38.   *.....3
39a0: 34 20 34 32 20 6c 6f 31 36 28 6c 6f 33 32 28 3c  4 42 lo16(lo32(<
39b0: 76 61 72 69 61 62 6c 65 3e 29 29 0a 20 20 20 2a  variable>)).   *
39c0: 20 20 20 20 64 6c 69 20 24 33 2c 3c 64 61 74 61      dli $3,<data
39d0: 3e 09 09 09 33 43 20 30 33 20 68 69 31 36 28 68  >...3C 03 hi16(h
39e0: 69 33 32 28 3c 64 61 74 61 3e 29 29 0a 20 20 20  i32(<data>)).   
39f0: 2a 09 09 09 09 09 33 34 20 36 33 20 6c 6f 31 36  *.....34 63 lo16
3a00: 28 68 69 33 32 28 3c 64 61 74 61 3e 29 29 0a 20  (hi32(<data>)). 
3a10: 20 20 2a 09 09 09 09 09 30 30 20 30 33 20 31 43    *.....00 03 1C
3a20: 20 33 38 0a 20 20 20 2a 09 09 09 09 09 33 34 20   38.   *.....34 
3a30: 36 33 20 68 69 31 36 28 6c 6f 33 32 28 3c 64 61  63 hi16(lo32(<da
3a40: 74 61 3e 29 29 0a 20 20 20 2a 09 09 09 09 09 30  ta>)).   *.....0
3a50: 30 20 30 33 20 31 43 20 33 38 0a 20 20 20 2a 09  0 03 1C 38.   *.
3a60: 09 09 09 09 33 34 20 36 33 20 6c 6f 31 36 28 6c  ....34 63 lo16(l
3a70: 6f 33 32 28 3c 64 61 74 61 3e 29 29 0a 20 20 20  o32(<data>)).   
3a80: 2a 20 20 20 20 73 64 20 24 33 2c 30 28 24 32 29  *    sd $3,0($2)
3a90: 09 09 09 46 43 20 34 33 20 30 30 20 30 30 0a 20  ...FC 43 00 00. 
3aa0: 20 20 2a 20 20 20 20 64 6c 69 20 24 32 35 2c 3c    *    dli $25,<
3ab0: 61 64 64 72 65 73 73 3e 09 09 33 43 20 31 39 20  address>..3C 19 
3ac0: 68 69 31 36 28 68 69 33 32 28 3c 61 64 64 72 65  hi16(hi32(<addre
3ad0: 73 73 3e 29 29 0a 20 20 20 2a 09 09 09 09 09 33  ss>)).   *.....3
3ae0: 37 20 33 39 20 6c 6f 31 36 28 68 69 33 32 28 3c  7 39 lo16(hi32(<
3af0: 61 64 64 72 65 73 73 3e 29 29 0a 20 20 20 2a 09  address>)).   *.
3b00: 09 09 09 09 30 30 20 31 39 20 43 43 20 33 38 0a  ....00 19 CC 38.
3b10: 20 20 20 2a 09 09 09 09 09 33 37 20 33 39 20 68     *.....37 39 h
3b20: 69 31 36 28 6c 6f 33 32 28 3c 61 64 64 72 65 73  i16(lo32(<addres
3b30: 73 3e 29 29 0a 20 20 20 2a 09 09 09 09 09 30 30  s>)).   *.....00
3b40: 20 31 39 20 43 43 20 33 38 0a 20 20 20 2a 09 09   19 CC 38.   *..
3b50: 09 09 09 33 37 20 33 39 20 6c 6f 31 36 28 6c 6f  ...37 39 lo16(lo
3b60: 33 32 28 3c 61 64 64 72 65 73 73 3e 29 29 0a 20  32(<address>)). 
3b70: 20 20 2a 20 20 20 20 6a 20 24 32 35 09 09 09 09    *    j $25....
3b80: 30 33 20 32 30 20 30 30 20 30 38 0a 20 20 20 2a  03 20 00 08.   *
3b90: 20 20 20 20 6e 6f 70 09 09 09 09 30 30 20 30 30      nop....00 00
3ba0: 20 30 30 20 30 30 0a 20 20 20 2a 2f 0a 20 20 2f   00 00.   */.  /
3bb0: 2a 20 57 68 61 74 20 61 62 6f 75 74 20 62 69 67  * What about big
3bc0: 20 65 6e 64 69 61 6e 20 2f 20 6c 69 74 74 6c 65   endian / little
3bd0: 20 65 6e 64 69 61 6e 20 3f 3f 20 2a 2f 0a 20 20   endian ?? */.  
3be0: 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63  *(short *) (func
3bf0: 74 69 6f 6e 20 2b 20 30 29 20 3d 20 30 78 33 43  tion + 0) = 0x3C
3c00: 30 32 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29  02;.  *(short *)
3c10: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 32 29 20   (function + 2) 
3c20: 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  = (unsigned long
3c30: 29 20 76 61 72 69 61 62 6c 65 20 3e 3e 20 34 38  ) variable >> 48
3c40: 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28  ;.  *(short *) (
3c50: 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 20  function + 4) = 
3c60: 30 78 33 34 34 32 3b 0a 20 20 2a 28 73 68 6f 72  0x3442;.  *(shor
3c70: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
3c80: 20 36 29 20 3d 20 28 28 75 6e 73 69 67 6e 65 64   6) = ((unsigned
3c90: 20 6c 6f 6e 67 29 20 76 61 72 69 61 62 6c 65 20   long) variable 
3ca0: 3e 3e 20 33 32 29 20 26 20 30 78 66 66 66 66 3b  >> 32) & 0xffff;
3cb0: 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 28 66  .  *(int *)   (f
3cc0: 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 30  unction + 8) = 0
3cd0: 78 30 30 30 32 31 34 33 38 3b 0a 20 20 2a 28 73  x00021438;.  *(s
3ce0: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
3cf0: 6e 20 2b 31 32 29 20 3d 20 30 78 33 34 34 32 3b  n +12) = 0x3442;
3d00: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66  .  *(short *) (f
3d10: 75 6e 63 74 69 6f 6e 20 2b 31 34 29 20 3d 20 28  unction +14) = (
3d20: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
3d30: 76 61 72 69 61 62 6c 65 20 3e 3e 20 31 36 29 20  variable >> 16) 
3d40: 26 20 30 78 66 66 66 66 3b 0a 20 20 2a 28 69 6e  & 0xffff;.  *(in
3d50: 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e  t *)   (function
3d60: 20 2b 31 36 29 20 3d 20 30 78 30 30 30 32 31 34   +16) = 0x000214
3d70: 33 38 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29  38;.  *(short *)
3d80: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 30 29 20   (function +20) 
3d90: 3d 20 30 78 33 34 34 32 3b 0a 20 20 2a 28 73 68  = 0x3442;.  *(sh
3da0: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ort *) (function
3db0: 20 2b 32 32 29 20 3d 20 28 75 6e 73 69 67 6e 65   +22) = (unsigne
3dc0: 64 20 6c 6f 6e 67 29 20 76 61 72 69 61 62 6c 65  d long) variable
3dd0: 20 26 20 30 78 66 66 66 66 3b 0a 20 20 2a 28 73   & 0xffff;.  *(s
3de0: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
3df0: 6e 20 2b 32 34 29 20 3d 20 30 78 33 43 30 33 3b  n +24) = 0x3C03;
3e00: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66  .  *(short *) (f
3e10: 75 6e 63 74 69 6f 6e 20 2b 32 36 29 20 3d 20 28  unction +26) = (
3e20: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64  unsigned long) d
3e30: 61 74 61 20 3e 3e 20 34 38 3b 0a 20 20 2a 28 73  ata >> 48;.  *(s
3e40: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
3e50: 6e 20 2b 32 38 29 20 3d 20 30 78 33 34 36 33 3b  n +28) = 0x3463;
3e60: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66  .  *(short *) (f
3e70: 75 6e 63 74 69 6f 6e 20 2b 33 30 29 20 3d 20 28  unction +30) = (
3e80: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
3e90: 64 61 74 61 20 3e 3e 20 33 32 29 20 26 20 30 78  data >> 32) & 0x
3ea0: 66 66 66 66 3b 0a 20 20 2a 28 69 6e 74 20 2a 29  ffff;.  *(int *)
3eb0: 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 33 32     (function +32
3ec0: 29 20 3d 20 30 78 30 30 30 33 31 43 33 38 3b 0a  ) = 0x00031C38;.
3ed0: 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75    *(short *) (fu
3ee0: 6e 63 74 69 6f 6e 20 2b 33 36 29 20 3d 20 30 78  nction +36) = 0x
3ef0: 33 34 36 33 3b 0a 20 20 2a 28 73 68 6f 72 74 20  3463;.  *(short 
3f00: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 33 38  *) (function +38
3f10: 29 20 3d 20 28 28 75 6e 73 69 67 6e 65 64 20 6c  ) = ((unsigned l
3f20: 6f 6e 67 29 20 64 61 74 61 20 3e 3e 20 31 36 29  ong) data >> 16)
3f30: 20 26 20 30 78 66 66 66 66 3b 0a 20 20 2a 28 69   & 0xffff;.  *(i
3f40: 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f  nt *)   (functio
3f50: 6e 20 2b 34 30 29 20 3d 20 30 78 30 30 30 33 31  n +40) = 0x00031
3f60: 43 33 38 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a  C38;.  *(short *
3f70: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 34 34 29  ) (function +44)
3f80: 20 3d 20 30 78 33 34 36 33 3b 0a 20 20 2a 28 73   = 0x3463;.  *(s
3f90: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
3fa0: 6e 20 2b 34 36 29 20 3d 20 28 75 6e 73 69 67 6e  n +46) = (unsign
3fb0: 65 64 20 6c 6f 6e 67 29 20 64 61 74 61 20 26 20  ed long) data & 
3fc0: 30 78 66 66 66 66 3b 0a 20 20 2a 28 69 6e 74 20  0xffff;.  *(int 
3fd0: 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b  *)   (function +
3fe0: 34 38 29 20 3d 20 30 78 46 43 34 33 30 30 30 30  48) = 0xFC430000
3ff0: 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28  ;.  *(short *) (
4000: 66 75 6e 63 74 69 6f 6e 20 2b 35 32 29 20 3d 20  function +52) = 
4010: 30 78 33 43 31 39 3b 0a 20 20 2a 28 73 68 6f 72  0x3C19;.  *(shor
4020: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
4030: 35 34 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  54) = (unsigned 
4040: 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 20 3e 3e  long) address >>
4050: 20 34 38 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a   48;.  *(short *
4060: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 35 36 29  ) (function +56)
4070: 20 3d 20 30 78 33 37 33 39 3b 0a 20 20 2a 28 73   = 0x3739;.  *(s
4080: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
4090: 6e 20 2b 35 38 29 20 3d 20 28 28 75 6e 73 69 67  n +58) = ((unsig
40a0: 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64 72 65 73  ned long) addres
40b0: 73 20 3e 3e 20 33 32 29 20 26 20 30 78 66 66 66  s >> 32) & 0xfff
40c0: 66 3b 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 20  f;.  *(int *)   
40d0: 28 66 75 6e 63 74 69 6f 6e 20 2b 36 30 29 20 3d  (function +60) =
40e0: 20 30 78 30 30 31 39 43 43 33 38 3b 0a 20 20 2a   0x0019CC38;.  *
40f0: 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74  (short *) (funct
4100: 69 6f 6e 20 2b 36 34 29 20 3d 20 30 78 33 37 33  ion +64) = 0x373
4110: 39 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20  9;.  *(short *) 
4120: 28 66 75 6e 63 74 69 6f 6e 20 2b 36 36 29 20 3d  (function +66) =
4130: 20 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67   ((unsigned long
4140: 29 20 61 64 64 72 65 73 73 20 3e 3e 20 31 36 29  ) address >> 16)
4150: 20 26 20 30 78 66 66 66 66 3b 0a 20 20 2a 28 69   & 0xffff;.  *(i
4160: 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f  nt *)   (functio
4170: 6e 20 2b 36 38 29 20 3d 20 30 78 30 30 31 39 43  n +68) = 0x0019C
4180: 43 33 38 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a  C38;.  *(short *
4190: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 37 32 29  ) (function +72)
41a0: 20 3d 20 30 78 33 37 33 39 3b 0a 20 20 2a 28 73   = 0x3739;.  *(s
41b0: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
41c0: 6e 20 2b 37 34 29 20 3d 20 28 75 6e 73 69 67 6e  n +74) = (unsign
41d0: 65 64 20 6c 6f 6e 67 29 20 61 64 64 72 65 73 73  ed long) address
41e0: 20 26 20 30 78 66 66 66 66 3b 0a 20 20 2a 28 69   & 0xffff;.  *(i
41f0: 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f  nt *)   (functio
4200: 6e 20 2b 37 36 29 20 3d 20 30 78 30 33 32 30 30  n +76) = 0x03200
4210: 30 30 38 3b 0a 20 20 2a 28 69 6e 74 20 2a 29 20  008;.  *(int *) 
4220: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 38 30 29    (function +80)
4230: 20 3d 20 30 78 30 30 30 30 30 30 30 30 3b 0a 23   = 0x00000000;.#
4240: 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 28  define is_tramp(
4250: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a  function)  \.  *
4260: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20  (unsigned short 
4270: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30  *) (function + 0
4280: 29 20 3d 3d 20 30 78 33 43 30 32 20 26 26 20 5c  ) == 0x3C02 && \
4290: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68  .  *(unsigned sh
42a0: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ort *) (function
42b0: 20 2b 20 34 29 20 3d 3d 20 30 78 33 34 34 32 20   + 4) == 0x3442 
42c0: 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65  && \.  *(unsigne
42d0: 64 20 69 6e 74 20 2a 29 20 20 20 28 66 75 6e 63  d int *)   (func
42e0: 74 69 6f 6e 20 2b 20 38 29 20 3d 3d 20 30 78 30  tion + 8) == 0x0
42f0: 30 30 32 31 34 33 38 20 26 26 20 5c 0a 20 20 2a  0021438 && \.  *
4300: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20  (unsigned short 
4310: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32  *) (function +12
4320: 29 20 3d 3d 20 30 78 33 34 34 32 20 26 26 20 5c  ) == 0x3442 && \
4330: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e  .  *(unsigned in
4340: 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e  t *)   (function
4350: 20 2b 31 36 29 20 3d 3d 20 30 78 30 30 30 32 31   +16) == 0x00021
4360: 34 33 38 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73  438 && \.  *(uns
4370: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28  igned short *) (
4380: 66 75 6e 63 74 69 6f 6e 20 2b 32 30 29 20 3d 3d  function +20) ==
4390: 20 30 78 33 34 34 32 20 26 26 20 5c 0a 20 20 2a   0x3442 && \.  *
43a0: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20  (unsigned short 
43b0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 34  *) (function +24
43c0: 29 20 3d 3d 20 30 78 33 43 30 33 20 26 26 20 5c  ) == 0x3C03 && \
43d0: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68  .  *(unsigned sh
43e0: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ort *) (function
43f0: 20 2b 32 38 29 20 3d 3d 20 30 78 33 34 36 33 20   +28) == 0x3463 
4400: 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65  && \.  *(unsigne
4410: 64 20 69 6e 74 20 2a 29 20 20 20 28 66 75 6e 63  d int *)   (func
4420: 74 69 6f 6e 20 2b 33 32 29 20 3d 3d 20 30 78 30  tion +32) == 0x0
4430: 30 30 33 31 43 33 38 20 26 26 20 5c 0a 20 20 2a  0031C38 && \.  *
4440: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20  (unsigned short 
4450: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 33 36  *) (function +36
4460: 29 20 3d 3d 20 30 78 33 34 36 33 20 26 26 20 5c  ) == 0x3463 && \
4470: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e  .  *(unsigned in
4480: 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e  t *)   (function
4490: 20 2b 34 30 29 20 3d 3d 20 30 78 30 30 30 33 31   +40) == 0x00031
44a0: 43 33 38 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73  C38 && \.  *(uns
44b0: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28  igned short *) (
44c0: 66 75 6e 63 74 69 6f 6e 20 2b 34 34 29 20 3d 3d  function +44) ==
44d0: 20 30 78 33 34 36 33 20 26 26 20 5c 0a 20 20 2a   0x3463 && \.  *
44e0: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29  (unsigned int *)
44f0: 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 34 38     (function +48
4500: 29 20 3d 3d 20 30 78 46 43 34 33 30 30 30 30 20  ) == 0xFC430000 
4510: 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65  && \.  *(unsigne
4520: 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63  d short *) (func
4530: 74 69 6f 6e 20 2b 35 32 29 20 3d 3d 20 30 78 33  tion +52) == 0x3
4540: 43 31 39 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73  C19 && \.  *(uns
4550: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28  igned short *) (
4560: 66 75 6e 63 74 69 6f 6e 20 2b 35 36 29 20 3d 3d  function +56) ==
4570: 20 30 78 33 37 33 39 20 26 26 20 5c 0a 20 20 2a   0x3739 && \.  *
4580: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29  (unsigned int *)
4590: 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 36 30     (function +60
45a0: 29 20 3d 3d 20 30 78 30 30 31 39 43 43 33 38 20  ) == 0x0019CC38 
45b0: 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65  && \.  *(unsigne
45c0: 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63  d short *) (func
45d0: 74 69 6f 6e 20 2b 36 34 29 20 3d 3d 20 30 78 33  tion +64) == 0x3
45e0: 37 33 39 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73  739 && \.  *(uns
45f0: 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 20 20 28  igned int *)   (
4600: 66 75 6e 63 74 69 6f 6e 20 2b 36 38 29 20 3d 3d  function +68) ==
4610: 20 30 78 30 30 31 39 43 43 33 38 20 26 26 20 5c   0x0019CC38 && \
4620: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68  .  *(unsigned sh
4630: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ort *) (function
4640: 20 2b 37 32 29 20 3d 3d 20 30 78 33 37 33 39 20   +72) == 0x3739 
4650: 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65  && \.  *(unsigne
4660: 64 20 69 6e 74 20 2a 29 20 20 20 28 66 75 6e 63  d int *)   (func
4670: 74 69 6f 6e 20 2b 37 36 29 20 3d 3d 20 30 78 30  tion +76) == 0x0
4680: 33 32 30 30 30 30 38 20 26 26 20 5c 0a 20 20 2a  3200008 && \.  *
4690: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29  (unsigned int *)
46a0: 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 38 30     (function +80
46b0: 29 20 3d 3d 20 30 78 30 30 30 30 30 30 30 30 0a  ) == 0x00000000.
46c0: 23 64 65 66 69 6e 65 20 68 69 6c 6f 28 77 6f 72  #define hilo(wor
46d0: 64 33 2c 77 6f 72 64 32 2c 77 6f 72 64 31 2c 77  d3,word2,word1,w
46e0: 6f 72 64 30 29 20 20 5c 0a 20 20 28 28 28 75 6e  ord0)  \.  (((un
46f0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 77 6f  signed long) (wo
4700: 72 64 33 29 20 3c 3c 20 34 38 29 20 7c 20 28 28  rd3) << 48) | ((
4710: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28  unsigned long) (
4720: 77 6f 72 64 32 29 20 3c 3c 20 33 32 29 20 7c 20  word2) << 32) | 
4730: 5c 0a 20 20 20 28 28 75 6e 73 69 67 6e 65 64 20  \.   ((unsigned 
4740: 6c 6f 6e 67 29 20 28 77 6f 72 64 31 29 20 3c 3c  long) (word1) <<
4750: 20 31 36 29 20 7c 20 28 75 6e 73 69 67 6e 65 64   16) | (unsigned
4760: 20 6c 6f 6e 67 29 20 28 77 6f 72 64 30 29 29 0a   long) (word0)).
4770: 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 61 64  #define tramp_ad
4780: 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e 29 20  dress(function) 
4790: 20 5c 0a 20 20 68 69 6c 6f 28 2a 28 75 6e 73 69   \.  hilo(*(unsi
47a0: 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66  gned short *) (f
47b0: 75 6e 63 74 69 6f 6e 20 2b 35 34 29 2c 20 5c 0a  unction +54), \.
47c0: 20 20 20 20 20 20 20 2a 28 75 6e 73 69 67 6e 65         *(unsigne
47d0: 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63  d short *) (func
47e0: 74 69 6f 6e 20 2b 35 38 29 2c 20 5c 0a 20 20 20  tion +58), \.   
47f0: 20 20 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73      *(unsigned s
4800: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
4810: 6e 20 2b 36 36 29 2c 20 5c 0a 20 20 20 20 20 20  n +66), \.      
4820: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72   *(unsigned shor
4830: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
4840: 37 34 29 29 0a 23 64 65 66 69 6e 65 20 74 72 61  74)).#define tra
4850: 6d 70 5f 76 61 72 69 61 62 6c 65 28 66 75 6e 63  mp_variable(func
4860: 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c 6f 28  tion)  \.  hilo(
4870: 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74  *(unsigned short
4880: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20   *) (function + 
4890: 32 29 2c 20 5c 0a 20 20 20 20 20 20 20 2a 28 75  2), \.       *(u
48a0: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29  nsigned short *)
48b0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 36 29 2c   (function + 6),
48c0: 20 5c 0a 20 20 20 20 20 20 20 2a 28 75 6e 73 69   \.       *(unsi
48d0: 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66  gned short *) (f
48e0: 75 6e 63 74 69 6f 6e 20 2b 31 34 29 2c 20 5c 0a  unction +14), \.
48f0: 20 20 20 20 20 20 20 2a 28 75 6e 73 69 67 6e 65         *(unsigne
4900: 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63  d short *) (func
4910: 74 69 6f 6e 20 2b 32 32 29 29 0a 23 64 65 66 69  tion +22)).#defi
4920: 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 28 66 75  ne tramp_data(fu
4930: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c  nction)  \.  hil
4940: 6f 28 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f  o(*(unsigned sho
4950: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
4960: 2b 32 36 29 2c 20 5c 0a 20 20 20 20 20 20 20 2a  +26), \.       *
4970: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20  (unsigned short 
4980: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 33 30  *) (function +30
4990: 29 2c 20 5c 0a 20 20 20 20 20 20 20 2a 28 75 6e  ), \.       *(un
49a0: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20  signed short *) 
49b0: 28 66 75 6e 63 74 69 6f 6e 20 2b 33 38 29 2c 20  (function +38), 
49c0: 5c 0a 20 20 20 20 20 20 20 2a 28 75 6e 73 69 67  \.       *(unsig
49d0: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75  ned short *) (fu
49e0: 6e 63 74 69 6f 6e 20 2b 34 36 29 29 0a 23 65 6e  nction +46)).#en
49f0: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d 69 70  dif.#ifdef __mip
4a00: 73 36 34 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74  s64__.  /* funct
4a10: 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 6c 64 20  ion:.   *    ld 
4a20: 24 32 2c 32 34 28 24 32 35 29 09 09 09 44 46 20  $2,24($25)...DF 
4a30: 32 32 20 30 30 20 31 38 0a 20 20 20 2a 20 20 20  22 00 18.   *   
4a40: 20 6c 64 20 24 33 2c 33 32 28 24 32 35 29 09 09   ld $3,32($25)..
4a50: 09 44 46 20 32 33 20 30 30 20 32 30 0a 20 20 20  .DF 23 00 20.   
4a60: 2a 20 20 20 20 73 64 20 24 33 2c 30 28 24 32 29  *    sd $3,0($2)
4a70: 09 09 09 46 43 20 34 33 20 30 30 20 30 30 0a 20  ...FC 43 00 00. 
4a80: 20 20 2a 20 20 20 20 6c 64 20 24 32 35 2c 34 30    *    ld $25,40
4a90: 28 24 32 35 29 09 09 09 44 46 20 33 39 20 30 30  ($25)...DF 39 00
4aa0: 20 32 38 0a 20 20 20 2a 20 20 20 20 6a 20 24 32   28.   *    j $2
4ab0: 35 09 09 09 09 30 33 20 32 30 20 30 30 20 30 38  5....03 20 00 08
4ac0: 0a 20 20 20 2a 20 20 20 20 6e 6f 70 09 09 09 09  .   *    nop....
4ad0: 30 30 20 30 30 20 30 30 20 30 30 0a 20 20 20 2a  00 00 00 00.   *
4ae0: 20 20 20 20 2e 64 77 6f 72 64 20 3c 76 61 72 69      .dword <vari
4af0: 61 62 6c 65 3e 09 09 3c 76 61 72 69 61 62 6c 65  able>..<variable
4b00: 3e 0a 20 20 20 2a 20 20 20 20 2e 64 77 6f 72 64  >.   *    .dword
4b10: 20 3c 64 61 74 61 3e 09 09 09 3c 64 61 74 61 3e   <data>...<data>
4b20: 0a 20 20 20 2a 20 20 20 20 2e 64 77 6f 72 64 20  .   *    .dword 
4b30: 3c 61 64 64 72 65 73 73 3e 09 09 3c 61 64 64 72  <address>..<addr
4b40: 65 73 73 3e 0a 20 20 20 2a 2f 0a 20 20 2f 2a 20  ess>.   */.  /* 
4b50: 57 68 61 74 20 61 62 6f 75 74 20 62 69 67 20 65  What about big e
4b60: 6e 64 69 61 6e 20 2f 20 6c 69 74 74 6c 65 20 65  ndian / little e
4b70: 6e 64 69 61 6e 20 3f 3f 20 2a 2f 0a 20 20 2a 28  ndian ?? */.  *(
4b80: 6c 6f 6e 67 20 2a 29 20 20 20 20 20 20 20 20 20  long *)         
4b90: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20   (function + 0) 
4ba0: 3d 20 30 78 44 46 32 32 30 30 31 38 44 46 32 33  = 0xDF220018DF23
4bb0: 30 30 32 30 4c 3b 0a 20 20 2a 28 6c 6f 6e 67 20  0020L;.  *(long 
4bc0: 2a 29 20 20 20 20 20 20 20 20 20 20 28 66 75 6e  *)          (fun
4bd0: 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 30 78 46  ction + 8) = 0xF
4be0: 43 34 33 30 30 30 30 44 46 33 39 30 30 32 38 4c  C430000DF390028L
4bf0: 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 20  ;.  *(long *)   
4c00: 20 20 20 20 20 20 20 28 66 75 6e 63 74 69 6f 6e         (function
4c10: 20 2b 31 36 29 20 3d 20 30 78 30 33 32 30 30 30   +16) = 0x032000
4c20: 30 38 30 30 30 30 30 30 30 30 4c 3b 0a 20 20 2a  0800000000L;.  *
4c30: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a  (unsigned long *
4c40: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 34 29  ) (function +24)
4c50: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e   = (unsigned lon
4c60: 67 29 20 76 61 72 69 61 62 6c 65 3b 0a 20 20 2a  g) variable;.  *
4c70: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a  (unsigned long *
4c80: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 33 32 29  ) (function +32)
4c90: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e   = (unsigned lon
4ca0: 67 29 20 64 61 74 61 3b 0a 20 20 2a 28 75 6e 73  g) data;.  *(uns
4cb0: 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 29 20 28 66  igned long *) (f
4cc0: 75 6e 63 74 69 6f 6e 20 2b 34 30 29 20 3d 20 28  unction +40) = (
4cd0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 61  unsigned long) a
4ce0: 64 64 72 65 73 73 3b 0a 23 64 65 66 69 6e 65 20  ddress;.#define 
4cf0: 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 6f  is_tramp(functio
4d00: 6e 29 20 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a  n)  \.  *(long *
4d10: 29 20 20 20 20 20 20 20 20 20 20 28 66 75 6e 63  )          (func
4d20: 74 69 6f 6e 20 2b 20 30 29 20 3d 3d 20 30 78 44  tion + 0) == 0xD
4d30: 46 32 32 30 30 31 38 44 46 32 33 30 30 32 30 4c  F220018DF230020L
4d40: 20 26 26 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a   && \.  *(long *
4d50: 29 20 20 20 20 20 20 20 20 20 20 28 66 75 6e 63  )          (func
4d60: 74 69 6f 6e 20 2b 20 38 29 20 3d 3d 20 30 78 46  tion + 8) == 0xF
4d70: 43 34 33 30 30 30 30 44 46 33 39 30 30 32 38 4c  C430000DF390028L
4d80: 20 26 26 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a   && \.  *(long *
4d90: 29 20 20 20 20 20 20 20 20 20 20 28 66 75 6e 63  )          (func
4da0: 74 69 6f 6e 20 2b 31 36 29 20 3d 3d 20 30 78 30  tion +16) == 0x0
4db0: 33 32 30 30 30 30 38 30 30 30 30 30 30 30 30 4c  320000800000000L
4dc0: 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 61  .#define tramp_a
4dd0: 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e 29  ddress(function)
4de0: 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64    \.  *(unsigned
4df0: 20 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69   long *) (functi
4e00: 6f 6e 20 2b 34 30 29 0a 23 64 65 66 69 6e 65 20  on +40).#define 
4e10: 74 72 61 6d 70 5f 76 61 72 69 61 62 6c 65 28 66  tramp_variable(f
4e20: 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28  unction)  \.  *(
4e30: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 29  unsigned long *)
4e40: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 34 29 0a   (function +24).
4e50: 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61  #define tramp_da
4e60: 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a  ta(function)  \.
4e70: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e    *(unsigned lon
4e80: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  g *) (function +
4e90: 33 32 29 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  32).#endif.#if d
4ea0: 65 66 69 6e 65 64 28 5f 5f 73 70 61 72 63 5f 5f  efined(__sparc__
4eb0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f  ) && !defined(__
4ec0: 73 70 61 72 63 36 34 5f 5f 29 0a 20 20 2f 2a 20  sparc64__).  /* 
4ed0: 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20  function:.   *  
4ee0: 20 20 73 65 74 68 69 20 25 68 69 28 3c 76 61 72    sethi %hi(<var
4ef0: 69 61 62 6c 65 3e 29 2c 25 67 31 09 30 33 30 30  iable>),%g1.0300
4f00: 30 30 30 30 20 7c 20 28 3c 76 61 72 69 61 62 6c  0000 | (<variabl
4f10: 65 3e 20 3e 3e 20 31 30 29 0a 20 20 20 2a 20 20  e> >> 10).   *  
4f20: 20 20 73 65 74 68 69 20 25 68 69 28 3c 64 61 74    sethi %hi(<dat
4f30: 61 3e 29 2c 25 67 32 09 09 30 35 30 30 30 30 30  a>),%g2..0500000
4f40: 30 20 7c 20 28 3c 64 61 74 61 3e 20 3e 3e 20 31  0 | (<data> >> 1
4f50: 30 29 0a 20 20 20 2a 20 20 20 20 6f 72 20 25 67  0).   *    or %g
4f60: 32 2c 25 6c 6f 28 3c 64 61 74 61 3e 29 2c 25 67  2,%lo(<data>),%g
4f70: 32 09 09 38 34 31 30 41 30 30 30 20 7c 20 28 3c  2..8410A000 | (<
4f80: 64 61 74 61 3e 20 26 20 30 78 33 66 66 29 0a 20  data> & 0x3ff). 
4f90: 20 20 2a 20 20 20 20 73 74 20 25 67 32 2c 5b 25    *    st %g2,[%
4fa0: 67 31 2b 25 6c 6f 28 3c 76 61 72 69 61 62 6c 65  g1+%lo(<variable
4fb0: 3e 29 5d 09 43 34 32 30 36 30 30 30 20 7c 20 28  >)].C4206000 | (
4fc0: 3c 76 61 72 69 61 62 6c 65 3e 20 26 20 30 78 33  <variable> & 0x3
4fd0: 66 66 29 0a 20 20 20 2a 20 20 20 20 73 65 74 68  ff).   *    seth
4fe0: 69 20 25 68 69 28 3c 61 64 64 72 65 73 73 3e 29  i %hi(<address>)
4ff0: 2c 25 67 31 09 30 33 30 30 30 30 30 30 20 7c 20  ,%g1.03000000 | 
5000: 28 3c 61 64 64 72 65 73 73 3e 20 3e 3e 20 31 30  (<address> >> 10
5010: 29 0a 20 20 20 2a 20 20 20 20 6a 6d 70 20 25 67  ).   *    jmp %g
5020: 31 2b 25 6c 6f 28 3c 61 64 64 72 65 73 73 3e 29  1+%lo(<address>)
5030: 09 09 38 31 43 30 36 30 30 30 20 7c 20 28 3c 61  ..81C06000 | (<a
5040: 64 64 72 65 73 73 3e 20 26 20 30 78 33 66 66 29  ddress> & 0x3ff)
5050: 0a 20 20 20 2a 20 20 20 20 6e 6f 70 09 09 09 09  .   *    nop....
5060: 30 31 30 30 30 30 30 30 0a 20 20 20 2a 2f 0a 23  01000000.   */.#
5070: 64 65 66 69 6e 65 20 68 69 28 77 6f 72 64 29 20  define hi(word) 
5080: 20 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67   ((unsigned long
5090: 29 20 28 77 6f 72 64 29 20 3e 3e 20 31 30 29 0a  ) (word) >> 10).
50a0: 23 64 65 66 69 6e 65 20 6c 6f 28 77 6f 72 64 29  #define lo(word)
50b0: 20 20 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e    ((unsigned lon
50c0: 67 29 20 28 77 6f 72 64 29 20 26 20 30 78 33 66  g) (word) & 0x3f
50d0: 66 29 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28  f).  *(long *) (
50e0: 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20  function + 0) = 
50f0: 30 78 30 33 30 30 30 30 30 30 20 7c 20 68 69 28  0x03000000 | hi(
5100: 76 61 72 69 61 62 6c 65 29 3b 0a 20 20 2a 28 6c  variable);.  *(l
5110: 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ong *) (function
5120: 20 2b 20 34 29 20 3d 20 30 78 30 35 30 30 30 30   + 4) = 0x050000
5130: 30 30 20 7c 20 68 69 28 64 61 74 61 29 3b 0a 20  00 | hi(data);. 
5140: 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63   *(long *) (func
5150: 74 69 6f 6e 20 2b 20 38 29 20 3d 20 30 78 38 34  tion + 8) = 0x84
5160: 31 30 41 30 30 30 20 7c 20 6c 6f 28 64 61 74 61  10A000 | lo(data
5170: 29 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28  );.  *(long *) (
5180: 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d 20  function +12) = 
5190: 30 78 43 34 32 30 36 30 30 30 20 7c 20 6c 6f 28  0xC4206000 | lo(
51a0: 76 61 72 69 61 62 6c 65 29 3b 0a 20 20 2a 28 6c  variable);.  *(l
51b0: 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ong *) (function
51c0: 20 2b 31 36 29 20 3d 20 30 78 30 33 30 30 30 30   +16) = 0x030000
51d0: 30 30 20 7c 20 68 69 28 61 64 64 72 65 73 73 29  00 | hi(address)
51e0: 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66  ;.  *(long *) (f
51f0: 75 6e 63 74 69 6f 6e 20 2b 32 30 29 20 3d 20 30  unction +20) = 0
5200: 78 38 31 43 30 36 30 30 30 20 7c 20 6c 6f 28 61  x81C06000 | lo(a
5210: 64 64 72 65 73 73 29 3b 0a 20 20 2a 28 6c 6f 6e  ddress);.  *(lon
5220: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  g *) (function +
5230: 32 34 29 20 3d 20 30 78 30 31 30 30 30 30 30 30  24) = 0x01000000
5240: 3b 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72 61  ;.#define is_tra
5250: 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a  mp(function)  \.
5260: 20 20 28 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75    (*(long *) (fu
5270: 6e 63 74 69 6f 6e 20 2b 20 30 29 20 26 20 30 78  nction + 0) & 0x
5280: 66 66 63 30 30 30 30 30 29 20 3d 3d 20 30 78 30  ffc00000) == 0x0
5290: 33 30 30 30 30 30 30 20 26 26 20 5c 0a 20 20 28  3000000 && \.  (
52a0: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74  *(long *) (funct
52b0: 69 6f 6e 20 2b 20 34 29 20 26 20 30 78 66 66 63  ion + 4) & 0xffc
52c0: 30 30 30 30 30 29 20 3d 3d 20 30 78 30 35 30 30  00000) == 0x0500
52d0: 30 30 30 30 20 26 26 20 5c 0a 20 20 28 2a 28 6c  0000 && \.  (*(l
52e0: 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ong *) (function
52f0: 20 2b 20 38 29 20 26 20 30 78 66 66 66 66 66 63   + 8) & 0xfffffc
5300: 30 30 29 20 3d 3d 20 30 78 38 34 31 30 41 30 30  00) == 0x8410A00
5310: 30 20 26 26 20 5c 0a 20 20 28 2a 28 6c 6f 6e 67  0 && \.  (*(long
5320: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31   *) (function +1
5330: 32 29 20 26 20 30 78 66 66 66 66 66 63 30 30 29  2) & 0xfffffc00)
5340: 20 3d 3d 20 30 78 43 34 32 30 36 30 30 30 20 26   == 0xC4206000 &
5350: 26 20 5c 0a 20 20 28 2a 28 6c 6f 6e 67 20 2a 29  & \.  (*(long *)
5360: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20   (function +16) 
5370: 26 20 30 78 66 66 63 30 30 30 30 30 29 20 3d 3d  & 0xffc00000) ==
5380: 20 30 78 30 33 30 30 30 30 30 30 20 26 26 20 5c   0x03000000 && \
5390: 0a 20 20 28 2a 28 6c 6f 6e 67 20 2a 29 20 28 66  .  (*(long *) (f
53a0: 75 6e 63 74 69 6f 6e 20 2b 32 30 29 20 26 20 30  unction +20) & 0
53b0: 78 66 66 66 66 66 63 30 30 29 20 3d 3d 20 30 78  xfffffc00) == 0x
53c0: 38 31 43 30 36 30 30 30 20 26 26 20 5c 0a 20 20  81C06000 && \.  
53d0: 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63   *(long *) (func
53e0: 74 69 6f 6e 20 2b 32 34 29 20 20 20 20 20 20 20  tion +24)       
53f0: 20 20 20 20 20 20 20 20 3d 3d 20 30 78 30 31 30          == 0x010
5400: 30 30 30 30 30 0a 23 64 65 66 69 6e 65 20 68 69  00000.#define hi
5410: 6c 6f 28 68 69 77 6f 72 64 2c 6c 6f 77 6f 72 64  lo(hiword,loword
5420: 29 20 20 28 28 28 68 69 77 6f 72 64 29 20 3c 3c  )  (((hiword) <<
5430: 20 31 30 29 20 7c 20 28 28 6c 6f 77 6f 72 64 29   10) | ((loword)
5440: 20 26 20 30 78 33 66 66 29 29 0a 23 64 65 66 69   & 0x3ff)).#defi
5450: 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 65 73 73  ne tramp_address
5460: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20  (function)  \.  
5470: 68 69 6c 6f 28 2a 28 6c 6f 6e 67 20 2a 29 20 28  hilo(*(long *) (
5480: 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 2c 20 2a  function +16), *
5490: 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69  (long *) (functi
54a0: 6f 6e 20 2b 32 30 29 29 0a 23 64 65 66 69 6e 65  on +20)).#define
54b0: 20 74 72 61 6d 70 5f 76 61 72 69 61 62 6c 65 28   tramp_variable(
54c0: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68  function)  \.  h
54d0: 69 6c 6f 28 2a 28 6c 6f 6e 67 20 2a 29 20 28 66  ilo(*(long *) (f
54e0: 75 6e 63 74 69 6f 6e 20 2b 20 30 29 2c 20 2a 28  unction + 0), *(
54f0: 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f  long *) (functio
5500: 6e 20 2b 31 32 29 29 0a 23 64 65 66 69 6e 65 20  n +12)).#define 
5510: 74 72 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 74  tramp_data(funct
5520: 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c 6f 28 2a  ion)  \.  hilo(*
5530: 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69  (long *) (functi
5540: 6f 6e 20 2b 20 34 29 2c 20 2a 28 6c 6f 6e 67 20  on + 4), *(long 
5550: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38  *) (function + 8
5560: 29 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  )).#endif.#ifdef
5570: 20 5f 5f 73 70 61 72 63 36 34 5f 5f 0a 20 20 2f   __sparc64__.  /
5580: 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a  * function:.   *
5590: 20 20 20 20 72 64 20 25 70 63 2c 25 67 31 09 09      rd %pc,%g1..
55a0: 09 38 33 34 31 34 30 30 30 0a 20 20 20 2a 20 20  .83414000.   *  
55b0: 20 20 6c 64 78 20 5b 25 67 31 2b 32 34 5d 2c 25    ldx [%g1+24],%
55c0: 67 32 09 09 43 34 35 38 36 30 31 38 0a 20 20 20  g2..C4586018.   
55d0: 2a 20 20 20 20 6c 64 78 20 5b 25 67 31 2b 33 32  *    ldx [%g1+32
55e0: 5d 2c 25 67 33 09 09 43 36 35 38 36 30 32 30 0a  ],%g3..C6586020.
55f0: 20 20 20 2a 20 20 20 20 6c 64 78 20 5b 25 67 31     *    ldx [%g1
5600: 2b 34 30 5d 2c 25 67 31 09 09 43 32 35 38 36 30  +40],%g1..C25860
5610: 32 38 0a 20 20 20 2a 20 20 20 20 6a 6d 70 20 25  28.   *    jmp %
5620: 67 31 09 09 09 09 38 31 43 30 34 30 30 30 0a 20  g1....81C04000. 
5630: 20 20 2a 20 20 20 20 73 74 78 20 25 67 33 2c 5b    *    stx %g3,[
5640: 25 67 32 5d 09 09 09 43 36 37 30 38 30 30 30 0a  %g2]...C6708000.
5650: 20 20 20 2a 20 20 20 20 2e 6c 6f 6e 67 20 68 69     *    .long hi
5660: 67 68 33 32 28 3c 76 61 72 69 61 62 6c 65 3e 29  gh32(<variable>)
5670: 09 3c 76 61 72 69 61 62 6c 65 3e 20 3e 3e 20 33  .<variable> >> 3
5680: 32 0a 20 20 20 2a 20 20 20 20 2e 6c 6f 6e 67 20  2.   *    .long 
5690: 6c 6f 77 33 32 28 3c 76 61 72 69 61 62 6c 65 3e  low32(<variable>
56a0: 29 09 09 3c 76 61 72 69 61 62 6c 65 3e 20 26 20  )..<variable> & 
56b0: 30 78 66 66 66 66 66 66 66 66 0a 20 20 20 2a 20  0xffffffff.   * 
56c0: 20 20 20 2e 6c 6f 6e 67 20 68 69 67 68 33 32 28     .long high32(
56d0: 3c 64 61 74 61 3e 29 09 09 3c 64 61 74 61 3e 20  <data>)..<data> 
56e0: 3e 3e 20 33 32 0a 20 20 20 2a 20 20 20 20 2e 6c  >> 32.   *    .l
56f0: 6f 6e 67 20 6c 6f 77 33 32 28 3c 64 61 74 61 3e  ong low32(<data>
5700: 29 09 09 3c 64 61 74 61 3e 20 26 20 30 78 66 66  )..<data> & 0xff
5710: 66 66 66 66 66 66 0a 20 20 20 2a 20 20 20 20 2e  ffffff.   *    .
5720: 6c 6f 6e 67 20 68 69 67 68 33 32 28 3c 61 64 64  long high32(<add
5730: 72 65 73 73 3e 29 09 09 3c 61 64 64 72 65 73 73  ress>)..<address
5740: 3e 20 3e 3e 20 33 32 0a 20 20 20 2a 20 20 20 20  > >> 32.   *    
5750: 2e 6c 6f 6e 67 20 6c 6f 77 33 32 28 3c 61 64 64  .long low32(<add
5760: 72 65 73 73 3e 29 09 09 3c 61 64 64 72 65 73 73  ress>)..<address
5770: 3e 20 26 20 30 78 66 66 66 66 66 66 66 66 0a 20  > & 0xffffffff. 
5780: 20 20 2a 2f 0a 20 20 2a 28 69 6e 74 20 2a 29 20    */.  *(int *) 
5790: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20   (function + 0) 
57a0: 3d 20 30 78 38 33 34 31 34 30 30 30 3b 0a 20 20  = 0x83414000;.  
57b0: 2a 28 69 6e 74 20 2a 29 20 20 28 66 75 6e 63 74  *(int *)  (funct
57c0: 69 6f 6e 20 2b 20 34 29 20 3d 20 30 78 43 34 35  ion + 4) = 0xC45
57d0: 38 36 30 31 38 3b 0a 20 20 2a 28 69 6e 74 20 2a  86018;.  *(int *
57e0: 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38  )  (function + 8
57f0: 29 20 3d 20 30 78 43 36 35 38 36 30 32 30 3b 0a  ) = 0xC6586020;.
5800: 20 20 2a 28 69 6e 74 20 2a 29 20 20 28 66 75 6e    *(int *)  (fun
5810: 63 74 69 6f 6e 20 2b 31 32 29 20 3d 20 30 78 43  ction +12) = 0xC
5820: 32 35 38 36 30 32 38 3b 0a 20 20 2a 28 69 6e 74  2586028;.  *(int
5830: 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b   *)  (function +
5840: 31 36 29 20 3d 20 30 78 38 31 43 30 34 30 30 30  16) = 0x81C04000
5850: 3b 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 28 66  ;.  *(int *)  (f
5860: 75 6e 63 74 69 6f 6e 20 2b 32 30 29 20 3d 20 30  unction +20) = 0
5870: 78 43 36 37 30 38 30 30 30 3b 0a 20 20 2a 28 6c  xC6708000;.  *(l
5880: 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ong *) (function
5890: 20 2b 32 34 29 20 3d 20 28 6c 6f 6e 67 29 20 76   +24) = (long) v
58a0: 61 72 69 61 62 6c 65 3b 0a 20 20 2a 28 6c 6f 6e  ariable;.  *(lon
58b0: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  g *) (function +
58c0: 33 32 29 20 3d 20 28 6c 6f 6e 67 29 20 64 61 74  32) = (long) dat
58d0: 61 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28  a;.  *(long *) (
58e0: 66 75 6e 63 74 69 6f 6e 20 2b 34 30 29 20 3d 20  function +40) = 
58f0: 28 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 3b 0a  (long) address;.
5900: 23 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70  #define is_tramp
5910: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20  (function)  \.  
5920: 2a 28 69 6e 74 20 2a 29 20 20 28 66 75 6e 63 74  *(int *)  (funct
5930: 69 6f 6e 20 2b 20 30 29 20 3d 3d 20 30 78 38 33  ion + 0) == 0x83
5940: 34 31 34 30 30 30 20 26 26 20 5c 0a 20 20 2a 28  414000 && \.  *(
5950: 69 6e 74 20 2a 29 20 20 28 66 75 6e 63 74 69 6f  int *)  (functio
5960: 6e 20 2b 20 34 29 20 3d 3d 20 30 78 43 34 35 38  n + 4) == 0xC458
5970: 36 30 31 38 20 26 26 20 5c 0a 20 20 2a 28 69 6e  6018 && \.  *(in
5980: 74 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20  t *)  (function 
5990: 2b 20 38 29 20 3d 3d 20 30 78 43 36 35 38 36 30  + 8) == 0xC65860
59a0: 32 30 20 26 26 20 5c 0a 20 20 2a 28 69 6e 74 20  20 && \.  *(int 
59b0: 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31  *)  (function +1
59c0: 32 29 20 3d 3d 20 30 78 43 32 35 38 36 30 32 38  2) == 0xC2586028
59d0: 20 26 26 20 5c 0a 20 20 2a 28 69 6e 74 20 2a 29   && \.  *(int *)
59e0: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29    (function +16)
59f0: 20 3d 3d 20 30 78 38 31 43 30 34 30 30 30 20 26   == 0x81C04000 &
5a00: 26 20 5c 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20  & \.  *(int *)  
5a10: 28 66 75 6e 63 74 69 6f 6e 20 2b 32 30 29 20 3d  (function +20) =
5a20: 3d 20 30 78 43 36 37 30 38 30 30 30 0a 23 64 65  = 0xC6708000.#de
5a30: 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 65  fine tramp_addre
5a40: 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a  ss(function)  \.
5a50: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e    *(long *) (fun
5a60: 63 74 69 6f 6e 20 2b 34 30 29 0a 23 64 65 66 69  ction +40).#defi
5a70: 6e 65 20 74 72 61 6d 70 5f 76 61 72 69 61 62 6c  ne tramp_variabl
5a80: 65 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20  e(function)  \. 
5a90: 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63   *(long *) (func
5aa0: 74 69 6f 6e 20 2b 32 34 29 0a 23 64 65 66 69 6e  tion +24).#defin
5ab0: 65 20 74 72 61 6d 70 5f 64 61 74 61 28 66 75 6e  e tramp_data(fun
5ac0: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 6c 6f  ction)  \.  *(lo
5ad0: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  ng *) (function 
5ae0: 2b 33 32 29 0a 23 65 6e 64 69 66 0a 23 69 66 64  +32).#endif.#ifd
5af0: 65 66 20 5f 5f 61 6c 70 68 61 5f 5f 0a 20 20 2f  ef __alpha__.  /
5b00: 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a  * function:.   *
5b10: 20 20 20 20 62 72 20 24 31 2c 66 75 6e 63 74 69      br $1,functi
5b20: 6f 6e 2e 2e 6e 67 09 30 30 20 30 30 20 32 30 20  on..ng.00 00 20 
5b30: 43 30 0a 20 20 20 2a 20 66 75 6e 63 74 69 6f 6e  C0.   * function
5b40: 2e 2e 6e 67 3a 0a 20 20 20 2a 20 20 20 20 6c 64  ..ng:.   *    ld
5b50: 71 20 24 32 2c 32 30 28 24 31 29 09 09 31 34 20  q $2,20($1)..14 
5b60: 30 30 20 34 31 20 41 34 0a 20 20 20 2a 20 20 20  00 41 A4.   *   
5b70: 20 6c 64 71 20 24 33 2c 32 38 28 24 31 29 09 09   ldq $3,28($1)..
5b80: 31 43 20 30 30 20 36 31 20 41 34 0a 20 20 20 2a  1C 00 61 A4.   *
5b90: 20 20 20 20 6c 64 71 20 24 32 37 2c 33 36 28 24      ldq $27,36($
5ba0: 31 29 09 09 32 34 20 30 30 20 36 31 20 41 37 0a  1)..24 00 61 A7.
5bb0: 20 20 20 2a 20 20 20 20 73 74 71 20 24 32 2c 30     *    stq $2,0
5bc0: 28 24 33 29 09 09 30 30 20 30 30 20 34 33 20 42  ($3)..00 00 43 B
5bd0: 34 0a 20 20 20 2a 20 20 20 20 6a 6d 70 20 24 33  4.   *    jmp $3
5be0: 31 2c 28 24 32 37 29 2c 30 09 09 30 30 20 30 30  1,($27),0..00 00
5bf0: 20 46 42 20 36 42 0a 20 20 20 2a 20 20 20 20 2e   FB 6B.   *    .
5c00: 71 75 61 64 20 3c 64 61 74 61 3e 09 09 3c 64 61  quad <data>..<da
5c10: 74 61 3e 0a 20 20 20 2a 20 20 20 20 2e 71 75 61  ta>.   *    .qua
5c20: 64 20 3c 76 61 72 69 61 62 6c 65 3e 09 3c 76 61  d <variable>.<va
5c30: 72 69 61 62 6c 65 3e 0a 20 20 20 2a 20 20 20 20  riable>.   *    
5c40: 2e 71 75 61 64 20 3c 61 64 64 72 65 73 73 3e 09  .quad <address>.
5c50: 09 3c 61 64 64 72 65 73 73 3e 0a 20 20 20 2a 2f  .<address>.   */
5c60: 0a 20 20 7b 20 73 74 61 74 69 63 20 69 6e 74 20  .  { static int 
5c70: 63 6f 64 65 20 5b 36 5d 20 3d 0a 20 20 20 20 20  code [6] =.     
5c80: 20 7b 20 30 78 43 30 32 30 30 30 30 30 2c 20 30   { 0xC0200000, 0
5c90: 78 41 34 34 31 30 30 31 34 2c 20 30 78 41 34 36  xA4410014, 0xA46
5ca0: 31 30 30 31 43 2c 20 30 78 41 37 36 31 30 30 32  1001C, 0xA761002
5cb0: 34 2c 20 30 78 42 34 34 33 30 30 30 30 2c 20 30  4, 0xB4430000, 0
5cc0: 78 36 42 46 42 30 30 30 30 20 7d 3b 0a 20 20 20  x6BFB0000 };.   
5cd0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 20   int i;.    for 
5ce0: 28 69 3d 30 3b 20 69 3c 36 3b 20 69 2b 2b 29 20  (i=0; i<6; i++) 
5cf0: 7b 20 28 28 69 6e 74 20 2a 29 20 66 75 6e 63 74  { ((int *) funct
5d00: 69 6f 6e 29 5b 69 5d 20 3d 20 63 6f 64 65 5b 69  ion)[i] = code[i
5d10: 5d 3b 20 7d 0a 20 20 20 20 28 28 6c 6f 6e 67 20  ]; }.    ((long 
5d20: 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 33 5d 20  *) function)[3] 
5d30: 3d 20 28 6c 6f 6e 67 29 20 64 61 74 61 3b 0a 20  = (long) data;. 
5d40: 20 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e     ((long *) fun
5d50: 63 74 69 6f 6e 29 5b 34 5d 20 3d 20 28 6c 6f 6e  ction)[4] = (lon
5d60: 67 29 20 76 61 72 69 61 62 6c 65 3b 0a 20 20 20  g) variable;.   
5d70: 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74   ((long *) funct
5d80: 69 6f 6e 29 5b 35 5d 20 3d 20 28 6c 6f 6e 67 29  ion)[5] = (long)
5d90: 20 61 64 64 72 65 73 73 3b 0a 20 20 7d 0a 23 64   address;.  }.#d
5da0: 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 28 66  efine is_tramp(f
5db0: 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 28  unction)  \.  ((
5dc0: 69 6e 74 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29  int *) function)
5dd0: 5b 30 5d 20 3d 3d 20 30 78 43 30 32 30 30 30 30  [0] == 0xC020000
5de0: 30 20 26 26 20 5c 0a 20 20 28 28 69 6e 74 20 2a  0 && \.  ((int *
5df0: 29 20 66 75 6e 63 74 69 6f 6e 29 5b 31 5d 20 3d  ) function)[1] =
5e00: 3d 20 30 78 41 34 34 31 30 30 31 34 20 26 26 20  = 0xA4410014 && 
5e10: 5c 0a 20 20 28 28 69 6e 74 20 2a 29 20 66 75 6e  \.  ((int *) fun
5e20: 63 74 69 6f 6e 29 5b 32 5d 20 3d 3d 20 30 78 41  ction)[2] == 0xA
5e30: 34 36 31 30 30 31 43 20 26 26 20 5c 0a 20 20 28  461001C && \.  (
5e40: 28 69 6e 74 20 2a 29 20 66 75 6e 63 74 69 6f 6e  (int *) function
5e50: 29 5b 33 5d 20 3d 3d 20 30 78 41 37 36 31 30 30  )[3] == 0xA76100
5e60: 32 34 20 26 26 20 5c 0a 20 20 28 28 69 6e 74 20  24 && \.  ((int 
5e70: 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 34 5d 20  *) function)[4] 
5e80: 3d 3d 20 30 78 42 34 34 33 30 30 30 30 20 26 26  == 0xB4430000 &&
5e90: 20 5c 0a 20 20 28 28 69 6e 74 20 2a 29 20 66 75   \.  ((int *) fu
5ea0: 6e 63 74 69 6f 6e 29 5b 35 5d 20 3d 3d 20 30 78  nction)[5] == 0x
5eb0: 36 42 46 42 30 30 30 30 0a 23 64 65 66 69 6e 65  6BFB0000.#define
5ec0: 20 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66   tramp_address(f
5ed0: 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 28  unction)  \.  ((
5ee0: 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e  long *) function
5ef0: 29 5b 35 5d 0a 23 64 65 66 69 6e 65 20 74 72 61  )[5].#define tra
5f00: 6d 70 5f 76 61 72 69 61 62 6c 65 28 66 75 6e 63  mp_variable(func
5f10: 74 69 6f 6e 29 20 20 5c 0a 20 20 28 28 6c 6f 6e  tion)  \.  ((lon
5f20: 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 34  g *) function)[4
5f30: 5d 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f  ].#define tramp_
5f40: 64 61 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 20  data(function)  
5f50: 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75  \.  ((long *) fu
5f60: 6e 63 74 69 6f 6e 29 5b 33 5d 0a 23 65 6e 64 69  nction)[3].#endi
5f70: 66 0a 23 69 66 64 65 66 20 5f 5f 68 70 70 61 6f  f.#ifdef __hppao
5f80: 6c 64 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 69  ld__.  /* functi
5f90: 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 6c 64 69 6c  on:.   *    ldil
5fa0: 20 4c 27 3c 64 61 74 61 3e 2c 25 72 32 30 09 09   L'<data>,%r20..
5fb0: 32 32 38 30 30 30 30 30 20 7c 20 68 69 28 3c 64  22800000 | hi(<d
5fc0: 61 74 61 3e 29 0a 20 20 20 2a 20 20 20 20 6c 64  ata>).   *    ld
5fd0: 69 6c 20 4c 27 3c 76 61 72 69 61 62 6c 65 3e 2c  il L'<variable>,
5fe0: 25 72 31 39 09 09 32 32 36 30 30 30 30 30 20 7c  %r19..22600000 |
5ff0: 20 68 69 28 3c 76 61 72 69 61 62 6c 65 3e 29 0a   hi(<variable>).
6000: 20 20 20 2a 20 20 20 20 6c 64 6f 20 52 27 3c 64     *    ldo R'<d
6010: 61 74 61 3e 28 25 72 32 30 29 2c 25 72 32 30 09  ata>(%r20),%r20.
6020: 09 33 36 39 34 30 30 30 30 20 7c 20 6c 6f 28 3c  .36940000 | lo(<
6030: 64 61 74 61 3e 29 0a 20 20 20 2a 20 20 20 20 73  data>).   *    s
6040: 74 77 20 25 72 32 30 2c 52 27 3c 76 61 72 69 61  tw %r20,R'<varia
6050: 62 6c 65 3e 28 25 72 31 39 29 09 36 41 37 34 30  ble>(%r19).6A740
6060: 30 30 30 20 7c 20 6c 6f 28 3c 76 61 72 69 61 62  000 | lo(<variab
6070: 6c 65 3e 29 0a 20 20 20 2a 20 20 20 20 6c 64 69  le>).   *    ldi
6080: 6c 20 4c 27 3c 61 64 64 72 65 73 73 3e 2c 25 72  l L'<address>,%r
6090: 32 31 09 09 32 32 41 30 30 30 30 30 20 7c 20 68  21..22A00000 | h
60a0: 69 28 3c 61 64 64 72 65 73 73 3e 29 0a 20 20 20  i(<address>).   
60b0: 2a 20 20 20 20 6c 64 6f 20 52 27 3c 61 64 64 72  *    ldo R'<addr
60c0: 65 73 73 3e 28 25 72 32 31 29 2c 25 72 32 31 09  ess>(%r21),%r21.
60d0: 33 36 42 35 30 30 30 30 20 7c 20 6c 6f 28 3c 61  36B50000 | lo(<a
60e0: 64 64 72 65 73 73 3e 29 0a 20 20 20 2a 20 20 20  ddress>).   *   
60f0: 20 62 62 2c 3e 3d 2c 6e 20 25 72 32 31 2c 33 30   bb,>=,n %r21,30
6100: 2c 66 75 6e 63 74 69 6f 6e 32 09 43 37 44 35 43  ,function2.C7D5C
6110: 30 31 32 0a 20 20 20 2a 20 20 20 20 64 65 70 69  012.   *    depi
6120: 20 30 2c 33 31 2c 32 2c 25 72 32 31 09 09 44 36   0,31,2,%r21..D6
6130: 41 30 31 43 31 45 0a 20 20 20 2a 20 20 20 20 6c  A01C1E.   *    l
6140: 64 77 20 34 28 30 2c 25 72 32 31 29 2c 25 72 31  dw 4(0,%r21),%r1
6150: 39 09 09 34 41 42 33 30 30 30 38 0a 20 20 20 2a  9..4AB30008.   *
6160: 20 20 20 20 6c 64 77 20 30 28 30 2c 25 72 32 31      ldw 0(0,%r21
6170: 29 2c 25 72 32 31 09 09 34 41 42 35 30 30 30 30  ),%r21..4AB50000
6180: 0a 20 20 20 2a 20 66 75 6e 63 74 69 6f 6e 32 3a  .   * function2:
6190: 0a 20 20 20 2a 20 20 20 20 6c 64 73 69 64 20 28  .   *    ldsid (
61a0: 30 2c 25 72 32 31 29 2c 25 72 31 09 09 30 32 41  0,%r21),%r1..02A
61b0: 30 31 30 41 31 0a 20 20 20 2a 20 20 20 20 6d 74  010A1.   *    mt
61c0: 73 70 20 25 72 31 2c 25 73 72 30 09 09 09 30 30  sp %r1,%sr0...00
61d0: 30 31 31 38 32 30 0a 20 20 20 2a 20 20 20 20 62  011820.   *    b
61e0: 65 2c 6e 20 30 28 25 73 72 30 2c 25 72 32 31 29  e,n 0(%sr0,%r21)
61f0: 09 09 45 32 41 30 30 30 30 32 0a 20 20 20 2a 20  ..E2A00002.   * 
6200: 20 20 20 6e 6f 70 09 09 09 09 30 38 30 30 30 32     nop....080002
6210: 34 30 0a 20 20 20 2a 2f 0a 20 20 2f 2a 20 57 68  40.   */.  /* Wh
6220: 65 6e 20 64 65 63 6f 64 69 6e 67 20 61 20 32 31  en decoding a 21
6230: 2d 62 69 74 20 61 72 67 75 6d 65 6e 74 20 69 6e  -bit argument in
6240: 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c   an instruction,
6250: 20 74 68 65 20 68 70 70 61 20 70 65 72 66 6f 72   the hppa perfor
6260: 6d 73 0a 20 20 20 2a 20 74 68 65 20 66 6f 6c 6c  ms.   * the foll
6270: 6f 77 69 6e 67 20 62 69 74 20 6d 61 6e 69 70 75  owing bit manipu
6280: 6c 61 74 69 6f 6e 3a 0a 20 20 20 2a 20 61 73 73  lation:.   * ass
6290: 65 6d 62 6c 65 32 31 3a 20 78 5b 32 30 5d 2e 2e  emble21: x[20]..
62a0: 2e 78 5b 30 5d 0a 20 20 20 2a 20 20 20 20 20 20  .x[0].   *      
62b0: 20 2d 2d 3e 20 78 5b 30 5d 20 78 5b 31 31 5d 2e   --> x[0] x[11].
62c0: 2e 2e 78 5b 31 5d 20 78 5b 31 35 5d 2e 2e 78 5b  ..x[1] x[15]..x[
62d0: 31 34 5d 20 78 5b 32 30 5d 2e 2e 2e 78 5b 31 36  14] x[20]...x[16
62e0: 5d 20 78 5b 31 33 5d 2e 2e 78 5b 31 32 5d 0a 20  ] x[13]..x[12]. 
62f0: 20 20 2a 20 57 68 65 6e 20 65 6e 63 6f 64 69 6e    * When encodin
6300: 67 20 61 20 32 31 2d 62 69 74 20 61 72 67 75 6d  g a 21-bit argum
6310: 65 6e 74 20 69 6e 74 6f 20 61 6e 20 69 6e 73 74  ent into an inst
6320: 72 75 63 74 69 6f 6e 2c 20 77 65 20 6e 65 65 64  ruction, we need
6330: 20 74 68 65 0a 20 20 20 2a 20 74 6f 20 70 65 72   the.   * to per
6340: 66 6f 72 6d 20 74 68 65 20 72 65 76 65 72 73 65  form the reverse
6350: 20 70 65 72 6d 75 74 61 74 69 6f 6e 3a 0a 20 20   permutation:.  
6360: 20 2a 20 70 65 72 6d 75 74 65 32 31 3a 20 20 79   * permute21:  y
6370: 5b 32 30 5d 2e 2e 2e 79 5b 30 5d 0a 20 20 20 2a  [20]...y[0].   *
6380: 20 20 20 20 20 20 20 2d 2d 3e 20 79 5b 36 5d 2e         --> y[6].
6390: 2e 2e 79 5b 32 5d 20 79 5b 38 5d 2e 2e 79 5b 37  ..y[2] y[8]..y[7
63a0: 5d 20 79 5b 31 5d 2e 2e 79 5b 30 5d 20 79 5b 31  ] y[1]..y[0] y[1
63b0: 39 5d 2e 2e 2e 79 5b 39 5d 20 79 5b 32 30 5d 0a  9]...y[9] y[20].
63c0: 20 20 20 2a 2f 0a 23 64 65 66 69 6e 65 20 61 73     */.#define as
63d0: 73 65 6d 62 6c 65 32 31 28 78 29 20 20 5c 0a 20  semble21(x)  \. 
63e0: 20 28 28 28 28 78 29 20 26 20 30 78 31 29 20 3c   ((((x) & 0x1) <
63f0: 3c 20 32 30 29 20 7c 20 28 28 28 78 29 20 26 20  < 20) | (((x) & 
6400: 30 78 46 46 45 29 20 3c 3c 20 38 29 20 7c 20 5c  0xFFE) << 8) | \
6410: 0a 20 20 20 28 28 28 78 29 20 26 20 30 78 43 30  .   (((x) & 0xC0
6420: 30 30 29 20 3e 3e 20 37 29 20 7c 20 28 28 28 78  00) >> 7) | (((x
6430: 29 20 26 20 30 78 31 46 30 30 30 30 29 20 3e 3e  ) & 0x1F0000) >>
6440: 20 31 34 29 20 7c 20 28 28 28 78 29 20 26 20 30   14) | (((x) & 0
6450: 78 33 30 30 30 29 20 3e 3e 20 31 32 29 29 0a 23  x3000) >> 12)).#
6460: 64 65 66 69 6e 65 20 70 65 72 6d 75 74 65 32 31  define permute21
6470: 28 79 29 20 20 5c 0a 20 20 28 28 28 28 79 29 20  (y)  \.  ((((y) 
6480: 26 20 30 78 37 43 29 20 3c 3c 20 31 34 29 20 7c  & 0x7C) << 14) |
6490: 20 28 28 28 79 29 20 26 20 30 78 31 38 30 29 20   (((y) & 0x180) 
64a0: 3c 3c 20 37 29 20 7c 20 28 28 28 79 29 20 26 20  << 7) | (((y) & 
64b0: 30 78 33 29 20 3c 3c 20 31 32 29 20 7c 20 5c 0a  0x3) << 12) | \.
64c0: 20 20 20 28 28 28 79 29 20 26 20 30 78 46 46 45     (((y) & 0xFFE
64d0: 30 30 29 20 3e 3e 20 38 29 20 7c 20 28 28 28 79  00) >> 8) | (((y
64e0: 29 20 26 20 30 78 31 30 30 30 30 30 29 20 3e 3e  ) & 0x100000) >>
64f0: 20 32 30 29 29 0a 23 64 65 66 69 6e 65 20 68 69   20)).#define hi
6500: 28 77 6f 72 64 29 20 20 70 65 72 6d 75 74 65 32  (word)  permute2
6510: 31 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  1((unsigned long
6520: 29 20 28 77 6f 72 64 29 20 3e 3e 20 31 31 29 0a  ) (word) >> 11).
6530: 23 64 65 66 69 6e 65 20 6c 6f 28 77 6f 72 64 29  #define lo(word)
6540: 20 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f    (((unsigned lo
6550: 6e 67 29 20 28 77 6f 72 64 29 20 26 20 30 78 37  ng) (word) & 0x7
6560: 46 46 29 20 3c 3c 20 31 29 0a 20 20 2a 28 6c 6f  FF) << 1).  *(lo
6570: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  ng *) (function 
6580: 2b 20 30 29 20 3d 20 30 78 32 32 38 30 30 30 30  + 0) = 0x2280000
6590: 30 20 7c 20 68 69 28 64 61 74 61 29 3b 0a 20 20  0 | hi(data);.  
65a0: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74  *(long *) (funct
65b0: 69 6f 6e 20 2b 20 34 29 20 3d 20 30 78 32 32 36  ion + 4) = 0x226
65c0: 30 30 30 30 30 20 7c 20 68 69 28 76 61 72 69 61  00000 | hi(varia
65d0: 62 6c 65 29 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a  ble);.  *(long *
65e0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29  ) (function + 8)
65f0: 20 3d 20 30 78 33 36 39 34 30 30 30 30 20 7c 20   = 0x36940000 | 
6600: 6c 6f 28 64 61 74 61 29 3b 0a 20 20 2a 28 6c 6f  lo(data);.  *(lo
6610: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  ng *) (function 
6620: 2b 31 32 29 20 3d 20 30 78 36 41 37 34 30 30 30  +12) = 0x6A74000
6630: 30 20 7c 20 6c 6f 28 76 61 72 69 61 62 6c 65 29  0 | lo(variable)
6640: 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66  ;.  *(long *) (f
6650: 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20 30  unction +16) = 0
6660: 78 32 32 41 30 30 30 30 30 20 7c 20 68 69 28 61  x22A00000 | hi(a
6670: 64 64 72 65 73 73 29 3b 0a 20 20 2a 28 6c 6f 6e  ddress);.  *(lon
6680: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  g *) (function +
6690: 32 30 29 20 3d 20 30 78 33 36 42 35 30 30 30 30  20) = 0x36B50000
66a0: 20 7c 20 6c 6f 28 61 64 64 72 65 73 73 29 3b 0a   | lo(address);.
66b0: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e    *(long *) (fun
66c0: 63 74 69 6f 6e 20 2b 32 34 29 20 3d 20 30 78 43  ction +24) = 0xC
66d0: 37 44 35 43 30 31 32 3b 0a 20 20 2a 28 6c 6f 6e  7D5C012;.  *(lon
66e0: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  g *) (function +
66f0: 32 38 29 20 3d 20 30 78 44 36 41 30 31 43 31 45  28) = 0xD6A01C1E
6700: 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66  ;.  *(long *) (f
6710: 75 6e 63 74 69 6f 6e 20 2b 33 32 29 20 3d 20 30  unction +32) = 0
6720: 78 34 41 42 33 30 30 30 38 3b 0a 20 20 2a 28 6c  x4AB30008;.  *(l
6730: 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ong *) (function
6740: 20 2b 33 36 29 20 3d 20 30 78 34 41 42 35 30 30   +36) = 0x4AB500
6750: 30 30 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20  00;.  *(long *) 
6760: 28 66 75 6e 63 74 69 6f 6e 20 2b 34 30 29 20 3d  (function +40) =
6770: 20 30 78 30 32 41 30 31 30 41 31 3b 0a 20 20 2a   0x02A010A1;.  *
6780: 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69  (long *) (functi
6790: 6f 6e 20 2b 34 34 29 20 3d 20 30 78 30 30 30 31  on +44) = 0x0001
67a0: 31 38 32 30 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a  1820;.  *(long *
67b0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 34 38 29  ) (function +48)
67c0: 20 3d 20 30 78 45 32 41 30 30 30 30 32 3b 0a 20   = 0xE2A00002;. 
67d0: 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63   *(long *) (func
67e0: 74 69 6f 6e 20 2b 35 32 29 20 3d 20 30 78 30 38  tion +52) = 0x08
67f0: 30 30 30 32 34 30 3b 0a 23 64 65 66 69 6e 65 20  000240;.#define 
6800: 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 6f  is_tramp(functio
6810: 6e 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 29 20  n)  \.  ((long) 
6820: 66 75 6e 63 74 69 6f 6e 20 26 20 33 29 20 3d 3d  function & 3) ==
6830: 20 30 20 26 26 20 5c 0a 20 20 28 2a 28 6c 6f 6e   0 && \.  (*(lon
6840: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  g *) (function +
6850: 20 30 29 20 26 20 30 78 66 66 65 30 30 30 30 30   0) & 0xffe00000
6860: 29 20 3d 3d 20 30 78 32 32 38 30 30 30 30 30 20  ) == 0x22800000 
6870: 26 26 20 5c 0a 20 20 28 2a 28 6c 6f 6e 67 20 2a  && \.  (*(long *
6880: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29  ) (function + 4)
6890: 20 26 20 30 78 66 66 65 30 30 30 30 30 29 20 3d   & 0xffe00000) =
68a0: 3d 20 30 78 32 32 36 30 30 30 30 30 20 26 26 20  = 0x22600000 && 
68b0: 5c 0a 20 20 28 2a 28 6c 6f 6e 67 20 2a 29 20 28  \.  (*(long *) (
68c0: 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 26 20  function + 8) & 
68d0: 30 78 66 66 66 66 66 30 30 30 29 20 3d 3d 20 30  0xfffff000) == 0
68e0: 78 33 36 39 34 30 30 30 30 20 26 26 20 5c 0a 20  x36940000 && \. 
68f0: 20 28 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e   (*(long *) (fun
6900: 63 74 69 6f 6e 20 2b 31 32 29 20 26 20 30 78 66  ction +12) & 0xf
6910: 66 66 66 66 30 30 30 29 20 3d 3d 20 30 78 36 41  ffff000) == 0x6A
6920: 37 34 30 30 30 30 20 26 26 20 5c 0a 20 20 28 2a  740000 && \.  (*
6930: 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69  (long *) (functi
6940: 6f 6e 20 2b 31 36 29 20 26 20 30 78 66 66 65 30  on +16) & 0xffe0
6950: 30 30 30 30 29 20 3d 3d 20 30 78 32 32 41 30 30  0000) == 0x22A00
6960: 30 30 30 20 26 26 20 5c 0a 20 20 28 2a 28 6c 6f  000 && \.  (*(lo
6970: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  ng *) (function 
6980: 2b 32 30 29 20 26 20 30 78 66 66 66 66 66 30 30  +20) & 0xfffff00
6990: 30 29 20 3d 3d 20 30 78 33 36 42 35 30 30 30 30  0) == 0x36B50000
69a0: 20 26 26 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a   && \.  *(long *
69b0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 34 29  ) (function +24)
69c0: 20 3d 3d 20 30 78 43 37 44 35 43 30 31 32 20 26   == 0xC7D5C012 &
69d0: 26 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20  & \.  *(long *) 
69e0: 28 66 75 6e 63 74 69 6f 6e 20 2b 32 38 29 20 3d  (function +28) =
69f0: 3d 20 30 78 44 36 41 30 31 43 31 45 20 26 26 20  = 0xD6A01C1E && 
6a00: 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66  \.  *(long *) (f
6a10: 75 6e 63 74 69 6f 6e 20 2b 33 32 29 20 3d 3d 20  unction +32) == 
6a20: 30 78 34 41 42 33 30 30 30 38 20 26 26 20 5c 0a  0x4AB30008 && \.
6a30: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e    *(long *) (fun
6a40: 63 74 69 6f 6e 20 2b 33 36 29 20 3d 3d 20 30 78  ction +36) == 0x
6a50: 34 41 42 35 30 30 30 30 20 26 26 20 5c 0a 20 20  4AB50000 && \.  
6a60: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74  *(long *) (funct
6a70: 69 6f 6e 20 2b 34 30 29 20 3d 3d 20 30 78 30 32  ion +40) == 0x02
6a80: 41 30 31 30 41 31 20 26 26 20 5c 0a 20 20 2a 28  A010A1 && \.  *(
6a90: 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f  long *) (functio
6aa0: 6e 20 2b 34 34 29 20 3d 3d 20 30 78 30 30 30 31  n +44) == 0x0001
6ab0: 31 38 32 30 20 26 26 20 5c 0a 20 20 2a 28 6c 6f  1820 && \.  *(lo
6ac0: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  ng *) (function 
6ad0: 2b 34 38 29 20 3d 3d 20 30 78 45 32 41 30 30 30  +48) == 0xE2A000
6ae0: 30 32 20 26 26 20 5c 0a 20 20 2a 28 6c 6f 6e 67  02 && \.  *(long
6af0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 35   *) (function +5
6b00: 32 29 20 3d 3d 20 30 78 30 38 30 30 30 32 34 30  2) == 0x08000240
6b10: 0a 23 64 65 66 69 6e 65 20 68 69 6c 6f 28 68 69  .#define hilo(hi
6b20: 77 6f 72 64 2c 6c 6f 77 6f 72 64 29 20 20 5c 0a  word,loword)  \.
6b30: 20 20 28 28 61 73 73 65 6d 62 6c 65 32 31 28 28    ((assemble21((
6b40: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28  unsigned long) (
6b50: 68 69 77 6f 72 64 29 29 20 3c 3c 20 31 31 29 20  hiword)) << 11) 
6b60: 7c 20 5c 0a 20 20 20 28 28 28 75 6e 73 69 67 6e  | \.   (((unsign
6b70: 65 64 20 6c 6f 6e 67 29 20 28 6c 6f 77 6f 72 64  ed long) (loword
6b80: 29 20 26 20 30 78 46 46 45 29 20 3e 3e 20 31 29  ) & 0xFFE) >> 1)
6b90: 20 5c 0a 20 20 29 0a 23 64 65 66 69 6e 65 20 74   \.  ).#define t
6ba0: 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75 6e  ramp_address(fun
6bb0: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c 6f  ction)  \.  hilo
6bc0: 28 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63  (*(long *) (func
6bd0: 74 69 6f 6e 20 2b 31 36 29 2c 20 2a 28 6c 6f 6e  tion +16), *(lon
6be0: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  g *) (function +
6bf0: 32 30 29 29 0a 23 64 65 66 69 6e 65 20 74 72 61  20)).#define tra
6c00: 6d 70 5f 76 61 72 69 61 62 6c 65 28 66 75 6e 63  mp_variable(func
6c10: 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c 6f 28  tion)  \.  hilo(
6c20: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74  *(long *) (funct
6c30: 69 6f 6e 20 2b 20 34 29 2c 20 2a 28 6c 6f 6e 67  ion + 4), *(long
6c40: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31   *) (function +1
6c50: 32 29 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d  2)).#define tram
6c60: 70 5f 64 61 74 61 28 66 75 6e 63 74 69 6f 6e 29  p_data(function)
6c70: 20 20 5c 0a 20 20 68 69 6c 6f 28 2a 28 6c 6f 6e    \.  hilo(*(lon
6c80: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  g *) (function +
6c90: 20 30 29 2c 20 2a 28 6c 6f 6e 67 20 2a 29 20 28   0), *(long *) (
6ca0: 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 29 0a 23  function + 8)).#
6cb0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 68  endif.#ifdef __h
6cc0: 70 70 61 6e 65 77 5f 5f 0a 20 20 2f 2a 20 66 75  ppanew__.  /* fu
6cd0: 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20  nction:.   *    
6ce0: 2e 6c 6f 6e 67 20 20 20 74 72 61 6d 70 0a 20 20  .long   tramp.  
6cf0: 20 2a 20 20 20 20 2e 6c 6f 6e 67 20 20 20 63 6c   *    .long   cl
6d00: 6f 73 75 72 65 0a 20 20 20 2a 20 63 6c 6f 73 75  osure.   * closu
6d10: 72 65 3a 0a 20 20 20 2a 20 20 20 20 2e 6c 6f 6e  re:.   *    .lon
6d20: 67 20 20 20 3c 76 61 72 69 61 62 6c 65 3e 0a 20  g   <variable>. 
6d30: 20 20 2a 20 20 20 20 2e 6c 6f 6e 67 20 20 20 3c    *    .long   <
6d40: 64 61 74 61 3e 0a 20 20 20 2a 20 20 20 20 2e 6c  data>.   *    .l
6d50: 6f 6e 67 20 20 20 3c 61 64 64 72 65 73 73 3e 0a  ong   <address>.
6d60: 20 20 20 2a 2f 0a 20 20 7b 20 2f 2a 20 77 6f 72     */.  { /* wor
6d70: 6b 20 61 72 6f 75 6e 64 20 61 20 62 75 67 20 69  k around a bug i
6d80: 6e 20 67 63 63 20 33 2e 2a 20 2a 2f 0a 20 20 20  n gcc 3.* */.   
6d90: 20 76 6f 69 64 2a 20 74 72 61 6d 70 5f 61 64 64   void* tramp_add
6da0: 72 65 73 73 20 3d 20 26 74 72 61 6d 70 3b 0a 20  ress = &tramp;. 
6db0: 20 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75     *(long *) (fu
6dc0: 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20 28 28  nction + 0) = ((
6dd0: 6c 6f 6e 67 20 2a 29 20 28 28 63 68 61 72 2a 29  long *) ((char*)
6de0: 74 72 61 6d 70 5f 61 64 64 72 65 73 73 2d 32 29  tramp_address-2)
6df0: 29 5b 30 5d 3b 0a 20 20 20 20 2a 28 6c 6f 6e 67  )[0];.    *(long
6e00: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20   *) (function + 
6e10: 34 29 20 3d 20 28 6c 6f 6e 67 29 20 28 66 75 6e  4) = (long) (fun
6e20: 63 74 69 6f 6e 20 2b 20 38 29 3b 0a 20 20 20 20  ction + 8);.    
6e30: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74  *(long *) (funct
6e40: 69 6f 6e 20 2b 20 38 29 20 3d 20 28 6c 6f 6e 67  ion + 8) = (long
6e50: 29 20 76 61 72 69 61 62 6c 65 3b 0a 20 20 20 20  ) variable;.    
6e60: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74  *(long *) (funct
6e70: 69 6f 6e 20 2b 31 32 29 20 3d 20 28 6c 6f 6e 67  ion +12) = (long
6e80: 29 20 64 61 74 61 3b 0a 20 20 20 20 2a 28 6c 6f  ) data;.    *(lo
6e90: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  ng *) (function 
6ea0: 2b 31 36 29 20 3d 20 28 6c 6f 6e 67 29 20 61 64  +16) = (long) ad
6eb0: 64 72 65 73 73 3b 0a 20 20 7d 0a 23 64 65 66 69  dress;.  }.#defi
6ec0: 6e 65 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63  ne is_tramp(func
6ed0: 74 69 6f 6e 29 20 20 5c 0a 20 20 28 28 6c 6f 6e  tion)  \.  ((lon
6ee0: 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 30  g *) function)[0
6ef0: 5d 20 3d 3d 20 28 28 6c 6f 6e 67 20 2a 29 20 28  ] == ((long *) (
6f00: 28 63 68 61 72 2a 29 74 72 61 6d 70 5f 61 64 64  (char*)tramp_add
6f10: 72 65 73 73 2d 32 29 29 5b 30 5d 0a 23 64 65 66  ress-2))[0].#def
6f20: 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 65 73  ine tramp_addres
6f30: 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20  s(function)  \. 
6f40: 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74   ((long *) funct
6f50: 69 6f 6e 29 5b 34 5d 0a 23 64 65 66 69 6e 65 20  ion)[4].#define 
6f60: 74 72 61 6d 70 5f 76 61 72 69 61 62 6c 65 28 66  tramp_variable(f
6f70: 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 28  unction)  \.  ((
6f80: 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e  long *) function
6f90: 29 5b 32 5d 0a 23 64 65 66 69 6e 65 20 74 72 61  )[2].#define tra
6fa0: 6d 70 5f 64 61 74 61 28 66 75 6e 63 74 69 6f 6e  mp_data(function
6fb0: 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29  )  \.  ((long *)
6fc0: 20 66 75 6e 63 74 69 6f 6e 29 5b 33 5d 0a 23 65   function)[3].#e
6fd0: 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 61 72  ndif.#ifdef __ar
6fe0: 6d 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f  m__.  /* functio
6ff0: 6e 3a 0a 20 20 20 2a 20 20 20 20 73 74 6d 66 64  n:.   *    stmfd
7000: 20 20 20 73 70 21 2c 7b 72 30 7d 09 09 09 45 39     sp!,{r0}...E9
7010: 32 44 30 30 30 31 0a 20 20 20 2a 20 20 20 20 6c  2D0001.   *    l
7020: 64 72 20 20 20 20 20 72 30 2c 5b 70 63 2c 23 5f  dr     r0,[pc,#_
7030: 64 61 74 61 2d 2e 2d 38 5d 09 09 45 35 39 46 30  data-.-8]..E59F0
7040: 30 31 34 0a 20 20 20 2a 20 20 20 20 6c 64 72 20  014.   *    ldr 
7050: 20 20 20 20 69 70 2c 5b 72 30 2c 23 30 5d 09 09      ip,[r0,#0]..
7060: 09 45 35 39 30 43 30 30 30 0a 20 20 20 2a 20 20  .E590C000.   *  
7070: 20 20 6c 64 72 20 20 20 20 20 72 30 2c 5b 70 63    ldr     r0,[pc
7080: 2c 23 5f 76 61 72 69 61 62 6c 65 2d 2e 2d 38 5d  ,#_variable-.-8]
7090: 09 09 45 35 39 46 30 30 31 30 0a 20 20 20 2a 20  ..E59F0010.   * 
70a0: 20 20 20 73 74 72 20 20 20 20 20 69 70 2c 5b 72     str     ip,[r
70b0: 30 2c 23 30 5d 09 09 09 45 35 38 30 43 30 30 30  0,#0]...E580C000
70c0: 0a 20 20 20 2a 20 20 20 20 6c 64 6d 66 64 20 20  .   *    ldmfd  
70d0: 20 73 70 21 2c 7b 72 30 7d 5e 09 09 09 45 38 46   sp!,{r0}^...E8F
70e0: 44 30 30 30 31 0a 20 20 20 2a 20 20 20 20 6c 64  D0001.   *    ld
70f0: 72 20 20 20 20 20 69 70 2c 5b 70 63 2c 23 5f 66  r     ip,[pc,#_f
7100: 75 6e 63 74 69 6f 6e 2d 2e 2d 38 5d 09 09 45 35  unction-.-8]..E5
7110: 39 46 43 30 30 38 0a 20 20 20 2a 20 20 20 20 6c  9FC008.   *    l
7120: 64 72 20 20 20 20 20 70 63 2c 5b 69 70 2c 23 30  dr     pc,[ip,#0
7130: 5d 09 09 09 45 35 39 43 46 30 30 30 0a 20 20 20  ]...E59CF000.   
7140: 2a 20 5f 64 61 74 61 3a 0a 20 20 20 2a 20 20 20  * _data:.   *   
7150: 20 2e 77 6f 72 64 20 20 20 3c 64 61 74 61 3e 09   .word   <data>.
7160: 09 09 09 3c 64 61 74 61 3e 0a 20 20 20 2a 20 5f  ...<data>.   * _
7170: 76 61 72 69 61 62 6c 65 3a 0a 20 20 20 2a 20 20  variable:.   *  
7180: 20 20 2e 77 6f 72 64 20 20 20 3c 76 61 72 69 61    .word   <varia
7190: 62 6c 65 3e 09 09 09 3c 76 61 72 69 61 62 6c 65  ble>...<variable
71a0: 3e 0a 20 20 20 2a 20 5f 66 75 6e 63 74 69 6f 6e  >.   * _function
71b0: 3a 0a 20 20 20 2a 20 20 20 20 2e 77 6f 72 64 20  :.   *    .word 
71c0: 20 20 3c 61 64 64 72 65 73 73 3e 09 09 09 3c 61    <address>...<a
71d0: 64 64 72 65 73 73 3e 0a 20 20 20 2a 2f 0a 20 20  ddress>.   */.  
71e0: 7b 20 73 74 61 74 69 63 20 6c 6f 6e 67 20 63 6f  { static long co
71f0: 64 65 20 5b 38 5d 20 3d 0a 20 20 20 20 20 20 7b  de [8] =.      {
7200: 20 30 78 45 39 32 44 30 30 30 31 2c 20 30 78 45   0xE92D0001, 0xE
7210: 35 39 46 30 30 31 34 2c 20 30 78 45 35 39 30 43  59F0014, 0xE590C
7220: 30 30 30 2c 20 30 78 45 35 39 46 30 30 31 30 2c  000, 0xE59F0010,
7230: 0a 20 20 20 20 20 20 20 20 30 78 45 35 38 30 43  .        0xE580C
7240: 30 30 30 2c 20 30 78 45 38 46 44 30 30 30 31 2c  000, 0xE8FD0001,
7250: 20 30 78 45 35 39 46 43 30 30 38 2c 20 30 78 45   0xE59FC008, 0xE
7260: 35 39 43 46 30 30 30 0a 20 20 20 20 20 20 7d 3b  59CF000.      };
7270: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
7280: 66 6f 72 20 28 69 3d 30 3b 20 69 3c 38 3b 20 69  for (i=0; i<8; i
7290: 2b 2b 29 20 7b 20 28 28 6c 6f 6e 67 20 2a 29 20  ++) { ((long *) 
72a0: 66 75 6e 63 74 69 6f 6e 29 5b 69 5d 20 3d 20 63  function)[i] = c
72b0: 6f 64 65 5b 69 5d 3b 20 7d 0a 20 20 20 20 28 28  ode[i]; }.    ((
72c0: 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e  long *) function
72d0: 29 5b 38 5d 20 3d 20 28 6c 6f 6e 67 29 20 64 61  )[8] = (long) da
72e0: 74 61 3b 0a 20 20 20 20 28 28 6c 6f 6e 67 20 2a  ta;.    ((long *
72f0: 29 20 66 75 6e 63 74 69 6f 6e 29 5b 39 5d 20 3d  ) function)[9] =
7300: 20 28 6c 6f 6e 67 29 20 76 61 72 69 61 62 6c 65   (long) variable
7310: 3b 0a 20 20 20 20 28 28 6c 6f 6e 67 20 2a 29 20  ;.    ((long *) 
7320: 66 75 6e 63 74 69 6f 6e 29 5b 31 30 5d 20 3d 20  function)[10] = 
7330: 28 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 3b 0a  (long) address;.
7340: 20 20 7d 0a 23 64 65 66 69 6e 65 20 69 73 5f 74    }.#define is_t
7350: 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20 20  ramp(function)  
7360: 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75  \.  ((long *) fu
7370: 6e 63 74 69 6f 6e 29 5b 30 5d 20 3d 3d 20 30 78  nction)[0] == 0x
7380: 45 39 32 44 30 30 30 31 20 26 26 20 5c 0a 20 20  E92D0001 && \.  
7390: 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69  ((long *) functi
73a0: 6f 6e 29 5b 31 5d 20 3d 3d 20 30 78 45 35 39 46  on)[1] == 0xE59F
73b0: 30 30 31 34 20 26 26 20 5c 0a 20 20 28 28 6c 6f  0014 && \.  ((lo
73c0: 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b  ng *) function)[
73d0: 32 5d 20 3d 3d 20 30 78 45 35 39 30 43 30 30 30  2] == 0xE590C000
73e0: 20 26 26 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a   && \.  ((long *
73f0: 29 20 66 75 6e 63 74 69 6f 6e 29 5b 33 5d 20 3d  ) function)[3] =
7400: 3d 20 30 78 45 35 39 46 30 30 31 30 20 26 26 20  = 0xE59F0010 && 
7410: 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75  \.  ((long *) fu
7420: 6e 63 74 69 6f 6e 29 5b 34 5d 20 3d 3d 20 30 78  nction)[4] == 0x
7430: 45 35 38 30 43 30 30 30 20 26 26 20 5c 0a 20 20  E580C000 && \.  
7440: 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69  ((long *) functi
7450: 6f 6e 29 5b 35 5d 20 3d 3d 20 30 78 45 38 46 44  on)[5] == 0xE8FD
7460: 30 30 30 31 20 26 26 20 5c 0a 20 20 28 28 6c 6f  0001 && \.  ((lo
7470: 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b  ng *) function)[
7480: 36 5d 20 3d 3d 20 30 78 45 35 39 46 43 30 30 38  6] == 0xE59FC008
7490: 20 26 26 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a   && \.  ((long *
74a0: 29 20 66 75 6e 63 74 69 6f 6e 29 5b 37 5d 20 3d  ) function)[7] =
74b0: 3d 20 30 78 45 35 39 43 46 30 30 30 0a 23 64 65  = 0xE59CF000.#de
74c0: 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 65  fine tramp_addre
74d0: 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a  ss(function)  \.
74e0: 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63    ((long *) func
74f0: 74 69 6f 6e 29 5b 31 30 5d 0a 23 64 65 66 69 6e  tion)[10].#defin
7500: 65 20 74 72 61 6d 70 5f 76 61 72 69 61 62 6c 65  e tramp_variable
7510: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20  (function)  \.  
7520: 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69  ((long *) functi
7530: 6f 6e 29 5b 39 5d 0a 23 64 65 66 69 6e 65 20 74  on)[9].#define t
7540: 72 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 74 69  ramp_data(functi
7550: 6f 6e 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20  on)  \.  ((long 
7560: 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 38 5d 0a  *) function)[8].
7570: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f  #endif.#ifdef __
7580: 72 73 36 30 30 30 73 79 73 76 34 5f 5f 0a 20 20  rs6000sysv4__.  
7590: 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20  /* function:.   
75a0: 2a 20 20 20 20 7b 6c 69 75 7c 6c 69 73 7d 20 31  *    {liu|lis} 1
75b0: 31 2c 68 69 31 36 28 3c 76 61 72 69 61 62 6c 65  1,hi16(<variable
75c0: 3e 29 09 09 33 44 20 36 30 20 68 69 31 36 28 3c  >)..3D 60 hi16(<
75d0: 76 61 72 69 61 62 6c 65 3e 29 0a 20 20 20 2a 20  variable>).   * 
75e0: 20 20 20 7b 6f 72 69 6c 7c 6f 72 69 7d 20 31 31     {oril|ori} 11
75f0: 2c 31 31 2c 6c 6f 31 36 28 3c 76 61 72 69 61 62  ,11,lo16(<variab
7600: 6c 65 3e 29 09 36 31 20 36 42 20 6c 6f 31 36 28  le>).61 6B lo16(
7610: 3c 76 61 72 69 61 62 6c 65 3e 29 0a 20 20 20 2a  <variable>).   *
7620: 20 20 20 20 7b 6c 69 75 7c 6c 69 73 7d 20 31 32      {liu|lis} 12
7630: 2c 68 69 31 36 28 3c 64 61 74 61 3e 29 09 09 33  ,hi16(<data>)..3
7640: 44 20 38 30 20 68 69 31 36 28 3c 64 61 74 61 3e  D 80 hi16(<data>
7650: 29 0a 20 20 20 2a 20 20 20 20 7b 6f 72 69 6c 7c  ).   *    {oril|
7660: 6f 72 69 7d 20 31 32 2c 31 32 2c 6c 6f 31 36 28  ori} 12,12,lo16(
7670: 3c 64 61 74 61 3e 29 09 09 36 31 20 38 43 20 6c  <data>)..61 8C l
7680: 6f 31 36 28 3c 64 61 74 61 3e 29 0a 20 20 20 2a  o16(<data>).   *
7690: 20 20 20 20 7b 73 74 7c 73 74 77 7d 20 31 32 2c      {st|stw} 12,
76a0: 30 28 31 31 29 09 09 09 39 31 20 38 42 20 30 30  0(11)...91 8B 00
76b0: 20 30 30 0a 20 20 20 2a 20 20 20 20 7b 6c 69 75   00.   *    {liu
76c0: 7c 6c 69 73 7d 20 30 2c 68 69 31 36 28 3c 61 64  |lis} 0,hi16(<ad
76d0: 64 72 65 73 73 3e 29 09 09 33 43 20 30 30 20 68  dress>)..3C 00 h
76e0: 69 31 36 28 3c 61 64 64 72 65 73 73 3e 29 0a 20  i16(<address>). 
76f0: 20 20 2a 20 20 20 20 7b 6f 72 69 6c 7c 6f 72 69    *    {oril|ori
7700: 7d 20 30 2c 30 2c 6c 6f 31 36 28 3c 61 64 64 72  } 0,0,lo16(<addr
7710: 65 73 73 3e 29 09 09 36 30 20 30 30 20 6c 6f 31  ess>)..60 00 lo1
7720: 36 28 3c 61 64 64 72 65 73 73 3e 29 0a 20 20 20  6(<address>).   
7730: 2a 20 20 20 20 6d 74 63 74 72 20 30 09 09 09 09  *    mtctr 0....
7740: 09 37 43 20 30 39 20 30 33 20 41 36 0a 20 20 20  .7C 09 03 A6.   
7750: 2a 20 20 20 20 62 63 74 72 09 09 09 09 09 34 45  *    bctr.....4E
7760: 20 38 30 20 30 34 20 32 30 0a 20 20 20 2a 2f 0a   80 04 20.   */.
7770: 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75    *(short *) (fu
7780: 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20 30 78  nction + 0) = 0x
7790: 33 44 36 30 3b 0a 20 20 2a 28 73 68 6f 72 74 20  3D60;.  *(short 
77a0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 32  *) (function + 2
77b0: 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ) = (unsigned lo
77c0: 6e 67 29 20 76 61 72 69 61 62 6c 65 20 3e 3e 20  ng) variable >> 
77d0: 31 36 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29  16;.  *(short *)
77e0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20   (function + 4) 
77f0: 3d 20 30 78 36 31 36 42 3b 0a 20 20 2a 28 73 68  = 0x616B;.  *(sh
7800: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ort *) (function
7810: 20 2b 20 36 29 20 3d 20 28 75 6e 73 69 67 6e 65   + 6) = (unsigne
7820: 64 20 6c 6f 6e 67 29 20 76 61 72 69 61 62 6c 65  d long) variable
7830: 20 26 20 30 78 66 66 66 66 3b 0a 20 20 2a 28 73   & 0xffff;.  *(s
7840: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
7850: 6e 20 2b 20 38 29 20 3d 20 30 78 33 44 38 30 3b  n + 8) = 0x3D80;
7860: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66  .  *(short *) (f
7870: 75 6e 63 74 69 6f 6e 20 2b 31 30 29 20 3d 20 28  unction +10) = (
7880: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64  unsigned long) d
7890: 61 74 61 20 3e 3e 20 31 36 3b 0a 20 20 2a 28 73  ata >> 16;.  *(s
78a0: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
78b0: 6e 20 2b 31 32 29 20 3d 20 30 78 36 31 38 43 3b  n +12) = 0x618C;
78c0: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66  .  *(short *) (f
78d0: 75 6e 63 74 69 6f 6e 20 2b 31 34 29 20 3d 20 28  unction +14) = (
78e0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64  unsigned long) d
78f0: 61 74 61 20 26 20 30 78 66 66 66 66 3b 0a 20 20  ata & 0xffff;.  
7900: 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63  *(long *)  (func
7910: 74 69 6f 6e 20 2b 31 36 29 20 3d 20 30 78 39 31  tion +16) = 0x91
7920: 38 42 30 30 30 30 3b 0a 20 20 2a 28 73 68 6f 72  8B0000;.  *(shor
7930: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
7940: 32 30 29 20 3d 20 30 78 33 43 30 30 3b 0a 20 20  20) = 0x3C00;.  
7950: 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63  *(short *) (func
7960: 74 69 6f 6e 20 2b 32 32 29 20 3d 20 28 75 6e 73  tion +22) = (uns
7970: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64 72  igned long) addr
7980: 65 73 73 20 3e 3e 20 31 36 3b 0a 20 20 2a 28 73  ess >> 16;.  *(s
7990: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
79a0: 6e 20 2b 32 34 29 20 3d 20 30 78 36 30 30 30 3b  n +24) = 0x6000;
79b0: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66  .  *(short *) (f
79c0: 75 6e 63 74 69 6f 6e 20 2b 32 36 29 20 3d 20 28  unction +26) = (
79d0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 61  unsigned long) a
79e0: 64 64 72 65 73 73 20 26 20 30 78 66 66 66 66 3b  ddress & 0xffff;
79f0: 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66  .  *(long *)  (f
7a00: 75 6e 63 74 69 6f 6e 20 2b 32 38 29 20 3d 20 30  unction +28) = 0
7a10: 78 37 43 30 39 30 33 41 36 3b 0a 20 20 2a 28 6c  x7C0903A6;.  *(l
7a20: 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f  ong *)  (functio
7a30: 6e 20 2b 33 32 29 20 3d 20 30 78 34 45 38 30 30  n +32) = 0x4E800
7a40: 34 32 30 3b 0a 23 64 65 66 69 6e 65 20 69 73 5f  420;.#define is_
7a50: 74 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20  tramp(function) 
7a60: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20   \.  *(unsigned 
7a70: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
7a80: 6f 6e 20 2b 20 30 29 20 3d 3d 20 30 78 33 44 36  on + 0) == 0x3D6
7a90: 30 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67  0 && \.  *(unsig
7aa0: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75  ned short *) (fu
7ab0: 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 3d 20 30  nction + 4) == 0
7ac0: 78 36 31 36 42 20 26 26 20 5c 0a 20 20 2a 28 75  x616B && \.  *(u
7ad0: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29  nsigned short *)
7ae0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20   (function + 8) 
7af0: 3d 3d 20 30 78 33 44 38 30 20 26 26 20 5c 0a 20  == 0x3D80 && \. 
7b00: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72   *(unsigned shor
7b10: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
7b20: 31 32 29 20 3d 3d 20 30 78 36 31 38 43 20 26 26  12) == 0x618C &&
7b30: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20   \.  *(unsigned 
7b40: 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69  long *)  (functi
7b50: 6f 6e 20 2b 31 36 29 20 3d 3d 20 30 78 39 31 38  on +16) == 0x918
7b60: 42 30 30 30 30 20 26 26 20 5c 0a 20 20 2a 28 75  B0000 && \.  *(u
7b70: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29  nsigned short *)
7b80: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 30 29 20   (function +20) 
7b90: 3d 3d 20 30 78 33 43 30 30 20 26 26 20 5c 0a 20  == 0x3C00 && \. 
7ba0: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72   *(unsigned shor
7bb0: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
7bc0: 32 34 29 20 3d 3d 20 30 78 36 30 30 30 20 26 26  24) == 0x6000 &&
7bd0: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20   \.  *(unsigned 
7be0: 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69  long *)  (functi
7bf0: 6f 6e 20 2b 32 38 29 20 3d 3d 20 30 78 37 43 30  on +28) == 0x7C0
7c00: 39 30 33 41 36 20 26 26 20 5c 0a 20 20 2a 28 75  903A6 && \.  *(u
7c10: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 29 20  nsigned long *) 
7c20: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 33 32 29 20   (function +32) 
7c30: 3d 3d 20 30 78 34 45 38 30 30 34 32 30 0a 23 64  == 0x4E800420.#d
7c40: 65 66 69 6e 65 20 68 69 6c 6f 28 68 69 77 6f 72  efine hilo(hiwor
7c50: 64 2c 6c 6f 77 6f 72 64 29 20 20 5c 0a 20 20 28  d,loword)  \.  (
7c60: 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29  ((unsigned long)
7c70: 20 28 68 69 77 6f 72 64 29 20 3c 3c 20 31 36 29   (hiword) << 16)
7c80: 20 7c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e   | (unsigned lon
7c90: 67 29 20 28 6c 6f 77 6f 72 64 29 29 0a 23 64 65  g) (loword)).#de
7ca0: 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 65  fine tramp_addre
7cb0: 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a  ss(function)  \.
7cc0: 20 20 68 69 6c 6f 28 2a 28 75 6e 73 69 67 6e 65    hilo(*(unsigne
7cd0: 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63  d short *) (func
7ce0: 74 69 6f 6e 20 2b 32 32 29 2c 20 2a 28 75 6e 73  tion +22), *(uns
7cf0: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28  igned short *) (
7d00: 66 75 6e 63 74 69 6f 6e 20 2b 32 36 29 29 0a 23  function +26)).#
7d10: 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 76 61 72  define tramp_var
7d20: 69 61 62 6c 65 28 66 75 6e 63 74 69 6f 6e 29 20  iable(function) 
7d30: 20 5c 0a 20 20 68 69 6c 6f 28 2a 28 75 6e 73 69   \.  hilo(*(unsi
7d40: 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66  gned short *) (f
7d50: 75 6e 63 74 69 6f 6e 20 2b 20 32 29 2c 20 2a 28  unction + 2), *(
7d60: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a  unsigned short *
7d70: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 36 29  ) (function + 6)
7d80: 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f  ).#define tramp_
7d90: 64 61 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 20  data(function)  
7da0: 5c 0a 20 20 68 69 6c 6f 28 2a 28 75 6e 73 69 67  \.  hilo(*(unsig
7db0: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75  ned short *) (fu
7dc0: 6e 63 74 69 6f 6e 20 2b 31 30 29 2c 20 2a 28 75  nction +10), *(u
7dd0: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29  nsigned short *)
7de0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 34 29 29   (function +14))
7df0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f  .#endif.#ifdef _
7e00: 5f 72 73 36 30 30 30 61 69 78 5f 5f 0a 20 20 2f  _rs6000aix__.  /
7e10: 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a  * function:.   *
7e20: 20 20 20 20 2e 6c 6f 6e 67 20 2e 74 72 61 6d 70      .long .tramp
7e30: 0a 20 20 20 2a 20 20 20 20 2e 6c 6f 6e 67 20 2e  .   *    .long .
7e40: 6d 79 74 6f 63 0a 20 20 20 2a 20 20 20 20 2e 6c  mytoc.   *    .l
7e50: 6f 6e 67 20 30 0a 20 20 20 2a 20 2e 6d 79 74 6f  ong 0.   * .myto
7e60: 63 3a 0a 20 20 20 2a 20 20 20 20 2e 6c 6f 6e 67  c:.   *    .long
7e70: 20 3c 76 61 72 69 61 62 6c 65 3e 0a 20 20 20 2a   <variable>.   *
7e80: 20 20 20 20 2e 6c 6f 6e 67 20 3c 64 61 74 61 3e      .long <data>
7e90: 0a 20 20 20 2a 20 20 20 20 2e 6c 6f 6e 67 20 3c  .   *    .long <
7ea0: 61 64 64 72 65 73 73 3e 0a 20 20 20 2a 2f 0a 20  address>.   */. 
7eb0: 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e   *(long *)  (fun
7ec0: 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20 28 28 6c  ction + 0) = ((l
7ed0: 6f 6e 67 20 2a 29 20 26 74 72 61 6d 70 29 5b 30  ong *) &tramp)[0
7ee0: 5d 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20  ];.  *(long *)  
7ef0: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d  (function + 4) =
7f00: 20 28 6c 6f 6e 67 29 20 28 66 75 6e 63 74 69 6f   (long) (functio
7f10: 6e 20 2b 20 31 32 29 3b 0a 20 20 2a 28 6c 6f 6e  n + 12);.  *(lon
7f20: 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20  g *)  (function 
7f30: 2b 20 38 29 20 3d 20 30 3b 0a 20 20 2a 28 6c 6f  + 8) = 0;.  *(lo
7f40: 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e  ng *)  (function
7f50: 20 2b 31 32 29 20 3d 20 28 6c 6f 6e 67 29 20 76   +12) = (long) v
7f60: 61 72 69 61 62 6c 65 3b 0a 20 20 2a 28 6c 6f 6e  ariable;.  *(lon
7f70: 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20  g *)  (function 
7f80: 2b 31 36 29 20 3d 20 28 6c 6f 6e 67 29 20 64 61  +16) = (long) da
7f90: 74 61 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20  ta;.  *(long *) 
7fa0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 30 29 20   (function +20) 
7fb0: 3d 20 28 6c 6f 6e 67 29 20 61 64 64 72 65 73 73  = (long) address
7fc0: 3b 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72 61  ;.#define is_tra
7fd0: 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a  mp(function)  \.
7fe0: 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63    ((long *) func
7ff0: 74 69 6f 6e 29 5b 30 5d 20 3d 3d 20 28 28 6c 6f  tion)[0] == ((lo
8000: 6e 67 20 2a 29 20 26 74 72 61 6d 70 29 5b 30 5d  ng *) &tramp)[0]
8010: 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 61  .#define tramp_a
8020: 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e 29  ddress(function)
8030: 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 20    \.  ((long *) 
8040: 66 75 6e 63 74 69 6f 6e 29 5b 35 5d 0a 23 64 65  function)[5].#de
8050: 66 69 6e 65 20 74 72 61 6d 70 5f 76 61 72 69 61  fine tramp_varia
8060: 62 6c 65 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c  ble(function)  \
8070: 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e  .  ((long *) fun
8080: 63 74 69 6f 6e 29 5b 33 5d 0a 23 64 65 66 69 6e  ction)[3].#defin
8090: 65 20 74 72 61 6d 70 5f 64 61 74 61 28 66 75 6e  e tramp_data(fun
80a0: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 28 6c 6f  ction)  \.  ((lo
80b0: 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b  ng *) function)[
80c0: 34 5d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  4].#endif.#ifdef
80d0: 20 5f 5f 6d 38 38 6b 5f 5f 0a 20 20 2f 2a 20 66   __m88k__.  /* f
80e0: 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20  unction:.   *   
80f0: 20 6f 72 2e 75 20 20 20 20 23 72 31 33 2c 23 72   or.u    #r13,#r
8100: 30 2c 68 69 31 36 28 3c 76 61 72 69 61 62 6c 65  0,hi16(<variable
8110: 3e 29 09 35 44 20 41 30 20 68 69 31 36 28 3c 76  >).5D A0 hi16(<v
8120: 61 72 69 61 62 6c 65 3e 29 0a 20 20 20 2a 20 20  ariable>).   *  
8130: 20 20 6f 72 20 20 20 20 20 20 23 72 31 33 2c 23    or      #r13,#
8140: 72 31 33 2c 6c 6f 31 36 28 3c 76 61 72 69 61 62  r13,lo16(<variab
8150: 6c 65 3e 29 09 35 39 20 41 44 20 6c 6f 31 36 28  le>).59 AD lo16(
8160: 3c 76 61 72 69 61 62 6c 65 3e 29 0a 20 20 20 2a  <variable>).   *
8170: 20 20 20 20 6f 72 2e 75 20 20 20 20 23 72 31 30      or.u    #r10
8180: 2c 23 72 30 2c 68 69 31 36 28 3c 64 61 74 61 3e  ,#r0,hi16(<data>
8190: 29 09 09 35 44 20 34 30 20 68 69 31 36 28 3c 64  )..5D 40 hi16(<d
81a0: 61 74 61 3e 29 0a 20 20 20 2a 20 20 20 20 6f 72  ata>).   *    or
81b0: 20 20 20 20 20 20 23 72 31 30 2c 23 72 31 30 2c        #r10,#r10,
81c0: 6c 6f 31 36 28 3c 64 61 74 61 3e 29 09 09 35 39  lo16(<data>)..59
81d0: 20 34 41 20 6c 6f 31 36 28 3c 64 61 74 61 3e 29   4A lo16(<data>)
81e0: 0a 20 20 20 2a 20 20 20 20 73 74 20 20 20 20 20  .   *    st     
81f0: 20 23 72 31 30 2c 23 72 30 2c 23 72 31 33 09 09   #r10,#r0,#r13..
8200: 09 46 35 20 34 30 20 32 34 20 30 44 0a 20 20 20  .F5 40 24 0D.   
8210: 2a 20 20 20 20 6f 72 2e 75 20 20 20 20 23 72 31  *    or.u    #r1
8220: 33 2c 23 72 30 2c 68 69 31 36 28 3c 61 64 64 72  3,#r0,hi16(<addr
8230: 65 73 73 3e 29 09 35 44 20 41 30 20 68 69 31 36  ess>).5D A0 hi16
8240: 28 3c 61 64 64 72 65 73 73 3e 29 0a 20 20 20 2a  (<address>).   *
8250: 20 20 20 20 6f 72 20 20 20 20 20 20 23 72 31 33      or      #r13
8260: 2c 23 72 31 33 2c 6c 6f 31 36 28 3c 61 64 64 72  ,#r13,lo16(<addr
8270: 65 73 73 3e 29 09 35 39 20 41 44 20 6c 6f 31 36  ess>).59 AD lo16
8280: 28 3c 61 64 64 72 65 73 73 3e 29 0a 20 20 20 2a  (<address>).   *
8290: 20 20 20 20 6a 6d 70 20 20 20 20 20 23 72 31 33      jmp     #r13
82a0: 09 09 09 09 46 34 20 30 30 20 43 30 20 30 44 0a  ....F4 00 C0 0D.
82b0: 20 20 20 2a 2f 0a 20 20 2a 28 73 68 6f 72 74 20     */.  *(short 
82c0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30  *) (function + 0
82d0: 29 20 3d 20 30 78 35 44 41 30 3b 0a 20 20 2a 28  ) = 0x5DA0;.  *(
82e0: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
82f0: 6f 6e 20 2b 20 32 29 20 3d 20 28 75 6e 73 69 67  on + 2) = (unsig
8300: 6e 65 64 20 6c 6f 6e 67 29 20 76 61 72 69 61 62  ned long) variab
8310: 6c 65 20 3e 3e 20 31 36 3b 0a 20 20 2a 28 73 68  le >> 16;.  *(sh
8320: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ort *) (function
8330: 20 2b 20 34 29 20 3d 20 30 78 35 39 41 44 3b 0a   + 4) = 0x59AD;.
8340: 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75    *(short *) (fu
8350: 6e 63 74 69 6f 6e 20 2b 20 36 29 20 3d 20 28 75  nction + 6) = (u
8360: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 76 61  nsigned long) va
8370: 72 69 61 62 6c 65 20 26 20 30 78 66 66 66 66 3b  riable & 0xffff;
8380: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66  .  *(short *) (f
8390: 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 30  unction + 8) = 0
83a0: 78 35 44 34 30 3b 0a 20 20 2a 28 73 68 6f 72 74  x5D40;.  *(short
83b0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31   *) (function +1
83c0: 30 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c  0) = (unsigned l
83d0: 6f 6e 67 29 20 64 61 74 61 20 3e 3e 20 31 36 3b  ong) data >> 16;
83e0: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66  .  *(short *) (f
83f0: 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d 20 30  unction +12) = 0
8400: 78 35 39 34 41 3b 0a 20 20 2a 28 73 68 6f 72 74  x594A;.  *(short
8410: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31   *) (function +1
8420: 34 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c  4) = (unsigned l
8430: 6f 6e 67 29 20 64 61 74 61 20 26 20 30 78 66 66  ong) data & 0xff
8440: 66 66 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20  ff;.  *(long *) 
8450: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20   (function +16) 
8460: 3d 20 30 78 46 35 34 30 32 34 30 44 3b 0a 20 20  = 0xF540240D;.  
8470: 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63  *(short *) (func
8480: 74 69 6f 6e 20 2b 32 30 29 20 3d 20 30 78 35 44  tion +20) = 0x5D
8490: 41 30 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29  A0;.  *(short *)
84a0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 32 29 20   (function +22) 
84b0: 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  = (unsigned long
84c0: 29 20 61 64 64 72 65 73 73 20 3e 3e 20 31 36 3b  ) address >> 16;
84d0: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66  .  *(short *) (f
84e0: 75 6e 63 74 69 6f 6e 20 2b 32 34 29 20 3d 20 30  unction +24) = 0
84f0: 78 35 39 41 44 3b 0a 20 20 2a 28 73 68 6f 72 74  x59AD;.  *(short
8500: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32   *) (function +2
8510: 36 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c  6) = (unsigned l
8520: 6f 6e 67 29 20 61 64 64 72 65 73 73 20 26 20 30  ong) address & 0
8530: 78 66 66 66 66 3b 0a 20 20 2a 28 6c 6f 6e 67 20  xffff;.  *(long 
8540: 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32  *)  (function +2
8550: 38 29 20 3d 20 30 78 46 34 30 30 43 30 30 44 3b  8) = 0xF400C00D;
8560: 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d  .#define is_tram
8570: 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20  p(function)  \. 
8580: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72   *(unsigned shor
8590: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
85a0: 20 30 29 20 3d 3d 20 30 78 35 44 41 30 20 26 26   0) == 0x5DA0 &&
85b0: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20   \.  *(unsigned 
85c0: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
85d0: 6f 6e 20 2b 20 34 29 20 3d 3d 20 30 78 35 39 41  on + 4) == 0x59A
85e0: 44 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67  D && \.  *(unsig
85f0: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75  ned short *) (fu
8600: 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 3d 20 30  nction + 8) == 0
8610: 78 35 44 34 30 20 26 26 20 5c 0a 20 20 2a 28 75  x5D40 && \.  *(u
8620: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29  nsigned short *)
8630: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20   (function +12) 
8640: 3d 3d 20 30 78 35 39 34 41 20 26 26 20 5c 0a 20  == 0x594A && \. 
8650: 20 2a 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67   *(unsigned long
8660: 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b   *)  (function +
8670: 31 36 29 20 3d 3d 20 30 78 46 35 34 30 32 34 30  16) == 0xF540240
8680: 44 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67  D && \.  *(unsig
8690: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75  ned short *) (fu
86a0: 6e 63 74 69 6f 6e 20 2b 32 30 29 20 3d 3d 20 30  nction +20) == 0
86b0: 78 35 44 41 30 20 26 26 20 5c 0a 20 20 2a 28 75  x5DA0 && \.  *(u
86c0: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29  nsigned short *)
86d0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 34 29 20   (function +24) 
86e0: 3d 3d 20 30 78 35 39 41 44 20 26 26 20 5c 0a 20  == 0x59AD && \. 
86f0: 20 2a 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67   *(unsigned long
8700: 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b   *)  (function +
8710: 32 38 29 20 3d 3d 20 30 78 46 34 30 30 43 30 30  28) == 0xF400C00
8720: 44 0a 23 64 65 66 69 6e 65 20 68 69 6c 6f 28 68  D.#define hilo(h
8730: 69 77 6f 72 64 2c 6c 6f 77 6f 72 64 29 20 20 5c  iword,loword)  \
8740: 0a 20 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c  .  (((unsigned l
8750: 6f 6e 67 29 20 28 68 69 77 6f 72 64 29 20 3c 3c  ong) (hiword) <<
8760: 20 31 36 29 20 7c 20 28 75 6e 73 69 67 6e 65 64   16) | (unsigned
8770: 20 6c 6f 6e 67 29 20 28 6c 6f 77 6f 72 64 29 29   long) (loword))
8780: 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 61  .#define tramp_a
8790: 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e 29  ddress(function)
87a0: 20 20 5c 0a 20 20 68 69 6c 6f 28 2a 28 75 6e 73    \.  hilo(*(uns
87b0: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28  igned short *) (
87c0: 66 75 6e 63 74 69 6f 6e 20 2b 32 32 29 2c 20 2a  function +22), *
87d0: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20  (unsigned short 
87e0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 36  *) (function +26
87f0: 29 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70  )).#define tramp
8800: 5f 76 61 72 69 61 62 6c 65 28 66 75 6e 63 74 69  _variable(functi
8810: 6f 6e 29 20 20 5c 0a 20 20 68 69 6c 6f 28 2a 28  on)  \.  hilo(*(
8820: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a  unsigned short *
8830: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 32 29  ) (function + 2)
8840: 2c 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f  , *(unsigned sho
8850: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
8860: 2b 20 36 29 29 0a 23 64 65 66 69 6e 65 20 74 72  + 6)).#define tr
8870: 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 74 69 6f  amp_data(functio
8880: 6e 29 20 20 5c 0a 20 20 68 69 6c 6f 28 2a 28 75  n)  \.  hilo(*(u
8890: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29  nsigned short *)
88a0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 30 29 2c   (function +10),
88b0: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72   *(unsigned shor
88c0: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
88d0: 31 34 29 29 0a 23 65 6e 64 69 66 0a 23 69 66 64  14)).#endif.#ifd
88e0: 65 66 20 5f 5f 63 6f 6e 76 65 78 5f 5f 0a 20 20  ef __convex__.  
88f0: 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20  /* function:.   
8900: 2a 20 20 20 20 6c 64 2e 77 20 23 3c 64 61 74 61  *    ld.w #<data
8910: 3e 2c 73 31 09 09 09 09 31 31 43 39 20 3c 64 61  >,s1....11C9 <da
8920: 74 61 3e 0a 20 20 20 2a 20 20 20 20 73 74 2e 77  ta>.   *    st.w
8930: 20 73 31 2c 3c 76 61 72 69 61 62 6c 65 3e 09 09   s1,<variable>..
8940: 09 33 36 34 31 20 3c 76 61 72 69 61 62 6c 65 3e  .3641 <variable>
8950: 0a 20 20 20 2a 20 20 20 20 6a 6d 70 20 3c 61 64  .   *    jmp <ad
8960: 64 72 65 73 73 3e 09 09 09 09 30 31 34 30 20 3c  dress>....0140 <
8970: 61 64 64 72 65 73 73 3e 0a 20 20 20 2a 20 20 20  address>.   *   
8980: 20 64 73 2e 68 20 30 09 09 09 09 09 30 30 30 30   ds.h 0.....0000
8990: 0a 20 20 20 2a 2f 0a 20 20 2a 28 73 68 6f 72 74  .   */.  *(short
89a0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20   *) (function + 
89b0: 30 29 20 3d 20 30 78 31 31 43 39 3b 0a 20 20 2a  0) = 0x11C9;.  *
89c0: 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74  (long *)  (funct
89d0: 69 6f 6e 20 2b 20 32 29 20 3d 20 28 75 6e 73 69  ion + 2) = (unsi
89e0: 67 6e 65 64 20 6c 6f 6e 67 29 20 64 61 74 61 3b  gned long) data;
89f0: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66  .  *(short *) (f
8a00: 75 6e 63 74 69 6f 6e 20 2b 20 36 29 20 3d 20 30  unction + 6) = 0
8a10: 78 33 36 34 31 3b 0a 20 20 2a 28 6c 6f 6e 67 20  x3641;.  *(long 
8a20: 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20  *)  (function + 
8a30: 38 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c  8) = (unsigned l
8a40: 6f 6e 67 29 20 76 61 72 69 61 62 6c 65 3b 0a 20  ong) variable;. 
8a50: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e   *(short *) (fun
8a60: 63 74 69 6f 6e 20 2b 31 32 29 20 3d 20 30 78 30  ction +12) = 0x0
8a70: 31 34 30 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29  140;.  *(long *)
8a80: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 34 29    (function +14)
8a90: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e   = (unsigned lon
8aa0: 67 29 20 61 64 64 72 65 73 73 3b 0a 20 20 2a 28  g) address;.  *(
8ab0: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
8ac0: 6f 6e 20 2b 31 38 29 20 3d 20 30 78 30 30 30 30  on +18) = 0x0000
8ad0: 3b 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72 61  ;.#define is_tra
8ae0: 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a  mp(function)  \.
8af0: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f    *(unsigned sho
8b00: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
8b10: 2b 20 30 29 20 3d 3d 20 30 78 31 31 43 39 20 26  + 0) == 0x11C9 &
8b20: 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64  & \.  *(unsigned
8b30: 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74   short *) (funct
8b40: 69 6f 6e 20 2b 20 36 29 20 3d 3d 20 30 78 33 36  ion + 6) == 0x36
8b50: 34 31 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69  41 && \.  *(unsi
8b60: 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66  gned short *) (f
8b70: 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d 3d 20  unction +12) == 
8b80: 30 78 30 31 34 30 20 26 26 20 5c 0a 20 20 2a 28  0x0140 && \.  *(
8b90: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a  unsigned short *
8ba0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 38 29  ) (function +18)
8bb0: 20 3d 3d 20 30 78 30 30 30 30 0a 23 64 65 66 69   == 0x0000.#defi
8bc0: 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 65 73 73  ne tramp_address
8bd0: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20  (function)  \.  
8be0: 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63  *(long *)  (func
8bf0: 74 69 6f 6e 20 2b 31 34 29 0a 23 64 65 66 69 6e  tion +14).#defin
8c00: 65 20 74 72 61 6d 70 5f 76 61 72 69 61 62 6c 65  e tramp_variable
8c10: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20  (function)  \.  
8c20: 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63  *(long *)  (func
8c30: 74 69 6f 6e 20 2b 20 38 29 0a 23 64 65 66 69 6e  tion + 8).#defin
8c40: 65 20 74 72 61 6d 70 5f 64 61 74 61 28 66 75 6e  e tramp_data(fun
8c50: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 6c 6f  ction)  \.  *(lo
8c60: 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e  ng *)  (function
8c70: 20 2b 20 32 29 0a 23 65 6e 64 69 66 0a 23 69 66   + 2).#endif.#if
8c80: 64 65 66 20 5f 5f 69 61 36 34 5f 5f 0a 20 20 2f  def __ia64__.  /
8c90: 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a  * function:.   *
8ca0: 20 20 20 20 64 61 74 61 38 20 20 20 74 72 61 6d      data8   tram
8cb0: 70 0a 20 20 20 2a 20 20 20 20 64 61 74 61 38 20  p.   *    data8 
8cc0: 20 20 63 6c 6f 73 75 72 65 0a 20 20 20 2a 20 63    closure.   * c
8cd0: 6c 6f 73 75 72 65 3a 0a 20 20 20 2a 20 20 20 20  losure:.   *    
8ce0: 64 61 74 61 38 20 20 20 3c 61 64 64 72 65 73 73  data8   <address
8cf0: 3e 0a 20 20 20 2a 20 20 20 20 64 61 74 61 38 20  >.   *    data8 
8d00: 20 20 3c 76 61 72 69 61 62 6c 65 3e 0a 20 20 20    <variable>.   
8d10: 2a 20 20 20 20 64 61 74 61 38 20 20 20 3c 64 61  *    data8   <da
8d20: 74 61 3e 0a 20 20 20 2a 2f 0a 20 20 2a 28 6c 6f  ta>.   */.  *(lo
8d30: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  ng *) (function 
8d40: 2b 20 30 29 20 3d 20 28 6c 6f 6e 67 29 20 26 74  + 0) = (long) &t
8d50: 72 61 6d 70 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a  ramp;.  *(long *
8d60: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29  ) (function + 8)
8d70: 20 3d 20 28 6c 6f 6e 67 29 20 28 66 75 6e 63 74   = (long) (funct
8d80: 69 6f 6e 20 2b 20 31 36 29 3b 0a 20 20 2a 28 6c  ion + 16);.  *(l
8d90: 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ong *) (function
8da0: 20 2b 31 36 29 20 3d 20 28 6c 6f 6e 67 29 20 61   +16) = (long) a
8db0: 64 64 72 65 73 73 3b 0a 20 20 2a 28 6c 6f 6e 67  ddress;.  *(long
8dc0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32   *) (function +2
8dd0: 34 29 20 3d 20 28 6c 6f 6e 67 29 20 76 61 72 69  4) = (long) vari
8de0: 61 62 6c 65 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a  able;.  *(long *
8df0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 33 32 29  ) (function +32)
8e00: 20 3d 20 28 6c 6f 6e 67 29 20 64 61 74 61 3b 0a   = (long) data;.
8e10: 23 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70  #define is_tramp
8e20: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20  (function)  \.  
8e30: 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69  ((long *) functi
8e40: 6f 6e 29 5b 30 5d 20 3d 3d 20 28 6c 6f 6e 67 29  on)[0] == (long)
8e50: 20 26 74 72 61 6d 70 0a 23 64 65 66 69 6e 65 20   &tramp.#define 
8e60: 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75  tramp_address(fu
8e70: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 28 6c  nction)  \.  ((l
8e80: 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29  ong *) function)
8e90: 5b 32 5d 0a 23 64 65 66 69 6e 65 20 74 72 61 6d  [2].#define tram
8ea0: 70 5f 76 61 72 69 61 62 6c 65 28 66 75 6e 63 74  p_variable(funct
8eb0: 69 6f 6e 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67  ion)  \.  ((long
8ec0: 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 33 5d   *) function)[3]
8ed0: 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 64  .#define tramp_d
8ee0: 61 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c  ata(function)  \
8ef0: 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e  .  ((long *) fun
8f00: 63 74 69 6f 6e 29 5b 34 5d 0a 23 65 6e 64 69 66  ction)[4].#endif
8f10: 0a 23 69 66 64 65 66 20 5f 5f 78 38 36 5f 36 34  .#ifdef __x86_64
8f20: 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e  __.  /* function
8f30: 3a 0a 20 20 20 2a 20 20 20 20 6d 6f 76 61 62 73  :.   *    movabs
8f40: 71 20 24 3c 64 61 74 61 3e 2c 25 72 61 78 09 09  q $<data>,%rax..
8f50: 34 38 20 42 38 20 3c 64 61 74 61 3e 0a 20 20 20  48 B8 <data>.   
8f60: 2a 20 20 20 20 6d 6f 76 61 62 73 71 20 25 72 61  *    movabsq %ra
8f70: 78 2c 20 3c 76 61 72 69 61 62 6c 65 3e 09 34 38  x, <variable>.48
8f80: 20 41 33 20 3c 76 61 72 69 61 62 6c 65 3e 0a 20   A3 <variable>. 
8f90: 20 20 2a 20 20 20 20 6d 6f 76 61 62 73 71 20 24    *    movabsq $
8fa0: 3c 61 64 64 72 65 73 73 3e 2c 25 72 61 78 09 09  <address>,%rax..
8fb0: 34 38 20 42 38 20 3c 61 64 64 72 65 73 73 3e 0a  48 B8 <address>.
8fc0: 20 20 20 2a 20 20 20 20 6a 6d 70 20 2a 25 72 61     *    jmp *%ra
8fd0: 78 09 09 09 46 46 20 45 30 0a 20 20 20 2a 2f 0a  x...FF E0.   */.
8fe0: 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75    *(short *) (fu
8ff0: 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20 30 78  nction + 0) = 0x
9000: 42 38 34 38 3b 0a 20 20 2a 28 73 68 6f 72 74 20  B848;.  *(short 
9010: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 32  *) (function + 2
9020: 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ) = (unsigned lo
9030: 6e 67 29 20 64 61 74 61 20 26 20 30 78 66 66 66  ng) data & 0xfff
9040: 66 3b 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 20  f;.  *(int *)   
9050: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d  (function + 4) =
9060: 20 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67   ((unsigned long
9070: 29 20 64 61 74 61 20 3e 3e 20 31 36 29 20 26 20  ) data >> 16) & 
9080: 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20 2a 28  0xffffffff;.  *(
9090: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
90a0: 6f 6e 20 2b 20 38 29 20 3d 20 28 28 75 6e 73 69  on + 8) = ((unsi
90b0: 67 6e 65 64 20 6c 6f 6e 67 29 20 64 61 74 61 20  gned long) data 
90c0: 3e 3e 20 34 38 29 20 26 20 30 78 66 66 66 66 3b  >> 48) & 0xffff;
90d0: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66  .  *(short *) (f
90e0: 75 6e 63 74 69 6f 6e 20 2b 31 30 29 20 3d 20 30  unction +10) = 0
90f0: 78 41 33 34 38 3b 0a 20 20 2a 28 69 6e 74 20 2a  xA348;.  *(int *
9100: 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31  )   (function +1
9110: 32 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c  2) = (unsigned l
9120: 6f 6e 67 29 20 76 61 72 69 61 62 6c 65 20 26 20  ong) variable & 
9130: 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20 2a 28  0xffffffff;.  *(
9140: 69 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69  int *)   (functi
9150: 6f 6e 20 2b 31 36 29 20 3d 20 28 28 75 6e 73 69  on +16) = ((unsi
9160: 67 6e 65 64 20 6c 6f 6e 67 29 20 76 61 72 69 61  gned long) varia
9170: 62 6c 65 20 3e 3e 20 33 32 29 20 26 20 30 78 66  ble >> 32) & 0xf
9180: 66 66 66 66 66 66 66 3b 0a 20 20 2a 28 73 68 6f  fffffff;.  *(sho
9190: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
91a0: 2b 32 30 29 20 3d 20 30 78 42 38 34 38 3b 0a 20  +20) = 0xB848;. 
91b0: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e   *(short *) (fun
91c0: 63 74 69 6f 6e 20 2b 32 32 29 20 3d 20 28 75 6e  ction +22) = (un
91d0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64  signed long) add
91e0: 72 65 73 73 20 26 20 30 78 66 66 66 66 3b 0a 20  ress & 0xffff;. 
91f0: 20 2a 28 69 6e 74 20 2a 29 20 20 20 28 66 75 6e   *(int *)   (fun
9200: 63 74 69 6f 6e 20 2b 32 34 29 20 3d 20 28 28 75  ction +24) = ((u
9210: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 61 64  nsigned long) ad
9220: 64 72 65 73 73 20 3e 3e 20 31 36 29 20 26 20 30  dress >> 16) & 0
9230: 78 66 66 66 66 66 66 66 66 3b 0a 20 20 2a 28 73  xffffffff;.  *(s
9240: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
9250: 6e 20 2b 32 38 29 20 3d 20 28 28 75 6e 73 69 67  n +28) = ((unsig
9260: 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64 72 65 73  ned long) addres
9270: 73 20 3e 3e 20 34 38 29 20 26 20 30 78 66 66 66  s >> 48) & 0xfff
9280: 66 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20  f;.  *(short *) 
9290: 28 66 75 6e 63 74 69 6f 6e 20 2b 33 30 29 20 3d  (function +30) =
92a0: 20 30 78 45 30 46 46 3b 0a 23 64 65 66 69 6e 65   0xE0FF;.#define
92b0: 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69   is_tramp(functi
92c0: 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67  on)  \.  *(unsig
92d0: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75  ned short *) (fu
92e0: 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 3d 20 30  nction + 0) == 0
92f0: 78 42 38 34 38 20 26 26 20 5c 0a 20 20 2a 28 75  xB848 && \.  *(u
9300: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29  nsigned short *)
9310: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 30 29 20   (function +10) 
9320: 3d 3d 20 30 78 41 33 34 38 20 26 26 20 5c 0a 20  == 0xA348 && \. 
9330: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72   *(unsigned shor
9340: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
9350: 32 30 29 20 3d 3d 20 30 78 42 38 34 38 20 26 26  20) == 0xB848 &&
9360: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20   \.  *(unsigned 
9370: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
9380: 6f 6e 20 2b 33 30 29 20 3d 3d 20 30 78 45 30 46  on +30) == 0xE0F
9390: 46 0a 23 64 65 66 69 6e 65 20 68 69 6c 6f 28 68  F.#define hilo(h
93a0: 69 77 6f 72 64 2c 6c 6f 77 6f 72 64 29 20 20 5c  iword,loword)  \
93b0: 0a 20 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c  .  (((unsigned l
93c0: 6f 6e 67 29 20 28 68 69 77 6f 72 64 29 20 3c 3c  ong) (hiword) <<
93d0: 20 33 32 29 20 7c 20 28 75 6e 73 69 67 6e 65 64   32) | (unsigned
93e0: 20 6c 6f 6e 67 29 20 28 6c 6f 77 6f 72 64 29 29   long) (loword))
93f0: 0a 23 64 65 66 69 6e 65 20 68 69 6d 69 64 6c 6f  .#define himidlo
9400: 28 68 69 73 68 6f 72 74 2c 6d 69 64 77 6f 72 64  (hishort,midword
9410: 2c 6c 6f 73 68 6f 72 74 29 20 20 5c 0a 20 20 28  ,loshort)  \.  (
9420: 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29  ((unsigned long)
9430: 20 28 68 69 73 68 6f 72 74 29 20 3c 3c 20 34 38   (hishort) << 48
9440: 29 20 7c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ) | (unsigned lo
9450: 6e 67 29 20 28 6d 69 64 77 6f 72 64 29 20 3c 3c  ng) (midword) <<
9460: 20 31 36 20 5c 0a 20 20 20 7c 20 28 75 6e 73 69   16 \.   | (unsi
9470: 67 6e 65 64 20 6c 6f 6e 67 29 20 28 6c 6f 73 68  gned long) (losh
9480: 6f 72 74 29 29 0a 23 64 65 66 69 6e 65 20 74 72  ort)).#define tr
9490: 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75 6e 63  amp_address(func
94a0: 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6d 69 64  tion)  \.  himid
94b0: 6c 6f 28 2a 28 75 6e 73 69 67 6e 65 64 20 73 68  lo(*(unsigned sh
94c0: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ort *) (function
94d0: 20 2b 32 38 29 2c 20 5c 0a 20 20 20 20 20 20 20   +28), \.       
94e0: 20 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e     *(unsigned in
94f0: 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e  t *)   (function
9500: 20 2b 32 34 29 2c 20 5c 0a 20 20 20 20 20 20 20   +24), \.       
9510: 20 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68     *(unsigned sh
9520: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ort *) (function
9530: 20 2b 32 32 29 29 0a 23 64 65 66 69 6e 65 20 74   +22)).#define t
9540: 72 61 6d 70 5f 76 61 72 69 61 62 6c 65 28 66 75  ramp_variable(fu
9550: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c  nction)  \.  hil
9560: 6f 28 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  o(*(unsigned int
9570: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31   *) (function +1
9580: 36 29 2c 20 2a 28 75 6e 73 69 67 6e 65 64 20 69  6), *(unsigned i
9590: 6e 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  nt *) (function 
95a0: 2b 31 32 29 29 0a 23 64 65 66 69 6e 65 20 74 72  +12)).#define tr
95b0: 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 74 69 6f  amp_data(functio
95c0: 6e 29 20 20 5c 0a 20 20 68 69 6d 69 64 6c 6f 28  n)  \.  himidlo(
95d0: 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74  *(unsigned short
95e0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20   *) (function + 
95f0: 38 29 2c 20 5c 0a 20 20 20 20 20 20 20 20 20 20  8), \.          
9600: 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a  *(unsigned int *
9610: 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20  )   (function + 
9620: 34 29 2c 20 5c 0a 20 20 20 20 20 20 20 20 20 20  4), \.          
9630: 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74  *(unsigned short
9640: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20   *) (function + 
9650: 32 29 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  2)).#endif.#ifde
9660: 66 20 5f 5f 73 33 39 30 5f 5f 0a 20 20 2f 2a 20  f __s390__.  /* 
9670: 66 75 6e 63 74 69 6f 6e 3a 0a 0a 20 20 20 20 20  function:..     
9680: 20 20 20 6c 72 20 20 20 20 20 20 25 72 30 2c 25     lr      %r0,%
9690: 72 31 33 0a 20 20 20 20 20 20 20 20 62 72 61 73  r13.        bras
96a0: 20 20 20 20 25 72 31 33 2c 2e 4c 54 4e 30 5f 30      %r13,.LTN0_0
96b0: 0a 2e 4c 54 30 5f 30 3a 0a 2e 4c 43 30 3a 0a 20  ..LT0_0:..LC0:. 
96c0: 20 20 20 20 20 20 20 2e 6c 6f 6e 67 20 20 20 30         .long   0
96d0: 78 37 33 35 35 34 37 31 31 0a 2e 4c 43 31 3a 0a  x73554711..LC1:.
96e0: 20 20 20 20 20 20 20 20 2e 6c 6f 6e 67 20 20 20          .long   
96f0: 30 78 31 32 33 34 35 36 37 38 0a 2e 4c 43 32 3a  0x12345678..LC2:
9700: 0a 20 20 20 20 20 20 20 20 2e 6c 6f 6e 67 20 20  .        .long  
9710: 20 30 78 62 61 62 65 62 65 63 30 0a 2e 4c 54 4e   0xbabebec0..LTN
9720: 30 5f 30 3a 0a 20 20 20 20 20 20 20 20 6c 20 20  0_0:.        l  
9730: 20 20 20 20 20 25 72 31 2c 2e 4c 43 30 2d 2e 4c       %r1,.LC0-.L
9740: 54 30 5f 30 28 25 72 31 33 29 0a 20 20 20 20 20  T0_0(%r13).     
9750: 20 20 20 6d 76 63 20 20 20 20 20 30 28 34 2c 25     mvc     0(4,%
9760: 72 31 29 2c 2e 4c 43 31 2d 2e 4c 54 30 5f 30 28  r1),.LC1-.LT0_0(
9770: 25 72 31 33 29 0a 20 20 20 20 20 20 20 20 6c 20  %r13).        l 
9780: 20 20 20 20 20 20 25 72 31 2c 2e 4c 43 32 2d 2e        %r1,.LC2-.
9790: 4c 54 31 5f 30 28 25 72 31 33 29 0a 20 20 20 20  LT1_0(%r13).    
97a0: 20 20 20 20 6c 72 20 20 20 20 20 20 25 72 31 33      lr      %r13
97b0: 2c 25 72 30 0a 20 20 20 20 20 20 20 20 62 72 20  ,%r0.        br 
97c0: 20 20 20 20 20 25 72 31 0a 20 20 2a 2f 0a 20 20       %r1.  */.  
97d0: 2f 2a 20 57 68 61 74 20 61 62 6f 75 74 20 62 69  /* What about bi
97e0: 67 20 65 6e 64 69 61 6e 20 2f 20 6c 69 74 74 6c  g endian / littl
97f0: 65 20 65 6e 64 69 61 6e 20 3f 3f 20 2a 2f 0a 20  e endian ?? */. 
9800: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72   *(unsigned shor
9810: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
9820: 20 30 29 20 3d 20 30 78 31 38 30 44 3b 0a 20 20   0) = 0x180D;.  
9830: 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a  *(unsigned int *
9840: 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20  )   (function + 
9850: 32 29 20 3d 20 30 78 41 37 44 35 30 30 30 38 3b  2) = 0xA7D50008;
9860: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e  .  *(unsigned in
9870: 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e  t *)   (function
9880: 20 2b 20 36 29 20 3d 20 28 75 6e 73 69 67 6e 65   + 6) = (unsigne
9890: 64 20 69 6e 74 29 20 76 61 72 69 61 62 6c 65 3b  d int) variable;
98a0: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e  .  *(unsigned in
98b0: 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e  t *)   (function
98c0: 20 2b 31 30 29 20 3d 20 28 75 6e 73 69 67 6e 65   +10) = (unsigne
98d0: 64 20 69 6e 74 29 20 64 61 74 61 3b 0a 20 20 2a  d int) data;.  *
98e0: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29  (unsigned int *)
98f0: 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 34     (function +14
9900: 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  ) = (unsigned in
9910: 74 29 20 61 64 64 72 65 73 73 3b 0a 20 20 2a 28  t) address;.  *(
9920: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20  unsigned int *) 
9930: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 38 29    (function +18)
9940: 20 3d 20 30 78 35 38 31 30 44 30 30 30 3b 0a 20   = 0x5810D000;. 
9950: 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20   *(unsigned int 
9960: 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b  *)   (function +
9970: 32 32 29 20 3d 20 30 78 44 32 30 33 31 30 30 30  22) = 0xD2031000
9980: 3b 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73  ;.  *(unsigned s
9990: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
99a0: 6e 20 2b 32 36 29 20 3d 20 30 78 44 30 30 34 3b  n +26) = 0xD004;
99b0: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e  .  *(unsigned in
99c0: 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e  t *)   (function
99d0: 20 2b 32 38 29 20 3d 20 30 78 35 38 31 30 44 30   +28) = 0x5810D0
99e0: 30 38 3b 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64  08;.  *(unsigned
99f0: 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74   short *) (funct
9a00: 69 6f 6e 20 2b 33 32 29 20 3d 20 30 78 31 38 44  ion +32) = 0x18D
9a10: 30 3b 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20  0;.  *(unsigned 
9a20: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
9a30: 6f 6e 20 2b 33 34 29 20 3d 20 30 78 30 37 66 31  on +34) = 0x07f1
9a40: 3b 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72 61  ;.#define is_tra
9a50: 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a  mp(function)  \.
9a60: 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 20 20 20    *(short *)    
9a70: 20 20 20 20 20 20 28 66 75 6e 63 74 69 6f 6e 20        (function 
9a80: 2b 20 30 29 20 3d 3d 20 30 78 31 38 30 44 20 26  + 0) == 0x180D &
9a90: 26 20 5c 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20  & \.  *(int *)  
9aa0: 20 20 20 20 20 20 20 20 20 20 28 66 75 6e 63 74            (funct
9ab0: 69 6f 6e 20 2b 20 32 29 20 3d 3d 20 30 78 41 37  ion + 2) == 0xA7
9ac0: 44 35 30 30 30 38 20 26 26 20 5c 0a 20 20 2a 28  D50008 && \.  *(
9ad0: 69 6e 74 20 2a 29 20 20 20 20 20 20 20 20 20 20  int *)          
9ae0: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 38 29    (function +18)
9af0: 20 3d 3d 20 30 78 35 38 31 30 44 30 30 30 20 26   == 0x5810D000 &
9b00: 26 20 5c 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20  & \.  *(int *)  
9b10: 20 20 20 20 20 20 20 20 20 20 28 66 75 6e 63 74            (funct
9b20: 69 6f 6e 20 2b 32 32 29 20 3d 3d 20 30 78 44 32  ion +22) == 0xD2
9b30: 30 33 31 30 30 30 20 26 26 20 5c 0a 20 20 2a 28  031000 && \.  *(
9b40: 73 68 6f 72 74 20 2a 29 20 20 20 20 20 20 20 20  short *)        
9b50: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 36 29    (function +26)
9b60: 20 3d 3d 20 30 78 44 30 30 34 20 26 26 20 5c 0a   == 0xD004 && \.
9b70: 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 20 20 20    *(int *)      
9b80: 20 20 20 20 20 20 28 66 75 6e 63 74 69 6f 6e 20        (function 
9b90: 2b 32 38 29 20 3d 3d 20 30 78 35 38 31 30 44 30  +28) == 0x5810D0
9ba0: 30 38 20 26 26 20 5c 0a 20 20 2a 28 73 68 6f 72  08 && \.  *(shor
9bb0: 74 20 2a 29 20 20 20 20 20 20 20 20 20 20 28 66  t *)          (f
9bc0: 75 6e 63 74 69 6f 6e 20 2b 33 32 29 20 3d 3d 20  unction +32) == 
9bd0: 30 78 31 38 44 30 20 26 26 20 5c 0a 20 20 2a 28  0x18D0 && \.  *(
9be0: 73 68 6f 72 74 20 2a 29 20 20 20 20 20 20 20 20  short *)        
9bf0: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 33 34 29    (function +34)
9c00: 20 3d 3d 20 30 78 30 37 66 31 0a 23 64 65 66 69   == 0x07f1.#defi
9c10: 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 65 73 73  ne tramp_address
9c20: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20  (function)  \.  
9c30: 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a  *(unsigned int *
9c40: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 34 29  ) (function +14)
9c50: 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 76  .#define tramp_v
9c60: 61 72 69 61 62 6c 65 28 66 75 6e 63 74 69 6f 6e  ariable(function
9c70: 29 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65  )  \.  *(unsigne
9c80: 64 20 69 6e 74 20 2a 29 20 28 66 75 6e 63 74 69  d int *) (functi
9c90: 6f 6e 20 2b 36 29 0a 23 64 65 66 69 6e 65 20 74  on +6).#define t
9ca0: 72 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 74 69  ramp_data(functi
9cb0: 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67  on)  \.  *(unsig
9cc0: 6e 65 64 20 69 6e 74 20 2a 29 20 28 66 75 6e 63  ned int *) (func
9cd0: 74 69 6f 6e 20 2b 31 30 29 0a 23 65 6e 64 69 66  tion +10).#endif
9ce0: 0a 0a 20 20 2f 2a 20 33 2e 20 53 65 74 20 6d 65  ..  /* 3. Set me
9cf0: 6d 6f 72 79 20 70 72 6f 74 65 63 74 69 6f 6e 20  mory protection 
9d00: 74 6f 20 22 65 78 65 63 75 74 61 62 6c 65 22 20  to "executable" 
9d10: 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
9d20: 28 43 4f 44 45 5f 45 58 45 43 55 54 41 42 4c 45  (CODE_EXECUTABLE
9d30: 29 20 26 26 20 64 65 66 69 6e 65 64 28 45 58 45  ) && defined(EXE
9d40: 43 55 54 41 42 4c 45 5f 56 49 41 5f 4d 50 52 4f  CUTABLE_VIA_MPRO
9d50: 54 45 43 54 29 0a 20 20 2f 2a 20 43 61 6c 6c 20  TECT).  /* Call 
9d60: 6d 70 72 6f 74 65 63 74 20 6f 6e 20 74 68 65 20  mprotect on the 
9d70: 70 61 67 65 73 20 74 68 61 74 20 63 6f 6e 74 61  pages that conta
9d80: 69 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f  in the range. */
9d90: 0a 20 20 7b 20 75 6e 73 69 67 6e 65 64 20 6c 6f  .  { unsigned lo
9da0: 6e 67 20 73 74 61 72 74 5f 61 64 64 72 20 3d 20  ng start_addr = 
9db0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
9dc0: 66 75 6e 63 74 69 6f 6e 3b 0a 20 20 20 20 75 6e  function;.    un
9dd0: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 65 6e 64 5f  signed long end_
9de0: 61 64 64 72 20 3d 20 28 75 6e 73 69 67 6e 65 64  addr = (unsigned
9df0: 20 6c 6f 6e 67 29 20 28 66 75 6e 63 74 69 6f 6e   long) (function
9e00: 20 2b 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 29   + TRAMP_LENGTH)
9e10: 3b 0a 20 20 20 20 73 74 61 72 74 5f 61 64 64 72  ;.    start_addr
9e20: 20 3d 20 73 74 61 72 74 5f 61 64 64 72 20 26 20   = start_addr & 
9e30: 2d 70 61 67 65 73 69 7a 65 3b 0a 20 20 20 20 65  -pagesize;.    e
9e40: 6e 64 5f 61 64 64 72 20 3d 20 28 65 6e 64 5f 61  nd_addr = (end_a
9e50: 64 64 72 20 2b 20 70 61 67 65 73 69 7a 65 2d 31  ddr + pagesize-1
9e60: 29 20 26 20 2d 70 61 67 65 73 69 7a 65 3b 0a 20  ) & -pagesize;. 
9e70: 20 20 7b 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67    {unsigned long
9e80: 20 6c 65 6e 20 3d 20 65 6e 64 5f 61 64 64 72 20   len = end_addr 
9e90: 2d 20 73 74 61 72 74 5f 61 64 64 72 3b 0a 23 69  - start_addr;.#i
9ea0: 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 4d  f defined(HAVE_M
9eb0: 41 43 48 5f 56 4d 29 0a 20 20 20 20 69 66 20 28  ACH_VM).    if (
9ec0: 76 6d 5f 70 72 6f 74 65 63 74 28 74 61 73 6b 5f  vm_protect(task_
9ed0: 73 65 6c 66 28 29 2c 73 74 61 72 74 5f 61 64 64  self(),start_add
9ee0: 72 2c 6c 65 6e 2c 30 2c 56 4d 5f 50 52 4f 54 5f  r,len,0,VM_PROT_
9ef0: 52 45 41 44 7c 56 4d 5f 50 52 4f 54 5f 57 52 49  READ|VM_PROT_WRI
9f00: 54 45 7c 56 4d 5f 50 52 4f 54 5f 45 58 45 43 55  TE|VM_PROT_EXECU
9f10: 54 45 29 20 21 3d 20 4b 45 52 4e 5f 53 55 43 43  TE) != KERN_SUCC
9f20: 45 53 53 29 0a 23 65 6c 73 65 0a 23 69 66 20 64  ESS).#else.#if d
9f30: 65 66 69 6e 65 64 28 5f 5f 63 6f 6e 76 65 78 5f  efined(__convex_
9f40: 5f 29 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 78  _).    /* Convex
9f50: 20 4f 53 20 63 61 6c 6c 73 20 69 74 20 60 6d 72   OS calls it `mr
9f60: 65 6d 61 70 28 29 27 2e 20 2a 2f 0a 20 20 20 20  emap()'. */.    
9f70: 6d 72 65 6d 61 70 28 73 74 61 72 74 5f 61 64 64  mremap(start_add
9f80: 72 2c 20 26 6c 65 6e 2c 20 50 52 4f 54 5f 52 45  r, &len, PROT_RE
9f90: 41 44 7c 50 52 4f 54 5f 57 52 49 54 45 7c 50 52  AD|PROT_WRITE|PR
9fa0: 4f 54 5f 45 58 45 43 2c 20 4d 41 50 5f 50 52 49  OT_EXEC, MAP_PRI
9fb0: 56 41 54 45 29 3b 0a 20 20 20 20 69 66 20 28 30  VATE);.    if (0
9fc0: 29 0a 23 65 6c 73 65 0a 23 69 66 20 64 65 66 69  ).#else.#if defi
9fd0: 6e 65 64 28 48 41 56 45 5f 53 59 53 5f 4d 38 38  ned(HAVE_SYS_M88
9fe0: 4b 42 43 53 5f 48 29 0a 20 20 20 20 69 66 20 28  KBCS_H).    if (
9ff0: 6d 65 6d 63 74 6c 28 73 74 61 72 74 5f 61 64 64  memctl(start_add
a000: 72 2c 20 6c 65 6e 2c 20 4d 43 54 5f 54 45 58 54  r, len, MCT_TEXT
a010: 29 20 3d 3d 20 2d 31 29 0a 23 65 6c 73 65 0a 20  ) == -1).#else. 
a020: 20 20 20 69 66 20 28 6d 70 72 6f 74 65 63 74 28     if (mprotect(
a030: 28 76 6f 69 64 2a 29 73 74 61 72 74 5f 61 64 64  (void*)start_add
a040: 72 2c 20 6c 65 6e 2c 20 50 52 4f 54 5f 52 45 41  r, len, PROT_REA
a050: 44 7c 50 52 4f 54 5f 57 52 49 54 45 7c 50 52 4f  D|PROT_WRITE|PRO
a060: 54 5f 45 58 45 43 29 20 3c 20 30 29 0a 23 65 6e  T_EXEC) < 0).#en
a070: 64 69 66 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69  dif.#endif.#endi
a080: 66 0a 20 20 20 20 20 20 7b 20 66 70 72 69 6e 74  f.      { fprint
a090: 66 28 73 74 64 65 72 72 2c 22 74 72 61 6d 70 6f  f(stderr,"trampo
a0a0: 6c 69 6e 65 3a 20 63 61 6e 6e 6f 74 20 6d 61 6b  line: cannot mak
a0b0: 65 20 6d 65 6d 6f 72 79 20 65 78 65 63 75 74 61  e memory executa
a0c0: 62 6c 65 5c 6e 22 29 3b 20 61 62 6f 72 74 28 29  ble\n"); abort()
a0d0: 3b 20 7d 0a 20 20 7d 7d 0a 23 65 6e 64 69 66 0a  ; }.  }}.#endif.
a0e0: 0a 20 20 2f 2a 20 34 2e 20 46 6c 75 73 68 20 69  .  /* 4. Flush i
a0f0: 6e 73 74 72 75 63 74 69 6f 6e 20 63 61 63 68 65  nstruction cache
a100: 20 2a 2f 0a 20 20 2f 2a 20 57 65 20 6e 65 65 64   */.  /* We need
a110: 20 74 68 69 73 20 62 65 63 61 75 73 65 20 73 6f   this because so
a120: 6d 65 20 43 50 55 73 20 68 61 76 65 20 73 65 70  me CPUs have sep
a130: 61 72 61 74 65 20 64 61 74 61 20 63 61 63 68 65  arate data cache
a140: 20 61 6e 64 20 69 6e 73 74 72 75 63 74 69 6f 6e   and instruction
a150: 0a 20 20 20 2a 20 63 61 63 68 65 2e 20 54 68 65  .   * cache. The
a160: 20 66 72 65 73 68 6c 79 20 62 75 69 6c 74 20 74   freshly built t
a170: 72 61 6d 70 6f 6c 69 6e 65 20 69 73 20 76 69 73  rampoline is vis
a180: 69 62 6c 65 20 74 6f 20 74 68 65 20 64 61 74 61  ible to the data
a190: 20 63 61 63 68 65 2c 20 62 75 74 20 6e 6f 74 0a   cache, but not.
a1a0: 20 20 20 2a 20 6d 61 79 62 65 20 6e 6f 74 20 74     * maybe not t
a1b0: 6f 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  o the instructio
a1c0: 6e 20 63 61 63 68 65 2e 20 54 68 69 73 20 69 73  n cache. This is
a1d0: 20 68 61 69 72 79 2e 0a 20 20 20 2a 2f 0a 23 69   hairy..   */.#i
a1e0: 66 20 21 28 64 65 66 69 6e 65 64 28 5f 5f 68 70  f !(defined(__hp
a1f0: 70 61 6e 65 77 5f 5f 29 20 7c 7c 20 64 65 66 69  panew__) || defi
a200: 6e 65 64 28 5f 5f 72 73 36 30 30 30 61 69 78 5f  ned(__rs6000aix_
a210: 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f  _) || defined(__
a220: 69 61 36 34 5f 5f 29 29 0a 20 20 2f 2a 20 4f 6e  ia64__)).  /* On
a230: 6c 79 20 6e 65 65 64 65 64 20 69 66 20 77 65 20  ly needed if we 
a240: 72 65 61 6c 6c 79 20 73 65 74 20 75 70 20 6d 61  really set up ma
a250: 63 68 69 6e 65 20 69 6e 73 74 72 75 63 74 69 6f  chine instructio
a260: 6e 73 2e 20 2a 2f 0a 23 69 66 64 65 66 20 5f 5f  ns. */.#ifdef __
a270: 69 33 38 36 5f 5f 0a 23 69 66 20 64 65 66 69 6e  i386__.#if defin
a280: 65 64 28 5f 57 49 4e 33 32 29 0a 20 20 77 68 69  ed(_WIN32).  whi
a290: 6c 65 20 28 21 46 6c 75 73 68 49 6e 73 74 72 75  le (!FlushInstru
a2a0: 63 74 69 6f 6e 43 61 63 68 65 28 47 65 74 43 75  ctionCache(GetCu
a2b0: 72 72 65 6e 74 50 72 6f 63 65 73 73 28 29 2c 66  rrentProcess(),f
a2c0: 75 6e 63 74 69 6f 6e 2c 54 52 41 4d 50 5f 4c 45  unction,TRAMP_LE
a2d0: 4e 47 54 48 29 29 0a 20 20 20 20 63 6f 6e 74 69  NGTH)).    conti
a2e0: 6e 75 65 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64  nue;.#endif.#end
a2f0: 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d 36 38 6b  if.#ifdef __m68k
a300: 5f 5f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  __.#if defined(N
a310: 65 58 54 29 20 26 26 20 64 65 66 69 6e 65 64 28  eXT) && defined(
a320: 5f 5f 47 4e 55 43 5f 5f 29 0a 20 20 5f 5f 61 73  __GNUC__).  __as
a330: 6d 5f 5f 20 5f 5f 76 6f 6c 61 74 69 6c 65 5f 5f  m__ __volatile__
a340: 20 28 22 74 72 61 70 20 23 32 22 29 3b 0a 23 65   ("trap #2");.#e
a350: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
a360: 28 41 4d 49 47 41 29 0a 20 20 43 61 63 68 65 43  (AMIGA).  CacheC
a370: 6c 65 61 72 45 28 66 75 6e 63 74 69 6f 6e 2c 54  learE(function,T
a380: 52 41 4d 50 5f 4c 45 4e 47 54 48 2c 43 41 43 52  RAMP_LENGTH,CACR
a390: 46 5f 43 6c 65 61 72 49 7c 43 41 43 52 46 5f 43  F_ClearI|CACRF_C
a3a0: 6c 65 61 72 44 29 3b 0a 23 65 6e 64 69 66 0a 23  learD);.#endif.#
a3b0: 69 66 20 64 65 66 69 6e 65 64 28 61 70 6f 6c 6c  if defined(apoll
a3c0: 6f 29 0a 20 20 63 61 63 68 65 5f 24 63 6c 65 61  o).  cache_$clea
a3d0: 72 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  r();.#endif.#if 
a3e0: 64 65 66 69 6e 65 64 28 68 70 75 78 29 0a 20 20  defined(hpux).  
a3f0: 63 61 63 68 65 63 74 6c 28 43 43 5f 49 50 55 52  cachectl(CC_IPUR
a400: 47 45 2c 66 75 6e 63 74 69 6f 6e 2c 54 52 41 4d  GE,function,TRAM
a410: 50 5f 4c 45 4e 47 54 48 29 3b 0a 23 65 6e 64 69  P_LENGTH);.#endi
a420: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  f.#if defined(__
a430: 4e 65 74 42 53 44 5f 5f 29 20 26 26 20 64 65 66  NetBSD__) && def
a440: 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a 20  ined(__GNUC__). 
a450: 20 7b 20 72 65 67 69 73 74 65 72 20 75 6e 73 69   { register unsi
a460: 67 6e 65 64 20 6c 6f 6e 67 20 5f 62 65 67 20 5f  gned long _beg _
a470: 5f 61 73 6d 5f 5f 20 28 22 25 61 31 22 29 20 3d  _asm__ ("%a1") =
a480: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
a490: 20 66 75 6e 63 74 69 6f 6e 3b 0a 20 20 20 20 72   function;.    r
a4a0: 65 67 69 73 74 65 72 20 75 6e 73 69 67 6e 65 64  egister unsigned
a4b0: 20 6c 6f 6e 67 20 5f 6c 65 6e 20 5f 5f 61 73 6d   long _len __asm
a4c0: 5f 5f 20 28 22 25 64 31 22 29 20 3d 20 54 52 41  __ ("%d1") = TRA
a4d0: 4d 50 5f 4c 45 4e 47 54 48 3b 0a 20 20 20 20 5f  MP_LENGTH;.    _
a4e0: 5f 61 73 6d 5f 5f 20 5f 5f 76 6f 6c 61 74 69 6c  _asm__ __volatil
a4f0: 65 5f 5f 20 28 0a 20 20 20 20 20 20 22 6d 6f 76  e__ (.      "mov
a500: 65 25 2e 6c 20 25 23 30 78 38 30 30 30 30 30 30  e%.l %#0x8000000
a510: 34 2c 25 2f 64 30 5c 6e 5c 74 22 20 2f 2a 20 43  4,%/d0\n\t" /* C
a520: 43 5f 45 58 54 50 55 52 47 45 20 7c 20 43 5f 49  C_EXTPURGE | C_I
a530: 50 55 52 47 45 20 2a 2f 0a 20 20 20 20 20 20 22  PURGE */.      "
a540: 74 72 61 70 20 23 31 32 22 20 20 20 20 20 20 20  trap #12"       
a550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a560: 2a 20 6b 65 72 6e 65 6c 20 63 61 6c 6c 20 60 63  * kernel call `c
a570: 61 63 68 65 63 74 6c 27 20 2a 2f 0a 20 20 20 20  achectl' */.    
a580: 20 20 3a 0a 20 20 20 20 20 20 3a 20 22 61 22 20    :.      : "a" 
a590: 28 5f 62 65 67 29 2c 20 22 64 22 20 28 5f 6c 65  (_beg), "d" (_le
a5a0: 6e 29 0a 20 20 20 20 20 20 3a 20 22 25 61 30 22  n).      : "%a0"
a5b0: 2c 20 22 25 61 31 22 2c 20 22 25 64 30 22 2c 20  , "%a1", "%d0", 
a5c0: 22 25 64 31 22 20 20 20 20 2f 2a 20 63 61 6c 6c  "%d1"    /* call
a5d0: 2d 75 73 65 64 20 72 65 67 69 73 74 65 72 73 20  -used registers 
a5e0: 2a 2f 0a 20 20 20 20 20 20 29 3b 0a 20 20 7d 0a  */.      );.  }.
a5f0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
a600: 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26  ed(__linux__) &&
a610: 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f   defined(__GNUC_
a620: 5f 29 0a 20 20 7b 20 72 65 67 69 73 74 65 72 20  _).  { register 
a630: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 5f 62  unsigned long _b
a640: 65 67 20 5f 5f 61 73 6d 5f 5f 20 28 22 25 64 31  eg __asm__ ("%d1
a650: 22 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c  ") = (unsigned l
a660: 6f 6e 67 29 20 66 75 6e 63 74 69 6f 6e 3b 0a 20  ong) function;. 
a670: 20 20 20 72 65 67 69 73 74 65 72 20 75 6e 73 69     register unsi
a680: 67 6e 65 64 20 6c 6f 6e 67 20 5f 6c 65 6e 20 5f  gned long _len _
a690: 5f 61 73 6d 5f 5f 20 28 22 25 64 34 22 29 20 3d  _asm__ ("%d4") =
a6a0: 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 2b 20   TRAMP_LENGTH + 
a6b0: 33 32 3b 0a 20 20 20 20 5f 5f 61 73 6d 5f 5f 20  32;.    __asm__ 
a6c0: 5f 5f 76 6f 6c 61 74 69 6c 65 5f 5f 20 28 0a 20  __volatile__ (. 
a6d0: 20 20 20 20 20 22 6d 6f 76 65 25 2e 6c 20 25 23       "move%.l %#
a6e0: 31 32 33 2c 25 2f 64 30 5c 6e 5c 74 22 0a 20 20  123,%/d0\n\t".  
a6f0: 20 20 20 20 22 6d 6f 76 65 25 2e 6c 20 25 23 31      "move%.l %#1
a700: 2c 25 2f 64 32 5c 6e 5c 74 22 0a 20 20 20 20 20  ,%/d2\n\t".     
a710: 20 22 6d 6f 76 65 25 2e 6c 20 25 23 33 2c 25 2f   "move%.l %#3,%/
a720: 64 33 5c 6e 5c 74 22 0a 20 20 20 20 20 20 22 74  d3\n\t".      "t
a730: 72 61 70 20 25 23 30 22 0a 20 20 20 20 20 20 3a  rap %#0".      :
a740: 0a 20 20 20 20 20 20 3a 20 22 64 22 20 28 5f 62  .      : "d" (_b
a750: 65 67 29 2c 20 22 64 22 20 28 5f 6c 65 6e 29 0a  eg), "d" (_len).
a760: 20 20 20 20 20 20 3a 20 22 25 64 30 22 2c 20 22        : "%d0", "
a770: 25 64 32 22 2c 20 22 25 64 33 22 0a 20 20 20 20  %d2", "%d3".    
a780: 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a    );.  }.#endif.
a790: 23 69 66 20 64 65 66 69 6e 65 64 28 41 55 58 29  #if defined(AUX)
a7a0: 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e   && defined(__GN
a7b0: 55 43 5f 5f 29 0a 20 20 2f 2a 20 73 79 73 6d 36  UC__).  /* sysm6
a7c0: 38 6b 28 31 30 35 2c 20 61 64 64 72 2c 20 73 63  8k(105, addr, sc
a7d0: 6f 70 65 2c 20 63 61 63 68 65 2c 20 6c 65 6e 29  ope, cache, len)
a7e0: 20 2a 2f 0a 20 20 5f 5f 61 73 6d 5f 5f 20 5f 5f   */.  __asm__ __
a7f0: 76 6f 6c 61 74 69 6c 65 5f 5f 20 28 0a 20 20 20  volatile__ (.   
a800: 20 22 6d 6f 76 65 25 2e 6c 20 25 31 2c 25 2f 73   "move%.l %1,%/s
a810: 70 40 2d 5c 6e 5c 74 22 0a 20 20 20 20 22 6d 6f  p@-\n\t".    "mo
a820: 76 65 25 2e 6c 20 25 23 33 2c 25 2f 73 70 40 2d  ve%.l %#3,%/sp@-
a830: 5c 6e 5c 74 22 0a 20 20 20 20 22 6d 6f 76 65 25  \n\t".    "move%
a840: 2e 6c 20 25 23 31 2c 25 2f 73 70 40 2d 5c 6e 5c  .l %#1,%/sp@-\n\
a850: 74 22 0a 20 20 20 20 22 6d 6f 76 65 25 2e 6c 20  t".    "move%.l 
a860: 25 30 2c 25 2f 73 70 40 2d 5c 6e 5c 74 22 0a 20  %0,%/sp@-\n\t". 
a870: 20 20 20 22 6d 6f 76 65 25 2e 6c 20 25 23 31 30     "move%.l %#10
a880: 35 2c 25 2f 73 70 40 2d 5c 6e 5c 74 22 0a 20 20  5,%/sp@-\n\t".  
a890: 20 20 22 6d 6f 76 65 25 2e 6c 20 25 23 30 2c 25    "move%.l %#0,%
a8a0: 2f 73 70 40 2d 5c 6e 5c 74 22 0a 20 20 20 20 22  /sp@-\n\t".    "
a8b0: 6d 6f 76 65 25 2e 6c 20 25 23 33 38 2c 25 2f 73  move%.l %#38,%/s
a8c0: 70 40 2d 5c 6e 5c 74 22 0a 20 20 20 20 22 74 72  p@-\n\t".    "tr
a8d0: 61 70 20 25 23 30 5c 6e 5c 74 22 0a 20 20 20 20  ap %#0\n\t".    
a8e0: 22 61 64 64 25 2e 6c 20 25 23 32 34 2c 25 2f 73  "add%.l %#24,%/s
a8f0: 70 22 0a 20 20 20 20 3a 0a 20 20 20 20 3a 20 22  p".    :.    : "
a900: 72 22 20 28 66 75 6e 63 74 69 6f 6e 29 2c 20 22  r" (function), "
a910: 67 22 20 28 28 69 6e 74 29 54 52 41 4d 50 5f 4c  g" ((int)TRAMP_L
a920: 45 4e 47 54 48 29 0a 20 20 20 20 3a 20 22 25 64  ENGTH).    : "%d
a930: 30 22 0a 20 20 20 20 29 3b 0a 23 65 6e 64 69 66  0".    );.#endif
a940: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
a950: 6e 65 64 28 5f 5f 6d 69 70 73 5f 5f 29 20 7c 7c  ned(__mips__) ||
a960: 20 64 65 66 69 6e 65 64 28 5f 5f 6d 69 70 73 6e   defined(__mipsn
a970: 33 32 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64  32__) || defined
a980: 28 5f 5f 6d 69 70 73 36 34 5f 5f 29 0a 20 20 63  (__mips64__).  c
a990: 61 63 68 65 66 6c 75 73 68 28 66 75 6e 63 74 69  acheflush(functi
a9a0: 6f 6e 2c 54 52 41 4d 50 5f 4c 45 4e 47 54 48 2c  on,TRAMP_LENGTH,
a9b0: 49 43 41 43 48 45 29 3b 0a 20 20 2f 2a 20 67 66  ICACHE);.  /* gf
a9c0: 6f 72 74 68 2d 30 2e 33 2e 30 20 75 73 65 73 20  orth-0.3.0 uses 
a9d0: 42 43 41 43 48 45 20 69 6e 73 74 65 61 64 20 6f  BCACHE instead o
a9e0: 66 20 49 43 41 43 48 45 2e 20 57 68 79 3f 3f 20  f ICACHE. Why?? 
a9f0: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  */.#endif.#if de
aa00: 66 69 6e 65 64 28 5f 5f 73 70 61 72 63 5f 5f 29  fined(__sparc__)
aa10: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 73 70   || defined(__sp
aa20: 61 72 63 36 34 5f 5f 29 0a 20 20 2f 2a 20 54 68  arc64__).  /* Th
aa30: 69 73 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  is assumes that 
aa40: 74 68 65 20 74 72 61 6d 70 6f 6c 69 6e 65 20 66  the trampoline f
aa50: 69 74 73 20 69 6e 20 61 74 20 6d 6f 73 74 20 66  its in at most f
aa60: 6f 75 72 20 63 61 63 68 65 20 6c 69 6e 65 73 2e  our cache lines.
aa70: 20 2a 2f 0a 20 20 5f 5f 54 52 5f 63 6c 65 61 72   */.  __TR_clear
aa80: 5f 63 61 63 68 65 5f 34 28 66 75 6e 63 74 69 6f  _cache_4(functio
aa90: 6e 2c 66 75 6e 63 74 69 6f 6e 2b 54 52 41 4d 50  n,function+TRAMP
aaa0: 5f 4c 45 4e 47 54 48 2d 31 29 3b 0a 23 65 6e 64  _LENGTH-1);.#end
aab0: 69 66 0a 23 69 66 64 65 66 20 5f 5f 61 6c 70 68  if.#ifdef __alph
aac0: 61 5f 5f 0a 20 20 5f 5f 54 52 5f 63 6c 65 61 72  a__.  __TR_clear
aad0: 5f 63 61 63 68 65 28 29 3b 0a 23 65 6e 64 69 66  _cache();.#endif
aae0: 0a 23 69 66 64 65 66 20 5f 5f 68 70 70 61 5f 5f  .#ifdef __hppa__
aaf0: 0a 20 20 2f 2a 20 54 68 69 73 20 61 73 73 75 6d  .  /* This assum
ab00: 65 73 20 74 68 61 74 20 74 68 65 20 74 72 61 6d  es that the tram
ab10: 70 6f 6c 69 6e 65 20 66 69 74 73 20 69 6e 20 61  poline fits in a
ab20: 74 20 6d 6f 73 74 20 74 77 6f 20 63 61 63 68 65  t most two cache
ab30: 20 6c 69 6e 65 73 2e 20 2a 2f 0a 20 20 5f 5f 54   lines. */.  __T
ab40: 52 5f 63 6c 65 61 72 5f 63 61 63 68 65 28 66 75  R_clear_cache(fu
ab50: 6e 63 74 69 6f 6e 2c 66 75 6e 63 74 69 6f 6e 2b  nction,function+
ab60: 54 52 41 4d 50 5f 4c 45 4e 47 54 48 2d 31 29 3b  TRAMP_LENGTH-1);
ab70: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f  .#endif.#ifdef _
ab80: 5f 61 72 6d 5f 5f 0a 20 20 2f 2a 20 54 68 69 73  _arm__.  /* This
ab90: 20 43 50 55 20 64 6f 65 73 20 6e 6f 74 20 68 61   CPU does not ha
aba0: 76 65 20 61 20 73 65 70 61 72 61 74 65 20 69 6e  ve a separate in
abb0: 73 74 72 75 63 74 69 6f 6e 20 63 61 63 68 65 2e  struction cache.
abc0: 20 28 49 20 74 68 69 6e 6b 2e 29 20 2a 2f 0a 23   (I think.) */.#
abd0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 72  endif.#ifdef __r
abe0: 73 36 30 30 30 5f 5f 0a 20 20 5f 5f 54 52 5f 63  s6000__.  __TR_c
abf0: 6c 65 61 72 5f 63 61 63 68 65 28 66 75 6e 63 74  lear_cache(funct
ac00: 69 6f 6e 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  ion);.#endif.#if
ac10: 64 65 66 20 5f 5f 6d 38 38 6b 5f 5f 0a 20 20 73  def __m88k__.  s
ac20: 79 73 6d 6f 74 28 53 38 38 43 41 43 48 45 46 4c  ysmot(S88CACHEFL
ac30: 55 53 48 50 41 47 45 2c 20 28 75 6e 73 69 67 6e  USHPAGE, (unsign
ac40: 65 64 20 6c 6f 6e 67 29 66 75 6e 63 74 69 6f 6e  ed long)function
ac50: 20 26 20 2d 70 61 67 65 73 69 7a 65 29 3b 0a 23   & -pagesize);.#
ac60: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 63  endif.#ifdef __c
ac70: 6f 6e 76 65 78 5f 5f 0a 20 20 5f 5f 54 52 5f 63  onvex__.  __TR_c
ac80: 6c 65 61 72 5f 63 61 63 68 65 28 29 3b 0a 23 65  lear_cache();.#e
ac90: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  ndif.#endif..  /
aca0: 2a 20 35 2e 20 52 65 74 75 72 6e 2e 20 2a 2f 0a  * 5. Return. */.
acb0: 20 20 72 65 74 75 72 6e 20 28 5f 5f 54 52 5f 66    return (__TR_f
acc0: 75 6e 63 74 69 6f 6e 29 20 28 66 75 6e 63 74 69  unction) (functi
acd0: 6f 6e 20 2b 20 54 52 41 4d 50 5f 42 49 41 53 29  on + TRAMP_BIAS)
ace0: 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ;.}..#if defined
acf0: 28 5f 5f 53 54 44 43 5f 5f 29 20 7c 7c 20 64 65  (__STDC__) || de
ad00: 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 20  fined(__GNUC__) 
ad10: 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c  || defined(__cpl
ad20: 75 73 70 6c 75 73 29 0a 76 6f 69 64 20 66 72 65  usplus).void fre
ad30: 65 5f 74 72 61 6d 70 6f 6c 69 6e 65 20 28 5f 5f  e_trampoline (__
ad40: 54 52 5f 66 75 6e 63 74 69 6f 6e 20 66 75 6e 63  TR_function func
ad50: 74 69 6f 6e 29 0a 23 65 6c 73 65 0a 76 6f 69 64  tion).#else.void
ad60: 20 66 72 65 65 5f 74 72 61 6d 70 6f 6c 69 6e 65   free_trampoline
ad70: 20 28 66 75 6e 63 74 69 6f 6e 29 0a 20 20 5f 5f   (function).  __
ad80: 54 52 5f 66 75 6e 63 74 69 6f 6e 20 66 75 6e 63  TR_function func
ad90: 74 69 6f 6e 3b 0a 23 65 6e 64 69 66 0a 7b 0a 23  tion;.#endif.{.#
ada0: 69 66 20 54 52 41 4d 50 5f 42 49 41 53 0a 20 20  if TRAMP_BIAS.  
adb0: 66 75 6e 63 74 69 6f 6e 20 3d 20 28 5f 5f 54 52  function = (__TR
adc0: 5f 66 75 6e 63 74 69 6f 6e 29 28 28 63 68 61 72  _function)((char
add0: 2a 29 66 75 6e 63 74 69 6f 6e 20 2d 20 54 52 41  *)function - TRA
ade0: 4d 50 5f 42 49 41 53 29 3b 0a 23 65 6e 64 69 66  MP_BIAS);.#endif
adf0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 43 4f  .#if !defined(CO
ae00: 44 45 5f 45 58 45 43 55 54 41 42 4c 45 29 20 26  DE_EXECUTABLE) &
ae10: 26 20 21 64 65 66 69 6e 65 64 28 45 58 45 43 55  & !defined(EXECU
ae20: 54 41 42 4c 45 5f 56 49 41 5f 4d 50 52 4f 54 45  TABLE_VIA_MPROTE
ae30: 43 54 29 0a 20 20 2a 28 63 68 61 72 2a 2a 29 66  CT).  *(char**)f
ae40: 75 6e 63 74 69 6f 6e 20 3d 20 66 72 65 65 6c 69  unction = freeli
ae50: 73 74 3b 20 66 72 65 65 6c 69 73 74 20 3d 20 28  st; freelist = (
ae60: 63 68 61 72 2a 29 66 75 6e 63 74 69 6f 6e 3b 0a  char*)function;.
ae70: 20 20 2f 2a 20 49 74 20 69 73 20 70 72 6f 62 61    /* It is proba
ae80: 62 6c 79 20 6e 6f 74 20 77 6f 72 74 68 20 63 61  bly not worth ca
ae90: 6c 6c 69 6e 67 20 6d 75 6e 6d 61 70 28 29 20 66  lling munmap() f
aea0: 6f 72 20 65 6e 74 69 72 65 6c 79 20 66 72 65 65  or entirely free
aeb0: 64 20 70 61 67 65 73 2e 20 2a 2f 0a 23 65 6c 73  d pages. */.#els
aec0: 65 0a 20 20 66 72 65 65 28 28 28 63 68 61 72 2a  e.  free(((char*
aed0: 2a 29 66 75 6e 63 74 69 6f 6e 29 5b 2d 31 5d 29  *)function)[-1])
aee0: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 20  ;.#endif.}..#if 
aef0: 64 65 66 69 6e 65 64 28 5f 5f 53 54 44 43 5f 5f  defined(__STDC__
af00: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 47  ) || defined(__G
af10: 4e 55 43 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65  NUC__) || define
af20: 64 28 5f 5f 63 70 6c 75 73 70 6c 75 73 29 0a 69  d(__cplusplus).i
af30: 6e 74 20 69 73 5f 74 72 61 6d 70 6f 6c 69 6e 65  nt is_trampoline
af40: 20 28 76 6f 69 64 2a 20 66 75 6e 63 74 69 6f 6e   (void* function
af50: 29 0a 23 65 6c 73 65 0a 69 6e 74 20 69 73 5f 74  ).#else.int is_t
af60: 72 61 6d 70 6f 6c 69 6e 65 20 28 66 75 6e 63 74  rampoline (funct
af70: 69 6f 6e 29 0a 20 20 76 6f 69 64 2a 20 66 75 6e  ion).  void* fun
af80: 63 74 69 6f 6e 3b 0a 23 65 6e 64 69 66 0a 7b 0a  ction;.#endif.{.
af90: 23 69 66 64 65 66 20 69 73 5f 74 72 61 6d 70 0a  #ifdef is_tramp.
afa0: 23 69 66 64 65 66 20 5f 5f 68 70 70 61 6e 65 77  #ifdef __hppanew
afb0: 5f 5f 0a 20 20 76 6f 69 64 2a 20 74 72 61 6d 70  __.  void* tramp
afc0: 5f 61 64 64 72 65 73 73 20 3d 20 26 74 72 61 6d  _address = &tram
afd0: 70 3b 0a 20 20 69 66 20 28 21 28 28 28 6c 6f 6e  p;.  if (!(((lon
afe0: 67 29 66 75 6e 63 74 69 6f 6e 20 26 20 33 29 20  g)function & 3) 
aff0: 3d 3d 20 28 54 52 41 4d 50 5f 42 49 41 53 20 26  == (TRAMP_BIAS &
b000: 20 33 29 29 29 20 72 65 74 75 72 6e 20 30 3b 0a   3))) return 0;.
b010: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
b020: 28 28 69 73 5f 74 72 61 6d 70 28 28 28 63 68 61  ((is_tramp(((cha
b030: 72 2a 29 66 75 6e 63 74 69 6f 6e 20 2d 20 54 52  r*)function - TR
b040: 41 4d 50 5f 42 49 41 53 29 29 29 20 3f 20 31 20  AMP_BIAS))) ? 1 
b050: 3a 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 61 62  : 0);.#else.  ab
b060: 6f 72 74 28 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  ort();.#endif.}.
b070: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 53  .#if defined(__S
b080: 54 44 43 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65  TDC__) || define
b090: 64 28 5f 5f 47 4e 55 43 5f 5f 29 20 7c 7c 20 64  d(__GNUC__) || d
b0a0: 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75 73 70 6c  efined(__cpluspl
b0b0: 75 73 29 0a 5f 5f 54 52 5f 66 75 6e 63 74 69 6f  us).__TR_functio
b0c0: 6e 20 74 72 61 6d 70 6f 6c 69 6e 65 5f 61 64 64  n trampoline_add
b0d0: 72 65 73 73 20 28 76 6f 69 64 2a 20 66 75 6e 63  ress (void* func
b0e0: 74 69 6f 6e 29 0a 23 65 6c 73 65 0a 5f 5f 54 52  tion).#else.__TR
b0f0: 5f 66 75 6e 63 74 69 6f 6e 20 74 72 61 6d 70 6f  _function trampo
b100: 6c 69 6e 65 5f 61 64 64 72 65 73 73 20 28 66 75  line_address (fu
b110: 6e 63 74 69 6f 6e 29 0a 20 20 76 6f 69 64 2a 20  nction).  void* 
b120: 66 75 6e 63 74 69 6f 6e 3b 0a 23 65 6e 64 69 66  function;.#endif
b130: 0a 7b 0a 23 69 66 64 65 66 20 74 72 61 6d 70 5f  .{.#ifdef tramp_
b140: 61 64 64 72 65 73 73 0a 20 20 72 65 74 75 72 6e  address.  return
b150: 20 28 5f 5f 54 52 5f 66 75 6e 63 74 69 6f 6e 29   (__TR_function)
b160: 28 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 28  (tramp_address((
b170: 28 63 68 61 72 2a 29 66 75 6e 63 74 69 6f 6e 20  (char*)function 
b180: 2d 20 54 52 41 4d 50 5f 42 49 41 53 29 29 29 3b  - TRAMP_BIAS)));
b190: 0a 23 65 6c 73 65 0a 20 20 61 62 6f 72 74 28 29  .#else.  abort()
b1a0: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 20  ;.#endif.}..#if 
b1b0: 64 65 66 69 6e 65 64 28 5f 5f 53 54 44 43 5f 5f  defined(__STDC__
b1c0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 47  ) || defined(__G
b1d0: 4e 55 43 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65  NUC__) || define
b1e0: 64 28 5f 5f 63 70 6c 75 73 70 6c 75 73 29 0a 76  d(__cplusplus).v
b1f0: 6f 69 64 2a 20 74 72 61 6d 70 6f 6c 69 6e 65 5f  oid* trampoline_
b200: 76 61 72 69 61 62 6c 65 20 28 76 6f 69 64 2a 20  variable (void* 
b210: 66 75 6e 63 74 69 6f 6e 29 0a 23 65 6c 73 65 0a  function).#else.
b220: 76 6f 69 64 2a 20 74 72 61 6d 70 6f 6c 69 6e 65  void* trampoline
b230: 5f 76 61 72 69 61 62 6c 65 20 28 66 75 6e 63 74  _variable (funct
b240: 69 6f 6e 29 0a 20 20 76 6f 69 64 2a 20 66 75 6e  ion).  void* fun
b250: 63 74 69 6f 6e 3b 0a 23 65 6e 64 69 66 0a 7b 0a  ction;.#endif.{.
b260: 23 69 66 64 65 66 20 74 72 61 6d 70 5f 76 61 72  #ifdef tramp_var
b270: 69 61 62 6c 65 0a 20 20 72 65 74 75 72 6e 20 28  iable.  return (
b280: 76 6f 69 64 2a 29 28 74 72 61 6d 70 5f 76 61 72  void*)(tramp_var
b290: 69 61 62 6c 65 28 28 28 63 68 61 72 2a 29 66 75  iable(((char*)fu
b2a0: 6e 63 74 69 6f 6e 20 2d 20 54 52 41 4d 50 5f 42  nction - TRAMP_B
b2b0: 49 41 53 29 29 29 3b 0a 23 65 6c 73 65 0a 20 20  IAS)));.#else.  
b2c0: 61 62 6f 72 74 28 29 3b 0a 23 65 6e 64 69 66 0a  abort();.#endif.
b2d0: 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  }..#if defined(_
b2e0: 5f 53 54 44 43 5f 5f 29 20 7c 7c 20 64 65 66 69  _STDC__) || defi
b2f0: 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 20 7c 7c  ned(__GNUC__) ||
b300: 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75 73   defined(__cplus
b310: 70 6c 75 73 29 0a 76 6f 69 64 2a 20 74 72 61 6d  plus).void* tram
b320: 70 6f 6c 69 6e 65 5f 64 61 74 61 20 28 76 6f 69  poline_data (voi
b330: 64 2a 20 66 75 6e 63 74 69 6f 6e 29 0a 23 65 6c  d* function).#el
b340: 73 65 0a 76 6f 69 64 2a 20 74 72 61 6d 70 6f 6c  se.void* trampol
b350: 69 6e 65 5f 64 61 74 61 20 28 66 75 6e 63 74 69  ine_data (functi
b360: 6f 6e 29 0a 20 20 76 6f 69 64 2a 20 66 75 6e 63  on).  void* func
b370: 74 69 6f 6e 3b 0a 23 65 6e 64 69 66 0a 7b 0a 23  tion;.#endif.{.#
b380: 69 66 64 65 66 20 74 72 61 6d 70 5f 64 61 74 61  ifdef tramp_data
b390: 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a  .  return (void*
b3a0: 29 28 74 72 61 6d 70 5f 64 61 74 61 28 28 28 63  )(tramp_data(((c
b3b0: 68 61 72 2a 29 66 75 6e 63 74 69 6f 6e 20 2d 20  har*)function - 
b3c0: 54 52 41 4d 50 5f 42 49 41 53 29 29 29 3b 0a 23  TRAMP_BIAS)));.#
b3d0: 65 6c 73 65 0a 20 20 61 62 6f 72 74 28 29 3b 0a  else.  abort();.
b3e0: 23 65 6e 64 69 66 0a 7d 0a                       #endif.}.