Artifact c1f342a4886645aa2c97a10d131ee9976d170caf:


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