Artifact 2c1480c760d7e1bf7ba0360431c53c080ac2f377:


0000: 2f 2a 20 54 72 61 6d 70 6f 6c 69 6e 65 20 63 6f  /* Trampoline co
0010: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 2f  nstruction */../
0020: 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 31  *. * Copyright 1
0030: 39 39 35 2d 31 39 39 39 2c 20 32 30 30 31 2d 32  995-1999, 2001-2
0040: 30 30 36 20 42 72 75 6e 6f 20 48 61 69 62 6c 65  006 Bruno Haible
0050: 2c 20 3c 62 72 75 6e 6f 40 63 6c 69 73 70 2e 6f  , <bruno@clisp.o
0060: 72 67 3e 0a 20 2a 0a 20 2a 20 54 68 69 73 20 69  rg>. *. * This i
0070: 73 20 66 72 65 65 20 73 6f 66 74 77 61 72 65 20  s free software 
0080: 64 69 73 74 72 69 62 75 74 65 64 20 75 6e 64 65  distributed unde
0090: 72 20 74 68 65 20 47 4e 55 20 47 65 6e 65 72 61  r the GNU Genera
00a0: 6c 20 50 75 62 6c 69 63 20 4c 69 63 65 6e 63 65  l Public Licence
00b0: 0a 20 2a 20 64 65 73 63 72 69 62 65 64 20 69 6e  . * described in
00c0: 20 74 68 65 20 66 69 6c 65 20 43 4f 50 59 49 4e   the file COPYIN
00d0: 47 2e 20 43 6f 6e 74 61 63 74 20 74 68 65 20 61  G. Contact the a
00e0: 75 74 68 6f 72 20 69 66 20 79 6f 75 20 64 6f 6e  uthor if you don
00f0: 27 74 20 68 61 76 65 20 74 68 69 73 0a 20 2a 20  't have this. * 
0100: 6f 72 20 63 61 6e 27 74 20 6c 69 76 65 20 77 69  or can't live wi
0110: 74 68 20 69 74 2e 20 54 68 65 72 65 20 69 73 20  th it. There is 
0120: 41 42 53 4f 4c 55 54 45 4c 59 20 4e 4f 20 57 41  ABSOLUTELY NO WA
0130: 52 52 41 4e 54 59 2c 20 65 78 70 6c 69 63 69 74  RRANTY, explicit
0140: 20 6f 72 20 69 6d 70 6c 69 65 64 2c 0a 20 2a 20   or implied,. * 
0150: 6f 6e 20 74 68 69 73 20 73 6f 66 74 77 61 72 65  on this software
0160: 2e 0a 20 2a 2f 0a 0a 0a 23 69 6e 63 6c 75 64 65  .. */...#include
0170: 20 22 63 6f 6e 66 69 67 2e 68 22 0a 23 69 6e 63   "config.h".#inc
0180: 6c 75 64 65 20 22 74 72 61 6d 70 6f 6c 69 6e 65  lude "trampoline
0190: 5f 72 2e 68 22 0a 0a 23 69 66 20 64 65 66 69 6e  _r.h"..#if defin
01a0: 65 64 28 5f 5f 68 70 70 61 5f 5f 29 0a 23 69 66  ed(__hppa__).#if
01b0: 20 30 0a 23 64 65 66 69 6e 65 20 5f 5f 68 70 70   0.#define __hpp
01c0: 61 6f 6c 64 5f 5f 20 20 2f 2a 20 4f 6c 64 20 74  aold__  /* Old t
01d0: 72 61 6d 70 6f 6c 69 6e 65 2c 20 72 65 61 6c 20  rampoline, real 
01e0: 6d 61 63 68 69 6e 65 20 63 6f 64 65 2e 20 2a 2f  machine code. */
01f0: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 5f  .#else.#define _
0200: 5f 68 70 70 61 6e 65 77 5f 5f 20 20 2f 2a 20 4e  _hppanew__  /* N
0210: 65 77 20 74 72 61 6d 70 6f 6c 69 6e 65 2c 20 6a  ew trampoline, j
0220: 75 73 74 20 61 20 63 6c 6f 73 75 72 65 2e 20 2a  ust a closure. *
0230: 2f 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  /.#endif.#endif.
0240: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 70 6f  #if defined(__po
0250: 77 65 72 70 63 5f 5f 29 20 26 26 20 21 64 65 66  werpc__) && !def
0260: 69 6e 65 64 28 5f 5f 70 6f 77 65 72 70 63 36 34  ined(__powerpc64
0270: 5f 5f 29 0a 23 69 66 20 21 64 65 66 69 6e 65 64  __).#if !defined
0280: 28 5f 41 49 58 29 0a 23 64 65 66 69 6e 65 20 5f  (_AIX).#define _
0290: 5f 70 6f 77 65 72 70 63 73 79 73 76 34 5f 5f 20  _powerpcsysv4__ 
02a0: 20 2f 2a 20 53 79 73 56 2e 34 20 41 42 49 2c 20   /* SysV.4 ABI, 
02b0: 72 65 61 6c 20 6d 61 63 68 69 6e 65 20 63 6f 64  real machine cod
02c0: 65 2e 20 2a 2f 0a 23 65 6c 73 65 0a 23 64 65 66  e. */.#else.#def
02d0: 69 6e 65 20 5f 5f 70 6f 77 65 72 70 63 61 69 78  ine __powerpcaix
02e0: 5f 5f 20 20 2f 2a 20 41 49 58 20 41 42 49 2c 20  __  /* AIX ABI, 
02f0: 6a 75 73 74 20 61 20 63 6c 6f 73 75 72 65 2e 20  just a closure. 
0300: 2a 2f 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66  */.#endif.#endif
0310: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 70  .#if defined(__p
0320: 6f 77 65 72 70 63 36 34 5f 5f 29 0a 2f 2a 20 54  owerpc64__)./* T
0330: 68 65 20 6f 6e 6c 79 20 41 42 49 20 6f 6e 20 70  he only ABI on p
0340: 6f 77 65 72 70 63 36 34 20 6b 6e 6f 77 6e 20 73  owerpc64 known s
0350: 6f 20 66 61 72 20 69 73 20 74 68 65 20 41 49 58  o far is the AIX
0360: 20 41 42 49 2e 20 2a 2f 0a 23 64 65 66 69 6e 65   ABI. */.#define
0370: 20 5f 5f 70 6f 77 65 72 70 63 36 34 61 69 78 5f   __powerpc64aix_
0380: 5f 20 20 2f 2a 20 41 49 58 20 41 42 49 2c 20 6a  _  /* AIX ABI, j
0390: 75 73 74 20 61 20 63 6c 6f 73 75 72 65 2e 20 2a  ust a closure. *
03a0: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  /.#endif.#if def
03b0: 69 6e 65 64 28 5f 5f 68 70 70 61 6e 65 77 5f 5f  ined(__hppanew__
03c0: 29 0a 2f 2a 0a 20 2a 20 41 20 66 75 6e 63 74 69  )./*. * A functi
03d0: 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 20 61 20  on pointer is a 
03e0: 62 69 61 73 65 64 20 70 6f 69 6e 74 65 72 20 74  biased pointer t
03f0: 6f 20 61 20 64 61 74 61 20 61 72 65 61 20 77 68  o a data area wh
0400: 6f 73 65 20 66 69 72 73 74 20 77 6f 72 64 0a 20  ose first word. 
0410: 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 61  * contains the a
0420: 63 74 75 61 6c 20 61 64 64 72 65 73 73 20 6f 66  ctual address of
0430: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 20   the function.. 
0440: 2a 2f 0a 65 78 74 65 72 6e 20 76 6f 69 64 20 74  */.extern void t
0450: 72 61 6d 70 5f 72 20 28 29 3b 20 2f 2a 20 74 72  ramp_r (); /* tr
0460: 61 6d 70 6f 6c 69 6e 65 20 70 72 6f 74 6f 74 79  ampoline prototy
0470: 70 65 20 2a 2f 0a 2f 2a 20 57 65 20 64 6f 6e 27  pe */./* We don'
0480: 74 20 6e 65 65 64 20 74 6f 20 74 61 6b 65 20 61  t need to take a
0490: 6e 79 20 73 70 65 63 69 61 6c 20 6d 65 61 73 75  ny special measu
04a0: 72 65 73 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  res to make the 
04b0: 63 6f 64 65 20 65 78 65 63 75 74 61 62 6c 65 0a  code executable.
04c0: 20 2a 20 73 69 6e 63 65 20 74 68 65 20 61 63 74   * since the act
04d0: 75 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ual instructions
04e0: 20 61 72 65 20 69 6e 20 74 68 65 20 74 65 78 74   are in the text
04f0: 20 73 65 67 6d 65 6e 74 2e 0a 20 2a 2f 0a 23 69   segment.. */.#i
0500: 66 6e 64 65 66 20 43 4f 44 45 5f 45 58 45 43 55  fndef CODE_EXECU
0510: 54 41 42 4c 45 0a 23 64 65 66 69 6e 65 20 43 4f  TABLE.#define CO
0520: 44 45 5f 45 58 45 43 55 54 41 42 4c 45 0a 23 65  DE_EXECUTABLE.#e
0530: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 20  ndif.#endif.#if 
0540: 64 65 66 69 6e 65 64 28 5f 5f 70 6f 77 65 72 70  defined(__powerp
0550: 63 61 69 78 5f 5f 29 20 7c 7c 20 64 65 66 69 6e  caix__) || defin
0560: 65 64 28 5f 5f 70 6f 77 65 72 70 63 36 34 61 69  ed(__powerpc64ai
0570: 78 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  x__) || defined(
0580: 5f 5f 69 61 36 34 5f 5f 29 0a 2f 2a 0a 20 2a 20  __ia64__)./*. * 
0590: 41 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74  A function point
05a0: 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  er is a pointer 
05b0: 74 6f 20 61 20 64 61 74 61 20 61 72 65 61 20 77  to a data area w
05c0: 68 6f 73 65 20 66 69 72 73 74 20 77 6f 72 64 20  hose first word 
05d0: 63 6f 6e 74 61 69 6e 73 0a 20 2a 20 74 68 65 20  contains. * the 
05e0: 61 63 74 75 61 6c 20 61 64 64 72 65 73 73 20 6f  actual address o
05f0: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a  f the function..
0600: 20 2a 2f 0a 65 78 74 65 72 6e 20 76 6f 69 64 20   */.extern void 
0610: 28 2a 74 72 61 6d 70 5f 72 29 20 28 29 3b 20 2f  (*tramp_r) (); /
0620: 2a 20 74 72 61 6d 70 6f 6c 69 6e 65 20 70 72 6f  * trampoline pro
0630: 74 6f 74 79 70 65 20 2a 2f 0a 2f 2a 20 57 65 20  totype */./* We 
0640: 64 6f 6e 27 74 20 6e 65 65 64 20 74 6f 20 74 61  don't need to ta
0650: 6b 65 20 61 6e 79 20 73 70 65 63 69 61 6c 20 6d  ke any special m
0660: 65 61 73 75 72 65 73 20 74 6f 20 6d 61 6b 65 20  easures to make 
0670: 74 68 65 20 63 6f 64 65 20 65 78 65 63 75 74 61  the code executa
0680: 62 6c 65 0a 20 2a 20 73 69 6e 63 65 20 74 68 65  ble. * since the
0690: 20 61 63 74 75 61 6c 20 69 6e 73 74 72 75 63 74   actual instruct
06a0: 69 6f 6e 73 20 61 72 65 20 69 6e 20 74 68 65 20  ions are in the 
06b0: 74 65 78 74 20 73 65 67 6d 65 6e 74 2e 0a 20 2a  text segment.. *
06c0: 2f 0a 23 69 66 6e 64 65 66 20 43 4f 44 45 5f 45  /.#ifndef CODE_E
06d0: 58 45 43 55 54 41 42 4c 45 0a 23 64 65 66 69 6e  XECUTABLE.#defin
06e0: 65 20 43 4f 44 45 5f 45 58 45 43 55 54 41 42 4c  e CODE_EXECUTABL
06f0: 45 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  E.#endif.#endif.
0700: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 6d 36  #if defined(__m6
0710: 38 6b 5f 5f 29 0a 23 69 66 20 64 65 66 69 6e 65  8k__).#if define
0720: 64 28 41 4d 49 47 41 29 20 2f 2a 20 41 6d 69 67  d(AMIGA) /* Amig
0730: 61 20 72 75 6e 6e 69 6e 67 20 41 6d 69 67 61 4f  a running AmigaO
0740: 53 2c 20 6e 6f 74 20 4c 69 6e 75 78 20 2a 2f 0a  S, not Linux */.
0750: 23 69 66 6e 64 65 66 20 43 4f 44 45 5f 45 58 45  #ifndef CODE_EXE
0760: 43 55 54 41 42 4c 45 20 2f 2a 20 63 6f 6e 66 69  CUTABLE /* confi
0770: 67 75 72 65 20 67 75 65 73 73 65 73 20 77 72 6f  gure guesses wro
0780: 6e 67 3f 3f 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ng?? */.#define 
0790: 43 4f 44 45 5f 45 58 45 43 55 54 41 42 4c 45 0a  CODE_EXECUTABLE.
07a0: 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 65  #endif.#endif.#e
07b0: 6e 64 69 66 0a 0a 2f 2a 20 41 73 20 6f 66 20 57  ndif../* As of W
07c0: 69 6e 64 6f 77 73 20 58 50 20 53 50 20 32 2c 20  indows XP SP 2, 
07d0: 6d 61 6c 6c 6f 63 27 64 20 6d 65 6d 6f 72 79 20  malloc'd memory 
07e0: 69 73 20 6e 6f 74 20 65 78 65 63 75 74 61 62 6c  is not executabl
07f0: 65 20 2a 2f 0a 23 69 66 64 65 66 20 5f 57 49 4e  e */.#ifdef _WIN
0800: 33 32 0a 23 75 6e 64 65 66 20 43 4f 44 45 5f 45  32.#undef CODE_E
0810: 58 45 43 55 54 41 42 4c 45 0a 23 65 6e 64 69 66  XECUTABLE.#endif
0820: 0a 0a 23 69 66 6e 64 65 66 20 43 4f 44 45 5f 45  ..#ifndef CODE_E
0830: 58 45 43 55 54 41 42 4c 45 0a 2f 2a 20 48 6f 77  XECUTABLE./* How
0840: 20 64 6f 20 77 65 20 6d 61 6b 65 20 74 68 65 20   do we make the 
0850: 74 72 61 6d 70 6f 6c 69 6e 65 27 73 20 63 6f 64  trampoline's cod
0860: 65 20 65 78 65 63 75 74 61 62 6c 65 3f 20 2a 2f  e executable? */
0870: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56  .#if defined(HAV
0880: 45 5f 4d 41 43 48 5f 56 4d 29 20 7c 7c 20 64 65  E_MACH_VM) || de
0890: 66 69 6e 65 64 28 5f 5f 63 6f 6e 76 65 78 5f 5f  fined(__convex__
08a0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 48 41 56  ) || defined(HAV
08b0: 45 5f 57 4f 52 4b 49 4e 47 5f 4d 50 52 4f 54 45  E_WORKING_MPROTE
08c0: 43 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 48  CT) || defined(H
08d0: 41 56 45 5f 53 59 53 5f 4d 38 38 4b 42 43 53 5f  AVE_SYS_M88KBCS_
08e0: 48 29 0a 2f 2a 20 6d 70 72 6f 74 65 63 74 28 29  H)./* mprotect()
08f0: 20 5b 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 5d   [or equivalent]
0900: 20 74 68 65 20 6d 61 6c 6c 6f 63 27 65 64 20 61   the malloc'ed a
0910: 72 65 61 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20  rea. */.#define 
0920: 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41 5f 4d  EXECUTABLE_VIA_M
0930: 50 52 4f 54 45 43 54 0a 23 65 6c 73 65 0a 23 69  PROTECT.#else.#i
0940: 66 64 65 66 20 48 41 56 45 5f 4d 4d 41 50 0a 2f  fdef HAVE_MMAP./
0950: 2a 20 55 73 65 20 61 6e 20 6d 6d 61 70 27 65 64  * Use an mmap'ed
0960: 20 70 61 67 65 2e 20 2a 2f 0a 23 64 65 66 69 6e   page. */.#defin
0970: 65 20 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41  e EXECUTABLE_VIA
0980: 5f 4d 4d 41 50 0a 23 69 66 64 65 66 20 48 41 56  _MMAP.#ifdef HAV
0990: 45 5f 4d 4d 41 50 5f 41 4e 4f 4e 59 4d 4f 55 53  E_MMAP_ANONYMOUS
09a0: 0a 2f 2a 20 55 73 65 20 6d 6d 61 70 20 77 69 74  ./* Use mmap wit
09b0: 68 20 74 68 65 20 4d 41 50 5f 41 4e 4f 4e 59 4d  h the MAP_ANONYM
09c0: 4f 55 53 20 6f 72 20 4d 41 50 5f 41 4e 4f 4e 20  OUS or MAP_ANON 
09d0: 66 6c 61 67 2e 20 2a 2f 0a 23 64 65 66 69 6e 65  flag. */.#define
09e0: 20 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41 5f   EXECUTABLE_VIA_
09f0: 4d 4d 41 50 5f 41 4e 4f 4e 59 4d 4f 55 53 0a 23  MMAP_ANONYMOUS.#
0a00: 65 6c 73 65 0a 2f 2a 20 55 73 65 20 6d 6d 61 70  else./* Use mmap
0a10: 20 6f 6e 20 2f 64 65 76 2f 7a 65 72 6f 2e 20 2a   on /dev/zero. *
0a20: 2f 0a 23 64 65 66 69 6e 65 20 45 58 45 43 55 54  /.#define EXECUT
0a30: 41 42 4c 45 5f 56 49 41 5f 4d 4d 41 50 5f 44 45  ABLE_VIA_MMAP_DE
0a40: 56 5a 45 52 4f 0a 23 65 6e 64 69 66 0a 23 65 6c  VZERO.#endif.#el
0a50: 73 65 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53  se.#ifdef HAVE_S
0a60: 48 4d 0a 2f 2a 20 55 73 65 20 61 6e 20 73 68 6d  HM./* Use an shm
0a70: 61 74 27 65 64 20 70 61 67 65 2e 20 2a 2f 0a 23  at'ed page. */.#
0a80: 64 65 66 69 6e 65 20 45 58 45 43 55 54 41 42 4c  define EXECUTABL
0a90: 45 5f 56 49 41 5f 53 48 4d 0a 23 65 6c 73 65 0a  E_VIA_SHM.#else.
0aa0: 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 2f 2a  #ifdef _WIN32./*
0ab0: 20 55 73 65 20 56 69 72 74 75 61 6c 41 6c 6c 6f   Use VirtualAllo
0ac0: 63 20 2a 2f 0a 23 65 6c 73 65 0a 3f 3f 0a 23 65  c */.#else.??.#e
0ad0: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 65 6e 64  ndif.#endif.#end
0ae0: 69 66 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66  if.#endif.#endif
0af0: 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69  ..#include <stdi
0b00: 6f 2e 68 3e 20 2f 2a 20 64 65 63 6c 61 72 65 73  o.h> /* declares
0b10: 20 66 70 72 69 6e 74 66 28 29 20 2a 2f 0a 0a 23   fprintf() */..#
0b20: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70  include <sys/typ
0b30: 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  es.h>.#include <
0b40: 73 74 64 6c 69 62 2e 68 3e 20 2f 2a 20 64 65 63  stdlib.h> /* dec
0b50: 6c 61 72 65 73 20 61 62 6f 72 74 28 29 2c 20 6d  lares abort(), m
0b60: 61 6c 6c 6f 63 28 29 2c 20 66 72 65 65 28 29 20  alloc(), free() 
0b70: 2a 2f 0a 23 69 66 64 65 66 20 48 41 56 45 5f 55  */.#ifdef HAVE_U
0b80: 4e 49 53 54 44 5f 48 0a 23 69 6e 63 6c 75 64 65  NISTD_H.#include
0b90: 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 65 6e 64   <unistd.h>.#end
0ba0: 69 66 0a 0a 2f 2a 20 44 65 63 6c 61 72 65 20 67  if../* Declare g
0bb0: 65 74 70 61 67 65 73 69 7a 65 28 29 2e 20 2a 2f  etpagesize(). */
0bc0: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 47 45 54  .#ifdef HAVE_GET
0bd0: 50 41 47 45 53 49 5a 45 0a 23 69 66 64 65 66 20  PAGESIZE.#ifdef 
0be0: 5f 5f 63 70 6c 75 73 70 6c 75 73 0a 65 78 74 65  __cplusplus.exte
0bf0: 72 6e 20 22 43 22 20 52 45 54 47 45 54 50 41 47  rn "C" RETGETPAG
0c00: 45 53 49 5a 45 54 59 50 45 20 67 65 74 70 61 67  ESIZETYPE getpag
0c10: 65 73 69 7a 65 20 28 76 6f 69 64 29 3b 0a 23 65  esize (void);.#e
0c20: 6c 73 65 0a 65 78 74 65 72 6e 20 52 45 54 47 45  lse.extern RETGE
0c30: 54 50 41 47 45 53 49 5a 45 54 59 50 45 20 67 65  TPAGESIZETYPE ge
0c40: 74 70 61 67 65 73 69 7a 65 20 28 76 6f 69 64 29  tpagesize (void)
0c50: 3b 0a 23 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23  ;.#endif.#else.#
0c60: 69 66 64 65 66 20 48 41 56 45 5f 53 59 53 5f 50  ifdef HAVE_SYS_P
0c70: 41 52 41 4d 5f 48 0a 23 69 6e 63 6c 75 64 65 20  ARAM_H.#include 
0c80: 3c 73 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 65  <sys/param.h>.#e
0c90: 6c 73 65 0a 2f 2a 20 4e 6f 74 20 55 6e 69 78 2c  lse./* Not Unix,
0ca0: 20 65 2e 67 2e 20 6d 69 6e 67 77 33 32 20 2a 2f   e.g. mingw32 */
0cb0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 53 49 5a  .#define PAGESIZ
0cc0: 45 20 34 30 39 36 0a 23 65 6e 64 69 66 0a 23 64  E 4096.#endif.#d
0cd0: 65 66 69 6e 65 20 67 65 74 70 61 67 65 73 69 7a  efine getpagesiz
0ce0: 65 28 29 20 50 41 47 45 53 49 5a 45 0a 23 65 6e  e() PAGESIZE.#en
0cf0: 64 69 66 0a 0a 2f 2a 20 44 65 63 6c 61 72 65 20  dif../* Declare 
0d00: 6d 70 72 6f 74 65 63 74 28 29 20 6f 72 20 65 71  mprotect() or eq
0d10: 75 69 76 61 6c 65 6e 74 2e 20 2a 2f 0a 23 69 66  uivalent. */.#if
0d20: 64 65 66 20 45 58 45 43 55 54 41 42 4c 45 5f 56  def EXECUTABLE_V
0d30: 49 41 5f 4d 50 52 4f 54 45 43 54 0a 23 69 66 64  IA_MPROTECT.#ifd
0d40: 65 66 20 48 41 56 45 5f 4d 41 43 48 5f 56 4d 0a  ef HAVE_MACH_VM.
0d50: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 72 65  #include <sys/re
0d60: 73 6f 75 72 63 65 2e 68 3e 0a 23 69 6e 63 6c 75  source.h>.#inclu
0d70: 64 65 20 3c 6d 61 63 68 2f 6d 61 63 68 5f 69 6e  de <mach/mach_in
0d80: 74 65 72 66 61 63 65 2e 68 3e 0a 23 69 66 64 65  terface.h>.#ifde
0d90: 66 20 4e 65 58 54 0a 23 69 6e 63 6c 75 64 65 20  f NeXT.#include 
0da0: 3c 6d 61 63 68 2f 6d 61 63 68 5f 69 6e 69 74 2e  <mach/mach_init.
0db0: 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  h>.#endif.#ifdef
0dc0: 20 5f 5f 6f 73 66 5f 5f 0a 23 69 6e 63 6c 75 64   __osf__.#includ
0dd0: 65 20 3c 6d 61 63 68 5f 69 6e 69 74 2e 68 3e 0a  e <mach_init.h>.
0de0: 23 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20  #endif.#include 
0df0: 3c 6d 61 63 68 2f 6d 61 63 68 69 6e 65 2f 76 6d  <mach/machine/vm
0e00: 5f 70 61 72 61 6d 2e 68 3e 0a 23 65 6c 73 65 0a  _param.h>.#else.
0e10: 23 69 66 64 65 66 20 48 41 56 45 5f 53 59 53 5f  #ifdef HAVE_SYS_
0e20: 4d 38 38 4b 42 43 53 5f 48 0a 23 69 6e 63 6c 75  M88KBCS_H.#inclu
0e30: 64 65 20 3c 73 79 73 2f 6d 38 38 6b 62 63 73 2e  de <sys/m88kbcs.
0e40: 68 3e 0a 23 64 65 66 69 6e 65 20 67 65 74 70 61  h>.#define getpa
0e50: 67 65 73 69 7a 65 28 29 20 20 34 30 39 36 20 20  gesize()  4096  
0e60: 2f 2a 20 3f 3f 20 2a 2f 0a 23 65 6c 73 65 0a 23  /* ?? */.#else.#
0e70: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70  include <sys/typ
0e80: 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  es.h>.#include <
0e90: 73 79 73 2f 6d 6d 61 6e 2e 68 3e 0a 23 65 6e 64  sys/mman.h>.#end
0ea0: 69 66 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66  if.#endif.#endif
0eb0: 0a 0a 2f 2a 20 44 65 63 6c 61 72 65 20 6d 6d 61  ../* Declare mma
0ec0: 70 28 29 2e 20 2a 2f 0a 23 69 66 64 65 66 20 45  p(). */.#ifdef E
0ed0: 58 45 43 55 54 41 42 4c 45 5f 56 49 41 5f 4d 4d  XECUTABLE_VIA_MM
0ee0: 41 50 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  AP.#include <sys
0ef0: 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75  /types.h>.#inclu
0f00: 64 65 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68 3e 0a  de <sys/mman.h>.
0f10: 23 69 66 20 21 64 65 66 69 6e 65 64 28 50 52 4f  #if !defined(PRO
0f20: 54 5f 45 58 45 43 29 20 26 26 20 64 65 66 69 6e  T_EXEC) && defin
0f30: 65 64 28 50 52 4f 54 5f 45 58 45 43 55 54 45 29  ed(PROT_EXECUTE)
0f40: 20 2f 2a 20 49 72 69 78 20 34 2e 30 2e 35 20 6e   /* Irix 4.0.5 n
0f50: 65 65 64 73 20 74 68 69 73 20 2a 2f 0a 23 64 65  eeds this */.#de
0f60: 66 69 6e 65 20 50 52 4f 54 5f 45 58 45 43 20 50  fine PROT_EXEC P
0f70: 52 4f 54 5f 45 58 45 43 55 54 45 0a 23 65 6e 64  ROT_EXECUTE.#end
0f80: 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 44 65  if.#endif../* De
0f90: 63 6c 61 72 65 20 6f 70 65 6e 28 29 2e 20 2a 2f  clare open(). */
0fa0: 0a 23 69 66 64 65 66 20 45 58 45 43 55 54 41 42  .#ifdef EXECUTAB
0fb0: 4c 45 5f 56 49 41 5f 4d 4d 41 50 5f 44 45 56 5a  LE_VIA_MMAP_DEVZ
0fc0: 45 52 4f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  ERO.#include <sy
0fd0: 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c  s/types.h>.#incl
0fe0: 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23  ude <unistd.h>.#
0ff0: 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c 2e 68  include <fcntl.h
1000: 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 44 65 63  >.#endif../* Dec
1010: 6c 61 72 65 20 73 68 6d 67 65 74 28 29 2c 20 73  lare shmget(), s
1020: 68 6d 61 74 28 29 2c 20 73 68 6d 63 74 6c 28 29  hmat(), shmctl()
1030: 2e 20 2a 2f 0a 23 69 66 64 65 66 20 45 58 45 43  . */.#ifdef EXEC
1040: 55 54 41 42 4c 45 5f 56 49 41 5f 53 48 4d 0a 23  UTABLE_VIA_SHM.#
1050: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70  include <sys/typ
1060: 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  es.h>.#include <
1070: 73 79 73 2f 69 70 63 2e 68 3e 0a 23 69 6e 63 6c  sys/ipc.h>.#incl
1080: 75 64 65 20 3c 73 79 73 2f 73 68 6d 2e 68 3e 0a  ude <sys/shm.h>.
1090: 23 69 66 64 65 66 20 48 41 56 45 5f 53 59 53 5f  #ifdef HAVE_SYS_
10a0: 53 59 53 4d 41 43 52 4f 53 5f 48 0a 23 69 6e 63  SYSMACROS_H.#inc
10b0: 6c 75 64 65 20 3c 73 79 73 2f 73 79 73 6d 61 63  lude <sys/sysmac
10c0: 72 6f 73 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 65  ros.h>.#endif.#e
10d0: 6e 64 69 66 0a 0a 2f 2a 20 53 75 70 70 6f 72 74  ndif../* Support
10e0: 20 66 6f 72 20 69 6e 73 74 72 75 63 74 69 6f 6e   for instruction
10f0: 20 63 61 63 68 65 20 66 6c 75 73 68 2e 20 2a 2f   cache flush. */
1100: 0a 23 69 66 64 65 66 20 5f 5f 69 33 38 36 5f 5f  .#ifdef __i386__
1110: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49  .#if defined(_WI
1120: 4e 33 32 29 20 2f 2a 20 57 69 6e 64 6f 77 73 4e  N32) /* WindowsN
1130: 54 20 6f 72 20 57 69 6e 64 6f 77 73 39 35 20 2a  T or Windows95 *
1140: 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 33 32 5f  /.#define WIN32_
1150: 4c 45 41 4e 5f 41 4e 44 5f 4d 45 41 4e 0a 23 64  LEAN_AND_MEAN.#d
1160: 65 66 69 6e 65 20 57 49 4e 33 32 5f 45 58 54 52  efine WIN32_EXTR
1170: 41 5f 4c 45 41 4e 0a 23 69 6e 63 6c 75 64 65 20  A_LEAN.#include 
1180: 3c 77 69 6e 64 6f 77 73 2e 68 3e 0a 23 65 6e 64  <windows.h>.#end
1190: 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  if.#endif.#ifdef
11a0: 20 5f 5f 6d 36 38 6b 5f 5f 0a 23 69 66 20 64 65   __m68k__.#if de
11b0: 66 69 6e 65 64 28 41 4d 49 47 41 29 20 2f 2a 20  fined(AMIGA) /* 
11c0: 41 6d 69 67 61 20 72 75 6e 6e 69 6e 67 20 41 6d  Amiga running Am
11d0: 69 67 61 4f 53 2c 20 6e 6f 74 20 4c 69 6e 75 78  igaOS, not Linux
11e0: 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 65 78   */.#include <ex
11f0: 65 63 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63  ec/types.h>.#inc
1200: 6c 75 64 65 20 3c 65 78 65 63 2f 65 78 65 63 62  lude <exec/execb
1210: 61 73 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ase.h>.#include 
1220: 3c 70 72 6f 74 6f 2f 65 78 65 63 2e 68 3e 0a 23  <proto/exec.h>.#
1230: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 68 70 75  endif.#ifdef hpu
1240: 78 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  x.#include <sys/
1250: 63 61 63 68 65 2e 68 3e 0a 23 65 6e 64 69 66 0a  cache.h>.#endif.
1260: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
1270: 65 64 28 5f 5f 6d 69 70 73 5f 5f 29 20 7c 7c 20  ed(__mips__) || 
1280: 64 65 66 69 6e 65 64 28 5f 5f 6d 69 70 73 6e 33  defined(__mipsn3
1290: 32 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  2__) || defined(
12a0: 5f 5f 6d 69 70 73 36 34 5f 5f 29 0a 23 69 66 64  __mips64__).#ifd
12b0: 65 66 20 75 6c 74 72 69 78 0a 23 69 6e 63 6c 75  ef ultrix.#inclu
12c0: 64 65 20 3c 6d 69 70 73 2f 63 61 63 68 65 63 74  de <mips/cachect
12d0: 6c 2e 68 3e 0a 23 65 6c 73 65 0a 23 69 66 64 65  l.h>.#else.#ifde
12e0: 66 20 6c 69 6e 75 78 0a 23 69 6e 63 6c 75 64 65  f linux.#include
12f0: 20 3c 61 73 6d 2f 63 61 63 68 65 63 74 6c 2e 68   <asm/cachectl.h
1300: 3e 0a 23 65 6c 73 65 0a 23 69 66 64 65 66 20 48  >.#else.#ifdef H
1310: 41 56 45 5f 53 59 53 5f 43 41 43 48 45 43 54 4c  AVE_SYS_CACHECTL
1320: 5f 48 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  _H.#include <sys
1330: 2f 63 61 63 68 65 63 74 6c 2e 68 3e 0a 23 65 6e  /cachectl.h>.#en
1340: 64 69 66 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69  dif.#endif.#endi
1350: 66 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  f.#endif.#ifdef 
1360: 5f 5f 6d 38 38 6b 5f 5f 0a 23 69 6e 63 6c 75 64  __m88k__.#includ
1370: 65 20 3c 73 79 73 2f 73 79 73 6c 6f 63 61 6c 2e  e <sys/syslocal.
1380: 68 3e 0a 23 65 6e 64 69 66 0a 2f 2a 20 49 6e 6c  h>.#endif./* Inl
1390: 69 6e 65 20 61 73 73 65 6d 62 6c 79 20 66 75 6e  ine assembly fun
13a0: 63 74 69 6f 6e 20 66 6f 72 20 69 6e 73 74 72 75  ction for instru
13b0: 63 74 69 6f 6e 20 63 61 63 68 65 20 66 6c 75 73  ction cache flus
13c0: 68 2e 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  h. */.#if define
13d0: 64 28 5f 5f 73 70 61 72 63 5f 5f 29 20 7c 7c 20  d(__sparc__) || 
13e0: 64 65 66 69 6e 65 64 28 5f 5f 73 70 61 72 63 36  defined(__sparc6
13f0: 34 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  4__) || defined(
1400: 5f 5f 61 6c 70 68 61 5f 5f 29 20 7c 7c 20 64 65  __alpha__) || de
1410: 66 69 6e 65 64 28 5f 5f 68 70 70 61 6f 6c 64 5f  fined(__hppaold_
1420: 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f  _) || defined(__
1430: 70 6f 77 65 72 70 63 73 79 73 76 34 5f 5f 29 20  powerpcsysv4__) 
1440: 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 63 6f 6e  || defined(__con
1450: 76 65 78 5f 5f 29 0a 23 69 66 64 65 66 20 5f 5f  vex__).#ifdef __
1460: 47 4e 55 43 5f 5f 0a 65 78 74 65 72 6e 20 69 6e  GNUC__.extern in
1470: 6c 69 6e 65 0a 23 69 66 20 64 65 66 69 6e 65 64  line.#if defined
1480: 28 5f 5f 73 70 61 72 63 5f 5f 29 20 7c 7c 20 64  (__sparc__) || d
1490: 65 66 69 6e 65 64 28 5f 5f 73 70 61 72 63 36 34  efined(__sparc64
14a0: 5f 5f 29 0a 23 69 6e 63 6c 75 64 65 20 22 63 61  __).#include "ca
14b0: 63 68 65 2d 73 70 61 72 63 2e 63 22 0a 23 65 6e  che-sparc.c".#en
14c0: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 61 6c 70  dif.#ifdef __alp
14d0: 68 61 5f 5f 0a 23 69 6e 63 6c 75 64 65 20 22 63  ha__.#include "c
14e0: 61 63 68 65 2d 61 6c 70 68 61 2e 63 22 0a 23 65  ache-alpha.c".#e
14f0: 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 68 70  ndif.#ifdef __hp
1500: 70 61 5f 5f 0a 23 69 6e 63 6c 75 64 65 20 22 63  pa__.#include "c
1510: 61 63 68 65 2d 68 70 70 61 2e 63 22 0a 23 65 6e  ache-hppa.c".#en
1520: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
1530: 5f 5f 70 6f 77 65 72 70 63 5f 5f 29 20 26 26 20  __powerpc__) && 
1540: 21 64 65 66 69 6e 65 64 28 5f 5f 70 6f 77 65 72  !defined(__power
1550: 70 63 36 34 5f 5f 29 0a 23 69 6e 63 6c 75 64 65  pc64__).#include
1560: 20 22 63 61 63 68 65 2d 70 6f 77 65 72 70 63 2e   "cache-powerpc.
1570: 63 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  c".#endif.#ifdef
1580: 20 5f 5f 63 6f 6e 76 65 78 5f 5f 0a 23 69 6e 63   __convex__.#inc
1590: 6c 75 64 65 20 22 63 61 63 68 65 2d 63 6f 6e 76  lude "cache-conv
15a0: 65 78 2e 63 22 0a 23 65 6e 64 69 66 0a 23 65 6c  ex.c".#endif.#el
15b0: 73 65 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  se.#if defined(_
15c0: 5f 73 70 61 72 63 5f 5f 29 20 7c 7c 20 64 65 66  _sparc__) || def
15d0: 69 6e 65 64 28 5f 5f 73 70 61 72 63 36 34 5f 5f  ined(__sparc64__
15e0: 29 0a 65 78 74 65 72 6e 20 76 6f 69 64 20 5f 5f  ).extern void __
15f0: 54 52 5f 63 6c 65 61 72 5f 63 61 63 68 65 5f 34  TR_clear_cache_4
1600: 28 29 3b 0a 23 65 6c 73 65 0a 65 78 74 65 72 6e  ();.#else.extern
1610: 20 76 6f 69 64 20 5f 5f 54 52 5f 63 6c 65 61 72   void __TR_clear
1620: 5f 63 61 63 68 65 28 29 3b 0a 23 65 6e 64 69 66  _cache();.#endif
1630: 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a  .#endif.#endif..
1640: 2f 2a 20 4c 65 6e 67 74 68 20 61 6e 64 20 61 6c  /* Length and al
1650: 69 67 6e 6d 65 6e 74 20 6f 66 20 74 72 61 6d 70  ignment of tramp
1660: 6f 6c 69 6e 65 20 2a 2f 0a 23 69 66 64 65 66 20  oline */.#ifdef 
1670: 5f 5f 69 33 38 36 5f 5f 0a 23 64 65 66 69 6e 65  __i386__.#define
1680: 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 31 36   TRAMP_LENGTH 16
1690: 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 41  .#define TRAMP_A
16a0: 4c 49 47 4e 20 31 36 20 20 2f 2a 20 34 20 66 6f  LIGN 16  /* 4 fo
16b0: 72 20 61 20 69 33 38 36 2c 20 31 36 20 66 6f 72  r a i386, 16 for
16c0: 20 61 20 69 34 38 36 20 2a 2f 0a 23 65 6e 64 69   a i486 */.#endi
16d0: 66 0a 23 69 66 64 65 66 20 5f 5f 6d 36 38 6b 5f  f.#ifdef __m68k_
16e0: 5f 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f  _.#define TRAMP_
16f0: 4c 45 4e 47 54 48 20 31 34 0a 23 64 65 66 69 6e  LENGTH 14.#defin
1700: 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20 31 36  e TRAMP_ALIGN 16
1710: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
1720: 6e 65 64 28 5f 5f 6d 69 70 73 5f 5f 29 20 7c 7c  ned(__mips__) ||
1730: 20 64 65 66 69 6e 65 64 28 5f 5f 6d 69 70 73 6e   defined(__mipsn
1740: 33 32 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65  32__) && !define
1750: 64 28 5f 5f 6d 69 70 73 36 34 5f 5f 29 0a 23 64  d(__mips64__).#d
1760: 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47  efine TRAMP_LENG
1770: 54 48 20 32 34 0a 23 64 65 66 69 6e 65 20 54 52  TH 24.#define TR
1780: 41 4d 50 5f 41 4c 49 47 4e 20 34 0a 23 65 6e 64  AMP_ALIGN 4.#end
1790: 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d 69 70 73  if.#ifdef __mips
17a0: 36 34 6f 6c 64 5f 5f 0a 23 64 65 66 69 6e 65 20  64old__.#define 
17b0: 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 35 36 0a  TRAMP_LENGTH 56.
17c0: 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c  #define TRAMP_AL
17d0: 49 47 4e 20 34 0a 23 65 6e 64 69 66 0a 23 69 66  IGN 4.#endif.#if
17e0: 64 65 66 20 5f 5f 6d 69 70 73 36 34 5f 5f 0a 23  def __mips64__.#
17f0: 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e  define TRAMP_LEN
1800: 47 54 48 20 33 32 0a 23 64 65 66 69 6e 65 20 54  GTH 32.#define T
1810: 52 41 4d 50 5f 41 4c 49 47 4e 20 38 0a 23 65 6e  RAMP_ALIGN 8.#en
1820: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
1830: 5f 5f 73 70 61 72 63 5f 5f 29 20 26 26 20 21 64  __sparc__) && !d
1840: 65 66 69 6e 65 64 28 5f 5f 73 70 61 72 63 36 34  efined(__sparc64
1850: 5f 5f 29 0a 23 64 65 66 69 6e 65 20 54 52 41 4d  __).#define TRAM
1860: 50 5f 4c 45 4e 47 54 48 20 31 36 0a 23 64 65 66  P_LENGTH 16.#def
1870: 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20  ine TRAMP_ALIGN 
1880: 31 36 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  16.#endif.#ifdef
1890: 20 5f 5f 73 70 61 72 63 36 34 5f 5f 0a 23 64 65   __sparc64__.#de
18a0: 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47 54  fine TRAMP_LENGT
18b0: 48 20 33 32 0a 23 64 65 66 69 6e 65 20 54 52 41  H 32.#define TRA
18c0: 4d 50 5f 41 4c 49 47 4e 20 31 36 0a 23 65 6e 64  MP_ALIGN 16.#end
18d0: 69 66 0a 23 69 66 64 65 66 20 5f 5f 61 6c 70 68  if.#ifdef __alph
18e0: 61 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52 41 4d  a__.#define TRAM
18f0: 50 5f 4c 45 4e 47 54 48 20 33 32 0a 23 64 65 66  P_LENGTH 32.#def
1900: 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20  ine TRAMP_ALIGN 
1910: 38 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  8.#endif.#ifdef 
1920: 5f 5f 68 70 70 61 6f 6c 64 5f 5f 0a 23 64 65 66  __hppaold__.#def
1930: 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48  ine TRAMP_LENGTH
1940: 20 34 38 0a 23 64 65 66 69 6e 65 20 54 52 41 4d   48.#define TRAM
1950: 50 5f 41 4c 49 47 4e 20 31 36 0a 23 65 6e 64 69  P_ALIGN 16.#endi
1960: 66 0a 23 69 66 64 65 66 20 5f 5f 68 70 70 61 6e  f.#ifdef __hppan
1970: 65 77 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52 41  ew__.#define TRA
1980: 4d 50 5f 4c 45 4e 47 54 48 20 31 36 0a 23 64 65  MP_LENGTH 16.#de
1990: 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e  fine TRAMP_ALIGN
19a0: 20 31 36 0a 23 64 65 66 69 6e 65 20 54 52 41 4d   16.#define TRAM
19b0: 50 5f 42 49 41 53 20 32 0a 23 65 6e 64 69 66 0a  P_BIAS 2.#endif.
19c0: 23 69 66 64 65 66 20 5f 5f 61 72 6d 5f 5f 0a 23  #ifdef __arm__.#
19d0: 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e  define TRAMP_LEN
19e0: 47 54 48 20 31 36 0a 23 64 65 66 69 6e 65 20 54  GTH 16.#define T
19f0: 52 41 4d 50 5f 41 4c 49 47 4e 20 34 0a 23 65 6e  RAMP_ALIGN 4.#en
1a00: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 70 6f 77  dif.#ifdef __pow
1a10: 65 72 70 63 73 79 73 76 34 5f 5f 0a 23 64 65 66  erpcsysv4__.#def
1a20: 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48  ine TRAMP_LENGTH
1a30: 20 32 34 0a 23 64 65 66 69 6e 65 20 54 52 41 4d   24.#define TRAM
1a40: 50 5f 41 4c 49 47 4e 20 34 0a 23 65 6e 64 69 66  P_ALIGN 4.#endif
1a50: 0a 23 69 66 64 65 66 20 5f 5f 70 6f 77 65 72 70  .#ifdef __powerp
1a60: 63 61 69 78 5f 5f 0a 23 64 65 66 69 6e 65 20 54  caix__.#define T
1a70: 52 41 4d 50 5f 4c 45 4e 47 54 48 20 32 30 0a 23  RAMP_LENGTH 20.#
1a80: 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49  define TRAMP_ALI
1a90: 47 4e 20 34 0a 23 65 6e 64 69 66 0a 23 69 66 64  GN 4.#endif.#ifd
1aa0: 65 66 20 5f 5f 70 6f 77 65 72 70 63 36 34 61 69  ef __powerpc64ai
1ab0: 78 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52 41 4d  x__.#define TRAM
1ac0: 50 5f 4c 45 4e 47 54 48 20 34 30 0a 23 64 65 66  P_LENGTH 40.#def
1ad0: 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20  ine TRAMP_ALIGN 
1ae0: 38 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  8.#endif.#ifdef 
1af0: 5f 5f 6d 38 38 6b 5f 5f 0a 23 64 65 66 69 6e 65  __m88k__.#define
1b00: 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 32 30   TRAMP_LENGTH 20
1b10: 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 41  .#define TRAMP_A
1b20: 4c 49 47 4e 20 38 0a 23 65 6e 64 69 66 0a 23 69  LIGN 8.#endif.#i
1b30: 66 64 65 66 20 5f 5f 63 6f 6e 76 65 78 5f 5f 0a  fdef __convex__.
1b40: 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45  #define TRAMP_LE
1b50: 4e 47 54 48 20 31 34 0a 23 64 65 66 69 6e 65 20  NGTH 14.#define 
1b60: 54 52 41 4d 50 5f 41 4c 49 47 4e 20 34 0a 23 65  TRAMP_ALIGN 4.#e
1b70: 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 69 61  ndif.#ifdef __ia
1b80: 36 34 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52 41  64__.#define TRA
1b90: 4d 50 5f 4c 45 4e 47 54 48 20 33 32 0a 23 64 65  MP_LENGTH 32.#de
1ba0: 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e  fine TRAMP_ALIGN
1bb0: 20 31 36 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   16.#endif.#ifde
1bc0: 66 20 5f 5f 78 38 36 5f 36 34 5f 5f 0a 23 64 65  f __x86_64__.#de
1bd0: 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47 54  fine TRAMP_LENGT
1be0: 48 20 32 32 0a 23 64 65 66 69 6e 65 20 54 52 41  H 22.#define TRA
1bf0: 4d 50 5f 41 4c 49 47 4e 20 31 36 0a 23 65 6e 64  MP_ALIGN 16.#end
1c00: 69 66 0a 23 69 66 64 65 66 20 5f 5f 73 33 39 30  if.#ifdef __s390
1c10: 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50  __.#define TRAMP
1c20: 5f 4c 45 4e 47 54 48 20 32 32 0a 23 64 65 66 69  _LENGTH 22.#defi
1c30: 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20 32  ne TRAMP_ALIGN 2
1c40: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
1c50: 20 54 52 41 4d 50 5f 42 49 41 53 0a 23 64 65 66   TRAMP_BIAS.#def
1c60: 69 6e 65 20 54 52 41 4d 50 5f 42 49 41 53 20 30  ine TRAMP_BIAS 0
1c70: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
1c80: 20 54 52 41 4d 50 5f 54 4f 54 41 4c 5f 4c 45 4e   TRAMP_TOTAL_LEN
1c90: 47 54 48 20 28 54 52 41 4d 50 5f 4c 45 4e 47 54  GTH (TRAMP_LENGT
1ca0: 48 20 2b 20 32 2a 73 69 7a 65 6f 66 28 76 6f 69  H + 2*sizeof(voi
1cb0: 64 2a 29 29 0a 0a 23 69 66 20 21 64 65 66 69 6e  d*))..#if !defin
1cc0: 65 64 28 43 4f 44 45 5f 45 58 45 43 55 54 41 42  ed(CODE_EXECUTAB
1cd0: 4c 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  LE) && !defined(
1ce0: 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41 5f 4d  EXECUTABLE_VIA_M
1cf0: 50 52 4f 54 45 43 54 29 0a 2f 2a 20 41 49 58 20  PROTECT)./* AIX 
1d00: 64 6f 65 73 6e 27 74 20 73 75 70 70 6f 72 74 20  doesn't support 
1d10: 6d 70 72 6f 74 65 63 74 28 29 20 69 6e 20 6d 61  mprotect() in ma
1d20: 6c 6c 6f 63 27 65 64 20 6d 65 6d 6f 72 79 2e 20  lloc'ed memory. 
1d30: 4d 75 73 74 20 67 65 74 20 70 61 67 65 73 20 6f  Must get pages o
1d40: 66 0a 20 2a 20 6d 65 6d 6f 72 79 20 77 69 74 68  f. * memory with
1d50: 20 65 78 65 63 75 74 65 20 70 65 72 6d 69 73 73   execute permiss
1d60: 69 6f 6e 20 76 69 61 20 6d 6d 61 70 28 29 2e 20  ion via mmap(). 
1d70: 54 68 65 6e 20 6b 65 65 70 20 61 20 66 72 65 65  Then keep a free
1d80: 20 6c 69 73 74 20 6f 66 0a 20 2a 20 66 72 65 65   list of. * free
1d90: 20 74 72 61 6d 70 6f 6c 69 6e 65 73 2e 0a 20 2a   trampolines.. *
1da0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 2a 20 66  /.static char* f
1db0: 72 65 65 6c 69 73 74 20 3d 20 4e 55 4c 4c 3b 0a  reelist = NULL;.
1dc0: 23 65 6e 64 69 66 0a 0a 5f 5f 54 52 5f 66 75 6e  #endif..__TR_fun
1dd0: 63 74 69 6f 6e 20 61 6c 6c 6f 63 5f 74 72 61 6d  ction alloc_tram
1de0: 70 6f 6c 69 6e 65 5f 72 20 28 5f 5f 54 52 5f 66  poline_r (__TR_f
1df0: 75 6e 63 74 69 6f 6e 20 61 64 64 72 65 73 73 2c  unction address,
1e00: 20 76 6f 69 64 2a 20 64 61 74 61 30 2c 20 76 6f   void* data0, vo
1e10: 69 64 2a 20 64 61 74 61 31 29 0a 7b 0a 20 20 63  id* data1).{.  c
1e20: 68 61 72 2a 20 66 75 6e 63 74 69 6f 6e 3b 0a 20  har* function;. 
1e30: 20 63 68 61 72 2a 20 64 61 74 61 3b 0a 0a 23 69   char* data;..#i
1e40: 66 20 21 64 65 66 69 6e 65 64 28 43 4f 44 45 5f  f !defined(CODE_
1e50: 45 58 45 43 55 54 41 42 4c 45 29 0a 20 20 73 74  EXECUTABLE).  st
1e60: 61 74 69 63 20 6c 6f 6e 67 20 70 61 67 65 73 69  atic long pagesi
1e70: 7a 65 20 3d 20 30 3b 0a 23 69 66 20 64 65 66 69  ze = 0;.#if defi
1e80: 6e 65 64 28 45 58 45 43 55 54 41 42 4c 45 5f 56  ned(EXECUTABLE_V
1e90: 49 41 5f 4d 4d 41 50 5f 44 45 56 5a 45 52 4f 29  IA_MMAP_DEVZERO)
1ea0: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 7a 65  .  static int ze
1eb0: 72 6f 5f 66 64 3b 0a 23 65 6e 64 69 66 0a 20 20  ro_fd;.#endif.  
1ec0: 2f 2a 20 46 69 72 73 74 2c 20 67 65 74 20 74 68  /* First, get th
1ed0: 65 20 70 61 67 65 20 73 69 7a 65 20 6f 6e 63 65  e page size once
1ee0: 20 61 6e 64 20 66 6f 72 20 61 6c 6c 2e 20 2a 2f   and for all. */
1ef0: 0a 20 20 69 66 20 28 21 70 61 67 65 73 69 7a 65  .  if (!pagesize
1f00: 29 0a 20 20 20 20 7b 0a 23 69 66 20 64 65 66 69  ).    {.#if defi
1f10: 6e 65 64 28 48 41 56 45 5f 4d 41 43 48 5f 56 4d  ned(HAVE_MACH_VM
1f20: 29 0a 20 20 20 20 20 20 70 61 67 65 73 69 7a 65  ).      pagesize
1f30: 20 3d 20 76 6d 5f 70 61 67 65 5f 73 69 7a 65 3b   = vm_page_size;
1f40: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 70 61 67  .#else.      pag
1f50: 65 73 69 7a 65 20 3d 20 67 65 74 70 61 67 65 73  esize = getpages
1f60: 69 7a 65 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69  ize();.#endif.#i
1f70: 66 20 64 65 66 69 6e 65 64 28 45 58 45 43 55 54  f defined(EXECUT
1f80: 41 42 4c 45 5f 56 49 41 5f 4d 4d 41 50 5f 44 45  ABLE_VIA_MMAP_DE
1f90: 56 5a 45 52 4f 29 0a 20 20 20 20 20 20 7a 65 72  VZERO).      zer
1fa0: 6f 5f 66 64 20 3d 20 6f 70 65 6e 28 22 2f 64 65  o_fd = open("/de
1fb0: 76 2f 7a 65 72 6f 22 2c 4f 5f 52 44 4f 4e 4c 59  v/zero",O_RDONLY
1fc0: 2c 30 36 34 34 29 3b 0a 20 20 20 20 20 20 69 66  ,0644);.      if
1fd0: 20 28 7a 65 72 6f 5f 66 64 20 3c 20 30 29 0a 20   (zero_fd < 0). 
1fe0: 20 20 20 20 20 20 20 7b 20 66 70 72 69 6e 74 66         { fprintf
1ff0: 28 73 74 64 65 72 72 2c 22 74 72 61 6d 70 6f 6c  (stderr,"trampol
2000: 69 6e 65 3a 20 43 61 6e 6e 6f 74 20 6f 70 65 6e  ine: Cannot open
2010: 20 2f 64 65 76 2f 7a 65 72 6f 21 5c 6e 22 29 3b   /dev/zero!\n");
2020: 20 61 62 6f 72 74 28 29 3b 20 7d 0a 23 65 6e 64   abort(); }.#end
2030: 69 66 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  if.    }.#endif.
2040: 0a 20 20 2f 2a 20 31 2e 20 41 6c 6c 6f 63 61 74  .  /* 1. Allocat
2050: 65 20 72 6f 6f 6d 20 2a 2f 0a 0a 23 69 66 20 21  e room */..#if !
2060: 64 65 66 69 6e 65 64 28 43 4f 44 45 5f 45 58 45  defined(CODE_EXE
2070: 43 55 54 41 42 4c 45 29 20 26 26 20 21 64 65 66  CUTABLE) && !def
2080: 69 6e 65 64 28 45 58 45 43 55 54 41 42 4c 45 5f  ined(EXECUTABLE_
2090: 56 49 41 5f 4d 50 52 4f 54 45 43 54 29 0a 20 20  VIA_MPROTECT).  
20a0: 2f 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 6d 65  /* Note: This me
20b0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
20c0: 69 73 20 6e 6f 74 20 6d 75 6c 74 69 74 68 72 65  is not multithre
20d0: 61 64 2d 73 61 66 65 2e 20 57 65 20 6d 69 67 68  ad-safe. We migh
20e0: 74 20 6e 65 65 64 0a 20 20 20 2a 20 74 6f 20 61  t need.   * to a
20f0: 64 64 20 73 70 65 63 69 61 6c 20 28 70 6c 61 74  dd special (plat
2100: 66 6f 72 6d 20 64 65 70 65 6e 64 65 6e 74 29 20  form dependent) 
2110: 63 6f 64 65 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  code for locking
2120: 2e 0a 20 20 20 2a 20 46 6f 72 74 75 6e 61 74 65  ..   * Fortunate
2130: 6c 79 2c 20 6d 6f 73 74 20 6d 6f 64 65 72 6e 20  ly, most modern 
2140: 73 79 73 74 65 6d 73 20 77 68 65 72 65 20 6d 75  systems where mu
2150: 6c 74 69 74 68 72 65 61 64 2d 73 61 66 65 74 79  ltithread-safety
2160: 20 6d 61 74 74 65 72 73 0a 20 20 20 2a 20 68 61   matters.   * ha
2170: 76 65 20 45 58 45 43 55 54 41 42 4c 45 5f 56 49  ve EXECUTABLE_VI
2180: 41 5f 4d 50 52 4f 54 45 43 54 2c 20 61 6e 64 20  A_MPROTECT, and 
2190: 74 68 6f 73 65 20 77 68 69 63 68 20 64 6f 6e 27  those which don'
21a0: 74 20 28 41 49 58 20 6f 6e 20 70 6f 77 65 72 70  t (AIX on powerp
21b0: 63 20 61 6e 64 0a 20 20 20 2a 20 48 50 2d 55 58  c and.   * HP-UX
21c0: 20 6f 6e 20 68 70 70 61 29 20 68 61 76 65 20 43   on hppa) have C
21d0: 4f 44 45 5f 45 58 45 43 55 54 41 42 4c 45 2e 20  ODE_EXECUTABLE. 
21e0: 54 68 75 73 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20  Thus no locking 
21f0: 63 6f 64 65 20 69 73 20 6e 65 65 64 65 64 0a 20  code is needed. 
2200: 20 20 2a 20 66 6f 72 20 74 68 65 20 6d 6f 6d 65    * for the mome
2210: 6e 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 20 28  nt..   */.  if (
2220: 66 72 65 65 6c 69 73 74 20 3d 3d 20 4e 55 4c 4c  freelist == NULL
2230: 29 0a 20 20 20 20 7b 20 2f 2a 20 47 65 74 20 61  ).    { /* Get a
2240: 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20   new page. */.  
2250: 20 20 20 20 63 68 61 72 2a 20 70 61 67 65 3b 0a      char* page;.
2260: 23 69 66 64 65 66 20 45 58 45 43 55 54 41 42 4c  #ifdef EXECUTABL
2270: 45 5f 56 49 41 5f 4d 4d 41 50 5f 41 4e 4f 4e 59  E_VIA_MMAP_ANONY
2280: 4d 4f 55 53 0a 20 20 20 20 20 20 70 61 67 65 20  MOUS.      page 
2290: 3d 20 6d 6d 61 70 28 30 2c 20 70 61 67 65 73 69  = mmap(0, pagesi
22a0: 7a 65 2c 20 50 52 4f 54 5f 52 45 41 44 20 7c 20  ze, PROT_READ | 
22b0: 50 52 4f 54 5f 57 52 49 54 45 20 7c 20 50 52 4f  PROT_WRITE | PRO
22c0: 54 5f 45 58 45 43 2c 20 4d 41 50 5f 41 4e 4f 4e  T_EXEC, MAP_ANON
22d0: 59 4d 4f 55 53 20 7c 20 4d 41 50 5f 56 41 52 49  YMOUS | MAP_VARI
22e0: 41 42 4c 45 2c 20 2d 31 2c 20 30 29 3b 0a 23 65  ABLE, -1, 0);.#e
22f0: 6e 64 69 66 0a 23 69 66 64 65 66 20 45 58 45 43  ndif.#ifdef EXEC
2300: 55 54 41 42 4c 45 5f 56 49 41 5f 4d 4d 41 50 5f  UTABLE_VIA_MMAP_
2310: 44 45 56 5a 45 52 4f 0a 20 20 20 20 20 20 70 61  DEVZERO.      pa
2320: 67 65 20 3d 20 6d 6d 61 70 28 30 2c 20 70 61 67  ge = mmap(0, pag
2330: 65 73 69 7a 65 2c 20 50 52 4f 54 5f 52 45 41 44  esize, PROT_READ
2340: 20 7c 20 50 52 4f 54 5f 57 52 49 54 45 20 7c 20   | PROT_WRITE | 
2350: 50 52 4f 54 5f 45 58 45 43 2c 20 4d 41 50 5f 50  PROT_EXEC, MAP_P
2360: 52 49 56 41 54 45 2c 20 7a 65 72 6f 5f 66 64 2c  RIVATE, zero_fd,
2370: 20 30 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64   0);.#endif.#ifd
2380: 65 66 20 45 58 45 43 55 54 41 42 4c 45 5f 56 49  ef EXECUTABLE_VI
2390: 41 5f 53 48 4d 0a 20 20 20 20 20 20 69 6e 74 20  A_SHM.      int 
23a0: 73 68 6d 69 64 20 3d 20 73 68 6d 67 65 74 28 49  shmid = shmget(I
23b0: 50 43 5f 50 52 49 56 41 54 45 2c 20 70 61 67 65  PC_PRIVATE, page
23c0: 73 69 7a 65 2c 20 30 37 30 30 7c 49 50 43 5f 43  size, 0700|IPC_C
23d0: 52 45 41 54 29 3b 0a 20 20 20 20 20 20 69 66 20  REAT);.      if 
23e0: 28 73 68 6d 69 64 3c 30 29 0a 20 20 20 20 20 20  (shmid<0).      
23f0: 20 20 7b 20 70 61 67 65 20 3d 20 28 63 68 61 72    { page = (char
2400: 2a 29 28 2d 31 29 3b 20 7d 0a 20 20 20 20 20 20  *)(-1); }.      
2410: 65 6c 73 65 0a 20 20 20 20 20 20 20 20 7b 20 70  else.        { p
2420: 61 67 65 20 3d 20 73 68 6d 61 74 28 73 68 6d 69  age = shmat(shmi
2430: 64 2c 20 30 2c 20 30 29 3b 20 73 68 6d 63 74 6c  d, 0, 0); shmctl
2440: 28 73 68 6d 69 64 2c 20 49 50 43 5f 52 4d 49 44  (shmid, IPC_RMID
2450: 2c 20 30 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 23  , 0); }.#endif.#
2460: 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 20 20 20  ifdef _WIN32.   
2470: 20 20 20 70 61 67 65 20 3d 20 56 69 72 74 75 61     page = Virtua
2480: 6c 41 6c 6c 6f 63 28 4e 55 4c 4c 2c 20 70 61 67  lAlloc(NULL, pag
2490: 65 73 69 7a 65 2c 20 4d 45 4d 5f 43 4f 4d 4d 49  esize, MEM_COMMI
24a0: 54 2c 20 50 41 47 45 5f 45 58 45 43 55 54 45 5f  T, PAGE_EXECUTE_
24b0: 52 45 41 44 57 52 49 54 45 29 3b 0a 20 20 20 20  READWRITE);.    
24c0: 20 20 69 66 20 28 70 61 67 65 20 3d 3d 20 30 29    if (page == 0)
24d0: 0a 20 20 20 20 20 20 09 7b 20 70 61 67 65 20 3d  .      .{ page =
24e0: 20 28 63 68 61 72 2a 29 28 2d 31 29 3b 20 7d 0a   (char*)(-1); }.
24f0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 20  #endif.      if 
2500: 28 70 61 67 65 20 3d 3d 20 28 63 68 61 72 2a 29  (page == (char*)
2510: 28 2d 31 29 29 0a 20 20 20 20 20 20 20 20 7b 20  (-1)).        { 
2520: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
2530: 74 72 61 6d 70 6f 6c 69 6e 65 3a 20 4f 75 74 20  trampoline: Out 
2540: 6f 66 20 76 69 72 74 75 61 6c 20 6d 65 6d 6f 72  of virtual memor
2550: 79 21 5c 6e 22 29 3b 20 61 62 6f 72 74 28 29 3b  y!\n"); abort();
2560: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c   }.      /* Fill
2570: 20 69 74 20 77 69 74 68 20 66 72 65 65 20 74 72   it with free tr
2580: 61 6d 70 6f 6c 69 6e 65 73 2e 20 2a 2f 0a 20 20  ampolines. */.  
2590: 20 20 20 20 7b 20 63 68 61 72 2a 2a 20 6c 61 73      { char** las
25a0: 74 20 3d 20 26 66 72 65 65 6c 69 73 74 3b 0a 20  t = &freelist;. 
25b0: 20 20 20 20 20 20 20 63 68 61 72 2a 20 70 61 67         char* pag
25c0: 65 5f 65 6e 64 20 3d 20 70 61 67 65 20 2b 20 70  e_end = page + p
25d0: 61 67 65 73 69 7a 65 3b 0a 20 20 20 20 20 20 20  agesize;.       
25e0: 20 77 68 69 6c 65 20 28 70 61 67 65 2b 54 52 41   while (page+TRA
25f0: 4d 50 5f 54 4f 54 41 4c 5f 4c 45 4e 47 54 48 20  MP_TOTAL_LENGTH 
2600: 3c 3d 20 70 61 67 65 5f 65 6e 64 29 0a 20 20 20  <= page_end).   
2610: 20 20 20 20 20 20 20 7b 20 2a 6c 61 73 74 20 3d         { *last =
2620: 20 70 61 67 65 3b 20 6c 61 73 74 20 3d 20 28 63   page; last = (c
2630: 68 61 72 2a 2a 29 70 61 67 65 3b 20 70 61 67 65  har**)page; page
2640: 20 2b 3d 20 54 52 41 4d 50 5f 54 4f 54 41 4c 5f   += TRAMP_TOTAL_
2650: 4c 45 4e 47 54 48 3b 20 7d 0a 20 20 20 20 20 20  LENGTH; }.      
2660: 20 20 2a 6c 61 73 74 20 3d 20 4e 55 4c 4c 3b 0a    *last = NULL;.
2670: 20 20 20 20 7d 20 7d 0a 20 20 66 75 6e 63 74 69      } }.  functi
2680: 6f 6e 20 3d 20 66 72 65 65 6c 69 73 74 3b 20 66  on = freelist; f
2690: 72 65 65 6c 69 73 74 20 3d 20 2a 28 63 68 61 72  reelist = *(char
26a0: 2a 2a 29 66 72 65 65 6c 69 73 74 3b 0a 23 65 6c  **)freelist;.#el
26b0: 73 65 0a 20 20 7b 20 63 68 61 72 2a 20 72 6f 6f  se.  { char* roo
26c0: 6d 20 3d 20 28 63 68 61 72 2a 29 20 6d 61 6c 6c  m = (char*) mall
26d0: 6f 63 28 73 69 7a 65 6f 66 28 76 6f 69 64 2a 29  oc(sizeof(void*)
26e0: 20 2b 20 54 52 41 4d 50 5f 54 4f 54 41 4c 5f 4c   + TRAMP_TOTAL_L
26f0: 45 4e 47 54 48 20 2b 20 54 52 41 4d 50 5f 41 4c  ENGTH + TRAMP_AL
2700: 49 47 4e 2d 31 29 3b 0a 20 20 20 20 69 66 20 28  IGN-1);.    if (
2710: 21 72 6f 6f 6d 29 0a 20 20 20 20 20 20 7b 20 66  !room).      { f
2720: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 74  printf(stderr,"t
2730: 72 61 6d 70 6f 6c 69 6e 65 3a 20 4f 75 74 20 6f  rampoline: Out o
2740: 66 20 76 69 72 74 75 61 6c 20 6d 65 6d 6f 72 79  f virtual memory
2750: 21 5c 6e 22 29 3b 20 61 62 6f 72 74 28 29 3b 20  !\n"); abort(); 
2760: 7d 0a 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 3d  }.    function =
2770: 20 28 63 68 61 72 2a 29 28 28 28 6c 6f 6e 67 29   (char*)(((long)
2780: 72 6f 6f 6d 20 2b 20 73 69 7a 65 6f 66 28 76 6f  room + sizeof(vo
2790: 69 64 2a 29 20 2b 20 54 52 41 4d 50 5f 41 4c 49  id*) + TRAMP_ALI
27a0: 47 4e 2d 31 29 20 26 20 2d 54 52 41 4d 50 5f 41  GN-1) & -TRAMP_A
27b0: 4c 49 47 4e 29 3b 0a 20 20 20 20 28 28 63 68 61  LIGN);.    ((cha
27c0: 72 2a 2a 29 66 75 6e 63 74 69 6f 6e 29 5b 2d 31  r**)function)[-1
27d0: 5d 20 3d 20 72 6f 6f 6d 3b 20 2f 2a 20 62 61 63  ] = room; /* bac
27e0: 6b 70 6f 69 6e 74 65 72 20 66 6f 72 20 66 72 65  kpointer for fre
27f0: 65 5f 74 72 61 6d 70 6f 6c 69 6e 65 28 29 20 2a  e_trampoline() *
2800: 2f 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  /.  }.#endif..  
2810: 2f 2a 20 32 2e 20 46 69 6c 6c 20 6f 75 74 20 74  /* 2. Fill out t
2820: 68 65 20 74 72 61 6d 70 6f 6c 69 6e 65 20 2a 2f  he trampoline */
2830: 0a 20 20 64 61 74 61 20 3d 20 66 75 6e 63 74 69  .  data = functi
2840: 6f 6e 20 2b 20 54 52 41 4d 50 5f 4c 45 4e 47 54  on + TRAMP_LENGT
2850: 48 3b 0a 20 20 2f 2a 20 4b 6e 6f 77 69 6e 67 20  H;.  /* Knowing 
2860: 74 68 61 74 20 64 61 74 61 20 3d 20 66 75 6e 63  that data = func
2870: 74 69 6f 6e 20 2b 20 54 52 41 4d 50 5f 4c 45 4e  tion + TRAMP_LEN
2880: 47 54 48 2c 20 77 65 20 63 6f 75 6c 64 20 63 65  GTH, we could ce
2890: 72 74 61 69 6e 6c 79 20 6f 70 74 69 6d 69 7a 65  rtainly optimize
28a0: 0a 20 20 20 2a 20 74 68 65 20 74 72 61 6d 70 6f  .   * the trampo
28b0: 6c 69 6e 65 73 20 61 20 6c 69 74 74 6c 65 20 62  lines a little b
28c0: 69 74 20 6d 6f 72 65 2c 20 75 73 69 6e 67 20 50  it more, using P
28d0: 43 20 72 65 6c 61 74 69 76 65 20 61 64 64 72 65  C relative addre
28e0: 73 73 69 6e 67 20 6d 6f 64 65 73 2e 0a 20 20 20  ssing modes..   
28f0: 2a 20 42 75 74 20 49 20 64 6f 75 62 74 20 69 74  * But I doubt it
2900: 27 73 20 72 65 61 6c 6c 79 20 77 6f 72 74 68 20  's really worth 
2910: 69 74 2e 0a 20 20 20 2a 2f 0a 23 69 66 64 65 66  it..   */.#ifdef
2920: 20 5f 5f 69 33 38 36 5f 5f 0a 20 20 2f 2a 20 66   __i386__.  /* f
2930: 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20  unction:.   *   
2940: 20 70 6f 70 6c 20 25 65 63 78 09 09 09 35 39 0a   popl %ecx...59.
2950: 20 20 20 2a 20 20 20 20 70 75 73 68 6c 20 24 3c     *    pushl $<
2960: 64 61 74 61 3e 09 09 09 36 38 20 3c 64 61 74 61  data>...68 <data
2970: 3e 0a 20 20 20 2a 20 20 20 20 70 75 73 68 6c 20  >.   *    pushl 
2980: 25 65 63 78 09 09 09 35 31 0a 20 20 20 2a 20 20  %ecx...51.   *  
2990: 20 20 6a 6d 70 20 3c 61 64 64 72 65 73 73 3e 09    jmp <address>.
29a0: 09 09 45 39 20 3c 61 64 64 72 65 73 73 3e 2d 3c  ..E9 <address>-<
29b0: 68 65 72 65 3e 0a 20 20 20 2a 20 68 65 72 65 3a  here>.   * here:
29c0: 0a 20 20 20 2a 20 20 20 20 6e 6f 70 09 09 09 09  .   *    nop....
29d0: 39 30 0a 20 20 20 2a 20 20 20 20 6e 6f 70 09 09  90.   *    nop..
29e0: 09 09 39 30 0a 20 20 20 2a 20 20 20 20 6e 6f 70  ..90.   *    nop
29f0: 09 09 09 09 39 30 0a 20 20 20 2a 20 20 20 20 6e  ....90.   *    n
2a00: 6f 70 09 09 09 09 39 30 0a 20 20 20 2a 2f 0a 20  op....90.   */. 
2a10: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e   *(short *) (fun
2a20: 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20 30 78 36  ction + 0) = 0x6
2a30: 38 35 39 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29  859;.  *(long *)
2a40: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 32 29    (function + 2)
2a50: 20 3d 20 28 6c 6f 6e 67 29 20 64 61 74 61 3b 0a   = (long) data;.
2a60: 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75    *(short *) (fu
2a70: 6e 63 74 69 6f 6e 20 2b 20 36 29 20 3d 20 30 78  nction + 6) = 0x
2a80: 45 39 35 31 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a  E951;.  *(long *
2a90: 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38  )  (function + 8
2aa0: 29 20 3d 20 28 6c 6f 6e 67 29 20 61 64 64 72 65  ) = (long) addre
2ab0: 73 73 20 2d 20 28 6c 6f 6e 67 29 20 28 66 75 6e  ss - (long) (fun
2ac0: 63 74 69 6f 6e 20 2b 20 31 32 29 3b 0a 20 20 2a  ction + 12);.  *
2ad0: 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74  (long *)  (funct
2ae0: 69 6f 6e 20 2b 31 32 29 20 3d 20 30 78 39 30 39  ion +12) = 0x909
2af0: 30 39 30 39 30 3b 20 20 20 2f 2a 20 6e 6f 70 20  09090;   /* nop 
2b00: 6e 6f 70 20 6e 6f 70 20 6e 6f 70 2c 20 66 6f 72  nop nop nop, for
2b10: 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 23 64   alignment */.#d
2b20: 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 28 66  efine is_tramp(f
2b30: 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28  unction)  \.  *(
2b40: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a  unsigned short *
2b50: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29  ) (function + 0)
2b60: 20 3d 3d 20 30 78 36 38 35 39 20 26 26 20 5c 0a   == 0x6859 && \.
2b70: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f    *(unsigned sho
2b80: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
2b90: 2b 20 36 29 20 3d 3d 20 30 78 45 39 35 31 0a 23  + 6) == 0xE951.#
2ba0: 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 64  define tramp_add
2bb0: 72 65 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 20  ress(function)  
2bc0: 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28  \.  *(long *)  (
2bd0: 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 2b 20  function + 8) + 
2be0: 28 6c 6f 6e 67 29 20 28 66 75 6e 63 74 69 6f 6e  (long) (function
2bf0: 20 2b 20 31 32 29 0a 23 64 65 66 69 6e 65 20 74   + 12).#define t
2c00: 72 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 74 69  ramp_data(functi
2c10: 6f 6e 29 20 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20  on)  \.  *(long 
2c20: 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20  *)  (function + 
2c30: 32 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  2).#endif.#ifdef
2c40: 20 5f 5f 6d 36 38 6b 5f 5f 0a 23 69 66 64 65 66   __m68k__.#ifdef
2c50: 20 5f 5f 4e 65 74 42 53 44 5f 5f 0a 20 20 2f 2a   __NetBSD__.  /*
2c60: 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20   function:.   * 
2c70: 20 20 20 6d 6f 76 65 6c 20 23 3c 64 61 74 61 3e     movel #<data>
2c80: 2c 61 31 09 09 32 32 20 37 43 20 3c 64 61 74 61  ,a1..22 7C <data
2c90: 3e 0a 20 20 20 2a 20 20 20 20 6a 6d 70 20 3c 61  >.   *    jmp <a
2ca0: 64 64 72 65 73 73 3e 09 09 09 34 45 20 46 39 20  ddress>...4E F9 
2cb0: 3c 61 64 64 72 65 73 73 3e 0a 20 20 20 2a 20 20  <address>.   *  
2cc0: 20 20 6e 6f 70 09 09 09 09 34 45 20 37 31 0a 20    nop....4E 71. 
2cd0: 20 20 2a 2f 0a 20 20 2a 28 73 68 6f 72 74 20 2a    */.  *(short *
2ce0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29  ) (function + 0)
2cf0: 20 3d 20 30 78 32 32 37 43 3b 0a 20 20 2a 28 6c   = 0x227C;.  *(l
2d00: 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f  ong *)  (functio
2d10: 6e 20 2b 20 32 29 20 3d 20 28 6c 6f 6e 67 29 20  n + 2) = (long) 
2d20: 64 61 74 61 3b 0a 20 20 2a 28 73 68 6f 72 74 20  data;.  *(short 
2d30: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 36  *) (function + 6
2d40: 29 20 3d 20 30 78 34 45 46 39 3b 0a 20 20 2a 28  ) = 0x4EF9;.  *(
2d50: 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69  long *)  (functi
2d60: 6f 6e 20 2b 20 38 29 20 3d 20 28 6c 6f 6e 67 29  on + 8) = (long)
2d70: 20 61 64 64 72 65 73 73 3b 0a 20 20 2a 28 73 68   address;.  *(sh
2d80: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ort *) (function
2d90: 20 2b 31 32 29 20 3d 20 30 78 34 45 37 31 3b 0a   +12) = 0x4E71;.
2da0: 23 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70  #define is_tramp
2db0: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20  (function)  \.  
2dc0: 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74  *(unsigned short
2dd0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20   *) (function + 
2de0: 30 29 20 3d 3d 20 30 78 32 32 37 43 20 26 26 20  0) == 0x227C && 
2df0: 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73  \.  *(unsigned s
2e00: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
2e10: 6e 20 2b 20 36 29 20 3d 3d 20 30 78 34 45 46 39  n + 6) == 0x4EF9
2e20: 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e   && \.  *(unsign
2e30: 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e  ed short *) (fun
2e40: 63 74 69 6f 6e 20 2b 31 32 29 20 3d 3d 20 30 78  ction +12) == 0x
2e50: 34 45 37 31 0a 23 65 6c 73 65 0a 20 20 2f 2a 20  4E71.#else.  /* 
2e60: 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20  function:.   *  
2e70: 20 20 6d 6f 76 65 6c 20 23 3c 64 61 74 61 3e 2c    movel #<data>,
2e80: 61 30 09 09 32 30 20 37 43 20 3c 64 61 74 61 3e  a0..20 7C <data>
2e90: 0a 20 20 20 2a 20 20 20 20 6a 6d 70 20 3c 61 64  .   *    jmp <ad
2ea0: 64 72 65 73 73 3e 09 09 09 34 45 20 46 39 20 3c  dress>...4E F9 <
2eb0: 61 64 64 72 65 73 73 3e 0a 20 20 20 2a 20 20 20  address>.   *   
2ec0: 20 6e 6f 70 09 09 09 09 34 45 20 37 31 0a 20 20   nop....4E 71.  
2ed0: 20 2a 2f 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29   */.  *(short *)
2ee0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20   (function + 0) 
2ef0: 3d 20 30 78 32 30 37 43 3b 0a 20 20 2a 28 6c 6f  = 0x207C;.  *(lo
2f00: 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e  ng *)  (function
2f10: 20 2b 20 32 29 20 3d 20 28 6c 6f 6e 67 29 20 64   + 2) = (long) d
2f20: 61 74 61 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a  ata;.  *(short *
2f30: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 36 29  ) (function + 6)
2f40: 20 3d 20 30 78 34 45 46 39 3b 0a 20 20 2a 28 6c   = 0x4EF9;.  *(l
2f50: 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f  ong *)  (functio
2f60: 6e 20 2b 20 38 29 20 3d 20 28 6c 6f 6e 67 29 20  n + 8) = (long) 
2f70: 61 64 64 72 65 73 73 3b 0a 20 20 2a 28 73 68 6f  address;.  *(sho
2f80: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
2f90: 2b 31 32 29 20 3d 20 30 78 34 45 37 31 3b 0a 23  +12) = 0x4E71;.#
2fa0: 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 28  define is_tramp(
2fb0: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a  function)  \.  *
2fc0: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20  (unsigned short 
2fd0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30  *) (function + 0
2fe0: 29 20 3d 3d 20 30 78 32 30 37 43 20 26 26 20 5c  ) == 0x207C && \
2ff0: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68  .  *(unsigned sh
3000: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ort *) (function
3010: 20 2b 20 36 29 20 3d 3d 20 30 78 34 45 46 39 20   + 6) == 0x4EF9 
3020: 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65  && \.  *(unsigne
3030: 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63  d short *) (func
3040: 74 69 6f 6e 20 2b 31 32 29 20 3d 3d 20 30 78 34  tion +12) == 0x4
3050: 45 37 31 0a 23 65 6e 64 69 66 0a 23 64 65 66 69  E71.#endif.#defi
3060: 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 65 73 73  ne tramp_address
3070: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20  (function)  \.  
3080: 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63  *(long *)  (func
3090: 74 69 6f 6e 20 2b 20 38 29 0a 23 64 65 66 69 6e  tion + 8).#defin
30a0: 65 20 74 72 61 6d 70 5f 64 61 74 61 28 66 75 6e  e tramp_data(fun
30b0: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 6c 6f  ction)  \.  *(lo
30c0: 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e  ng *)  (function
30d0: 20 2b 20 32 29 0a 23 65 6e 64 69 66 0a 23 69 66   + 2).#endif.#if
30e0: 20 64 65 66 69 6e 65 64 28 5f 5f 6d 69 70 73 5f   defined(__mips_
30f0: 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f  _) || defined(__
3100: 6d 69 70 73 6e 33 32 5f 5f 29 20 26 26 20 21 64  mipsn32__) && !d
3110: 65 66 69 6e 65 64 28 5f 5f 6d 69 70 73 36 34 5f  efined(__mips64_
3120: 5f 29 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e  _).  /* function
3130: 3a 0a 20 20 20 2a 20 20 20 20 6c 77 20 24 32 2c  :.   *    lw $2,
3140: 31 36 28 24 32 35 29 09 09 09 38 46 20 32 32 20  16($25)...8F 22 
3150: 30 30 20 31 30 0a 20 20 20 2a 20 20 20 20 6c 77  00 10.   *    lw
3160: 20 24 32 35 2c 32 30 28 24 32 35 29 09 09 09 38   $25,20($25)...8
3170: 46 20 33 39 20 30 30 20 31 34 0a 20 20 20 2a 20  F 39 00 14.   * 
3180: 20 20 20 6a 20 24 32 35 09 09 09 09 30 33 20 32     j $25....03 2
3190: 30 20 30 30 20 30 38 0a 20 20 20 2a 20 20 20 20  0 00 08.   *    
31a0: 6e 6f 70 09 09 09 09 30 30 20 30 30 20 30 30 20  nop....00 00 00 
31b0: 30 30 0a 20 20 20 2a 20 20 20 20 2e 77 6f 72 64  00.   *    .word
31c0: 20 3c 64 61 74 61 3e 09 09 09 3c 64 61 74 61 3e   <data>...<data>
31d0: 0a 20 20 20 2a 20 20 20 20 2e 77 6f 72 64 20 3c  .   *    .word <
31e0: 61 64 64 72 65 73 73 3e 09 09 09 3c 61 64 64 72  address>...<addr
31f0: 65 73 73 3e 0a 20 20 20 2a 2f 0a 20 20 2a 28 75  ess>.   */.  *(u
3200: 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 28  nsigned int *) (
3210: 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20  function + 0) = 
3220: 30 78 38 46 32 32 30 30 31 30 3b 0a 20 20 2a 28  0x8F220010;.  *(
3230: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20  unsigned int *) 
3240: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d  (function + 4) =
3250: 20 30 78 38 46 33 39 30 30 31 34 3b 0a 20 20 2a   0x8F390014;.  *
3260: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29  (unsigned int *)
3270: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20   (function + 8) 
3280: 3d 20 30 78 30 33 32 30 30 30 30 38 3b 0a 20 20  = 0x03200008;.  
3290: 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a  *(unsigned int *
32a0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29  ) (function +12)
32b0: 20 3d 20 30 78 30 30 30 30 30 30 30 30 3b 0a 20   = 0x00000000;. 
32c0: 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20   *(unsigned int 
32d0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36  *) (function +16
32e0: 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  ) = (unsigned in
32f0: 74 29 20 64 61 74 61 3b 0a 20 20 2a 28 75 6e 73  t) data;.  *(uns
3300: 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 28 66 75  igned int *) (fu
3310: 6e 63 74 69 6f 6e 20 2b 32 30 29 20 3d 20 28 75  nction +20) = (u
3320: 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 61 64 64  nsigned int) add
3330: 72 65 73 73 3b 0a 23 64 65 66 69 6e 65 20 69 73  ress;.#define is
3340: 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29  _tramp(function)
3350: 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64    \.  *(unsigned
3360: 20 69 6e 74 20 2a 29 20 28 66 75 6e 63 74 69 6f   int *) (functio
3370: 6e 20 2b 20 30 29 20 3d 3d 20 30 78 38 46 32 32  n + 0) == 0x8F22
3380: 30 30 31 30 20 26 26 20 5c 0a 20 20 2a 28 75 6e  0010 && \.  *(un
3390: 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 28 66  signed int *) (f
33a0: 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 3d 20  unction + 4) == 
33b0: 30 78 38 46 33 39 30 30 31 34 20 26 26 20 5c 0a  0x8F390014 && \.
33c0: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74    *(unsigned int
33d0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20   *) (function + 
33e0: 38 29 20 3d 3d 20 30 78 30 33 32 30 30 30 30 38  8) == 0x03200008
33f0: 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e   && \.  *(unsign
3400: 65 64 20 69 6e 74 20 2a 29 20 28 66 75 6e 63 74  ed int *) (funct
3410: 69 6f 6e 20 2b 31 32 29 20 3d 3d 20 30 78 30 30  ion +12) == 0x00
3420: 30 30 30 30 30 30 0a 23 64 65 66 69 6e 65 20 74  000000.#define t
3430: 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75 6e  ramp_address(fun
3440: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e  ction)  \.  *(un
3450: 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 28 66  signed int *) (f
3460: 75 6e 63 74 69 6f 6e 20 2b 32 30 29 0a 23 64 65  unction +20).#de
3470: 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 28  fine tramp_data(
3480: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a  function)  \.  *
3490: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29  (unsigned int *)
34a0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 0a   (function +16).
34b0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f  #endif.#ifdef __
34c0: 6d 69 70 73 36 34 6f 6c 64 5f 5f 0a 20 20 2f 2a  mips64old__.  /*
34d0: 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20   function:.   * 
34e0: 20 20 20 64 6c 69 20 24 32 2c 3c 64 61 74 61 3e     dli $2,<data>
34f0: 09 09 09 33 43 20 30 32 20 68 69 31 36 28 68 69  ...3C 02 hi16(hi
3500: 33 32 28 3c 64 61 74 61 3e 29 29 0a 20 20 20 2a  32(<data>)).   *
3510: 09 09 09 09 09 33 34 20 34 32 20 6c 6f 31 36 28  .....34 42 lo16(
3520: 68 69 33 32 28 3c 64 61 74 61 3e 29 29 0a 20 20  hi32(<data>)).  
3530: 20 2a 09 09 09 09 09 30 30 20 30 32 20 31 34 20   *.....00 02 14 
3540: 33 38 0a 20 20 20 2a 09 09 09 09 09 33 34 20 34  38.   *.....34 4
3550: 32 20 68 69 31 36 28 6c 6f 33 32 28 3c 64 61 74  2 hi16(lo32(<dat
3560: 61 3e 29 29 0a 20 20 20 2a 09 09 09 09 09 30 30  a>)).   *.....00
3570: 20 30 32 20 31 34 20 33 38 0a 20 20 20 2a 09 09   02 14 38.   *..
3580: 09 09 09 33 34 20 34 32 20 6c 6f 31 36 28 6c 6f  ...34 42 lo16(lo
3590: 33 32 28 3c 64 61 74 61 3e 29 29 0a 20 20 20 2a  32(<data>)).   *
35a0: 20 20 20 20 64 6c 69 20 24 32 35 2c 3c 61 64 64      dli $25,<add
35b0: 72 65 73 73 3e 09 09 33 43 20 31 39 20 68 69 31  ress>..3C 19 hi1
35c0: 36 28 68 69 33 32 28 3c 61 64 64 72 65 73 73 3e  6(hi32(<address>
35d0: 29 29 0a 20 20 20 2a 09 09 09 09 09 33 37 20 33  )).   *.....37 3
35e0: 39 20 6c 6f 31 36 28 68 69 33 32 28 3c 61 64 64  9 lo16(hi32(<add
35f0: 72 65 73 73 3e 29 29 0a 20 20 20 2a 09 09 09 09  ress>)).   *....
3600: 09 30 30 20 31 39 20 43 43 20 33 38 0a 20 20 20  .00 19 CC 38.   
3610: 2a 09 09 09 09 09 33 37 20 33 39 20 68 69 31 36  *.....37 39 hi16
3620: 28 6c 6f 33 32 28 3c 61 64 64 72 65 73 73 3e 29  (lo32(<address>)
3630: 29 0a 20 20 20 2a 09 09 09 09 09 30 30 20 31 39  ).   *.....00 19
3640: 20 43 43 20 33 38 0a 20 20 20 2a 09 09 09 09 09   CC 38.   *.....
3650: 33 37 20 33 39 20 6c 6f 31 36 28 6c 6f 33 32 28  37 39 lo16(lo32(
3660: 3c 61 64 64 72 65 73 73 3e 29 29 0a 20 20 20 2a  <address>)).   *
3670: 20 20 20 20 6a 20 24 32 35 09 09 09 09 30 33 20      j $25....03 
3680: 32 30 20 30 30 20 30 38 0a 20 20 20 2a 20 20 20  20 00 08.   *   
3690: 20 6e 6f 70 09 09 09 09 30 30 20 30 30 20 30 30   nop....00 00 00
36a0: 20 30 30 0a 20 20 20 2a 2f 0a 20 20 2f 2a 20 57   00.   */.  /* W
36b0: 68 61 74 20 61 62 6f 75 74 20 62 69 67 20 65 6e  hat about big en
36c0: 64 69 61 6e 20 2f 20 6c 69 74 74 6c 65 20 65 6e  dian / little en
36d0: 64 69 61 6e 20 3f 3f 20 2a 2f 0a 20 20 2a 28 73  dian ?? */.  *(s
36e0: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
36f0: 6e 20 2b 20 30 29 20 3d 20 30 78 33 43 30 32 3b  n + 0) = 0x3C02;
3700: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66  .  *(short *) (f
3710: 75 6e 63 74 69 6f 6e 20 2b 20 32 29 20 3d 20 28  unction + 2) = (
3720: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64  unsigned long) d
3730: 61 74 61 20 3e 3e 20 34 38 3b 0a 20 20 2a 28 73  ata >> 48;.  *(s
3740: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
3750: 6e 20 2b 20 34 29 20 3d 20 30 78 33 34 34 32 3b  n + 4) = 0x3442;
3760: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66  .  *(short *) (f
3770: 75 6e 63 74 69 6f 6e 20 2b 20 36 29 20 3d 20 28  unction + 6) = (
3780: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
3790: 64 61 74 61 20 3e 3e 20 33 32 29 20 26 20 30 78  data >> 32) & 0x
37a0: 66 66 66 66 3b 0a 20 20 2a 28 69 6e 74 20 2a 29  ffff;.  *(int *)
37b0: 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38     (function + 8
37c0: 29 20 3d 20 30 78 30 30 30 32 31 34 33 38 3b 0a  ) = 0x00021438;.
37d0: 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75    *(short *) (fu
37e0: 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d 20 30 78  nction +12) = 0x
37f0: 33 34 34 32 3b 0a 20 20 2a 28 73 68 6f 72 74 20  3442;.  *(short 
3800: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 34  *) (function +14
3810: 29 20 3d 20 28 28 75 6e 73 69 67 6e 65 64 20 6c  ) = ((unsigned l
3820: 6f 6e 67 29 20 64 61 74 61 20 3e 3e 20 31 36 29  ong) data >> 16)
3830: 20 26 20 30 78 66 66 66 66 3b 0a 20 20 2a 28 69   & 0xffff;.  *(i
3840: 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f  nt *)   (functio
3850: 6e 20 2b 31 36 29 20 3d 20 30 78 30 30 30 32 31  n +16) = 0x00021
3860: 34 33 38 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a  438;.  *(short *
3870: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 30 29  ) (function +20)
3880: 20 3d 20 30 78 33 34 34 32 3b 0a 20 20 2a 28 73   = 0x3442;.  *(s
3890: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
38a0: 6e 20 2b 32 32 29 20 3d 20 28 75 6e 73 69 67 6e  n +22) = (unsign
38b0: 65 64 20 6c 6f 6e 67 29 20 64 61 74 61 20 26 20  ed long) data & 
38c0: 30 78 66 66 66 66 3b 0a 20 20 2a 28 73 68 6f 72  0xffff;.  *(shor
38d0: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
38e0: 32 34 29 20 3d 20 30 78 33 43 31 39 3b 0a 20 20  24) = 0x3C19;.  
38f0: 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63  *(short *) (func
3900: 74 69 6f 6e 20 2b 32 36 29 20 3d 20 28 75 6e 73  tion +26) = (uns
3910: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64 72  igned long) addr
3920: 65 73 73 20 3e 3e 20 34 38 3b 0a 20 20 2a 28 73  ess >> 48;.  *(s
3930: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
3940: 6e 20 2b 32 38 29 20 3d 20 30 78 33 37 33 39 3b  n +28) = 0x3739;
3950: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66  .  *(short *) (f
3960: 75 6e 63 74 69 6f 6e 20 2b 33 30 29 20 3d 20 28  unction +30) = (
3970: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
3980: 61 64 64 72 65 73 73 20 3e 3e 20 33 32 29 20 26  address >> 32) &
3990: 20 30 78 66 66 66 66 3b 0a 20 20 2a 28 69 6e 74   0xffff;.  *(int
39a0: 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20   *)   (function 
39b0: 2b 33 32 29 20 3d 20 30 78 30 30 31 39 43 43 33  +32) = 0x0019CC3
39c0: 38 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20  8;.  *(short *) 
39d0: 28 66 75 6e 63 74 69 6f 6e 20 2b 33 36 29 20 3d  (function +36) =
39e0: 20 30 78 33 37 33 39 3b 0a 20 20 2a 28 73 68 6f   0x3739;.  *(sho
39f0: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
3a00: 2b 33 38 29 20 3d 20 28 28 75 6e 73 69 67 6e 65  +38) = ((unsigne
3a10: 64 20 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 20  d long) address 
3a20: 3e 3e 20 31 36 29 20 26 20 30 78 66 66 66 66 3b  >> 16) & 0xffff;
3a30: 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 28 66  .  *(int *)   (f
3a40: 75 6e 63 74 69 6f 6e 20 2b 34 30 29 20 3d 20 30  unction +40) = 0
3a50: 78 30 30 31 39 43 43 33 38 3b 0a 20 20 2a 28 73  x0019CC38;.  *(s
3a60: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
3a70: 6e 20 2b 34 34 29 20 3d 20 30 78 33 37 33 39 3b  n +44) = 0x3739;
3a80: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66  .  *(short *) (f
3a90: 75 6e 63 74 69 6f 6e 20 2b 34 36 29 20 3d 20 28  unction +46) = (
3aa0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 61  unsigned long) a
3ab0: 64 64 72 65 73 73 20 26 20 30 78 66 66 66 66 3b  ddress & 0xffff;
3ac0: 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 28 66  .  *(int *)   (f
3ad0: 75 6e 63 74 69 6f 6e 20 2b 34 38 29 20 3d 20 30  unction +48) = 0
3ae0: 78 30 33 32 30 30 30 30 38 3b 0a 20 20 2a 28 69  x03200008;.  *(i
3af0: 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f  nt *)   (functio
3b00: 6e 20 2b 35 32 29 20 3d 20 30 78 30 30 30 30 30  n +52) = 0x00000
3b10: 30 30 30 3b 0a 23 64 65 66 69 6e 65 20 69 73 5f  000;.#define is_
3b20: 74 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20  tramp(function) 
3b30: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20   \.  *(unsigned 
3b40: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
3b50: 6f 6e 20 2b 20 30 29 20 3d 3d 20 30 78 33 43 30  on + 0) == 0x3C0
3b60: 32 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67  2 && \.  *(unsig
3b70: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75  ned short *) (fu
3b80: 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 3d 20 30  nction + 4) == 0
3b90: 78 33 34 34 32 20 26 26 20 5c 0a 20 20 2a 28 75  x3442 && \.  *(u
3ba0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 20  nsigned int *)  
3bb0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20   (function + 8) 
3bc0: 3d 3d 20 30 78 30 30 30 32 31 34 33 38 20 26 26  == 0x00021438 &&
3bd0: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20   \.  *(unsigned 
3be0: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
3bf0: 6f 6e 20 2b 31 32 29 20 3d 3d 20 30 78 33 34 34  on +12) == 0x344
3c00: 32 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67  2 && \.  *(unsig
3c10: 6e 65 64 20 69 6e 74 20 2a 29 20 20 20 28 66 75  ned int *)   (fu
3c20: 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 3d 20 30  nction +16) == 0
3c30: 78 30 30 30 32 31 34 33 38 20 26 26 20 5c 0a 20  x00021438 && \. 
3c40: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72   *(unsigned shor
3c50: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
3c60: 32 30 29 20 3d 3d 20 30 78 33 34 34 32 20 26 26  20) == 0x3442 &&
3c70: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20   \.  *(unsigned 
3c80: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
3c90: 6f 6e 20 2b 32 34 29 20 3d 3d 20 30 78 33 43 31  on +24) == 0x3C1
3ca0: 39 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67  9 && \.  *(unsig
3cb0: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75  ned short *) (fu
3cc0: 6e 63 74 69 6f 6e 20 2b 32 38 29 20 3d 3d 20 30  nction +28) == 0
3cd0: 78 33 37 33 39 20 26 26 20 5c 0a 20 20 2a 28 75  x3739 && \.  *(u
3ce0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 20  nsigned int *)  
3cf0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 33 32 29 20   (function +32) 
3d00: 3d 3d 20 30 78 30 30 31 39 43 43 33 38 20 26 26  == 0x0019CC38 &&
3d10: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20   \.  *(unsigned 
3d20: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
3d30: 6f 6e 20 2b 33 36 29 20 3d 3d 20 30 78 33 37 33  on +36) == 0x373
3d40: 39 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67  9 && \.  *(unsig
3d50: 6e 65 64 20 69 6e 74 20 2a 29 20 20 20 28 66 75  ned int *)   (fu
3d60: 6e 63 74 69 6f 6e 20 2b 34 30 29 20 3d 3d 20 30  nction +40) == 0
3d70: 78 30 30 31 39 43 43 33 38 20 26 26 20 5c 0a 20  x0019CC38 && \. 
3d80: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72   *(unsigned shor
3d90: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
3da0: 34 34 29 20 3d 3d 20 30 78 33 37 33 39 20 26 26  44) == 0x3739 &&
3db0: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20   \.  *(unsigned 
3dc0: 69 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69  int *)   (functi
3dd0: 6f 6e 20 2b 34 38 29 20 3d 3d 20 30 78 30 33 32  on +48) == 0x032
3de0: 30 30 30 30 38 20 26 26 20 5c 0a 20 20 2a 28 75  00008 && \.  *(u
3df0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 20  nsigned int *)  
3e00: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 35 32 29 20   (function +52) 
3e10: 3d 3d 20 30 78 30 30 30 30 30 30 30 30 0a 23 64  == 0x00000000.#d
3e20: 65 66 69 6e 65 20 68 69 6c 6f 28 77 6f 72 64 33  efine hilo(word3
3e30: 2c 77 6f 72 64 32 2c 77 6f 72 64 31 2c 77 6f 72  ,word2,word1,wor
3e40: 64 30 29 20 20 5c 0a 20 20 28 28 28 75 6e 73 69  d0)  \.  (((unsi
3e50: 67 6e 65 64 20 6c 6f 6e 67 29 20 28 77 6f 72 64  gned long) (word
3e60: 33 29 20 3c 3c 20 34 38 29 20 7c 20 28 28 75 6e  3) << 48) | ((un
3e70: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 77 6f  signed long) (wo
3e80: 72 64 32 29 20 3c 3c 20 33 32 29 20 7c 20 5c 0a  rd2) << 32) | \.
3e90: 20 20 20 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f     ((unsigned lo
3ea0: 6e 67 29 20 28 77 6f 72 64 31 29 20 3c 3c 20 31  ng) (word1) << 1
3eb0: 36 29 20 7c 20 28 75 6e 73 69 67 6e 65 64 20 6c  6) | (unsigned l
3ec0: 6f 6e 67 29 20 28 77 6f 72 64 30 29 29 0a 23 64  ong) (word0)).#d
3ed0: 65 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 72  efine tramp_addr
3ee0: 65 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c  ess(function)  \
3ef0: 0a 20 20 68 69 6c 6f 28 2a 28 75 6e 73 69 67 6e  .  hilo(*(unsign
3f00: 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e  ed short *) (fun
3f10: 63 74 69 6f 6e 20 2b 32 36 29 2c 20 5c 0a 20 20  ction +26), \.  
3f20: 20 20 20 20 20 2a 28 75 6e 73 69 67 6e 65 64 20       *(unsigned 
3f30: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
3f40: 6f 6e 20 2b 33 30 29 2c 20 5c 0a 20 20 20 20 20  on +30), \.     
3f50: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f    *(unsigned sho
3f60: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
3f70: 2b 33 38 29 2c 20 5c 0a 20 20 20 20 20 20 20 2a  +38), \.       *
3f80: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20  (unsigned short 
3f90: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 34 36  *) (function +46
3fa0: 29 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70  )).#define tramp
3fb0: 5f 64 61 74 61 28 66 75 6e 63 74 69 6f 6e 29 20  _data(function) 
3fc0: 20 5c 0a 20 20 68 69 6c 6f 28 2a 28 75 6e 73 69   \.  hilo(*(unsi
3fd0: 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66  gned short *) (f
3fe0: 75 6e 63 74 69 6f 6e 20 2b 20 32 29 2c 20 5c 0a  unction + 2), \.
3ff0: 20 20 20 20 20 20 20 2a 28 75 6e 73 69 67 6e 65         *(unsigne
4000: 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63  d short *) (func
4010: 74 69 6f 6e 20 2b 20 36 29 2c 20 5c 0a 20 20 20  tion + 6), \.   
4020: 20 20 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73      *(unsigned s
4030: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
4040: 6e 20 2b 31 34 29 2c 20 5c 0a 20 20 20 20 20 20  n +14), \.      
4050: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72   *(unsigned shor
4060: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
4070: 32 32 29 29 0a 23 65 6e 64 69 66 0a 23 69 66 64  22)).#endif.#ifd
4080: 65 66 20 5f 5f 6d 69 70 73 36 34 5f 5f 0a 20 20  ef __mips64__.  
4090: 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20  /* function:.   
40a0: 2a 20 20 20 20 6c 64 20 24 32 2c 31 36 28 24 32  *    ld $2,16($2
40b0: 35 29 09 09 09 44 46 20 32 32 20 30 30 20 31 30  5)...DF 22 00 10
40c0: 0a 20 20 20 2a 20 20 20 20 6c 64 20 24 32 35 2c  .   *    ld $25,
40d0: 32 34 28 24 32 35 29 09 09 09 44 46 20 33 39 20  24($25)...DF 39 
40e0: 30 30 20 31 38 0a 20 20 20 2a 20 20 20 20 6a 20  00 18.   *    j 
40f0: 24 32 35 09 09 09 09 30 33 20 32 30 20 30 30 20  $25....03 20 00 
4100: 30 38 0a 20 20 20 2a 20 20 20 20 6e 6f 70 09 09  08.   *    nop..
4110: 09 09 30 30 20 30 30 20 30 30 20 30 30 0a 20 20  ..00 00 00 00.  
4120: 20 2a 20 20 20 20 2e 64 77 6f 72 64 20 3c 64 61   *    .dword <da
4130: 74 61 3e 09 09 09 3c 64 61 74 61 3e 0a 20 20 20  ta>...<data>.   
4140: 2a 20 20 20 20 2e 64 77 6f 72 64 20 3c 61 64 64  *    .dword <add
4150: 72 65 73 73 3e 09 09 3c 61 64 64 72 65 73 73 3e  ress>..<address>
4160: 0a 20 20 20 2a 2f 0a 20 20 2a 28 75 6e 73 69 67  .   */.  *(unsig
4170: 6e 65 64 20 69 6e 74 20 2a 29 20 20 28 66 75 6e  ned int *)  (fun
4180: 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20 30 78 44  ction + 0) = 0xD
4190: 46 32 32 30 30 31 30 3b 0a 20 20 2a 28 75 6e 73  F220010;.  *(uns
41a0: 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 20 28 66  igned int *)  (f
41b0: 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 20 30  unction + 4) = 0
41c0: 78 44 46 33 39 30 30 31 38 3b 0a 20 20 2a 28 75  xDF390018;.  *(u
41d0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 20  nsigned int *)  
41e0: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d  (function + 8) =
41f0: 20 30 78 30 33 32 30 30 30 30 38 3b 0a 20 20 2a   0x03200008;.  *
4200: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29  (unsigned int *)
4210: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29    (function +12)
4220: 20 3d 20 30 78 30 30 30 30 30 30 30 30 3b 0a 20   = 0x00000000;. 
4230: 20 2a 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67   *(unsigned long
4240: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31   *) (function +1
4250: 36 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c  6) = (unsigned l
4260: 6f 6e 67 29 20 64 61 74 61 3b 0a 20 20 2a 28 75  ong) data;.  *(u
4270: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 29 20  nsigned long *) 
4280: 28 66 75 6e 63 74 69 6f 6e 20 2b 32 34 29 20 3d  (function +24) =
4290: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
42a0: 20 61 64 64 72 65 73 73 3b 0a 23 64 65 66 69 6e   address;.#defin
42b0: 65 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74  e is_tramp(funct
42c0: 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e 73 69  ion)  \.  *(unsi
42d0: 67 6e 65 64 20 69 6e 74 20 2a 29 20 20 28 66 75  gned int *)  (fu
42e0: 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 3d 20 30  nction + 0) == 0
42f0: 78 44 46 32 32 30 30 31 30 20 26 26 20 5c 0a 20  xDF220010 && \. 
4300: 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20   *(unsigned int 
4310: 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20  *)  (function + 
4320: 34 29 20 3d 3d 20 30 78 44 46 33 39 30 30 31 38  4) == 0xDF390018
4330: 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e   && \.  *(unsign
4340: 65 64 20 69 6e 74 20 2a 29 20 20 28 66 75 6e 63  ed int *)  (func
4350: 74 69 6f 6e 20 2b 20 38 29 20 3d 3d 20 30 78 30  tion + 8) == 0x0
4360: 33 32 30 30 30 30 38 20 26 26 20 5c 0a 20 20 2a  3200008 && \.  *
4370: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29  (unsigned int *)
4380: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29    (function +12)
4390: 20 3d 3d 20 30 78 30 30 30 30 30 30 30 30 0a 23   == 0x00000000.#
43a0: 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 64  define tramp_add
43b0: 72 65 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 20  ress(function)  
43c0: 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 6c  \.  *(unsigned l
43d0: 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ong *) (function
43e0: 20 2b 32 34 29 0a 23 64 65 66 69 6e 65 20 74 72   +24).#define tr
43f0: 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 74 69 6f  amp_data(functio
4400: 6e 29 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e  n)  \.  *(unsign
4410: 65 64 20 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63  ed long *) (func
4420: 74 69 6f 6e 20 2b 31 36 29 0a 23 65 6e 64 69 66  tion +16).#endif
4430: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 73  .#if defined(__s
4440: 70 61 72 63 5f 5f 29 20 26 26 20 21 64 65 66 69  parc__) && !defi
4450: 6e 65 64 28 5f 5f 73 70 61 72 63 36 34 5f 5f 29  ned(__sparc64__)
4460: 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a  .  /* function:.
4470: 20 20 20 2a 20 20 20 20 73 65 74 68 69 20 25 68     *    sethi %h
4480: 69 28 3c 64 61 74 61 3e 29 2c 25 67 32 09 09 30  i(<data>),%g2..0
4490: 35 30 30 30 30 30 30 20 7c 20 28 3c 64 61 74 61  5000000 | (<data
44a0: 3e 20 3e 3e 20 31 30 29 0a 20 20 20 2a 20 20 20  > >> 10).   *   
44b0: 20 73 65 74 68 69 20 25 68 69 28 3c 61 64 64 72   sethi %hi(<addr
44c0: 65 73 73 3e 29 2c 25 67 31 09 30 33 30 30 30 30  ess>),%g1.030000
44d0: 30 30 20 7c 20 28 3c 61 64 64 72 65 73 73 3e 20  00 | (<address> 
44e0: 3e 3e 20 31 30 29 0a 20 20 20 2a 20 20 20 20 6a  >> 10).   *    j
44f0: 6d 70 20 25 67 31 2b 25 6c 6f 28 3c 61 64 64 72  mp %g1+%lo(<addr
4500: 65 73 73 3e 29 09 09 38 31 43 30 36 30 30 30 20  ess>)..81C06000 
4510: 7c 20 28 3c 61 64 64 72 65 73 73 3e 20 26 20 30  | (<address> & 0
4520: 78 33 66 66 29 0a 20 20 20 2a 20 20 20 20 6f 72  x3ff).   *    or
4530: 20 25 67 32 2c 25 6c 6f 28 3c 64 61 74 61 3e 29   %g2,%lo(<data>)
4540: 2c 25 67 32 09 09 38 34 31 30 41 30 30 30 20 7c  ,%g2..8410A000 |
4550: 20 28 3c 64 61 74 61 3e 20 26 20 30 78 33 66 66   (<data> & 0x3ff
4560: 29 0a 20 20 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ).   */.#define 
4570: 68 69 28 77 6f 72 64 29 20 20 28 28 75 6e 73 69  hi(word)  ((unsi
4580: 67 6e 65 64 20 6c 6f 6e 67 29 20 28 77 6f 72 64  gned long) (word
4590: 29 20 3e 3e 20 31 30 29 0a 23 64 65 66 69 6e 65  ) >> 10).#define
45a0: 20 6c 6f 28 77 6f 72 64 29 20 20 28 28 75 6e 73   lo(word)  ((uns
45b0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 77 6f 72  igned long) (wor
45c0: 64 29 20 26 20 30 78 33 66 66 29 0a 20 20 2a 28  d) & 0x3ff).  *(
45d0: 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f  long *) (functio
45e0: 6e 20 2b 20 30 29 20 3d 20 30 78 30 35 30 30 30  n + 0) = 0x05000
45f0: 30 30 30 20 7c 20 68 69 28 64 61 74 61 29 3b 0a  000 | hi(data);.
4600: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e    *(long *) (fun
4610: 63 74 69 6f 6e 20 2b 20 34 29 20 3d 20 30 78 30  ction + 4) = 0x0
4620: 33 30 30 30 30 30 30 20 7c 20 68 69 28 61 64 64  3000000 | hi(add
4630: 72 65 73 73 29 3b 0a 20 20 2a 28 6c 6f 6e 67 20  ress);.  *(long 
4640: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38  *) (function + 8
4650: 29 20 3d 20 30 78 38 31 43 30 36 30 30 30 20 7c  ) = 0x81C06000 |
4660: 20 6c 6f 28 61 64 64 72 65 73 73 29 3b 0a 20 20   lo(address);.  
4670: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74  *(long *) (funct
4680: 69 6f 6e 20 2b 31 32 29 20 3d 20 30 78 38 34 31  ion +12) = 0x841
4690: 30 41 30 30 30 20 7c 20 6c 6f 28 64 61 74 61 29  0A000 | lo(data)
46a0: 3b 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72 61  ;.#define is_tra
46b0: 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a  mp(function)  \.
46c0: 20 20 28 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75    (*(long *) (fu
46d0: 6e 63 74 69 6f 6e 20 2b 20 30 29 20 26 20 30 78  nction + 0) & 0x
46e0: 66 66 63 30 30 30 30 30 29 20 3d 3d 20 30 78 30  ffc00000) == 0x0
46f0: 35 30 30 30 30 30 30 20 26 26 20 5c 0a 20 20 28  5000000 && \.  (
4700: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74  *(long *) (funct
4710: 69 6f 6e 20 2b 20 34 29 20 26 20 30 78 66 66 63  ion + 4) & 0xffc
4720: 30 30 30 30 30 29 20 3d 3d 20 30 78 30 33 30 30  00000) == 0x0300
4730: 30 30 30 30 20 26 26 20 5c 0a 20 20 28 2a 28 6c  0000 && \.  (*(l
4740: 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ong *) (function
4750: 20 2b 20 38 29 20 26 20 30 78 66 66 66 66 66 63   + 8) & 0xfffffc
4760: 30 30 29 20 3d 3d 20 30 78 38 31 43 30 36 30 30  00) == 0x81C0600
4770: 30 20 26 26 20 5c 0a 20 20 28 2a 28 6c 6f 6e 67  0 && \.  (*(long
4780: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31   *) (function +1
4790: 32 29 20 26 20 30 78 66 66 66 66 66 63 30 30 29  2) & 0xfffffc00)
47a0: 20 3d 3d 20 30 78 38 34 31 30 41 30 30 30 0a 23   == 0x8410A000.#
47b0: 64 65 66 69 6e 65 20 68 69 6c 6f 28 68 69 77 6f  define hilo(hiwo
47c0: 72 64 2c 6c 6f 77 6f 72 64 29 20 20 28 28 28 68  rd,loword)  (((h
47d0: 69 77 6f 72 64 29 20 3c 3c 20 31 30 29 20 7c 20  iword) << 10) | 
47e0: 28 28 6c 6f 77 6f 72 64 29 20 26 20 30 78 33 66  ((loword) & 0x3f
47f0: 66 29 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d  f)).#define tram
4800: 70 5f 61 64 64 72 65 73 73 28 66 75 6e 63 74 69  p_address(functi
4810: 6f 6e 29 20 20 5c 0a 20 20 68 69 6c 6f 28 2a 28  on)  \.  hilo(*(
4820: 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f  long *) (functio
4830: 6e 20 2b 20 34 29 2c 20 2a 28 6c 6f 6e 67 20 2a  n + 4), *(long *
4840: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29  ) (function + 8)
4850: 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f  ).#define tramp_
4860: 64 61 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 20  data(function)  
4870: 5c 0a 20 20 68 69 6c 6f 28 2a 28 6c 6f 6e 67 20  \.  hilo(*(long 
4880: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30  *) (function + 0
4890: 29 2c 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75  ), *(long *) (fu
48a0: 6e 63 74 69 6f 6e 20 2b 31 32 29 29 0a 23 65 6e  nction +12)).#en
48b0: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 73 70 61  dif.#ifdef __spa
48c0: 72 63 36 34 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63  rc64__.  /* func
48d0: 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 72 64  tion:.   *    rd
48e0: 20 25 70 63 2c 25 67 31 09 09 09 38 33 34 31 34   %pc,%g1...83414
48f0: 30 30 30 0a 20 20 20 2a 20 20 20 20 6c 64 78 20  000.   *    ldx 
4900: 5b 25 67 31 2b 32 34 5d 2c 25 67 32 09 09 43 34  [%g1+24],%g2..C4
4910: 35 38 36 30 31 38 0a 20 20 20 2a 20 20 20 20 6a  586018.   *    j
4920: 6d 70 20 25 67 32 09 09 09 09 38 31 43 30 38 30  mp %g2....81C080
4930: 30 30 0a 20 20 20 2a 20 20 20 20 6c 64 78 20 5b  00.   *    ldx [
4940: 25 67 31 2b 31 36 5d 2c 25 67 35 09 09 43 41 35  %g1+16],%g5..CA5
4950: 38 36 30 31 30 0a 20 20 20 2a 20 20 20 20 2e 6c  86010.   *    .l
4960: 6f 6e 67 20 68 69 67 68 33 32 28 3c 64 61 74 61  ong high32(<data
4970: 3e 29 09 09 3c 64 61 74 61 3e 20 3e 3e 20 33 32  >)..<data> >> 32
4980: 0a 20 20 20 2a 20 20 20 20 2e 6c 6f 6e 67 20 6c  .   *    .long l
4990: 6f 77 33 32 28 3c 64 61 74 61 3e 29 09 09 3c 64  ow32(<data>)..<d
49a0: 61 74 61 3e 20 26 20 30 78 66 66 66 66 66 66 66  ata> & 0xfffffff
49b0: 66 0a 20 20 20 2a 20 20 20 20 2e 6c 6f 6e 67 20  f.   *    .long 
49c0: 68 69 67 68 33 32 28 3c 61 64 64 72 65 73 73 3e  high32(<address>
49d0: 29 09 09 3c 61 64 64 72 65 73 73 3e 20 3e 3e 20  )..<address> >> 
49e0: 33 32 0a 20 20 20 2a 20 20 20 20 2e 6c 6f 6e 67  32.   *    .long
49f0: 20 6c 6f 77 33 32 28 3c 61 64 64 72 65 73 73 3e   low32(<address>
4a00: 29 09 09 3c 61 64 64 72 65 73 73 3e 20 26 20 30  )..<address> & 0
4a10: 78 66 66 66 66 66 66 66 66 0a 20 20 20 2a 2f 0a  xffffffff.   */.
4a20: 20 20 2a 28 69 6e 74 20 2a 29 20 20 28 66 75 6e    *(int *)  (fun
4a30: 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20 30 78 38  ction + 0) = 0x8
4a40: 33 34 31 34 30 30 30 3b 0a 20 20 2a 28 69 6e 74  3414000;.  *(int
4a50: 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b   *)  (function +
4a60: 20 34 29 20 3d 20 30 78 43 34 35 38 36 30 31 38   4) = 0xC4586018
4a70: 3b 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 28 66  ;.  *(int *)  (f
4a80: 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 30  unction + 8) = 0
4a90: 78 38 31 43 30 38 30 30 30 3b 0a 20 20 2a 28 69  x81C08000;.  *(i
4aa0: 6e 74 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e  nt *)  (function
4ab0: 20 2b 31 32 29 20 3d 20 30 78 43 41 35 38 36 30   +12) = 0xCA5860
4ac0: 31 30 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20  10;.  *(long *) 
4ad0: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d  (function +16) =
4ae0: 20 28 6c 6f 6e 67 29 20 64 61 74 61 3b 0a 20 20   (long) data;.  
4af0: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74  *(long *) (funct
4b00: 69 6f 6e 20 2b 32 34 29 20 3d 20 28 6c 6f 6e 67  ion +24) = (long
4b10: 29 20 61 64 64 72 65 73 73 3b 0a 23 64 65 66 69  ) address;.#defi
4b20: 6e 65 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63  ne is_tramp(func
4b30: 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 69 6e 74  tion)  \.  *(int
4b40: 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b   *)  (function +
4b50: 20 30 29 20 3d 3d 20 30 78 38 33 34 31 34 30 30   0) == 0x8341400
4b60: 30 20 26 26 20 5c 0a 20 20 2a 28 69 6e 74 20 2a  0 && \.  *(int *
4b70: 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34  )  (function + 4
4b80: 29 20 3d 3d 20 30 78 43 34 35 38 36 30 31 38 20  ) == 0xC4586018 
4b90: 26 26 20 5c 0a 20 20 2a 28 69 6e 74 20 2a 29 20  && \.  *(int *) 
4ba0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20   (function + 8) 
4bb0: 3d 3d 20 30 78 38 31 43 30 38 30 30 30 20 26 26  == 0x81C08000 &&
4bc0: 20 5c 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 28   \.  *(int *)  (
4bd0: 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d 3d  function +12) ==
4be0: 20 30 78 43 41 35 38 36 30 31 30 0a 23 64 65 66   0xCA586010.#def
4bf0: 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 65 73  ine tramp_addres
4c00: 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20  s(function)  \. 
4c10: 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63   *(long *) (func
4c20: 74 69 6f 6e 20 2b 32 34 29 0a 23 64 65 66 69 6e  tion +24).#defin
4c30: 65 20 74 72 61 6d 70 5f 64 61 74 61 28 66 75 6e  e tramp_data(fun
4c40: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 6c 6f  ction)  \.  *(lo
4c50: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  ng *) (function 
4c60: 2b 31 36 29 0a 23 65 6e 64 69 66 0a 23 69 66 64  +16).#endif.#ifd
4c70: 65 66 20 5f 5f 61 6c 70 68 61 5f 5f 0a 20 20 2f  ef __alpha__.  /
4c80: 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a  * function:.   *
4c90: 20 20 20 20 62 72 20 24 31 2c 66 75 6e 63 74 69      br $1,functi
4ca0: 6f 6e 2e 2e 6e 67 09 30 30 20 30 30 20 32 30 20  on..ng.00 00 20 
4cb0: 43 30 0a 20 20 20 2a 20 66 75 6e 63 74 69 6f 6e  C0.   * function
4cc0: 2e 2e 6e 67 3a 0a 20 20 20 2a 20 20 20 20 6c 64  ..ng:.   *    ld
4cd0: 71 20 24 32 37 2c 32 30 28 24 31 29 09 09 31 34  q $27,20($1)..14
4ce0: 20 30 30 20 36 31 20 41 37 0a 20 20 20 2a 20 20   00 61 A7.   *  
4cf0: 20 20 6c 64 71 20 24 31 2c 31 32 28 24 31 29 09    ldq $1,12($1).
4d00: 09 30 43 20 30 30 20 32 31 20 41 34 0a 20 20 20  .0C 00 21 A4.   
4d10: 2a 20 20 20 20 6a 6d 70 20 24 33 31 2c 28 24 32  *    jmp $31,($2
4d20: 37 29 2c 30 09 09 30 30 20 30 30 20 46 42 20 36  7),0..00 00 FB 6
4d30: 42 0a 20 20 20 2a 20 20 20 20 2e 71 75 61 64 20  B.   *    .quad 
4d40: 3c 64 61 74 61 3e 09 09 3c 64 61 74 61 3e 0a 20  <data>..<data>. 
4d50: 20 20 2a 20 20 20 20 2e 71 75 61 64 20 3c 61 64    *    .quad <ad
4d60: 64 72 65 73 73 3e 09 09 3c 61 64 64 72 65 73 73  dress>..<address
4d70: 3e 0a 20 20 20 2a 2f 0a 20 20 7b 20 73 74 61 74  >.   */.  { stat
4d80: 69 63 20 69 6e 74 20 63 6f 64 65 20 5b 34 5d 20  ic int code [4] 
4d90: 3d 0a 20 20 20 20 20 20 7b 20 30 78 43 30 32 30  =.      { 0xC020
4da0: 30 30 30 30 2c 20 30 78 41 37 36 31 30 30 31 34  0000, 0xA7610014
4db0: 2c 20 30 78 41 34 32 31 30 30 30 43 2c 20 30 78  , 0xA421000C, 0x
4dc0: 36 42 46 42 30 30 30 30 20 7d 3b 0a 20 20 20 20  6BFB0000 };.    
4dd0: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 20 28  int i;.    for (
4de0: 69 3d 30 3b 20 69 3c 34 3b 20 69 2b 2b 29 20 7b  i=0; i<4; i++) {
4df0: 20 28 28 69 6e 74 20 2a 29 20 66 75 6e 63 74 69   ((int *) functi
4e00: 6f 6e 29 5b 69 5d 20 3d 20 63 6f 64 65 5b 69 5d  on)[i] = code[i]
4e10: 3b 20 7d 0a 20 20 20 20 28 28 6c 6f 6e 67 20 2a  ; }.    ((long *
4e20: 29 20 66 75 6e 63 74 69 6f 6e 29 5b 32 5d 20 3d  ) function)[2] =
4e30: 20 28 6c 6f 6e 67 29 20 64 61 74 61 3b 0a 20 20   (long) data;.  
4e40: 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63    ((long *) func
4e50: 74 69 6f 6e 29 5b 33 5d 20 3d 20 28 6c 6f 6e 67  tion)[3] = (long
4e60: 29 20 61 64 64 72 65 73 73 3b 0a 20 20 7d 0a 23  ) address;.  }.#
4e70: 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 28  define is_tramp(
4e80: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28  function)  \.  (
4e90: 28 69 6e 74 20 2a 29 20 66 75 6e 63 74 69 6f 6e  (int *) function
4ea0: 29 5b 30 5d 20 3d 3d 20 30 78 43 30 32 30 30 30  )[0] == 0xC02000
4eb0: 30 30 20 26 26 20 5c 0a 20 20 28 28 69 6e 74 20  00 && \.  ((int 
4ec0: 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 31 5d 20  *) function)[1] 
4ed0: 3d 3d 20 30 78 41 37 36 31 30 30 31 34 20 26 26  == 0xA7610014 &&
4ee0: 20 5c 0a 20 20 28 28 69 6e 74 20 2a 29 20 66 75   \.  ((int *) fu
4ef0: 6e 63 74 69 6f 6e 29 5b 32 5d 20 3d 3d 20 30 78  nction)[2] == 0x
4f00: 41 34 32 31 30 30 30 43 20 26 26 20 5c 0a 20 20  A421000C && \.  
4f10: 28 28 69 6e 74 20 2a 29 20 66 75 6e 63 74 69 6f  ((int *) functio
4f20: 6e 29 5b 33 5d 20 3d 3d 20 30 78 36 42 46 42 30  n)[3] == 0x6BFB0
4f30: 30 30 30 0a 23 64 65 66 69 6e 65 20 74 72 61 6d  000.#define tram
4f40: 70 5f 61 64 64 72 65 73 73 28 66 75 6e 63 74 69  p_address(functi
4f50: 6f 6e 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20  on)  \.  ((long 
4f60: 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 33 5d 0a  *) function)[3].
4f70: 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61  #define tramp_da
4f80: 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a  ta(function)  \.
4f90: 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63    ((long *) func
4fa0: 74 69 6f 6e 29 5b 32 5d 0a 23 65 6e 64 69 66 0a  tion)[2].#endif.
4fb0: 23 69 66 64 65 66 20 5f 5f 68 70 70 61 6f 6c 64  #ifdef __hppaold
4fc0: 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e  __.  /* function
4fd0: 3a 0a 20 20 20 2a 20 20 20 20 6c 64 69 6c 20 4c  :.   *    ldil L
4fe0: 27 3c 64 61 74 61 3e 2c 25 72 32 39 09 09 32 33  '<data>,%r29..23
4ff0: 41 30 30 30 30 30 20 7c 20 68 69 28 3c 64 61 74  A00000 | hi(<dat
5000: 61 3e 29 0a 20 20 20 2a 20 20 20 20 6c 64 69 6c  a>).   *    ldil
5010: 20 4c 27 3c 61 64 64 72 65 73 73 3e 2c 25 72 32   L'<address>,%r2
5020: 31 09 09 32 32 41 30 30 30 30 30 20 7c 20 68 69  1..22A00000 | hi
5030: 28 3c 61 64 64 72 65 73 73 3e 29 0a 20 20 20 2a  (<address>).   *
5040: 20 20 20 20 6c 64 6f 20 52 27 3c 64 61 74 61 3e      ldo R'<data>
5050: 28 25 72 32 39 29 2c 25 72 32 39 09 09 33 37 42  (%r29),%r29..37B
5060: 44 30 30 30 30 20 7c 20 6c 6f 28 3c 64 61 74 61  D0000 | lo(<data
5070: 3e 29 0a 20 20 20 2a 20 20 20 20 6c 64 6f 20 52  >).   *    ldo R
5080: 27 3c 61 64 64 72 65 73 73 3e 28 25 72 32 31 29  '<address>(%r21)
5090: 2c 25 72 32 31 09 33 36 42 35 30 30 30 30 20 7c  ,%r21.36B50000 |
50a0: 20 6c 6f 28 3c 61 64 64 72 65 73 73 3e 29 0a 20   lo(<address>). 
50b0: 20 20 2a 20 20 20 20 62 62 2c 3e 3d 2c 6e 20 25    *    bb,>=,n %
50c0: 72 32 31 2c 33 30 2c 66 75 6e 63 74 69 6f 6e 32  r21,30,function2
50d0: 09 43 37 44 35 43 30 31 32 0a 20 20 20 2a 20 20  .C7D5C012.   *  
50e0: 20 20 64 65 70 69 20 30 2c 33 31 2c 32 2c 25 72    depi 0,31,2,%r
50f0: 32 31 09 09 44 36 41 30 31 43 31 45 0a 20 20 20  21..D6A01C1E.   
5100: 2a 20 20 20 20 6c 64 77 20 34 28 30 2c 25 72 32  *    ldw 4(0,%r2
5110: 31 29 2c 25 72 31 39 09 09 34 41 42 33 30 30 30  1),%r19..4AB3000
5120: 38 0a 20 20 20 2a 20 20 20 20 6c 64 77 20 30 28  8.   *    ldw 0(
5130: 30 2c 25 72 32 31 29 2c 25 72 32 31 09 09 34 41  0,%r21),%r21..4A
5140: 42 35 30 30 30 30 0a 20 20 20 2a 20 66 75 6e 63  B50000.   * func
5150: 74 69 6f 6e 32 3a 0a 20 20 20 2a 20 20 20 20 6c  tion2:.   *    l
5160: 64 73 69 64 20 28 30 2c 25 72 32 31 29 2c 25 72  dsid (0,%r21),%r
5170: 31 09 09 30 32 41 30 31 30 41 31 0a 20 20 20 2a  1..02A010A1.   *
5180: 20 20 20 20 6d 74 73 70 20 25 72 31 2c 25 73 72      mtsp %r1,%sr
5190: 30 09 09 09 30 30 30 31 31 38 32 30 0a 20 20 20  0...00011820.   
51a0: 2a 20 20 20 20 62 65 2c 6e 20 30 28 25 73 72 30  *    be,n 0(%sr0
51b0: 2c 25 72 32 31 29 09 09 45 32 41 30 30 30 30 32  ,%r21)..E2A00002
51c0: 0a 20 20 20 2a 20 20 20 20 6e 6f 70 09 09 09 09  .   *    nop....
51d0: 30 38 30 30 30 32 34 30 0a 20 20 20 2a 2f 0a 20  08000240.   */. 
51e0: 20 2f 2a 20 57 68 65 6e 20 64 65 63 6f 64 69 6e   /* When decodin
51f0: 67 20 61 20 32 31 2d 62 69 74 20 61 72 67 75 6d  g a 21-bit argum
5200: 65 6e 74 20 69 6e 20 61 6e 20 69 6e 73 74 72 75  ent in an instru
5210: 63 74 69 6f 6e 2c 20 74 68 65 20 68 70 70 61 20  ction, the hppa 
5220: 70 65 72 66 6f 72 6d 73 0a 20 20 20 2a 20 74 68  performs.   * th
5230: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20  e following bit 
5240: 6d 61 6e 69 70 75 6c 61 74 69 6f 6e 3a 0a 20 20  manipulation:.  
5250: 20 2a 20 61 73 73 65 6d 62 6c 65 32 31 3a 20 78   * assemble21: x
5260: 5b 32 30 5d 2e 2e 2e 78 5b 30 5d 0a 20 20 20 2a  [20]...x[0].   *
5270: 20 20 20 20 20 20 20 2d 2d 3e 20 78 5b 30 5d 20         --> x[0] 
5280: 78 5b 31 31 5d 2e 2e 2e 78 5b 31 5d 20 78 5b 31  x[11]...x[1] x[1
5290: 35 5d 2e 2e 78 5b 31 34 5d 20 78 5b 32 30 5d 2e  5]..x[14] x[20].
52a0: 2e 2e 78 5b 31 36 5d 20 78 5b 31 33 5d 2e 2e 78  ..x[16] x[13]..x
52b0: 5b 31 32 5d 0a 20 20 20 2a 20 57 68 65 6e 20 65  [12].   * When e
52c0: 6e 63 6f 64 69 6e 67 20 61 20 32 31 2d 62 69 74  ncoding a 21-bit
52d0: 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 61   argument into a
52e0: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 77  n instruction, w
52f0: 65 20 6e 65 65 64 20 74 68 65 0a 20 20 20 2a 20  e need the.   * 
5300: 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65 20 72  to perform the r
5310: 65 76 65 72 73 65 20 70 65 72 6d 75 74 61 74 69  everse permutati
5320: 6f 6e 3a 0a 20 20 20 2a 20 70 65 72 6d 75 74 65  on:.   * permute
5330: 32 31 3a 20 20 79 5b 32 30 5d 2e 2e 2e 79 5b 30  21:  y[20]...y[0
5340: 5d 0a 20 20 20 2a 20 20 20 20 20 20 20 2d 2d 3e  ].   *       -->
5350: 20 79 5b 36 5d 2e 2e 2e 79 5b 32 5d 20 79 5b 38   y[6]...y[2] y[8
5360: 5d 2e 2e 79 5b 37 5d 20 79 5b 31 5d 2e 2e 79 5b  ]..y[7] y[1]..y[
5370: 30 5d 20 79 5b 31 39 5d 2e 2e 2e 79 5b 39 5d 20  0] y[19]...y[9] 
5380: 79 5b 32 30 5d 0a 20 20 20 2a 2f 0a 23 64 65 66  y[20].   */.#def
5390: 69 6e 65 20 61 73 73 65 6d 62 6c 65 32 31 28 78  ine assemble21(x
53a0: 29 20 20 5c 0a 20 20 28 28 28 28 78 29 20 26 20  )  \.  ((((x) & 
53b0: 30 78 31 29 20 3c 3c 20 32 30 29 20 7c 20 28 28  0x1) << 20) | ((
53c0: 28 78 29 20 26 20 30 78 46 46 45 29 20 3c 3c 20  (x) & 0xFFE) << 
53d0: 38 29 20 7c 20 5c 0a 20 20 20 28 28 28 78 29 20  8) | \.   (((x) 
53e0: 26 20 30 78 43 30 30 30 29 20 3e 3e 20 37 29 20  & 0xC000) >> 7) 
53f0: 7c 20 28 28 28 78 29 20 26 20 30 78 31 46 30 30  | (((x) & 0x1F00
5400: 30 30 29 20 3e 3e 20 31 34 29 20 7c 20 28 28 28  00) >> 14) | (((
5410: 78 29 20 26 20 30 78 33 30 30 30 29 20 3e 3e 20  x) & 0x3000) >> 
5420: 31 32 29 29 0a 23 64 65 66 69 6e 65 20 70 65 72  12)).#define per
5430: 6d 75 74 65 32 31 28 79 29 20 20 5c 0a 20 20 28  mute21(y)  \.  (
5440: 28 28 28 79 29 20 26 20 30 78 37 43 29 20 3c 3c  (((y) & 0x7C) <<
5450: 20 31 34 29 20 7c 20 28 28 28 79 29 20 26 20 30   14) | (((y) & 0
5460: 78 31 38 30 29 20 3c 3c 20 37 29 20 7c 20 28 28  x180) << 7) | ((
5470: 28 79 29 20 26 20 30 78 33 29 20 3c 3c 20 31 32  (y) & 0x3) << 12
5480: 29 20 7c 20 5c 0a 20 20 20 28 28 28 79 29 20 26  ) | \.   (((y) &
5490: 20 30 78 46 46 45 30 30 29 20 3e 3e 20 38 29 20   0xFFE00) >> 8) 
54a0: 7c 20 28 28 28 79 29 20 26 20 30 78 31 30 30 30  | (((y) & 0x1000
54b0: 30 30 29 20 3e 3e 20 32 30 29 29 0a 23 64 65 66  00) >> 20)).#def
54c0: 69 6e 65 20 68 69 28 77 6f 72 64 29 20 20 70 65  ine hi(word)  pe
54d0: 72 6d 75 74 65 32 31 28 28 75 6e 73 69 67 6e 65  rmute21((unsigne
54e0: 64 20 6c 6f 6e 67 29 20 28 77 6f 72 64 29 20 3e  d long) (word) >
54f0: 3e 20 31 31 29 0a 23 64 65 66 69 6e 65 20 6c 6f  > 11).#define lo
5500: 28 77 6f 72 64 29 20 20 28 28 28 75 6e 73 69 67  (word)  (((unsig
5510: 6e 65 64 20 6c 6f 6e 67 29 20 28 77 6f 72 64 29  ned long) (word)
5520: 20 26 20 30 78 37 46 46 29 20 3c 3c 20 31 29 0a   & 0x7FF) << 1).
5530: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e    *(long *) (fun
5540: 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20 30 78 32  ction + 0) = 0x2
5550: 33 41 30 30 30 30 30 20 7c 20 68 69 28 64 61 74  3A00000 | hi(dat
5560: 61 29 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20  a);.  *(long *) 
5570: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d  (function + 4) =
5580: 20 30 78 32 32 41 30 30 30 30 30 20 7c 20 68 69   0x22A00000 | hi
5590: 28 61 64 64 72 65 73 73 29 3b 0a 20 20 2a 28 6c  (address);.  *(l
55a0: 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ong *) (function
55b0: 20 2b 20 38 29 20 3d 20 30 78 33 37 42 44 30 30   + 8) = 0x37BD00
55c0: 30 30 20 7c 20 6c 6f 28 64 61 74 61 29 3b 0a 20  00 | lo(data);. 
55d0: 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63   *(long *) (func
55e0: 74 69 6f 6e 20 2b 31 32 29 20 3d 20 30 78 33 36  tion +12) = 0x36
55f0: 42 35 30 30 30 30 20 7c 20 6c 6f 28 61 64 64 72  B50000 | lo(addr
5600: 65 73 73 29 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a  ess);.  *(long *
5610: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29  ) (function +16)
5620: 20 3d 20 30 78 43 37 44 35 43 30 31 32 3b 0a 20   = 0xC7D5C012;. 
5630: 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63   *(long *) (func
5640: 74 69 6f 6e 20 2b 32 30 29 20 3d 20 30 78 44 36  tion +20) = 0xD6
5650: 41 30 31 43 31 45 3b 0a 20 20 2a 28 6c 6f 6e 67  A01C1E;.  *(long
5660: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32   *) (function +2
5670: 34 29 20 3d 20 30 78 34 41 42 33 30 30 30 38 3b  4) = 0x4AB30008;
5680: 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75  .  *(long *) (fu
5690: 6e 63 74 69 6f 6e 20 2b 32 38 29 20 3d 20 30 78  nction +28) = 0x
56a0: 34 41 42 35 30 30 30 30 3b 0a 20 20 2a 28 6c 6f  4AB50000;.  *(lo
56b0: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  ng *) (function 
56c0: 2b 33 32 29 20 3d 20 30 78 30 32 41 30 31 30 41  +32) = 0x02A010A
56d0: 31 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28  1;.  *(long *) (
56e0: 66 75 6e 63 74 69 6f 6e 20 2b 33 36 29 20 3d 20  function +36) = 
56f0: 30 78 30 30 30 31 31 38 32 30 3b 0a 20 20 2a 28  0x00011820;.  *(
5700: 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f  long *) (functio
5710: 6e 20 2b 34 30 29 20 3d 20 30 78 45 32 41 30 30  n +40) = 0xE2A00
5720: 30 30 32 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29  002;.  *(long *)
5730: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 34 34 29 20   (function +44) 
5740: 3d 20 30 78 30 38 30 30 30 32 34 30 3b 0a 23 64  = 0x08000240;.#d
5750: 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 28 66  efine is_tramp(f
5760: 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 28  unction)  \.  ((
5770: 6c 6f 6e 67 29 20 66 75 6e 63 74 69 6f 6e 20 26  long) function &
5780: 20 33 29 20 3d 3d 20 30 20 26 26 20 5c 0a 20 20   3) == 0 && \.  
5790: 28 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63  (*(long *) (func
57a0: 74 69 6f 6e 20 2b 20 30 29 20 26 20 30 78 66 66  tion + 0) & 0xff
57b0: 65 30 30 30 30 30 29 20 3d 3d 20 30 78 32 33 41  e00000) == 0x23A
57c0: 30 30 30 30 30 20 26 26 20 5c 0a 20 20 28 2a 28  00000 && \.  (*(
57d0: 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f  long *) (functio
57e0: 6e 20 2b 20 34 29 20 26 20 30 78 66 66 65 30 30  n + 4) & 0xffe00
57f0: 30 30 30 29 20 3d 3d 20 30 78 32 32 41 30 30 30  000) == 0x22A000
5800: 30 30 20 26 26 20 5c 0a 20 20 28 2a 28 6c 6f 6e  00 && \.  (*(lon
5810: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  g *) (function +
5820: 20 38 29 20 26 20 30 78 66 66 66 66 66 30 30 30   8) & 0xfffff000
5830: 29 20 3d 3d 20 30 78 33 37 42 44 30 30 30 30 20  ) == 0x37BD0000 
5840: 26 26 20 5c 0a 20 20 28 2a 28 6c 6f 6e 67 20 2a  && \.  (*(long *
5850: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29  ) (function +12)
5860: 20 26 20 30 78 66 66 66 66 66 30 30 30 29 20 3d   & 0xfffff000) =
5870: 3d 20 30 78 33 36 42 35 30 30 30 30 20 26 26 20  = 0x36B50000 && 
5880: 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66  \.  *(long *) (f
5890: 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 3d 20  unction +16) == 
58a0: 30 78 43 37 44 35 43 30 31 32 20 26 26 20 5c 0a  0xC7D5C012 && \.
58b0: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e    *(long *) (fun
58c0: 63 74 69 6f 6e 20 2b 32 30 29 20 3d 3d 20 30 78  ction +20) == 0x
58d0: 44 36 41 30 31 43 31 45 20 26 26 20 5c 0a 20 20  D6A01C1E && \.  
58e0: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74  *(long *) (funct
58f0: 69 6f 6e 20 2b 32 34 29 20 3d 3d 20 30 78 34 41  ion +24) == 0x4A
5900: 42 33 30 30 30 38 20 26 26 20 5c 0a 20 20 2a 28  B30008 && \.  *(
5910: 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f  long *) (functio
5920: 6e 20 2b 32 38 29 20 3d 3d 20 30 78 34 41 42 35  n +28) == 0x4AB5
5930: 30 30 30 30 20 26 26 20 5c 0a 20 20 2a 28 6c 6f  0000 && \.  *(lo
5940: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  ng *) (function 
5950: 2b 33 32 29 20 3d 3d 20 30 78 30 32 41 30 31 30  +32) == 0x02A010
5960: 41 31 20 26 26 20 5c 0a 20 20 2a 28 6c 6f 6e 67  A1 && \.  *(long
5970: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 33   *) (function +3
5980: 36 29 20 3d 3d 20 30 78 30 30 30 31 31 38 32 30  6) == 0x00011820
5990: 20 26 26 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a   && \.  *(long *
59a0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 34 30 29  ) (function +40)
59b0: 20 3d 3d 20 30 78 45 32 41 30 30 30 30 32 20 26   == 0xE2A00002 &
59c0: 26 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20  & \.  *(long *) 
59d0: 28 66 75 6e 63 74 69 6f 6e 20 2b 34 34 29 20 3d  (function +44) =
59e0: 3d 20 30 78 30 38 30 30 30 32 34 30 0a 23 64 65  = 0x08000240.#de
59f0: 66 69 6e 65 20 68 69 6c 6f 28 68 69 77 6f 72 64  fine hilo(hiword
5a00: 2c 6c 6f 77 6f 72 64 29 20 20 5c 0a 20 20 28 28  ,loword)  \.  ((
5a10: 61 73 73 65 6d 62 6c 65 32 31 28 28 75 6e 73 69  assemble21((unsi
5a20: 67 6e 65 64 20 6c 6f 6e 67 29 20 28 68 69 77 6f  gned long) (hiwo
5a30: 72 64 29 29 20 3c 3c 20 31 31 29 20 7c 20 5c 0a  rd)) << 11) | \.
5a40: 20 20 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c     (((unsigned l
5a50: 6f 6e 67 29 20 28 6c 6f 77 6f 72 64 29 20 26 20  ong) (loword) & 
5a60: 30 78 46 46 45 29 20 3e 3e 20 31 29 20 5c 0a 20  0xFFE) >> 1) \. 
5a70: 20 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70   ).#define tramp
5a80: 5f 61 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f  _address(functio
5a90: 6e 29 20 20 5c 0a 20 20 68 69 6c 6f 28 2a 28 6c  n)  \.  hilo(*(l
5aa0: 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ong *) (function
5ab0: 20 2b 20 34 29 2c 20 2a 28 6c 6f 6e 67 20 2a 29   + 4), *(long *)
5ac0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 29   (function +12))
5ad0: 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 64  .#define tramp_d
5ae0: 61 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c  ata(function)  \
5af0: 0a 20 20 68 69 6c 6f 28 2a 28 6c 6f 6e 67 20 2a  .  hilo(*(long *
5b00: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29  ) (function + 0)
5b10: 2c 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e  , *(long *) (fun
5b20: 63 74 69 6f 6e 20 2b 20 38 29 29 0a 23 65 6e 64  ction + 8)).#end
5b30: 69 66 0a 23 69 66 64 65 66 20 5f 5f 68 70 70 61  if.#ifdef __hppa
5b40: 6e 65 77 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74  new__.  /* funct
5b50: 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 2e 6c 6f  ion:.   *    .lo
5b60: 6e 67 20 20 20 74 72 61 6d 70 5f 72 0a 20 20 20  ng   tramp_r.   
5b70: 2a 20 20 20 20 2e 6c 6f 6e 67 20 20 20 63 6c 6f  *    .long   clo
5b80: 73 75 72 65 0a 20 20 20 2a 20 63 6c 6f 73 75 72  sure.   * closur
5b90: 65 3a 0a 20 20 20 2a 20 20 20 20 2e 6c 6f 6e 67  e:.   *    .long
5ba0: 20 20 20 3c 64 61 74 61 3e 0a 20 20 20 2a 20 20     <data>.   *  
5bb0: 20 20 2e 6c 6f 6e 67 20 20 20 3c 61 64 64 72 65    .long   <addre
5bc0: 73 73 3e 0a 20 20 20 2a 2f 0a 20 20 7b 20 2f 2a  ss>.   */.  { /*
5bd0: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 62   work around a b
5be0: 75 67 20 69 6e 20 67 63 63 20 33 2e 2a 20 2a 2f  ug in gcc 3.* */
5bf0: 0a 20 20 20 20 76 6f 69 64 2a 20 74 72 61 6d 70  .    void* tramp
5c00: 5f 72 5f 61 64 64 72 65 73 73 20 3d 20 26 74 72  _r_address = &tr
5c10: 61 6d 70 5f 72 3b 0a 20 20 20 20 2a 28 6c 6f 6e  amp_r;.    *(lon
5c20: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  g *) (function +
5c30: 20 30 29 20 3d 20 28 28 6c 6f 6e 67 20 2a 29 20   0) = ((long *) 
5c40: 28 28 63 68 61 72 2a 29 74 72 61 6d 70 5f 72 5f  ((char*)tramp_r_
5c50: 61 64 64 72 65 73 73 2d 32 29 29 5b 30 5d 3b 0a  address-2))[0];.
5c60: 20 20 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66      *(long *) (f
5c70: 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 20 28  unction + 4) = (
5c80: 6c 6f 6e 67 29 20 28 66 75 6e 63 74 69 6f 6e 20  long) (function 
5c90: 2b 20 38 29 3b 0a 20 20 20 20 2a 28 6c 6f 6e 67  + 8);.    *(long
5ca0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20   *) (function + 
5cb0: 38 29 20 3d 20 28 6c 6f 6e 67 29 20 64 61 74 61  8) = (long) data
5cc0: 3b 0a 20 20 20 20 2a 28 6c 6f 6e 67 20 2a 29 20  ;.    *(long *) 
5cd0: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d  (function +12) =
5ce0: 20 28 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 3b   (long) address;
5cf0: 0a 20 20 7d 0a 23 64 65 66 69 6e 65 20 69 73 5f  .  }.#define is_
5d00: 74 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20  tramp(function) 
5d10: 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66   \.  ((long *) f
5d20: 75 6e 63 74 69 6f 6e 29 5b 30 5d 20 3d 3d 20 28  unction)[0] == (
5d30: 28 6c 6f 6e 67 20 2a 29 20 28 28 63 68 61 72 2a  (long *) ((char*
5d40: 29 74 72 61 6d 70 5f 72 5f 61 64 64 72 65 73 73  )tramp_r_address
5d50: 2d 32 29 29 5b 30 5d 0a 23 64 65 66 69 6e 65 20  -2))[0].#define 
5d60: 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75  tramp_address(fu
5d70: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 28 6c  nction)  \.  ((l
5d80: 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29  ong *) function)
5d90: 5b 33 5d 0a 23 64 65 66 69 6e 65 20 74 72 61 6d  [3].#define tram
5da0: 70 5f 64 61 74 61 28 66 75 6e 63 74 69 6f 6e 29  p_data(function)
5db0: 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 20    \.  ((long *) 
5dc0: 66 75 6e 63 74 69 6f 6e 29 5b 32 5d 0a 23 65 6e  function)[2].#en
5dd0: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 61 72 6d  dif.#ifdef __arm
5de0: 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e  __.  /* function
5df0: 3a 0a 20 20 20 2a 09 61 64 64 09 72 31 32 2c 70  :.   *.add.r12,p
5e00: 63 2c 23 38 09 09 09 45 32 38 46 43 30 30 38 0a  c,#8...E28FC008.
5e10: 20 20 20 2a 09 6c 64 72 09 70 63 2c 5b 70 63 5d     *.ldr.pc,[pc]
5e20: 09 09 09 09 45 35 39 46 46 30 30 30 0a 20 20 20  ....E59FF000.   
5e30: 2a 20 5f 64 61 74 61 3a 0a 20 20 20 2a 09 2e 77  * _data:.   *..w
5e40: 6f 72 64 09 3c 64 61 74 61 3e 0a 20 20 20 2a 20  ord.<data>.   * 
5e50: 5f 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 09  _function:.   *.
5e60: 2e 77 6f 72 64 09 3c 61 64 64 72 65 73 73 3e 0a  .word.<address>.
5e70: 20 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 28 28     */.  {.    ((
5e80: 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e  long *) function
5e90: 29 5b 30 5d 20 3d 20 30 78 45 32 38 46 43 30 30  )[0] = 0xE28FC00
5ea0: 38 3b 0a 20 20 20 20 28 28 6c 6f 6e 67 20 2a 29  8;.    ((long *)
5eb0: 20 66 75 6e 63 74 69 6f 6e 29 5b 31 5d 20 3d 20   function)[1] = 
5ec0: 30 78 45 35 39 46 46 30 30 30 3b 0a 20 20 20 20  0xE59FF000;.    
5ed0: 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69  ((long *) functi
5ee0: 6f 6e 29 5b 32 5d 20 3d 20 28 6c 6f 6e 67 29 20  on)[2] = (long) 
5ef0: 64 61 74 61 3b 0a 20 20 20 20 28 28 6c 6f 6e 67  data;.    ((long
5f00: 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 33 5d   *) function)[3]
5f10: 20 3d 20 28 6c 6f 6e 67 29 20 61 64 64 72 65 73   = (long) addres
5f20: 73 3b 0a 20 20 7d 0a 23 64 65 66 69 6e 65 20 69  s;.  }.#define i
5f30: 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e  s_tramp(function
5f40: 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29  )  \.  ((long *)
5f50: 20 66 75 6e 63 74 69 6f 6e 29 5b 30 5d 20 3d 3d   function)[0] ==
5f60: 20 30 78 45 32 38 46 43 30 30 38 20 26 26 20 5c   0xE28FC008 && \
5f70: 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e  .  ((long *) fun
5f80: 63 74 69 6f 6e 29 5b 31 5d 20 3d 3d 20 30 78 45  ction)[1] == 0xE
5f90: 35 39 46 46 30 30 30 0a 23 64 65 66 69 6e 65 20  59FF000.#define 
5fa0: 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75  tramp_address(fu
5fb0: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 28 6c  nction)  \.  ((l
5fc0: 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29  ong *) function)
5fd0: 5b 33 5d 0a 23 64 65 66 69 6e 65 20 74 72 61 6d  [3].#define tram
5fe0: 70 5f 64 61 74 61 28 66 75 6e 63 74 69 6f 6e 29  p_data(function)
5ff0: 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 20    \.  ((long *) 
6000: 66 75 6e 63 74 69 6f 6e 29 5b 32 5d 0a 23 65 6e  function)[2].#en
6010: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 70 6f 77  dif.#ifdef __pow
6020: 65 72 70 63 73 79 73 76 34 5f 5f 0a 23 69 66 64  erpcsysv4__.#ifd
6030: 65 66 20 5f 5f 4e 65 74 42 53 44 5f 5f 0a 20 20  ef __NetBSD__.  
6040: 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20  /* function:.   
6050: 2a 20 20 20 20 7b 6c 69 75 7c 6c 69 73 7d 20 31  *    {liu|lis} 1
6060: 33 2c 68 69 31 36 28 3c 64 61 74 61 3e 29 09 09  3,hi16(<data>)..
6070: 33 44 20 41 30 20 68 69 31 36 28 3c 64 61 74 61  3D A0 hi16(<data
6080: 3e 29 0a 20 20 20 2a 20 20 20 20 7b 6f 72 69 6c  >).   *    {oril
6090: 7c 6f 72 69 7d 20 31 33 2c 31 33 2c 6c 6f 31 36  |ori} 13,13,lo16
60a0: 28 3c 64 61 74 61 3e 29 09 09 36 31 20 41 44 20  (<data>)..61 AD 
60b0: 6c 6f 31 36 28 3c 64 61 74 61 3e 29 0a 20 20 20  lo16(<data>).   
60c0: 2a 20 20 20 20 7b 6c 69 75 7c 6c 69 73 7d 20 30  *    {liu|lis} 0
60d0: 2c 68 69 31 36 28 3c 61 64 64 72 65 73 73 3e 29  ,hi16(<address>)
60e0: 09 09 33 43 20 30 30 20 68 69 31 36 28 3c 61 64  ..3C 00 hi16(<ad
60f0: 64 72 65 73 73 3e 29 0a 20 20 20 2a 20 20 20 20  dress>).   *    
6100: 7b 6f 72 69 6c 7c 6f 72 69 7d 20 30 2c 30 2c 6c  {oril|ori} 0,0,l
6110: 6f 31 36 28 3c 61 64 64 72 65 73 73 3e 29 09 09  o16(<address>)..
6120: 36 30 20 30 30 20 6c 6f 31 36 28 3c 61 64 64 72  60 00 lo16(<addr
6130: 65 73 73 3e 29 0a 20 20 20 2a 20 20 20 20 6d 74  ess>).   *    mt
6140: 63 74 72 20 30 09 09 09 09 09 37 43 20 30 39 20  ctr 0.....7C 09 
6150: 30 33 20 41 36 0a 20 20 20 2a 20 20 20 20 62 63  03 A6.   *    bc
6160: 74 72 09 09 09 09 09 34 45 20 38 30 20 30 34 20  tr.....4E 80 04 
6170: 32 30 0a 20 20 20 2a 2f 0a 20 20 2a 28 73 68 6f  20.   */.  *(sho
6180: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
6190: 2b 20 30 29 20 3d 20 30 78 33 44 41 30 3b 0a 20  + 0) = 0x3DA0;. 
61a0: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e   *(short *) (fun
61b0: 63 74 69 6f 6e 20 2b 20 32 29 20 3d 20 28 75 6e  ction + 2) = (un
61c0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 61 74  signed long) dat
61d0: 61 20 3e 3e 20 31 36 3b 0a 20 20 2a 28 73 68 6f  a >> 16;.  *(sho
61e0: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
61f0: 2b 20 34 29 20 3d 20 30 78 36 31 41 44 3b 0a 20  + 4) = 0x61AD;. 
6200: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e   *(short *) (fun
6210: 63 74 69 6f 6e 20 2b 20 36 29 20 3d 20 28 75 6e  ction + 6) = (un
6220: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 61 74  signed long) dat
6230: 61 20 26 20 30 78 66 66 66 66 3b 0a 20 20 2a 28  a & 0xffff;.  *(
6240: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
6250: 6f 6e 20 2b 20 38 29 20 3d 20 30 78 33 43 30 30  on + 8) = 0x3C00
6260: 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28  ;.  *(short *) (
6270: 66 75 6e 63 74 69 6f 6e 20 2b 31 30 29 20 3d 20  function +10) = 
6280: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
6290: 61 64 64 72 65 73 73 20 3e 3e 20 31 36 3b 0a 20  address >> 16;. 
62a0: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e   *(short *) (fun
62b0: 63 74 69 6f 6e 20 2b 31 32 29 20 3d 20 30 78 36  ction +12) = 0x6
62c0: 30 30 30 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a  000;.  *(short *
62d0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 34 29  ) (function +14)
62e0: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e   = (unsigned lon
62f0: 67 29 20 61 64 64 72 65 73 73 20 26 20 30 78 66  g) address & 0xf
6300: 66 66 66 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29  fff;.  *(long *)
6310: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29    (function +16)
6320: 20 3d 20 30 78 37 43 30 39 30 33 41 36 3b 0a 20   = 0x7C0903A6;. 
6330: 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e   *(long *)  (fun
6340: 63 74 69 6f 6e 20 2b 32 30 29 20 3d 20 30 78 34  ction +20) = 0x4
6350: 45 38 30 30 34 32 30 3b 0a 23 64 65 66 69 6e 65  E800420;.#define
6360: 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69   is_tramp(functi
6370: 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67  on)  \.  *(unsig
6380: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75  ned short *) (fu
6390: 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 3d 20 30  nction + 0) == 0
63a0: 78 33 44 41 30 20 26 26 20 5c 0a 20 20 2a 28 75  x3DA0 && \.  *(u
63b0: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29  nsigned short *)
63c0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20   (function + 4) 
63d0: 3d 3d 20 30 78 36 31 41 44 20 26 26 20 5c 0a 20  == 0x61AD && \. 
63e0: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72   *(unsigned shor
63f0: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
6400: 20 38 29 20 3d 3d 20 30 78 33 43 30 30 20 26 26   8) == 0x3C00 &&
6410: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20   \.  *(unsigned 
6420: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
6430: 6f 6e 20 2b 31 32 29 20 3d 3d 20 30 78 36 30 30  on +12) == 0x600
6440: 30 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67  0 && \.  *(unsig
6450: 6e 65 64 20 6c 6f 6e 67 20 2a 29 20 20 28 66 75  ned long *)  (fu
6460: 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 3d 20 30  nction +16) == 0
6470: 78 37 43 30 39 30 33 41 36 20 26 26 20 5c 0a 20  x7C0903A6 && \. 
6480: 20 2a 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67   *(unsigned long
6490: 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b   *)  (function +
64a0: 32 30 29 20 3d 3d 20 30 78 34 45 38 30 30 34 32  20) == 0x4E80042
64b0: 30 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 66 75 6e  0.#else.  /* fun
64c0: 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 7b  ction:.   *    {
64d0: 6c 69 75 7c 6c 69 73 7d 20 31 31 2c 68 69 31 36  liu|lis} 11,hi16
64e0: 28 3c 64 61 74 61 3e 29 09 09 33 44 20 36 30 20  (<data>)..3D 60 
64f0: 68 69 31 36 28 3c 64 61 74 61 3e 29 0a 20 20 20  hi16(<data>).   
6500: 2a 20 20 20 20 7b 6f 72 69 6c 7c 6f 72 69 7d 20  *    {oril|ori} 
6510: 31 31 2c 31 31 2c 6c 6f 31 36 28 3c 64 61 74 61  11,11,lo16(<data
6520: 3e 29 09 09 36 31 20 36 42 20 6c 6f 31 36 28 3c  >)..61 6B lo16(<
6530: 64 61 74 61 3e 29 0a 20 20 20 2a 20 20 20 20 7b  data>).   *    {
6540: 6c 69 75 7c 6c 69 73 7d 20 30 2c 68 69 31 36 28  liu|lis} 0,hi16(
6550: 3c 61 64 64 72 65 73 73 3e 29 09 09 33 43 20 30  <address>)..3C 0
6560: 30 20 68 69 31 36 28 3c 61 64 64 72 65 73 73 3e  0 hi16(<address>
6570: 29 0a 20 20 20 2a 20 20 20 20 7b 6f 72 69 6c 7c  ).   *    {oril|
6580: 6f 72 69 7d 20 30 2c 30 2c 6c 6f 31 36 28 3c 61  ori} 0,0,lo16(<a
6590: 64 64 72 65 73 73 3e 29 09 09 36 30 20 30 30 20  ddress>)..60 00 
65a0: 6c 6f 31 36 28 3c 61 64 64 72 65 73 73 3e 29 0a  lo16(<address>).
65b0: 20 20 20 2a 20 20 20 20 6d 74 63 74 72 20 30 09     *    mtctr 0.
65c0: 09 09 09 09 37 43 20 30 39 20 30 33 20 41 36 0a  ....7C 09 03 A6.
65d0: 20 20 20 2a 20 20 20 20 62 63 74 72 09 09 09 09     *    bctr....
65e0: 09 34 45 20 38 30 20 30 34 20 32 30 0a 20 20 20  .4E 80 04 20.   
65f0: 2a 2f 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20  */.  *(short *) 
6600: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d  (function + 0) =
6610: 20 30 78 33 44 36 30 3b 0a 20 20 2a 28 73 68 6f   0x3D60;.  *(sho
6620: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
6630: 2b 20 32 29 20 3d 20 28 75 6e 73 69 67 6e 65 64  + 2) = (unsigned
6640: 20 6c 6f 6e 67 29 20 64 61 74 61 20 3e 3e 20 31   long) data >> 1
6650: 36 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20  6;.  *(short *) 
6660: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d  (function + 4) =
6670: 20 30 78 36 31 36 42 3b 0a 20 20 2a 28 73 68 6f   0x616B;.  *(sho
6680: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
6690: 2b 20 36 29 20 3d 20 28 75 6e 73 69 67 6e 65 64  + 6) = (unsigned
66a0: 20 6c 6f 6e 67 29 20 64 61 74 61 20 26 20 30 78   long) data & 0x
66b0: 66 66 66 66 3b 0a 20 20 2a 28 73 68 6f 72 74 20  ffff;.  *(short 
66c0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38  *) (function + 8
66d0: 29 20 3d 20 30 78 33 43 30 30 3b 0a 20 20 2a 28  ) = 0x3C00;.  *(
66e0: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
66f0: 6f 6e 20 2b 31 30 29 20 3d 20 28 75 6e 73 69 67  on +10) = (unsig
6700: 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64 72 65 73  ned long) addres
6710: 73 20 3e 3e 20 31 36 3b 0a 20 20 2a 28 73 68 6f  s >> 16;.  *(sho
6720: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
6730: 2b 31 32 29 20 3d 20 30 78 36 30 30 30 3b 0a 20  +12) = 0x6000;. 
6740: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e   *(short *) (fun
6750: 63 74 69 6f 6e 20 2b 31 34 29 20 3d 20 28 75 6e  ction +14) = (un
6760: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64  signed long) add
6770: 72 65 73 73 20 26 20 30 78 66 66 66 66 3b 0a 20  ress & 0xffff;. 
6780: 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e   *(long *)  (fun
6790: 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20 30 78 37  ction +16) = 0x7
67a0: 43 30 39 30 33 41 36 3b 0a 20 20 2a 28 6c 6f 6e  C0903A6;.  *(lon
67b0: 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20  g *)  (function 
67c0: 2b 32 30 29 20 3d 20 30 78 34 45 38 30 30 34 32  +20) = 0x4E80042
67d0: 30 3b 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72  0;.#define is_tr
67e0: 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c  amp(function)  \
67f0: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68  .  *(unsigned sh
6800: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ort *) (function
6810: 20 2b 20 30 29 20 3d 3d 20 30 78 33 44 36 30 20   + 0) == 0x3D60 
6820: 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65  && \.  *(unsigne
6830: 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63  d short *) (func
6840: 74 69 6f 6e 20 2b 20 34 29 20 3d 3d 20 30 78 36  tion + 4) == 0x6
6850: 31 36 42 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73  16B && \.  *(uns
6860: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28  igned short *) (
6870: 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 3d  function + 8) ==
6880: 20 30 78 33 43 30 30 20 26 26 20 5c 0a 20 20 2a   0x3C00 && \.  *
6890: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20  (unsigned short 
68a0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32  *) (function +12
68b0: 29 20 3d 3d 20 30 78 36 30 30 30 20 26 26 20 5c  ) == 0x6000 && \
68c0: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .  *(unsigned lo
68d0: 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e  ng *)  (function
68e0: 20 2b 31 36 29 20 3d 3d 20 30 78 37 43 30 39 30   +16) == 0x7C090
68f0: 33 41 36 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73  3A6 && \.  *(uns
6900: 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 29 20 20 28  igned long *)  (
6910: 66 75 6e 63 74 69 6f 6e 20 2b 32 30 29 20 3d 3d  function +20) ==
6920: 20 30 78 34 45 38 30 30 34 32 30 0a 23 65 6e 64   0x4E800420.#end
6930: 69 66 0a 23 64 65 66 69 6e 65 20 68 69 6c 6f 28  if.#define hilo(
6940: 68 69 77 6f 72 64 2c 6c 6f 77 6f 72 64 29 20 20  hiword,loword)  
6950: 5c 0a 20 20 28 28 28 75 6e 73 69 67 6e 65 64 20  \.  (((unsigned 
6960: 6c 6f 6e 67 29 20 28 68 69 77 6f 72 64 29 20 3c  long) (hiword) <
6970: 3c 20 31 36 29 20 7c 20 28 75 6e 73 69 67 6e 65  < 16) | (unsigne
6980: 64 20 6c 6f 6e 67 29 20 28 6c 6f 77 6f 72 64 29  d long) (loword)
6990: 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f  ).#define tramp_
69a0: 61 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e  address(function
69b0: 29 20 20 5c 0a 20 20 68 69 6c 6f 28 2a 28 75 6e  )  \.  hilo(*(un
69c0: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20  signed short *) 
69d0: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 30 29 2c 20  (function +10), 
69e0: 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74  *(unsigned short
69f0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31   *) (function +1
6a00: 34 29 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d  4)).#define tram
6a10: 70 5f 64 61 74 61 28 66 75 6e 63 74 69 6f 6e 29  p_data(function)
6a20: 20 20 5c 0a 20 20 68 69 6c 6f 28 2a 28 75 6e 73    \.  hilo(*(uns
6a30: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28  igned short *) (
6a40: 66 75 6e 63 74 69 6f 6e 20 2b 20 32 29 2c 20 2a  function + 2), *
6a50: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20  (unsigned short 
6a60: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 36  *) (function + 6
6a70: 29 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  )).#endif.#ifdef
6a80: 20 5f 5f 70 6f 77 65 72 70 63 61 69 78 5f 5f 0a   __powerpcaix__.
6a90: 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20    /* function:. 
6aa0: 20 20 2a 20 20 20 20 2e 6c 6f 6e 67 20 2e 74 72    *    .long .tr
6ab0: 61 6d 70 5f 72 0a 20 20 20 2a 20 20 20 20 2e 6c  amp_r.   *    .l
6ac0: 6f 6e 67 20 2e 6d 79 74 6f 63 0a 20 20 20 2a 20  ong .mytoc.   * 
6ad0: 20 20 20 2e 6c 6f 6e 67 20 30 0a 20 20 20 2a 20     .long 0.   * 
6ae0: 2e 6d 79 74 6f 63 3a 0a 20 20 20 2a 20 20 20 20  .mytoc:.   *    
6af0: 2e 6c 6f 6e 67 20 3c 64 61 74 61 3e 0a 20 20 20  .long <data>.   
6b00: 2a 20 20 20 20 2e 6c 6f 6e 67 20 3c 61 64 64 72  *    .long <addr
6b10: 65 73 73 3e 0a 20 20 20 2a 2f 0a 20 20 2a 28 6c  ess>.   */.  *(l
6b20: 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f  ong *)  (functio
6b30: 6e 20 2b 20 30 29 20 3d 20 28 28 6c 6f 6e 67 20  n + 0) = ((long 
6b40: 2a 29 20 26 74 72 61 6d 70 5f 72 29 5b 30 5d 3b  *) &tramp_r)[0];
6b50: 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66  .  *(long *)  (f
6b60: 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 20 28  unction + 4) = (
6b70: 6c 6f 6e 67 29 20 28 66 75 6e 63 74 69 6f 6e 20  long) (function 
6b80: 2b 20 31 32 29 3b 0a 20 20 2a 28 6c 6f 6e 67 20  + 12);.  *(long 
6b90: 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20  *)  (function + 
6ba0: 38 29 20 3d 20 30 3b 0a 20 20 2a 28 6c 6f 6e 67  8) = 0;.  *(long
6bb0: 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b   *)  (function +
6bc0: 31 32 29 20 3d 20 28 6c 6f 6e 67 29 20 64 61 74  12) = (long) dat
6bd0: 61 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20  a;.  *(long *)  
6be0: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d  (function +16) =
6bf0: 20 28 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 3b   (long) address;
6c00: 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d  .#define is_tram
6c10: 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20  p(function)  \. 
6c20: 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74   ((long *) funct
6c30: 69 6f 6e 29 5b 30 5d 20 3d 3d 20 28 28 6c 6f 6e  ion)[0] == ((lon
6c40: 67 20 2a 29 20 26 74 72 61 6d 70 5f 72 29 5b 30  g *) &tramp_r)[0
6c50: 5d 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f  ].#define tramp_
6c60: 61 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e  address(function
6c70: 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29  )  \.  ((long *)
6c80: 20 66 75 6e 63 74 69 6f 6e 29 5b 34 5d 0a 23 64   function)[4].#d
6c90: 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61  efine tramp_data
6ca0: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20  (function)  \.  
6cb0: 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69  ((long *) functi
6cc0: 6f 6e 29 5b 33 5d 0a 23 65 6e 64 69 66 0a 23 69  on)[3].#endif.#i
6cd0: 66 64 65 66 20 5f 5f 70 6f 77 65 72 70 63 36 34  fdef __powerpc64
6ce0: 61 69 78 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74  aix__.  /* funct
6cf0: 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 2e 71 75  ion:.   *    .qu
6d00: 61 64 20 2e 74 72 61 6d 70 5f 72 0a 20 20 20 2a  ad .tramp_r.   *
6d10: 20 20 20 20 2e 71 75 61 64 20 2e 6d 79 74 6f 63      .quad .mytoc
6d20: 0a 20 20 20 2a 20 20 20 20 2e 71 75 61 64 20 30  .   *    .quad 0
6d30: 0a 20 20 20 2a 20 2e 6d 79 74 6f 63 3a 0a 20 20  .   * .mytoc:.  
6d40: 20 2a 20 20 20 20 2e 71 75 61 64 20 3c 64 61 74   *    .quad <dat
6d50: 61 3e 0a 20 20 20 2a 20 20 20 20 2e 71 75 61 64  a>.   *    .quad
6d60: 20 3c 61 64 64 72 65 73 73 3e 0a 20 20 20 2a 2f   <address>.   */
6d70: 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66  .  *(long *)  (f
6d80: 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20 28  unction + 0) = (
6d90: 28 6c 6f 6e 67 20 2a 29 20 26 74 72 61 6d 70 5f  (long *) &tramp_
6da0: 72 29 5b 30 5d 3b 0a 20 20 2a 28 6c 6f 6e 67 20  r)[0];.  *(long 
6db0: 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20  *)  (function + 
6dc0: 38 29 20 3d 20 28 6c 6f 6e 67 29 20 28 66 75 6e  8) = (long) (fun
6dd0: 63 74 69 6f 6e 20 2b 20 32 34 29 3b 0a 20 20 2a  ction + 24);.  *
6de0: 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74  (long *)  (funct
6df0: 69 6f 6e 20 2b 31 36 29 20 3d 20 30 3b 0a 20 20  ion +16) = 0;.  
6e00: 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63  *(long *)  (func
6e10: 74 69 6f 6e 20 2b 32 34 29 20 3d 20 28 6c 6f 6e  tion +24) = (lon
6e20: 67 29 20 64 61 74 61 3b 0a 20 20 2a 28 6c 6f 6e  g) data;.  *(lon
6e30: 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20  g *)  (function 
6e40: 2b 33 32 29 20 3d 20 28 6c 6f 6e 67 29 20 61 64  +32) = (long) ad
6e50: 64 72 65 73 73 3b 0a 23 64 65 66 69 6e 65 20 69  dress;.#define i
6e60: 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e  s_tramp(function
6e70: 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29  )  \.  ((long *)
6e80: 20 66 75 6e 63 74 69 6f 6e 29 5b 30 5d 20 3d 3d   function)[0] ==
6e90: 20 28 28 6c 6f 6e 67 20 2a 29 20 26 74 72 61 6d   ((long *) &tram
6ea0: 70 5f 72 29 5b 30 5d 0a 23 64 65 66 69 6e 65 20  p_r)[0].#define 
6eb0: 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75  tramp_address(fu
6ec0: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 28 6c  nction)  \.  ((l
6ed0: 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29  ong *) function)
6ee0: 5b 34 5d 0a 23 64 65 66 69 6e 65 20 74 72 61 6d  [4].#define tram
6ef0: 70 5f 64 61 74 61 28 66 75 6e 63 74 69 6f 6e 29  p_data(function)
6f00: 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 20    \.  ((long *) 
6f10: 66 75 6e 63 74 69 6f 6e 29 5b 33 5d 0a 23 65 6e  function)[3].#en
6f20: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d 38 38  dif.#ifdef __m88
6f30: 6b 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f  k__.  /* functio
6f40: 6e 3a 0a 20 20 20 2a 20 20 20 20 6f 72 2e 75 20  n:.   *    or.u 
6f50: 20 20 20 23 72 31 31 2c 23 72 30 2c 68 69 31 36     #r11,#r0,hi16
6f60: 28 3c 64 61 74 61 3e 29 09 09 35 44 20 36 30 20  (<data>)..5D 60 
6f70: 68 69 31 36 28 3c 64 61 74 61 3e 29 0a 20 20 20  hi16(<data>).   
6f80: 2a 20 20 20 20 6f 72 20 20 20 20 20 20 23 72 31  *    or      #r1
6f90: 31 2c 23 72 31 31 2c 6c 6f 31 36 28 3c 64 61 74  1,#r11,lo16(<dat
6fa0: 61 3e 29 09 09 35 39 20 36 42 20 6c 6f 31 36 28  a>)..59 6B lo16(
6fb0: 3c 64 61 74 61 3e 29 0a 20 20 20 2a 20 20 20 20  <data>).   *    
6fc0: 6f 72 2e 75 20 20 20 20 23 72 31 33 2c 23 72 30  or.u    #r13,#r0
6fd0: 2c 68 69 31 36 28 3c 61 64 64 72 65 73 73 3e 29  ,hi16(<address>)
6fe0: 09 35 44 20 41 30 20 68 69 31 36 28 3c 61 64 64  .5D A0 hi16(<add
6ff0: 72 65 73 73 3e 29 0a 20 20 20 2a 20 20 20 20 6f  ress>).   *    o
7000: 72 20 20 20 20 20 20 23 72 31 33 2c 23 72 31 33  r      #r13,#r13
7010: 2c 6c 6f 31 36 28 3c 61 64 64 72 65 73 73 3e 29  ,lo16(<address>)
7020: 09 35 39 20 41 44 20 6c 6f 31 36 28 3c 61 64 64  .59 AD lo16(<add
7030: 72 65 73 73 3e 29 0a 20 20 20 2a 20 20 20 20 6a  ress>).   *    j
7040: 6d 70 20 20 20 20 20 23 72 31 33 09 09 09 09 46  mp     #r13....F
7050: 34 20 30 30 20 43 30 20 30 44 0a 20 20 20 2a 2f  4 00 C0 0D.   */
7060: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66  .  *(short *) (f
7070: 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20 30  unction + 0) = 0
7080: 78 35 44 36 30 3b 0a 20 20 2a 28 73 68 6f 72 74  x5D60;.  *(short
7090: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20   *) (function + 
70a0: 32 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c  2) = (unsigned l
70b0: 6f 6e 67 29 20 64 61 74 61 20 3e 3e 20 31 36 3b  ong) data >> 16;
70c0: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66  .  *(short *) (f
70d0: 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 20 30  unction + 4) = 0
70e0: 78 35 39 36 42 3b 0a 20 20 2a 28 73 68 6f 72 74  x596B;.  *(short
70f0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20   *) (function + 
7100: 36 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c  6) = (unsigned l
7110: 6f 6e 67 29 20 64 61 74 61 20 26 20 30 78 66 66  ong) data & 0xff
7120: 66 66 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29  ff;.  *(short *)
7130: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20   (function + 8) 
7140: 3d 20 30 78 35 44 41 30 3b 0a 20 20 2a 28 73 68  = 0x5DA0;.  *(sh
7150: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ort *) (function
7160: 20 2b 31 30 29 20 3d 20 28 75 6e 73 69 67 6e 65   +10) = (unsigne
7170: 64 20 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 20  d long) address 
7180: 3e 3e 20 31 36 3b 0a 20 20 2a 28 73 68 6f 72 74  >> 16;.  *(short
7190: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31   *) (function +1
71a0: 32 29 20 3d 20 30 78 35 39 41 44 3b 0a 20 20 2a  2) = 0x59AD;.  *
71b0: 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74  (short *) (funct
71c0: 69 6f 6e 20 2b 31 34 29 20 3d 20 28 75 6e 73 69  ion +14) = (unsi
71d0: 67 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64 72 65  gned long) addre
71e0: 73 73 20 26 20 30 78 66 66 66 66 3b 0a 20 20 2a  ss & 0xffff;.  *
71f0: 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74  (long *)  (funct
7200: 69 6f 6e 20 2b 31 36 29 20 3d 20 30 78 46 34 30  ion +16) = 0xF40
7210: 30 43 30 30 44 3b 0a 23 64 65 66 69 6e 65 20 69  0C00D;.#define i
7220: 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e  s_tramp(function
7230: 29 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65  )  \.  *(unsigne
7240: 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63  d short *) (func
7250: 74 69 6f 6e 20 2b 20 30 29 20 3d 3d 20 30 78 35  tion + 0) == 0x5
7260: 44 36 30 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73  D60 && \.  *(uns
7270: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28  igned short *) (
7280: 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 3d  function + 4) ==
7290: 20 30 78 35 39 36 42 20 26 26 20 5c 0a 20 20 2a   0x596B && \.  *
72a0: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20  (unsigned short 
72b0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38  *) (function + 8
72c0: 29 20 3d 3d 20 30 78 35 44 41 30 20 26 26 20 5c  ) == 0x5DA0 && \
72d0: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68  .  *(unsigned sh
72e0: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ort *) (function
72f0: 20 2b 31 32 29 20 3d 3d 20 30 78 35 39 41 44 20   +12) == 0x59AD 
7300: 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65  && \.  *(unsigne
7310: 64 20 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63  d long *)  (func
7320: 74 69 6f 6e 20 2b 31 36 29 20 3d 3d 20 30 78 46  tion +16) == 0xF
7330: 34 30 30 43 30 30 44 0a 23 64 65 66 69 6e 65 20  400C00D.#define 
7340: 68 69 6c 6f 28 68 69 77 6f 72 64 2c 6c 6f 77 6f  hilo(hiword,lowo
7350: 72 64 29 20 20 5c 0a 20 20 28 28 28 75 6e 73 69  rd)  \.  (((unsi
7360: 67 6e 65 64 20 6c 6f 6e 67 29 20 28 68 69 77 6f  gned long) (hiwo
7370: 72 64 29 20 3c 3c 20 31 36 29 20 7c 20 28 75 6e  rd) << 16) | (un
7380: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 6c 6f  signed long) (lo
7390: 77 6f 72 64 29 29 0a 23 64 65 66 69 6e 65 20 74  word)).#define t
73a0: 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75 6e  ramp_address(fun
73b0: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c 6f  ction)  \.  hilo
73c0: 28 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72  (*(unsigned shor
73d0: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
73e0: 31 30 29 2c 20 2a 28 75 6e 73 69 67 6e 65 64 20  10), *(unsigned 
73f0: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
7400: 6f 6e 20 2b 31 34 29 29 0a 23 64 65 66 69 6e 65  on +14)).#define
7410: 20 74 72 61 6d 70 5f 64 61 74 61 28 66 75 6e 63   tramp_data(func
7420: 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c 6f 28  tion)  \.  hilo(
7430: 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74  *(unsigned short
7440: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20   *) (function + 
7450: 32 29 2c 20 2a 28 75 6e 73 69 67 6e 65 64 20 73  2), *(unsigned s
7460: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
7470: 6e 20 2b 20 36 29 29 0a 23 65 6e 64 69 66 0a 23  n + 6)).#endif.#
7480: 69 66 64 65 66 20 5f 5f 63 6f 6e 76 65 78 5f 5f  ifdef __convex__
7490: 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a  .  /* function:.
74a0: 20 20 20 2a 20 20 20 20 6c 64 2e 77 20 23 3c 64     *    ld.w #<d
74b0: 61 74 61 3e 2c 73 30 09 09 09 09 3f 3f 3f 3f 20  ata>,s0....???? 
74c0: 3c 64 61 74 61 3e 0a 20 20 20 2a 20 20 20 20 6a  <data>.   *    j
74d0: 6d 70 20 3c 61 64 64 72 65 73 73 3e 09 09 09 09  mp <address>....
74e0: 30 31 34 30 20 3c 61 64 64 72 65 73 73 3e 0a 20  0140 <address>. 
74f0: 20 20 2a 20 20 20 20 64 73 2e 68 20 30 09 09 09    *    ds.h 0...
7500: 09 09 30 30 30 30 0a 20 20 20 2a 2f 0a 20 20 2a  ..0000.   */.  *
7510: 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74  (short *) (funct
7520: 69 6f 6e 20 2b 20 30 29 20 3d 20 30 78 3f 3f 3f  ion + 0) = 0x???
7530: 3f 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20  ?;.  *(long *)  
7540: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 32 29 20 3d  (function + 2) =
7550: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
7560: 20 64 61 74 61 3b 0a 20 20 2a 28 73 68 6f 72 74   data;.  *(short
7570: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20   *) (function + 
7580: 36 29 20 3d 20 30 78 30 31 34 30 3b 0a 20 20 2a  6) = 0x0140;.  *
7590: 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74  (long *)  (funct
75a0: 69 6f 6e 20 2b 20 38 29 20 3d 20 28 75 6e 73 69  ion + 8) = (unsi
75b0: 67 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64 72 65  gned long) addre
75c0: 73 73 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29  ss;.  *(short *)
75d0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20   (function +12) 
75e0: 3d 20 30 78 30 30 30 30 3b 0a 23 64 65 66 69 6e  = 0x0000;.#defin
75f0: 65 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74  e is_tramp(funct
7600: 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e 73 69  ion)  \.  *(unsi
7610: 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66  gned short *) (f
7620: 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 3d 20  unction + 0) == 
7630: 30 78 3f 3f 3f 3f 20 26 26 20 5c 0a 20 20 2a 28  0x???? && \.  *(
7640: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a  unsigned short *
7650: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 36 29  ) (function + 6)
7660: 20 3d 3d 20 30 78 30 31 34 30 20 26 26 20 5c 0a   == 0x0140 && \.
7670: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f    *(unsigned sho
7680: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
7690: 2b 31 32 29 20 3d 3d 20 30 78 30 30 30 30 0a 23  +12) == 0x0000.#
76a0: 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 64  define tramp_add
76b0: 72 65 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 20  ress(function)  
76c0: 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28  \.  *(long *)  (
76d0: 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 0a 23 64  function + 8).#d
76e0: 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61  efine tramp_data
76f0: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20  (function)  \.  
7700: 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63  *(long *)  (func
7710: 74 69 6f 6e 20 2b 20 32 29 0a 23 65 6e 64 69 66  tion + 2).#endif
7720: 0a 23 69 66 64 65 66 20 5f 5f 69 61 36 34 5f 5f  .#ifdef __ia64__
7730: 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a  .  /* function:.
7740: 20 20 20 2a 20 20 20 20 64 61 74 61 38 20 20 20     *    data8   
7750: 74 72 61 6d 70 5f 72 0a 20 20 20 2a 20 20 20 20  tramp_r.   *    
7760: 64 61 74 61 38 20 20 20 63 6c 6f 73 75 72 65 0a  data8   closure.
7770: 20 20 20 2a 20 63 6c 6f 73 75 72 65 3a 0a 20 20     * closure:.  
7780: 20 2a 20 20 20 20 64 61 74 61 38 20 20 20 3c 61   *    data8   <a
7790: 64 64 72 65 73 73 3e 0a 20 20 20 2a 20 20 20 20  ddress>.   *    
77a0: 64 61 74 61 38 20 20 20 3c 64 61 74 61 3e 0a 20  data8   <data>. 
77b0: 20 20 2a 2f 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29    */.  *(long *)
77c0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20   (function + 0) 
77d0: 3d 20 28 6c 6f 6e 67 29 20 26 74 72 61 6d 70 5f  = (long) &tramp_
77e0: 72 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28  r;.  *(long *) (
77f0: 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20  function + 8) = 
7800: 28 6c 6f 6e 67 29 20 28 66 75 6e 63 74 69 6f 6e  (long) (function
7810: 20 2b 20 31 36 29 3b 0a 20 20 2a 28 6c 6f 6e 67   + 16);.  *(long
7820: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31   *) (function +1
7830: 36 29 20 3d 20 28 6c 6f 6e 67 29 20 61 64 64 72  6) = (long) addr
7840: 65 73 73 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29  ess;.  *(long *)
7850: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 34 29 20   (function +24) 
7860: 3d 20 28 6c 6f 6e 67 29 20 64 61 74 61 3b 0a 23  = (long) data;.#
7870: 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 28  define is_tramp(
7880: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28  function)  \.  (
7890: 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f  (long *) functio
78a0: 6e 29 5b 30 5d 20 3d 3d 20 28 6c 6f 6e 67 29 20  n)[0] == (long) 
78b0: 26 74 72 61 6d 70 5f 72 0a 23 64 65 66 69 6e 65  &tramp_r.#define
78c0: 20 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66   tramp_address(f
78d0: 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 28  unction)  \.  ((
78e0: 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e  long *) function
78f0: 29 5b 32 5d 0a 23 64 65 66 69 6e 65 20 74 72 61  )[2].#define tra
7900: 6d 70 5f 64 61 74 61 28 66 75 6e 63 74 69 6f 6e  mp_data(function
7910: 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29  )  \.  ((long *)
7920: 20 66 75 6e 63 74 69 6f 6e 29 5b 33 5d 0a 23 65   function)[3].#e
7930: 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 78 38  ndif.#ifdef __x8
7940: 36 5f 36 34 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63  6_64__.  /* func
7950: 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 6d 6f  tion:.   *    mo
7960: 76 61 62 73 71 20 24 3c 64 61 74 61 3e 2c 25 72  vabsq $<data>,%r
7970: 31 30 09 09 34 39 20 42 41 20 3c 64 61 74 61 3e  10..49 BA <data>
7980: 0a 20 20 20 2a 20 20 20 20 6d 6f 76 61 62 73 71  .   *    movabsq
7990: 20 24 3c 61 64 64 72 65 73 73 3e 2c 25 72 61 78   $<address>,%rax
79a0: 09 09 34 38 20 42 38 20 3c 61 64 64 72 65 73 73  ..48 B8 <address
79b0: 3e 0a 20 20 20 2a 20 20 20 20 6a 6d 70 20 2a 25  >.   *    jmp *%
79c0: 72 61 78 09 09 09 46 46 20 45 30 0a 20 20 20 2a  rax...FF E0.   *
79d0: 2f 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28  /.  *(short *) (
79e0: 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20  function + 0) = 
79f0: 30 78 42 41 34 39 3b 0a 20 20 2a 28 73 68 6f 72  0xBA49;.  *(shor
7a00: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
7a10: 20 32 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20   2) = (unsigned 
7a20: 6c 6f 6e 67 29 20 64 61 74 61 20 26 20 30 78 66  long) data & 0xf
7a30: 66 66 66 3b 0a 20 20 2a 28 69 6e 74 20 2a 29 20  fff;.  *(int *) 
7a40: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29    (function + 4)
7a50: 20 3d 20 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f   = ((unsigned lo
7a60: 6e 67 29 20 64 61 74 61 20 3e 3e 20 31 36 29 20  ng) data >> 16) 
7a70: 26 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20  & 0xffffffff;.  
7a80: 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63  *(short *) (func
7a90: 74 69 6f 6e 20 2b 20 38 29 20 3d 20 28 28 75 6e  tion + 8) = ((un
7aa0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 61 74  signed long) dat
7ab0: 61 20 3e 3e 20 34 38 29 20 26 20 30 78 66 66 66  a >> 48) & 0xfff
7ac0: 66 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20  f;.  *(short *) 
7ad0: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 30 29 20 3d  (function +10) =
7ae0: 20 30 78 42 38 34 38 3b 0a 20 20 2a 28 69 6e 74   0xB848;.  *(int
7af0: 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20   *)   (function 
7b00: 2b 31 32 29 20 3d 20 28 75 6e 73 69 67 6e 65 64  +12) = (unsigned
7b10: 20 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 20 26   long) address &
7b20: 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20 2a   0xffffffff;.  *
7b30: 28 69 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74  (int *)   (funct
7b40: 69 6f 6e 20 2b 31 36 29 20 3d 20 28 28 75 6e 73  ion +16) = ((uns
7b50: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64 72  igned long) addr
7b60: 65 73 73 20 3e 3e 20 33 32 29 20 26 20 30 78 66  ess >> 32) & 0xf
7b70: 66 66 66 66 66 66 66 3b 0a 20 20 2a 28 73 68 6f  fffffff;.  *(sho
7b80: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
7b90: 2b 32 30 29 20 3d 20 30 78 45 30 46 46 3b 0a 23  +20) = 0xE0FF;.#
7ba0: 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 28  define is_tramp(
7bb0: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a  function)  \.  *
7bc0: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20  (unsigned short 
7bd0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30  *) (function + 0
7be0: 29 20 3d 3d 20 30 78 42 41 34 39 20 26 26 20 5c  ) == 0xBA49 && \
7bf0: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68  .  *(unsigned sh
7c00: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ort *) (function
7c10: 20 2b 31 30 29 20 3d 3d 20 30 78 42 38 34 38 20   +10) == 0xB848 
7c20: 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65  && \.  *(unsigne
7c30: 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63  d short *) (func
7c40: 74 69 6f 6e 20 2b 32 30 29 20 3d 3d 20 30 78 45  tion +20) == 0xE
7c50: 30 46 46 0a 23 64 65 66 69 6e 65 20 68 69 6c 6f  0FF.#define hilo
7c60: 28 68 69 77 6f 72 64 2c 6c 6f 77 6f 72 64 29 20  (hiword,loword) 
7c70: 20 5c 0a 20 20 28 28 28 75 6e 73 69 67 6e 65 64   \.  (((unsigned
7c80: 20 6c 6f 6e 67 29 20 28 68 69 77 6f 72 64 29 20   long) (hiword) 
7c90: 3c 3c 20 33 32 29 20 7c 20 28 75 6e 73 69 67 6e  << 32) | (unsign
7ca0: 65 64 20 6c 6f 6e 67 29 20 28 6c 6f 77 6f 72 64  ed long) (loword
7cb0: 29 29 0a 23 64 65 66 69 6e 65 20 68 69 6d 69 64  )).#define himid
7cc0: 6c 6f 28 68 69 73 68 6f 72 74 2c 6d 69 64 77 6f  lo(hishort,midwo
7cd0: 72 64 2c 6c 6f 73 68 6f 72 74 29 20 20 5c 0a 20  rd,loshort)  \. 
7ce0: 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e   (((unsigned lon
7cf0: 67 29 20 28 68 69 73 68 6f 72 74 29 20 3c 3c 20  g) (hishort) << 
7d00: 34 38 29 20 7c 20 28 75 6e 73 69 67 6e 65 64 20  48) | (unsigned 
7d10: 6c 6f 6e 67 29 20 28 6d 69 64 77 6f 72 64 29 20  long) (midword) 
7d20: 3c 3c 20 31 36 20 5c 0a 20 20 20 7c 20 28 75 6e  << 16 \.   | (un
7d30: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 6c 6f  signed long) (lo
7d40: 73 68 6f 72 74 29 29 0a 23 64 65 66 69 6e 65 20  short)).#define 
7d50: 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75  tramp_address(fu
7d60: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c  nction)  \.  hil
7d70: 6f 28 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  o(*(unsigned int
7d80: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31   *) (function +1
7d90: 36 29 2c 20 2a 28 75 6e 73 69 67 6e 65 64 20 69  6), *(unsigned i
7da0: 6e 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  nt *) (function 
7db0: 2b 31 32 29 29 0a 23 64 65 66 69 6e 65 20 74 72  +12)).#define tr
7dc0: 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 74 69 6f  amp_data(functio
7dd0: 6e 29 20 20 5c 0a 20 20 68 69 6d 69 64 6c 6f 28  n)  \.  himidlo(
7de0: 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74  *(unsigned short
7df0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20   *) (function + 
7e00: 38 29 2c 20 5c 0a 20 20 20 20 20 20 20 20 20 20  8), \.          
7e10: 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a  *(unsigned int *
7e20: 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20  )   (function + 
7e30: 34 29 2c 20 5c 0a 20 20 20 20 20 20 20 20 20 20  4), \.          
7e40: 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74  *(unsigned short
7e50: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20   *) (function + 
7e60: 32 29 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  2)).#endif.#ifde
7e70: 66 20 5f 5f 73 33 39 30 5f 5f 0a 20 20 2f 2a 20  f __s390__.  /* 
7e80: 66 75 6e 63 74 69 6f 6e 3a 0a 0a 20 20 20 20 20  function:..     
7e90: 20 20 20 62 72 61 73 20 20 20 20 25 72 31 2c 2e     bras    %r1,.
7ea0: 4c 54 4e 30 5f 30 0a 2e 4c 54 30 5f 30 3a 0a 2e  LTN0_0..LT0_0:..
7eb0: 4c 43 30 3a 0a 20 20 20 20 20 20 20 20 2e 6c 6f  LC0:.        .lo
7ec0: 6e 67 20 20 20 30 78 37 33 35 35 34 37 31 31 0a  ng   0x73554711.
7ed0: 2e 4c 43 31 3a 0a 20 20 20 20 20 20 20 20 2e 6c  .LC1:.        .l
7ee0: 6f 6e 67 20 20 20 30 78 62 61 62 65 62 65 63 30  ong   0xbabebec0
7ef0: 0a 2e 4c 54 4e 30 5f 30 3a 0a 20 20 20 20 20 20  ..LTN0_0:.      
7f00: 20 20 6c 20 20 20 20 20 20 20 25 72 30 2c 2e 4c    l       %r0,.L
7f10: 43 30 2d 2e 4c 54 30 5f 30 28 25 72 31 29 0a 20  C0-.LT0_0(%r1). 
7f20: 20 20 20 20 20 20 20 6c 20 20 20 20 20 20 20 25         l       %
7f30: 72 31 2c 2e 4c 43 31 2d 2e 4c 54 31 5f 30 28 25  r1,.LC1-.LT1_0(%
7f40: 72 31 29 0a 20 20 20 20 20 20 20 20 62 72 20 20  r1).        br  
7f50: 20 20 20 20 25 72 31 0a 20 20 2a 2f 0a 20 20 2f      %r1.  */.  /
7f60: 2a 20 57 68 61 74 20 61 62 6f 75 74 20 62 69 67  * What about big
7f70: 20 65 6e 64 69 61 6e 20 2f 20 6c 69 74 74 6c 65   endian / little
7f80: 20 65 6e 64 69 61 6e 20 3f 3f 20 2a 2f 0a 20 20   endian ?? */.  
7f90: 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a  *(unsigned int *
7fa0: 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20  )   (function + 
7fb0: 30 29 20 3d 20 30 78 41 37 31 35 30 30 30 36 3b  0) = 0xA7150006;
7fc0: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e  .  *(unsigned in
7fd0: 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e  t *)   (function
7fe0: 20 2b 20 34 29 20 3d 20 28 75 6e 73 69 67 6e 65   + 4) = (unsigne
7ff0: 64 20 69 6e 74 29 20 64 61 74 61 3b 0a 20 20 2a  d int) data;.  *
8000: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29  (unsigned int *)
8010: 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38     (function + 8
8020: 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  ) = (unsigned in
8030: 74 29 20 61 64 64 72 65 73 73 3b 0a 20 20 2a 28  t) address;.  *(
8040: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20  unsigned int *) 
8050: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29    (function +12)
8060: 20 3d 20 30 78 35 38 30 30 31 30 30 30 3b 0a 20   = 0x58001000;. 
8070: 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20   *(unsigned int 
8080: 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b  *)   (function +
8090: 31 36 29 20 3d 20 30 78 35 38 31 30 31 30 30 34  16) = 0x58101004
80a0: 3b 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73  ;.  *(unsigned s
80b0: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
80c0: 6e 20 2b 32 30 29 20 3d 20 30 78 30 37 66 31 3b  n +20) = 0x07f1;
80d0: 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d  .#define is_tram
80e0: 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20  p(function)  \. 
80f0: 20 2a 28 69 6e 74 20 2a 29 20 20 20 20 20 20 20   *(int *)       
8100: 20 20 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b       (function +
8110: 20 30 29 20 3d 3d 20 30 78 41 37 31 35 30 30 30   0) == 0xA715000
8120: 36 20 26 26 20 5c 0a 20 20 2a 28 69 6e 74 20 2a  6 && \.  *(int *
8130: 29 20 20 20 20 20 20 20 20 20 20 20 20 28 66 75  )            (fu
8140: 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d 3d 20 30  nction +12) == 0
8150: 78 35 38 30 30 31 30 30 30 20 26 26 20 5c 0a 20  x58001000 && \. 
8160: 20 2a 28 69 6e 74 20 2a 29 20 20 20 20 20 20 20   *(int *)       
8170: 20 20 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b       (function +
8180: 31 36 29 20 3d 3d 20 30 78 35 38 31 30 31 30 30  16) == 0x5810100
8190: 34 20 26 26 20 5c 0a 20 20 2a 28 73 68 6f 72 74  4 && \.  *(short
81a0: 20 2a 29 20 20 20 20 20 20 20 20 20 20 28 66 75   *)          (fu
81b0: 6e 63 74 69 6f 6e 20 2b 32 30 29 20 3d 3d 20 30  nction +20) == 0
81c0: 78 30 37 66 31 0a 23 64 65 66 69 6e 65 20 74 72  x07f1.#define tr
81d0: 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75 6e 63  amp_address(func
81e0: 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e 73  tion)  \.  *(uns
81f0: 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 28 66 75  igned int *) (fu
8200: 6e 63 74 69 6f 6e 20 2b 38 29 0a 23 64 65 66 69  nction +8).#defi
8210: 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 28 66 75  ne tramp_data(fu
8220: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 75  nction)  \.  *(u
8230: 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 28  nsigned int *) (
8240: 66 75 6e 63 74 69 6f 6e 20 2b 34 29 0a 23 65 6e  function +4).#en
8250: 64 69 66 0a 20 20 2f 2a 0a 20 20 20 2a 20 64 61  dif.  /*.   * da
8260: 74 61 3a 0a 20 20 20 2a 20 20 20 20 3c 64 61 74  ta:.   *    <dat
8270: 61 30 3e 09 09 09 09 3c 64 61 74 61 30 3e 0a 20  a0>....<data0>. 
8280: 20 20 2a 20 20 20 20 3c 64 61 74 61 31 3e 09 09    *    <data1>..
8290: 09 09 3c 64 61 74 61 31 3e 0a 20 20 20 2a 2f 0a  ..<data1>.   */.
82a0: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 64 61    *(long *)  (da
82b0: 74 61 20 2b 20 30 2a 73 69 7a 65 6f 66 28 76 6f  ta + 0*sizeof(vo
82c0: 69 64 2a 29 29 20 3d 20 28 6c 6f 6e 67 29 20 64  id*)) = (long) d
82d0: 61 74 61 30 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a  ata0;.  *(long *
82e0: 29 20 20 28 64 61 74 61 20 2b 20 31 2a 73 69 7a  )  (data + 1*siz
82f0: 65 6f 66 28 76 6f 69 64 2a 29 29 20 3d 20 28 6c  eof(void*)) = (l
8300: 6f 6e 67 29 20 64 61 74 61 31 3b 0a 0a 20 20 2f  ong) data1;..  /
8310: 2a 20 33 2e 20 53 65 74 20 6d 65 6d 6f 72 79 20  * 3. Set memory 
8320: 70 72 6f 74 65 63 74 69 6f 6e 20 74 6f 20 22 65  protection to "e
8330: 78 65 63 75 74 61 62 6c 65 22 20 2a 2f 0a 0a 23  xecutable" */..#
8340: 69 66 20 21 64 65 66 69 6e 65 64 28 43 4f 44 45  if !defined(CODE
8350: 5f 45 58 45 43 55 54 41 42 4c 45 29 20 26 26 20  _EXECUTABLE) && 
8360: 64 65 66 69 6e 65 64 28 45 58 45 43 55 54 41 42  defined(EXECUTAB
8370: 4c 45 5f 56 49 41 5f 4d 50 52 4f 54 45 43 54 29  LE_VIA_MPROTECT)
8380: 0a 20 20 2f 2a 20 43 61 6c 6c 20 6d 70 72 6f 74  .  /* Call mprot
8390: 65 63 74 20 6f 6e 20 74 68 65 20 70 61 67 65 73  ect on the pages
83a0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 74 68   that contain th
83b0: 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 7b 20  e range. */.  { 
83c0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 74  unsigned long st
83d0: 61 72 74 5f 61 64 64 72 20 3d 20 28 75 6e 73 69  art_addr = (unsi
83e0: 67 6e 65 64 20 6c 6f 6e 67 29 20 66 75 6e 63 74  gned long) funct
83f0: 69 6f 6e 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  ion;.    unsigne
8400: 64 20 6c 6f 6e 67 20 65 6e 64 5f 61 64 64 72 20  d long end_addr 
8410: 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  = (unsigned long
8420: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 54 52  ) (function + TR
8430: 41 4d 50 5f 4c 45 4e 47 54 48 29 3b 0a 20 20 20  AMP_LENGTH);.   
8440: 20 73 74 61 72 74 5f 61 64 64 72 20 3d 20 73 74   start_addr = st
8450: 61 72 74 5f 61 64 64 72 20 26 20 2d 70 61 67 65  art_addr & -page
8460: 73 69 7a 65 3b 0a 20 20 20 20 65 6e 64 5f 61 64  size;.    end_ad
8470: 64 72 20 3d 20 28 65 6e 64 5f 61 64 64 72 20 2b  dr = (end_addr +
8480: 20 70 61 67 65 73 69 7a 65 2d 31 29 20 26 20 2d   pagesize-1) & -
8490: 70 61 67 65 73 69 7a 65 3b 0a 20 20 20 7b 75 6e  pagesize;.   {un
84a0: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 65 6e 20  signed long len 
84b0: 3d 20 65 6e 64 5f 61 64 64 72 20 2d 20 73 74 61  = end_addr - sta
84c0: 72 74 5f 61 64 64 72 3b 0a 23 69 66 20 64 65 66  rt_addr;.#if def
84d0: 69 6e 65 64 28 48 41 56 45 5f 4d 41 43 48 5f 56  ined(HAVE_MACH_V
84e0: 4d 29 0a 20 20 20 20 69 66 20 28 76 6d 5f 70 72  M).    if (vm_pr
84f0: 6f 74 65 63 74 28 74 61 73 6b 5f 73 65 6c 66 28  otect(task_self(
8500: 29 2c 73 74 61 72 74 5f 61 64 64 72 2c 6c 65 6e  ),start_addr,len
8510: 2c 30 2c 56 4d 5f 50 52 4f 54 5f 52 45 41 44 7c  ,0,VM_PROT_READ|
8520: 56 4d 5f 50 52 4f 54 5f 57 52 49 54 45 7c 56 4d  VM_PROT_WRITE|VM
8530: 5f 50 52 4f 54 5f 45 58 45 43 55 54 45 29 20 21  _PROT_EXECUTE) !
8540: 3d 20 4b 45 52 4e 5f 53 55 43 43 45 53 53 29 0a  = KERN_SUCCESS).
8550: 23 65 6c 73 65 0a 23 69 66 20 64 65 66 69 6e 65  #else.#if define
8560: 64 28 5f 5f 63 6f 6e 76 65 78 5f 5f 29 0a 20 20  d(__convex__).  
8570: 20 20 2f 2a 20 43 6f 6e 76 65 78 20 4f 53 20 63    /* Convex OS c
8580: 61 6c 6c 73 20 69 74 20 60 6d 72 65 6d 61 70 28  alls it `mremap(
8590: 29 27 2e 20 2a 2f 0a 20 20 20 20 6d 72 65 6d 61  )'. */.    mrema
85a0: 70 28 73 74 61 72 74 5f 61 64 64 72 2c 20 26 6c  p(start_addr, &l
85b0: 65 6e 2c 20 50 52 4f 54 5f 52 45 41 44 7c 50 52  en, PROT_READ|PR
85c0: 4f 54 5f 57 52 49 54 45 7c 50 52 4f 54 5f 45 58  OT_WRITE|PROT_EX
85d0: 45 43 2c 20 4d 41 50 5f 50 52 49 56 41 54 45 29  EC, MAP_PRIVATE)
85e0: 3b 0a 20 20 20 20 69 66 20 28 30 29 0a 23 65 6c  ;.    if (0).#el
85f0: 73 65 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48  se.#if defined(H
8600: 41 56 45 5f 53 59 53 5f 4d 38 38 4b 42 43 53 5f  AVE_SYS_M88KBCS_
8610: 48 29 0a 20 20 20 20 69 66 20 28 6d 65 6d 63 74  H).    if (memct
8620: 6c 28 73 74 61 72 74 5f 61 64 64 72 2c 20 6c 65  l(start_addr, le
8630: 6e 2c 20 4d 43 54 5f 54 45 58 54 29 20 3d 3d 20  n, MCT_TEXT) == 
8640: 2d 31 29 0a 23 65 6c 73 65 0a 20 20 20 20 69 66  -1).#else.    if
8650: 20 28 6d 70 72 6f 74 65 63 74 28 28 76 6f 69 64   (mprotect((void
8660: 2a 29 73 74 61 72 74 5f 61 64 64 72 2c 20 6c 65  *)start_addr, le
8670: 6e 2c 20 50 52 4f 54 5f 52 45 41 44 7c 50 52 4f  n, PROT_READ|PRO
8680: 54 5f 57 52 49 54 45 7c 50 52 4f 54 5f 45 58 45  T_WRITE|PROT_EXE
8690: 43 29 20 3c 20 30 29 0a 23 65 6e 64 69 66 0a 23  C) < 0).#endif.#
86a0: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 20 20 20  endif.#endif.   
86b0: 20 20 20 7b 20 66 70 72 69 6e 74 66 28 73 74 64     { fprintf(std
86c0: 65 72 72 2c 22 74 72 61 6d 70 6f 6c 69 6e 65 3a  err,"trampoline:
86d0: 20 63 61 6e 6e 6f 74 20 6d 61 6b 65 20 6d 65 6d   cannot make mem
86e0: 6f 72 79 20 65 78 65 63 75 74 61 62 6c 65 5c 6e  ory executable\n
86f0: 22 29 3b 20 61 62 6f 72 74 28 29 3b 20 7d 0a 20  "); abort(); }. 
8700: 20 7d 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a   }}.#endif..  /*
8710: 20 34 2e 20 46 6c 75 73 68 20 69 6e 73 74 72 75   4. Flush instru
8720: 63 74 69 6f 6e 20 63 61 63 68 65 20 2a 2f 0a 20  ction cache */. 
8730: 20 2f 2a 20 57 65 20 6e 65 65 64 20 74 68 69 73   /* We need this
8740: 20 62 65 63 61 75 73 65 20 73 6f 6d 65 20 43 50   because some CP
8750: 55 73 20 68 61 76 65 20 73 65 70 61 72 61 74 65  Us have separate
8760: 20 64 61 74 61 20 63 61 63 68 65 20 61 6e 64 20   data cache and 
8770: 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 2a  instruction.   *
8780: 20 63 61 63 68 65 2e 20 54 68 65 20 66 72 65 73   cache. The fres
8790: 68 6c 79 20 62 75 69 6c 74 20 74 72 61 6d 70 6f  hly built trampo
87a0: 6c 69 6e 65 20 69 73 20 76 69 73 69 62 6c 65 20  line is visible 
87b0: 74 6f 20 74 68 65 20 64 61 74 61 20 63 61 63 68  to the data cach
87c0: 65 2c 20 62 75 74 20 6e 6f 74 0a 20 20 20 2a 20  e, but not.   * 
87d0: 6d 61 79 62 65 20 6e 6f 74 20 74 6f 20 74 68 65  maybe not to the
87e0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 61 63   instruction cac
87f0: 68 65 2e 20 54 68 69 73 20 69 73 20 68 61 69 72  he. This is hair
8800: 79 2e 0a 20 20 20 2a 2f 0a 23 69 66 20 21 28 64  y..   */.#if !(d
8810: 65 66 69 6e 65 64 28 5f 5f 68 70 70 61 6e 65 77  efined(__hppanew
8820: 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  __) || defined(_
8830: 5f 70 6f 77 65 72 70 63 61 69 78 5f 5f 29 20 7c  _powerpcaix__) |
8840: 7c 20 64 65 66 69 6e 65 64 28 5f 5f 70 6f 77 65  | defined(__powe
8850: 72 70 63 36 34 61 69 78 5f 5f 29 20 7c 7c 20 64  rpc64aix__) || d
8860: 65 66 69 6e 65 64 28 5f 5f 69 61 36 34 5f 5f 29  efined(__ia64__)
8870: 29 0a 20 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64  ).  /* Only need
8880: 65 64 20 69 66 20 77 65 20 72 65 61 6c 6c 79 20  ed if we really 
8890: 73 65 74 20 75 70 20 6d 61 63 68 69 6e 65 20 69  set up machine i
88a0: 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 2a 2f 0a  nstructions. */.
88b0: 23 69 66 64 65 66 20 5f 5f 69 33 38 36 5f 5f 0a  #ifdef __i386__.
88c0: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e  #if defined(_WIN
88d0: 33 32 29 0a 20 20 77 68 69 6c 65 20 28 21 46 6c  32).  while (!Fl
88e0: 75 73 68 49 6e 73 74 72 75 63 74 69 6f 6e 43 61  ushInstructionCa
88f0: 63 68 65 28 47 65 74 43 75 72 72 65 6e 74 50 72  che(GetCurrentPr
8900: 6f 63 65 73 73 28 29 2c 66 75 6e 63 74 69 6f 6e  ocess(),function
8910: 2c 54 52 41 4d 50 5f 4c 45 4e 47 54 48 29 29 0a  ,TRAMP_LENGTH)).
8920: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 65      continue;.#e
8930: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 64  ndif.#endif.#ifd
8940: 65 66 20 5f 5f 6d 36 38 6b 5f 5f 0a 23 69 66 20  ef __m68k__.#if 
8950: 64 65 66 69 6e 65 64 28 4e 65 58 54 29 20 26 26  defined(NeXT) &&
8960: 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f   defined(__GNUC_
8970: 5f 29 0a 20 20 5f 5f 61 73 6d 5f 5f 20 5f 5f 76  _).  __asm__ __v
8980: 6f 6c 61 74 69 6c 65 5f 5f 20 28 22 74 72 61 70  olatile__ ("trap
8990: 20 23 32 22 29 3b 0a 23 65 6e 64 69 66 0a 23 69   #2");.#endif.#i
89a0: 66 20 64 65 66 69 6e 65 64 28 41 4d 49 47 41 29  f defined(AMIGA)
89b0: 0a 20 20 43 61 63 68 65 43 6c 65 61 72 45 28 66  .  CacheClearE(f
89c0: 75 6e 63 74 69 6f 6e 2c 54 52 41 4d 50 5f 4c 45  unction,TRAMP_LE
89d0: 4e 47 54 48 2c 43 41 43 52 46 5f 43 6c 65 61 72  NGTH,CACRF_Clear
89e0: 49 7c 43 41 43 52 46 5f 43 6c 65 61 72 44 29 3b  I|CACRF_ClearD);
89f0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
8a00: 6e 65 64 28 61 70 6f 6c 6c 6f 29 0a 20 20 63 61  ned(apollo).  ca
8a10: 63 68 65 5f 24 63 6c 65 61 72 28 29 3b 0a 23 65  che_$clear();.#e
8a20: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
8a30: 28 68 70 75 78 29 0a 20 20 63 61 63 68 65 63 74  (hpux).  cachect
8a40: 6c 28 43 43 5f 49 50 55 52 47 45 2c 66 75 6e 63  l(CC_IPURGE,func
8a50: 74 69 6f 6e 2c 54 52 41 4d 50 5f 4c 45 4e 47 54  tion,TRAMP_LENGT
8a60: 48 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  H);.#endif.#if d
8a70: 65 66 69 6e 65 64 28 5f 5f 4e 65 74 42 53 44 5f  efined(__NetBSD_
8a80: 5f 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  _) && defined(__
8a90: 47 4e 55 43 5f 5f 29 0a 20 20 7b 20 72 65 67 69  GNUC__).  { regi
8aa0: 73 74 65 72 20 75 6e 73 69 67 6e 65 64 20 6c 6f  ster unsigned lo
8ab0: 6e 67 20 5f 62 65 67 20 5f 5f 61 73 6d 5f 5f 20  ng _beg __asm__ 
8ac0: 28 22 25 61 31 22 29 20 3d 20 28 75 6e 73 69 67  ("%a1") = (unsig
8ad0: 6e 65 64 20 6c 6f 6e 67 29 20 66 75 6e 63 74 69  ned long) functi
8ae0: 6f 6e 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72  on;.    register
8af0: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 5f   unsigned long _
8b00: 6c 65 6e 20 5f 5f 61 73 6d 5f 5f 20 28 22 25 64  len __asm__ ("%d
8b10: 31 22 29 20 3d 20 54 52 41 4d 50 5f 4c 45 4e 47  1") = TRAMP_LENG
8b20: 54 48 3b 0a 20 20 20 20 5f 5f 61 73 6d 5f 5f 20  TH;.    __asm__ 
8b30: 5f 5f 76 6f 6c 61 74 69 6c 65 5f 5f 20 28 0a 20  __volatile__ (. 
8b40: 20 20 20 20 20 22 6d 6f 76 65 25 2e 6c 20 25 23       "move%.l %#
8b50: 30 78 38 30 30 30 30 30 30 34 2c 25 2f 64 30 5c  0x80000004,%/d0\
8b60: 6e 5c 74 22 20 2f 2a 20 43 43 5f 45 58 54 50 55  n\t" /* CC_EXTPU
8b70: 52 47 45 20 7c 20 43 5f 49 50 55 52 47 45 20 2a  RGE | C_IPURGE *
8b80: 2f 0a 20 20 20 20 20 20 22 74 72 61 70 20 23 31  /.      "trap #1
8b90: 32 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2"              
8ba0: 20 20 20 20 20 20 20 20 2f 2a 20 6b 65 72 6e 65          /* kerne
8bb0: 6c 20 63 61 6c 6c 20 60 63 61 63 68 65 63 74 6c  l call `cachectl
8bc0: 27 20 2a 2f 0a 20 20 20 20 20 20 3a 0a 20 20 20  ' */.      :.   
8bd0: 20 20 20 3a 20 22 61 22 20 28 5f 62 65 67 29 2c     : "a" (_beg),
8be0: 20 22 64 22 20 28 5f 6c 65 6e 29 0a 20 20 20 20   "d" (_len).    
8bf0: 20 20 3a 20 22 25 61 30 22 2c 20 22 25 61 31 22    : "%a0", "%a1"
8c00: 2c 20 22 25 64 30 22 2c 20 22 25 64 31 22 20 20  , "%d0", "%d1"  
8c10: 20 20 2f 2a 20 63 61 6c 6c 2d 75 73 65 64 20 72    /* call-used r
8c20: 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 20 20  egisters */.    
8c30: 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a    );.  }.#endif.
8c40: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69  #if defined(__li
8c50: 6e 75 78 5f 5f 29 20 26 26 20 64 65 66 69 6e 65  nux__) && define
8c60: 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a 20 20 7b 20  d(__GNUC__).  { 
8c70: 72 65 67 69 73 74 65 72 20 75 6e 73 69 67 6e 65  register unsigne
8c80: 64 20 6c 6f 6e 67 20 5f 62 65 67 20 5f 5f 61 73  d long _beg __as
8c90: 6d 5f 5f 20 28 22 25 64 31 22 29 20 3d 20 28 75  m__ ("%d1") = (u
8ca0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 66 75  nsigned long) fu
8cb0: 6e 63 74 69 6f 6e 3b 0a 20 20 20 20 72 65 67 69  nction;.    regi
8cc0: 73 74 65 72 20 75 6e 73 69 67 6e 65 64 20 6c 6f  ster unsigned lo
8cd0: 6e 67 20 5f 6c 65 6e 20 5f 5f 61 73 6d 5f 5f 20  ng _len __asm__ 
8ce0: 28 22 25 64 34 22 29 20 3d 20 54 52 41 4d 50 5f  ("%d4") = TRAMP_
8cf0: 4c 45 4e 47 54 48 20 2b 20 33 32 3b 0a 20 20 20  LENGTH + 32;.   
8d00: 20 5f 5f 61 73 6d 5f 5f 20 5f 5f 76 6f 6c 61 74   __asm__ __volat
8d10: 69 6c 65 5f 5f 20 28 0a 20 20 20 20 20 20 22 6d  ile__ (.      "m
8d20: 6f 76 65 25 2e 6c 20 25 23 31 32 33 2c 25 2f 64  ove%.l %#123,%/d
8d30: 30 5c 6e 5c 74 22 0a 20 20 20 20 20 20 22 6d 6f  0\n\t".      "mo
8d40: 76 65 25 2e 6c 20 25 23 31 2c 25 2f 64 32 5c 6e  ve%.l %#1,%/d2\n
8d50: 5c 74 22 0a 20 20 20 20 20 20 22 6d 6f 76 65 25  \t".      "move%
8d60: 2e 6c 20 25 23 33 2c 25 2f 64 33 5c 6e 5c 74 22  .l %#3,%/d3\n\t"
8d70: 0a 20 20 20 20 20 20 22 74 72 61 70 20 25 23 30  .      "trap %#0
8d80: 22 0a 20 20 20 20 20 20 3a 0a 20 20 20 20 20 20  ".      :.      
8d90: 3a 20 22 64 22 20 28 5f 62 65 67 29 2c 20 22 64  : "d" (_beg), "d
8da0: 22 20 28 5f 6c 65 6e 29 0a 20 20 20 20 20 20 3a  " (_len).      :
8db0: 20 22 25 64 30 22 2c 20 22 25 64 32 22 2c 20 22   "%d0", "%d2", "
8dc0: 25 64 33 22 0a 20 20 20 20 20 20 29 3b 0a 20 20  %d3".      );.  
8dd0: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  }.#endif.#if def
8de0: 69 6e 65 64 28 41 55 58 29 20 26 26 20 64 65 66  ined(AUX) && def
8df0: 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a 20  ined(__GNUC__). 
8e00: 20 2f 2a 20 73 79 73 6d 36 38 6b 28 31 30 35 2c   /* sysm68k(105,
8e10: 20 61 64 64 72 2c 20 73 63 6f 70 65 2c 20 63 61   addr, scope, ca
8e20: 63 68 65 2c 20 6c 65 6e 29 20 2a 2f 0a 20 20 5f  che, len) */.  _
8e30: 5f 61 73 6d 5f 5f 20 5f 5f 76 6f 6c 61 74 69 6c  _asm__ __volatil
8e40: 65 5f 5f 20 28 0a 20 20 20 20 22 6d 6f 76 65 25  e__ (.    "move%
8e50: 2e 6c 20 25 31 2c 25 2f 73 70 40 2d 5c 6e 5c 74  .l %1,%/sp@-\n\t
8e60: 22 0a 20 20 20 20 22 6d 6f 76 65 25 2e 6c 20 25  ".    "move%.l %
8e70: 23 33 2c 25 2f 73 70 40 2d 5c 6e 5c 74 22 0a 20  #3,%/sp@-\n\t". 
8e80: 20 20 20 22 6d 6f 76 65 25 2e 6c 20 25 23 31 2c     "move%.l %#1,
8e90: 25 2f 73 70 40 2d 5c 6e 5c 74 22 0a 20 20 20 20  %/sp@-\n\t".    
8ea0: 22 6d 6f 76 65 25 2e 6c 20 25 30 2c 25 2f 73 70  "move%.l %0,%/sp
8eb0: 40 2d 5c 6e 5c 74 22 0a 20 20 20 20 22 6d 6f 76  @-\n\t".    "mov
8ec0: 65 25 2e 6c 20 25 23 31 30 35 2c 25 2f 73 70 40  e%.l %#105,%/sp@
8ed0: 2d 5c 6e 5c 74 22 0a 20 20 20 20 22 6d 6f 76 65  -\n\t".    "move
8ee0: 25 2e 6c 20 25 23 30 2c 25 2f 73 70 40 2d 5c 6e  %.l %#0,%/sp@-\n
8ef0: 5c 74 22 0a 20 20 20 20 22 6d 6f 76 65 25 2e 6c  \t".    "move%.l
8f00: 20 25 23 33 38 2c 25 2f 73 70 40 2d 5c 6e 5c 74   %#38,%/sp@-\n\t
8f10: 22 0a 20 20 20 20 22 74 72 61 70 20 25 23 30 5c  ".    "trap %#0\
8f20: 6e 5c 74 22 0a 20 20 20 20 22 61 64 64 25 2e 6c  n\t".    "add%.l
8f30: 20 25 23 32 34 2c 25 2f 73 70 22 0a 20 20 20 20   %#24,%/sp".    
8f40: 3a 0a 20 20 20 20 3a 20 22 72 22 20 28 66 75 6e  :.    : "r" (fun
8f50: 63 74 69 6f 6e 29 2c 20 22 67 22 20 28 28 69 6e  ction), "g" ((in
8f60: 74 29 54 52 41 4d 50 5f 4c 45 4e 47 54 48 29 0a  t)TRAMP_LENGTH).
8f70: 20 20 20 20 3a 20 22 25 64 30 22 0a 20 20 20 20      : "%d0".    
8f80: 29 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66  );.#endif.#endif
8f90: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 6d  .#if defined(__m
8fa0: 69 70 73 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65  ips__) || define
8fb0: 64 28 5f 5f 6d 69 70 73 6e 33 32 5f 5f 29 20 7c  d(__mipsn32__) |
8fc0: 7c 20 64 65 66 69 6e 65 64 28 5f 5f 6d 69 70 73  | defined(__mips
8fd0: 36 34 5f 5f 29 0a 20 20 63 61 63 68 65 66 6c 75  64__).  cacheflu
8fe0: 73 68 28 66 75 6e 63 74 69 6f 6e 2c 54 52 41 4d  sh(function,TRAM
8ff0: 50 5f 4c 45 4e 47 54 48 2c 49 43 41 43 48 45 29  P_LENGTH,ICACHE)
9000: 3b 0a 20 20 2f 2a 20 67 66 6f 72 74 68 2d 30 2e  ;.  /* gforth-0.
9010: 33 2e 30 20 75 73 65 73 20 42 43 41 43 48 45 20  3.0 uses BCACHE 
9020: 69 6e 73 74 65 61 64 20 6f 66 20 49 43 41 43 48  instead of ICACH
9030: 45 2e 20 57 68 79 3f 3f 20 2a 2f 0a 23 65 6e 64  E. Why?? */.#end
9040: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  if.#if defined(_
9050: 5f 73 70 61 72 63 5f 5f 29 20 7c 7c 20 64 65 66  _sparc__) || def
9060: 69 6e 65 64 28 5f 5f 73 70 61 72 63 36 34 5f 5f  ined(__sparc64__
9070: 29 0a 20 20 2f 2a 20 54 68 69 73 20 61 73 73 75  ).  /* This assu
9080: 6d 65 73 20 74 68 61 74 20 74 68 65 20 74 72 61  mes that the tra
9090: 6d 70 6f 6c 69 6e 65 20 66 69 74 73 20 69 6e 20  mpoline fits in 
90a0: 61 74 20 6d 6f 73 74 20 74 77 6f 20 63 61 63 68  at most two cach
90b0: 65 20 6c 69 6e 65 73 2e 20 2a 2f 0a 20 20 5f 5f  e lines. */.  __
90c0: 54 52 5f 63 6c 65 61 72 5f 63 61 63 68 65 5f 32  TR_clear_cache_2
90d0: 28 66 75 6e 63 74 69 6f 6e 2c 66 75 6e 63 74 69  (function,functi
90e0: 6f 6e 2b 54 52 41 4d 50 5f 4c 45 4e 47 54 48 2d  on+TRAMP_LENGTH-
90f0: 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  1);.#endif.#ifde
9100: 66 20 5f 5f 61 6c 70 68 61 5f 5f 0a 20 20 5f 5f  f __alpha__.  __
9110: 54 52 5f 63 6c 65 61 72 5f 63 61 63 68 65 28 29  TR_clear_cache()
9120: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
9130: 5f 5f 68 70 70 61 5f 5f 0a 20 20 2f 2a 20 54 68  __hppa__.  /* Th
9140: 69 73 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  is assumes that 
9150: 74 68 65 20 74 72 61 6d 70 6f 6c 69 6e 65 20 66  the trampoline f
9160: 69 74 73 20 69 6e 20 61 74 20 6d 6f 73 74 20 74  its in at most t
9170: 77 6f 20 63 61 63 68 65 20 6c 69 6e 65 73 2e 20  wo cache lines. 
9180: 2a 2f 0a 20 20 5f 5f 54 52 5f 63 6c 65 61 72 5f  */.  __TR_clear_
9190: 63 61 63 68 65 28 66 75 6e 63 74 69 6f 6e 2c 66  cache(function,f
91a0: 75 6e 63 74 69 6f 6e 2b 54 52 41 4d 50 5f 4c 45  unction+TRAMP_LE
91b0: 4e 47 54 48 2d 31 29 3b 0a 23 65 6e 64 69 66 0a  NGTH-1);.#endif.
91c0: 23 69 66 64 65 66 20 5f 5f 61 72 6d 5f 5f 0a 20  #ifdef __arm__. 
91d0: 20 5f 5f 54 52 5f 63 6c 65 61 72 5f 63 61 63 68   __TR_clear_cach
91e0: 65 28 66 75 6e 63 74 69 6f 6e 2c 66 75 6e 63 74  e(function,funct
91f0: 69 6f 6e 2b 54 52 41 4d 50 5f 4c 45 4e 47 54 48  ion+TRAMP_LENGTH
9200: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  );.#endif.#if de
9210: 66 69 6e 65 64 28 5f 5f 70 6f 77 65 72 70 63 5f  fined(__powerpc_
9220: 5f 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f  _) && !defined(_
9230: 5f 70 6f 77 65 72 70 63 36 34 5f 5f 29 0a 20 20  _powerpc64__).  
9240: 5f 5f 54 52 5f 63 6c 65 61 72 5f 63 61 63 68 65  __TR_clear_cache
9250: 28 66 75 6e 63 74 69 6f 6e 29 3b 0a 23 65 6e 64  (function);.#end
9260: 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d 38 38 6b  if.#ifdef __m88k
9270: 5f 5f 0a 20 20 73 79 73 6d 6f 74 28 53 38 38 43  __.  sysmot(S88C
9280: 41 43 48 45 46 4c 55 53 48 50 41 47 45 2c 20 28  ACHEFLUSHPAGE, (
9290: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 66 75  unsigned long)fu
92a0: 6e 63 74 69 6f 6e 20 26 20 2d 70 61 67 65 73 69  nction & -pagesi
92b0: 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  ze);.#endif.#ifd
92c0: 65 66 20 5f 5f 63 6f 6e 76 65 78 5f 5f 0a 20 20  ef __convex__.  
92d0: 5f 5f 54 52 5f 63 6c 65 61 72 5f 63 61 63 68 65  __TR_clear_cache
92e0: 28 29 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69  ();.#endif.#endi
92f0: 66 0a 0a 20 20 2f 2a 20 35 2e 20 52 65 74 75 72  f..  /* 5. Retur
9300: 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28  n. */.  return (
9310: 5f 5f 54 52 5f 66 75 6e 63 74 69 6f 6e 29 20 28  __TR_function) (
9320: 66 75 6e 63 74 69 6f 6e 20 2b 20 54 52 41 4d 50  function + TRAMP
9330: 5f 42 49 41 53 29 3b 0a 7d 0a 0a 76 6f 69 64 20  _BIAS);.}..void 
9340: 66 72 65 65 5f 74 72 61 6d 70 6f 6c 69 6e 65 5f  free_trampoline_
9350: 72 20 28 5f 5f 54 52 5f 66 75 6e 63 74 69 6f 6e  r (__TR_function
9360: 20 66 75 6e 63 74 69 6f 6e 29 0a 7b 0a 23 69 66   function).{.#if
9370: 20 54 52 41 4d 50 5f 42 49 41 53 0a 20 20 66 75   TRAMP_BIAS.  fu
9380: 6e 63 74 69 6f 6e 20 3d 20 28 5f 5f 54 52 5f 66  nction = (__TR_f
9390: 75 6e 63 74 69 6f 6e 29 28 28 63 68 61 72 2a 29  unction)((char*)
93a0: 66 75 6e 63 74 69 6f 6e 20 2d 20 54 52 41 4d 50  function - TRAMP
93b0: 5f 42 49 41 53 29 3b 0a 23 65 6e 64 69 66 0a 23  _BIAS);.#endif.#
93c0: 69 66 20 21 64 65 66 69 6e 65 64 28 43 4f 44 45  if !defined(CODE
93d0: 5f 45 58 45 43 55 54 41 42 4c 45 29 20 26 26 20  _EXECUTABLE) && 
93e0: 21 64 65 66 69 6e 65 64 28 45 58 45 43 55 54 41  !defined(EXECUTA
93f0: 42 4c 45 5f 56 49 41 5f 4d 50 52 4f 54 45 43 54  BLE_VIA_MPROTECT
9400: 29 0a 20 20 2a 28 63 68 61 72 2a 2a 29 66 75 6e  ).  *(char**)fun
9410: 63 74 69 6f 6e 20 3d 20 66 72 65 65 6c 69 73 74  ction = freelist
9420: 3b 20 66 72 65 65 6c 69 73 74 20 3d 20 28 63 68  ; freelist = (ch
9430: 61 72 2a 29 66 75 6e 63 74 69 6f 6e 3b 0a 20 20  ar*)function;.  
9440: 2f 2a 20 49 74 20 69 73 20 70 72 6f 62 61 62 6c  /* It is probabl
9450: 79 20 6e 6f 74 20 77 6f 72 74 68 20 63 61 6c 6c  y not worth call
9460: 69 6e 67 20 6d 75 6e 6d 61 70 28 29 20 66 6f 72  ing munmap() for
9470: 20 65 6e 74 69 72 65 6c 79 20 66 72 65 65 64 20   entirely freed 
9480: 70 61 67 65 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a  pages. */.#else.
9490: 20 20 66 72 65 65 28 28 28 63 68 61 72 2a 2a 29    free(((char**)
94a0: 66 75 6e 63 74 69 6f 6e 29 5b 2d 31 5d 29 3b 0a  function)[-1]);.
94b0: 23 65 6e 64 69 66 0a 7d 0a 0a 69 6e 74 20 69 73  #endif.}..int is
94c0: 5f 74 72 61 6d 70 6f 6c 69 6e 65 5f 72 20 28 76  _trampoline_r (v
94d0: 6f 69 64 2a 20 66 75 6e 63 74 69 6f 6e 29 0a 7b  oid* function).{
94e0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 69 73 5f  .#if defined(is_
94f0: 74 72 61 6d 70 29 20 26 26 20 64 65 66 69 6e 65  tramp) && define
9500: 64 28 74 72 61 6d 70 5f 64 61 74 61 29 0a 23 69  d(tramp_data).#i
9510: 66 64 65 66 20 5f 5f 68 70 70 61 6e 65 77 5f 5f  fdef __hppanew__
9520: 0a 20 20 76 6f 69 64 2a 20 74 72 61 6d 70 5f 72  .  void* tramp_r
9530: 5f 61 64 64 72 65 73 73 20 3d 20 26 74 72 61 6d  _address = &tram
9540: 70 5f 72 3b 0a 20 20 69 66 20 28 21 28 28 28 6c  p_r;.  if (!(((l
9550: 6f 6e 67 29 66 75 6e 63 74 69 6f 6e 20 26 20 33  ong)function & 3
9560: 29 20 3d 3d 20 28 54 52 41 4d 50 5f 42 49 41 53  ) == (TRAMP_BIAS
9570: 20 26 20 33 29 29 29 20 72 65 74 75 72 6e 20 30   & 3))) return 0
9580: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
9590: 6e 0a 20 20 20 28 28 69 73 5f 74 72 61 6d 70 28  n.   ((is_tramp(
95a0: 28 28 63 68 61 72 2a 29 66 75 6e 63 74 69 6f 6e  ((char*)function
95b0: 20 2d 20 54 52 41 4d 50 5f 42 49 41 53 29 29 29   - TRAMP_BIAS)))
95c0: 0a 20 20 20 20 26 26 20 28 28 74 72 61 6d 70 5f  .    && ((tramp_
95d0: 64 61 74 61 28 28 28 63 68 61 72 2a 29 66 75 6e  data(((char*)fun
95e0: 63 74 69 6f 6e 20 2d 20 54 52 41 4d 50 5f 42 49  ction - TRAMP_BI
95f0: 41 53 29 29 29 20 3d 3d 20 28 6c 6f 6e 67 29 28  AS))) == (long)(
9600: 28 63 68 61 72 2a 29 66 75 6e 63 74 69 6f 6e 20  (char*)function 
9610: 2d 20 54 52 41 4d 50 5f 42 49 41 53 20 2b 20 54  - TRAMP_BIAS + T
9620: 52 41 4d 50 5f 4c 45 4e 47 54 48 29 29 0a 20 20  RAMP_LENGTH)).  
9630: 20 20 3f 20 31 20 3a 20 30 0a 20 20 20 29 3b 0a    ? 1 : 0.   );.
9640: 23 65 6c 73 65 0a 20 20 61 62 6f 72 74 28 29 3b  #else.  abort();
9650: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 5f 5f 54 52 5f  .#endif.}..__TR_
9660: 66 75 6e 63 74 69 6f 6e 20 74 72 61 6d 70 6f 6c  function trampol
9670: 69 6e 65 5f 72 5f 61 64 64 72 65 73 73 20 28 76  ine_r_address (v
9680: 6f 69 64 2a 20 66 75 6e 63 74 69 6f 6e 29 0a 7b  oid* function).{
9690: 0a 23 69 66 64 65 66 20 74 72 61 6d 70 5f 61 64  .#ifdef tramp_ad
96a0: 64 72 65 73 73 0a 20 20 72 65 74 75 72 6e 20 28  dress.  return (
96b0: 5f 5f 54 52 5f 66 75 6e 63 74 69 6f 6e 29 28 74  __TR_function)(t
96c0: 72 61 6d 70 5f 61 64 64 72 65 73 73 28 28 28 63  ramp_address(((c
96d0: 68 61 72 2a 29 66 75 6e 63 74 69 6f 6e 20 2d 20  har*)function - 
96e0: 54 52 41 4d 50 5f 42 49 41 53 29 29 29 3b 0a 23  TRAMP_BIAS)));.#
96f0: 65 6c 73 65 0a 20 20 61 62 6f 72 74 28 29 3b 0a  else.  abort();.
9700: 23 65 6e 64 69 66 0a 7d 0a 0a 76 6f 69 64 2a 20  #endif.}..void* 
9710: 74 72 61 6d 70 6f 6c 69 6e 65 5f 72 5f 64 61 74  trampoline_r_dat
9720: 61 30 20 28 76 6f 69 64 2a 20 66 75 6e 63 74 69  a0 (void* functi
9730: 6f 6e 29 0a 7b 0a 23 69 66 64 65 66 20 74 72 61  on).{.#ifdef tra
9740: 6d 70 5f 64 61 74 61 0a 20 20 72 65 74 75 72 6e  mp_data.  return
9750: 20 28 28 76 6f 69 64 2a 2a 29 28 28 63 68 61 72   ((void**)((char
9760: 2a 29 66 75 6e 63 74 69 6f 6e 2d 54 52 41 4d 50  *)function-TRAMP
9770: 5f 42 49 41 53 2b 54 52 41 4d 50 5f 4c 45 4e 47  _BIAS+TRAMP_LENG
9780: 54 48 29 29 5b 30 5d 3b 0a 23 65 6c 73 65 0a 20  TH))[0];.#else. 
9790: 20 61 62 6f 72 74 28 29 3b 0a 23 65 6e 64 69 66   abort();.#endif
97a0: 0a 7d 0a 0a 76 6f 69 64 2a 20 74 72 61 6d 70 6f  .}..void* trampo
97b0: 6c 69 6e 65 5f 72 5f 64 61 74 61 31 20 28 76 6f  line_r_data1 (vo
97c0: 69 64 2a 20 66 75 6e 63 74 69 6f 6e 29 0a 7b 0a  id* function).{.
97d0: 23 69 66 64 65 66 20 74 72 61 6d 70 5f 64 61 74  #ifdef tramp_dat
97e0: 61 0a 20 20 72 65 74 75 72 6e 20 28 28 76 6f 69  a.  return ((voi
97f0: 64 2a 2a 29 28 28 63 68 61 72 2a 29 66 75 6e 63  d**)((char*)func
9800: 74 69 6f 6e 2d 54 52 41 4d 50 5f 42 49 41 53 2b  tion-TRAMP_BIAS+
9810: 54 52 41 4d 50 5f 4c 45 4e 47 54 48 29 29 5b 31  TRAMP_LENGTH))[1
9820: 5d 3b 0a 23 65 6c 73 65 0a 20 20 61 62 6f 72 74  ];.#else.  abort
9830: 28 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a           ();.#endif.}.