Artifact 12a9c5874dbef661815103c891195e8c98482aba:


0000: 2f 2a 20 54 72 61 6d 70 6f 6c 69 6e 65 20 63 6f  /* Trampoline co
0010: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 2f  nstruction */../
0020: 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 31  *. * Copyright 1
0030: 39 39 35 2d 31 39 39 39 2c 20 32 30 30 31 2d 32  995-1999, 2001-2
0040: 30 30 34 20 42 72 75 6e 6f 20 48 61 69 62 6c 65  004 Bruno Haible
0050: 2c 20 3c 62 72 75 6e 6f 40 63 6c 69 73 70 2e 6f  , <bruno@clisp.o
0060: 72 67 3e 0a 20 2a 0a 20 2a 20 54 68 69 73 20 69  rg>. *. * This i
0070: 73 20 66 72 65 65 20 73 6f 66 74 77 61 72 65 20  s free software 
0080: 64 69 73 74 72 69 62 75 74 65 64 20 75 6e 64 65  distributed unde
0090: 72 20 74 68 65 20 47 4e 55 20 47 65 6e 65 72 61  r the GNU Genera
00a0: 6c 20 50 75 62 6c 69 63 20 4c 69 63 65 6e 63 65  l Public Licence
00b0: 0a 20 2a 20 64 65 73 63 72 69 62 65 64 20 69 6e  . * described in
00c0: 20 74 68 65 20 66 69 6c 65 20 43 4f 50 59 49 4e   the file COPYIN
00d0: 47 2e 20 43 6f 6e 74 61 63 74 20 74 68 65 20 61  G. Contact the a
00e0: 75 74 68 6f 72 20 69 66 20 79 6f 75 20 64 6f 6e  uthor if you don
00f0: 27 74 20 68 61 76 65 20 74 68 69 73 0a 20 2a 20  't have this. * 
0100: 6f 72 20 63 61 6e 27 74 20 6c 69 76 65 20 77 69  or can't live wi
0110: 74 68 20 69 74 2e 20 54 68 65 72 65 20 69 73 20  th it. There is 
0120: 41 42 53 4f 4c 55 54 45 4c 59 20 4e 4f 20 57 41  ABSOLUTELY NO WA
0130: 52 52 41 4e 54 59 2c 20 65 78 70 6c 69 63 69 74  RRANTY, explicit
0140: 20 6f 72 20 69 6d 70 6c 69 65 64 2c 0a 20 2a 20   or implied,. * 
0150: 6f 6e 20 74 68 69 73 20 73 6f 66 74 77 61 72 65  on this software
0160: 2e 0a 20 2a 2f 0a 0a 0a 23 69 6e 63 6c 75 64 65  .. */...#include
0170: 20 22 63 6f 6e 66 69 67 2e 68 22 0a 23 69 6e 63   "config.h".#inc
0180: 6c 75 64 65 20 22 74 72 61 6d 70 6f 6c 69 6e 65  lude "trampoline
0190: 2e 68 22 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  .h"..#if defined
01a0: 28 5f 5f 68 70 70 61 5f 5f 29 0a 23 69 66 20 30  (__hppa__).#if 0
01b0: 0a 23 64 65 66 69 6e 65 20 5f 5f 68 70 70 61 6f  .#define __hppao
01c0: 6c 64 5f 5f 20 20 2f 2a 20 4f 6c 64 20 74 72 61  ld__  /* Old tra
01d0: 6d 70 6f 6c 69 6e 65 2c 20 72 65 61 6c 20 6d 61  mpoline, real ma
01e0: 63 68 69 6e 65 20 63 6f 64 65 2e 20 2a 2f 0a 23  chine code. */.#
01f0: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 5f 5f 68  else.#define __h
0200: 70 70 61 6e 65 77 5f 5f 20 20 2f 2a 20 4e 65 77  ppanew__  /* New
0210: 20 74 72 61 6d 70 6f 6c 69 6e 65 2c 20 6a 75 73   trampoline, jus
0220: 74 20 61 20 63 6c 6f 73 75 72 65 2e 20 2a 2f 0a  t a closure. */.
0230: 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69  #endif.#endif.#i
0240: 66 20 64 65 66 69 6e 65 64 28 5f 5f 72 73 36 30  f defined(__rs60
0250: 30 30 5f 5f 29 0a 23 69 66 20 21 64 65 66 69 6e  00__).#if !defin
0260: 65 64 28 5f 41 49 58 29 0a 23 64 65 66 69 6e 65  ed(_AIX).#define
0270: 20 5f 5f 72 73 36 30 30 30 73 79 73 76 34 5f 5f   __rs6000sysv4__
0280: 20 20 2f 2a 20 53 79 73 56 2e 34 20 41 42 49 2c    /* SysV.4 ABI,
0290: 20 72 65 61 6c 20 6d 61 63 68 69 6e 65 20 63 6f   real machine co
02a0: 64 65 2e 20 2a 2f 0a 23 65 6c 73 65 0a 23 64 65  de. */.#else.#de
02b0: 66 69 6e 65 20 5f 5f 72 73 36 30 30 30 61 69 78  fine __rs6000aix
02c0: 5f 5f 20 20 2f 2a 20 41 49 58 20 41 42 49 2c 20  __  /* AIX ABI, 
02d0: 6a 75 73 74 20 61 20 63 6c 6f 73 75 72 65 2e 20  just a closure. 
02e0: 2a 2f 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66  */.#endif.#endif
02f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 68  .#if defined(__h
0300: 70 70 61 6e 65 77 5f 5f 29 0a 2f 2a 0a 20 2a 20  ppanew__)./*. * 
0310: 41 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74  A function point
0320: 65 72 20 69 73 20 61 20 62 69 61 73 65 64 20 70  er is a biased p
0330: 6f 69 6e 74 65 72 20 74 6f 20 61 20 64 61 74 61  ointer to a data
0340: 20 61 72 65 61 20 77 68 6f 73 65 20 66 69 72 73   area whose firs
0350: 74 20 77 6f 72 64 0a 20 2a 20 63 6f 6e 74 61 69  t word. * contai
0360: 6e 73 20 74 68 65 20 61 63 74 75 61 6c 20 61 64  ns the actual ad
0370: 64 72 65 73 73 20 6f 66 20 74 68 65 20 66 75 6e  dress of the fun
0380: 63 74 69 6f 6e 2e 0a 20 2a 2f 0a 65 78 74 65 72  ction.. */.exter
0390: 6e 20 76 6f 69 64 20 74 72 61 6d 70 20 28 29 3b  n void tramp ();
03a0: 20 2f 2a 20 74 72 61 6d 70 6f 6c 69 6e 65 20 70   /* trampoline p
03b0: 72 6f 74 6f 74 79 70 65 20 2a 2f 0a 2f 2a 20 57  rototype */./* W
03c0: 65 20 64 6f 6e 27 74 20 6e 65 65 64 20 74 6f 20  e don't need to 
03d0: 74 61 6b 65 20 61 6e 79 20 73 70 65 63 69 61 6c  take any special
03e0: 20 6d 65 61 73 75 72 65 73 20 74 6f 20 6d 61 6b   measures to mak
03f0: 65 20 74 68 65 20 63 6f 64 65 20 65 78 65 63 75  e the code execu
0400: 74 61 62 6c 65 0a 20 2a 20 73 69 6e 63 65 20 74  table. * since t
0410: 68 65 20 61 63 74 75 61 6c 20 69 6e 73 74 72 75  he actual instru
0420: 63 74 69 6f 6e 73 20 61 72 65 20 69 6e 20 74 68  ctions are in th
0430: 65 20 74 65 78 74 20 73 65 67 6d 65 6e 74 2e 0a  e text segment..
0440: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 43 4f 44 45   */.#ifndef CODE
0450: 5f 45 58 45 43 55 54 41 42 4c 45 0a 23 64 65 66  _EXECUTABLE.#def
0460: 69 6e 65 20 43 4f 44 45 5f 45 58 45 43 55 54 41  ine CODE_EXECUTA
0470: 42 4c 45 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69  BLE.#endif.#endi
0480: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  f.#if defined(__
0490: 72 73 36 30 30 30 61 69 78 5f 5f 29 20 7c 7c 20  rs6000aix__) || 
04a0: 64 65 66 69 6e 65 64 28 5f 5f 69 61 36 34 5f 5f  defined(__ia64__
04b0: 29 0a 2f 2a 0a 20 2a 20 41 20 66 75 6e 63 74 69  )./*. * A functi
04c0: 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 20 61 20  on pointer is a 
04d0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 64 61 74  pointer to a dat
04e0: 61 20 61 72 65 61 20 77 68 6f 73 65 20 66 69 72  a area whose fir
04f0: 73 74 20 77 6f 72 64 20 63 6f 6e 74 61 69 6e 73  st word contains
0500: 0a 20 2a 20 74 68 65 20 61 63 74 75 61 6c 20 61  . * the actual a
0510: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 66 75  ddress of the fu
0520: 6e 63 74 69 6f 6e 2e 0a 20 2a 2f 0a 65 78 74 65  nction.. */.exte
0530: 72 6e 20 76 6f 69 64 20 28 2a 74 72 61 6d 70 29  rn void (*tramp)
0540: 20 28 29 3b 20 2f 2a 20 74 72 61 6d 70 6f 6c 69   (); /* trampoli
0550: 6e 65 20 70 72 6f 74 6f 74 79 70 65 20 2a 2f 0a  ne prototype */.
0560: 2f 2a 20 57 65 20 64 6f 6e 27 74 20 6e 65 65 64  /* We don't need
0570: 20 74 6f 20 74 61 6b 65 20 61 6e 79 20 73 70 65   to take any spe
0580: 63 69 61 6c 20 6d 65 61 73 75 72 65 73 20 74 6f  cial measures to
0590: 20 6d 61 6b 65 20 74 68 65 20 63 6f 64 65 20 65   make the code e
05a0: 78 65 63 75 74 61 62 6c 65 0a 20 2a 20 73 69 6e  xecutable. * sin
05b0: 63 65 20 74 68 65 20 61 63 74 75 61 6c 20 69 6e  ce the actual in
05c0: 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20 69  structions are i
05d0: 6e 20 74 68 65 20 74 65 78 74 20 73 65 67 6d 65  n the text segme
05e0: 6e 74 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  nt.. */.#ifndef 
05f0: 43 4f 44 45 5f 45 58 45 43 55 54 41 42 4c 45 0a  CODE_EXECUTABLE.
0600: 23 64 65 66 69 6e 65 20 43 4f 44 45 5f 45 58 45  #define CODE_EXE
0610: 43 55 54 41 42 4c 45 0a 23 65 6e 64 69 66 0a 23  CUTABLE.#endif.#
0620: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
0630: 64 28 5f 5f 6d 36 38 6b 5f 5f 29 0a 23 69 66 20  d(__m68k__).#if 
0640: 64 65 66 69 6e 65 64 28 41 4d 49 47 41 29 20 2f  defined(AMIGA) /
0650: 2a 20 41 6d 69 67 61 20 72 75 6e 6e 69 6e 67 20  * Amiga running 
0660: 41 6d 69 67 61 4f 53 2c 20 6e 6f 74 20 4c 69 6e  AmigaOS, not Lin
0670: 75 78 20 2a 2f 0a 23 69 66 6e 64 65 66 20 43 4f  ux */.#ifndef CO
0680: 44 45 5f 45 58 45 43 55 54 41 42 4c 45 20 2f 2a  DE_EXECUTABLE /*
0690: 20 63 6f 6e 66 69 67 75 72 65 20 67 75 65 73 73   configure guess
06a0: 65 73 20 77 72 6f 6e 67 3f 3f 20 2a 2f 0a 23 64  es wrong?? */.#d
06b0: 65 66 69 6e 65 20 43 4f 44 45 5f 45 58 45 43 55  efine CODE_EXECU
06c0: 54 41 42 4c 45 0a 23 65 6e 64 69 66 0a 23 65 6e  TABLE.#endif.#en
06d0: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 41  dif.#endif../* A
06e0: 73 20 6f 66 20 57 69 6e 64 6f 77 73 20 58 50 20  s of Windows XP 
06f0: 53 50 20 32 2c 20 6d 61 6c 6c 6f 63 27 64 20 6d  SP 2, malloc'd m
0700: 65 6d 6f 72 79 20 69 73 20 6e 6f 74 20 65 78 65  emory is not exe
0710: 63 75 74 61 62 6c 65 20 2a 2f 0a 23 69 66 64 65  cutable */.#ifde
0720: 66 20 5f 57 49 4e 33 32 0a 23 75 6e 64 65 66 20  f _WIN32.#undef 
0730: 43 4f 44 45 5f 45 58 45 43 55 54 41 42 4c 45 0a  CODE_EXECUTABLE.
0740: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
0750: 43 4f 44 45 5f 45 58 45 43 55 54 41 42 4c 45 0a  CODE_EXECUTABLE.
0760: 2f 2a 20 48 6f 77 20 64 6f 20 77 65 20 6d 61 6b  /* How do we mak
0770: 65 20 74 68 65 20 74 72 61 6d 70 6f 6c 69 6e 65  e the trampoline
0780: 27 73 20 63 6f 64 65 20 65 78 65 63 75 74 61 62  's code executab
0790: 6c 65 3f 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  le? */.#if defin
07a0: 65 64 28 48 41 56 45 5f 4d 41 43 48 5f 56 4d 29  ed(HAVE_MACH_VM)
07b0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 63 6f   || defined(__co
07c0: 6e 76 65 78 5f 5f 29 20 7c 7c 20 64 65 66 69 6e  nvex__) || defin
07d0: 65 64 28 48 41 56 45 5f 57 4f 52 4b 49 4e 47 5f  ed(HAVE_WORKING_
07e0: 4d 50 52 4f 54 45 43 54 29 20 7c 7c 20 64 65 66  MPROTECT) || def
07f0: 69 6e 65 64 28 48 41 56 45 5f 53 59 53 5f 4d 38  ined(HAVE_SYS_M8
0800: 38 4b 42 43 53 5f 48 29 0a 2f 2a 20 6d 70 72 6f  8KBCS_H)./* mpro
0810: 74 65 63 74 28 29 20 5b 6f 72 20 65 71 75 69 76  tect() [or equiv
0820: 61 6c 65 6e 74 5d 20 74 68 65 20 6d 61 6c 6c 6f  alent] the mallo
0830: 63 27 65 64 20 61 72 65 61 2e 20 2a 2f 0a 23 64  c'ed area. */.#d
0840: 65 66 69 6e 65 20 45 58 45 43 55 54 41 42 4c 45  efine EXECUTABLE
0850: 5f 56 49 41 5f 4d 50 52 4f 54 45 43 54 0a 23 65  _VIA_MPROTECT.#e
0860: 6c 73 65 0a 23 69 66 64 65 66 20 48 41 56 45 5f  lse.#ifdef HAVE_
0870: 4d 4d 41 50 0a 2f 2a 20 55 73 65 20 61 6e 20 6d  MMAP./* Use an m
0880: 6d 61 70 27 65 64 20 70 61 67 65 2e 20 2a 2f 0a  map'ed page. */.
0890: 23 64 65 66 69 6e 65 20 45 58 45 43 55 54 41 42  #define EXECUTAB
08a0: 4c 45 5f 56 49 41 5f 4d 4d 41 50 0a 23 69 66 64  LE_VIA_MMAP.#ifd
08b0: 65 66 20 48 41 56 45 5f 4d 4d 41 50 5f 41 4e 4f  ef HAVE_MMAP_ANO
08c0: 4e 59 4d 4f 55 53 0a 2f 2a 20 55 73 65 20 6d 6d  NYMOUS./* Use mm
08d0: 61 70 20 77 69 74 68 20 74 68 65 20 4d 41 50 5f  ap with the MAP_
08e0: 41 4e 4f 4e 59 4d 4f 55 53 20 6f 72 20 4d 41 50  ANONYMOUS or MAP
08f0: 5f 41 4e 4f 4e 20 66 6c 61 67 2e 20 2a 2f 0a 23  _ANON flag. */.#
0900: 64 65 66 69 6e 65 20 45 58 45 43 55 54 41 42 4c  define EXECUTABL
0910: 45 5f 56 49 41 5f 4d 4d 41 50 5f 41 4e 4f 4e 59  E_VIA_MMAP_ANONY
0920: 4d 4f 55 53 0a 23 65 6c 73 65 0a 2f 2a 20 55 73  MOUS.#else./* Us
0930: 65 20 6d 6d 61 70 20 6f 6e 20 2f 64 65 76 2f 7a  e mmap on /dev/z
0940: 65 72 6f 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ero. */.#define 
0950: 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41 5f 4d  EXECUTABLE_VIA_M
0960: 4d 41 50 5f 44 45 56 5a 45 52 4f 0a 23 65 6e 64  MAP_DEVZERO.#end
0970: 69 66 0a 23 65 6c 73 65 0a 23 69 66 64 65 66 20  if.#else.#ifdef 
0980: 48 41 56 45 5f 53 48 4d 0a 2f 2a 20 55 73 65 20  HAVE_SHM./* Use 
0990: 61 6e 20 73 68 6d 61 74 27 65 64 20 70 61 67 65  an shmat'ed page
09a0: 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 45 58 45  . */.#define EXE
09b0: 43 55 54 41 42 4c 45 5f 56 49 41 5f 53 48 4d 0a  CUTABLE_VIA_SHM.
09c0: 23 65 6c 73 65 0a 23 69 66 64 65 66 20 5f 57 49  #else.#ifdef _WI
09d0: 4e 33 32 0a 2f 2a 20 55 73 65 20 56 69 72 74 75  N32./* Use Virtu
09e0: 61 6c 41 6c 6c 6f 63 20 2a 2f 0a 23 65 6c 73 65  alAlloc */.#else
09f0: 0a 3f 3f 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69  .??.#endif.#endi
0a00: 66 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  f.#endif.#endif.
0a10: 23 65 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65  #endif..#include
0a20: 20 3c 73 74 64 69 6f 2e 68 3e 20 2f 2a 20 64 65   <stdio.h> /* de
0a30: 63 6c 61 72 65 73 20 66 70 72 69 6e 74 66 28 29  clares fprintf()
0a40: 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73   */..#include <s
0a50: 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63  ys/types.h>.#inc
0a60: 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 20  lude <stdlib.h> 
0a70: 2f 2a 20 64 65 63 6c 61 72 65 73 20 61 62 6f 72  /* declares abor
0a80: 74 28 29 2c 20 6d 61 6c 6c 6f 63 28 29 2c 20 66  t(), malloc(), f
0a90: 72 65 65 28 29 20 2a 2f 0a 23 69 66 64 65 66 20  ree() */.#ifdef 
0aa0: 48 41 56 45 5f 55 4e 49 53 54 44 5f 48 0a 23 69  HAVE_UNISTD_H.#i
0ab0: 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68  nclude <unistd.h
0ac0: 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 44 65 63  >.#endif../* Dec
0ad0: 6c 61 72 65 20 67 65 74 70 61 67 65 73 69 7a 65  lare getpagesize
0ae0: 28 29 2e 20 2a 2f 0a 23 69 66 64 65 66 20 48 41  (). */.#ifdef HA
0af0: 56 45 5f 47 45 54 50 41 47 45 53 49 5a 45 0a 23  VE_GETPAGESIZE.#
0b00: 69 66 64 65 66 20 5f 5f 63 70 6c 75 73 70 6c 75  ifdef __cplusplu
0b10: 73 0a 65 78 74 65 72 6e 20 22 43 22 20 52 45 54  s.extern "C" RET
0b20: 47 45 54 50 41 47 45 53 49 5a 45 54 59 50 45 20  GETPAGESIZETYPE 
0b30: 67 65 74 70 61 67 65 73 69 7a 65 20 28 76 6f 69  getpagesize (voi
0b40: 64 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  d);.#elif define
0b50: 64 28 5f 5f 53 54 44 43 5f 5f 29 0a 65 78 74 65  d(__STDC__).exte
0b60: 72 6e 20 52 45 54 47 45 54 50 41 47 45 53 49 5a  rn RETGETPAGESIZ
0b70: 45 54 59 50 45 20 67 65 74 70 61 67 65 73 69 7a  ETYPE getpagesiz
0b80: 65 20 28 76 6f 69 64 29 3b 0a 23 65 6c 73 65 0a  e (void);.#else.
0b90: 65 78 74 65 72 6e 20 52 45 54 47 45 54 50 41 47  extern RETGETPAG
0ba0: 45 53 49 5a 45 54 59 50 45 20 67 65 74 70 61 67  ESIZETYPE getpag
0bb0: 65 73 69 7a 65 20 28 29 3b 0a 23 65 6e 64 69 66  esize ();.#endif
0bc0: 0a 23 65 6c 73 65 0a 23 69 66 64 65 66 20 48 41  .#else.#ifdef HA
0bd0: 56 45 5f 53 59 53 5f 50 41 52 41 4d 5f 48 0a 23  VE_SYS_PARAM_H.#
0be0: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 70 61 72  include <sys/par
0bf0: 61 6d 2e 68 3e 0a 23 65 6c 73 65 0a 2f 2a 20 4e  am.h>.#else./* N
0c00: 6f 74 20 55 6e 69 78 2c 20 65 2e 67 2e 20 6d 69  ot Unix, e.g. mi
0c10: 6e 67 77 33 32 20 2a 2f 0a 23 64 65 66 69 6e 65  ngw32 */.#define
0c20: 20 50 41 47 45 53 49 5a 45 20 34 30 39 36 0a 23   PAGESIZE 4096.#
0c30: 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 67 65  endif.#define ge
0c40: 74 70 61 67 65 73 69 7a 65 28 29 20 50 41 47 45  tpagesize() PAGE
0c50: 53 49 5a 45 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  SIZE.#endif../* 
0c60: 44 65 63 6c 61 72 65 20 6d 70 72 6f 74 65 63 74  Declare mprotect
0c70: 28 29 20 6f 72 20 65 71 75 69 76 61 6c 65 6e 74  () or equivalent
0c80: 2e 20 2a 2f 0a 23 69 66 64 65 66 20 45 58 45 43  . */.#ifdef EXEC
0c90: 55 54 41 42 4c 45 5f 56 49 41 5f 4d 50 52 4f 54  UTABLE_VIA_MPROT
0ca0: 45 43 54 0a 23 69 66 64 65 66 20 48 41 56 45 5f  ECT.#ifdef HAVE_
0cb0: 4d 41 43 48 5f 56 4d 0a 23 69 6e 63 6c 75 64 65  MACH_VM.#include
0cc0: 20 3c 73 79 73 2f 72 65 73 6f 75 72 63 65 2e 68   <sys/resource.h
0cd0: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6d 61 63 68  >.#include <mach
0ce0: 2f 6d 61 63 68 5f 69 6e 74 65 72 66 61 63 65 2e  /mach_interface.
0cf0: 68 3e 0a 23 69 66 64 65 66 20 4e 65 58 54 0a 23  h>.#ifdef NeXT.#
0d00: 69 6e 63 6c 75 64 65 20 3c 6d 61 63 68 2f 6d 61  include <mach/ma
0d10: 63 68 5f 69 6e 69 74 2e 68 3e 0a 23 65 6e 64 69  ch_init.h>.#endi
0d20: 66 0a 23 69 66 64 65 66 20 5f 5f 6f 73 66 5f 5f  f.#ifdef __osf__
0d30: 0a 23 69 6e 63 6c 75 64 65 20 3c 6d 61 63 68 5f  .#include <mach_
0d40: 69 6e 69 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 23  init.h>.#endif.#
0d50: 69 6e 63 6c 75 64 65 20 3c 6d 61 63 68 2f 6d 61  include <mach/ma
0d60: 63 68 69 6e 65 2f 76 6d 5f 70 61 72 61 6d 2e 68  chine/vm_param.h
0d70: 3e 0a 23 65 6c 73 65 0a 23 69 66 64 65 66 20 48  >.#else.#ifdef H
0d80: 41 56 45 5f 53 59 53 5f 4d 38 38 4b 42 43 53 5f  AVE_SYS_M88KBCS_
0d90: 48 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  H.#include <sys/
0da0: 6d 38 38 6b 62 63 73 2e 68 3e 0a 23 64 65 66 69  m88kbcs.h>.#defi
0db0: 6e 65 20 67 65 74 70 61 67 65 73 69 7a 65 28 29  ne getpagesize()
0dc0: 20 20 34 30 39 36 20 20 2f 2a 20 3f 3f 20 2a 2f    4096  /* ?? */
0dd0: 0a 23 65 6c 73 65 0a 23 69 6e 63 6c 75 64 65 20  .#else.#include 
0de0: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
0df0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e  nclude <sys/mman
0e00: 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69  .h>.#endif.#endi
0e10: 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 44 65 63  f.#endif../* Dec
0e20: 6c 61 72 65 20 6d 6d 61 70 28 29 2e 20 2a 2f 0a  lare mmap(). */.
0e30: 23 69 66 64 65 66 20 45 58 45 43 55 54 41 42 4c  #ifdef EXECUTABL
0e40: 45 5f 56 49 41 5f 4d 4d 41 50 0a 23 69 6e 63 6c  E_VIA_MMAP.#incl
0e50: 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73 2e 68  ude <sys/types.h
0e60: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  >.#include <sys/
0e70: 6d 6d 61 6e 2e 68 3e 0a 23 69 66 20 21 64 65 66  mman.h>.#if !def
0e80: 69 6e 65 64 28 50 52 4f 54 5f 45 58 45 43 29 20  ined(PROT_EXEC) 
0e90: 26 26 20 64 65 66 69 6e 65 64 28 50 52 4f 54 5f  && defined(PROT_
0ea0: 45 58 45 43 55 54 45 29 20 2f 2a 20 49 72 69 78  EXECUTE) /* Irix
0eb0: 20 34 2e 30 2e 35 20 6e 65 65 64 73 20 74 68 69   4.0.5 needs thi
0ec0: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f  s */.#define PRO
0ed0: 54 5f 45 58 45 43 20 50 52 4f 54 5f 45 58 45 43  T_EXEC PROT_EXEC
0ee0: 55 54 45 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69  UTE.#endif.#endi
0ef0: 66 0a 0a 2f 2a 20 44 65 63 6c 61 72 65 20 6f 70  f../* Declare op
0f00: 65 6e 28 29 2e 20 2a 2f 0a 23 69 66 64 65 66 20  en(). */.#ifdef 
0f10: 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41 5f 4d  EXECUTABLE_VIA_M
0f20: 4d 41 50 5f 44 45 56 5a 45 52 4f 0a 23 69 6e 63  MAP_DEVZERO.#inc
0f30: 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73 2e  lude <sys/types.
0f40: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69  h>.#include <uni
0f50: 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  std.h>.#include 
0f60: 3c 66 63 6e 74 6c 2e 68 3e 0a 23 69 66 64 65 66  <fcntl.h>.#ifdef
0f70: 20 4f 50 45 4e 5f 4e 45 45 44 53 5f 53 59 53 5f   OPEN_NEEDS_SYS_
0f80: 46 49 4c 45 5f 48 0a 23 69 6e 63 6c 75 64 65 20  FILE_H.#include 
0f90: 3c 73 79 73 2f 66 69 6c 65 2e 68 3e 0a 23 65 6e  <sys/file.h>.#en
0fa0: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 44  dif.#endif../* D
0fb0: 65 63 6c 61 72 65 20 73 68 6d 67 65 74 28 29 2c  eclare shmget(),
0fc0: 20 73 68 6d 61 74 28 29 2c 20 73 68 6d 63 74 6c   shmat(), shmctl
0fd0: 28 29 2e 20 2a 2f 0a 23 69 66 64 65 66 20 45 58  (). */.#ifdef EX
0fe0: 45 43 55 54 41 42 4c 45 5f 56 49 41 5f 53 48 4d  ECUTABLE_VIA_SHM
0ff0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
1000: 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ypes.h>.#include
1010: 20 3c 73 79 73 2f 69 70 63 2e 68 3e 0a 23 69 6e   <sys/ipc.h>.#in
1020: 63 6c 75 64 65 20 3c 73 79 73 2f 73 68 6d 2e 68  clude <sys/shm.h
1030: 3e 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 59  >.#ifdef HAVE_SY
1040: 53 5f 53 59 53 4d 41 43 52 4f 53 5f 48 0a 23 69  S_SYSMACROS_H.#i
1050: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 79 73 6d  nclude <sys/sysm
1060: 61 63 72 6f 73 2e 68 3e 0a 23 65 6e 64 69 66 0a  acros.h>.#endif.
1070: 23 65 6e 64 69 66 0a 0a 2f 2a 20 53 75 70 70 6f  #endif../* Suppo
1080: 72 74 20 66 6f 72 20 69 6e 73 74 72 75 63 74 69  rt for instructi
1090: 6f 6e 20 63 61 63 68 65 20 66 6c 75 73 68 2e 20  on cache flush. 
10a0: 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 69 33 38 36  */.#ifdef __i386
10b0: 5f 5f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  __.#if defined(_
10c0: 57 49 4e 33 32 29 20 2f 2a 20 57 69 6e 64 6f 77  WIN32) /* Window
10d0: 73 4e 54 20 6f 72 20 57 69 6e 64 6f 77 73 39 35  sNT or Windows95
10e0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 33   */.#define WIN3
10f0: 32 5f 4c 45 41 4e 5f 41 4e 44 5f 4d 45 41 4e 0a  2_LEAN_AND_MEAN.
1100: 23 64 65 66 69 6e 65 20 57 49 4e 33 32 5f 45 58  #define WIN32_EX
1110: 54 52 41 5f 4c 45 41 4e 0a 23 69 6e 63 6c 75 64  TRA_LEAN.#includ
1120: 65 20 3c 77 69 6e 64 6f 77 73 2e 68 3e 0a 23 65  e <windows.h>.#e
1130: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 64  ndif.#endif.#ifd
1140: 65 66 20 5f 5f 6d 36 38 6b 5f 5f 0a 23 69 66 20  ef __m68k__.#if 
1150: 64 65 66 69 6e 65 64 28 41 4d 49 47 41 29 20 2f  defined(AMIGA) /
1160: 2a 20 41 6d 69 67 61 20 72 75 6e 6e 69 6e 67 20  * Amiga running 
1170: 41 6d 69 67 61 4f 53 2c 20 6e 6f 74 20 4c 69 6e  AmigaOS, not Lin
1180: 75 78 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c  ux */.#include <
1190: 65 78 65 63 2f 74 79 70 65 73 2e 68 3e 0a 23 69  exec/types.h>.#i
11a0: 6e 63 6c 75 64 65 20 3c 65 78 65 63 2f 65 78 65  nclude <exec/exe
11b0: 63 62 61 73 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  cbase.h>.#includ
11c0: 65 20 3c 70 72 6f 74 6f 2f 65 78 65 63 2e 68 3e  e <proto/exec.h>
11d0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 68  .#endif.#ifdef h
11e0: 70 75 78 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  pux.#include <sy
11f0: 73 2f 63 61 63 68 65 2e 68 3e 0a 23 65 6e 64 69  s/cache.h>.#endi
1200: 66 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  f.#endif.#if def
1210: 69 6e 65 64 28 5f 5f 6d 69 70 73 5f 5f 29 20 7c  ined(__mips__) |
1220: 7c 20 64 65 66 69 6e 65 64 28 5f 5f 6d 69 70 73  | defined(__mips
1230: 6e 33 32 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65  n32__) || define
1240: 64 28 5f 5f 6d 69 70 73 36 34 5f 5f 29 0a 23 69  d(__mips64__).#i
1250: 66 64 65 66 20 75 6c 74 72 69 78 0a 23 69 6e 63  fdef ultrix.#inc
1260: 6c 75 64 65 20 3c 6d 69 70 73 2f 63 61 63 68 65  lude <mips/cache
1270: 63 74 6c 2e 68 3e 0a 23 65 6c 73 65 0a 23 69 66  ctl.h>.#else.#if
1280: 64 65 66 20 6c 69 6e 75 78 0a 23 69 6e 63 6c 75  def linux.#inclu
1290: 64 65 20 3c 61 73 6d 2f 63 61 63 68 65 63 74 6c  de <asm/cachectl
12a0: 2e 68 3e 0a 23 65 6c 73 65 0a 23 69 66 64 65 66  .h>.#else.#ifdef
12b0: 20 48 41 56 45 5f 53 59 53 5f 43 41 43 48 45 43   HAVE_SYS_CACHEC
12c0: 54 4c 5f 48 0a 23 69 6e 63 6c 75 64 65 20 3c 73  TL_H.#include <s
12d0: 79 73 2f 63 61 63 68 65 63 74 6c 2e 68 3e 0a 23  ys/cachectl.h>.#
12e0: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 65 6e  endif.#endif.#en
12f0: 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  dif.#endif.#ifde
1300: 66 20 5f 5f 6d 38 38 6b 5f 5f 0a 23 69 6e 63 6c  f __m88k__.#incl
1310: 75 64 65 20 3c 73 79 73 2f 73 79 73 6c 6f 63 61  ude <sys/sysloca
1320: 6c 2e 68 3e 0a 23 65 6e 64 69 66 0a 2f 2a 20 49  l.h>.#endif./* I
1330: 6e 6c 69 6e 65 20 61 73 73 65 6d 62 6c 79 20 66  nline assembly f
1340: 75 6e 63 74 69 6f 6e 20 66 6f 72 20 69 6e 73 74  unction for inst
1350: 72 75 63 74 69 6f 6e 20 63 61 63 68 65 20 66 6c  ruction cache fl
1360: 75 73 68 2e 20 2a 2f 0a 23 69 66 20 64 65 66 69  ush. */.#if defi
1370: 6e 65 64 28 5f 5f 73 70 61 72 63 5f 5f 29 20 7c  ned(__sparc__) |
1380: 7c 20 64 65 66 69 6e 65 64 28 5f 5f 73 70 61 72  | defined(__spar
1390: 63 36 34 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65  c64__) || define
13a0: 64 28 5f 5f 61 6c 70 68 61 5f 5f 29 20 7c 7c 20  d(__alpha__) || 
13b0: 64 65 66 69 6e 65 64 28 5f 5f 68 70 70 61 6f 6c  defined(__hppaol
13c0: 64 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  d__) || defined(
13d0: 5f 5f 72 73 36 30 30 30 73 79 73 76 34 5f 5f 29  __rs6000sysv4__)
13e0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 63 6f   || defined(__co
13f0: 6e 76 65 78 5f 5f 29 0a 23 69 66 64 65 66 20 5f  nvex__).#ifdef _
1400: 5f 47 4e 55 43 5f 5f 0a 65 78 74 65 72 6e 20 69  _GNUC__.extern i
1410: 6e 6c 69 6e 65 0a 23 69 66 20 64 65 66 69 6e 65  nline.#if define
1420: 64 28 5f 5f 73 70 61 72 63 5f 5f 29 20 7c 7c 20  d(__sparc__) || 
1430: 64 65 66 69 6e 65 64 28 5f 5f 73 70 61 72 63 36  defined(__sparc6
1440: 34 5f 5f 29 0a 23 69 6e 63 6c 75 64 65 20 22 63  4__).#include "c
1450: 61 63 68 65 2d 73 70 61 72 63 2e 63 22 0a 23 65  ache-sparc.c".#e
1460: 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 61 6c  ndif.#ifdef __al
1470: 70 68 61 5f 5f 0a 23 69 6e 63 6c 75 64 65 20 22  pha__.#include "
1480: 63 61 63 68 65 2d 61 6c 70 68 61 2e 63 22 0a 23  cache-alpha.c".#
1490: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 68  endif.#ifdef __h
14a0: 70 70 61 5f 5f 0a 23 69 6e 63 6c 75 64 65 20 22  ppa__.#include "
14b0: 63 61 63 68 65 2d 68 70 70 61 2e 63 22 0a 23 65  cache-hppa.c".#e
14c0: 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 72 73  ndif.#ifdef __rs
14d0: 36 30 30 30 5f 5f 0a 23 69 6e 63 6c 75 64 65 20  6000__.#include 
14e0: 22 63 61 63 68 65 2d 72 73 36 30 30 30 2e 63 22  "cache-rs6000.c"
14f0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f  .#endif.#ifdef _
1500: 5f 63 6f 6e 76 65 78 5f 5f 0a 23 69 6e 63 6c 75  _convex__.#inclu
1510: 64 65 20 22 63 61 63 68 65 2d 63 6f 6e 76 65 78  de "cache-convex
1520: 2e 63 22 0a 23 65 6e 64 69 66 0a 23 65 6c 73 65  .c".#endif.#else
1530: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 73  .#if defined(__s
1540: 70 61 72 63 5f 5f 29 20 7c 7c 20 64 65 66 69 6e  parc__) || defin
1550: 65 64 28 5f 5f 73 70 61 72 63 36 34 5f 5f 29 0a  ed(__sparc64__).
1560: 65 78 74 65 72 6e 20 76 6f 69 64 20 5f 5f 54 52  extern void __TR
1570: 5f 63 6c 65 61 72 5f 63 61 63 68 65 5f 34 28 29  _clear_cache_4()
1580: 3b 0a 23 65 6c 73 65 0a 65 78 74 65 72 6e 20 76  ;.#else.extern v
1590: 6f 69 64 20 5f 5f 54 52 5f 63 6c 65 61 72 5f 63  oid __TR_clear_c
15a0: 61 63 68 65 28 29 3b 0a 23 65 6e 64 69 66 0a 23  ache();.#endif.#
15b0: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
15c0: 20 4c 65 6e 67 74 68 20 61 6e 64 20 61 6c 69 67   Length and alig
15d0: 6e 6d 65 6e 74 20 6f 66 20 74 72 61 6d 70 6f 6c  nment of trampol
15e0: 69 6e 65 20 2a 2f 0a 23 69 66 64 65 66 20 5f 5f  ine */.#ifdef __
15f0: 69 33 38 36 5f 5f 0a 23 64 65 66 69 6e 65 20 54  i386__.#define T
1600: 52 41 4d 50 5f 4c 45 4e 47 54 48 20 31 35 0a 23  RAMP_LENGTH 15.#
1610: 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49  define TRAMP_ALI
1620: 47 4e 20 31 36 20 20 2f 2a 20 34 20 66 6f 72 20  GN 16  /* 4 for 
1630: 61 20 69 33 38 36 2c 20 31 36 20 66 6f 72 20 61  a i386, 16 for a
1640: 20 69 34 38 36 20 2a 2f 0a 23 65 6e 64 69 66 0a   i486 */.#endif.
1650: 23 69 66 64 65 66 20 5f 5f 6d 36 38 6b 5f 5f 0a  #ifdef __m68k__.
1660: 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45  #define TRAMP_LE
1670: 4e 47 54 48 20 31 38 0a 23 64 65 66 69 6e 65 20  NGTH 18.#define 
1680: 54 52 41 4d 50 5f 41 4c 49 47 4e 20 31 36 0a 23  TRAMP_ALIGN 16.#
1690: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
16a0: 64 28 5f 5f 6d 69 70 73 5f 5f 29 20 26 26 20 21  d(__mips__) && !
16b0: 64 65 66 69 6e 65 64 28 5f 5f 6d 69 70 73 6e 33  defined(__mipsn3
16c0: 32 5f 5f 29 0a 23 64 65 66 69 6e 65 20 54 52 41  2__).#define TRA
16d0: 4d 50 5f 4c 45 4e 47 54 48 20 33 32 0a 23 64 65  MP_LENGTH 32.#de
16e0: 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e  fine TRAMP_ALIGN
16f0: 20 34 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66   4.#endif.#ifdef
1700: 20 5f 5f 6d 69 70 73 6e 33 32 5f 5f 0a 23 64 65   __mipsn32__.#de
1710: 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47 54  fine TRAMP_LENGT
1720: 48 20 33 36 0a 23 64 65 66 69 6e 65 20 54 52 41  H 36.#define TRA
1730: 4d 50 5f 41 4c 49 47 4e 20 34 0a 23 65 6e 64 69  MP_ALIGN 4.#endi
1740: 66 0a 23 69 66 64 65 66 20 5f 5f 6d 69 70 73 36  f.#ifdef __mips6
1750: 34 6f 6c 64 5f 5f 0a 23 64 65 66 69 6e 65 20 54  4old__.#define T
1760: 52 41 4d 50 5f 4c 45 4e 47 54 48 20 38 34 0a 23  RAMP_LENGTH 84.#
1770: 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49  define TRAMP_ALI
1780: 47 4e 20 34 0a 23 65 6e 64 69 66 0a 23 69 66 64  GN 4.#endif.#ifd
1790: 65 66 20 5f 5f 6d 69 70 73 36 34 5f 5f 0a 23 64  ef __mips64__.#d
17a0: 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47  efine TRAMP_LENG
17b0: 54 48 20 34 38 0a 23 64 65 66 69 6e 65 20 54 52  TH 48.#define TR
17c0: 41 4d 50 5f 41 4c 49 47 4e 20 38 0a 23 65 6e 64  AMP_ALIGN 8.#end
17d0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  if.#if defined(_
17e0: 5f 73 70 61 72 63 5f 5f 29 20 26 26 20 21 64 65  _sparc__) && !de
17f0: 66 69 6e 65 64 28 5f 5f 73 70 61 72 63 36 34 5f  fined(__sparc64_
1800: 5f 29 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50  _).#define TRAMP
1810: 5f 4c 45 4e 47 54 48 20 32 38 0a 23 64 65 66 69  _LENGTH 28.#defi
1820: 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20 31  ne TRAMP_ALIGN 1
1830: 36 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  6.#endif.#ifdef 
1840: 5f 5f 73 70 61 72 63 36 34 5f 5f 0a 23 64 65 66  __sparc64__.#def
1850: 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48  ine TRAMP_LENGTH
1860: 20 34 38 0a 23 64 65 66 69 6e 65 20 54 52 41 4d   48.#define TRAM
1870: 50 5f 41 4c 49 47 4e 20 31 36 0a 23 65 6e 64 69  P_ALIGN 16.#endi
1880: 66 0a 23 69 66 64 65 66 20 5f 5f 61 6c 70 68 61  f.#ifdef __alpha
1890: 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50  __.#define TRAMP
18a0: 5f 4c 45 4e 47 54 48 20 34 38 0a 23 64 65 66 69  _LENGTH 48.#defi
18b0: 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20 38  ne TRAMP_ALIGN 8
18c0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f  .#endif.#ifdef _
18d0: 5f 68 70 70 61 6f 6c 64 5f 5f 0a 23 64 65 66 69  _hppaold__.#defi
18e0: 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20  ne TRAMP_LENGTH 
18f0: 35 36 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50  56.#define TRAMP
1900: 5f 41 4c 49 47 4e 20 31 36 0a 23 65 6e 64 69 66  _ALIGN 16.#endif
1910: 0a 23 69 66 64 65 66 20 5f 5f 68 70 70 61 6e 65  .#ifdef __hppane
1920: 77 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52 41 4d  w__.#define TRAM
1930: 50 5f 4c 45 4e 47 54 48 20 32 30 0a 23 64 65 66  P_LENGTH 20.#def
1940: 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20  ine TRAMP_ALIGN 
1950: 31 36 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50  16.#define TRAMP
1960: 5f 42 49 41 53 20 32 0a 23 65 6e 64 69 66 0a 23  _BIAS 2.#endif.#
1970: 69 66 64 65 66 20 5f 5f 61 72 6d 5f 5f 0a 23 64  ifdef __arm__.#d
1980: 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47  efine TRAMP_LENG
1990: 54 48 20 34 34 0a 23 64 65 66 69 6e 65 20 54 52  TH 44.#define TR
19a0: 41 4d 50 5f 41 4c 49 47 4e 20 34 0a 23 65 6e 64  AMP_ALIGN 4.#end
19b0: 69 66 0a 23 69 66 64 65 66 20 5f 5f 72 73 36 30  if.#ifdef __rs60
19c0: 30 30 73 79 73 76 34 5f 5f 0a 23 64 65 66 69 6e  00sysv4__.#defin
19d0: 65 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 33  e TRAMP_LENGTH 3
19e0: 36 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f  6.#define TRAMP_
19f0: 41 4c 49 47 4e 20 34 0a 23 65 6e 64 69 66 0a 23  ALIGN 4.#endif.#
1a00: 69 66 64 65 66 20 5f 5f 72 73 36 30 30 30 61 69  ifdef __rs6000ai
1a10: 78 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52 41 4d  x__.#define TRAM
1a20: 50 5f 4c 45 4e 47 54 48 20 32 34 0a 23 64 65 66  P_LENGTH 24.#def
1a30: 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20  ine TRAMP_ALIGN 
1a40: 34 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  4.#endif.#ifdef 
1a50: 5f 5f 6d 38 38 6b 5f 5f 0a 23 64 65 66 69 6e 65  __m88k__.#define
1a60: 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 33 32   TRAMP_LENGTH 32
1a70: 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 41  .#define TRAMP_A
1a80: 4c 49 47 4e 20 38 0a 23 65 6e 64 69 66 0a 23 69  LIGN 8.#endif.#i
1a90: 66 64 65 66 20 5f 5f 63 6f 6e 76 65 78 5f 5f 0a  fdef __convex__.
1aa0: 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45  #define TRAMP_LE
1ab0: 4e 47 54 48 20 32 30 0a 23 64 65 66 69 6e 65 20  NGTH 20.#define 
1ac0: 54 52 41 4d 50 5f 41 4c 49 47 4e 20 34 0a 23 65  TRAMP_ALIGN 4.#e
1ad0: 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 69 61  ndif.#ifdef __ia
1ae0: 36 34 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52 41  64__.#define TRA
1af0: 4d 50 5f 4c 45 4e 47 54 48 20 34 30 0a 23 64 65  MP_LENGTH 40.#de
1b00: 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e  fine TRAMP_ALIGN
1b10: 20 31 36 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   16.#endif.#ifde
1b20: 66 20 5f 5f 78 38 36 5f 36 34 5f 5f 0a 23 64 65  f __x86_64__.#de
1b30: 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47 54  fine TRAMP_LENGT
1b40: 48 20 33 32 0a 23 64 65 66 69 6e 65 20 54 52 41  H 32.#define TRA
1b50: 4d 50 5f 41 4c 49 47 4e 20 31 36 0a 23 65 6e 64  MP_ALIGN 16.#end
1b60: 69 66 0a 23 69 66 64 65 66 20 5f 5f 73 33 39 30  if.#ifdef __s390
1b70: 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50  __.#define TRAMP
1b80: 5f 4c 45 4e 47 54 48 20 33 36 0a 23 64 65 66 69  _LENGTH 36.#defi
1b90: 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20 32  ne TRAMP_ALIGN 2
1ba0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
1bb0: 20 54 52 41 4d 50 5f 42 49 41 53 0a 23 64 65 66   TRAMP_BIAS.#def
1bc0: 69 6e 65 20 54 52 41 4d 50 5f 42 49 41 53 20 30  ine TRAMP_BIAS 0
1bd0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
1be0: 66 69 6e 65 64 28 43 4f 44 45 5f 45 58 45 43 55  fined(CODE_EXECU
1bf0: 54 41 42 4c 45 29 20 26 26 20 21 64 65 66 69 6e  TABLE) && !defin
1c00: 65 64 28 45 58 45 43 55 54 41 42 4c 45 5f 56 49  ed(EXECUTABLE_VI
1c10: 41 5f 4d 50 52 4f 54 45 43 54 29 0a 2f 2a 20 41  A_MPROTECT)./* A
1c20: 49 58 20 64 6f 65 73 6e 27 74 20 73 75 70 70 6f  IX doesn't suppo
1c30: 72 74 20 6d 70 72 6f 74 65 63 74 28 29 20 69 6e  rt mprotect() in
1c40: 20 6d 61 6c 6c 6f 63 27 65 64 20 6d 65 6d 6f 72   malloc'ed memor
1c50: 79 2e 20 4d 75 73 74 20 67 65 74 20 70 61 67 65  y. Must get page
1c60: 73 20 6f 66 0a 20 2a 20 6d 65 6d 6f 72 79 20 77  s of. * memory w
1c70: 69 74 68 20 65 78 65 63 75 74 65 20 70 65 72 6d  ith execute perm
1c80: 69 73 73 69 6f 6e 20 76 69 61 20 6d 6d 61 70 28  ission via mmap(
1c90: 29 2e 20 54 68 65 6e 20 6b 65 65 70 20 61 20 66  ). Then keep a f
1ca0: 72 65 65 20 6c 69 73 74 20 6f 66 0a 20 2a 20 66  ree list of. * f
1cb0: 72 65 65 20 74 72 61 6d 70 6f 6c 69 6e 65 73 2e  ree trampolines.
1cc0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  . */.static char
1cd0: 2a 20 66 72 65 65 6c 69 73 74 20 3d 20 4e 55 4c  * freelist = NUL
1ce0: 4c 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64  L;.#endif..#if d
1cf0: 65 66 69 6e 65 64 28 5f 5f 53 54 44 43 5f 5f 29  efined(__STDC__)
1d00: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e   || defined(__GN
1d10: 55 43 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64  UC__) || defined
1d20: 28 5f 5f 63 70 6c 75 73 70 6c 75 73 29 0a 5f 5f  (__cplusplus).__
1d30: 54 52 5f 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  TR_function allo
1d40: 63 5f 74 72 61 6d 70 6f 6c 69 6e 65 20 28 5f 5f  c_trampoline (__
1d50: 54 52 5f 66 75 6e 63 74 69 6f 6e 20 61 64 64 72  TR_function addr
1d60: 65 73 73 2c 20 76 6f 69 64 2a 20 76 61 72 69 61  ess, void* varia
1d70: 62 6c 65 2c 20 76 6f 69 64 2a 20 64 61 74 61 29  ble, void* data)
1d80: 0a 23 65 6c 73 65 0a 5f 5f 54 52 5f 66 75 6e 63  .#else.__TR_func
1d90: 74 69 6f 6e 20 61 6c 6c 6f 63 5f 74 72 61 6d 70  tion alloc_tramp
1da0: 6f 6c 69 6e 65 20 28 61 64 64 72 65 73 73 2c 20  oline (address, 
1db0: 76 61 72 69 61 62 6c 65 2c 20 64 61 74 61 29 0a  variable, data).
1dc0: 20 20 5f 5f 54 52 5f 66 75 6e 63 74 69 6f 6e 20    __TR_function 
1dd0: 61 64 64 72 65 73 73 3b 0a 20 20 76 6f 69 64 2a  address;.  void*
1de0: 20 76 61 72 69 61 62 6c 65 3b 0a 20 20 76 6f 69   variable;.  voi
1df0: 64 2a 20 64 61 74 61 3b 0a 23 65 6e 64 69 66 0a  d* data;.#endif.
1e00: 7b 0a 20 20 63 68 61 72 2a 20 66 75 6e 63 74 69  {.  char* functi
1e10: 6f 6e 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  on;..#if !define
1e20: 64 28 43 4f 44 45 5f 45 58 45 43 55 54 41 42 4c  d(CODE_EXECUTABL
1e30: 45 29 0a 20 20 73 74 61 74 69 63 20 6c 6f 6e 67  E).  static long
1e40: 20 70 61 67 65 73 69 7a 65 20 3d 20 30 3b 0a 23   pagesize = 0;.#
1e50: 69 66 20 64 65 66 69 6e 65 64 28 45 58 45 43 55  if defined(EXECU
1e60: 54 41 42 4c 45 5f 56 49 41 5f 4d 4d 41 50 5f 44  TABLE_VIA_MMAP_D
1e70: 45 56 5a 45 52 4f 29 0a 20 20 73 74 61 74 69 63  EVZERO).  static
1e80: 20 69 6e 74 20 7a 65 72 6f 5f 66 64 3b 0a 23 65   int zero_fd;.#e
1e90: 6e 64 69 66 0a 20 20 2f 2a 20 46 69 72 73 74 2c  ndif.  /* First,
1ea0: 20 67 65 74 20 74 68 65 20 70 61 67 65 20 73 69   get the page si
1eb0: 7a 65 20 6f 6e 63 65 20 61 6e 64 20 66 6f 72 20  ze once and for 
1ec0: 61 6c 6c 2e 20 2a 2f 0a 20 20 69 66 20 28 21 70  all. */.  if (!p
1ed0: 61 67 65 73 69 7a 65 29 0a 20 20 20 20 7b 0a 23  agesize).    {.#
1ee0: 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  if defined(HAVE_
1ef0: 4d 41 43 48 5f 56 4d 29 0a 20 20 20 20 20 20 70  MACH_VM).      p
1f00: 61 67 65 73 69 7a 65 20 3d 20 76 6d 5f 70 61 67  agesize = vm_pag
1f10: 65 5f 73 69 7a 65 3b 0a 23 65 6c 73 65 0a 20 20  e_size;.#else.  
1f20: 20 20 20 20 70 61 67 65 73 69 7a 65 20 3d 20 67      pagesize = g
1f30: 65 74 70 61 67 65 73 69 7a 65 28 29 3b 0a 23 65  etpagesize();.#e
1f40: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
1f50: 28 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41 5f  (EXECUTABLE_VIA_
1f60: 4d 4d 41 50 5f 44 45 56 5a 45 52 4f 29 0a 20 20  MMAP_DEVZERO).  
1f70: 20 20 20 20 7a 65 72 6f 5f 66 64 20 3d 20 6f 70      zero_fd = op
1f80: 65 6e 28 22 2f 64 65 76 2f 7a 65 72 6f 22 2c 4f  en("/dev/zero",O
1f90: 5f 52 44 4f 4e 4c 59 2c 30 36 34 34 29 3b 0a 20  _RDONLY,0644);. 
1fa0: 20 20 20 20 20 69 66 20 28 7a 65 72 6f 5f 66 64       if (zero_fd
1fb0: 20 3c 20 30 29 0a 20 20 20 20 20 20 20 20 7b 20   < 0).        { 
1fc0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
1fd0: 74 72 61 6d 70 6f 6c 69 6e 65 3a 20 43 61 6e 6e  trampoline: Cann
1fe0: 6f 74 20 6f 70 65 6e 20 2f 64 65 76 2f 7a 65 72  ot open /dev/zer
1ff0: 6f 21 5c 6e 22 29 3b 20 61 62 6f 72 74 28 29 3b  o!\n"); abort();
2000: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
2010: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 31 2e 20  #endif..  /* 1. 
2020: 41 6c 6c 6f 63 61 74 65 20 72 6f 6f 6d 20 2a 2f  Allocate room */
2030: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 43  ..#if !defined(C
2040: 4f 44 45 5f 45 58 45 43 55 54 41 42 4c 45 29 20  ODE_EXECUTABLE) 
2050: 26 26 20 21 64 65 66 69 6e 65 64 28 45 58 45 43  && !defined(EXEC
2060: 55 54 41 42 4c 45 5f 56 49 41 5f 4d 50 52 4f 54  UTABLE_VIA_MPROT
2070: 45 43 54 29 0a 20 20 69 66 20 28 66 72 65 65 6c  ECT).  if (freel
2080: 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20  ist == NULL).   
2090: 20 7b 20 2f 2a 20 47 65 74 20 61 20 6e 65 77 20   { /* Get a new 
20a0: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 63  page. */.      c
20b0: 68 61 72 2a 20 70 61 67 65 3b 0a 23 69 66 64 65  har* page;.#ifde
20c0: 66 20 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41  f EXECUTABLE_VIA
20d0: 5f 4d 4d 41 50 5f 41 4e 4f 4e 59 4d 4f 55 53 0a  _MMAP_ANONYMOUS.
20e0: 20 20 20 20 20 20 70 61 67 65 20 3d 20 6d 6d 61        page = mma
20f0: 70 28 30 2c 20 70 61 67 65 73 69 7a 65 2c 20 50  p(0, pagesize, P
2100: 52 4f 54 5f 52 45 41 44 20 7c 20 50 52 4f 54 5f  ROT_READ | PROT_
2110: 57 52 49 54 45 20 7c 20 50 52 4f 54 5f 45 58 45  WRITE | PROT_EXE
2120: 43 2c 20 4d 41 50 5f 41 4e 4f 4e 59 4d 4f 55 53  C, MAP_ANONYMOUS
2130: 20 7c 20 4d 41 50 5f 56 41 52 49 41 42 4c 45 2c   | MAP_VARIABLE,
2140: 20 2d 31 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a   -1, 0);.#endif.
2150: 23 69 66 64 65 66 20 45 58 45 43 55 54 41 42 4c  #ifdef EXECUTABL
2160: 45 5f 56 49 41 5f 4d 4d 41 50 5f 44 45 56 5a 45  E_VIA_MMAP_DEVZE
2170: 52 4f 0a 20 20 20 20 20 20 70 61 67 65 20 3d 20  RO.      page = 
2180: 6d 6d 61 70 28 30 2c 20 70 61 67 65 73 69 7a 65  mmap(0, pagesize
2190: 2c 20 50 52 4f 54 5f 52 45 41 44 20 7c 20 50 52  , PROT_READ | PR
21a0: 4f 54 5f 57 52 49 54 45 20 7c 20 50 52 4f 54 5f  OT_WRITE | PROT_
21b0: 45 58 45 43 2c 20 4d 41 50 5f 50 52 49 56 41 54  EXEC, MAP_PRIVAT
21c0: 45 2c 20 7a 65 72 6f 5f 66 64 2c 20 30 29 3b 0a  E, zero_fd, 0);.
21d0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 45 58  #endif.#ifdef EX
21e0: 45 43 55 54 41 42 4c 45 5f 56 49 41 5f 53 48 4d  ECUTABLE_VIA_SHM
21f0: 0a 20 20 20 20 20 20 69 6e 74 20 73 68 6d 69 64  .      int shmid
2200: 20 3d 20 73 68 6d 67 65 74 28 49 50 43 5f 50 52   = shmget(IPC_PR
2210: 49 56 41 54 45 2c 20 70 61 67 65 73 69 7a 65 2c  IVATE, pagesize,
2220: 20 30 37 30 30 7c 49 50 43 5f 43 52 45 41 54 29   0700|IPC_CREAT)
2230: 3b 0a 20 20 20 20 20 20 69 66 20 28 73 68 6d 69  ;.      if (shmi
2240: 64 3c 30 29 0a 20 20 20 20 20 20 20 20 7b 20 70  d<0).        { p
2250: 61 67 65 20 3d 20 28 63 68 61 72 2a 29 28 2d 31  age = (char*)(-1
2260: 29 3b 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 0a  ); }.      else.
2270: 20 20 20 20 20 20 20 20 7b 20 70 61 67 65 20 3d          { page =
2280: 20 73 68 6d 61 74 28 73 68 6d 69 64 2c 20 30 2c   shmat(shmid, 0,
2290: 20 30 29 3b 20 73 68 6d 63 74 6c 28 73 68 6d 69   0); shmctl(shmi
22a0: 64 2c 20 49 50 43 5f 52 4d 49 44 2c 20 30 29 3b  d, IPC_RMID, 0);
22b0: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66   }.#endif.#ifdef
22c0: 20 5f 57 49 4e 33 32 0a 20 20 20 20 20 20 70 61   _WIN32.      pa
22d0: 67 65 20 3d 20 56 69 72 74 75 61 6c 41 6c 6c 6f  ge = VirtualAllo
22e0: 63 28 4e 55 4c 4c 2c 20 70 61 67 65 73 69 7a 65  c(NULL, pagesize
22f0: 2c 20 4d 45 4d 5f 43 4f 4d 4d 49 54 2c 20 50 41  , MEM_COMMIT, PA
2300: 47 45 5f 45 58 45 43 55 54 45 5f 52 45 41 44 57  GE_EXECUTE_READW
2310: 52 49 54 45 29 3b 0a 20 20 20 20 20 20 69 66 20  RITE);.      if 
2320: 28 70 61 67 65 20 3d 3d 20 30 29 0a 20 20 20 20  (page == 0).    
2330: 20 20 09 7b 20 70 61 67 65 20 3d 20 28 63 68 61    .{ page = (cha
2340: 72 2a 29 28 2d 31 29 3b 20 7d 0a 23 65 6e 64 69  r*)(-1); }.#endi
2350: 66 0a 20 20 20 20 20 20 69 66 20 28 70 61 67 65  f.      if (page
2360: 20 3d 3d 20 28 63 68 61 72 2a 29 28 2d 31 29 29   == (char*)(-1))
2370: 0a 20 20 20 20 20 20 20 20 7b 20 66 70 72 69 6e  .        { fprin
2380: 74 66 28 73 74 64 65 72 72 2c 22 74 72 61 6d 70  tf(stderr,"tramp
2390: 6f 6c 69 6e 65 3a 20 4f 75 74 20 6f 66 20 76 69  oline: Out of vi
23a0: 72 74 75 61 6c 20 6d 65 6d 6f 72 79 21 5c 6e 22  rtual memory!\n"
23b0: 29 3b 20 61 62 6f 72 74 28 29 3b 20 7d 0a 20 20  ); abort(); }.  
23c0: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 74 20 77      /* Fill it w
23d0: 69 74 68 20 66 72 65 65 20 74 72 61 6d 70 6f 6c  ith free trampol
23e0: 69 6e 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 7b  ines. */.      {
23f0: 20 63 68 61 72 2a 2a 20 6c 61 73 74 20 3d 20 26   char** last = &
2400: 66 72 65 65 6c 69 73 74 3b 0a 20 20 20 20 20 20  freelist;.      
2410: 20 20 63 68 61 72 2a 20 70 61 67 65 5f 65 6e 64    char* page_end
2420: 20 3d 20 70 61 67 65 20 2b 20 70 61 67 65 73 69   = page + pagesi
2430: 7a 65 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  ze;.        whil
2440: 65 20 28 70 61 67 65 2b 54 52 41 4d 50 5f 4c 45  e (page+TRAMP_LE
2450: 4e 47 54 48 20 3c 3d 20 70 61 67 65 5f 65 6e 64  NGTH <= page_end
2460: 29 0a 20 20 20 20 20 20 20 20 20 20 7b 20 2a 6c  ).          { *l
2470: 61 73 74 20 3d 20 70 61 67 65 3b 20 6c 61 73 74  ast = page; last
2480: 20 3d 20 28 63 68 61 72 2a 2a 29 70 61 67 65 3b   = (char**)page;
2490: 20 70 61 67 65 20 2b 3d 20 54 52 41 4d 50 5f 4c   page += TRAMP_L
24a0: 45 4e 47 54 48 3b 20 7d 0a 20 20 20 20 20 20 20  ENGTH; }.       
24b0: 20 2a 6c 61 73 74 20 3d 20 4e 55 4c 4c 3b 0a 20   *last = NULL;. 
24c0: 20 20 20 7d 20 7d 0a 20 20 66 75 6e 63 74 69 6f     } }.  functio
24d0: 6e 20 3d 20 66 72 65 65 6c 69 73 74 3b 20 66 72  n = freelist; fr
24e0: 65 65 6c 69 73 74 20 3d 20 2a 28 63 68 61 72 2a  eelist = *(char*
24f0: 2a 29 66 72 65 65 6c 69 73 74 3b 0a 23 65 6c 73  *)freelist;.#els
2500: 65 0a 20 20 7b 20 63 68 61 72 2a 20 72 6f 6f 6d  e.  { char* room
2510: 20 3d 20 28 63 68 61 72 2a 29 20 6d 61 6c 6c 6f   = (char*) mallo
2520: 63 28 73 69 7a 65 6f 66 28 76 6f 69 64 2a 29 20  c(sizeof(void*) 
2530: 2b 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 2b  + TRAMP_LENGTH +
2540: 20 54 52 41 4d 50 5f 41 4c 49 47 4e 2d 31 29 3b   TRAMP_ALIGN-1);
2550: 0a 20 20 20 20 69 66 20 28 21 72 6f 6f 6d 29 0a  .    if (!room).
2560: 20 20 20 20 20 20 7b 20 66 70 72 69 6e 74 66 28        { fprintf(
2570: 73 74 64 65 72 72 2c 22 74 72 61 6d 70 6f 6c 69  stderr,"trampoli
2580: 6e 65 3a 20 4f 75 74 20 6f 66 20 76 69 72 74 75  ne: Out of virtu
2590: 61 6c 20 6d 65 6d 6f 72 79 21 5c 6e 22 29 3b 20  al memory!\n"); 
25a0: 61 62 6f 72 74 28 29 3b 20 7d 0a 20 20 20 20 66  abort(); }.    f
25b0: 75 6e 63 74 69 6f 6e 20 3d 20 28 63 68 61 72 2a  unction = (char*
25c0: 29 28 28 28 6c 6f 6e 67 29 72 6f 6f 6d 20 2b 20  )(((long)room + 
25d0: 73 69 7a 65 6f 66 28 76 6f 69 64 2a 29 20 2b 20  sizeof(void*) + 
25e0: 54 52 41 4d 50 5f 41 4c 49 47 4e 2d 31 29 20 26  TRAMP_ALIGN-1) &
25f0: 20 2d 54 52 41 4d 50 5f 41 4c 49 47 4e 29 3b 0a   -TRAMP_ALIGN);.
2600: 20 20 20 20 28 28 63 68 61 72 2a 2a 29 66 75 6e      ((char**)fun
2610: 63 74 69 6f 6e 29 5b 2d 31 5d 20 3d 20 72 6f 6f  ction)[-1] = roo
2620: 6d 3b 20 2f 2a 20 62 61 63 6b 70 6f 69 6e 74 65  m; /* backpointe
2630: 72 20 66 6f 72 20 66 72 65 65 5f 74 72 61 6d 70  r for free_tramp
2640: 6f 6c 69 6e 65 28 29 20 2a 2f 0a 20 20 7d 0a 23  oline() */.  }.#
2650: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 32 2e 20 46  endif..  /* 2. F
2660: 69 6c 6c 20 6f 75 74 20 74 68 65 20 74 72 61 6d  ill out the tram
2670: 70 6f 6c 69 6e 65 20 2a 2f 0a 23 69 66 64 65 66  poline */.#ifdef
2680: 20 5f 5f 69 33 38 36 5f 5f 0a 20 20 2f 2a 20 66   __i386__.  /* f
2690: 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20  unction:.   *   
26a0: 20 6d 6f 76 6c 20 24 3c 64 61 74 61 3e 2c 3c 76   movl $<data>,<v
26b0: 61 72 69 61 62 6c 65 3e 09 09 43 37 20 30 35 20  ariable>..C7 05 
26c0: 3c 76 61 72 69 61 62 6c 65 3e 20 3c 64 61 74 61  <variable> <data
26d0: 3e 0a 20 20 20 2a 20 20 20 20 6a 6d 70 20 3c 61  >.   *    jmp <a
26e0: 64 64 72 65 73 73 3e 09 09 09 45 39 20 3c 61 64  ddress>...E9 <ad
26f0: 64 72 65 73 73 3e 2d 3c 68 65 72 65 3e 0a 20 20  dress>-<here>.  
2700: 20 2a 20 68 65 72 65 3a 0a 20 20 20 2a 2f 0a 20   * here:.   */. 
2710: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e   *(short *) (fun
2720: 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20 30 78 30  ction + 0) = 0x0
2730: 35 43 37 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29  5C7;.  *(long *)
2740: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 32 29    (function + 2)
2750: 20 3d 20 28 6c 6f 6e 67 29 20 76 61 72 69 61 62   = (long) variab
2760: 6c 65 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20  le;.  *(long *) 
2770: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 36 29 20   (function + 6) 
2780: 3d 20 28 6c 6f 6e 67 29 20 64 61 74 61 3b 0a 20  = (long) data;. 
2790: 20 2a 28 63 68 61 72 20 2a 29 20 20 28 66 75 6e   *(char *)  (fun
27a0: 63 74 69 6f 6e 20 2b 31 30 29 20 3d 20 30 78 45  ction +10) = 0xE
27b0: 39 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20  9;.  *(long *)  
27c0: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 31 29 20 3d  (function +11) =
27d0: 20 28 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 20   (long) address 
27e0: 2d 20 28 6c 6f 6e 67 29 20 28 66 75 6e 63 74 69  - (long) (functi
27f0: 6f 6e 20 2b 20 31 35 29 3b 0a 23 64 65 66 69 6e  on + 15);.#defin
2800: 65 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74  e is_tramp(funct
2810: 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e 73 69  ion)  \.  *(unsi
2820: 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66  gned short *) (f
2830: 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 3d 20  unction + 0) == 
2840: 30 78 30 35 43 37 20 26 26 20 5c 0a 20 20 2a 28  0x05C7 && \.  *(
2850: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
2860: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 30 29    (function +10)
2870: 20 3d 3d 20 30 78 45 39 0a 23 64 65 66 69 6e 65   == 0xE9.#define
2880: 20 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66   tramp_address(f
2890: 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28  unction)  \.  *(
28a0: 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69  long *)  (functi
28b0: 6f 6e 20 2b 31 31 29 20 2b 20 28 6c 6f 6e 67 29  on +11) + (long)
28c0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 31 35 29   (function + 15)
28d0: 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 76  .#define tramp_v
28e0: 61 72 69 61 62 6c 65 28 66 75 6e 63 74 69 6f 6e  ariable(function
28f0: 29 20 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29  )  \.  *(long *)
2900: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 32 29    (function + 2)
2910: 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 64  .#define tramp_d
2920: 61 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c  ata(function)  \
2930: 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66  .  *(long *)  (f
2940: 75 6e 63 74 69 6f 6e 20 2b 20 36 29 0a 23 65 6e  unction + 6).#en
2950: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d 36 38  dif.#ifdef __m68
2960: 6b 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f  k__.  /* functio
2970: 6e 3a 0a 20 20 20 2a 20 20 20 20 6d 6f 76 65 6c  n:.   *    movel
2980: 20 23 3c 64 61 74 61 3e 2c 3c 76 61 72 69 61 62   #<data>,<variab
2990: 6c 65 3e 09 32 33 20 46 43 20 3c 64 61 74 61 3e  le>.23 FC <data>
29a0: 20 3c 76 61 72 69 61 62 6c 65 3e 0a 20 20 20 2a   <variable>.   *
29b0: 20 20 20 20 6a 6d 70 20 3c 61 64 64 72 65 73 73      jmp <address
29c0: 3e 09 09 09 34 45 20 46 39 20 3c 61 64 64 72 65  >...4E F9 <addre
29d0: 73 73 3e 0a 20 20 20 2a 20 20 20 20 6e 6f 70 09  ss>.   *    nop.
29e0: 09 09 09 34 45 20 37 31 0a 20 20 20 2a 2f 0a 20  ...4E 71.   */. 
29f0: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e   *(short *) (fun
2a00: 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20 30 78 32  ction + 0) = 0x2
2a10: 33 46 43 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29  3FC;.  *(long *)
2a20: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 32 29    (function + 2)
2a30: 20 3d 20 28 6c 6f 6e 67 29 20 64 61 74 61 3b 0a   = (long) data;.
2a40: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75    *(long *)  (fu
2a50: 6e 63 74 69 6f 6e 20 2b 20 36 29 20 3d 20 28 6c  nction + 6) = (l
2a60: 6f 6e 67 29 20 76 61 72 69 61 62 6c 65 3b 0a 20  ong) variable;. 
2a70: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e   *(short *) (fun
2a80: 63 74 69 6f 6e 20 2b 31 30 29 20 3d 20 30 78 34  ction +10) = 0x4
2a90: 45 46 39 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29  EF9;.  *(long *)
2aa0: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29    (function +12)
2ab0: 20 3d 20 28 6c 6f 6e 67 29 20 61 64 64 72 65 73   = (long) addres
2ac0: 73 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20  s;.  *(short *) 
2ad0: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d  (function +16) =
2ae0: 20 30 78 34 45 37 31 3b 0a 23 64 65 66 69 6e 65   0x4E71;.#define
2af0: 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69   is_tramp(functi
2b00: 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67  on)  \.  *(unsig
2b10: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75  ned short *) (fu
2b20: 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 3d 20 30  nction + 0) == 0
2b30: 78 32 33 46 43 20 26 26 20 5c 0a 20 20 2a 28 75  x23FC && \.  *(u
2b40: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29  nsigned short *)
2b50: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 30 29 20   (function +10) 
2b60: 3d 3d 20 30 78 34 45 46 39 20 26 26 20 5c 0a 20  == 0x4EF9 && \. 
2b70: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72   *(unsigned shor
2b80: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
2b90: 31 36 29 20 3d 3d 20 30 78 34 45 37 31 0a 23 64  16) == 0x4E71.#d
2ba0: 65 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 72  efine tramp_addr
2bb0: 65 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c  ess(function)  \
2bc0: 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66  .  *(long *)  (f
2bd0: 75 6e 63 74 69 6f 6e 20 2b 31 32 29 0a 23 64 65  unction +12).#de
2be0: 66 69 6e 65 20 74 72 61 6d 70 5f 76 61 72 69 61  fine tramp_varia
2bf0: 62 6c 65 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c  ble(function)  \
2c00: 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66  .  *(long *)  (f
2c10: 75 6e 63 74 69 6f 6e 20 2b 20 36 29 0a 23 64 65  unction + 6).#de
2c20: 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 28  fine tramp_data(
2c30: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a  function)  \.  *
2c40: 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74  (long *)  (funct
2c50: 69 6f 6e 20 2b 20 32 29 0a 23 65 6e 64 69 66 0a  ion + 2).#endif.
2c60: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 6d 69  #if defined(__mi
2c70: 70 73 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65  ps__) && !define
2c80: 64 28 5f 5f 6d 69 70 73 6e 33 32 5f 5f 29 0a 20  d(__mipsn32__). 
2c90: 20 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20   /* function:.  
2ca0: 20 2a 20 20 20 20 6c 69 20 24 32 2c 3c 64 61 74   *    li $2,<dat
2cb0: 61 3e 26 30 78 66 66 66 66 30 30 30 30 09 09 33  a>&0xffff0000..3
2cc0: 43 20 30 32 20 68 69 31 36 28 3c 64 61 74 61 3e  C 02 hi16(<data>
2cd0: 29 0a 20 20 20 2a 20 20 20 20 6f 72 69 20 24 32  ).   *    ori $2
2ce0: 2c 24 32 2c 3c 64 61 74 61 3e 26 30 78 66 66 66  ,$2,<data>&0xfff
2cf0: 66 09 09 33 34 20 34 32 20 6c 6f 31 36 28 3c 64  f..34 42 lo16(<d
2d00: 61 74 61 3e 29 0a 20 20 20 2a 20 20 20 20 73 77  ata>).   *    sw
2d10: 20 24 32 2c 3c 76 61 72 69 61 62 6c 65 3e 09 09   $2,<variable>..
2d20: 33 43 20 30 31 20 68 69 31 36 28 3c 76 61 72 69  3C 01 hi16(<vari
2d30: 61 62 6c 65 3e 29 0a 20 20 20 2a 20 20 20 20 09  able>).   *    .
2d40: 09 09 09 41 43 20 32 32 20 6c 6f 31 36 28 3c 76  ...AC 22 lo16(<v
2d50: 61 72 69 61 62 6c 65 3e 29 0a 20 20 20 2a 20 20  ariable>).   *  
2d60: 20 20 6c 69 20 24 32 35 2c 3c 61 64 64 72 65 73    li $25,<addres
2d70: 73 3e 26 30 78 66 66 66 66 30 30 30 30 09 33 43  s>&0xffff0000.3C
2d80: 20 31 39 20 68 69 31 36 28 3c 61 64 64 72 65 73   19 hi16(<addres
2d90: 73 3e 29 0a 20 20 20 2a 20 20 20 20 6f 72 69 20  s>).   *    ori 
2da0: 24 32 35 2c 24 32 35 2c 3c 61 64 64 72 65 73 73  $25,$25,<address
2db0: 3e 26 30 78 66 66 66 66 09 33 37 20 33 39 20 6c  >&0xffff.37 39 l
2dc0: 6f 31 36 28 3c 61 64 64 72 65 73 73 3e 29 0a 20  o16(<address>). 
2dd0: 20 20 2a 20 20 20 20 6a 20 24 32 35 09 09 09 09    *    j $25....
2de0: 30 33 20 32 30 20 30 30 20 30 38 0a 20 20 20 2a  03 20 00 08.   *
2df0: 20 20 20 20 6e 6f 70 09 09 09 09 30 30 20 30 30      nop....00 00
2e00: 20 30 30 20 30 30 0a 20 20 20 2a 2f 0a 20 20 2f   00 00.   */.  /
2e10: 2a 20 57 68 61 74 20 61 62 6f 75 74 20 62 69 67  * What about big
2e20: 20 65 6e 64 69 61 6e 20 2f 20 6c 69 74 74 6c 65   endian / little
2e30: 20 65 6e 64 69 61 6e 20 3f 3f 20 2a 2f 0a 20 20   endian ?? */.  
2e40: 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63  *(short *) (func
2e50: 74 69 6f 6e 20 2b 20 30 29 20 3d 20 30 78 33 43  tion + 0) = 0x3C
2e60: 30 32 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29  02;.  *(short *)
2e70: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 32 29 20   (function + 2) 
2e80: 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  = (unsigned long
2e90: 29 20 64 61 74 61 20 3e 3e 20 31 36 3b 0a 20 20  ) data >> 16;.  
2ea0: 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63  *(short *) (func
2eb0: 74 69 6f 6e 20 2b 20 34 29 20 3d 20 30 78 33 34  tion + 4) = 0x34
2ec0: 34 32 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29  42;.  *(short *)
2ed0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 36 29 20   (function + 6) 
2ee0: 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  = (unsigned long
2ef0: 29 20 64 61 74 61 20 26 20 30 78 66 66 66 66 3b  ) data & 0xffff;
2f00: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66  .  *(short *) (f
2f10: 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 30  unction + 8) = 0
2f20: 78 33 43 30 31 3b 0a 20 20 2a 28 73 68 6f 72 74  x3C01;.  *(short
2f30: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31   *) (function +1
2f40: 30 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c  0) = (unsigned l
2f50: 6f 6e 67 29 20 76 61 72 69 61 62 6c 65 20 3e 3e  ong) variable >>
2f60: 20 31 36 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a   16;.  *(short *
2f70: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29  ) (function +12)
2f80: 20 3d 20 30 78 41 43 32 32 3b 0a 20 20 2a 28 73   = 0xAC22;.  *(s
2f90: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
2fa0: 6e 20 2b 31 34 29 20 3d 20 28 75 6e 73 69 67 6e  n +14) = (unsign
2fb0: 65 64 20 6c 6f 6e 67 29 20 76 61 72 69 61 62 6c  ed long) variabl
2fc0: 65 20 26 20 30 78 66 66 66 66 3b 0a 20 20 2a 28  e & 0xffff;.  *(
2fd0: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
2fe0: 6f 6e 20 2b 31 36 29 20 3d 20 30 78 33 43 31 39  on +16) = 0x3C19
2ff0: 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28  ;.  *(short *) (
3000: 66 75 6e 63 74 69 6f 6e 20 2b 31 38 29 20 3d 20  function +18) = 
3010: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
3020: 61 64 64 72 65 73 73 20 3e 3e 20 31 36 3b 0a 20  address >> 16;. 
3030: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e   *(short *) (fun
3040: 63 74 69 6f 6e 20 2b 32 30 29 20 3d 20 30 78 33  ction +20) = 0x3
3050: 37 33 39 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a  739;.  *(short *
3060: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 32 29  ) (function +22)
3070: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e   = (unsigned lon
3080: 67 29 20 61 64 64 72 65 73 73 20 26 20 30 78 66  g) address & 0xf
3090: 66 66 66 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29  fff;.  *(long *)
30a0: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 34 29    (function +24)
30b0: 20 3d 20 30 78 30 33 32 30 30 30 30 38 3b 0a 20   = 0x03200008;. 
30c0: 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e   *(long *)  (fun
30d0: 63 74 69 6f 6e 20 2b 32 38 29 20 3d 20 30 78 30  ction +28) = 0x0
30e0: 30 30 30 30 30 30 30 3b 0a 23 64 65 66 69 6e 65  0000000;.#define
30f0: 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69   is_tramp(functi
3100: 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67  on)  \.  *(unsig
3110: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75  ned short *) (fu
3120: 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 3d 20 30  nction + 0) == 0
3130: 78 33 43 30 32 20 26 26 20 5c 0a 20 20 2a 28 75  x3C02 && \.  *(u
3140: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29  nsigned short *)
3150: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20   (function + 4) 
3160: 3d 3d 20 30 78 33 34 34 32 20 26 26 20 5c 0a 20  == 0x3442 && \. 
3170: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72   *(unsigned shor
3180: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
3190: 20 38 29 20 3d 3d 20 30 78 33 43 30 31 20 26 26   8) == 0x3C01 &&
31a0: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20   \.  *(unsigned 
31b0: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
31c0: 6f 6e 20 2b 31 32 29 20 3d 3d 20 30 78 41 43 32  on +12) == 0xAC2
31d0: 32 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67  2 && \.  *(unsig
31e0: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75  ned short *) (fu
31f0: 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 3d 20 30  nction +16) == 0
3200: 78 33 43 31 39 20 26 26 20 5c 0a 20 20 2a 28 75  x3C19 && \.  *(u
3210: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29  nsigned short *)
3220: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 30 29 20   (function +20) 
3230: 3d 3d 20 30 78 33 37 33 39 20 26 26 20 5c 0a 20  == 0x3739 && \. 
3240: 20 2a 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67   *(unsigned long
3250: 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b   *)  (function +
3260: 32 34 29 20 3d 3d 20 30 78 30 33 32 30 30 30 30  24) == 0x0320000
3270: 38 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67  8 && \.  *(unsig
3280: 6e 65 64 20 6c 6f 6e 67 20 2a 29 20 20 28 66 75  ned long *)  (fu
3290: 6e 63 74 69 6f 6e 20 2b 32 38 29 20 3d 3d 20 30  nction +28) == 0
32a0: 78 30 30 30 30 30 30 30 30 0a 23 64 65 66 69 6e  x00000000.#defin
32b0: 65 20 68 69 6c 6f 28 68 69 77 6f 72 64 2c 6c 6f  e hilo(hiword,lo
32c0: 77 6f 72 64 29 20 20 5c 0a 20 20 28 28 28 75 6e  word)  \.  (((un
32d0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 68 69  signed long) (hi
32e0: 77 6f 72 64 29 20 3c 3c 20 31 36 29 20 7c 20 28  word) << 16) | (
32f0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28  unsigned long) (
3300: 6c 6f 77 6f 72 64 29 29 0a 23 64 65 66 69 6e 65  loword)).#define
3310: 20 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66   tramp_address(f
3320: 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69  unction)  \.  hi
3330: 6c 6f 28 2a 28 75 6e 73 69 67 6e 65 64 20 73 68  lo(*(unsigned sh
3340: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ort *) (function
3350: 20 2b 31 38 29 2c 20 2a 28 75 6e 73 69 67 6e 65   +18), *(unsigne
3360: 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63  d short *) (func
3370: 74 69 6f 6e 20 2b 32 32 29 29 0a 23 64 65 66 69  tion +22)).#defi
3380: 6e 65 20 74 72 61 6d 70 5f 76 61 72 69 61 62 6c  ne tramp_variabl
3390: 65 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20  e(function)  \. 
33a0: 20 68 69 6c 6f 28 2a 28 75 6e 73 69 67 6e 65 64   hilo(*(unsigned
33b0: 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74   short *) (funct
33c0: 69 6f 6e 20 2b 31 30 29 2c 20 2a 28 75 6e 73 69  ion +10), *(unsi
33d0: 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66  gned short *) (f
33e0: 75 6e 63 74 69 6f 6e 20 2b 31 34 29 29 0a 23 64  unction +14)).#d
33f0: 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61  efine tramp_data
3400: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20  (function)  \.  
3410: 68 69 6c 6f 28 2a 28 75 6e 73 69 67 6e 65 64 20  hilo(*(unsigned 
3420: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
3430: 6f 6e 20 2b 20 32 29 2c 20 2a 28 75 6e 73 69 67  on + 2), *(unsig
3440: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75  ned short *) (fu
3450: 6e 63 74 69 6f 6e 20 2b 20 36 29 29 0a 23 65 6e  nction + 6)).#en
3460: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d 69 70  dif.#ifdef __mip
3470: 73 6e 33 32 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63  sn32__.  /* func
3480: 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 6c 77  tion:.   *    lw
3490: 20 24 32 2c 32 34 28 24 32 35 29 09 09 09 38 46   $2,24($25)...8F
34a0: 20 32 32 20 30 30 20 31 38 0a 20 20 20 2a 20 20   22 00 18.   *  
34b0: 20 20 6c 77 20 24 33 2c 32 38 28 24 32 35 29 09    lw $3,28($25).
34c0: 09 09 38 46 20 32 33 20 30 30 20 31 43 0a 20 20  ..8F 23 00 1C.  
34d0: 20 2a 20 20 20 20 73 77 20 24 33 2c 30 28 24 32   *    sw $3,0($2
34e0: 29 09 09 09 41 43 20 34 33 20 30 30 20 30 30 0a  )...AC 43 00 00.
34f0: 20 20 20 2a 20 20 20 20 6c 77 20 24 32 35 2c 33     *    lw $25,3
3500: 32 28 24 32 35 29 09 09 09 38 46 20 33 39 20 30  2($25)...8F 39 0
3510: 30 20 32 30 0a 20 20 20 2a 20 20 20 20 6a 20 24  0 20.   *    j $
3520: 32 35 09 09 09 09 30 33 20 32 30 20 30 30 20 30  25....03 20 00 0
3530: 38 0a 20 20 20 2a 20 20 20 20 6e 6f 70 09 09 09  8.   *    nop...
3540: 09 30 30 20 30 30 20 30 30 20 30 30 0a 20 20 20  .00 00 00 00.   
3550: 2a 20 20 20 20 2e 77 6f 72 64 20 3c 76 61 72 69  *    .word <vari
3560: 61 62 6c 65 3e 09 09 3c 76 61 72 69 61 62 6c 65  able>..<variable
3570: 3e 0a 20 20 20 2a 20 20 20 20 2e 77 6f 72 64 20  >.   *    .word 
3580: 3c 64 61 74 61 3e 09 09 09 3c 64 61 74 61 3e 0a  <data>...<data>.
3590: 20 20 20 2a 20 20 20 20 2e 77 6f 72 64 20 3c 61     *    .word <a
35a0: 64 64 72 65 73 73 3e 09 09 09 3c 61 64 64 72 65  ddress>...<addre
35b0: 73 73 3e 0a 20 20 20 2a 2f 0a 20 20 2f 2a 20 57  ss>.   */.  /* W
35c0: 68 61 74 20 61 62 6f 75 74 20 62 69 67 20 65 6e  hat about big en
35d0: 64 69 61 6e 20 2f 20 6c 69 74 74 6c 65 20 65 6e  dian / little en
35e0: 64 69 61 6e 20 3f 3f 20 2a 2f 0a 20 20 2a 28 75  dian ?? */.  *(u
35f0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 28  nsigned int *) (
3600: 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20  function + 0) = 
3610: 30 78 38 46 32 32 30 30 31 38 3b 0a 20 20 2a 28  0x8F220018;.  *(
3620: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20  unsigned int *) 
3630: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d  (function + 4) =
3640: 20 30 78 38 46 32 33 30 30 31 43 3b 0a 20 20 2a   0x8F23001C;.  *
3650: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29  (unsigned int *)
3660: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20   (function + 8) 
3670: 3d 20 30 78 41 43 34 33 30 30 30 30 3b 0a 20 20  = 0xAC430000;.  
3680: 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a  *(unsigned int *
3690: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29  ) (function +12)
36a0: 20 3d 20 30 78 38 46 33 39 30 30 32 30 3b 0a 20   = 0x8F390020;. 
36b0: 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20   *(unsigned int 
36c0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36  *) (function +16
36d0: 29 20 3d 20 30 78 30 33 32 30 30 30 30 38 3b 0a  ) = 0x03200008;.
36e0: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74    *(unsigned int
36f0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32   *) (function +2
3700: 30 29 20 3d 20 30 78 30 30 30 30 30 30 30 30 3b  0) = 0x00000000;
3710: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e  .  *(unsigned in
3720: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
3730: 32 34 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  24) = (unsigned 
3740: 69 6e 74 29 20 76 61 72 69 61 62 6c 65 3b 0a 20  int) variable;. 
3750: 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20   *(unsigned int 
3760: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 38  *) (function +28
3770: 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  ) = (unsigned in
3780: 74 29 20 64 61 74 61 3b 0a 20 20 2a 28 75 6e 73  t) data;.  *(uns
3790: 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 28 66 75  igned int *) (fu
37a0: 6e 63 74 69 6f 6e 20 2b 33 32 29 20 3d 20 28 75  nction +32) = (u
37b0: 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 61 64 64  nsigned int) add
37c0: 72 65 73 73 3b 0a 23 64 65 66 69 6e 65 20 69 73  ress;.#define is
37d0: 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29  _tramp(function)
37e0: 20 20 5c 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20    \.  *(int *)  
37f0: 20 20 20 20 20 20 20 20 28 66 75 6e 63 74 69 6f          (functio
3800: 6e 20 2b 20 30 29 20 3d 3d 20 30 78 38 46 32 32  n + 0) == 0x8F22
3810: 30 30 31 38 20 26 26 20 5c 0a 20 20 2a 28 69 6e  0018 && \.  *(in
3820: 74 20 2a 29 20 20 20 20 20 20 20 20 20 20 28 66  t *)          (f
3830: 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 3d 20  unction + 4) == 
3840: 30 78 38 46 32 33 30 30 31 43 20 26 26 20 5c 0a  0x8F23001C && \.
3850: 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 20 20 20    *(int *)      
3860: 20 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20      (function + 
3870: 38 29 20 3d 3d 20 30 78 41 43 34 33 30 30 30 30  8) == 0xAC430000
3880: 20 26 26 20 5c 0a 20 20 2a 28 69 6e 74 20 2a 29   && \.  *(int *)
3890: 20 20 20 20 20 20 20 20 20 20 28 66 75 6e 63 74            (funct
38a0: 69 6f 6e 20 2b 31 32 29 20 3d 3d 20 30 78 38 46  ion +12) == 0x8F
38b0: 33 39 30 30 32 30 20 26 26 20 5c 0a 20 20 2a 28  390020 && \.  *(
38c0: 69 6e 74 20 2a 29 20 20 20 20 20 20 20 20 20 20  int *)          
38d0: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d  (function +16) =
38e0: 3d 20 30 78 30 33 32 30 30 30 30 38 20 26 26 20  = 0x03200008 && 
38f0: 5c 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 20  \.  *(int *)    
3900: 20 20 20 20 20 20 28 66 75 6e 63 74 69 6f 6e 20        (function 
3910: 2b 32 30 29 20 3d 3d 20 30 78 30 30 30 30 30 30  +20) == 0x000000
3920: 30 30 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70  00.#define tramp
3930: 5f 61 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f  _address(functio
3940: 6e 29 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e  n)  \.  *(unsign
3950: 65 64 20 69 6e 74 20 2a 29 20 28 66 75 6e 63 74  ed int *) (funct
3960: 69 6f 6e 20 2b 33 32 29 0a 23 64 65 66 69 6e 65  ion +32).#define
3970: 20 74 72 61 6d 70 5f 76 61 72 69 61 62 6c 65 28   tramp_variable(
3980: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a  function)  \.  *
3990: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29  (unsigned int *)
39a0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 34 29 0a   (function +24).
39b0: 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61  #define tramp_da
39c0: 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a  ta(function)  \.
39d0: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74    *(unsigned int
39e0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32   *) (function +2
39f0: 38 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  8).#endif.#ifdef
3a00: 20 5f 5f 6d 69 70 73 36 34 6f 6c 64 5f 5f 0a 20   __mips64old__. 
3a10: 20 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20   /* function:.  
3a20: 20 2a 20 20 20 20 64 6c 69 20 24 32 2c 3c 76 61   *    dli $2,<va
3a30: 72 69 61 62 6c 65 3e 09 09 33 43 20 30 32 20 68  riable>..3C 02 h
3a40: 69 31 36 28 68 69 33 32 28 3c 76 61 72 69 61 62  i16(hi32(<variab
3a50: 6c 65 3e 29 29 0a 20 20 20 2a 09 09 09 09 09 33  le>)).   *.....3
3a60: 34 20 34 32 20 6c 6f 31 36 28 68 69 33 32 28 3c  4 42 lo16(hi32(<
3a70: 76 61 72 69 61 62 6c 65 3e 29 29 0a 20 20 20 2a  variable>)).   *
3a80: 09 09 09 09 09 30 30 20 30 32 20 31 34 20 33 38  .....00 02 14 38
3a90: 0a 20 20 20 2a 09 09 09 09 09 33 34 20 34 32 20  .   *.....34 42 
3aa0: 68 69 31 36 28 6c 6f 33 32 28 3c 76 61 72 69 61  hi16(lo32(<varia
3ab0: 62 6c 65 3e 29 29 0a 20 20 20 2a 09 09 09 09 09  ble>)).   *.....
3ac0: 30 30 20 30 32 20 31 34 20 33 38 0a 20 20 20 2a  00 02 14 38.   *
3ad0: 09 09 09 09 09 33 34 20 34 32 20 6c 6f 31 36 28  .....34 42 lo16(
3ae0: 6c 6f 33 32 28 3c 76 61 72 69 61 62 6c 65 3e 29  lo32(<variable>)
3af0: 29 0a 20 20 20 2a 20 20 20 20 64 6c 69 20 24 33  ).   *    dli $3
3b00: 2c 3c 64 61 74 61 3e 09 09 09 33 43 20 30 33 20  ,<data>...3C 03 
3b10: 68 69 31 36 28 68 69 33 32 28 3c 64 61 74 61 3e  hi16(hi32(<data>
3b20: 29 29 0a 20 20 20 2a 09 09 09 09 09 33 34 20 36  )).   *.....34 6
3b30: 33 20 6c 6f 31 36 28 68 69 33 32 28 3c 64 61 74  3 lo16(hi32(<dat
3b40: 61 3e 29 29 0a 20 20 20 2a 09 09 09 09 09 30 30  a>)).   *.....00
3b50: 20 30 33 20 31 43 20 33 38 0a 20 20 20 2a 09 09   03 1C 38.   *..
3b60: 09 09 09 33 34 20 36 33 20 68 69 31 36 28 6c 6f  ...34 63 hi16(lo
3b70: 33 32 28 3c 64 61 74 61 3e 29 29 0a 20 20 20 2a  32(<data>)).   *
3b80: 09 09 09 09 09 30 30 20 30 33 20 31 43 20 33 38  .....00 03 1C 38
3b90: 0a 20 20 20 2a 09 09 09 09 09 33 34 20 36 33 20  .   *.....34 63 
3ba0: 6c 6f 31 36 28 6c 6f 33 32 28 3c 64 61 74 61 3e  lo16(lo32(<data>
3bb0: 29 29 0a 20 20 20 2a 20 20 20 20 73 64 20 24 33  )).   *    sd $3
3bc0: 2c 30 28 24 32 29 09 09 09 46 43 20 34 33 20 30  ,0($2)...FC 43 0
3bd0: 30 20 30 30 0a 20 20 20 2a 20 20 20 20 64 6c 69  0 00.   *    dli
3be0: 20 24 32 35 2c 3c 61 64 64 72 65 73 73 3e 09 09   $25,<address>..
3bf0: 33 43 20 31 39 20 68 69 31 36 28 68 69 33 32 28  3C 19 hi16(hi32(
3c00: 3c 61 64 64 72 65 73 73 3e 29 29 0a 20 20 20 2a  <address>)).   *
3c10: 09 09 09 09 09 33 37 20 33 39 20 6c 6f 31 36 28  .....37 39 lo16(
3c20: 68 69 33 32 28 3c 61 64 64 72 65 73 73 3e 29 29  hi32(<address>))
3c30: 0a 20 20 20 2a 09 09 09 09 09 30 30 20 31 39 20  .   *.....00 19 
3c40: 43 43 20 33 38 0a 20 20 20 2a 09 09 09 09 09 33  CC 38.   *.....3
3c50: 37 20 33 39 20 68 69 31 36 28 6c 6f 33 32 28 3c  7 39 hi16(lo32(<
3c60: 61 64 64 72 65 73 73 3e 29 29 0a 20 20 20 2a 09  address>)).   *.
3c70: 09 09 09 09 30 30 20 31 39 20 43 43 20 33 38 0a  ....00 19 CC 38.
3c80: 20 20 20 2a 09 09 09 09 09 33 37 20 33 39 20 6c     *.....37 39 l
3c90: 6f 31 36 28 6c 6f 33 32 28 3c 61 64 64 72 65 73  o16(lo32(<addres
3ca0: 73 3e 29 29 0a 20 20 20 2a 20 20 20 20 6a 20 24  s>)).   *    j $
3cb0: 32 35 09 09 09 09 30 33 20 32 30 20 30 30 20 30  25....03 20 00 0
3cc0: 38 0a 20 20 20 2a 20 20 20 20 6e 6f 70 09 09 09  8.   *    nop...
3cd0: 09 30 30 20 30 30 20 30 30 20 30 30 0a 20 20 20  .00 00 00 00.   
3ce0: 2a 2f 0a 20 20 2f 2a 20 57 68 61 74 20 61 62 6f  */.  /* What abo
3cf0: 75 74 20 62 69 67 20 65 6e 64 69 61 6e 20 2f 20  ut big endian / 
3d00: 6c 69 74 74 6c 65 20 65 6e 64 69 61 6e 20 3f 3f  little endian ??
3d10: 20 2a 2f 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29   */.  *(short *)
3d20: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20   (function + 0) 
3d30: 3d 20 30 78 33 43 30 32 3b 0a 20 20 2a 28 73 68  = 0x3C02;.  *(sh
3d40: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ort *) (function
3d50: 20 2b 20 32 29 20 3d 20 28 75 6e 73 69 67 6e 65   + 2) = (unsigne
3d60: 64 20 6c 6f 6e 67 29 20 76 61 72 69 61 62 6c 65  d long) variable
3d70: 20 3e 3e 20 34 38 3b 0a 20 20 2a 28 73 68 6f 72   >> 48;.  *(shor
3d80: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
3d90: 20 34 29 20 3d 20 30 78 33 34 34 32 3b 0a 20 20   4) = 0x3442;.  
3da0: 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63  *(short *) (func
3db0: 74 69 6f 6e 20 2b 20 36 29 20 3d 20 28 28 75 6e  tion + 6) = ((un
3dc0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 76 61 72  signed long) var
3dd0: 69 61 62 6c 65 20 3e 3e 20 33 32 29 20 26 20 30  iable >> 32) & 0
3de0: 78 66 66 66 66 3b 0a 20 20 2a 28 69 6e 74 20 2a  xffff;.  *(int *
3df0: 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20  )   (function + 
3e00: 38 29 20 3d 20 30 78 30 30 30 32 31 34 33 38 3b  8) = 0x00021438;
3e10: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66  .  *(short *) (f
3e20: 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d 20 30  unction +12) = 0
3e30: 78 33 34 34 32 3b 0a 20 20 2a 28 73 68 6f 72 74  x3442;.  *(short
3e40: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31   *) (function +1
3e50: 34 29 20 3d 20 28 28 75 6e 73 69 67 6e 65 64 20  4) = ((unsigned 
3e60: 6c 6f 6e 67 29 20 76 61 72 69 61 62 6c 65 20 3e  long) variable >
3e70: 3e 20 31 36 29 20 26 20 30 78 66 66 66 66 3b 0a  > 16) & 0xffff;.
3e80: 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 28 66 75    *(int *)   (fu
3e90: 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20 30 78  nction +16) = 0x
3ea0: 30 30 30 32 31 34 33 38 3b 0a 20 20 2a 28 73 68  00021438;.  *(sh
3eb0: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ort *) (function
3ec0: 20 2b 32 30 29 20 3d 20 30 78 33 34 34 32 3b 0a   +20) = 0x3442;.
3ed0: 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75    *(short *) (fu
3ee0: 6e 63 74 69 6f 6e 20 2b 32 32 29 20 3d 20 28 75  nction +22) = (u
3ef0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 76 61  nsigned long) va
3f00: 72 69 61 62 6c 65 20 26 20 30 78 66 66 66 66 3b  riable & 0xffff;
3f10: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66  .  *(short *) (f
3f20: 75 6e 63 74 69 6f 6e 20 2b 32 34 29 20 3d 20 30  unction +24) = 0
3f30: 78 33 43 30 33 3b 0a 20 20 2a 28 73 68 6f 72 74  x3C03;.  *(short
3f40: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32   *) (function +2
3f50: 36 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c  6) = (unsigned l
3f60: 6f 6e 67 29 20 64 61 74 61 20 3e 3e 20 34 38 3b  ong) data >> 48;
3f70: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66  .  *(short *) (f
3f80: 75 6e 63 74 69 6f 6e 20 2b 32 38 29 20 3d 20 30  unction +28) = 0
3f90: 78 33 34 36 33 3b 0a 20 20 2a 28 73 68 6f 72 74  x3463;.  *(short
3fa0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 33   *) (function +3
3fb0: 30 29 20 3d 20 28 28 75 6e 73 69 67 6e 65 64 20  0) = ((unsigned 
3fc0: 6c 6f 6e 67 29 20 64 61 74 61 20 3e 3e 20 33 32  long) data >> 32
3fd0: 29 20 26 20 30 78 66 66 66 66 3b 0a 20 20 2a 28  ) & 0xffff;.  *(
3fe0: 69 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69  int *)   (functi
3ff0: 6f 6e 20 2b 33 32 29 20 3d 20 30 78 30 30 30 33  on +32) = 0x0003
4000: 31 43 33 38 3b 0a 20 20 2a 28 73 68 6f 72 74 20  1C38;.  *(short 
4010: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 33 36  *) (function +36
4020: 29 20 3d 20 30 78 33 34 36 33 3b 0a 20 20 2a 28  ) = 0x3463;.  *(
4030: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
4040: 6f 6e 20 2b 33 38 29 20 3d 20 28 28 75 6e 73 69  on +38) = ((unsi
4050: 67 6e 65 64 20 6c 6f 6e 67 29 20 64 61 74 61 20  gned long) data 
4060: 3e 3e 20 31 36 29 20 26 20 30 78 66 66 66 66 3b  >> 16) & 0xffff;
4070: 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 28 66  .  *(int *)   (f
4080: 75 6e 63 74 69 6f 6e 20 2b 34 30 29 20 3d 20 30  unction +40) = 0
4090: 78 30 30 30 33 31 43 33 38 3b 0a 20 20 2a 28 73  x00031C38;.  *(s
40a0: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
40b0: 6e 20 2b 34 34 29 20 3d 20 30 78 33 34 36 33 3b  n +44) = 0x3463;
40c0: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66  .  *(short *) (f
40d0: 75 6e 63 74 69 6f 6e 20 2b 34 36 29 20 3d 20 28  unction +46) = (
40e0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64  unsigned long) d
40f0: 61 74 61 20 26 20 30 78 66 66 66 66 3b 0a 20 20  ata & 0xffff;.  
4100: 2a 28 69 6e 74 20 2a 29 20 20 20 28 66 75 6e 63  *(int *)   (func
4110: 74 69 6f 6e 20 2b 34 38 29 20 3d 20 30 78 46 43  tion +48) = 0xFC
4120: 34 33 30 30 30 30 3b 0a 20 20 2a 28 73 68 6f 72  430000;.  *(shor
4130: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
4140: 35 32 29 20 3d 20 30 78 33 43 31 39 3b 0a 20 20  52) = 0x3C19;.  
4150: 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63  *(short *) (func
4160: 74 69 6f 6e 20 2b 35 34 29 20 3d 20 28 75 6e 73  tion +54) = (uns
4170: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64 72  igned long) addr
4180: 65 73 73 20 3e 3e 20 34 38 3b 0a 20 20 2a 28 73  ess >> 48;.  *(s
4190: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
41a0: 6e 20 2b 35 36 29 20 3d 20 30 78 33 37 33 39 3b  n +56) = 0x3739;
41b0: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66  .  *(short *) (f
41c0: 75 6e 63 74 69 6f 6e 20 2b 35 38 29 20 3d 20 28  unction +58) = (
41d0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
41e0: 61 64 64 72 65 73 73 20 3e 3e 20 33 32 29 20 26  address >> 32) &
41f0: 20 30 78 66 66 66 66 3b 0a 20 20 2a 28 69 6e 74   0xffff;.  *(int
4200: 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20   *)   (function 
4210: 2b 36 30 29 20 3d 20 30 78 30 30 31 39 43 43 33  +60) = 0x0019CC3
4220: 38 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20  8;.  *(short *) 
4230: 28 66 75 6e 63 74 69 6f 6e 20 2b 36 34 29 20 3d  (function +64) =
4240: 20 30 78 33 37 33 39 3b 0a 20 20 2a 28 73 68 6f   0x3739;.  *(sho
4250: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
4260: 2b 36 36 29 20 3d 20 28 28 75 6e 73 69 67 6e 65  +66) = ((unsigne
4270: 64 20 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 20  d long) address 
4280: 3e 3e 20 31 36 29 20 26 20 30 78 66 66 66 66 3b  >> 16) & 0xffff;
4290: 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 28 66  .  *(int *)   (f
42a0: 75 6e 63 74 69 6f 6e 20 2b 36 38 29 20 3d 20 30  unction +68) = 0
42b0: 78 30 30 31 39 43 43 33 38 3b 0a 20 20 2a 28 73  x0019CC38;.  *(s
42c0: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
42d0: 6e 20 2b 37 32 29 20 3d 20 30 78 33 37 33 39 3b  n +72) = 0x3739;
42e0: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66  .  *(short *) (f
42f0: 75 6e 63 74 69 6f 6e 20 2b 37 34 29 20 3d 20 28  unction +74) = (
4300: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 61  unsigned long) a
4310: 64 64 72 65 73 73 20 26 20 30 78 66 66 66 66 3b  ddress & 0xffff;
4320: 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 28 66  .  *(int *)   (f
4330: 75 6e 63 74 69 6f 6e 20 2b 37 36 29 20 3d 20 30  unction +76) = 0
4340: 78 30 33 32 30 30 30 30 38 3b 0a 20 20 2a 28 69  x03200008;.  *(i
4350: 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f  nt *)   (functio
4360: 6e 20 2b 38 30 29 20 3d 20 30 78 30 30 30 30 30  n +80) = 0x00000
4370: 30 30 30 3b 0a 23 64 65 66 69 6e 65 20 69 73 5f  000;.#define is_
4380: 74 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20  tramp(function) 
4390: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20   \.  *(unsigned 
43a0: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
43b0: 6f 6e 20 2b 20 30 29 20 3d 3d 20 30 78 33 43 30  on + 0) == 0x3C0
43c0: 32 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67  2 && \.  *(unsig
43d0: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75  ned short *) (fu
43e0: 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 3d 20 30  nction + 4) == 0
43f0: 78 33 34 34 32 20 26 26 20 5c 0a 20 20 2a 28 75  x3442 && \.  *(u
4400: 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 20  nsigned int *)  
4410: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20   (function + 8) 
4420: 3d 3d 20 30 78 30 30 30 32 31 34 33 38 20 26 26  == 0x00021438 &&
4430: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20   \.  *(unsigned 
4440: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
4450: 6f 6e 20 2b 31 32 29 20 3d 3d 20 30 78 33 34 34  on +12) == 0x344
4460: 32 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67  2 && \.  *(unsig
4470: 6e 65 64 20 69 6e 74 20 2a 29 20 20 20 28 66 75  ned int *)   (fu
4480: 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 3d 20 30  nction +16) == 0
4490: 78 30 30 30 32 31 34 33 38 20 26 26 20 5c 0a 20  x00021438 && \. 
44a0: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72   *(unsigned shor
44b0: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
44c0: 32 30 29 20 3d 3d 20 30 78 33 34 34 32 20 26 26  20) == 0x3442 &&
44d0: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20   \.  *(unsigned 
44e0: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
44f0: 6f 6e 20 2b 32 34 29 20 3d 3d 20 30 78 33 43 30  on +24) == 0x3C0
4500: 33 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67  3 && \.  *(unsig
4510: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75  ned short *) (fu
4520: 6e 63 74 69 6f 6e 20 2b 32 38 29 20 3d 3d 20 30  nction +28) == 0
4530: 78 33 34 36 33 20 26 26 20 5c 0a 20 20 2a 28 75  x3463 && \.  *(u
4540: 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 20  nsigned int *)  
4550: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 33 32 29 20   (function +32) 
4560: 3d 3d 20 30 78 30 30 30 33 31 43 33 38 20 26 26  == 0x00031C38 &&
4570: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20   \.  *(unsigned 
4580: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
4590: 6f 6e 20 2b 33 36 29 20 3d 3d 20 30 78 33 34 36  on +36) == 0x346
45a0: 33 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67  3 && \.  *(unsig
45b0: 6e 65 64 20 69 6e 74 20 2a 29 20 20 20 28 66 75  ned int *)   (fu
45c0: 6e 63 74 69 6f 6e 20 2b 34 30 29 20 3d 3d 20 30  nction +40) == 0
45d0: 78 30 30 30 33 31 43 33 38 20 26 26 20 5c 0a 20  x00031C38 && \. 
45e0: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72   *(unsigned shor
45f0: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
4600: 34 34 29 20 3d 3d 20 30 78 33 34 36 33 20 26 26  44) == 0x3463 &&
4610: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20   \.  *(unsigned 
4620: 69 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69  int *)   (functi
4630: 6f 6e 20 2b 34 38 29 20 3d 3d 20 30 78 46 43 34  on +48) == 0xFC4
4640: 33 30 30 30 30 20 26 26 20 5c 0a 20 20 2a 28 75  30000 && \.  *(u
4650: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29  nsigned short *)
4660: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 35 32 29 20   (function +52) 
4670: 3d 3d 20 30 78 33 43 31 39 20 26 26 20 5c 0a 20  == 0x3C19 && \. 
4680: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72   *(unsigned shor
4690: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
46a0: 35 36 29 20 3d 3d 20 30 78 33 37 33 39 20 26 26  56) == 0x3739 &&
46b0: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20   \.  *(unsigned 
46c0: 69 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69  int *)   (functi
46d0: 6f 6e 20 2b 36 30 29 20 3d 3d 20 30 78 30 30 31  on +60) == 0x001
46e0: 39 43 43 33 38 20 26 26 20 5c 0a 20 20 2a 28 75  9CC38 && \.  *(u
46f0: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29  nsigned short *)
4700: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 36 34 29 20   (function +64) 
4710: 3d 3d 20 30 78 33 37 33 39 20 26 26 20 5c 0a 20  == 0x3739 && \. 
4720: 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20   *(unsigned int 
4730: 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b  *)   (function +
4740: 36 38 29 20 3d 3d 20 30 78 30 30 31 39 43 43 33  68) == 0x0019CC3
4750: 38 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67  8 && \.  *(unsig
4760: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75  ned short *) (fu
4770: 6e 63 74 69 6f 6e 20 2b 37 32 29 20 3d 3d 20 30  nction +72) == 0
4780: 78 33 37 33 39 20 26 26 20 5c 0a 20 20 2a 28 75  x3739 && \.  *(u
4790: 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 20  nsigned int *)  
47a0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 37 36 29 20   (function +76) 
47b0: 3d 3d 20 30 78 30 33 32 30 30 30 30 38 20 26 26  == 0x03200008 &&
47c0: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20   \.  *(unsigned 
47d0: 69 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69  int *)   (functi
47e0: 6f 6e 20 2b 38 30 29 20 3d 3d 20 30 78 30 30 30  on +80) == 0x000
47f0: 30 30 30 30 30 0a 23 64 65 66 69 6e 65 20 68 69  00000.#define hi
4800: 6c 6f 28 77 6f 72 64 33 2c 77 6f 72 64 32 2c 77  lo(word3,word2,w
4810: 6f 72 64 31 2c 77 6f 72 64 30 29 20 20 5c 0a 20  ord1,word0)  \. 
4820: 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e   (((unsigned lon
4830: 67 29 20 28 77 6f 72 64 33 29 20 3c 3c 20 34 38  g) (word3) << 48
4840: 29 20 7c 20 28 28 75 6e 73 69 67 6e 65 64 20 6c  ) | ((unsigned l
4850: 6f 6e 67 29 20 28 77 6f 72 64 32 29 20 3c 3c 20  ong) (word2) << 
4860: 33 32 29 20 7c 20 5c 0a 20 20 20 28 28 75 6e 73  32) | \.   ((uns
4870: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 77 6f 72  igned long) (wor
4880: 64 31 29 20 3c 3c 20 31 36 29 20 7c 20 28 75 6e  d1) << 16) | (un
4890: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 77 6f  signed long) (wo
48a0: 72 64 30 29 29 0a 23 64 65 66 69 6e 65 20 74 72  rd0)).#define tr
48b0: 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75 6e 63  amp_address(func
48c0: 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c 6f 28  tion)  \.  hilo(
48d0: 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74  *(unsigned short
48e0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 35   *) (function +5
48f0: 34 29 2c 20 5c 0a 20 20 20 20 20 20 20 2a 28 75  4), \.       *(u
4900: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29  nsigned short *)
4910: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 35 38 29 2c   (function +58),
4920: 20 5c 0a 20 20 20 20 20 20 20 2a 28 75 6e 73 69   \.       *(unsi
4930: 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66  gned short *) (f
4940: 75 6e 63 74 69 6f 6e 20 2b 36 36 29 2c 20 5c 0a  unction +66), \.
4950: 20 20 20 20 20 20 20 2a 28 75 6e 73 69 67 6e 65         *(unsigne
4960: 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63  d short *) (func
4970: 74 69 6f 6e 20 2b 37 34 29 29 0a 23 64 65 66 69  tion +74)).#defi
4980: 6e 65 20 74 72 61 6d 70 5f 76 61 72 69 61 62 6c  ne tramp_variabl
4990: 65 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20  e(function)  \. 
49a0: 20 68 69 6c 6f 28 2a 28 75 6e 73 69 67 6e 65 64   hilo(*(unsigned
49b0: 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74   short *) (funct
49c0: 69 6f 6e 20 2b 20 32 29 2c 20 5c 0a 20 20 20 20  ion + 2), \.    
49d0: 20 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68     *(unsigned sh
49e0: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ort *) (function
49f0: 20 2b 20 36 29 2c 20 5c 0a 20 20 20 20 20 20 20   + 6), \.       
4a00: 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74  *(unsigned short
4a10: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31   *) (function +1
4a20: 34 29 2c 20 5c 0a 20 20 20 20 20 20 20 2a 28 75  4), \.       *(u
4a30: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29  nsigned short *)
4a40: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 32 29 29   (function +22))
4a50: 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 64  .#define tramp_d
4a60: 61 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c  ata(function)  \
4a70: 0a 20 20 68 69 6c 6f 28 2a 28 75 6e 73 69 67 6e  .  hilo(*(unsign
4a80: 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e  ed short *) (fun
4a90: 63 74 69 6f 6e 20 2b 32 36 29 2c 20 5c 0a 20 20  ction +26), \.  
4aa0: 20 20 20 20 20 2a 28 75 6e 73 69 67 6e 65 64 20       *(unsigned 
4ab0: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
4ac0: 6f 6e 20 2b 33 30 29 2c 20 5c 0a 20 20 20 20 20  on +30), \.     
4ad0: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f    *(unsigned sho
4ae0: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
4af0: 2b 33 38 29 2c 20 5c 0a 20 20 20 20 20 20 20 2a  +38), \.       *
4b00: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20  (unsigned short 
4b10: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 34 36  *) (function +46
4b20: 29 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  )).#endif.#ifdef
4b30: 20 5f 5f 6d 69 70 73 36 34 5f 5f 0a 20 20 2f 2a   __mips64__.  /*
4b40: 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20   function:.   * 
4b50: 20 20 20 6c 64 20 24 32 2c 32 34 28 24 32 35 29     ld $2,24($25)
4b60: 09 09 09 44 46 20 32 32 20 30 30 20 31 38 0a 20  ...DF 22 00 18. 
4b70: 20 20 2a 20 20 20 20 6c 64 20 24 33 2c 33 32 28    *    ld $3,32(
4b80: 24 32 35 29 09 09 09 44 46 20 32 33 20 30 30 20  $25)...DF 23 00 
4b90: 32 30 0a 20 20 20 2a 20 20 20 20 73 64 20 24 33  20.   *    sd $3
4ba0: 2c 30 28 24 32 29 09 09 09 46 43 20 34 33 20 30  ,0($2)...FC 43 0
4bb0: 30 20 30 30 0a 20 20 20 2a 20 20 20 20 6c 64 20  0 00.   *    ld 
4bc0: 24 32 35 2c 34 30 28 24 32 35 29 09 09 09 44 46  $25,40($25)...DF
4bd0: 20 33 39 20 30 30 20 32 38 0a 20 20 20 2a 20 20   39 00 28.   *  
4be0: 20 20 6a 20 24 32 35 09 09 09 09 30 33 20 32 30    j $25....03 20
4bf0: 20 30 30 20 30 38 0a 20 20 20 2a 20 20 20 20 6e   00 08.   *    n
4c00: 6f 70 09 09 09 09 30 30 20 30 30 20 30 30 20 30  op....00 00 00 0
4c10: 30 0a 20 20 20 2a 20 20 20 20 2e 64 77 6f 72 64  0.   *    .dword
4c20: 20 3c 76 61 72 69 61 62 6c 65 3e 09 09 3c 76 61   <variable>..<va
4c30: 72 69 61 62 6c 65 3e 0a 20 20 20 2a 20 20 20 20  riable>.   *    
4c40: 2e 64 77 6f 72 64 20 3c 64 61 74 61 3e 09 09 09  .dword <data>...
4c50: 3c 64 61 74 61 3e 0a 20 20 20 2a 20 20 20 20 2e  <data>.   *    .
4c60: 64 77 6f 72 64 20 3c 61 64 64 72 65 73 73 3e 09  dword <address>.
4c70: 09 3c 61 64 64 72 65 73 73 3e 0a 20 20 20 2a 2f  .<address>.   */
4c80: 0a 20 20 2f 2a 20 57 68 61 74 20 61 62 6f 75 74  .  /* What about
4c90: 20 62 69 67 20 65 6e 64 69 61 6e 20 2f 20 6c 69   big endian / li
4ca0: 74 74 6c 65 20 65 6e 64 69 61 6e 20 3f 3f 20 2a  ttle endian ?? *
4cb0: 2f 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 20  /.  *(long *)   
4cc0: 20 20 20 20 20 20 20 28 66 75 6e 63 74 69 6f 6e         (function
4cd0: 20 2b 20 30 29 20 3d 20 30 78 44 46 32 32 30 30   + 0) = 0xDF2200
4ce0: 31 38 44 46 32 33 30 30 32 30 4c 3b 0a 20 20 2a  18DF230020L;.  *
4cf0: 28 6c 6f 6e 67 20 2a 29 20 20 20 20 20 20 20 20  (long *)        
4d00: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29    (function + 8)
4d10: 20 3d 20 30 78 46 43 34 33 30 30 30 30 44 46 33   = 0xFC430000DF3
4d20: 39 30 30 32 38 4c 3b 0a 20 20 2a 28 6c 6f 6e 67  90028L;.  *(long
4d30: 20 2a 29 20 20 20 20 20 20 20 20 20 20 28 66 75   *)          (fu
4d40: 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20 30 78  nction +16) = 0x
4d50: 30 33 32 30 30 30 30 38 30 30 30 30 30 30 30 30  0320000800000000
4d60: 4c 3b 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20  L;.  *(unsigned 
4d70: 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f  long *) (functio
4d80: 6e 20 2b 32 34 29 20 3d 20 28 75 6e 73 69 67 6e  n +24) = (unsign
4d90: 65 64 20 6c 6f 6e 67 29 20 76 61 72 69 61 62 6c  ed long) variabl
4da0: 65 3b 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20  e;.  *(unsigned 
4db0: 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f  long *) (functio
4dc0: 6e 20 2b 33 32 29 20 3d 20 28 75 6e 73 69 67 6e  n +32) = (unsign
4dd0: 65 64 20 6c 6f 6e 67 29 20 64 61 74 61 3b 0a 20  ed long) data;. 
4de0: 20 2a 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67   *(unsigned long
4df0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 34   *) (function +4
4e00: 30 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c  0) = (unsigned l
4e10: 6f 6e 67 29 20 61 64 64 72 65 73 73 3b 0a 23 64  ong) address;.#d
4e20: 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 28 66  efine is_tramp(f
4e30: 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28  unction)  \.  *(
4e40: 6c 6f 6e 67 20 2a 29 20 20 20 20 20 20 20 20 20  long *)         
4e50: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20   (function + 0) 
4e60: 3d 3d 20 30 78 44 46 32 32 30 30 31 38 44 46 32  == 0xDF220018DF2
4e70: 33 30 30 32 30 4c 20 26 26 20 5c 0a 20 20 2a 28  30020L && \.  *(
4e80: 6c 6f 6e 67 20 2a 29 20 20 20 20 20 20 20 20 20  long *)         
4e90: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20   (function + 8) 
4ea0: 3d 3d 20 30 78 46 43 34 33 30 30 30 30 44 46 33  == 0xFC430000DF3
4eb0: 39 30 30 32 38 4c 20 26 26 20 5c 0a 20 20 2a 28  90028L && \.  *(
4ec0: 6c 6f 6e 67 20 2a 29 20 20 20 20 20 20 20 20 20  long *)         
4ed0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20   (function +16) 
4ee0: 3d 3d 20 30 78 30 33 32 30 30 30 30 38 30 30 30  == 0x03200008000
4ef0: 30 30 30 30 30 4c 0a 23 64 65 66 69 6e 65 20 74  00000L.#define t
4f00: 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75 6e  ramp_address(fun
4f10: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e  ction)  \.  *(un
4f20: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 29 20 28  signed long *) (
4f30: 66 75 6e 63 74 69 6f 6e 20 2b 34 30 29 0a 23 64  function +40).#d
4f40: 65 66 69 6e 65 20 74 72 61 6d 70 5f 76 61 72 69  efine tramp_vari
4f50: 61 62 6c 65 28 66 75 6e 63 74 69 6f 6e 29 20 20  able(function)  
4f60: 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 6c  \.  *(unsigned l
4f70: 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ong *) (function
4f80: 20 2b 32 34 29 0a 23 64 65 66 69 6e 65 20 74 72   +24).#define tr
4f90: 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 74 69 6f  amp_data(functio
4fa0: 6e 29 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e  n)  \.  *(unsign
4fb0: 65 64 20 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63  ed long *) (func
4fc0: 74 69 6f 6e 20 2b 33 32 29 0a 23 65 6e 64 69 66  tion +32).#endif
4fd0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 73  .#if defined(__s
4fe0: 70 61 72 63 5f 5f 29 20 26 26 20 21 64 65 66 69  parc__) && !defi
4ff0: 6e 65 64 28 5f 5f 73 70 61 72 63 36 34 5f 5f 29  ned(__sparc64__)
5000: 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a  .  /* function:.
5010: 20 20 20 2a 20 20 20 20 73 65 74 68 69 20 25 68     *    sethi %h
5020: 69 28 3c 76 61 72 69 61 62 6c 65 3e 29 2c 25 67  i(<variable>),%g
5030: 31 09 30 33 30 30 30 30 30 30 20 7c 20 28 3c 76  1.03000000 | (<v
5040: 61 72 69 61 62 6c 65 3e 20 3e 3e 20 31 30 29 0a  ariable> >> 10).
5050: 20 20 20 2a 20 20 20 20 73 65 74 68 69 20 25 68     *    sethi %h
5060: 69 28 3c 64 61 74 61 3e 29 2c 25 67 32 09 09 30  i(<data>),%g2..0
5070: 35 30 30 30 30 30 30 20 7c 20 28 3c 64 61 74 61  5000000 | (<data
5080: 3e 20 3e 3e 20 31 30 29 0a 20 20 20 2a 20 20 20  > >> 10).   *   
5090: 20 6f 72 20 25 67 32 2c 25 6c 6f 28 3c 64 61 74   or %g2,%lo(<dat
50a0: 61 3e 29 2c 25 67 32 09 09 38 34 31 30 41 30 30  a>),%g2..8410A00
50b0: 30 20 7c 20 28 3c 64 61 74 61 3e 20 26 20 30 78  0 | (<data> & 0x
50c0: 33 66 66 29 0a 20 20 20 2a 20 20 20 20 73 74 20  3ff).   *    st 
50d0: 25 67 32 2c 5b 25 67 31 2b 25 6c 6f 28 3c 76 61  %g2,[%g1+%lo(<va
50e0: 72 69 61 62 6c 65 3e 29 5d 09 43 34 32 30 36 30  riable>)].C42060
50f0: 30 30 20 7c 20 28 3c 76 61 72 69 61 62 6c 65 3e  00 | (<variable>
5100: 20 26 20 30 78 33 66 66 29 0a 20 20 20 2a 20 20   & 0x3ff).   *  
5110: 20 20 73 65 74 68 69 20 25 68 69 28 3c 61 64 64    sethi %hi(<add
5120: 72 65 73 73 3e 29 2c 25 67 31 09 30 33 30 30 30  ress>),%g1.03000
5130: 30 30 30 20 7c 20 28 3c 61 64 64 72 65 73 73 3e  000 | (<address>
5140: 20 3e 3e 20 31 30 29 0a 20 20 20 2a 20 20 20 20   >> 10).   *    
5150: 6a 6d 70 20 25 67 31 2b 25 6c 6f 28 3c 61 64 64  jmp %g1+%lo(<add
5160: 72 65 73 73 3e 29 09 09 38 31 43 30 36 30 30 30  ress>)..81C06000
5170: 20 7c 20 28 3c 61 64 64 72 65 73 73 3e 20 26 20   | (<address> & 
5180: 30 78 33 66 66 29 0a 20 20 20 2a 20 20 20 20 6e  0x3ff).   *    n
5190: 6f 70 09 09 09 09 30 31 30 30 30 30 30 30 0a 20  op....01000000. 
51a0: 20 20 2a 2f 0a 23 64 65 66 69 6e 65 20 68 69 28    */.#define hi(
51b0: 77 6f 72 64 29 20 20 28 28 75 6e 73 69 67 6e 65  word)  ((unsigne
51c0: 64 20 6c 6f 6e 67 29 20 28 77 6f 72 64 29 20 3e  d long) (word) >
51d0: 3e 20 31 30 29 0a 23 64 65 66 69 6e 65 20 6c 6f  > 10).#define lo
51e0: 28 77 6f 72 64 29 20 20 28 28 75 6e 73 69 67 6e  (word)  ((unsign
51f0: 65 64 20 6c 6f 6e 67 29 20 28 77 6f 72 64 29 20  ed long) (word) 
5200: 26 20 30 78 33 66 66 29 0a 20 20 2a 28 6c 6f 6e  & 0x3ff).  *(lon
5210: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  g *) (function +
5220: 20 30 29 20 3d 20 30 78 30 33 30 30 30 30 30 30   0) = 0x03000000
5230: 20 7c 20 68 69 28 76 61 72 69 61 62 6c 65 29 3b   | hi(variable);
5240: 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75  .  *(long *) (fu
5250: 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 20 30 78  nction + 4) = 0x
5260: 30 35 30 30 30 30 30 30 20 7c 20 68 69 28 64 61  05000000 | hi(da
5270: 74 61 29 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29  ta);.  *(long *)
5280: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20   (function + 8) 
5290: 3d 20 30 78 38 34 31 30 41 30 30 30 20 7c 20 6c  = 0x8410A000 | l
52a0: 6f 28 64 61 74 61 29 3b 0a 20 20 2a 28 6c 6f 6e  o(data);.  *(lon
52b0: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  g *) (function +
52c0: 31 32 29 20 3d 20 30 78 43 34 32 30 36 30 30 30  12) = 0xC4206000
52d0: 20 7c 20 6c 6f 28 76 61 72 69 61 62 6c 65 29 3b   | lo(variable);
52e0: 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75  .  *(long *) (fu
52f0: 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20 30 78  nction +16) = 0x
5300: 30 33 30 30 30 30 30 30 20 7c 20 68 69 28 61 64  03000000 | hi(ad
5310: 64 72 65 73 73 29 3b 0a 20 20 2a 28 6c 6f 6e 67  dress);.  *(long
5320: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32   *) (function +2
5330: 30 29 20 3d 20 30 78 38 31 43 30 36 30 30 30 20  0) = 0x81C06000 
5340: 7c 20 6c 6f 28 61 64 64 72 65 73 73 29 3b 0a 20  | lo(address);. 
5350: 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63   *(long *) (func
5360: 74 69 6f 6e 20 2b 32 34 29 20 3d 20 30 78 30 31  tion +24) = 0x01
5370: 30 30 30 30 30 30 3b 0a 23 64 65 66 69 6e 65 20  000000;.#define 
5380: 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 6f  is_tramp(functio
5390: 6e 29 20 20 5c 0a 20 20 28 2a 28 6c 6f 6e 67 20  n)  \.  (*(long 
53a0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30  *) (function + 0
53b0: 29 20 26 20 30 78 66 66 63 30 30 30 30 30 29 20  ) & 0xffc00000) 
53c0: 3d 3d 20 30 78 30 33 30 30 30 30 30 30 20 26 26  == 0x03000000 &&
53d0: 20 5c 0a 20 20 28 2a 28 6c 6f 6e 67 20 2a 29 20   \.  (*(long *) 
53e0: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 26  (function + 4) &
53f0: 20 30 78 66 66 63 30 30 30 30 30 29 20 3d 3d 20   0xffc00000) == 
5400: 30 78 30 35 30 30 30 30 30 30 20 26 26 20 5c 0a  0x05000000 && \.
5410: 20 20 28 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75    (*(long *) (fu
5420: 6e 63 74 69 6f 6e 20 2b 20 38 29 20 26 20 30 78  nction + 8) & 0x
5430: 66 66 66 66 66 63 30 30 29 20 3d 3d 20 30 78 38  fffffc00) == 0x8
5440: 34 31 30 41 30 30 30 20 26 26 20 5c 0a 20 20 28  410A000 && \.  (
5450: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74  *(long *) (funct
5460: 69 6f 6e 20 2b 31 32 29 20 26 20 30 78 66 66 66  ion +12) & 0xfff
5470: 66 66 63 30 30 29 20 3d 3d 20 30 78 43 34 32 30  ffc00) == 0xC420
5480: 36 30 30 30 20 26 26 20 5c 0a 20 20 28 2a 28 6c  6000 && \.  (*(l
5490: 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ong *) (function
54a0: 20 2b 31 36 29 20 26 20 30 78 66 66 63 30 30 30   +16) & 0xffc000
54b0: 30 30 29 20 3d 3d 20 30 78 30 33 30 30 30 30 30  00) == 0x0300000
54c0: 30 20 26 26 20 5c 0a 20 20 28 2a 28 6c 6f 6e 67  0 && \.  (*(long
54d0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32   *) (function +2
54e0: 30 29 20 26 20 30 78 66 66 66 66 66 63 30 30 29  0) & 0xfffffc00)
54f0: 20 3d 3d 20 30 78 38 31 43 30 36 30 30 30 20 26   == 0x81C06000 &
5500: 26 20 5c 0a 20 20 20 2a 28 6c 6f 6e 67 20 2a 29  & \.   *(long *)
5510: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 34 29 20   (function +24) 
5520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d                ==
5530: 20 30 78 30 31 30 30 30 30 30 30 0a 23 64 65 66   0x01000000.#def
5540: 69 6e 65 20 68 69 6c 6f 28 68 69 77 6f 72 64 2c  ine hilo(hiword,
5550: 6c 6f 77 6f 72 64 29 20 20 28 28 28 68 69 77 6f  loword)  (((hiwo
5560: 72 64 29 20 3c 3c 20 31 30 29 20 7c 20 28 28 6c  rd) << 10) | ((l
5570: 6f 77 6f 72 64 29 20 26 20 30 78 33 66 66 29 29  oword) & 0x3ff))
5580: 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 61  .#define tramp_a
5590: 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e 29  ddress(function)
55a0: 20 20 5c 0a 20 20 68 69 6c 6f 28 2a 28 6c 6f 6e    \.  hilo(*(lon
55b0: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  g *) (function +
55c0: 31 36 29 2c 20 2a 28 6c 6f 6e 67 20 2a 29 20 28  16), *(long *) (
55d0: 66 75 6e 63 74 69 6f 6e 20 2b 32 30 29 29 0a 23  function +20)).#
55e0: 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 76 61 72  define tramp_var
55f0: 69 61 62 6c 65 28 66 75 6e 63 74 69 6f 6e 29 20  iable(function) 
5600: 20 5c 0a 20 20 68 69 6c 6f 28 2a 28 6c 6f 6e 67   \.  hilo(*(long
5610: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20   *) (function + 
5620: 30 29 2c 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66  0), *(long *) (f
5630: 75 6e 63 74 69 6f 6e 20 2b 31 32 29 29 0a 23 64  unction +12)).#d
5640: 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61  efine tramp_data
5650: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20  (function)  \.  
5660: 68 69 6c 6f 28 2a 28 6c 6f 6e 67 20 2a 29 20 28  hilo(*(long *) (
5670: 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 2c 20 2a  function + 4), *
5680: 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69  (long *) (functi
5690: 6f 6e 20 2b 20 38 29 29 0a 23 65 6e 64 69 66 0a  on + 8)).#endif.
56a0: 23 69 66 64 65 66 20 5f 5f 73 70 61 72 63 36 34  #ifdef __sparc64
56b0: 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e  __.  /* function
56c0: 3a 0a 20 20 20 2a 20 20 20 20 72 64 20 25 70 63  :.   *    rd %pc
56d0: 2c 25 67 31 09 09 09 38 33 34 31 34 30 30 30 0a  ,%g1...83414000.
56e0: 20 20 20 2a 20 20 20 20 6c 64 78 20 5b 25 67 31     *    ldx [%g1
56f0: 2b 32 34 5d 2c 25 67 32 09 09 43 34 35 38 36 30  +24],%g2..C45860
5700: 31 38 0a 20 20 20 2a 20 20 20 20 6c 64 78 20 5b  18.   *    ldx [
5710: 25 67 31 2b 33 32 5d 2c 25 67 33 09 09 43 36 35  %g1+32],%g3..C65
5720: 38 36 30 32 30 0a 20 20 20 2a 20 20 20 20 6c 64  86020.   *    ld
5730: 78 20 5b 25 67 31 2b 34 30 5d 2c 25 67 31 09 09  x [%g1+40],%g1..
5740: 43 32 35 38 36 30 32 38 0a 20 20 20 2a 20 20 20  C2586028.   *   
5750: 20 6a 6d 70 20 25 67 31 09 09 09 09 38 31 43 30   jmp %g1....81C0
5760: 34 30 30 30 0a 20 20 20 2a 20 20 20 20 73 74 78  4000.   *    stx
5770: 20 25 67 33 2c 5b 25 67 32 5d 09 09 09 43 36 37   %g3,[%g2]...C67
5780: 30 38 30 30 30 0a 20 20 20 2a 20 20 20 20 2e 6c  08000.   *    .l
5790: 6f 6e 67 20 68 69 67 68 33 32 28 3c 76 61 72 69  ong high32(<vari
57a0: 61 62 6c 65 3e 29 09 3c 76 61 72 69 61 62 6c 65  able>).<variable
57b0: 3e 20 3e 3e 20 33 32 0a 20 20 20 2a 20 20 20 20  > >> 32.   *    
57c0: 2e 6c 6f 6e 67 20 6c 6f 77 33 32 28 3c 76 61 72  .long low32(<var
57d0: 69 61 62 6c 65 3e 29 09 09 3c 76 61 72 69 61 62  iable>)..<variab
57e0: 6c 65 3e 20 26 20 30 78 66 66 66 66 66 66 66 66  le> & 0xffffffff
57f0: 0a 20 20 20 2a 20 20 20 20 2e 6c 6f 6e 67 20 68  .   *    .long h
5800: 69 67 68 33 32 28 3c 64 61 74 61 3e 29 09 09 3c  igh32(<data>)..<
5810: 64 61 74 61 3e 20 3e 3e 20 33 32 0a 20 20 20 2a  data> >> 32.   *
5820: 20 20 20 20 2e 6c 6f 6e 67 20 6c 6f 77 33 32 28      .long low32(
5830: 3c 64 61 74 61 3e 29 09 09 3c 64 61 74 61 3e 20  <data>)..<data> 
5840: 26 20 30 78 66 66 66 66 66 66 66 66 0a 20 20 20  & 0xffffffff.   
5850: 2a 20 20 20 20 2e 6c 6f 6e 67 20 68 69 67 68 33  *    .long high3
5860: 32 28 3c 61 64 64 72 65 73 73 3e 29 09 09 3c 61  2(<address>)..<a
5870: 64 64 72 65 73 73 3e 20 3e 3e 20 33 32 0a 20 20  ddress> >> 32.  
5880: 20 2a 20 20 20 20 2e 6c 6f 6e 67 20 6c 6f 77 33   *    .long low3
5890: 32 28 3c 61 64 64 72 65 73 73 3e 29 09 09 3c 61  2(<address>)..<a
58a0: 64 64 72 65 73 73 3e 20 26 20 30 78 66 66 66 66  ddress> & 0xffff
58b0: 66 66 66 66 0a 20 20 20 2a 2f 0a 20 20 2a 28 69  ffff.   */.  *(i
58c0: 6e 74 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e  nt *)  (function
58d0: 20 2b 20 30 29 20 3d 20 30 78 38 33 34 31 34 30   + 0) = 0x834140
58e0: 30 30 3b 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20  00;.  *(int *)  
58f0: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d  (function + 4) =
5900: 20 30 78 43 34 35 38 36 30 31 38 3b 0a 20 20 2a   0xC4586018;.  *
5910: 28 69 6e 74 20 2a 29 20 20 28 66 75 6e 63 74 69  (int *)  (functi
5920: 6f 6e 20 2b 20 38 29 20 3d 20 30 78 43 36 35 38  on + 8) = 0xC658
5930: 36 30 32 30 3b 0a 20 20 2a 28 69 6e 74 20 2a 29  6020;.  *(int *)
5940: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29    (function +12)
5950: 20 3d 20 30 78 43 32 35 38 36 30 32 38 3b 0a 20   = 0xC2586028;. 
5960: 20 2a 28 69 6e 74 20 2a 29 20 20 28 66 75 6e 63   *(int *)  (func
5970: 74 69 6f 6e 20 2b 31 36 29 20 3d 20 30 78 38 31  tion +16) = 0x81
5980: 43 30 34 30 30 30 3b 0a 20 20 2a 28 69 6e 74 20  C04000;.  *(int 
5990: 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32  *)  (function +2
59a0: 30 29 20 3d 20 30 78 43 36 37 30 38 30 30 30 3b  0) = 0xC6708000;
59b0: 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75  .  *(long *) (fu
59c0: 6e 63 74 69 6f 6e 20 2b 32 34 29 20 3d 20 28 6c  nction +24) = (l
59d0: 6f 6e 67 29 20 76 61 72 69 61 62 6c 65 3b 0a 20  ong) variable;. 
59e0: 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63   *(long *) (func
59f0: 74 69 6f 6e 20 2b 33 32 29 20 3d 20 28 6c 6f 6e  tion +32) = (lon
5a00: 67 29 20 64 61 74 61 3b 0a 20 20 2a 28 6c 6f 6e  g) data;.  *(lon
5a10: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  g *) (function +
5a20: 34 30 29 20 3d 20 28 6c 6f 6e 67 29 20 61 64 64  40) = (long) add
5a30: 72 65 73 73 3b 0a 23 64 65 66 69 6e 65 20 69 73  ress;.#define is
5a40: 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29  _tramp(function)
5a50: 20 20 5c 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20    \.  *(int *)  
5a60: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d  (function + 0) =
5a70: 3d 20 30 78 38 33 34 31 34 30 30 30 20 26 26 20  = 0x83414000 && 
5a80: 5c 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 28 66  \.  *(int *)  (f
5a90: 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 3d 20  unction + 4) == 
5aa0: 30 78 43 34 35 38 36 30 31 38 20 26 26 20 5c 0a  0xC4586018 && \.
5ab0: 20 20 2a 28 69 6e 74 20 2a 29 20 20 28 66 75 6e    *(int *)  (fun
5ac0: 63 74 69 6f 6e 20 2b 20 38 29 20 3d 3d 20 30 78  ction + 8) == 0x
5ad0: 43 36 35 38 36 30 32 30 20 26 26 20 5c 0a 20 20  C6586020 && \.  
5ae0: 2a 28 69 6e 74 20 2a 29 20 20 28 66 75 6e 63 74  *(int *)  (funct
5af0: 69 6f 6e 20 2b 31 32 29 20 3d 3d 20 30 78 43 32  ion +12) == 0xC2
5b00: 35 38 36 30 32 38 20 26 26 20 5c 0a 20 20 2a 28  586028 && \.  *(
5b10: 69 6e 74 20 2a 29 20 20 28 66 75 6e 63 74 69 6f  int *)  (functio
5b20: 6e 20 2b 31 36 29 20 3d 3d 20 30 78 38 31 43 30  n +16) == 0x81C0
5b30: 34 30 30 30 20 26 26 20 5c 0a 20 20 2a 28 69 6e  4000 && \.  *(in
5b40: 74 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20  t *)  (function 
5b50: 2b 32 30 29 20 3d 3d 20 30 78 43 36 37 30 38 30  +20) == 0xC67080
5b60: 30 30 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70  00.#define tramp
5b70: 5f 61 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f  _address(functio
5b80: 6e 29 20 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a  n)  \.  *(long *
5b90: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 34 30 29  ) (function +40)
5ba0: 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 76  .#define tramp_v
5bb0: 61 72 69 61 62 6c 65 28 66 75 6e 63 74 69 6f 6e  ariable(function
5bc0: 29 20 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29  )  \.  *(long *)
5bd0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 34 29 0a   (function +24).
5be0: 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61  #define tramp_da
5bf0: 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a  ta(function)  \.
5c00: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e    *(long *) (fun
5c10: 63 74 69 6f 6e 20 2b 33 32 29 0a 23 65 6e 64 69  ction +32).#endi
5c20: 66 0a 23 69 66 64 65 66 20 5f 5f 61 6c 70 68 61  f.#ifdef __alpha
5c30: 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e  __.  /* function
5c40: 3a 0a 20 20 20 2a 20 20 20 20 62 72 20 24 31 2c  :.   *    br $1,
5c50: 66 75 6e 63 74 69 6f 6e 2e 2e 6e 67 09 30 30 20  function..ng.00 
5c60: 30 30 20 32 30 20 43 30 0a 20 20 20 2a 20 66 75  00 20 C0.   * fu
5c70: 6e 63 74 69 6f 6e 2e 2e 6e 67 3a 0a 20 20 20 2a  nction..ng:.   *
5c80: 20 20 20 20 6c 64 71 20 24 32 2c 32 30 28 24 31      ldq $2,20($1
5c90: 29 09 09 31 34 20 30 30 20 34 31 20 41 34 0a 20  )..14 00 41 A4. 
5ca0: 20 20 2a 20 20 20 20 6c 64 71 20 24 33 2c 32 38    *    ldq $3,28
5cb0: 28 24 31 29 09 09 31 43 20 30 30 20 36 31 20 41  ($1)..1C 00 61 A
5cc0: 34 0a 20 20 20 2a 20 20 20 20 6c 64 71 20 24 32  4.   *    ldq $2
5cd0: 37 2c 33 36 28 24 31 29 09 09 32 34 20 30 30 20  7,36($1)..24 00 
5ce0: 36 31 20 41 37 0a 20 20 20 2a 20 20 20 20 73 74  61 A7.   *    st
5cf0: 71 20 24 32 2c 30 28 24 33 29 09 09 30 30 20 30  q $2,0($3)..00 0
5d00: 30 20 34 33 20 42 34 0a 20 20 20 2a 20 20 20 20  0 43 B4.   *    
5d10: 6a 6d 70 20 24 33 31 2c 28 24 32 37 29 2c 30 09  jmp $31,($27),0.
5d20: 09 30 30 20 30 30 20 46 42 20 36 42 0a 20 20 20  .00 00 FB 6B.   
5d30: 2a 20 20 20 20 2e 71 75 61 64 20 3c 64 61 74 61  *    .quad <data
5d40: 3e 09 09 3c 64 61 74 61 3e 0a 20 20 20 2a 20 20  >..<data>.   *  
5d50: 20 20 2e 71 75 61 64 20 3c 76 61 72 69 61 62 6c    .quad <variabl
5d60: 65 3e 09 3c 76 61 72 69 61 62 6c 65 3e 0a 20 20  e>.<variable>.  
5d70: 20 2a 20 20 20 20 2e 71 75 61 64 20 3c 61 64 64   *    .quad <add
5d80: 72 65 73 73 3e 09 09 3c 61 64 64 72 65 73 73 3e  ress>..<address>
5d90: 0a 20 20 20 2a 2f 0a 20 20 7b 20 73 74 61 74 69  .   */.  { stati
5da0: 63 20 69 6e 74 20 63 6f 64 65 20 5b 36 5d 20 3d  c int code [6] =
5db0: 0a 20 20 20 20 20 20 7b 20 30 78 43 30 32 30 30  .      { 0xC0200
5dc0: 30 30 30 2c 20 30 78 41 34 34 31 30 30 31 34 2c  000, 0xA4410014,
5dd0: 20 30 78 41 34 36 31 30 30 31 43 2c 20 30 78 41   0xA461001C, 0xA
5de0: 37 36 31 30 30 32 34 2c 20 30 78 42 34 34 33 30  7610024, 0xB4430
5df0: 30 30 30 2c 20 30 78 36 42 46 42 30 30 30 30 20  000, 0x6BFB0000 
5e00: 7d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  };.    int i;.  
5e10: 20 20 66 6f 72 20 28 69 3d 30 3b 20 69 3c 36 3b    for (i=0; i<6;
5e20: 20 69 2b 2b 29 20 7b 20 28 28 69 6e 74 20 2a 29   i++) { ((int *)
5e30: 20 66 75 6e 63 74 69 6f 6e 29 5b 69 5d 20 3d 20   function)[i] = 
5e40: 63 6f 64 65 5b 69 5d 3b 20 7d 0a 20 20 20 20 28  code[i]; }.    (
5e50: 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f  (long *) functio
5e60: 6e 29 5b 33 5d 20 3d 20 28 6c 6f 6e 67 29 20 64  n)[3] = (long) d
5e70: 61 74 61 3b 0a 20 20 20 20 28 28 6c 6f 6e 67 20  ata;.    ((long 
5e80: 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 34 5d 20  *) function)[4] 
5e90: 3d 20 28 6c 6f 6e 67 29 20 76 61 72 69 61 62 6c  = (long) variabl
5ea0: 65 3b 0a 20 20 20 20 28 28 6c 6f 6e 67 20 2a 29  e;.    ((long *)
5eb0: 20 66 75 6e 63 74 69 6f 6e 29 5b 35 5d 20 3d 20   function)[5] = 
5ec0: 28 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 3b 0a  (long) address;.
5ed0: 20 20 7d 0a 23 64 65 66 69 6e 65 20 69 73 5f 74    }.#define is_t
5ee0: 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20 20  ramp(function)  
5ef0: 5c 0a 20 20 28 28 69 6e 74 20 2a 29 20 66 75 6e  \.  ((int *) fun
5f00: 63 74 69 6f 6e 29 5b 30 5d 20 3d 3d 20 30 78 43  ction)[0] == 0xC
5f10: 30 32 30 30 30 30 30 20 26 26 20 5c 0a 20 20 28  0200000 && \.  (
5f20: 28 69 6e 74 20 2a 29 20 66 75 6e 63 74 69 6f 6e  (int *) function
5f30: 29 5b 31 5d 20 3d 3d 20 30 78 41 34 34 31 30 30  )[1] == 0xA44100
5f40: 31 34 20 26 26 20 5c 0a 20 20 28 28 69 6e 74 20  14 && \.  ((int 
5f50: 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 32 5d 20  *) function)[2] 
5f60: 3d 3d 20 30 78 41 34 36 31 30 30 31 43 20 26 26  == 0xA461001C &&
5f70: 20 5c 0a 20 20 28 28 69 6e 74 20 2a 29 20 66 75   \.  ((int *) fu
5f80: 6e 63 74 69 6f 6e 29 5b 33 5d 20 3d 3d 20 30 78  nction)[3] == 0x
5f90: 41 37 36 31 30 30 32 34 20 26 26 20 5c 0a 20 20  A7610024 && \.  
5fa0: 28 28 69 6e 74 20 2a 29 20 66 75 6e 63 74 69 6f  ((int *) functio
5fb0: 6e 29 5b 34 5d 20 3d 3d 20 30 78 42 34 34 33 30  n)[4] == 0xB4430
5fc0: 30 30 30 20 26 26 20 5c 0a 20 20 28 28 69 6e 74  000 && \.  ((int
5fd0: 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 35 5d   *) function)[5]
5fe0: 20 3d 3d 20 30 78 36 42 46 42 30 30 30 30 0a 23   == 0x6BFB0000.#
5ff0: 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 64  define tramp_add
6000: 72 65 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 20  ress(function)  
6010: 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75  \.  ((long *) fu
6020: 6e 63 74 69 6f 6e 29 5b 35 5d 0a 23 64 65 66 69  nction)[5].#defi
6030: 6e 65 20 74 72 61 6d 70 5f 76 61 72 69 61 62 6c  ne tramp_variabl
6040: 65 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20  e(function)  \. 
6050: 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74   ((long *) funct
6060: 69 6f 6e 29 5b 34 5d 0a 23 64 65 66 69 6e 65 20  ion)[4].#define 
6070: 74 72 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 74  tramp_data(funct
6080: 69 6f 6e 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67  ion)  \.  ((long
6090: 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 33 5d   *) function)[3]
60a0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f  .#endif.#ifdef _
60b0: 5f 68 70 70 61 6f 6c 64 5f 5f 0a 20 20 2f 2a 20  _hppaold__.  /* 
60c0: 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20  function:.   *  
60d0: 20 20 6c 64 69 6c 20 4c 27 3c 64 61 74 61 3e 2c    ldil L'<data>,
60e0: 25 72 32 30 09 09 32 32 38 30 30 30 30 30 20 7c  %r20..22800000 |
60f0: 20 68 69 28 3c 64 61 74 61 3e 29 0a 20 20 20 2a   hi(<data>).   *
6100: 20 20 20 20 6c 64 69 6c 20 4c 27 3c 76 61 72 69      ldil L'<vari
6110: 61 62 6c 65 3e 2c 25 72 31 39 09 09 32 32 36 30  able>,%r19..2260
6120: 30 30 30 30 20 7c 20 68 69 28 3c 76 61 72 69 61  0000 | hi(<varia
6130: 62 6c 65 3e 29 0a 20 20 20 2a 20 20 20 20 6c 64  ble>).   *    ld
6140: 6f 20 52 27 3c 64 61 74 61 3e 28 25 72 32 30 29  o R'<data>(%r20)
6150: 2c 25 72 32 30 09 09 33 36 39 34 30 30 30 30 20  ,%r20..36940000 
6160: 7c 20 6c 6f 28 3c 64 61 74 61 3e 29 0a 20 20 20  | lo(<data>).   
6170: 2a 20 20 20 20 73 74 77 20 25 72 32 30 2c 52 27  *    stw %r20,R'
6180: 3c 76 61 72 69 61 62 6c 65 3e 28 25 72 31 39 29  <variable>(%r19)
6190: 09 36 41 37 34 30 30 30 30 20 7c 20 6c 6f 28 3c  .6A740000 | lo(<
61a0: 76 61 72 69 61 62 6c 65 3e 29 0a 20 20 20 2a 20  variable>).   * 
61b0: 20 20 20 6c 64 69 6c 20 4c 27 3c 61 64 64 72 65     ldil L'<addre
61c0: 73 73 3e 2c 25 72 32 31 09 09 32 32 41 30 30 30  ss>,%r21..22A000
61d0: 30 30 20 7c 20 68 69 28 3c 61 64 64 72 65 73 73  00 | hi(<address
61e0: 3e 29 0a 20 20 20 2a 20 20 20 20 6c 64 6f 20 52  >).   *    ldo R
61f0: 27 3c 61 64 64 72 65 73 73 3e 28 25 72 32 31 29  '<address>(%r21)
6200: 2c 25 72 32 31 09 33 36 42 35 30 30 30 30 20 7c  ,%r21.36B50000 |
6210: 20 6c 6f 28 3c 61 64 64 72 65 73 73 3e 29 0a 20   lo(<address>). 
6220: 20 20 2a 20 20 20 20 62 62 2c 3e 3d 2c 6e 20 25    *    bb,>=,n %
6230: 72 32 31 2c 33 30 2c 66 75 6e 63 74 69 6f 6e 32  r21,30,function2
6240: 09 43 37 44 35 43 30 31 32 0a 20 20 20 2a 20 20  .C7D5C012.   *  
6250: 20 20 64 65 70 69 20 30 2c 33 31 2c 32 2c 25 72    depi 0,31,2,%r
6260: 32 31 09 09 44 36 41 30 31 43 31 45 0a 20 20 20  21..D6A01C1E.   
6270: 2a 20 20 20 20 6c 64 77 20 34 28 30 2c 25 72 32  *    ldw 4(0,%r2
6280: 31 29 2c 25 72 31 39 09 09 34 41 42 33 30 30 30  1),%r19..4AB3000
6290: 38 0a 20 20 20 2a 20 20 20 20 6c 64 77 20 30 28  8.   *    ldw 0(
62a0: 30 2c 25 72 32 31 29 2c 25 72 32 31 09 09 34 41  0,%r21),%r21..4A
62b0: 42 35 30 30 30 30 0a 20 20 20 2a 20 66 75 6e 63  B50000.   * func
62c0: 74 69 6f 6e 32 3a 0a 20 20 20 2a 20 20 20 20 6c  tion2:.   *    l
62d0: 64 73 69 64 20 28 30 2c 25 72 32 31 29 2c 25 72  dsid (0,%r21),%r
62e0: 31 09 09 30 32 41 30 31 30 41 31 0a 20 20 20 2a  1..02A010A1.   *
62f0: 20 20 20 20 6d 74 73 70 20 25 72 31 2c 25 73 72      mtsp %r1,%sr
6300: 30 09 09 09 30 30 30 31 31 38 32 30 0a 20 20 20  0...00011820.   
6310: 2a 20 20 20 20 62 65 2c 6e 20 30 28 25 73 72 30  *    be,n 0(%sr0
6320: 2c 25 72 32 31 29 09 09 45 32 41 30 30 30 30 32  ,%r21)..E2A00002
6330: 0a 20 20 20 2a 20 20 20 20 6e 6f 70 09 09 09 09  .   *    nop....
6340: 30 38 30 30 30 32 34 30 0a 20 20 20 2a 2f 0a 20  08000240.   */. 
6350: 20 2f 2a 20 57 68 65 6e 20 64 65 63 6f 64 69 6e   /* When decodin
6360: 67 20 61 20 32 31 2d 62 69 74 20 61 72 67 75 6d  g a 21-bit argum
6370: 65 6e 74 20 69 6e 20 61 6e 20 69 6e 73 74 72 75  ent in an instru
6380: 63 74 69 6f 6e 2c 20 74 68 65 20 68 70 70 61 20  ction, the hppa 
6390: 70 65 72 66 6f 72 6d 73 0a 20 20 20 2a 20 74 68  performs.   * th
63a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20  e following bit 
63b0: 6d 61 6e 69 70 75 6c 61 74 69 6f 6e 3a 0a 20 20  manipulation:.  
63c0: 20 2a 20 61 73 73 65 6d 62 6c 65 32 31 3a 20 78   * assemble21: x
63d0: 5b 32 30 5d 2e 2e 2e 78 5b 30 5d 0a 20 20 20 2a  [20]...x[0].   *
63e0: 20 20 20 20 20 20 20 2d 2d 3e 20 78 5b 30 5d 20         --> x[0] 
63f0: 78 5b 31 31 5d 2e 2e 2e 78 5b 31 5d 20 78 5b 31  x[11]...x[1] x[1
6400: 35 5d 2e 2e 78 5b 31 34 5d 20 78 5b 32 30 5d 2e  5]..x[14] x[20].
6410: 2e 2e 78 5b 31 36 5d 20 78 5b 31 33 5d 2e 2e 78  ..x[16] x[13]..x
6420: 5b 31 32 5d 0a 20 20 20 2a 20 57 68 65 6e 20 65  [12].   * When e
6430: 6e 63 6f 64 69 6e 67 20 61 20 32 31 2d 62 69 74  ncoding a 21-bit
6440: 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 61   argument into a
6450: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 77  n instruction, w
6460: 65 20 6e 65 65 64 20 74 68 65 0a 20 20 20 2a 20  e need the.   * 
6470: 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65 20 72  to perform the r
6480: 65 76 65 72 73 65 20 70 65 72 6d 75 74 61 74 69  everse permutati
6490: 6f 6e 3a 0a 20 20 20 2a 20 70 65 72 6d 75 74 65  on:.   * permute
64a0: 32 31 3a 20 20 79 5b 32 30 5d 2e 2e 2e 79 5b 30  21:  y[20]...y[0
64b0: 5d 0a 20 20 20 2a 20 20 20 20 20 20 20 2d 2d 3e  ].   *       -->
64c0: 20 79 5b 36 5d 2e 2e 2e 79 5b 32 5d 20 79 5b 38   y[6]...y[2] y[8
64d0: 5d 2e 2e 79 5b 37 5d 20 79 5b 31 5d 2e 2e 79 5b  ]..y[7] y[1]..y[
64e0: 30 5d 20 79 5b 31 39 5d 2e 2e 2e 79 5b 39 5d 20  0] y[19]...y[9] 
64f0: 79 5b 32 30 5d 0a 20 20 20 2a 2f 0a 23 64 65 66  y[20].   */.#def
6500: 69 6e 65 20 61 73 73 65 6d 62 6c 65 32 31 28 78  ine assemble21(x
6510: 29 20 20 5c 0a 20 20 28 28 28 28 78 29 20 26 20  )  \.  ((((x) & 
6520: 30 78 31 29 20 3c 3c 20 32 30 29 20 7c 20 28 28  0x1) << 20) | ((
6530: 28 78 29 20 26 20 30 78 46 46 45 29 20 3c 3c 20  (x) & 0xFFE) << 
6540: 38 29 20 7c 20 5c 0a 20 20 20 28 28 28 78 29 20  8) | \.   (((x) 
6550: 26 20 30 78 43 30 30 30 29 20 3e 3e 20 37 29 20  & 0xC000) >> 7) 
6560: 7c 20 28 28 28 78 29 20 26 20 30 78 31 46 30 30  | (((x) & 0x1F00
6570: 30 30 29 20 3e 3e 20 31 34 29 20 7c 20 28 28 28  00) >> 14) | (((
6580: 78 29 20 26 20 30 78 33 30 30 30 29 20 3e 3e 20  x) & 0x3000) >> 
6590: 31 32 29 29 0a 23 64 65 66 69 6e 65 20 70 65 72  12)).#define per
65a0: 6d 75 74 65 32 31 28 79 29 20 20 5c 0a 20 20 28  mute21(y)  \.  (
65b0: 28 28 28 79 29 20 26 20 30 78 37 43 29 20 3c 3c  (((y) & 0x7C) <<
65c0: 20 31 34 29 20 7c 20 28 28 28 79 29 20 26 20 30   14) | (((y) & 0
65d0: 78 31 38 30 29 20 3c 3c 20 37 29 20 7c 20 28 28  x180) << 7) | ((
65e0: 28 79 29 20 26 20 30 78 33 29 20 3c 3c 20 31 32  (y) & 0x3) << 12
65f0: 29 20 7c 20 5c 0a 20 20 20 28 28 28 79 29 20 26  ) | \.   (((y) &
6600: 20 30 78 46 46 45 30 30 29 20 3e 3e 20 38 29 20   0xFFE00) >> 8) 
6610: 7c 20 28 28 28 79 29 20 26 20 30 78 31 30 30 30  | (((y) & 0x1000
6620: 30 30 29 20 3e 3e 20 32 30 29 29 0a 23 64 65 66  00) >> 20)).#def
6630: 69 6e 65 20 68 69 28 77 6f 72 64 29 20 20 70 65  ine hi(word)  pe
6640: 72 6d 75 74 65 32 31 28 28 75 6e 73 69 67 6e 65  rmute21((unsigne
6650: 64 20 6c 6f 6e 67 29 20 28 77 6f 72 64 29 20 3e  d long) (word) >
6660: 3e 20 31 31 29 0a 23 64 65 66 69 6e 65 20 6c 6f  > 11).#define lo
6670: 28 77 6f 72 64 29 20 20 28 28 28 75 6e 73 69 67  (word)  (((unsig
6680: 6e 65 64 20 6c 6f 6e 67 29 20 28 77 6f 72 64 29  ned long) (word)
6690: 20 26 20 30 78 37 46 46 29 20 3c 3c 20 31 29 0a   & 0x7FF) << 1).
66a0: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e    *(long *) (fun
66b0: 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20 30 78 32  ction + 0) = 0x2
66c0: 32 38 30 30 30 30 30 20 7c 20 68 69 28 64 61 74  2800000 | hi(dat
66d0: 61 29 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20  a);.  *(long *) 
66e0: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d  (function + 4) =
66f0: 20 30 78 32 32 36 30 30 30 30 30 20 7c 20 68 69   0x22600000 | hi
6700: 28 76 61 72 69 61 62 6c 65 29 3b 0a 20 20 2a 28  (variable);.  *(
6710: 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f  long *) (functio
6720: 6e 20 2b 20 38 29 20 3d 20 30 78 33 36 39 34 30  n + 8) = 0x36940
6730: 30 30 30 20 7c 20 6c 6f 28 64 61 74 61 29 3b 0a  000 | lo(data);.
6740: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e    *(long *) (fun
6750: 63 74 69 6f 6e 20 2b 31 32 29 20 3d 20 30 78 36  ction +12) = 0x6
6760: 41 37 34 30 30 30 30 20 7c 20 6c 6f 28 76 61 72  A740000 | lo(var
6770: 69 61 62 6c 65 29 3b 0a 20 20 2a 28 6c 6f 6e 67  iable);.  *(long
6780: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31   *) (function +1
6790: 36 29 20 3d 20 30 78 32 32 41 30 30 30 30 30 20  6) = 0x22A00000 
67a0: 7c 20 68 69 28 61 64 64 72 65 73 73 29 3b 0a 20  | hi(address);. 
67b0: 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63   *(long *) (func
67c0: 74 69 6f 6e 20 2b 32 30 29 20 3d 20 30 78 33 36  tion +20) = 0x36
67d0: 42 35 30 30 30 30 20 7c 20 6c 6f 28 61 64 64 72  B50000 | lo(addr
67e0: 65 73 73 29 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a  ess);.  *(long *
67f0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 34 29  ) (function +24)
6800: 20 3d 20 30 78 43 37 44 35 43 30 31 32 3b 0a 20   = 0xC7D5C012;. 
6810: 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63   *(long *) (func
6820: 74 69 6f 6e 20 2b 32 38 29 20 3d 20 30 78 44 36  tion +28) = 0xD6
6830: 41 30 31 43 31 45 3b 0a 20 20 2a 28 6c 6f 6e 67  A01C1E;.  *(long
6840: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 33   *) (function +3
6850: 32 29 20 3d 20 30 78 34 41 42 33 30 30 30 38 3b  2) = 0x4AB30008;
6860: 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75  .  *(long *) (fu
6870: 6e 63 74 69 6f 6e 20 2b 33 36 29 20 3d 20 30 78  nction +36) = 0x
6880: 34 41 42 35 30 30 30 30 3b 0a 20 20 2a 28 6c 6f  4AB50000;.  *(lo
6890: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  ng *) (function 
68a0: 2b 34 30 29 20 3d 20 30 78 30 32 41 30 31 30 41  +40) = 0x02A010A
68b0: 31 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28  1;.  *(long *) (
68c0: 66 75 6e 63 74 69 6f 6e 20 2b 34 34 29 20 3d 20  function +44) = 
68d0: 30 78 30 30 30 31 31 38 32 30 3b 0a 20 20 2a 28  0x00011820;.  *(
68e0: 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f  long *) (functio
68f0: 6e 20 2b 34 38 29 20 3d 20 30 78 45 32 41 30 30  n +48) = 0xE2A00
6900: 30 30 32 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29  002;.  *(long *)
6910: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 35 32 29 20   (function +52) 
6920: 3d 20 30 78 30 38 30 30 30 32 34 30 3b 0a 23 64  = 0x08000240;.#d
6930: 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 28 66  efine is_tramp(f
6940: 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 28  unction)  \.  ((
6950: 6c 6f 6e 67 29 20 66 75 6e 63 74 69 6f 6e 20 26  long) function &
6960: 20 33 29 20 3d 3d 20 30 20 26 26 20 5c 0a 20 20   3) == 0 && \.  
6970: 28 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63  (*(long *) (func
6980: 74 69 6f 6e 20 2b 20 30 29 20 26 20 30 78 66 66  tion + 0) & 0xff
6990: 65 30 30 30 30 30 29 20 3d 3d 20 30 78 32 32 38  e00000) == 0x228
69a0: 30 30 30 30 30 20 26 26 20 5c 0a 20 20 28 2a 28  00000 && \.  (*(
69b0: 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f  long *) (functio
69c0: 6e 20 2b 20 34 29 20 26 20 30 78 66 66 65 30 30  n + 4) & 0xffe00
69d0: 30 30 30 29 20 3d 3d 20 30 78 32 32 36 30 30 30  000) == 0x226000
69e0: 30 30 20 26 26 20 5c 0a 20 20 28 2a 28 6c 6f 6e  00 && \.  (*(lon
69f0: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  g *) (function +
6a00: 20 38 29 20 26 20 30 78 66 66 66 66 66 30 30 30   8) & 0xfffff000
6a10: 29 20 3d 3d 20 30 78 33 36 39 34 30 30 30 30 20  ) == 0x36940000 
6a20: 26 26 20 5c 0a 20 20 28 2a 28 6c 6f 6e 67 20 2a  && \.  (*(long *
6a30: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29  ) (function +12)
6a40: 20 26 20 30 78 66 66 66 66 66 30 30 30 29 20 3d   & 0xfffff000) =
6a50: 3d 20 30 78 36 41 37 34 30 30 30 30 20 26 26 20  = 0x6A740000 && 
6a60: 5c 0a 20 20 28 2a 28 6c 6f 6e 67 20 2a 29 20 28  \.  (*(long *) (
6a70: 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20 26 20  function +16) & 
6a80: 30 78 66 66 65 30 30 30 30 30 29 20 3d 3d 20 30  0xffe00000) == 0
6a90: 78 32 32 41 30 30 30 30 30 20 26 26 20 5c 0a 20  x22A00000 && \. 
6aa0: 20 28 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e   (*(long *) (fun
6ab0: 63 74 69 6f 6e 20 2b 32 30 29 20 26 20 30 78 66  ction +20) & 0xf
6ac0: 66 66 66 66 30 30 30 29 20 3d 3d 20 30 78 33 36  ffff000) == 0x36
6ad0: 42 35 30 30 30 30 20 26 26 20 5c 0a 20 20 2a 28  B50000 && \.  *(
6ae0: 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f  long *) (functio
6af0: 6e 20 2b 32 34 29 20 3d 3d 20 30 78 43 37 44 35  n +24) == 0xC7D5
6b00: 43 30 31 32 20 26 26 20 5c 0a 20 20 2a 28 6c 6f  C012 && \.  *(lo
6b10: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  ng *) (function 
6b20: 2b 32 38 29 20 3d 3d 20 30 78 44 36 41 30 31 43  +28) == 0xD6A01C
6b30: 31 45 20 26 26 20 5c 0a 20 20 2a 28 6c 6f 6e 67  1E && \.  *(long
6b40: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 33   *) (function +3
6b50: 32 29 20 3d 3d 20 30 78 34 41 42 33 30 30 30 38  2) == 0x4AB30008
6b60: 20 26 26 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a   && \.  *(long *
6b70: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 33 36 29  ) (function +36)
6b80: 20 3d 3d 20 30 78 34 41 42 35 30 30 30 30 20 26   == 0x4AB50000 &
6b90: 26 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20  & \.  *(long *) 
6ba0: 28 66 75 6e 63 74 69 6f 6e 20 2b 34 30 29 20 3d  (function +40) =
6bb0: 3d 20 30 78 30 32 41 30 31 30 41 31 20 26 26 20  = 0x02A010A1 && 
6bc0: 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66  \.  *(long *) (f
6bd0: 75 6e 63 74 69 6f 6e 20 2b 34 34 29 20 3d 3d 20  unction +44) == 
6be0: 30 78 30 30 30 31 31 38 32 30 20 26 26 20 5c 0a  0x00011820 && \.
6bf0: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e    *(long *) (fun
6c00: 63 74 69 6f 6e 20 2b 34 38 29 20 3d 3d 20 30 78  ction +48) == 0x
6c10: 45 32 41 30 30 30 30 32 20 26 26 20 5c 0a 20 20  E2A00002 && \.  
6c20: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74  *(long *) (funct
6c30: 69 6f 6e 20 2b 35 32 29 20 3d 3d 20 30 78 30 38  ion +52) == 0x08
6c40: 30 30 30 32 34 30 0a 23 64 65 66 69 6e 65 20 68  000240.#define h
6c50: 69 6c 6f 28 68 69 77 6f 72 64 2c 6c 6f 77 6f 72  ilo(hiword,lowor
6c60: 64 29 20 20 5c 0a 20 20 28 28 61 73 73 65 6d 62  d)  \.  ((assemb
6c70: 6c 65 32 31 28 28 75 6e 73 69 67 6e 65 64 20 6c  le21((unsigned l
6c80: 6f 6e 67 29 20 28 68 69 77 6f 72 64 29 29 20 3c  ong) (hiword)) <
6c90: 3c 20 31 31 29 20 7c 20 5c 0a 20 20 20 28 28 28  < 11) | \.   (((
6ca0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28  unsigned long) (
6cb0: 6c 6f 77 6f 72 64 29 20 26 20 30 78 46 46 45 29  loword) & 0xFFE)
6cc0: 20 3e 3e 20 31 29 20 5c 0a 20 20 29 0a 23 64 65   >> 1) \.  ).#de
6cd0: 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 65  fine tramp_addre
6ce0: 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a  ss(function)  \.
6cf0: 20 20 68 69 6c 6f 28 2a 28 6c 6f 6e 67 20 2a 29    hilo(*(long *)
6d00: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 2c   (function +16),
6d10: 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63   *(long *) (func
6d20: 74 69 6f 6e 20 2b 32 30 29 29 0a 23 64 65 66 69  tion +20)).#defi
6d30: 6e 65 20 74 72 61 6d 70 5f 76 61 72 69 61 62 6c  ne tramp_variabl
6d40: 65 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20  e(function)  \. 
6d50: 20 68 69 6c 6f 28 2a 28 6c 6f 6e 67 20 2a 29 20   hilo(*(long *) 
6d60: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 2c 20  (function + 4), 
6d70: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74  *(long *) (funct
6d80: 69 6f 6e 20 2b 31 32 29 29 0a 23 64 65 66 69 6e  ion +12)).#defin
6d90: 65 20 74 72 61 6d 70 5f 64 61 74 61 28 66 75 6e  e tramp_data(fun
6da0: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c 6f  ction)  \.  hilo
6db0: 28 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63  (*(long *) (func
6dc0: 74 69 6f 6e 20 2b 20 30 29 2c 20 2a 28 6c 6f 6e  tion + 0), *(lon
6dd0: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  g *) (function +
6de0: 20 38 29 29 0a 23 65 6e 64 69 66 0a 23 69 66 64   8)).#endif.#ifd
6df0: 65 66 20 5f 5f 68 70 70 61 6e 65 77 5f 5f 0a 20  ef __hppanew__. 
6e00: 20 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20   /* function:.  
6e10: 20 2a 20 20 20 20 2e 6c 6f 6e 67 20 20 20 74 72   *    .long   tr
6e20: 61 6d 70 0a 20 20 20 2a 20 20 20 20 2e 6c 6f 6e  amp.   *    .lon
6e30: 67 20 20 20 63 6c 6f 73 75 72 65 0a 20 20 20 2a  g   closure.   *
6e40: 20 63 6c 6f 73 75 72 65 3a 0a 20 20 20 2a 20 20   closure:.   *  
6e50: 20 20 2e 6c 6f 6e 67 20 20 20 3c 76 61 72 69 61    .long   <varia
6e60: 62 6c 65 3e 0a 20 20 20 2a 20 20 20 20 2e 6c 6f  ble>.   *    .lo
6e70: 6e 67 20 20 20 3c 64 61 74 61 3e 0a 20 20 20 2a  ng   <data>.   *
6e80: 20 20 20 20 2e 6c 6f 6e 67 20 20 20 3c 61 64 64      .long   <add
6e90: 72 65 73 73 3e 0a 20 20 20 2a 2f 0a 20 20 7b 20  ress>.   */.  { 
6ea0: 2f 2a 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61  /* work around a
6eb0: 20 62 75 67 20 69 6e 20 67 63 63 20 33 2e 2a 20   bug in gcc 3.* 
6ec0: 2a 2f 0a 20 20 20 20 76 6f 69 64 2a 20 74 72 61  */.    void* tra
6ed0: 6d 70 5f 61 64 64 72 65 73 73 20 3d 20 26 74 72  mp_address = &tr
6ee0: 61 6d 70 3b 0a 20 20 20 20 2a 28 6c 6f 6e 67 20  amp;.    *(long 
6ef0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30  *) (function + 0
6f00: 29 20 3d 20 28 28 6c 6f 6e 67 20 2a 29 20 28 28  ) = ((long *) ((
6f10: 63 68 61 72 2a 29 74 72 61 6d 70 5f 61 64 64 72  char*)tramp_addr
6f20: 65 73 73 2d 32 29 29 5b 30 5d 3b 0a 20 20 20 20  ess-2))[0];.    
6f30: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74  *(long *) (funct
6f40: 69 6f 6e 20 2b 20 34 29 20 3d 20 28 6c 6f 6e 67  ion + 4) = (long
6f50: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29  ) (function + 8)
6f60: 3b 0a 20 20 20 20 2a 28 6c 6f 6e 67 20 2a 29 20  ;.    *(long *) 
6f70: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d  (function + 8) =
6f80: 20 28 6c 6f 6e 67 29 20 76 61 72 69 61 62 6c 65   (long) variable
6f90: 3b 0a 20 20 20 20 2a 28 6c 6f 6e 67 20 2a 29 20  ;.    *(long *) 
6fa0: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d  (function +12) =
6fb0: 20 28 6c 6f 6e 67 29 20 64 61 74 61 3b 0a 20 20   (long) data;.  
6fc0: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e    *(long *) (fun
6fd0: 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20 28 6c 6f  ction +16) = (lo
6fe0: 6e 67 29 20 61 64 64 72 65 73 73 3b 0a 20 20 7d  ng) address;.  }
6ff0: 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d  .#define is_tram
7000: 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20  p(function)  \. 
7010: 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74   ((long *) funct
7020: 69 6f 6e 29 5b 30 5d 20 3d 3d 20 28 28 6c 6f 6e  ion)[0] == ((lon
7030: 67 20 2a 29 20 28 28 63 68 61 72 2a 29 74 72 61  g *) ((char*)tra
7040: 6d 70 5f 61 64 64 72 65 73 73 2d 32 29 29 5b 30  mp_address-2))[0
7050: 5d 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f  ].#define tramp_
7060: 61 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e  address(function
7070: 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29  )  \.  ((long *)
7080: 20 66 75 6e 63 74 69 6f 6e 29 5b 34 5d 0a 23 64   function)[4].#d
7090: 65 66 69 6e 65 20 74 72 61 6d 70 5f 76 61 72 69  efine tramp_vari
70a0: 61 62 6c 65 28 66 75 6e 63 74 69 6f 6e 29 20 20  able(function)  
70b0: 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75  \.  ((long *) fu
70c0: 6e 63 74 69 6f 6e 29 5b 32 5d 0a 23 64 65 66 69  nction)[2].#defi
70d0: 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 28 66 75  ne tramp_data(fu
70e0: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 28 6c  nction)  \.  ((l
70f0: 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29  ong *) function)
7100: 5b 33 5d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  [3].#endif.#ifde
7110: 66 20 5f 5f 61 72 6d 5f 5f 0a 20 20 2f 2a 20 66  f __arm__.  /* f
7120: 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20  unction:.   *   
7130: 20 73 74 6d 66 64 20 20 20 73 70 21 2c 7b 72 30   stmfd   sp!,{r0
7140: 7d 09 09 09 45 39 32 44 30 30 30 31 0a 20 20 20  }...E92D0001.   
7150: 2a 20 20 20 20 6c 64 72 20 20 20 20 20 72 30 2c  *    ldr     r0,
7160: 5b 70 63 2c 23 5f 64 61 74 61 2d 2e 2d 38 5d 09  [pc,#_data-.-8].
7170: 09 45 35 39 46 30 30 31 34 0a 20 20 20 2a 20 20  .E59F0014.   *  
7180: 20 20 6c 64 72 20 20 20 20 20 69 70 2c 5b 72 30    ldr     ip,[r0
7190: 2c 23 30 5d 09 09 09 45 35 39 30 43 30 30 30 0a  ,#0]...E590C000.
71a0: 20 20 20 2a 20 20 20 20 6c 64 72 20 20 20 20 20     *    ldr     
71b0: 72 30 2c 5b 70 63 2c 23 5f 76 61 72 69 61 62 6c  r0,[pc,#_variabl
71c0: 65 2d 2e 2d 38 5d 09 09 45 35 39 46 30 30 31 30  e-.-8]..E59F0010
71d0: 0a 20 20 20 2a 20 20 20 20 73 74 72 20 20 20 20  .   *    str    
71e0: 20 69 70 2c 5b 72 30 2c 23 30 5d 09 09 09 45 35   ip,[r0,#0]...E5
71f0: 38 30 43 30 30 30 0a 20 20 20 2a 20 20 20 20 6c  80C000.   *    l
7200: 64 6d 66 64 20 20 20 73 70 21 2c 7b 72 30 7d 5e  dmfd   sp!,{r0}^
7210: 09 09 09 45 38 46 44 30 30 30 31 0a 20 20 20 2a  ...E8FD0001.   *
7220: 20 20 20 20 6c 64 72 20 20 20 20 20 69 70 2c 5b      ldr     ip,[
7230: 70 63 2c 23 5f 66 75 6e 63 74 69 6f 6e 2d 2e 2d  pc,#_function-.-
7240: 38 5d 09 09 45 35 39 46 43 30 30 38 0a 20 20 20  8]..E59FC008.   
7250: 2a 20 20 20 20 6c 64 72 20 20 20 20 20 70 63 2c  *    ldr     pc,
7260: 5b 69 70 2c 23 30 5d 09 09 09 45 35 39 43 46 30  [ip,#0]...E59CF0
7270: 30 30 0a 20 20 20 2a 20 5f 64 61 74 61 3a 0a 20  00.   * _data:. 
7280: 20 20 2a 20 20 20 20 2e 77 6f 72 64 20 20 20 3c    *    .word   <
7290: 64 61 74 61 3e 09 09 09 09 3c 64 61 74 61 3e 0a  data>....<data>.
72a0: 20 20 20 2a 20 5f 76 61 72 69 61 62 6c 65 3a 0a     * _variable:.
72b0: 20 20 20 2a 20 20 20 20 2e 77 6f 72 64 20 20 20     *    .word   
72c0: 3c 76 61 72 69 61 62 6c 65 3e 09 09 09 3c 76 61  <variable>...<va
72d0: 72 69 61 62 6c 65 3e 0a 20 20 20 2a 20 5f 66 75  riable>.   * _fu
72e0: 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20  nction:.   *    
72f0: 2e 77 6f 72 64 20 20 20 3c 61 64 64 72 65 73 73  .word   <address
7300: 3e 09 09 09 3c 61 64 64 72 65 73 73 3e 0a 20 20  >...<address>.  
7310: 20 2a 2f 0a 20 20 7b 20 73 74 61 74 69 63 20 6c   */.  { static l
7320: 6f 6e 67 20 63 6f 64 65 20 5b 38 5d 20 3d 0a 20  ong code [8] =. 
7330: 20 20 20 20 20 7b 20 30 78 45 39 32 44 30 30 30       { 0xE92D000
7340: 31 2c 20 30 78 45 35 39 46 30 30 31 34 2c 20 30  1, 0xE59F0014, 0
7350: 78 45 35 39 30 43 30 30 30 2c 20 30 78 45 35 39  xE590C000, 0xE59
7360: 46 30 30 31 30 2c 0a 20 20 20 20 20 20 20 20 30  F0010,.        0
7370: 78 45 35 38 30 43 30 30 30 2c 20 30 78 45 38 46  xE580C000, 0xE8F
7380: 44 30 30 30 31 2c 20 30 78 45 35 39 46 43 30 30  D0001, 0xE59FC00
7390: 38 2c 20 30 78 45 35 39 43 46 30 30 30 0a 20 20  8, 0xE59CF000.  
73a0: 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69      };.    int i
73b0: 3b 0a 20 20 20 20 66 6f 72 20 28 69 3d 30 3b 20  ;.    for (i=0; 
73c0: 69 3c 38 3b 20 69 2b 2b 29 20 7b 20 28 28 6c 6f  i<8; i++) { ((lo
73d0: 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b  ng *) function)[
73e0: 69 5d 20 3d 20 63 6f 64 65 5b 69 5d 3b 20 7d 0a  i] = code[i]; }.
73f0: 20 20 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75      ((long *) fu
7400: 6e 63 74 69 6f 6e 29 5b 38 5d 20 3d 20 28 6c 6f  nction)[8] = (lo
7410: 6e 67 29 20 64 61 74 61 3b 0a 20 20 20 20 28 28  ng) data;.    ((
7420: 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e  long *) function
7430: 29 5b 39 5d 20 3d 20 28 6c 6f 6e 67 29 20 76 61  )[9] = (long) va
7440: 72 69 61 62 6c 65 3b 0a 20 20 20 20 28 28 6c 6f  riable;.    ((lo
7450: 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b  ng *) function)[
7460: 31 30 5d 20 3d 20 28 6c 6f 6e 67 29 20 61 64 64  10] = (long) add
7470: 72 65 73 73 3b 0a 20 20 7d 0a 23 64 65 66 69 6e  ress;.  }.#defin
7480: 65 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74  e is_tramp(funct
7490: 69 6f 6e 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67  ion)  \.  ((long
74a0: 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 30 5d   *) function)[0]
74b0: 20 3d 3d 20 30 78 45 39 32 44 30 30 30 31 20 26   == 0xE92D0001 &
74c0: 26 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 20  & \.  ((long *) 
74d0: 66 75 6e 63 74 69 6f 6e 29 5b 31 5d 20 3d 3d 20  function)[1] == 
74e0: 30 78 45 35 39 46 30 30 31 34 20 26 26 20 5c 0a  0xE59F0014 && \.
74f0: 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63    ((long *) func
7500: 74 69 6f 6e 29 5b 32 5d 20 3d 3d 20 30 78 45 35  tion)[2] == 0xE5
7510: 39 30 43 30 30 30 20 26 26 20 5c 0a 20 20 28 28  90C000 && \.  ((
7520: 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e  long *) function
7530: 29 5b 33 5d 20 3d 3d 20 30 78 45 35 39 46 30 30  )[3] == 0xE59F00
7540: 31 30 20 26 26 20 5c 0a 20 20 28 28 6c 6f 6e 67  10 && \.  ((long
7550: 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 34 5d   *) function)[4]
7560: 20 3d 3d 20 30 78 45 35 38 30 43 30 30 30 20 26   == 0xE580C000 &
7570: 26 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 20  & \.  ((long *) 
7580: 66 75 6e 63 74 69 6f 6e 29 5b 35 5d 20 3d 3d 20  function)[5] == 
7590: 30 78 45 38 46 44 30 30 30 31 20 26 26 20 5c 0a  0xE8FD0001 && \.
75a0: 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63    ((long *) func
75b0: 74 69 6f 6e 29 5b 36 5d 20 3d 3d 20 30 78 45 35  tion)[6] == 0xE5
75c0: 39 46 43 30 30 38 20 26 26 20 5c 0a 20 20 28 28  9FC008 && \.  ((
75d0: 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e  long *) function
75e0: 29 5b 37 5d 20 3d 3d 20 30 78 45 35 39 43 46 30  )[7] == 0xE59CF0
75f0: 30 30 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70  00.#define tramp
7600: 5f 61 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f  _address(functio
7610: 6e 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a  n)  \.  ((long *
7620: 29 20 66 75 6e 63 74 69 6f 6e 29 5b 31 30 5d 0a  ) function)[10].
7630: 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 76 61  #define tramp_va
7640: 72 69 61 62 6c 65 28 66 75 6e 63 74 69 6f 6e 29  riable(function)
7650: 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 20    \.  ((long *) 
7660: 66 75 6e 63 74 69 6f 6e 29 5b 39 5d 0a 23 64 65  function)[9].#de
7670: 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 28  fine tramp_data(
7680: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28  function)  \.  (
7690: 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f  (long *) functio
76a0: 6e 29 5b 38 5d 0a 23 65 6e 64 69 66 0a 23 69 66  n)[8].#endif.#if
76b0: 64 65 66 20 5f 5f 72 73 36 30 30 30 73 79 73 76  def __rs6000sysv
76c0: 34 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f  4__.  /* functio
76d0: 6e 3a 0a 20 20 20 2a 20 20 20 20 7b 6c 69 75 7c  n:.   *    {liu|
76e0: 6c 69 73 7d 20 31 31 2c 68 69 31 36 28 3c 76 61  lis} 11,hi16(<va
76f0: 72 69 61 62 6c 65 3e 29 09 09 33 44 20 36 30 20  riable>)..3D 60 
7700: 68 69 31 36 28 3c 76 61 72 69 61 62 6c 65 3e 29  hi16(<variable>)
7710: 0a 20 20 20 2a 20 20 20 20 7b 6f 72 69 6c 7c 6f  .   *    {oril|o
7720: 72 69 7d 20 31 31 2c 31 31 2c 6c 6f 31 36 28 3c  ri} 11,11,lo16(<
7730: 76 61 72 69 61 62 6c 65 3e 29 09 36 31 20 36 42  variable>).61 6B
7740: 20 6c 6f 31 36 28 3c 76 61 72 69 61 62 6c 65 3e   lo16(<variable>
7750: 29 0a 20 20 20 2a 20 20 20 20 7b 6c 69 75 7c 6c  ).   *    {liu|l
7760: 69 73 7d 20 31 32 2c 68 69 31 36 28 3c 64 61 74  is} 12,hi16(<dat
7770: 61 3e 29 09 09 33 44 20 38 30 20 68 69 31 36 28  a>)..3D 80 hi16(
7780: 3c 64 61 74 61 3e 29 0a 20 20 20 2a 20 20 20 20  <data>).   *    
7790: 7b 6f 72 69 6c 7c 6f 72 69 7d 20 31 32 2c 31 32  {oril|ori} 12,12
77a0: 2c 6c 6f 31 36 28 3c 64 61 74 61 3e 29 09 09 36  ,lo16(<data>)..6
77b0: 31 20 38 43 20 6c 6f 31 36 28 3c 64 61 74 61 3e  1 8C lo16(<data>
77c0: 29 0a 20 20 20 2a 20 20 20 20 7b 73 74 7c 73 74  ).   *    {st|st
77d0: 77 7d 20 31 32 2c 30 28 31 31 29 09 09 09 39 31  w} 12,0(11)...91
77e0: 20 38 42 20 30 30 20 30 30 0a 20 20 20 2a 20 20   8B 00 00.   *  
77f0: 20 20 7b 6c 69 75 7c 6c 69 73 7d 20 30 2c 68 69    {liu|lis} 0,hi
7800: 31 36 28 3c 61 64 64 72 65 73 73 3e 29 09 09 33  16(<address>)..3
7810: 43 20 30 30 20 68 69 31 36 28 3c 61 64 64 72 65  C 00 hi16(<addre
7820: 73 73 3e 29 0a 20 20 20 2a 20 20 20 20 7b 6f 72  ss>).   *    {or
7830: 69 6c 7c 6f 72 69 7d 20 30 2c 30 2c 6c 6f 31 36  il|ori} 0,0,lo16
7840: 28 3c 61 64 64 72 65 73 73 3e 29 09 09 36 30 20  (<address>)..60 
7850: 30 30 20 6c 6f 31 36 28 3c 61 64 64 72 65 73 73  00 lo16(<address
7860: 3e 29 0a 20 20 20 2a 20 20 20 20 6d 74 63 74 72  >).   *    mtctr
7870: 20 30 09 09 09 09 09 37 43 20 30 39 20 30 33 20   0.....7C 09 03 
7880: 41 36 0a 20 20 20 2a 20 20 20 20 62 63 74 72 09  A6.   *    bctr.
7890: 09 09 09 09 34 45 20 38 30 20 30 34 20 32 30 0a  ....4E 80 04 20.
78a0: 20 20 20 2a 2f 0a 20 20 2a 28 73 68 6f 72 74 20     */.  *(short 
78b0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30  *) (function + 0
78c0: 29 20 3d 20 30 78 33 44 36 30 3b 0a 20 20 2a 28  ) = 0x3D60;.  *(
78d0: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
78e0: 6f 6e 20 2b 20 32 29 20 3d 20 28 75 6e 73 69 67  on + 2) = (unsig
78f0: 6e 65 64 20 6c 6f 6e 67 29 20 76 61 72 69 61 62  ned long) variab
7900: 6c 65 20 3e 3e 20 31 36 3b 0a 20 20 2a 28 73 68  le >> 16;.  *(sh
7910: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ort *) (function
7920: 20 2b 20 34 29 20 3d 20 30 78 36 31 36 42 3b 0a   + 4) = 0x616B;.
7930: 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75    *(short *) (fu
7940: 6e 63 74 69 6f 6e 20 2b 20 36 29 20 3d 20 28 75  nction + 6) = (u
7950: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 76 61  nsigned long) va
7960: 72 69 61 62 6c 65 20 26 20 30 78 66 66 66 66 3b  riable & 0xffff;
7970: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66  .  *(short *) (f
7980: 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 30  unction + 8) = 0
7990: 78 33 44 38 30 3b 0a 20 20 2a 28 73 68 6f 72 74  x3D80;.  *(short
79a0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31   *) (function +1
79b0: 30 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c  0) = (unsigned l
79c0: 6f 6e 67 29 20 64 61 74 61 20 3e 3e 20 31 36 3b  ong) data >> 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 31 32 29 20 3d 20 30  unction +12) = 0
79f0: 78 36 31 38 43 3b 0a 20 20 2a 28 73 68 6f 72 74  x618C;.  *(short
7a00: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31   *) (function +1
7a10: 34 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c  4) = (unsigned l
7a20: 6f 6e 67 29 20 64 61 74 61 20 26 20 30 78 66 66  ong) data & 0xff
7a30: 66 66 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20  ff;.  *(long *) 
7a40: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20   (function +16) 
7a50: 3d 20 30 78 39 31 38 42 30 30 30 30 3b 0a 20 20  = 0x918B0000;.  
7a60: 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63  *(short *) (func
7a70: 74 69 6f 6e 20 2b 32 30 29 20 3d 20 30 78 33 43  tion +20) = 0x3C
7a80: 30 30 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29  00;.  *(short *)
7a90: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 32 29 20   (function +22) 
7aa0: 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  = (unsigned long
7ab0: 29 20 61 64 64 72 65 73 73 20 3e 3e 20 31 36 3b  ) address >> 16;
7ac0: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66  .  *(short *) (f
7ad0: 75 6e 63 74 69 6f 6e 20 2b 32 34 29 20 3d 20 30  unction +24) = 0
7ae0: 78 36 30 30 30 3b 0a 20 20 2a 28 73 68 6f 72 74  x6000;.  *(short
7af0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32   *) (function +2
7b00: 36 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c  6) = (unsigned l
7b10: 6f 6e 67 29 20 61 64 64 72 65 73 73 20 26 20 30  ong) address & 0
7b20: 78 66 66 66 66 3b 0a 20 20 2a 28 6c 6f 6e 67 20  xffff;.  *(long 
7b30: 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32  *)  (function +2
7b40: 38 29 20 3d 20 30 78 37 43 30 39 30 33 41 36 3b  8) = 0x7C0903A6;
7b50: 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66  .  *(long *)  (f
7b60: 75 6e 63 74 69 6f 6e 20 2b 33 32 29 20 3d 20 30  unction +32) = 0
7b70: 78 34 45 38 30 30 34 32 30 3b 0a 23 64 65 66 69  x4E800420;.#defi
7b80: 6e 65 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63  ne is_tramp(func
7b90: 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e 73  tion)  \.  *(uns
7ba0: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28  igned short *) (
7bb0: 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 3d  function + 0) ==
7bc0: 20 30 78 33 44 36 30 20 26 26 20 5c 0a 20 20 2a   0x3D60 && \.  *
7bd0: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20  (unsigned short 
7be0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34  *) (function + 4
7bf0: 29 20 3d 3d 20 30 78 36 31 36 42 20 26 26 20 5c  ) == 0x616B && \
7c00: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68  .  *(unsigned sh
7c10: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ort *) (function
7c20: 20 2b 20 38 29 20 3d 3d 20 30 78 33 44 38 30 20   + 8) == 0x3D80 
7c30: 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65  && \.  *(unsigne
7c40: 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63  d short *) (func
7c50: 74 69 6f 6e 20 2b 31 32 29 20 3d 3d 20 30 78 36  tion +12) == 0x6
7c60: 31 38 43 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73  18C && \.  *(uns
7c70: 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 29 20 20 28  igned long *)  (
7c80: 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 3d  function +16) ==
7c90: 20 30 78 39 31 38 42 30 30 30 30 20 26 26 20 5c   0x918B0000 && \
7ca0: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68  .  *(unsigned sh
7cb0: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ort *) (function
7cc0: 20 2b 32 30 29 20 3d 3d 20 30 78 33 43 30 30 20   +20) == 0x3C00 
7cd0: 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65  && \.  *(unsigne
7ce0: 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63  d short *) (func
7cf0: 74 69 6f 6e 20 2b 32 34 29 20 3d 3d 20 30 78 36  tion +24) == 0x6
7d00: 30 30 30 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73  000 && \.  *(uns
7d10: 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 29 20 20 28  igned long *)  (
7d20: 66 75 6e 63 74 69 6f 6e 20 2b 32 38 29 20 3d 3d  function +28) ==
7d30: 20 30 78 37 43 30 39 30 33 41 36 20 26 26 20 5c   0x7C0903A6 && \
7d40: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .  *(unsigned lo
7d50: 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e  ng *)  (function
7d60: 20 2b 33 32 29 20 3d 3d 20 30 78 34 45 38 30 30   +32) == 0x4E800
7d70: 34 32 30 0a 23 64 65 66 69 6e 65 20 68 69 6c 6f  420.#define hilo
7d80: 28 68 69 77 6f 72 64 2c 6c 6f 77 6f 72 64 29 20  (hiword,loword) 
7d90: 20 5c 0a 20 20 28 28 28 75 6e 73 69 67 6e 65 64   \.  (((unsigned
7da0: 20 6c 6f 6e 67 29 20 28 68 69 77 6f 72 64 29 20   long) (hiword) 
7db0: 3c 3c 20 31 36 29 20 7c 20 28 75 6e 73 69 67 6e  << 16) | (unsign
7dc0: 65 64 20 6c 6f 6e 67 29 20 28 6c 6f 77 6f 72 64  ed long) (loword
7dd0: 29 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70  )).#define tramp
7de0: 5f 61 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f  _address(functio
7df0: 6e 29 20 20 5c 0a 20 20 68 69 6c 6f 28 2a 28 75  n)  \.  hilo(*(u
7e00: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29  nsigned short *)
7e10: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 32 29 2c   (function +22),
7e20: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72   *(unsigned shor
7e30: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
7e40: 32 36 29 29 0a 23 64 65 66 69 6e 65 20 74 72 61  26)).#define tra
7e50: 6d 70 5f 76 61 72 69 61 62 6c 65 28 66 75 6e 63  mp_variable(func
7e60: 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c 6f 28  tion)  \.  hilo(
7e70: 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74  *(unsigned short
7e80: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20   *) (function + 
7e90: 32 29 2c 20 2a 28 75 6e 73 69 67 6e 65 64 20 73  2), *(unsigned s
7ea0: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
7eb0: 6e 20 2b 20 36 29 29 0a 23 64 65 66 69 6e 65 20  n + 6)).#define 
7ec0: 74 72 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 74  tramp_data(funct
7ed0: 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c 6f 28 2a  ion)  \.  hilo(*
7ee0: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20  (unsigned short 
7ef0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 30  *) (function +10
7f00: 29 2c 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68  ), *(unsigned sh
7f10: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ort *) (function
7f20: 20 2b 31 34 29 29 0a 23 65 6e 64 69 66 0a 23 69   +14)).#endif.#i
7f30: 66 64 65 66 20 5f 5f 72 73 36 30 30 30 61 69 78  fdef __rs6000aix
7f40: 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e  __.  /* function
7f50: 3a 0a 20 20 20 2a 20 20 20 20 2e 6c 6f 6e 67 20  :.   *    .long 
7f60: 2e 74 72 61 6d 70 0a 20 20 20 2a 20 20 20 20 2e  .tramp.   *    .
7f70: 6c 6f 6e 67 20 2e 6d 79 74 6f 63 0a 20 20 20 2a  long .mytoc.   *
7f80: 20 20 20 20 2e 6c 6f 6e 67 20 30 0a 20 20 20 2a      .long 0.   *
7f90: 20 2e 6d 79 74 6f 63 3a 0a 20 20 20 2a 20 20 20   .mytoc:.   *   
7fa0: 20 2e 6c 6f 6e 67 20 3c 76 61 72 69 61 62 6c 65   .long <variable
7fb0: 3e 0a 20 20 20 2a 20 20 20 20 2e 6c 6f 6e 67 20  >.   *    .long 
7fc0: 3c 64 61 74 61 3e 0a 20 20 20 2a 20 20 20 20 2e  <data>.   *    .
7fd0: 6c 6f 6e 67 20 3c 61 64 64 72 65 73 73 3e 0a 20  long <address>. 
7fe0: 20 20 2a 2f 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29    */.  *(long *)
7ff0: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29    (function + 0)
8000: 20 3d 20 28 28 6c 6f 6e 67 20 2a 29 20 26 74 72   = ((long *) &tr
8010: 61 6d 70 29 5b 30 5d 3b 0a 20 20 2a 28 6c 6f 6e  amp)[0];.  *(lon
8020: 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20  g *)  (function 
8030: 2b 20 34 29 20 3d 20 28 6c 6f 6e 67 29 20 28 66  + 4) = (long) (f
8040: 75 6e 63 74 69 6f 6e 20 2b 20 31 32 29 3b 0a 20  unction + 12);. 
8050: 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e   *(long *)  (fun
8060: 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 30 3b 0a  ction + 8) = 0;.
8070: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75    *(long *)  (fu
8080: 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d 20 28 6c  nction +12) = (l
8090: 6f 6e 67 29 20 76 61 72 69 61 62 6c 65 3b 0a 20  ong) variable;. 
80a0: 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e   *(long *)  (fun
80b0: 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20 28 6c 6f  ction +16) = (lo
80c0: 6e 67 29 20 64 61 74 61 3b 0a 20 20 2a 28 6c 6f  ng) data;.  *(lo
80d0: 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e  ng *)  (function
80e0: 20 2b 32 30 29 20 3d 20 28 6c 6f 6e 67 29 20 61   +20) = (long) a
80f0: 64 64 72 65 73 73 3b 0a 23 64 65 66 69 6e 65 20  ddress;.#define 
8100: 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 6f  is_tramp(functio
8110: 6e 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a  n)  \.  ((long *
8120: 29 20 66 75 6e 63 74 69 6f 6e 29 5b 30 5d 20 3d  ) function)[0] =
8130: 3d 20 28 28 6c 6f 6e 67 20 2a 29 20 26 74 72 61  = ((long *) &tra
8140: 6d 70 29 5b 30 5d 0a 23 64 65 66 69 6e 65 20 74  mp)[0].#define t
8150: 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75 6e  ramp_address(fun
8160: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 28 6c 6f  ction)  \.  ((lo
8170: 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b  ng *) function)[
8180: 35 5d 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70  5].#define tramp
8190: 5f 76 61 72 69 61 62 6c 65 28 66 75 6e 63 74 69  _variable(functi
81a0: 6f 6e 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20  on)  \.  ((long 
81b0: 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 33 5d 0a  *) function)[3].
81c0: 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61  #define tramp_da
81d0: 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a  ta(function)  \.
81e0: 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63    ((long *) func
81f0: 74 69 6f 6e 29 5b 34 5d 0a 23 65 6e 64 69 66 0a  tion)[4].#endif.
8200: 23 69 66 64 65 66 20 5f 5f 6d 38 38 6b 5f 5f 0a  #ifdef __m88k__.
8210: 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20    /* function:. 
8220: 20 20 2a 20 20 20 20 6f 72 2e 75 20 20 20 20 23    *    or.u    #
8230: 72 31 33 2c 23 72 30 2c 68 69 31 36 28 3c 76 61  r13,#r0,hi16(<va
8240: 72 69 61 62 6c 65 3e 29 09 35 44 20 41 30 20 68  riable>).5D A0 h
8250: 69 31 36 28 3c 76 61 72 69 61 62 6c 65 3e 29 0a  i16(<variable>).
8260: 20 20 20 2a 20 20 20 20 6f 72 20 20 20 20 20 20     *    or      
8270: 23 72 31 33 2c 23 72 31 33 2c 6c 6f 31 36 28 3c  #r13,#r13,lo16(<
8280: 76 61 72 69 61 62 6c 65 3e 29 09 35 39 20 41 44  variable>).59 AD
8290: 20 6c 6f 31 36 28 3c 76 61 72 69 61 62 6c 65 3e   lo16(<variable>
82a0: 29 0a 20 20 20 2a 20 20 20 20 6f 72 2e 75 20 20  ).   *    or.u  
82b0: 20 20 23 72 31 30 2c 23 72 30 2c 68 69 31 36 28    #r10,#r0,hi16(
82c0: 3c 64 61 74 61 3e 29 09 09 35 44 20 34 30 20 68  <data>)..5D 40 h
82d0: 69 31 36 28 3c 64 61 74 61 3e 29 0a 20 20 20 2a  i16(<data>).   *
82e0: 20 20 20 20 6f 72 20 20 20 20 20 20 23 72 31 30      or      #r10
82f0: 2c 23 72 31 30 2c 6c 6f 31 36 28 3c 64 61 74 61  ,#r10,lo16(<data
8300: 3e 29 09 09 35 39 20 34 41 20 6c 6f 31 36 28 3c  >)..59 4A lo16(<
8310: 64 61 74 61 3e 29 0a 20 20 20 2a 20 20 20 20 73  data>).   *    s
8320: 74 20 20 20 20 20 20 23 72 31 30 2c 23 72 30 2c  t      #r10,#r0,
8330: 23 72 31 33 09 09 09 46 35 20 34 30 20 32 34 20  #r13...F5 40 24 
8340: 30 44 0a 20 20 20 2a 20 20 20 20 6f 72 2e 75 20  0D.   *    or.u 
8350: 20 20 20 23 72 31 33 2c 23 72 30 2c 68 69 31 36     #r13,#r0,hi16
8360: 28 3c 61 64 64 72 65 73 73 3e 29 09 35 44 20 41  (<address>).5D A
8370: 30 20 68 69 31 36 28 3c 61 64 64 72 65 73 73 3e  0 hi16(<address>
8380: 29 0a 20 20 20 2a 20 20 20 20 6f 72 20 20 20 20  ).   *    or    
8390: 20 20 23 72 31 33 2c 23 72 31 33 2c 6c 6f 31 36    #r13,#r13,lo16
83a0: 28 3c 61 64 64 72 65 73 73 3e 29 09 35 39 20 41  (<address>).59 A
83b0: 44 20 6c 6f 31 36 28 3c 61 64 64 72 65 73 73 3e  D lo16(<address>
83c0: 29 0a 20 20 20 2a 20 20 20 20 6a 6d 70 20 20 20  ).   *    jmp   
83d0: 20 20 23 72 31 33 09 09 09 09 46 34 20 30 30 20    #r13....F4 00 
83e0: 43 30 20 30 44 0a 20 20 20 2a 2f 0a 20 20 2a 28  C0 0D.   */.  *(
83f0: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
8400: 6f 6e 20 2b 20 30 29 20 3d 20 30 78 35 44 41 30  on + 0) = 0x5DA0
8410: 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28  ;.  *(short *) (
8420: 66 75 6e 63 74 69 6f 6e 20 2b 20 32 29 20 3d 20  function + 2) = 
8430: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
8440: 76 61 72 69 61 62 6c 65 20 3e 3e 20 31 36 3b 0a  variable >> 16;.
8450: 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75    *(short *) (fu
8460: 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 20 30 78  nction + 4) = 0x
8470: 35 39 41 44 3b 0a 20 20 2a 28 73 68 6f 72 74 20  59AD;.  *(short 
8480: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 36  *) (function + 6
8490: 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ) = (unsigned lo
84a0: 6e 67 29 20 76 61 72 69 61 62 6c 65 20 26 20 30  ng) variable & 0
84b0: 78 66 66 66 66 3b 0a 20 20 2a 28 73 68 6f 72 74  xffff;.  *(short
84c0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20   *) (function + 
84d0: 38 29 20 3d 20 30 78 35 44 34 30 3b 0a 20 20 2a  8) = 0x5D40;.  *
84e0: 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74  (short *) (funct
84f0: 69 6f 6e 20 2b 31 30 29 20 3d 20 28 75 6e 73 69  ion +10) = (unsi
8500: 67 6e 65 64 20 6c 6f 6e 67 29 20 64 61 74 61 20  gned long) data 
8510: 3e 3e 20 31 36 3b 0a 20 20 2a 28 73 68 6f 72 74  >> 16;.  *(short
8520: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31   *) (function +1
8530: 32 29 20 3d 20 30 78 35 39 34 41 3b 0a 20 20 2a  2) = 0x594A;.  *
8540: 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74  (short *) (funct
8550: 69 6f 6e 20 2b 31 34 29 20 3d 20 28 75 6e 73 69  ion +14) = (unsi
8560: 67 6e 65 64 20 6c 6f 6e 67 29 20 64 61 74 61 20  gned long) data 
8570: 26 20 30 78 66 66 66 66 3b 0a 20 20 2a 28 6c 6f  & 0xffff;.  *(lo
8580: 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e  ng *)  (function
8590: 20 2b 31 36 29 20 3d 20 30 78 46 35 34 30 32 34   +16) = 0xF54024
85a0: 30 44 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29  0D;.  *(short *)
85b0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 30 29 20   (function +20) 
85c0: 3d 20 30 78 35 44 41 30 3b 0a 20 20 2a 28 73 68  = 0x5DA0;.  *(sh
85d0: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ort *) (function
85e0: 20 2b 32 32 29 20 3d 20 28 75 6e 73 69 67 6e 65   +22) = (unsigne
85f0: 64 20 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 20  d long) address 
8600: 3e 3e 20 31 36 3b 0a 20 20 2a 28 73 68 6f 72 74  >> 16;.  *(short
8610: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32   *) (function +2
8620: 34 29 20 3d 20 30 78 35 39 41 44 3b 0a 20 20 2a  4) = 0x59AD;.  *
8630: 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74  (short *) (funct
8640: 69 6f 6e 20 2b 32 36 29 20 3d 20 28 75 6e 73 69  ion +26) = (unsi
8650: 67 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64 72 65  gned long) addre
8660: 73 73 20 26 20 30 78 66 66 66 66 3b 0a 20 20 2a  ss & 0xffff;.  *
8670: 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74  (long *)  (funct
8680: 69 6f 6e 20 2b 32 38 29 20 3d 20 30 78 46 34 30  ion +28) = 0xF40
8690: 30 43 30 30 44 3b 0a 23 64 65 66 69 6e 65 20 69  0C00D;.#define i
86a0: 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e  s_tramp(function
86b0: 29 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65  )  \.  *(unsigne
86c0: 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63  d short *) (func
86d0: 74 69 6f 6e 20 2b 20 30 29 20 3d 3d 20 30 78 35  tion + 0) == 0x5
86e0: 44 41 30 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73  DA0 && \.  *(uns
86f0: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28  igned short *) (
8700: 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 3d  function + 4) ==
8710: 20 30 78 35 39 41 44 20 26 26 20 5c 0a 20 20 2a   0x59AD && \.  *
8720: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20  (unsigned short 
8730: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38  *) (function + 8
8740: 29 20 3d 3d 20 30 78 35 44 34 30 20 26 26 20 5c  ) == 0x5D40 && \
8750: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68  .  *(unsigned sh
8760: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ort *) (function
8770: 20 2b 31 32 29 20 3d 3d 20 30 78 35 39 34 41 20   +12) == 0x594A 
8780: 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65  && \.  *(unsigne
8790: 64 20 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63  d long *)  (func
87a0: 74 69 6f 6e 20 2b 31 36 29 20 3d 3d 20 30 78 46  tion +16) == 0xF
87b0: 35 34 30 32 34 30 44 20 26 26 20 5c 0a 20 20 2a  540240D && \.  *
87c0: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20  (unsigned short 
87d0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 30  *) (function +20
87e0: 29 20 3d 3d 20 30 78 35 44 41 30 20 26 26 20 5c  ) == 0x5DA0 && \
87f0: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68  .  *(unsigned sh
8800: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ort *) (function
8810: 20 2b 32 34 29 20 3d 3d 20 30 78 35 39 41 44 20   +24) == 0x59AD 
8820: 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65  && \.  *(unsigne
8830: 64 20 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63  d long *)  (func
8840: 74 69 6f 6e 20 2b 32 38 29 20 3d 3d 20 30 78 46  tion +28) == 0xF
8850: 34 30 30 43 30 30 44 0a 23 64 65 66 69 6e 65 20  400C00D.#define 
8860: 68 69 6c 6f 28 68 69 77 6f 72 64 2c 6c 6f 77 6f  hilo(hiword,lowo
8870: 72 64 29 20 20 5c 0a 20 20 28 28 28 75 6e 73 69  rd)  \.  (((unsi
8880: 67 6e 65 64 20 6c 6f 6e 67 29 20 28 68 69 77 6f  gned long) (hiwo
8890: 72 64 29 20 3c 3c 20 31 36 29 20 7c 20 28 75 6e  rd) << 16) | (un
88a0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 6c 6f  signed long) (lo
88b0: 77 6f 72 64 29 29 0a 23 64 65 66 69 6e 65 20 74  word)).#define t
88c0: 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75 6e  ramp_address(fun
88d0: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c 6f  ction)  \.  hilo
88e0: 28 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72  (*(unsigned shor
88f0: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
8900: 32 32 29 2c 20 2a 28 75 6e 73 69 67 6e 65 64 20  22), *(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 32 36 29 29 0a 23 64 65 66 69 6e 65  on +26)).#define
8930: 20 74 72 61 6d 70 5f 76 61 72 69 61 62 6c 65 28   tramp_variable(
8940: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68  function)  \.  h
8950: 69 6c 6f 28 2a 28 75 6e 73 69 67 6e 65 64 20 73  ilo(*(unsigned s
8960: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
8970: 6e 20 2b 20 32 29 2c 20 2a 28 75 6e 73 69 67 6e  n + 2), *(unsign
8980: 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e  ed short *) (fun
8990: 63 74 69 6f 6e 20 2b 20 36 29 29 0a 23 64 65 66  ction + 6)).#def
89a0: 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 28 66  ine tramp_data(f
89b0: 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69  unction)  \.  hi
89c0: 6c 6f 28 2a 28 75 6e 73 69 67 6e 65 64 20 73 68  lo(*(unsigned sh
89d0: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ort *) (function
89e0: 20 2b 31 30 29 2c 20 2a 28 75 6e 73 69 67 6e 65   +10), *(unsigne
89f0: 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63  d short *) (func
8a00: 74 69 6f 6e 20 2b 31 34 29 29 0a 23 65 6e 64 69  tion +14)).#endi
8a10: 66 0a 23 69 66 64 65 66 20 5f 5f 63 6f 6e 76 65  f.#ifdef __conve
8a20: 78 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f  x__.  /* functio
8a30: 6e 3a 0a 20 20 20 2a 20 20 20 20 6c 64 2e 77 20  n:.   *    ld.w 
8a40: 23 3c 64 61 74 61 3e 2c 73 31 09 09 09 09 31 31  #<data>,s1....11
8a50: 43 39 20 3c 64 61 74 61 3e 0a 20 20 20 2a 20 20  C9 <data>.   *  
8a60: 20 20 73 74 2e 77 20 73 31 2c 3c 76 61 72 69 61    st.w s1,<varia
8a70: 62 6c 65 3e 09 09 09 33 36 34 31 20 3c 76 61 72  ble>...3641 <var
8a80: 69 61 62 6c 65 3e 0a 20 20 20 2a 20 20 20 20 6a  iable>.   *    j
8a90: 6d 70 20 3c 61 64 64 72 65 73 73 3e 09 09 09 09  mp <address>....
8aa0: 30 31 34 30 20 3c 61 64 64 72 65 73 73 3e 0a 20  0140 <address>. 
8ab0: 20 20 2a 20 20 20 20 64 73 2e 68 20 30 09 09 09    *    ds.h 0...
8ac0: 09 09 30 30 30 30 0a 20 20 20 2a 2f 0a 20 20 2a  ..0000.   */.  *
8ad0: 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74  (short *) (funct
8ae0: 69 6f 6e 20 2b 20 30 29 20 3d 20 30 78 31 31 43  ion + 0) = 0x11C
8af0: 39 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20  9;.  *(long *)  
8b00: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 32 29 20 3d  (function + 2) =
8b10: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
8b20: 20 64 61 74 61 3b 0a 20 20 2a 28 73 68 6f 72 74   data;.  *(short
8b30: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20   *) (function + 
8b40: 36 29 20 3d 20 30 78 33 36 34 31 3b 0a 20 20 2a  6) = 0x3641;.  *
8b50: 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74  (long *)  (funct
8b60: 69 6f 6e 20 2b 20 38 29 20 3d 20 28 75 6e 73 69  ion + 8) = (unsi
8b70: 67 6e 65 64 20 6c 6f 6e 67 29 20 76 61 72 69 61  gned long) varia
8b80: 62 6c 65 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a  ble;.  *(short *
8b90: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29  ) (function +12)
8ba0: 20 3d 20 30 78 30 31 34 30 3b 0a 20 20 2a 28 6c   = 0x0140;.  *(l
8bb0: 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f  ong *)  (functio
8bc0: 6e 20 2b 31 34 29 20 3d 20 28 75 6e 73 69 67 6e  n +14) = (unsign
8bd0: 65 64 20 6c 6f 6e 67 29 20 61 64 64 72 65 73 73  ed long) address
8be0: 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28  ;.  *(short *) (
8bf0: 66 75 6e 63 74 69 6f 6e 20 2b 31 38 29 20 3d 20  function +18) = 
8c00: 30 78 30 30 30 30 3b 0a 23 64 65 66 69 6e 65 20  0x0000;.#define 
8c10: 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 6f  is_tramp(functio
8c20: 6e 29 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e  n)  \.  *(unsign
8c30: 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e  ed short *) (fun
8c40: 63 74 69 6f 6e 20 2b 20 30 29 20 3d 3d 20 30 78  ction + 0) == 0x
8c50: 31 31 43 39 20 26 26 20 5c 0a 20 20 2a 28 75 6e  11C9 && \.  *(un
8c60: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20  signed short *) 
8c70: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 36 29 20 3d  (function + 6) =
8c80: 3d 20 30 78 33 36 34 31 20 26 26 20 5c 0a 20 20  = 0x3641 && \.  
8c90: 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74  *(unsigned short
8ca0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31   *) (function +1
8cb0: 32 29 20 3d 3d 20 30 78 30 31 34 30 20 26 26 20  2) == 0x0140 && 
8cc0: 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73  \.  *(unsigned s
8cd0: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
8ce0: 6e 20 2b 31 38 29 20 3d 3d 20 30 78 30 30 30 30  n +18) == 0x0000
8cf0: 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 61  .#define tramp_a
8d00: 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e 29  ddress(function)
8d10: 20 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20    \.  *(long *) 
8d20: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 34 29 0a   (function +14).
8d30: 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 76 61  #define tramp_va
8d40: 72 69 61 62 6c 65 28 66 75 6e 63 74 69 6f 6e 29  riable(function)
8d50: 20 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20    \.  *(long *) 
8d60: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 0a   (function + 8).
8d70: 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61  #define tramp_da
8d80: 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a  ta(function)  \.
8d90: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75    *(long *)  (fu
8da0: 6e 63 74 69 6f 6e 20 2b 20 32 29 0a 23 65 6e 64  nction + 2).#end
8db0: 69 66 0a 23 69 66 64 65 66 20 5f 5f 69 61 36 34  if.#ifdef __ia64
8dc0: 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e  __.  /* function
8dd0: 3a 0a 20 20 20 2a 20 20 20 20 64 61 74 61 38 20  :.   *    data8 
8de0: 20 20 74 72 61 6d 70 0a 20 20 20 2a 20 20 20 20    tramp.   *    
8df0: 64 61 74 61 38 20 20 20 63 6c 6f 73 75 72 65 0a  data8   closure.
8e00: 20 20 20 2a 20 63 6c 6f 73 75 72 65 3a 0a 20 20     * closure:.  
8e10: 20 2a 20 20 20 20 64 61 74 61 38 20 20 20 3c 61   *    data8   <a
8e20: 64 64 72 65 73 73 3e 0a 20 20 20 2a 20 20 20 20  ddress>.   *    
8e30: 64 61 74 61 38 20 20 20 3c 76 61 72 69 61 62 6c  data8   <variabl
8e40: 65 3e 0a 20 20 20 2a 20 20 20 20 64 61 74 61 38  e>.   *    data8
8e50: 20 20 20 3c 64 61 74 61 3e 0a 20 20 20 2a 2f 0a     <data>.   */.
8e60: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e    *(long *) (fun
8e70: 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20 28 6c 6f  ction + 0) = (lo
8e80: 6e 67 29 20 26 74 72 61 6d 70 3b 0a 20 20 2a 28  ng) &tramp;.  *(
8e90: 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f  long *) (functio
8ea0: 6e 20 2b 20 38 29 20 3d 20 28 6c 6f 6e 67 29 20  n + 8) = (long) 
8eb0: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 31 36 29 3b  (function + 16);
8ec0: 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75  .  *(long *) (fu
8ed0: 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20 28 6c  nction +16) = (l
8ee0: 6f 6e 67 29 20 61 64 64 72 65 73 73 3b 0a 20 20  ong) address;.  
8ef0: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74  *(long *) (funct
8f00: 69 6f 6e 20 2b 32 34 29 20 3d 20 28 6c 6f 6e 67  ion +24) = (long
8f10: 29 20 76 61 72 69 61 62 6c 65 3b 0a 20 20 2a 28  ) variable;.  *(
8f20: 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f  long *) (functio
8f30: 6e 20 2b 33 32 29 20 3d 20 28 6c 6f 6e 67 29 20  n +32) = (long) 
8f40: 64 61 74 61 3b 0a 23 64 65 66 69 6e 65 20 69 73  data;.#define is
8f50: 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29  _tramp(function)
8f60: 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 20    \.  ((long *) 
8f70: 66 75 6e 63 74 69 6f 6e 29 5b 30 5d 20 3d 3d 20  function)[0] == 
8f80: 28 6c 6f 6e 67 29 20 26 74 72 61 6d 70 0a 23 64  (long) &tramp.#d
8f90: 65 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 72  efine tramp_addr
8fa0: 65 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c  ess(function)  \
8fb0: 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e  .  ((long *) fun
8fc0: 63 74 69 6f 6e 29 5b 32 5d 0a 23 64 65 66 69 6e  ction)[2].#defin
8fd0: 65 20 74 72 61 6d 70 5f 76 61 72 69 61 62 6c 65  e tramp_variable
8fe0: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20  (function)  \.  
8ff0: 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69  ((long *) functi
9000: 6f 6e 29 5b 33 5d 0a 23 64 65 66 69 6e 65 20 74  on)[3].#define t
9010: 72 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 74 69  ramp_data(functi
9020: 6f 6e 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20  on)  \.  ((long 
9030: 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 34 5d 0a  *) function)[4].
9040: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f  #endif.#ifdef __
9050: 78 38 36 5f 36 34 5f 5f 0a 20 20 2f 2a 20 66 75  x86_64__.  /* fu
9060: 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20  nction:.   *    
9070: 6d 6f 76 61 62 73 71 20 24 3c 64 61 74 61 3e 2c  movabsq $<data>,
9080: 25 72 61 78 09 09 34 38 20 42 38 20 3c 64 61 74  %rax..48 B8 <dat
9090: 61 3e 0a 20 20 20 2a 20 20 20 20 6d 6f 76 61 62  a>.   *    movab
90a0: 73 71 20 25 72 61 78 2c 20 3c 76 61 72 69 61 62  sq %rax, <variab
90b0: 6c 65 3e 09 34 38 20 41 33 20 3c 76 61 72 69 61  le>.48 A3 <varia
90c0: 62 6c 65 3e 0a 20 20 20 2a 20 20 20 20 6d 6f 76  ble>.   *    mov
90d0: 61 62 73 71 20 24 3c 61 64 64 72 65 73 73 3e 2c  absq $<address>,
90e0: 25 72 61 78 09 09 34 38 20 42 38 20 3c 61 64 64  %rax..48 B8 <add
90f0: 72 65 73 73 3e 0a 20 20 20 2a 20 20 20 20 6a 6d  ress>.   *    jm
9100: 70 20 2a 25 72 61 78 09 09 09 46 46 20 45 30 0a  p *%rax...FF E0.
9110: 20 20 20 2a 2f 0a 20 20 2a 28 73 68 6f 72 74 20     */.  *(short 
9120: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30  *) (function + 0
9130: 29 20 3d 20 30 78 42 38 34 38 3b 0a 20 20 2a 28  ) = 0xB848;.  *(
9140: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
9150: 6f 6e 20 2b 20 32 29 20 3d 20 28 75 6e 73 69 67  on + 2) = (unsig
9160: 6e 65 64 20 6c 6f 6e 67 29 20 64 61 74 61 20 26  ned long) data &
9170: 20 30 78 66 66 66 66 3b 0a 20 20 2a 28 69 6e 74   0xffff;.  *(int
9180: 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20   *)   (function 
9190: 2b 20 34 29 20 3d 20 28 28 75 6e 73 69 67 6e 65  + 4) = ((unsigne
91a0: 64 20 6c 6f 6e 67 29 20 64 61 74 61 20 3e 3e 20  d long) data >> 
91b0: 31 36 29 20 26 20 30 78 66 66 66 66 66 66 66 66  16) & 0xffffffff
91c0: 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28  ;.  *(short *) (
91d0: 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20  function + 8) = 
91e0: 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29  ((unsigned long)
91f0: 20 64 61 74 61 20 3e 3e 20 34 38 29 20 26 20 30   data >> 48) & 0
9200: 78 66 66 66 66 3b 0a 20 20 2a 28 73 68 6f 72 74  xffff;.  *(short
9210: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31   *) (function +1
9220: 30 29 20 3d 20 30 78 41 33 34 38 3b 0a 20 20 2a  0) = 0xA348;.  *
9230: 28 69 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74  (int *)   (funct
9240: 69 6f 6e 20 2b 31 32 29 20 3d 20 28 75 6e 73 69  ion +12) = (unsi
9250: 67 6e 65 64 20 6c 6f 6e 67 29 20 76 61 72 69 61  gned long) varia
9260: 62 6c 65 20 26 20 30 78 66 66 66 66 66 66 66 66  ble & 0xffffffff
9270: 3b 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 28  ;.  *(int *)   (
9280: 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20  function +16) = 
9290: 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29  ((unsigned long)
92a0: 20 76 61 72 69 61 62 6c 65 20 3e 3e 20 33 32 29   variable >> 32)
92b0: 20 26 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20   & 0xffffffff;. 
92c0: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e   *(short *) (fun
92d0: 63 74 69 6f 6e 20 2b 32 30 29 20 3d 20 30 78 42  ction +20) = 0xB
92e0: 38 34 38 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a  848;.  *(short *
92f0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 32 29  ) (function +22)
9300: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e   = (unsigned lon
9310: 67 29 20 61 64 64 72 65 73 73 20 26 20 30 78 66  g) address & 0xf
9320: 66 66 66 3b 0a 20 20 2a 28 69 6e 74 20 2a 29 20  fff;.  *(int *) 
9330: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 34 29    (function +24)
9340: 20 3d 20 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f   = ((unsigned lo
9350: 6e 67 29 20 61 64 64 72 65 73 73 20 3e 3e 20 31  ng) address >> 1
9360: 36 29 20 26 20 30 78 66 66 66 66 66 66 66 66 3b  6) & 0xffffffff;
9370: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66  .  *(short *) (f
9380: 75 6e 63 74 69 6f 6e 20 2b 32 38 29 20 3d 20 28  unction +28) = (
9390: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
93a0: 61 64 64 72 65 73 73 20 3e 3e 20 34 38 29 20 26  address >> 48) &
93b0: 20 30 78 66 66 66 66 3b 0a 20 20 2a 28 73 68 6f   0xffff;.  *(sho
93c0: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
93d0: 2b 33 30 29 20 3d 20 30 78 45 30 46 46 3b 0a 23  +30) = 0xE0FF;.#
93e0: 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 28  define is_tramp(
93f0: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a  function)  \.  *
9400: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20  (unsigned short 
9410: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30  *) (function + 0
9420: 29 20 3d 3d 20 30 78 42 38 34 38 20 26 26 20 5c  ) == 0xB848 && \
9430: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68  .  *(unsigned sh
9440: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ort *) (function
9450: 20 2b 31 30 29 20 3d 3d 20 30 78 41 33 34 38 20   +10) == 0xA348 
9460: 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65  && \.  *(unsigne
9470: 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63  d short *) (func
9480: 74 69 6f 6e 20 2b 32 30 29 20 3d 3d 20 30 78 42  tion +20) == 0xB
9490: 38 34 38 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73  848 && \.  *(uns
94a0: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28  igned short *) (
94b0: 66 75 6e 63 74 69 6f 6e 20 2b 33 30 29 20 3d 3d  function +30) ==
94c0: 20 30 78 45 30 46 46 0a 23 64 65 66 69 6e 65 20   0xE0FF.#define 
94d0: 68 69 6c 6f 28 68 69 77 6f 72 64 2c 6c 6f 77 6f  hilo(hiword,lowo
94e0: 72 64 29 20 20 5c 0a 20 20 28 28 28 75 6e 73 69  rd)  \.  (((unsi
94f0: 67 6e 65 64 20 6c 6f 6e 67 29 20 28 68 69 77 6f  gned long) (hiwo
9500: 72 64 29 20 3c 3c 20 33 32 29 20 7c 20 28 75 6e  rd) << 32) | (un
9510: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 6c 6f  signed long) (lo
9520: 77 6f 72 64 29 29 0a 23 64 65 66 69 6e 65 20 68  word)).#define h
9530: 69 6d 69 64 6c 6f 28 68 69 73 68 6f 72 74 2c 6d  imidlo(hishort,m
9540: 69 64 77 6f 72 64 2c 6c 6f 73 68 6f 72 74 29 20  idword,loshort) 
9550: 20 5c 0a 20 20 28 28 28 75 6e 73 69 67 6e 65 64   \.  (((unsigned
9560: 20 6c 6f 6e 67 29 20 28 68 69 73 68 6f 72 74 29   long) (hishort)
9570: 20 3c 3c 20 34 38 29 20 7c 20 28 75 6e 73 69 67   << 48) | (unsig
9580: 6e 65 64 20 6c 6f 6e 67 29 20 28 6d 69 64 77 6f  ned long) (midwo
9590: 72 64 29 20 3c 3c 20 31 36 20 5c 0a 20 20 20 7c  rd) << 16 \.   |
95a0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
95b0: 20 28 6c 6f 73 68 6f 72 74 29 29 0a 23 64 65 66   (loshort)).#def
95c0: 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 65 73  ine tramp_addres
95d0: 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20  s(function)  \. 
95e0: 20 68 69 6d 69 64 6c 6f 28 2a 28 75 6e 73 69 67   himidlo(*(unsig
95f0: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75  ned short *) (fu
9600: 6e 63 74 69 6f 6e 20 2b 32 38 29 2c 20 5c 0a 20  nction +28), \. 
9610: 20 20 20 20 20 20 20 20 20 2a 28 75 6e 73 69 67           *(unsig
9620: 6e 65 64 20 69 6e 74 20 2a 29 20 20 20 28 66 75  ned int *)   (fu
9630: 6e 63 74 69 6f 6e 20 2b 32 34 29 2c 20 5c 0a 20  nction +24), \. 
9640: 20 20 20 20 20 20 20 20 20 2a 28 75 6e 73 69 67           *(unsig
9650: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75  ned short *) (fu
9660: 6e 63 74 69 6f 6e 20 2b 32 32 29 29 0a 23 64 65  nction +22)).#de
9670: 66 69 6e 65 20 74 72 61 6d 70 5f 76 61 72 69 61  fine tramp_varia
9680: 62 6c 65 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c  ble(function)  \
9690: 0a 20 20 68 69 6c 6f 28 2a 28 75 6e 73 69 67 6e  .  hilo(*(unsign
96a0: 65 64 20 69 6e 74 20 2a 29 20 28 66 75 6e 63 74  ed int *) (funct
96b0: 69 6f 6e 20 2b 31 36 29 2c 20 2a 28 75 6e 73 69  ion +16), *(unsi
96c0: 67 6e 65 64 20 69 6e 74 20 2a 29 20 28 66 75 6e  gned int *) (fun
96d0: 63 74 69 6f 6e 20 2b 31 32 29 29 0a 23 64 65 66  ction +12)).#def
96e0: 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 28 66  ine tramp_data(f
96f0: 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69  unction)  \.  hi
9700: 6d 69 64 6c 6f 28 2a 28 75 6e 73 69 67 6e 65 64  midlo(*(unsigned
9710: 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74   short *) (funct
9720: 69 6f 6e 20 2b 20 38 29 2c 20 5c 0a 20 20 20 20  ion + 8), \.    
9730: 20 20 20 20 20 20 2a 28 75 6e 73 69 67 6e 65 64        *(unsigned
9740: 20 69 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74   int *)   (funct
9750: 69 6f 6e 20 2b 20 34 29 2c 20 5c 0a 20 20 20 20  ion + 4), \.    
9760: 20 20 20 20 20 20 2a 28 75 6e 73 69 67 6e 65 64        *(unsigned
9770: 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74   short *) (funct
9780: 69 6f 6e 20 2b 20 32 29 29 0a 23 65 6e 64 69 66  ion + 2)).#endif
9790: 0a 23 69 66 64 65 66 20 5f 5f 73 33 39 30 5f 5f  .#ifdef __s390__
97a0: 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a  .  /* function:.
97b0: 0a 20 20 20 20 20 20 20 20 6c 72 20 20 20 20 20  .        lr     
97c0: 20 25 72 30 2c 25 72 31 33 0a 20 20 20 20 20 20   %r0,%r13.      
97d0: 20 20 62 72 61 73 20 20 20 20 25 72 31 33 2c 2e    bras    %r13,.
97e0: 4c 54 4e 30 5f 30 0a 2e 4c 54 30 5f 30 3a 0a 2e  LTN0_0..LT0_0:..
97f0: 4c 43 30 3a 0a 20 20 20 20 20 20 20 20 2e 6c 6f  LC0:.        .lo
9800: 6e 67 20 20 20 30 78 37 33 35 35 34 37 31 31 0a  ng   0x73554711.
9810: 2e 4c 43 31 3a 0a 20 20 20 20 20 20 20 20 2e 6c  .LC1:.        .l
9820: 6f 6e 67 20 20 20 30 78 31 32 33 34 35 36 37 38  ong   0x12345678
9830: 0a 2e 4c 43 32 3a 0a 20 20 20 20 20 20 20 20 2e  ..LC2:.        .
9840: 6c 6f 6e 67 20 20 20 30 78 62 61 62 65 62 65 63  long   0xbabebec
9850: 30 0a 2e 4c 54 4e 30 5f 30 3a 0a 20 20 20 20 20  0..LTN0_0:.     
9860: 20 20 20 6c 20 20 20 20 20 20 20 25 72 31 2c 2e     l       %r1,.
9870: 4c 43 30 2d 2e 4c 54 30 5f 30 28 25 72 31 33 29  LC0-.LT0_0(%r13)
9880: 0a 20 20 20 20 20 20 20 20 6d 76 63 20 20 20 20  .        mvc    
9890: 20 30 28 34 2c 25 72 31 29 2c 2e 4c 43 31 2d 2e   0(4,%r1),.LC1-.
98a0: 4c 54 30 5f 30 28 25 72 31 33 29 0a 20 20 20 20  LT0_0(%r13).    
98b0: 20 20 20 20 6c 20 20 20 20 20 20 20 25 72 31 2c      l       %r1,
98c0: 2e 4c 43 32 2d 2e 4c 54 31 5f 30 28 25 72 31 33  .LC2-.LT1_0(%r13
98d0: 29 0a 20 20 20 20 20 20 20 20 6c 72 20 20 20 20  ).        lr    
98e0: 20 20 25 72 31 33 2c 25 72 30 0a 20 20 20 20 20    %r13,%r0.     
98f0: 20 20 20 62 72 20 20 20 20 20 20 25 72 31 0a 20     br      %r1. 
9900: 20 2a 2f 0a 20 20 2f 2a 20 57 68 61 74 20 61 62   */.  /* What ab
9910: 6f 75 74 20 62 69 67 20 65 6e 64 69 61 6e 20 2f  out big endian /
9920: 20 6c 69 74 74 6c 65 20 65 6e 64 69 61 6e 20 3f   little endian ?
9930: 3f 20 2a 2f 0a 20 20 2a 28 75 6e 73 69 67 6e 65  ? */.  *(unsigne
9940: 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63  d short *) (func
9950: 74 69 6f 6e 20 2b 20 30 29 20 3d 20 30 78 31 38  tion + 0) = 0x18
9960: 30 44 3b 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64  0D;.  *(unsigned
9970: 20 69 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74   int *)   (funct
9980: 69 6f 6e 20 2b 20 32 29 20 3d 20 30 78 41 37 44  ion + 2) = 0xA7D
9990: 35 30 30 30 38 3b 0a 20 20 2a 28 75 6e 73 69 67  50008;.  *(unsig
99a0: 6e 65 64 20 69 6e 74 20 2a 29 20 20 20 28 66 75  ned int *)   (fu
99b0: 6e 63 74 69 6f 6e 20 2b 20 36 29 20 3d 20 28 75  nction + 6) = (u
99c0: 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 76 61 72  nsigned int) var
99d0: 69 61 62 6c 65 3b 0a 20 20 2a 28 75 6e 73 69 67  iable;.  *(unsig
99e0: 6e 65 64 20 69 6e 74 20 2a 29 20 20 20 28 66 75  ned int *)   (fu
99f0: 6e 63 74 69 6f 6e 20 2b 31 30 29 20 3d 20 28 75  nction +10) = (u
9a00: 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 64 61 74  nsigned int) dat
9a10: 61 3b 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20  a;.  *(unsigned 
9a20: 69 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69  int *)   (functi
9a30: 6f 6e 20 2b 31 34 29 20 3d 20 28 75 6e 73 69 67  on +14) = (unsig
9a40: 6e 65 64 20 69 6e 74 29 20 61 64 64 72 65 73 73  ned int) address
9a50: 3b 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69  ;.  *(unsigned i
9a60: 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f  nt *)   (functio
9a70: 6e 20 2b 31 38 29 20 3d 20 30 78 35 38 31 30 44  n +18) = 0x5810D
9a80: 30 30 30 3b 0a 20 20 2a 28 75 6e 73 69 67 6e 65  000;.  *(unsigne
9a90: 64 20 69 6e 74 20 2a 29 20 20 20 28 66 75 6e 63  d int *)   (func
9aa0: 74 69 6f 6e 20 2b 32 32 29 20 3d 20 30 78 44 32  tion +22) = 0xD2
9ab0: 30 33 31 30 30 30 3b 0a 20 20 2a 28 75 6e 73 69  031000;.  *(unsi
9ac0: 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66  gned short *) (f
9ad0: 75 6e 63 74 69 6f 6e 20 2b 32 36 29 20 3d 20 30  unction +26) = 0
9ae0: 78 44 30 30 34 3b 0a 20 20 2a 28 75 6e 73 69 67  xD004;.  *(unsig
9af0: 6e 65 64 20 69 6e 74 20 2a 29 20 20 20 28 66 75  ned int *)   (fu
9b00: 6e 63 74 69 6f 6e 20 2b 32 38 29 20 3d 20 30 78  nction +28) = 0x
9b10: 35 38 31 30 44 30 30 38 3b 0a 20 20 2a 28 75 6e  5810D008;.  *(un
9b20: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20  signed short *) 
9b30: 28 66 75 6e 63 74 69 6f 6e 20 2b 33 32 29 20 3d  (function +32) =
9b40: 20 30 78 31 38 44 30 3b 0a 20 20 2a 28 75 6e 73   0x18D0;.  *(uns
9b50: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28  igned short *) (
9b60: 66 75 6e 63 74 69 6f 6e 20 2b 33 34 29 20 3d 20  function +34) = 
9b70: 30 78 30 37 66 31 3b 0a 23 64 65 66 69 6e 65 20  0x07f1;.#define 
9b80: 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 6f  is_tramp(functio
9b90: 6e 29 20 20 5c 0a 20 20 2a 28 73 68 6f 72 74 20  n)  \.  *(short 
9ba0: 2a 29 20 20 20 20 20 20 20 20 20 20 28 66 75 6e  *)          (fun
9bb0: 63 74 69 6f 6e 20 2b 20 30 29 20 3d 3d 20 30 78  ction + 0) == 0x
9bc0: 31 38 30 44 20 26 26 20 5c 0a 20 20 2a 28 69 6e  180D && \.  *(in
9bd0: 74 20 2a 29 20 20 20 20 20 20 20 20 20 20 20 20  t *)            
9be0: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 32 29 20 3d  (function + 2) =
9bf0: 3d 20 30 78 41 37 44 35 30 30 30 38 20 26 26 20  = 0xA7D50008 && 
9c00: 5c 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 20  \.  *(int *)    
9c10: 20 20 20 20 20 20 20 20 28 66 75 6e 63 74 69 6f          (functio
9c20: 6e 20 2b 31 38 29 20 3d 3d 20 30 78 35 38 31 30  n +18) == 0x5810
9c30: 44 30 30 30 20 26 26 20 5c 0a 20 20 2a 28 69 6e  D000 && \.  *(in
9c40: 74 20 2a 29 20 20 20 20 20 20 20 20 20 20 20 20  t *)            
9c50: 28 66 75 6e 63 74 69 6f 6e 20 2b 32 32 29 20 3d  (function +22) =
9c60: 3d 20 30 78 44 32 30 33 31 30 30 30 20 26 26 20  = 0xD2031000 && 
9c70: 5c 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 20  \.  *(short *)  
9c80: 20 20 20 20 20 20 20 20 28 66 75 6e 63 74 69 6f          (functio
9c90: 6e 20 2b 32 36 29 20 3d 3d 20 30 78 44 30 30 34  n +26) == 0xD004
9ca0: 20 26 26 20 5c 0a 20 20 2a 28 69 6e 74 20 2a 29   && \.  *(int *)
9cb0: 20 20 20 20 20 20 20 20 20 20 20 20 28 66 75 6e              (fun
9cc0: 63 74 69 6f 6e 20 2b 32 38 29 20 3d 3d 20 30 78  ction +28) == 0x
9cd0: 35 38 31 30 44 30 30 38 20 26 26 20 5c 0a 20 20  5810D008 && \.  
9ce0: 2a 28 73 68 6f 72 74 20 2a 29 20 20 20 20 20 20  *(short *)      
9cf0: 20 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 33      (function +3
9d00: 32 29 20 3d 3d 20 30 78 31 38 44 30 20 26 26 20  2) == 0x18D0 && 
9d10: 5c 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 20  \.  *(short *)  
9d20: 20 20 20 20 20 20 20 20 28 66 75 6e 63 74 69 6f          (functio
9d30: 6e 20 2b 33 34 29 20 3d 3d 20 30 78 30 37 66 31  n +34) == 0x07f1
9d40: 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 61  .#define tramp_a
9d50: 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e 29  ddress(function)
9d60: 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64    \.  *(unsigned
9d70: 20 69 6e 74 20 2a 29 20 28 66 75 6e 63 74 69 6f   int *) (functio
9d80: 6e 20 2b 31 34 29 0a 23 64 65 66 69 6e 65 20 74  n +14).#define t
9d90: 72 61 6d 70 5f 76 61 72 69 61 62 6c 65 28 66 75  ramp_variable(fu
9da0: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 75  nction)  \.  *(u
9db0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 28  nsigned int *) (
9dc0: 66 75 6e 63 74 69 6f 6e 20 2b 36 29 0a 23 64 65  function +6).#de
9dd0: 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 28  fine tramp_data(
9de0: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a  function)  \.  *
9df0: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29  (unsigned int *)
9e00: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 30 29 0a   (function +10).
9e10: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 33 2e 20  #endif..  /* 3. 
9e20: 53 65 74 20 6d 65 6d 6f 72 79 20 70 72 6f 74 65  Set memory prote
9e30: 63 74 69 6f 6e 20 74 6f 20 22 65 78 65 63 75 74  ction to "execut
9e40: 61 62 6c 65 22 20 2a 2f 0a 0a 23 69 66 20 21 64  able" */..#if !d
9e50: 65 66 69 6e 65 64 28 43 4f 44 45 5f 45 58 45 43  efined(CODE_EXEC
9e60: 55 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e  UTABLE) && defin
9e70: 65 64 28 45 58 45 43 55 54 41 42 4c 45 5f 56 49  ed(EXECUTABLE_VI
9e80: 41 5f 4d 50 52 4f 54 45 43 54 29 0a 20 20 2f 2a  A_MPROTECT).  /*
9e90: 20 43 61 6c 6c 20 6d 70 72 6f 74 65 63 74 20 6f   Call mprotect o
9ea0: 6e 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74  n the pages that
9eb0: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 61 6e   contain the ran
9ec0: 67 65 2e 20 2a 2f 0a 20 20 7b 20 75 6e 73 69 67  ge. */.  { unsig
9ed0: 6e 65 64 20 6c 6f 6e 67 20 73 74 61 72 74 5f 61  ned long start_a
9ee0: 64 64 72 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  ddr = (unsigned 
9ef0: 6c 6f 6e 67 29 20 66 75 6e 63 74 69 6f 6e 3b 0a  long) function;.
9f00: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e      unsigned lon
9f10: 67 20 65 6e 64 5f 61 64 64 72 20 3d 20 28 75 6e  g end_addr = (un
9f20: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 66 75  signed long) (fu
9f30: 6e 63 74 69 6f 6e 20 2b 20 54 52 41 4d 50 5f 4c  nction + TRAMP_L
9f40: 45 4e 47 54 48 29 3b 0a 20 20 20 20 73 74 61 72  ENGTH);.    star
9f50: 74 5f 61 64 64 72 20 3d 20 73 74 61 72 74 5f 61  t_addr = start_a
9f60: 64 64 72 20 26 20 2d 70 61 67 65 73 69 7a 65 3b  ddr & -pagesize;
9f70: 0a 20 20 20 20 65 6e 64 5f 61 64 64 72 20 3d 20  .    end_addr = 
9f80: 28 65 6e 64 5f 61 64 64 72 20 2b 20 70 61 67 65  (end_addr + page
9f90: 73 69 7a 65 2d 31 29 20 26 20 2d 70 61 67 65 73  size-1) & -pages
9fa0: 69 7a 65 3b 0a 20 20 20 7b 75 6e 73 69 67 6e 65  ize;.   {unsigne
9fb0: 64 20 6c 6f 6e 67 20 6c 65 6e 20 3d 20 65 6e 64  d long len = end
9fc0: 5f 61 64 64 72 20 2d 20 73 74 61 72 74 5f 61 64  _addr - start_ad
9fd0: 64 72 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dr;.#if defined(
9fe0: 48 41 56 45 5f 4d 41 43 48 5f 56 4d 29 0a 20 20  HAVE_MACH_VM).  
9ff0: 20 20 69 66 20 28 76 6d 5f 70 72 6f 74 65 63 74    if (vm_protect
a000: 28 74 61 73 6b 5f 73 65 6c 66 28 29 2c 73 74 61  (task_self(),sta
a010: 72 74 5f 61 64 64 72 2c 6c 65 6e 2c 30 2c 56 4d  rt_addr,len,0,VM
a020: 5f 50 52 4f 54 5f 52 45 41 44 7c 56 4d 5f 50 52  _PROT_READ|VM_PR
a030: 4f 54 5f 57 52 49 54 45 7c 56 4d 5f 50 52 4f 54  OT_WRITE|VM_PROT
a040: 5f 45 58 45 43 55 54 45 29 20 21 3d 20 4b 45 52  _EXECUTE) != KER
a050: 4e 5f 53 55 43 43 45 53 53 29 0a 23 65 6c 73 65  N_SUCCESS).#else
a060: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 63  .#if defined(__c
a070: 6f 6e 76 65 78 5f 5f 29 0a 20 20 20 20 2f 2a 20  onvex__).    /* 
a080: 43 6f 6e 76 65 78 20 4f 53 20 63 61 6c 6c 73 20  Convex OS calls 
a090: 69 74 20 60 6d 72 65 6d 61 70 28 29 27 2e 20 2a  it `mremap()'. *
a0a0: 2f 0a 20 20 20 20 6d 72 65 6d 61 70 28 73 74 61  /.    mremap(sta
a0b0: 72 74 5f 61 64 64 72 2c 20 26 6c 65 6e 2c 20 50  rt_addr, &len, P
a0c0: 52 4f 54 5f 52 45 41 44 7c 50 52 4f 54 5f 57 52  ROT_READ|PROT_WR
a0d0: 49 54 45 7c 50 52 4f 54 5f 45 58 45 43 2c 20 4d  ITE|PROT_EXEC, M
a0e0: 41 50 5f 50 52 49 56 41 54 45 29 3b 0a 20 20 20  AP_PRIVATE);.   
a0f0: 20 69 66 20 28 30 29 0a 23 65 6c 73 65 0a 23 69   if (0).#else.#i
a100: 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 53  f defined(HAVE_S
a110: 59 53 5f 4d 38 38 4b 42 43 53 5f 48 29 0a 20 20  YS_M88KBCS_H).  
a120: 20 20 69 66 20 28 6d 65 6d 63 74 6c 28 73 74 61    if (memctl(sta
a130: 72 74 5f 61 64 64 72 2c 20 6c 65 6e 2c 20 4d 43  rt_addr, len, MC
a140: 54 5f 54 45 58 54 29 20 3d 3d 20 2d 31 29 0a 23  T_TEXT) == -1).#
a150: 65 6c 73 65 0a 20 20 20 20 69 66 20 28 6d 70 72  else.    if (mpr
a160: 6f 74 65 63 74 28 28 76 6f 69 64 2a 29 73 74 61  otect((void*)sta
a170: 72 74 5f 61 64 64 72 2c 20 6c 65 6e 2c 20 50 52  rt_addr, len, PR
a180: 4f 54 5f 52 45 41 44 7c 50 52 4f 54 5f 57 52 49  OT_READ|PROT_WRI
a190: 54 45 7c 50 52 4f 54 5f 45 58 45 43 29 20 3c 20  TE|PROT_EXEC) < 
a1a0: 30 29 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66  0).#endif.#endif
a1b0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 20  .#endif.      { 
a1c0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
a1d0: 74 72 61 6d 70 6f 6c 69 6e 65 3a 20 63 61 6e 6e  trampoline: cann
a1e0: 6f 74 20 6d 61 6b 65 20 6d 65 6d 6f 72 79 20 65  ot make memory e
a1f0: 78 65 63 75 74 61 62 6c 65 5c 6e 22 29 3b 20 61  xecutable\n"); a
a200: 62 6f 72 74 28 29 3b 20 7d 0a 20 20 7d 7d 0a 23  bort(); }.  }}.#
a210: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 34 2e 20 46  endif..  /* 4. F
a220: 6c 75 73 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  lush instruction
a230: 20 63 61 63 68 65 20 2a 2f 0a 20 20 2f 2a 20 57   cache */.  /* W
a240: 65 20 6e 65 65 64 20 74 68 69 73 20 62 65 63 61  e need this beca
a250: 75 73 65 20 73 6f 6d 65 20 43 50 55 73 20 68 61  use some CPUs ha
a260: 76 65 20 73 65 70 61 72 61 74 65 20 64 61 74 61  ve separate data
a270: 20 63 61 63 68 65 20 61 6e 64 20 69 6e 73 74 72   cache and instr
a280: 75 63 74 69 6f 6e 0a 20 20 20 2a 20 63 61 63 68  uction.   * cach
a290: 65 2e 20 54 68 65 20 66 72 65 73 68 6c 79 20 62  e. The freshly b
a2a0: 75 69 6c 74 20 74 72 61 6d 70 6f 6c 69 6e 65 20  uilt trampoline 
a2b0: 69 73 20 76 69 73 69 62 6c 65 20 74 6f 20 74 68  is visible to th
a2c0: 65 20 64 61 74 61 20 63 61 63 68 65 2c 20 62 75  e data cache, bu
a2d0: 74 20 6e 6f 74 0a 20 20 20 2a 20 6d 61 79 62 65  t not.   * maybe
a2e0: 20 6e 6f 74 20 74 6f 20 74 68 65 20 69 6e 73 74   not to the inst
a2f0: 72 75 63 74 69 6f 6e 20 63 61 63 68 65 2e 20 54  ruction cache. T
a300: 68 69 73 20 69 73 20 68 61 69 72 79 2e 0a 20 20  his is hairy..  
a310: 20 2a 2f 0a 23 69 66 20 21 28 64 65 66 69 6e 65   */.#if !(define
a320: 64 28 5f 5f 68 70 70 61 6e 65 77 5f 5f 29 20 7c  d(__hppanew__) |
a330: 7c 20 64 65 66 69 6e 65 64 28 5f 5f 72 73 36 30  | defined(__rs60
a340: 30 30 61 69 78 5f 5f 29 20 7c 7c 20 64 65 66 69  00aix__) || defi
a350: 6e 65 64 28 5f 5f 69 61 36 34 5f 5f 29 29 0a 20  ned(__ia64__)). 
a360: 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20   /* Only needed 
a370: 69 66 20 77 65 20 72 65 61 6c 6c 79 20 73 65 74  if we really set
a380: 20 75 70 20 6d 61 63 68 69 6e 65 20 69 6e 73 74   up machine inst
a390: 72 75 63 74 69 6f 6e 73 2e 20 2a 2f 0a 23 69 66  ructions. */.#if
a3a0: 64 65 66 20 5f 5f 69 33 38 36 5f 5f 0a 23 69 66  def __i386__.#if
a3b0: 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29   defined(_WIN32)
a3c0: 0a 20 20 77 68 69 6c 65 20 28 21 46 6c 75 73 68  .  while (!Flush
a3d0: 49 6e 73 74 72 75 63 74 69 6f 6e 43 61 63 68 65  InstructionCache
a3e0: 28 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  (GetCurrentProce
a3f0: 73 73 28 29 2c 66 75 6e 63 74 69 6f 6e 2c 54 52  ss(),function,TR
a400: 41 4d 50 5f 4c 45 4e 47 54 48 29 29 0a 20 20 20  AMP_LENGTH)).   
a410: 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 65 6e 64 69   continue;.#endi
a420: 66 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  f.#endif.#ifdef 
a430: 5f 5f 6d 36 38 6b 5f 5f 0a 23 69 66 20 64 65 66  __m68k__.#if def
a440: 69 6e 65 64 28 4e 65 58 54 29 20 26 26 20 64 65  ined(NeXT) && de
a450: 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a  fined(__GNUC__).
a460: 20 20 5f 5f 61 73 6d 5f 5f 20 5f 5f 76 6f 6c 61    __asm__ __vola
a470: 74 69 6c 65 5f 5f 20 28 22 74 72 61 70 20 23 32  tile__ ("trap #2
a480: 22 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  ");.#endif.#if d
a490: 65 66 69 6e 65 64 28 41 4d 49 47 41 29 0a 20 20  efined(AMIGA).  
a4a0: 43 61 63 68 65 43 6c 65 61 72 45 28 66 75 6e 63  CacheClearE(func
a4b0: 74 69 6f 6e 2c 54 52 41 4d 50 5f 4c 45 4e 47 54  tion,TRAMP_LENGT
a4c0: 48 2c 43 41 43 52 46 5f 43 6c 65 61 72 49 7c 43  H,CACRF_ClearI|C
a4d0: 41 43 52 46 5f 43 6c 65 61 72 44 29 3b 0a 23 65  ACRF_ClearD);.#e
a4e0: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
a4f0: 28 61 70 6f 6c 6c 6f 29 0a 20 20 63 61 63 68 65  (apollo).  cache
a500: 5f 24 63 6c 65 61 72 28 29 3b 0a 23 65 6e 64 69  _$clear();.#endi
a510: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 68 70  f.#if defined(hp
a520: 75 78 29 0a 20 20 63 61 63 68 65 63 74 6c 28 43  ux).  cachectl(C
a530: 43 5f 49 50 55 52 47 45 2c 66 75 6e 63 74 69 6f  C_IPURGE,functio
a540: 6e 2c 54 52 41 4d 50 5f 4c 45 4e 47 54 48 29 3b  n,TRAMP_LENGTH);
a550: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
a560: 6e 65 64 28 5f 5f 4e 65 74 42 53 44 5f 5f 29 20  ned(__NetBSD__) 
a570: 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e 55  && defined(__GNU
a580: 43 5f 5f 29 0a 20 20 7b 20 72 65 67 69 73 74 65  C__).  { registe
a590: 72 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  r unsigned long 
a5a0: 5f 62 65 67 20 5f 5f 61 73 6d 5f 5f 20 28 22 25  _beg __asm__ ("%
a5b0: 61 31 22 29 20 3d 20 28 75 6e 73 69 67 6e 65 64  a1") = (unsigned
a5c0: 20 6c 6f 6e 67 29 20 66 75 6e 63 74 69 6f 6e 3b   long) function;
a5d0: 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 75 6e  .    register un
a5e0: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 5f 6c 65 6e  signed long _len
a5f0: 20 5f 5f 61 73 6d 5f 5f 20 28 22 25 64 31 22 29   __asm__ ("%d1")
a600: 20 3d 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 3b   = TRAMP_LENGTH;
a610: 0a 20 20 20 20 5f 5f 61 73 6d 5f 5f 20 5f 5f 76  .    __asm__ __v
a620: 6f 6c 61 74 69 6c 65 5f 5f 20 28 0a 20 20 20 20  olatile__ (.    
a630: 20 20 22 6d 6f 76 65 25 2e 6c 20 25 23 30 78 38    "move%.l %#0x8
a640: 30 30 30 30 30 30 34 2c 25 2f 64 30 5c 6e 5c 74  0000004,%/d0\n\t
a650: 22 20 2f 2a 20 43 43 5f 45 58 54 50 55 52 47 45  " /* CC_EXTPURGE
a660: 20 7c 20 43 5f 49 50 55 52 47 45 20 2a 2f 0a 20   | C_IPURGE */. 
a670: 20 20 20 20 20 22 74 72 61 70 20 23 31 32 22 20       "trap #12" 
a680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a690: 20 20 20 20 20 2f 2a 20 6b 65 72 6e 65 6c 20 63       /* kernel c
a6a0: 61 6c 6c 20 60 63 61 63 68 65 63 74 6c 27 20 2a  all `cachectl' *
a6b0: 2f 0a 20 20 20 20 20 20 3a 0a 20 20 20 20 20 20  /.      :.      
a6c0: 3a 20 22 61 22 20 28 5f 62 65 67 29 2c 20 22 64  : "a" (_beg), "d
a6d0: 22 20 28 5f 6c 65 6e 29 0a 20 20 20 20 20 20 3a  " (_len).      :
a6e0: 20 22 25 61 30 22 2c 20 22 25 61 31 22 2c 20 22   "%a0", "%a1", "
a6f0: 25 64 30 22 2c 20 22 25 64 31 22 20 20 20 20 2f  %d0", "%d1"    /
a700: 2a 20 63 61 6c 6c 2d 75 73 65 64 20 72 65 67 69  * call-used regi
a710: 73 74 65 72 73 20 2a 2f 0a 20 20 20 20 20 20 29  sters */.      )
a720: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66  ;.  }.#endif.#if
a730: 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78   defined(__linux
a740: 5f 5f 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f  __) && defined(_
a750: 5f 47 4e 55 43 5f 5f 29 0a 20 20 7b 20 72 65 67  _GNUC__).  { reg
a760: 69 73 74 65 72 20 75 6e 73 69 67 6e 65 64 20 6c  ister unsigned l
a770: 6f 6e 67 20 5f 62 65 67 20 5f 5f 61 73 6d 5f 5f  ong _beg __asm__
a780: 20 28 22 25 64 31 22 29 20 3d 20 28 75 6e 73 69   ("%d1") = (unsi
a790: 67 6e 65 64 20 6c 6f 6e 67 29 20 66 75 6e 63 74  gned long) funct
a7a0: 69 6f 6e 3b 0a 20 20 20 20 72 65 67 69 73 74 65  ion;.    registe
a7b0: 72 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  r unsigned long 
a7c0: 5f 6c 65 6e 20 5f 5f 61 73 6d 5f 5f 20 28 22 25  _len __asm__ ("%
a7d0: 64 34 22 29 20 3d 20 54 52 41 4d 50 5f 4c 45 4e  d4") = TRAMP_LEN
a7e0: 47 54 48 20 2b 20 33 32 3b 0a 20 20 20 20 5f 5f  GTH + 32;.    __
a7f0: 61 73 6d 5f 5f 20 5f 5f 76 6f 6c 61 74 69 6c 65  asm__ __volatile
a800: 5f 5f 20 28 0a 20 20 20 20 20 20 22 6d 6f 76 65  __ (.      "move
a810: 25 2e 6c 20 25 23 31 32 33 2c 25 2f 64 30 5c 6e  %.l %#123,%/d0\n
a820: 5c 74 22 0a 20 20 20 20 20 20 22 6d 6f 76 65 25  \t".      "move%
a830: 2e 6c 20 25 23 31 2c 25 2f 64 32 5c 6e 5c 74 22  .l %#1,%/d2\n\t"
a840: 0a 20 20 20 20 20 20 22 6d 6f 76 65 25 2e 6c 20  .      "move%.l 
a850: 25 23 33 2c 25 2f 64 33 5c 6e 5c 74 22 0a 20 20  %#3,%/d3\n\t".  
a860: 20 20 20 20 22 74 72 61 70 20 25 23 30 22 0a 20      "trap %#0". 
a870: 20 20 20 20 20 3a 0a 20 20 20 20 20 20 3a 20 22       :.      : "
a880: 64 22 20 28 5f 62 65 67 29 2c 20 22 64 22 20 28  d" (_beg), "d" (
a890: 5f 6c 65 6e 29 0a 20 20 20 20 20 20 3a 20 22 25  _len).      : "%
a8a0: 64 30 22 2c 20 22 25 64 32 22 2c 20 22 25 64 33  d0", "%d2", "%d3
a8b0: 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 7d 0a 23  ".      );.  }.#
a8c0: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
a8d0: 64 28 41 55 58 29 20 26 26 20 64 65 66 69 6e 65  d(AUX) && define
a8e0: 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a 20 20 2f 2a  d(__GNUC__).  /*
a8f0: 20 73 79 73 6d 36 38 6b 28 31 30 35 2c 20 61 64   sysm68k(105, ad
a900: 64 72 2c 20 73 63 6f 70 65 2c 20 63 61 63 68 65  dr, scope, cache
a910: 2c 20 6c 65 6e 29 20 2a 2f 0a 20 20 5f 5f 61 73  , len) */.  __as
a920: 6d 5f 5f 20 5f 5f 76 6f 6c 61 74 69 6c 65 5f 5f  m__ __volatile__
a930: 20 28 0a 20 20 20 20 22 6d 6f 76 65 25 2e 6c 20   (.    "move%.l 
a940: 25 31 2c 25 2f 73 70 40 2d 5c 6e 5c 74 22 0a 20  %1,%/sp@-\n\t". 
a950: 20 20 20 22 6d 6f 76 65 25 2e 6c 20 25 23 33 2c     "move%.l %#3,
a960: 25 2f 73 70 40 2d 5c 6e 5c 74 22 0a 20 20 20 20  %/sp@-\n\t".    
a970: 22 6d 6f 76 65 25 2e 6c 20 25 23 31 2c 25 2f 73  "move%.l %#1,%/s
a980: 70 40 2d 5c 6e 5c 74 22 0a 20 20 20 20 22 6d 6f  p@-\n\t".    "mo
a990: 76 65 25 2e 6c 20 25 30 2c 25 2f 73 70 40 2d 5c  ve%.l %0,%/sp@-\
a9a0: 6e 5c 74 22 0a 20 20 20 20 22 6d 6f 76 65 25 2e  n\t".    "move%.
a9b0: 6c 20 25 23 31 30 35 2c 25 2f 73 70 40 2d 5c 6e  l %#105,%/sp@-\n
a9c0: 5c 74 22 0a 20 20 20 20 22 6d 6f 76 65 25 2e 6c  \t".    "move%.l
a9d0: 20 25 23 30 2c 25 2f 73 70 40 2d 5c 6e 5c 74 22   %#0,%/sp@-\n\t"
a9e0: 0a 20 20 20 20 22 6d 6f 76 65 25 2e 6c 20 25 23  .    "move%.l %#
a9f0: 33 38 2c 25 2f 73 70 40 2d 5c 6e 5c 74 22 0a 20  38,%/sp@-\n\t". 
aa00: 20 20 20 22 74 72 61 70 20 25 23 30 5c 6e 5c 74     "trap %#0\n\t
aa10: 22 0a 20 20 20 20 22 61 64 64 25 2e 6c 20 25 23  ".    "add%.l %#
aa20: 32 34 2c 25 2f 73 70 22 0a 20 20 20 20 3a 0a 20  24,%/sp".    :. 
aa30: 20 20 20 3a 20 22 72 22 20 28 66 75 6e 63 74 69     : "r" (functi
aa40: 6f 6e 29 2c 20 22 67 22 20 28 28 69 6e 74 29 54  on), "g" ((int)T
aa50: 52 41 4d 50 5f 4c 45 4e 47 54 48 29 0a 20 20 20  RAMP_LENGTH).   
aa60: 20 3a 20 22 25 64 30 22 0a 20 20 20 20 29 3b 0a   : "%d0".    );.
aa70: 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69  #endif.#endif.#i
aa80: 66 20 64 65 66 69 6e 65 64 28 5f 5f 6d 69 70 73  f defined(__mips
aa90: 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  __) || defined(_
aaa0: 5f 6d 69 70 73 6e 33 32 5f 5f 29 20 7c 7c 20 64  _mipsn32__) || d
aab0: 65 66 69 6e 65 64 28 5f 5f 6d 69 70 73 36 34 5f  efined(__mips64_
aac0: 5f 29 0a 20 20 63 61 63 68 65 66 6c 75 73 68 28  _).  cacheflush(
aad0: 66 75 6e 63 74 69 6f 6e 2c 54 52 41 4d 50 5f 4c  function,TRAMP_L
aae0: 45 4e 47 54 48 2c 49 43 41 43 48 45 29 3b 0a 20  ENGTH,ICACHE);. 
aaf0: 20 2f 2a 20 67 66 6f 72 74 68 2d 30 2e 33 2e 30   /* gforth-0.3.0
ab00: 20 75 73 65 73 20 42 43 41 43 48 45 20 69 6e 73   uses BCACHE ins
ab10: 74 65 61 64 20 6f 66 20 49 43 41 43 48 45 2e 20  tead of ICACHE. 
ab20: 57 68 79 3f 3f 20 2a 2f 0a 23 65 6e 64 69 66 0a  Why?? */.#endif.
ab30: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 73 70  #if defined(__sp
ab40: 61 72 63 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65  arc__) || define
ab50: 64 28 5f 5f 73 70 61 72 63 36 34 5f 5f 29 0a 20  d(__sparc64__). 
ab60: 20 2f 2a 20 54 68 69 73 20 61 73 73 75 6d 65 73   /* This assumes
ab70: 20 74 68 61 74 20 74 68 65 20 74 72 61 6d 70 6f   that the trampo
ab80: 6c 69 6e 65 20 66 69 74 73 20 69 6e 20 61 74 20  line fits in at 
ab90: 6d 6f 73 74 20 66 6f 75 72 20 63 61 63 68 65 20  most four cache 
aba0: 6c 69 6e 65 73 2e 20 2a 2f 0a 20 20 5f 5f 54 52  lines. */.  __TR
abb0: 5f 63 6c 65 61 72 5f 63 61 63 68 65 5f 34 28 66  _clear_cache_4(f
abc0: 75 6e 63 74 69 6f 6e 2c 66 75 6e 63 74 69 6f 6e  unction,function
abd0: 2b 54 52 41 4d 50 5f 4c 45 4e 47 54 48 2d 31 29  +TRAMP_LENGTH-1)
abe0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
abf0: 5f 5f 61 6c 70 68 61 5f 5f 0a 20 20 5f 5f 54 52  __alpha__.  __TR
ac00: 5f 63 6c 65 61 72 5f 63 61 63 68 65 28 29 3b 0a  _clear_cache();.
ac10: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f  #endif.#ifdef __
ac20: 68 70 70 61 5f 5f 0a 20 20 2f 2a 20 54 68 69 73  hppa__.  /* This
ac30: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68   assumes that th
ac40: 65 20 74 72 61 6d 70 6f 6c 69 6e 65 20 66 69 74  e trampoline fit
ac50: 73 20 69 6e 20 61 74 20 6d 6f 73 74 20 74 77 6f  s in at most two
ac60: 20 63 61 63 68 65 20 6c 69 6e 65 73 2e 20 2a 2f   cache lines. */
ac70: 0a 20 20 5f 5f 54 52 5f 63 6c 65 61 72 5f 63 61  .  __TR_clear_ca
ac80: 63 68 65 28 66 75 6e 63 74 69 6f 6e 2c 66 75 6e  che(function,fun
ac90: 63 74 69 6f 6e 2b 54 52 41 4d 50 5f 4c 45 4e 47  ction+TRAMP_LENG
aca0: 54 48 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69  TH-1);.#endif.#i
acb0: 66 64 65 66 20 5f 5f 61 72 6d 5f 5f 0a 20 20 2f  fdef __arm__.  /
acc0: 2a 20 54 68 69 73 20 43 50 55 20 64 6f 65 73 20  * This CPU does 
acd0: 6e 6f 74 20 68 61 76 65 20 61 20 73 65 70 61 72  not have a separ
ace0: 61 74 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ate instruction 
acf0: 63 61 63 68 65 2e 20 28 49 20 74 68 69 6e 6b 2e  cache. (I think.
ad00: 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64  ) */.#endif.#ifd
ad10: 65 66 20 5f 5f 72 73 36 30 30 30 5f 5f 0a 20 20  ef __rs6000__.  
ad20: 5f 5f 54 52 5f 63 6c 65 61 72 5f 63 61 63 68 65  __TR_clear_cache
ad30: 28 66 75 6e 63 74 69 6f 6e 29 3b 0a 23 65 6e 64  (function);.#end
ad40: 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d 38 38 6b  if.#ifdef __m88k
ad50: 5f 5f 0a 20 20 73 79 73 6d 6f 74 28 53 38 38 43  __.  sysmot(S88C
ad60: 41 43 48 45 46 4c 55 53 48 50 41 47 45 2c 20 28  ACHEFLUSHPAGE, (
ad70: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 66 75  unsigned long)fu
ad80: 6e 63 74 69 6f 6e 20 26 20 2d 70 61 67 65 73 69  nction & -pagesi
ad90: 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  ze);.#endif.#ifd
ada0: 65 66 20 5f 5f 63 6f 6e 76 65 78 5f 5f 0a 20 20  ef __convex__.  
adb0: 5f 5f 54 52 5f 63 6c 65 61 72 5f 63 61 63 68 65  __TR_clear_cache
adc0: 28 29 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69  ();.#endif.#endi
add0: 66 0a 0a 20 20 2f 2a 20 35 2e 20 52 65 74 75 72  f..  /* 5. Retur
ade0: 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28  n. */.  return (
adf0: 5f 5f 54 52 5f 66 75 6e 63 74 69 6f 6e 29 20 28  __TR_function) (
ae00: 66 75 6e 63 74 69 6f 6e 20 2b 20 54 52 41 4d 50  function + TRAMP
ae10: 5f 42 49 41 53 29 3b 0a 7d 0a 0a 23 69 66 20 64  _BIAS);.}..#if d
ae20: 65 66 69 6e 65 64 28 5f 5f 53 54 44 43 5f 5f 29  efined(__STDC__)
ae30: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e   || defined(__GN
ae40: 55 43 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64  UC__) || defined
ae50: 28 5f 5f 63 70 6c 75 73 70 6c 75 73 29 0a 76 6f  (__cplusplus).vo
ae60: 69 64 20 66 72 65 65 5f 74 72 61 6d 70 6f 6c 69  id free_trampoli
ae70: 6e 65 20 28 5f 5f 54 52 5f 66 75 6e 63 74 69 6f  ne (__TR_functio
ae80: 6e 20 66 75 6e 63 74 69 6f 6e 29 0a 23 65 6c 73  n function).#els
ae90: 65 0a 76 6f 69 64 20 66 72 65 65 5f 74 72 61 6d  e.void free_tram
aea0: 70 6f 6c 69 6e 65 20 28 66 75 6e 63 74 69 6f 6e  poline (function
aeb0: 29 0a 20 20 5f 5f 54 52 5f 66 75 6e 63 74 69 6f  ).  __TR_functio
aec0: 6e 20 66 75 6e 63 74 69 6f 6e 3b 0a 23 65 6e 64  n function;.#end
aed0: 69 66 0a 7b 0a 23 69 66 20 54 52 41 4d 50 5f 42  if.{.#if TRAMP_B
aee0: 49 41 53 0a 20 20 66 75 6e 63 74 69 6f 6e 20 3d  IAS.  function =
aef0: 20 28 5f 5f 54 52 5f 66 75 6e 63 74 69 6f 6e 29   (__TR_function)
af00: 28 28 63 68 61 72 2a 29 66 75 6e 63 74 69 6f 6e  ((char*)function
af10: 20 2d 20 54 52 41 4d 50 5f 42 49 41 53 29 3b 0a   - TRAMP_BIAS);.
af20: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
af30: 6e 65 64 28 43 4f 44 45 5f 45 58 45 43 55 54 41  ned(CODE_EXECUTA
af40: 42 4c 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  BLE) && !defined
af50: 28 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41 5f  (EXECUTABLE_VIA_
af60: 4d 50 52 4f 54 45 43 54 29 0a 20 20 2a 28 63 68  MPROTECT).  *(ch
af70: 61 72 2a 2a 29 66 75 6e 63 74 69 6f 6e 20 3d 20  ar**)function = 
af80: 66 72 65 65 6c 69 73 74 3b 20 66 72 65 65 6c 69  freelist; freeli
af90: 73 74 20 3d 20 28 63 68 61 72 2a 29 66 75 6e 63  st = (char*)func
afa0: 74 69 6f 6e 3b 0a 20 20 2f 2a 20 49 74 20 69 73  tion;.  /* It is
afb0: 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 77 6f   probably not wo
afc0: 72 74 68 20 63 61 6c 6c 69 6e 67 20 6d 75 6e 6d  rth calling munm
afd0: 61 70 28 29 20 66 6f 72 20 65 6e 74 69 72 65 6c  ap() for entirel
afe0: 79 20 66 72 65 65 64 20 70 61 67 65 73 2e 20 2a  y freed pages. *
aff0: 2f 0a 23 65 6c 73 65 0a 20 20 66 72 65 65 28 28  /.#else.  free((
b000: 28 63 68 61 72 2a 2a 29 66 75 6e 63 74 69 6f 6e  (char**)function
b010: 29 5b 2d 31 5d 29 3b 0a 23 65 6e 64 69 66 0a 7d  )[-1]);.#endif.}
b020: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
b030: 53 54 44 43 5f 5f 29 20 7c 7c 20 64 65 66 69 6e  STDC__) || defin
b040: 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 20 7c 7c 20  ed(__GNUC__) || 
b050: 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75 73 70  defined(__cplusp
b060: 6c 75 73 29 0a 69 6e 74 20 69 73 5f 74 72 61 6d  lus).int is_tram
b070: 70 6f 6c 69 6e 65 20 28 76 6f 69 64 2a 20 66 75  poline (void* fu
b080: 6e 63 74 69 6f 6e 29 0a 23 65 6c 73 65 0a 69 6e  nction).#else.in
b090: 74 20 69 73 5f 74 72 61 6d 70 6f 6c 69 6e 65 20  t is_trampoline 
b0a0: 28 66 75 6e 63 74 69 6f 6e 29 0a 20 20 76 6f 69  (function).  voi
b0b0: 64 2a 20 66 75 6e 63 74 69 6f 6e 3b 0a 23 65 6e  d* function;.#en
b0c0: 64 69 66 0a 7b 0a 23 69 66 64 65 66 20 69 73 5f  dif.{.#ifdef is_
b0d0: 74 72 61 6d 70 0a 23 69 66 64 65 66 20 5f 5f 68  tramp.#ifdef __h
b0e0: 70 70 61 6e 65 77 5f 5f 0a 20 20 76 6f 69 64 2a  ppanew__.  void*
b0f0: 20 74 72 61 6d 70 5f 61 64 64 72 65 73 73 20 3d   tramp_address =
b100: 20 26 74 72 61 6d 70 3b 0a 20 20 69 66 20 28 21   &tramp;.  if (!
b110: 28 28 28 6c 6f 6e 67 29 66 75 6e 63 74 69 6f 6e  (((long)function
b120: 20 26 20 33 29 20 3d 3d 20 28 54 52 41 4d 50 5f   & 3) == (TRAMP_
b130: 42 49 41 53 20 26 20 33 29 29 29 20 72 65 74 75  BIAS & 3))) retu
b140: 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72  rn 0;.#endif.  r
b150: 65 74 75 72 6e 20 28 28 69 73 5f 74 72 61 6d 70  eturn ((is_tramp
b160: 28 28 28 63 68 61 72 2a 29 66 75 6e 63 74 69 6f  (((char*)functio
b170: 6e 20 2d 20 54 52 41 4d 50 5f 42 49 41 53 29 29  n - TRAMP_BIAS))
b180: 29 20 3f 20 31 20 3a 20 30 29 3b 0a 23 65 6c 73  ) ? 1 : 0);.#els
b190: 65 0a 20 20 61 62 6f 72 74 28 29 3b 0a 23 65 6e  e.  abort();.#en
b1a0: 64 69 66 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e  dif.}..#if defin
b1b0: 65 64 28 5f 5f 53 54 44 43 5f 5f 29 20 7c 7c 20  ed(__STDC__) || 
b1c0: 64 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f  defined(__GNUC__
b1d0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 63  ) || defined(__c
b1e0: 70 6c 75 73 70 6c 75 73 29 0a 5f 5f 54 52 5f 66  plusplus).__TR_f
b1f0: 75 6e 63 74 69 6f 6e 20 74 72 61 6d 70 6f 6c 69  unction trampoli
b200: 6e 65 5f 61 64 64 72 65 73 73 20 28 76 6f 69 64  ne_address (void
b210: 2a 20 66 75 6e 63 74 69 6f 6e 29 0a 23 65 6c 73  * function).#els
b220: 65 0a 5f 5f 54 52 5f 66 75 6e 63 74 69 6f 6e 20  e.__TR_function 
b230: 74 72 61 6d 70 6f 6c 69 6e 65 5f 61 64 64 72 65  trampoline_addre
b240: 73 73 20 28 66 75 6e 63 74 69 6f 6e 29 0a 20 20  ss (function).  
b250: 76 6f 69 64 2a 20 66 75 6e 63 74 69 6f 6e 3b 0a  void* function;.
b260: 23 65 6e 64 69 66 0a 7b 0a 23 69 66 64 65 66 20  #endif.{.#ifdef 
b270: 74 72 61 6d 70 5f 61 64 64 72 65 73 73 0a 20 20  tramp_address.  
b280: 72 65 74 75 72 6e 20 28 5f 5f 54 52 5f 66 75 6e  return (__TR_fun
b290: 63 74 69 6f 6e 29 28 74 72 61 6d 70 5f 61 64 64  ction)(tramp_add
b2a0: 72 65 73 73 28 28 28 63 68 61 72 2a 29 66 75 6e  ress(((char*)fun
b2b0: 63 74 69 6f 6e 20 2d 20 54 52 41 4d 50 5f 42 49  ction - TRAMP_BI
b2c0: 41 53 29 29 29 3b 0a 23 65 6c 73 65 0a 20 20 61  AS)));.#else.  a
b2d0: 62 6f 72 74 28 29 3b 0a 23 65 6e 64 69 66 0a 7d  bort();.#endif.}
b2e0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
b2f0: 53 54 44 43 5f 5f 29 20 7c 7c 20 64 65 66 69 6e  STDC__) || defin
b300: 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 20 7c 7c 20  ed(__GNUC__) || 
b310: 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75 73 70  defined(__cplusp
b320: 6c 75 73 29 0a 76 6f 69 64 2a 20 74 72 61 6d 70  lus).void* tramp
b330: 6f 6c 69 6e 65 5f 76 61 72 69 61 62 6c 65 20 28  oline_variable (
b340: 76 6f 69 64 2a 20 66 75 6e 63 74 69 6f 6e 29 0a  void* function).
b350: 23 65 6c 73 65 0a 76 6f 69 64 2a 20 74 72 61 6d  #else.void* tram
b360: 70 6f 6c 69 6e 65 5f 76 61 72 69 61 62 6c 65 20  poline_variable 
b370: 28 66 75 6e 63 74 69 6f 6e 29 0a 20 20 76 6f 69  (function).  voi
b380: 64 2a 20 66 75 6e 63 74 69 6f 6e 3b 0a 23 65 6e  d* function;.#en
b390: 64 69 66 0a 7b 0a 23 69 66 64 65 66 20 74 72 61  dif.{.#ifdef tra
b3a0: 6d 70 5f 76 61 72 69 61 62 6c 65 0a 20 20 72 65  mp_variable.  re
b3b0: 74 75 72 6e 20 28 76 6f 69 64 2a 29 28 74 72 61  turn (void*)(tra
b3c0: 6d 70 5f 76 61 72 69 61 62 6c 65 28 28 28 63 68  mp_variable(((ch
b3d0: 61 72 2a 29 66 75 6e 63 74 69 6f 6e 20 2d 20 54  ar*)function - T
b3e0: 52 41 4d 50 5f 42 49 41 53 29 29 29 3b 0a 23 65  RAMP_BIAS)));.#e
b3f0: 6c 73 65 0a 20 20 61 62 6f 72 74 28 29 3b 0a 23  lse.  abort();.#
b400: 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 20 64 65 66  endif.}..#if def
b410: 69 6e 65 64 28 5f 5f 53 54 44 43 5f 5f 29 20 7c  ined(__STDC__) |
b420: 7c 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43  | defined(__GNUC
b430: 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  __) || defined(_
b440: 5f 63 70 6c 75 73 70 6c 75 73 29 0a 76 6f 69 64  _cplusplus).void
b450: 2a 20 74 72 61 6d 70 6f 6c 69 6e 65 5f 64 61 74  * trampoline_dat
b460: 61 20 28 76 6f 69 64 2a 20 66 75 6e 63 74 69 6f  a (void* functio
b470: 6e 29 0a 23 65 6c 73 65 0a 76 6f 69 64 2a 20 74  n).#else.void* t
b480: 72 61 6d 70 6f 6c 69 6e 65 5f 64 61 74 61 20 28  rampoline_data (
b490: 66 75 6e 63 74 69 6f 6e 29 0a 20 20 76 6f 69 64  function).  void
b4a0: 2a 20 66 75 6e 63 74 69 6f 6e 3b 0a 23 65 6e 64  * function;.#end
b4b0: 69 66 0a 7b 0a 23 69 66 64 65 66 20 74 72 61 6d  if.{.#ifdef tram
b4c0: 70 5f 64 61 74 61 0a 20 20 72 65 74 75 72 6e 20  p_data.  return 
b4d0: 28 76 6f 69 64 2a 29 28 74 72 61 6d 70 5f 64 61  (void*)(tramp_da
b4e0: 74 61 28 28 28 63 68 61 72 2a 29 66 75 6e 63 74  ta(((char*)funct
b4f0: 69 6f 6e 20 2d 20 54 52 41 4d 50 5f 42 49 41 53  ion - TRAMP_BIAS
b500: 29 29 29 3b 0a 23 65 6c 73 65 0a 20 20 61 62 6f  )));.#else.  abo
b510: 72 74 28 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a     rt();.#endif.}.