Artifact 33a17f0c6f59126baa16e15726ad57ab461be763:


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 23 69 66 6e 64 65 66 20 43 4f  ndif..#ifndef CO
07c0: 44 45 5f 45 58 45 43 55 54 41 42 4c 45 0a 2f 2a  DE_EXECUTABLE./*
07d0: 20 48 6f 77 20 64 6f 20 77 65 20 6d 61 6b 65 20   How do we make 
07e0: 74 68 65 20 74 72 61 6d 70 6f 6c 69 6e 65 27 73  the trampoline's
07f0: 20 63 6f 64 65 20 65 78 65 63 75 74 61 62 6c 65   code executable
0800: 3f 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ? */.#if defined
0810: 28 48 41 56 45 5f 4d 41 43 48 5f 56 4d 29 20 7c  (HAVE_MACH_VM) |
0820: 7c 20 64 65 66 69 6e 65 64 28 5f 5f 63 6f 6e 76  | defined(__conv
0830: 65 78 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64  ex__) || defined
0840: 28 48 41 56 45 5f 57 4f 52 4b 49 4e 47 5f 4d 50  (HAVE_WORKING_MP
0850: 52 4f 54 45 43 54 29 20 7c 7c 20 64 65 66 69 6e  ROTECT) || defin
0860: 65 64 28 48 41 56 45 5f 53 59 53 5f 4d 38 38 4b  ed(HAVE_SYS_M88K
0870: 42 43 53 5f 48 29 0a 2f 2a 20 6d 70 72 6f 74 65  BCS_H)./* mprote
0880: 63 74 28 29 20 5b 6f 72 20 65 71 75 69 76 61 6c  ct() [or equival
0890: 65 6e 74 5d 20 74 68 65 20 6d 61 6c 6c 6f 63 27  ent] the malloc'
08a0: 65 64 20 61 72 65 61 2e 20 2a 2f 0a 23 64 65 66  ed area. */.#def
08b0: 69 6e 65 20 45 58 45 43 55 54 41 42 4c 45 5f 56  ine EXECUTABLE_V
08c0: 49 41 5f 4d 50 52 4f 54 45 43 54 0a 23 65 6c 73  IA_MPROTECT.#els
08d0: 65 0a 23 69 66 64 65 66 20 48 41 56 45 5f 4d 4d  e.#ifdef HAVE_MM
08e0: 41 50 0a 2f 2a 20 55 73 65 20 61 6e 20 6d 6d 61  AP./* Use an mma
08f0: 70 27 65 64 20 70 61 67 65 2e 20 2a 2f 0a 23 64  p'ed page. */.#d
0900: 65 66 69 6e 65 20 45 58 45 43 55 54 41 42 4c 45  efine EXECUTABLE
0910: 5f 56 49 41 5f 4d 4d 41 50 0a 23 69 66 64 65 66  _VIA_MMAP.#ifdef
0920: 20 48 41 56 45 5f 4d 4d 41 50 5f 41 4e 4f 4e 59   HAVE_MMAP_ANONY
0930: 4d 4f 55 53 0a 2f 2a 20 55 73 65 20 6d 6d 61 70  MOUS./* Use mmap
0940: 20 77 69 74 68 20 74 68 65 20 4d 41 50 5f 41 4e   with the MAP_AN
0950: 4f 4e 59 4d 4f 55 53 20 6f 72 20 4d 41 50 5f 41  ONYMOUS or MAP_A
0960: 4e 4f 4e 20 66 6c 61 67 2e 20 2a 2f 0a 23 64 65  NON flag. */.#de
0970: 66 69 6e 65 20 45 58 45 43 55 54 41 42 4c 45 5f  fine EXECUTABLE_
0980: 56 49 41 5f 4d 4d 41 50 5f 41 4e 4f 4e 59 4d 4f  VIA_MMAP_ANONYMO
0990: 55 53 0a 23 65 6c 73 65 0a 2f 2a 20 55 73 65 20  US.#else./* Use 
09a0: 6d 6d 61 70 20 6f 6e 20 2f 64 65 76 2f 7a 65 72  mmap on /dev/zer
09b0: 6f 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 45 58  o. */.#define EX
09c0: 45 43 55 54 41 42 4c 45 5f 56 49 41 5f 4d 4d 41  ECUTABLE_VIA_MMA
09d0: 50 5f 44 45 56 5a 45 52 4f 0a 23 65 6e 64 69 66  P_DEVZERO.#endif
09e0: 0a 23 65 6c 73 65 0a 23 69 66 64 65 66 20 48 41  .#else.#ifdef HA
09f0: 56 45 5f 53 48 4d 0a 2f 2a 20 55 73 65 20 61 6e  VE_SHM./* Use an
0a00: 20 73 68 6d 61 74 27 65 64 20 70 61 67 65 2e 20   shmat'ed page. 
0a10: 2a 2f 0a 23 64 65 66 69 6e 65 20 45 58 45 43 55  */.#define EXECU
0a20: 54 41 42 4c 45 5f 56 49 41 5f 53 48 4d 0a 23 65  TABLE_VIA_SHM.#e
0a30: 6c 73 65 0a 3f 3f 0a 23 65 6e 64 69 66 0a 23 65  lse.??.#endif.#e
0a40: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 65 6e 64  ndif.#endif.#end
0a50: 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  if..#include <st
0a60: 64 69 6f 2e 68 3e 20 2f 2a 20 64 65 63 6c 61 72  dio.h> /* declar
0a70: 65 73 20 66 70 72 69 6e 74 66 28 29 20 2a 2f 0a  es fprintf() */.
0a80: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
0a90: 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ypes.h>.#include
0aa0: 20 3c 73 74 64 6c 69 62 2e 68 3e 20 2f 2a 20 64   <stdlib.h> /* d
0ab0: 65 63 6c 61 72 65 73 20 61 62 6f 72 74 28 29 2c  eclares abort(),
0ac0: 20 6d 61 6c 6c 6f 63 28 29 2c 20 66 72 65 65 28   malloc(), free(
0ad0: 29 20 2a 2f 0a 23 69 66 64 65 66 20 48 41 56 45  ) */.#ifdef HAVE
0ae0: 5f 55 4e 49 53 54 44 5f 48 0a 23 69 6e 63 6c 75  _UNISTD_H.#inclu
0af0: 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 65  de <unistd.h>.#e
0b00: 6e 64 69 66 0a 0a 2f 2a 20 44 65 63 6c 61 72 65  ndif../* Declare
0b10: 20 67 65 74 70 61 67 65 73 69 7a 65 28 29 2e 20   getpagesize(). 
0b20: 2a 2f 0a 23 69 66 64 65 66 20 48 41 56 45 5f 47  */.#ifdef HAVE_G
0b30: 45 54 50 41 47 45 53 49 5a 45 0a 23 69 66 64 65  ETPAGESIZE.#ifde
0b40: 66 20 5f 5f 63 70 6c 75 73 70 6c 75 73 0a 65 78  f __cplusplus.ex
0b50: 74 65 72 6e 20 22 43 22 20 52 45 54 47 45 54 50  tern "C" RETGETP
0b60: 41 47 45 53 49 5a 45 54 59 50 45 20 67 65 74 70  AGESIZETYPE getp
0b70: 61 67 65 73 69 7a 65 20 28 76 6f 69 64 29 3b 0a  agesize (void);.
0b80: 23 65 6c 73 65 0a 65 78 74 65 72 6e 20 52 45 54  #else.extern RET
0b90: 47 45 54 50 41 47 45 53 49 5a 45 54 59 50 45 20  GETPAGESIZETYPE 
0ba0: 67 65 74 70 61 67 65 73 69 7a 65 20 28 76 6f 69  getpagesize (voi
0bb0: 64 29 3b 0a 23 65 6e 64 69 66 0a 23 65 6c 73 65  d);.#endif.#else
0bc0: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 59 53  .#ifdef HAVE_SYS
0bd0: 5f 50 41 52 41 4d 5f 48 0a 23 69 6e 63 6c 75 64  _PARAM_H.#includ
0be0: 65 20 3c 73 79 73 2f 70 61 72 61 6d 2e 68 3e 0a  e <sys/param.h>.
0bf0: 23 65 6c 73 65 0a 2f 2a 20 4e 6f 74 20 55 6e 69  #else./* Not Uni
0c00: 78 2c 20 65 2e 67 2e 20 6d 69 6e 67 77 33 32 20  x, e.g. mingw32 
0c10: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 53  */.#define PAGES
0c20: 49 5a 45 20 34 30 39 36 0a 23 65 6e 64 69 66 0a  IZE 4096.#endif.
0c30: 23 64 65 66 69 6e 65 20 67 65 74 70 61 67 65 73  #define getpages
0c40: 69 7a 65 28 29 20 50 41 47 45 53 49 5a 45 0a 23  ize() PAGESIZE.#
0c50: 65 6e 64 69 66 0a 0a 2f 2a 20 44 65 63 6c 61 72  endif../* Declar
0c60: 65 20 6d 70 72 6f 74 65 63 74 28 29 20 6f 72 20  e mprotect() or 
0c70: 65 71 75 69 76 61 6c 65 6e 74 2e 20 2a 2f 0a 23  equivalent. */.#
0c80: 69 66 64 65 66 20 45 58 45 43 55 54 41 42 4c 45  ifdef EXECUTABLE
0c90: 5f 56 49 41 5f 4d 50 52 4f 54 45 43 54 0a 23 69  _VIA_MPROTECT.#i
0ca0: 66 64 65 66 20 48 41 56 45 5f 4d 41 43 48 5f 56  fdef HAVE_MACH_V
0cb0: 4d 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  M.#include <sys/
0cc0: 72 65 73 6f 75 72 63 65 2e 68 3e 0a 23 69 6e 63  resource.h>.#inc
0cd0: 6c 75 64 65 20 3c 6d 61 63 68 2f 6d 61 63 68 5f  lude <mach/mach_
0ce0: 69 6e 74 65 72 66 61 63 65 2e 68 3e 0a 23 69 66  interface.h>.#if
0cf0: 64 65 66 20 4e 65 58 54 0a 23 69 6e 63 6c 75 64  def NeXT.#includ
0d00: 65 20 3c 6d 61 63 68 2f 6d 61 63 68 5f 69 6e 69  e <mach/mach_ini
0d10: 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64  t.h>.#endif.#ifd
0d20: 65 66 20 5f 5f 6f 73 66 5f 5f 0a 23 69 6e 63 6c  ef __osf__.#incl
0d30: 75 64 65 20 3c 6d 61 63 68 5f 69 6e 69 74 2e 68  ude <mach_init.h
0d40: 3e 0a 23 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64  >.#endif.#includ
0d50: 65 20 3c 6d 61 63 68 2f 6d 61 63 68 69 6e 65 2f  e <mach/machine/
0d60: 76 6d 5f 70 61 72 61 6d 2e 68 3e 0a 23 65 6c 73  vm_param.h>.#els
0d70: 65 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 59  e.#ifdef HAVE_SY
0d80: 53 5f 4d 38 38 4b 42 43 53 5f 48 0a 23 69 6e 63  S_M88KBCS_H.#inc
0d90: 6c 75 64 65 20 3c 73 79 73 2f 6d 38 38 6b 62 63  lude <sys/m88kbc
0da0: 73 2e 68 3e 0a 23 64 65 66 69 6e 65 20 67 65 74  s.h>.#define get
0db0: 70 61 67 65 73 69 7a 65 28 29 20 20 34 30 39 36  pagesize()  4096
0dc0: 20 20 2f 2a 20 3f 3f 20 2a 2f 0a 23 65 6c 73 65    /* ?? */.#else
0dd0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
0de0: 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ypes.h>.#include
0df0: 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68 3e 0a 23 65   <sys/mman.h>.#e
0e00: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 65 6e 64  ndif.#endif.#end
0e10: 69 66 0a 0a 2f 2a 20 44 65 63 6c 61 72 65 20 6d  if../* Declare m
0e20: 6d 61 70 28 29 2e 20 2a 2f 0a 23 69 66 64 65 66  map(). */.#ifdef
0e30: 20 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41 5f   EXECUTABLE_VIA_
0e40: 4d 4d 41 50 0a 23 69 6e 63 6c 75 64 65 20 3c 73  MMAP.#include <s
0e50: 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63  ys/types.h>.#inc
0e60: 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68  lude <sys/mman.h
0e70: 3e 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 50  >.#if !defined(P
0e80: 52 4f 54 5f 45 58 45 43 29 20 26 26 20 64 65 66  ROT_EXEC) && def
0e90: 69 6e 65 64 28 50 52 4f 54 5f 45 58 45 43 55 54  ined(PROT_EXECUT
0ea0: 45 29 20 2f 2a 20 49 72 69 78 20 34 2e 30 2e 35  E) /* Irix 4.0.5
0eb0: 20 6e 65 65 64 73 20 74 68 69 73 20 2a 2f 0a 23   needs this */.#
0ec0: 64 65 66 69 6e 65 20 50 52 4f 54 5f 45 58 45 43  define PROT_EXEC
0ed0: 20 50 52 4f 54 5f 45 58 45 43 55 54 45 0a 23 65   PROT_EXECUTE.#e
0ee0: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  ndif.#endif../* 
0ef0: 44 65 63 6c 61 72 65 20 6f 70 65 6e 28 29 2e 20  Declare open(). 
0f00: 2a 2f 0a 23 69 66 64 65 66 20 45 58 45 43 55 54  */.#ifdef EXECUT
0f10: 41 42 4c 45 5f 56 49 41 5f 4d 4d 41 50 5f 44 45  ABLE_VIA_MMAP_DE
0f20: 56 5a 45 52 4f 0a 23 69 6e 63 6c 75 64 65 20 3c  VZERO.#include <
0f30: 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e  sys/types.h>.#in
0f40: 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e  clude <unistd.h>
0f50: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c  .#include <fcntl
0f60: 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 44  .h>.#endif../* D
0f70: 65 63 6c 61 72 65 20 73 68 6d 67 65 74 28 29 2c  eclare shmget(),
0f80: 20 73 68 6d 61 74 28 29 2c 20 73 68 6d 63 74 6c   shmat(), shmctl
0f90: 28 29 2e 20 2a 2f 0a 23 69 66 64 65 66 20 45 58  (). */.#ifdef EX
0fa0: 45 43 55 54 41 42 4c 45 5f 56 49 41 5f 53 48 4d  ECUTABLE_VIA_SHM
0fb0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
0fc0: 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ypes.h>.#include
0fd0: 20 3c 73 79 73 2f 69 70 63 2e 68 3e 0a 23 69 6e   <sys/ipc.h>.#in
0fe0: 63 6c 75 64 65 20 3c 73 79 73 2f 73 68 6d 2e 68  clude <sys/shm.h
0ff0: 3e 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 59  >.#ifdef HAVE_SY
1000: 53 5f 53 59 53 4d 41 43 52 4f 53 5f 48 0a 23 69  S_SYSMACROS_H.#i
1010: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 79 73 6d  nclude <sys/sysm
1020: 61 63 72 6f 73 2e 68 3e 0a 23 65 6e 64 69 66 0a  acros.h>.#endif.
1030: 23 65 6e 64 69 66 0a 0a 2f 2a 20 53 75 70 70 6f  #endif../* Suppo
1040: 72 74 20 66 6f 72 20 69 6e 73 74 72 75 63 74 69  rt for instructi
1050: 6f 6e 20 63 61 63 68 65 20 66 6c 75 73 68 2e 20  on cache flush. 
1060: 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 69 33 38 36  */.#ifdef __i386
1070: 5f 5f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  __.#if defined(_
1080: 57 49 4e 33 32 29 20 2f 2a 20 57 69 6e 64 6f 77  WIN32) /* Window
1090: 73 4e 54 20 6f 72 20 57 69 6e 64 6f 77 73 39 35  sNT or Windows95
10a0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 33   */.#define WIN3
10b0: 32 5f 4c 45 41 4e 5f 41 4e 44 5f 4d 45 41 4e 0a  2_LEAN_AND_MEAN.
10c0: 23 64 65 66 69 6e 65 20 57 49 4e 33 32 5f 45 58  #define WIN32_EX
10d0: 54 52 41 5f 4c 45 41 4e 0a 23 69 6e 63 6c 75 64  TRA_LEAN.#includ
10e0: 65 20 3c 77 69 6e 64 6f 77 73 2e 68 3e 0a 23 65  e <windows.h>.#e
10f0: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 64  ndif.#endif.#ifd
1100: 65 66 20 5f 5f 6d 36 38 6b 5f 5f 0a 23 69 66 20  ef __m68k__.#if 
1110: 64 65 66 69 6e 65 64 28 41 4d 49 47 41 29 20 2f  defined(AMIGA) /
1120: 2a 20 41 6d 69 67 61 20 72 75 6e 6e 69 6e 67 20  * Amiga running 
1130: 41 6d 69 67 61 4f 53 2c 20 6e 6f 74 20 4c 69 6e  AmigaOS, not Lin
1140: 75 78 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c  ux */.#include <
1150: 65 78 65 63 2f 74 79 70 65 73 2e 68 3e 0a 23 69  exec/types.h>.#i
1160: 6e 63 6c 75 64 65 20 3c 65 78 65 63 2f 65 78 65  nclude <exec/exe
1170: 63 62 61 73 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  cbase.h>.#includ
1180: 65 20 3c 70 72 6f 74 6f 2f 65 78 65 63 2e 68 3e  e <proto/exec.h>
1190: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 68  .#endif.#ifdef h
11a0: 70 75 78 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  pux.#include <sy
11b0: 73 2f 63 61 63 68 65 2e 68 3e 0a 23 65 6e 64 69  s/cache.h>.#endi
11c0: 66 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  f.#endif.#if def
11d0: 69 6e 65 64 28 5f 5f 6d 69 70 73 5f 5f 29 20 7c  ined(__mips__) |
11e0: 7c 20 64 65 66 69 6e 65 64 28 5f 5f 6d 69 70 73  | defined(__mips
11f0: 6e 33 32 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65  n32__) || define
1200: 64 28 5f 5f 6d 69 70 73 36 34 5f 5f 29 0a 23 69  d(__mips64__).#i
1210: 66 64 65 66 20 75 6c 74 72 69 78 0a 23 69 6e 63  fdef ultrix.#inc
1220: 6c 75 64 65 20 3c 6d 69 70 73 2f 63 61 63 68 65  lude <mips/cache
1230: 63 74 6c 2e 68 3e 0a 23 65 6c 73 65 0a 23 69 66  ctl.h>.#else.#if
1240: 64 65 66 20 6c 69 6e 75 78 0a 23 69 6e 63 6c 75  def linux.#inclu
1250: 64 65 20 3c 61 73 6d 2f 63 61 63 68 65 63 74 6c  de <asm/cachectl
1260: 2e 68 3e 0a 23 65 6c 73 65 0a 23 69 66 64 65 66  .h>.#else.#ifdef
1270: 20 48 41 56 45 5f 53 59 53 5f 43 41 43 48 45 43   HAVE_SYS_CACHEC
1280: 54 4c 5f 48 0a 23 69 6e 63 6c 75 64 65 20 3c 73  TL_H.#include <s
1290: 79 73 2f 63 61 63 68 65 63 74 6c 2e 68 3e 0a 23  ys/cachectl.h>.#
12a0: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 65 6e  endif.#endif.#en
12b0: 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  dif.#endif.#ifde
12c0: 66 20 5f 5f 6d 38 38 6b 5f 5f 0a 23 69 6e 63 6c  f __m88k__.#incl
12d0: 75 64 65 20 3c 73 79 73 2f 73 79 73 6c 6f 63 61  ude <sys/sysloca
12e0: 6c 2e 68 3e 0a 23 65 6e 64 69 66 0a 2f 2a 20 49  l.h>.#endif./* I
12f0: 6e 6c 69 6e 65 20 61 73 73 65 6d 62 6c 79 20 66  nline assembly f
1300: 75 6e 63 74 69 6f 6e 20 66 6f 72 20 69 6e 73 74  unction for inst
1310: 72 75 63 74 69 6f 6e 20 63 61 63 68 65 20 66 6c  ruction cache fl
1320: 75 73 68 2e 20 2a 2f 0a 23 69 66 20 64 65 66 69  ush. */.#if defi
1330: 6e 65 64 28 5f 5f 73 70 61 72 63 5f 5f 29 20 7c  ned(__sparc__) |
1340: 7c 20 64 65 66 69 6e 65 64 28 5f 5f 73 70 61 72  | defined(__spar
1350: 63 36 34 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65  c64__) || define
1360: 64 28 5f 5f 61 6c 70 68 61 5f 5f 29 20 7c 7c 20  d(__alpha__) || 
1370: 64 65 66 69 6e 65 64 28 5f 5f 68 70 70 61 6f 6c  defined(__hppaol
1380: 64 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  d__) || defined(
1390: 5f 5f 70 6f 77 65 72 70 63 73 79 73 76 34 5f 5f  __powerpcsysv4__
13a0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 63  ) || defined(__c
13b0: 6f 6e 76 65 78 5f 5f 29 0a 23 69 66 64 65 66 20  onvex__).#ifdef 
13c0: 5f 5f 47 4e 55 43 5f 5f 0a 65 78 74 65 72 6e 20  __GNUC__.extern 
13d0: 69 6e 6c 69 6e 65 0a 23 69 66 20 64 65 66 69 6e  inline.#if defin
13e0: 65 64 28 5f 5f 73 70 61 72 63 5f 5f 29 20 7c 7c  ed(__sparc__) ||
13f0: 20 64 65 66 69 6e 65 64 28 5f 5f 73 70 61 72 63   defined(__sparc
1400: 36 34 5f 5f 29 0a 23 69 6e 63 6c 75 64 65 20 22  64__).#include "
1410: 63 61 63 68 65 2d 73 70 61 72 63 2e 63 22 0a 23  cache-sparc.c".#
1420: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 61  endif.#ifdef __a
1430: 6c 70 68 61 5f 5f 0a 23 69 6e 63 6c 75 64 65 20  lpha__.#include 
1440: 22 63 61 63 68 65 2d 61 6c 70 68 61 2e 63 22 0a  "cache-alpha.c".
1450: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f  #endif.#ifdef __
1460: 68 70 70 61 5f 5f 0a 23 69 6e 63 6c 75 64 65 20  hppa__.#include 
1470: 22 63 61 63 68 65 2d 68 70 70 61 2e 63 22 0a 23  "cache-hppa.c".#
1480: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
1490: 64 28 5f 5f 70 6f 77 65 72 70 63 5f 5f 29 20 26  d(__powerpc__) &
14a0: 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 70 6f 77  & !defined(__pow
14b0: 65 72 70 63 36 34 5f 5f 29 0a 23 69 6e 63 6c 75  erpc64__).#inclu
14c0: 64 65 20 22 63 61 63 68 65 2d 70 6f 77 65 72 70  de "cache-powerp
14d0: 63 2e 63 22 0a 23 65 6e 64 69 66 0a 23 69 66 64  c.c".#endif.#ifd
14e0: 65 66 20 5f 5f 63 6f 6e 76 65 78 5f 5f 0a 23 69  ef __convex__.#i
14f0: 6e 63 6c 75 64 65 20 22 63 61 63 68 65 2d 63 6f  nclude "cache-co
1500: 6e 76 65 78 2e 63 22 0a 23 65 6e 64 69 66 0a 23  nvex.c".#endif.#
1510: 65 6c 73 65 0a 23 69 66 20 64 65 66 69 6e 65 64  else.#if defined
1520: 28 5f 5f 73 70 61 72 63 5f 5f 29 20 7c 7c 20 64  (__sparc__) || d
1530: 65 66 69 6e 65 64 28 5f 5f 73 70 61 72 63 36 34  efined(__sparc64
1540: 5f 5f 29 0a 65 78 74 65 72 6e 20 76 6f 69 64 20  __).extern void 
1550: 5f 5f 54 52 5f 63 6c 65 61 72 5f 63 61 63 68 65  __TR_clear_cache
1560: 5f 34 28 29 3b 0a 23 65 6c 73 65 0a 65 78 74 65  _4();.#else.exte
1570: 72 6e 20 76 6f 69 64 20 5f 5f 54 52 5f 63 6c 65  rn void __TR_cle
1580: 61 72 5f 63 61 63 68 65 28 29 3b 0a 23 65 6e 64  ar_cache();.#end
1590: 69 66 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66  if.#endif.#endif
15a0: 0a 0a 2f 2a 20 4c 65 6e 67 74 68 20 61 6e 64 20  ../* Length and 
15b0: 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 74 72 61  alignment of tra
15c0: 6d 70 6f 6c 69 6e 65 20 2a 2f 0a 23 69 66 64 65  mpoline */.#ifde
15d0: 66 20 5f 5f 69 33 38 36 5f 5f 0a 23 64 65 66 69  f __i386__.#defi
15e0: 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20  ne TRAMP_LENGTH 
15f0: 31 36 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50  16.#define TRAMP
1600: 5f 41 4c 49 47 4e 20 31 36 20 20 2f 2a 20 34 20  _ALIGN 16  /* 4 
1610: 66 6f 72 20 61 20 69 33 38 36 2c 20 31 36 20 66  for a i386, 16 f
1620: 6f 72 20 61 20 69 34 38 36 20 2a 2f 0a 23 65 6e  or a i486 */.#en
1630: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d 36 38  dif.#ifdef __m68
1640: 6b 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52 41 4d  k__.#define TRAM
1650: 50 5f 4c 45 4e 47 54 48 20 31 34 0a 23 64 65 66  P_LENGTH 14.#def
1660: 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20  ine TRAMP_ALIGN 
1670: 31 36 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  16.#endif.#if de
1680: 66 69 6e 65 64 28 5f 5f 6d 69 70 73 5f 5f 29 20  fined(__mips__) 
1690: 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 6d 69 70  || defined(__mip
16a0: 73 6e 33 32 5f 5f 29 20 26 26 20 21 64 65 66 69  sn32__) && !defi
16b0: 6e 65 64 28 5f 5f 6d 69 70 73 36 34 5f 5f 29 0a  ned(__mips64__).
16c0: 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45  #define TRAMP_LE
16d0: 4e 47 54 48 20 32 34 0a 23 64 65 66 69 6e 65 20  NGTH 24.#define 
16e0: 54 52 41 4d 50 5f 41 4c 49 47 4e 20 34 0a 23 65  TRAMP_ALIGN 4.#e
16f0: 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d 69  ndif.#ifdef __mi
1700: 70 73 36 34 6f 6c 64 5f 5f 0a 23 64 65 66 69 6e  ps64old__.#defin
1710: 65 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 35  e TRAMP_LENGTH 5
1720: 36 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f  6.#define TRAMP_
1730: 41 4c 49 47 4e 20 34 0a 23 65 6e 64 69 66 0a 23  ALIGN 4.#endif.#
1740: 69 66 64 65 66 20 5f 5f 6d 69 70 73 36 34 5f 5f  ifdef __mips64__
1750: 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c  .#define TRAMP_L
1760: 45 4e 47 54 48 20 33 32 0a 23 64 65 66 69 6e 65  ENGTH 32.#define
1770: 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20 38 0a 23   TRAMP_ALIGN 8.#
1780: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
1790: 64 28 5f 5f 73 70 61 72 63 5f 5f 29 20 26 26 20  d(__sparc__) && 
17a0: 21 64 65 66 69 6e 65 64 28 5f 5f 73 70 61 72 63  !defined(__sparc
17b0: 36 34 5f 5f 29 0a 23 64 65 66 69 6e 65 20 54 52  64__).#define TR
17c0: 41 4d 50 5f 4c 45 4e 47 54 48 20 31 36 0a 23 64  AMP_LENGTH 16.#d
17d0: 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47  efine TRAMP_ALIG
17e0: 4e 20 31 36 0a 23 65 6e 64 69 66 0a 23 69 66 64  N 16.#endif.#ifd
17f0: 65 66 20 5f 5f 73 70 61 72 63 36 34 5f 5f 0a 23  ef __sparc64__.#
1800: 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e  define TRAMP_LEN
1810: 47 54 48 20 33 32 0a 23 64 65 66 69 6e 65 20 54  GTH 32.#define T
1820: 52 41 4d 50 5f 41 4c 49 47 4e 20 31 36 0a 23 65  RAMP_ALIGN 16.#e
1830: 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 61 6c  ndif.#ifdef __al
1840: 70 68 61 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52  pha__.#define TR
1850: 41 4d 50 5f 4c 45 4e 47 54 48 20 33 32 0a 23 64  AMP_LENGTH 32.#d
1860: 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47  efine TRAMP_ALIG
1870: 4e 20 38 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  N 8.#endif.#ifde
1880: 66 20 5f 5f 68 70 70 61 6f 6c 64 5f 5f 0a 23 64  f __hppaold__.#d
1890: 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47  efine TRAMP_LENG
18a0: 54 48 20 34 38 0a 23 64 65 66 69 6e 65 20 54 52  TH 48.#define TR
18b0: 41 4d 50 5f 41 4c 49 47 4e 20 31 36 0a 23 65 6e  AMP_ALIGN 16.#en
18c0: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 68 70 70  dif.#ifdef __hpp
18d0: 61 6e 65 77 5f 5f 0a 23 64 65 66 69 6e 65 20 54  anew__.#define T
18e0: 52 41 4d 50 5f 4c 45 4e 47 54 48 20 31 36 0a 23  RAMP_LENGTH 16.#
18f0: 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49  define TRAMP_ALI
1900: 47 4e 20 31 36 0a 23 64 65 66 69 6e 65 20 54 52  GN 16.#define TR
1910: 41 4d 50 5f 42 49 41 53 20 32 0a 23 65 6e 64 69  AMP_BIAS 2.#endi
1920: 66 0a 23 69 66 64 65 66 20 5f 5f 61 72 6d 5f 5f  f.#ifdef __arm__
1930: 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c  .#define TRAMP_L
1940: 45 4e 47 54 48 20 31 36 0a 23 64 65 66 69 6e 65  ENGTH 16.#define
1950: 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20 34 0a 23   TRAMP_ALIGN 4.#
1960: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 70  endif.#ifdef __p
1970: 6f 77 65 72 70 63 73 79 73 76 34 5f 5f 0a 23 64  owerpcsysv4__.#d
1980: 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47  efine TRAMP_LENG
1990: 54 48 20 32 34 0a 23 64 65 66 69 6e 65 20 54 52  TH 24.#define TR
19a0: 41 4d 50 5f 41 4c 49 47 4e 20 34 0a 23 65 6e 64  AMP_ALIGN 4.#end
19b0: 69 66 0a 23 69 66 64 65 66 20 5f 5f 70 6f 77 65  if.#ifdef __powe
19c0: 72 70 63 61 69 78 5f 5f 0a 23 64 65 66 69 6e 65  rpcaix__.#define
19d0: 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 32 30   TRAMP_LENGTH 20
19e0: 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 41  .#define TRAMP_A
19f0: 4c 49 47 4e 20 34 0a 23 65 6e 64 69 66 0a 23 69  LIGN 4.#endif.#i
1a00: 66 64 65 66 20 5f 5f 70 6f 77 65 72 70 63 36 34  fdef __powerpc64
1a10: 61 69 78 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52  aix__.#define TR
1a20: 41 4d 50 5f 4c 45 4e 47 54 48 20 34 30 0a 23 64  AMP_LENGTH 40.#d
1a30: 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47  efine TRAMP_ALIG
1a40: 4e 20 38 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  N 8.#endif.#ifde
1a50: 66 20 5f 5f 6d 38 38 6b 5f 5f 0a 23 64 65 66 69  f __m88k__.#defi
1a60: 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20  ne TRAMP_LENGTH 
1a70: 32 30 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50  20.#define TRAMP
1a80: 5f 41 4c 49 47 4e 20 38 0a 23 65 6e 64 69 66 0a  _ALIGN 8.#endif.
1a90: 23 69 66 64 65 66 20 5f 5f 63 6f 6e 76 65 78 5f  #ifdef __convex_
1aa0: 5f 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f  _.#define TRAMP_
1ab0: 4c 45 4e 47 54 48 20 31 34 0a 23 64 65 66 69 6e  LENGTH 14.#defin
1ac0: 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20 34 0a  e TRAMP_ALIGN 4.
1ad0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f  #endif.#ifdef __
1ae0: 69 61 36 34 5f 5f 0a 23 64 65 66 69 6e 65 20 54  ia64__.#define T
1af0: 52 41 4d 50 5f 4c 45 4e 47 54 48 20 33 32 0a 23  RAMP_LENGTH 32.#
1b00: 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49  define TRAMP_ALI
1b10: 47 4e 20 31 36 0a 23 65 6e 64 69 66 0a 23 69 66  GN 16.#endif.#if
1b20: 64 65 66 20 5f 5f 78 38 36 5f 36 34 5f 5f 0a 23  def __x86_64__.#
1b30: 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e  define TRAMP_LEN
1b40: 47 54 48 20 32 32 0a 23 64 65 66 69 6e 65 20 54  GTH 22.#define T
1b50: 52 41 4d 50 5f 41 4c 49 47 4e 20 31 36 0a 23 65  RAMP_ALIGN 16.#e
1b60: 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 73 33  ndif.#ifdef __s3
1b70: 39 30 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52 41  90__.#define TRA
1b80: 4d 50 5f 4c 45 4e 47 54 48 20 32 32 0a 23 64 65  MP_LENGTH 22.#de
1b90: 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e  fine TRAMP_ALIGN
1ba0: 20 32 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64   2.#endif..#ifnd
1bb0: 65 66 20 54 52 41 4d 50 5f 42 49 41 53 0a 23 64  ef TRAMP_BIAS.#d
1bc0: 65 66 69 6e 65 20 54 52 41 4d 50 5f 42 49 41 53  efine TRAMP_BIAS
1bd0: 20 30 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69   0.#endif..#defi
1be0: 6e 65 20 54 52 41 4d 50 5f 54 4f 54 41 4c 5f 4c  ne TRAMP_TOTAL_L
1bf0: 45 4e 47 54 48 20 28 54 52 41 4d 50 5f 4c 45 4e  ENGTH (TRAMP_LEN
1c00: 47 54 48 20 2b 20 32 2a 73 69 7a 65 6f 66 28 76  GTH + 2*sizeof(v
1c10: 6f 69 64 2a 29 29 0a 0a 23 69 66 20 21 64 65 66  oid*))..#if !def
1c20: 69 6e 65 64 28 43 4f 44 45 5f 45 58 45 43 55 54  ined(CODE_EXECUT
1c30: 41 42 4c 45 29 20 26 26 20 21 64 65 66 69 6e 65  ABLE) && !define
1c40: 64 28 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41  d(EXECUTABLE_VIA
1c50: 5f 4d 50 52 4f 54 45 43 54 29 0a 2f 2a 20 41 49  _MPROTECT)./* AI
1c60: 58 20 64 6f 65 73 6e 27 74 20 73 75 70 70 6f 72  X doesn't suppor
1c70: 74 20 6d 70 72 6f 74 65 63 74 28 29 20 69 6e 20  t mprotect() in 
1c80: 6d 61 6c 6c 6f 63 27 65 64 20 6d 65 6d 6f 72 79  malloc'ed memory
1c90: 2e 20 4d 75 73 74 20 67 65 74 20 70 61 67 65 73  . Must get pages
1ca0: 20 6f 66 0a 20 2a 20 6d 65 6d 6f 72 79 20 77 69   of. * memory wi
1cb0: 74 68 20 65 78 65 63 75 74 65 20 70 65 72 6d 69  th execute permi
1cc0: 73 73 69 6f 6e 20 76 69 61 20 6d 6d 61 70 28 29  ssion via mmap()
1cd0: 2e 20 54 68 65 6e 20 6b 65 65 70 20 61 20 66 72  . Then keep a fr
1ce0: 65 65 20 6c 69 73 74 20 6f 66 0a 20 2a 20 66 72  ee list of. * fr
1cf0: 65 65 20 74 72 61 6d 70 6f 6c 69 6e 65 73 2e 0a  ee trampolines..
1d00: 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 2a   */.static char*
1d10: 20 66 72 65 65 6c 69 73 74 20 3d 20 4e 55 4c 4c   freelist = NULL
1d20: 3b 0a 23 65 6e 64 69 66 0a 0a 5f 5f 54 52 5f 66  ;.#endif..__TR_f
1d30: 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 5f 74 72  unction alloc_tr
1d40: 61 6d 70 6f 6c 69 6e 65 5f 72 20 28 5f 5f 54 52  ampoline_r (__TR
1d50: 5f 66 75 6e 63 74 69 6f 6e 20 61 64 64 72 65 73  _function addres
1d60: 73 2c 20 76 6f 69 64 2a 20 64 61 74 61 30 2c 20  s, void* data0, 
1d70: 76 6f 69 64 2a 20 64 61 74 61 31 29 0a 7b 0a 20  void* data1).{. 
1d80: 20 63 68 61 72 2a 20 66 75 6e 63 74 69 6f 6e 3b   char* function;
1d90: 0a 20 20 63 68 61 72 2a 20 64 61 74 61 3b 0a 0a  .  char* data;..
1da0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 43 4f 44  #if !defined(COD
1db0: 45 5f 45 58 45 43 55 54 41 42 4c 45 29 0a 20 20  E_EXECUTABLE).  
1dc0: 73 74 61 74 69 63 20 6c 6f 6e 67 20 70 61 67 65  static long page
1dd0: 73 69 7a 65 20 3d 20 30 3b 0a 23 69 66 20 64 65  size = 0;.#if de
1de0: 66 69 6e 65 64 28 45 58 45 43 55 54 41 42 4c 45  fined(EXECUTABLE
1df0: 5f 56 49 41 5f 4d 4d 41 50 5f 44 45 56 5a 45 52  _VIA_MMAP_DEVZER
1e00: 4f 29 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  O).  static int 
1e10: 7a 65 72 6f 5f 66 64 3b 0a 23 65 6e 64 69 66 0a  zero_fd;.#endif.
1e20: 20 20 2f 2a 20 46 69 72 73 74 2c 20 67 65 74 20    /* First, get 
1e30: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 6f 6e  the page size on
1e40: 63 65 20 61 6e 64 20 66 6f 72 20 61 6c 6c 2e 20  ce and for all. 
1e50: 2a 2f 0a 20 20 69 66 20 28 21 70 61 67 65 73 69  */.  if (!pagesi
1e60: 7a 65 29 0a 20 20 20 20 7b 0a 23 69 66 20 64 65  ze).    {.#if de
1e70: 66 69 6e 65 64 28 48 41 56 45 5f 4d 41 43 48 5f  fined(HAVE_MACH_
1e80: 56 4d 29 0a 20 20 20 20 20 20 70 61 67 65 73 69  VM).      pagesi
1e90: 7a 65 20 3d 20 76 6d 5f 70 61 67 65 5f 73 69 7a  ze = vm_page_siz
1ea0: 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 70  e;.#else.      p
1eb0: 61 67 65 73 69 7a 65 20 3d 20 67 65 74 70 61 67  agesize = getpag
1ec0: 65 73 69 7a 65 28 29 3b 0a 23 65 6e 64 69 66 0a  esize();.#endif.
1ed0: 23 69 66 20 64 65 66 69 6e 65 64 28 45 58 45 43  #if defined(EXEC
1ee0: 55 54 41 42 4c 45 5f 56 49 41 5f 4d 4d 41 50 5f  UTABLE_VIA_MMAP_
1ef0: 44 45 56 5a 45 52 4f 29 0a 20 20 20 20 20 20 7a  DEVZERO).      z
1f00: 65 72 6f 5f 66 64 20 3d 20 6f 70 65 6e 28 22 2f  ero_fd = open("/
1f10: 64 65 76 2f 7a 65 72 6f 22 2c 4f 5f 52 44 4f 4e  dev/zero",O_RDON
1f20: 4c 59 2c 30 36 34 34 29 3b 0a 20 20 20 20 20 20  LY,0644);.      
1f30: 69 66 20 28 7a 65 72 6f 5f 66 64 20 3c 20 30 29  if (zero_fd < 0)
1f40: 0a 20 20 20 20 20 20 20 20 7b 20 66 70 72 69 6e  .        { fprin
1f50: 74 66 28 73 74 64 65 72 72 2c 22 74 72 61 6d 70  tf(stderr,"tramp
1f60: 6f 6c 69 6e 65 3a 20 43 61 6e 6e 6f 74 20 6f 70  oline: Cannot op
1f70: 65 6e 20 2f 64 65 76 2f 7a 65 72 6f 21 5c 6e 22  en /dev/zero!\n"
1f80: 29 3b 20 61 62 6f 72 74 28 29 3b 20 7d 0a 23 65  ); abort(); }.#e
1f90: 6e 64 69 66 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ndif.    }.#endi
1fa0: 66 0a 0a 20 20 2f 2a 20 31 2e 20 41 6c 6c 6f 63  f..  /* 1. Alloc
1fb0: 61 74 65 20 72 6f 6f 6d 20 2a 2f 0a 0a 23 69 66  ate room */..#if
1fc0: 20 21 64 65 66 69 6e 65 64 28 43 4f 44 45 5f 45   !defined(CODE_E
1fd0: 58 45 43 55 54 41 42 4c 45 29 20 26 26 20 21 64  XECUTABLE) && !d
1fe0: 65 66 69 6e 65 64 28 45 58 45 43 55 54 41 42 4c  efined(EXECUTABL
1ff0: 45 5f 56 49 41 5f 4d 50 52 4f 54 45 43 54 29 0a  E_VIA_MPROTECT).
2000: 20 20 2f 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20    /* Note: This 
2010: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
2020: 6e 20 69 73 20 6e 6f 74 20 6d 75 6c 74 69 74 68  n is not multith
2030: 72 65 61 64 2d 73 61 66 65 2e 20 57 65 20 6d 69  read-safe. We mi
2040: 67 68 74 20 6e 65 65 64 0a 20 20 20 2a 20 74 6f  ght need.   * to
2050: 20 61 64 64 20 73 70 65 63 69 61 6c 20 28 70 6c   add special (pl
2060: 61 74 66 6f 72 6d 20 64 65 70 65 6e 64 65 6e 74  atform dependent
2070: 29 20 63 6f 64 65 20 66 6f 72 20 6c 6f 63 6b 69  ) code for locki
2080: 6e 67 2e 0a 20 20 20 2a 20 46 6f 72 74 75 6e 61  ng..   * Fortuna
2090: 74 65 6c 79 2c 20 6d 6f 73 74 20 6d 6f 64 65 72  tely, most moder
20a0: 6e 20 73 79 73 74 65 6d 73 20 77 68 65 72 65 20  n systems where 
20b0: 6d 75 6c 74 69 74 68 72 65 61 64 2d 73 61 66 65  multithread-safe
20c0: 74 79 20 6d 61 74 74 65 72 73 0a 20 20 20 2a 20  ty matters.   * 
20d0: 68 61 76 65 20 45 58 45 43 55 54 41 42 4c 45 5f  have EXECUTABLE_
20e0: 56 49 41 5f 4d 50 52 4f 54 45 43 54 2c 20 61 6e  VIA_MPROTECT, an
20f0: 64 20 74 68 6f 73 65 20 77 68 69 63 68 20 64 6f  d those which do
2100: 6e 27 74 20 28 41 49 58 20 6f 6e 20 70 6f 77 65  n't (AIX on powe
2110: 72 70 63 20 61 6e 64 0a 20 20 20 2a 20 48 50 2d  rpc and.   * HP-
2120: 55 58 20 6f 6e 20 68 70 70 61 29 20 68 61 76 65  UX on hppa) have
2130: 20 43 4f 44 45 5f 45 58 45 43 55 54 41 42 4c 45   CODE_EXECUTABLE
2140: 2e 20 54 68 75 73 20 6e 6f 20 6c 6f 63 6b 69 6e  . Thus no lockin
2150: 67 20 63 6f 64 65 20 69 73 20 6e 65 65 64 65 64  g code is needed
2160: 0a 20 20 20 2a 20 66 6f 72 20 74 68 65 20 6d 6f  .   * for the mo
2170: 6d 65 6e 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66  ment..   */.  if
2180: 20 28 66 72 65 65 6c 69 73 74 20 3d 3d 20 4e 55   (freelist == NU
2190: 4c 4c 29 0a 20 20 20 20 7b 20 2f 2a 20 47 65 74  LL).    { /* Get
21a0: 20 61 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a   a new page. */.
21b0: 20 20 20 20 20 20 63 68 61 72 2a 20 70 61 67 65        char* page
21c0: 3b 0a 23 69 66 64 65 66 20 45 58 45 43 55 54 41  ;.#ifdef EXECUTA
21d0: 42 4c 45 5f 56 49 41 5f 4d 4d 41 50 5f 41 4e 4f  BLE_VIA_MMAP_ANO
21e0: 4e 59 4d 4f 55 53 0a 20 20 20 20 20 20 70 61 67  NYMOUS.      pag
21f0: 65 20 3d 20 6d 6d 61 70 28 30 2c 20 70 61 67 65  e = mmap(0, page
2200: 73 69 7a 65 2c 20 50 52 4f 54 5f 52 45 41 44 20  size, PROT_READ 
2210: 7c 20 50 52 4f 54 5f 57 52 49 54 45 20 7c 20 50  | PROT_WRITE | P
2220: 52 4f 54 5f 45 58 45 43 2c 20 4d 41 50 5f 41 4e  ROT_EXEC, MAP_AN
2230: 4f 4e 59 4d 4f 55 53 20 7c 20 4d 41 50 5f 56 41  ONYMOUS | MAP_VA
2240: 52 49 41 42 4c 45 2c 20 2d 31 2c 20 30 29 3b 0a  RIABLE, -1, 0);.
2250: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 45 58  #endif.#ifdef EX
2260: 45 43 55 54 41 42 4c 45 5f 56 49 41 5f 4d 4d 41  ECUTABLE_VIA_MMA
2270: 50 5f 44 45 56 5a 45 52 4f 0a 20 20 20 20 20 20  P_DEVZERO.      
2280: 70 61 67 65 20 3d 20 6d 6d 61 70 28 30 2c 20 70  page = mmap(0, p
2290: 61 67 65 73 69 7a 65 2c 20 50 52 4f 54 5f 52 45  agesize, PROT_RE
22a0: 41 44 20 7c 20 50 52 4f 54 5f 57 52 49 54 45 20  AD | PROT_WRITE 
22b0: 7c 20 50 52 4f 54 5f 45 58 45 43 2c 20 4d 41 50  | PROT_EXEC, MAP
22c0: 5f 50 52 49 56 41 54 45 2c 20 7a 65 72 6f 5f 66  _PRIVATE, zero_f
22d0: 64 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 23 69  d, 0);.#endif.#i
22e0: 66 64 65 66 20 45 58 45 43 55 54 41 42 4c 45 5f  fdef EXECUTABLE_
22f0: 56 49 41 5f 53 48 4d 0a 20 20 20 20 20 20 69 6e  VIA_SHM.      in
2300: 74 20 73 68 6d 69 64 20 3d 20 73 68 6d 67 65 74  t shmid = shmget
2310: 28 49 50 43 5f 50 52 49 56 41 54 45 2c 20 70 61  (IPC_PRIVATE, pa
2320: 67 65 73 69 7a 65 2c 20 30 37 30 30 7c 49 50 43  gesize, 0700|IPC
2330: 5f 43 52 45 41 54 29 3b 0a 20 20 20 20 20 20 69  _CREAT);.      i
2340: 66 20 28 73 68 6d 69 64 3c 30 29 0a 20 20 20 20  f (shmid<0).    
2350: 20 20 20 20 7b 20 70 61 67 65 20 3d 20 28 63 68      { page = (ch
2360: 61 72 2a 29 28 2d 31 29 3b 20 7d 0a 20 20 20 20  ar*)(-1); }.    
2370: 20 20 65 6c 73 65 0a 20 20 20 20 20 20 20 20 7b    else.        {
2380: 20 70 61 67 65 20 3d 20 73 68 6d 61 74 28 73 68   page = shmat(sh
2390: 6d 69 64 2c 20 30 2c 20 30 29 3b 20 73 68 6d 63  mid, 0, 0); shmc
23a0: 74 6c 28 73 68 6d 69 64 2c 20 49 50 43 5f 52 4d  tl(shmid, IPC_RM
23b0: 49 44 2c 20 30 29 3b 20 7d 0a 23 65 6e 64 69 66  ID, 0); }.#endif
23c0: 0a 20 20 20 20 20 20 69 66 20 28 70 61 67 65 20  .      if (page 
23d0: 3d 3d 20 28 63 68 61 72 2a 29 28 2d 31 29 29 0a  == (char*)(-1)).
23e0: 20 20 20 20 20 20 20 20 7b 20 66 70 72 69 6e 74          { fprint
23f0: 66 28 73 74 64 65 72 72 2c 22 74 72 61 6d 70 6f  f(stderr,"trampo
2400: 6c 69 6e 65 3a 20 4f 75 74 20 6f 66 20 76 69 72  line: Out of vir
2410: 74 75 61 6c 20 6d 65 6d 6f 72 79 21 5c 6e 22 29  tual memory!\n")
2420: 3b 20 61 62 6f 72 74 28 29 3b 20 7d 0a 20 20 20  ; abort(); }.   
2430: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 74 20 77 69     /* Fill it wi
2440: 74 68 20 66 72 65 65 20 74 72 61 6d 70 6f 6c 69  th free trampoli
2450: 6e 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 7b 20  nes. */.      { 
2460: 63 68 61 72 2a 2a 20 6c 61 73 74 20 3d 20 26 66  char** last = &f
2470: 72 65 65 6c 69 73 74 3b 0a 20 20 20 20 20 20 20  reelist;.       
2480: 20 63 68 61 72 2a 20 70 61 67 65 5f 65 6e 64 20   char* page_end 
2490: 3d 20 70 61 67 65 20 2b 20 70 61 67 65 73 69 7a  = page + pagesiz
24a0: 65 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  e;.        while
24b0: 20 28 70 61 67 65 2b 54 52 41 4d 50 5f 54 4f 54   (page+TRAMP_TOT
24c0: 41 4c 5f 4c 45 4e 47 54 48 20 3c 3d 20 70 61 67  AL_LENGTH <= pag
24d0: 65 5f 65 6e 64 29 0a 20 20 20 20 20 20 20 20 20  e_end).         
24e0: 20 7b 20 2a 6c 61 73 74 20 3d 20 70 61 67 65 3b   { *last = page;
24f0: 20 6c 61 73 74 20 3d 20 28 63 68 61 72 2a 2a 29   last = (char**)
2500: 70 61 67 65 3b 20 70 61 67 65 20 2b 3d 20 54 52  page; page += TR
2510: 41 4d 50 5f 54 4f 54 41 4c 5f 4c 45 4e 47 54 48  AMP_TOTAL_LENGTH
2520: 3b 20 7d 0a 20 20 20 20 20 20 20 20 2a 6c 61 73  ; }.        *las
2530: 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 20  t = NULL;.    } 
2540: 7d 0a 20 20 66 75 6e 63 74 69 6f 6e 20 3d 20 66  }.  function = f
2550: 72 65 65 6c 69 73 74 3b 20 66 72 65 65 6c 69 73  reelist; freelis
2560: 74 20 3d 20 2a 28 63 68 61 72 2a 2a 29 66 72 65  t = *(char**)fre
2570: 65 6c 69 73 74 3b 0a 23 65 6c 73 65 0a 20 20 7b  elist;.#else.  {
2580: 20 63 68 61 72 2a 20 72 6f 6f 6d 20 3d 20 28 63   char* room = (c
2590: 68 61 72 2a 29 20 6d 61 6c 6c 6f 63 28 73 69 7a  har*) malloc(siz
25a0: 65 6f 66 28 76 6f 69 64 2a 29 20 2b 20 54 52 41  eof(void*) + TRA
25b0: 4d 50 5f 54 4f 54 41 4c 5f 4c 45 4e 47 54 48 20  MP_TOTAL_LENGTH 
25c0: 2b 20 54 52 41 4d 50 5f 41 4c 49 47 4e 2d 31 29  + TRAMP_ALIGN-1)
25d0: 3b 0a 20 20 20 20 69 66 20 28 21 72 6f 6f 6d 29  ;.    if (!room)
25e0: 0a 20 20 20 20 20 20 7b 20 66 70 72 69 6e 74 66  .      { fprintf
25f0: 28 73 74 64 65 72 72 2c 22 74 72 61 6d 70 6f 6c  (stderr,"trampol
2600: 69 6e 65 3a 20 4f 75 74 20 6f 66 20 76 69 72 74  ine: Out of virt
2610: 75 61 6c 20 6d 65 6d 6f 72 79 21 5c 6e 22 29 3b  ual memory!\n");
2620: 20 61 62 6f 72 74 28 29 3b 20 7d 0a 20 20 20 20   abort(); }.    
2630: 66 75 6e 63 74 69 6f 6e 20 3d 20 28 63 68 61 72  function = (char
2640: 2a 29 28 28 28 6c 6f 6e 67 29 72 6f 6f 6d 20 2b  *)(((long)room +
2650: 20 73 69 7a 65 6f 66 28 76 6f 69 64 2a 29 20 2b   sizeof(void*) +
2660: 20 54 52 41 4d 50 5f 41 4c 49 47 4e 2d 31 29 20   TRAMP_ALIGN-1) 
2670: 26 20 2d 54 52 41 4d 50 5f 41 4c 49 47 4e 29 3b  & -TRAMP_ALIGN);
2680: 0a 20 20 20 20 28 28 63 68 61 72 2a 2a 29 66 75  .    ((char**)fu
2690: 6e 63 74 69 6f 6e 29 5b 2d 31 5d 20 3d 20 72 6f  nction)[-1] = ro
26a0: 6f 6d 3b 20 2f 2a 20 62 61 63 6b 70 6f 69 6e 74  om; /* backpoint
26b0: 65 72 20 66 6f 72 20 66 72 65 65 5f 74 72 61 6d  er for free_tram
26c0: 70 6f 6c 69 6e 65 28 29 20 2a 2f 0a 20 20 7d 0a  poline() */.  }.
26d0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 32 2e 20  #endif..  /* 2. 
26e0: 46 69 6c 6c 20 6f 75 74 20 74 68 65 20 74 72 61  Fill out the tra
26f0: 6d 70 6f 6c 69 6e 65 20 2a 2f 0a 20 20 64 61 74  mpoline */.  dat
2700: 61 20 3d 20 66 75 6e 63 74 69 6f 6e 20 2b 20 54  a = function + T
2710: 52 41 4d 50 5f 4c 45 4e 47 54 48 3b 0a 20 20 2f  RAMP_LENGTH;.  /
2720: 2a 20 4b 6e 6f 77 69 6e 67 20 74 68 61 74 20 64  * Knowing that d
2730: 61 74 61 20 3d 20 66 75 6e 63 74 69 6f 6e 20 2b  ata = function +
2740: 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 2c 20 77   TRAMP_LENGTH, w
2750: 65 20 63 6f 75 6c 64 20 63 65 72 74 61 69 6e 6c  e could certainl
2760: 79 20 6f 70 74 69 6d 69 7a 65 0a 20 20 20 2a 20  y optimize.   * 
2770: 74 68 65 20 74 72 61 6d 70 6f 6c 69 6e 65 73 20  the trampolines 
2780: 61 20 6c 69 74 74 6c 65 20 62 69 74 20 6d 6f 72  a little bit mor
2790: 65 2c 20 75 73 69 6e 67 20 50 43 20 72 65 6c 61  e, using PC rela
27a0: 74 69 76 65 20 61 64 64 72 65 73 73 69 6e 67 20  tive addressing 
27b0: 6d 6f 64 65 73 2e 0a 20 20 20 2a 20 42 75 74 20  modes..   * But 
27c0: 49 20 64 6f 75 62 74 20 69 74 27 73 20 72 65 61  I doubt it's rea
27d0: 6c 6c 79 20 77 6f 72 74 68 20 69 74 2e 0a 20 20  lly worth it..  
27e0: 20 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 69 33 38   */.#ifdef __i38
27f0: 36 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f  6__.  /* functio
2800: 6e 3a 0a 20 20 20 2a 20 20 20 20 70 6f 70 6c 20  n:.   *    popl 
2810: 25 65 63 78 09 09 09 35 39 0a 20 20 20 2a 20 20  %ecx...59.   *  
2820: 20 20 70 75 73 68 6c 20 24 3c 64 61 74 61 3e 09    pushl $<data>.
2830: 09 09 36 38 20 3c 64 61 74 61 3e 0a 20 20 20 2a  ..68 <data>.   *
2840: 20 20 20 20 70 75 73 68 6c 20 25 65 63 78 09 09      pushl %ecx..
2850: 09 35 31 0a 20 20 20 2a 20 20 20 20 6a 6d 70 20  .51.   *    jmp 
2860: 3c 61 64 64 72 65 73 73 3e 09 09 09 45 39 20 3c  <address>...E9 <
2870: 61 64 64 72 65 73 73 3e 2d 3c 68 65 72 65 3e 0a  address>-<here>.
2880: 20 20 20 2a 20 68 65 72 65 3a 0a 20 20 20 2a 20     * here:.   * 
2890: 20 20 20 6e 6f 70 09 09 09 09 39 30 0a 20 20 20     nop....90.   
28a0: 2a 20 20 20 20 6e 6f 70 09 09 09 09 39 30 0a 20  *    nop....90. 
28b0: 20 20 2a 20 20 20 20 6e 6f 70 09 09 09 09 39 30    *    nop....90
28c0: 0a 20 20 20 2a 20 20 20 20 6e 6f 70 09 09 09 09  .   *    nop....
28d0: 39 30 0a 20 20 20 2a 2f 0a 20 20 2a 28 73 68 6f  90.   */.  *(sho
28e0: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
28f0: 2b 20 30 29 20 3d 20 30 78 36 38 35 39 3b 0a 20  + 0) = 0x6859;. 
2900: 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e   *(long *)  (fun
2910: 63 74 69 6f 6e 20 2b 20 32 29 20 3d 20 28 6c 6f  ction + 2) = (lo
2920: 6e 67 29 20 64 61 74 61 3b 0a 20 20 2a 28 73 68  ng) data;.  *(sh
2930: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ort *) (function
2940: 20 2b 20 36 29 20 3d 20 30 78 45 39 35 31 3b 0a   + 6) = 0xE951;.
2950: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75    *(long *)  (fu
2960: 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 28 6c  nction + 8) = (l
2970: 6f 6e 67 29 20 61 64 64 72 65 73 73 20 2d 20 28  ong) address - (
2980: 6c 6f 6e 67 29 20 28 66 75 6e 63 74 69 6f 6e 20  long) (function 
2990: 2b 20 31 32 29 3b 0a 20 20 2a 28 6c 6f 6e 67 20  + 12);.  *(long 
29a0: 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31  *)  (function +1
29b0: 32 29 20 3d 20 30 78 39 30 39 30 39 30 39 30 3b  2) = 0x90909090;
29c0: 20 20 20 2f 2a 20 6e 6f 70 20 6e 6f 70 20 6e 6f     /* nop nop no
29d0: 70 20 6e 6f 70 2c 20 66 6f 72 20 61 6c 69 67 6e  p nop, for align
29e0: 6d 65 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ment */.#define 
29f0: 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 6f  is_tramp(functio
2a00: 6e 29 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e  n)  \.  *(unsign
2a10: 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e  ed short *) (fun
2a20: 63 74 69 6f 6e 20 2b 20 30 29 20 3d 3d 20 30 78  ction + 0) == 0x
2a30: 36 38 35 39 20 26 26 20 5c 0a 20 20 2a 28 75 6e  6859 && \.  *(un
2a40: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20  signed short *) 
2a50: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 36 29 20 3d  (function + 6) =
2a60: 3d 20 30 78 45 39 35 31 0a 23 64 65 66 69 6e 65  = 0xE951.#define
2a70: 20 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66   tramp_address(f
2a80: 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28  unction)  \.  *(
2a90: 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69  long *)  (functi
2aa0: 6f 6e 20 2b 20 38 29 20 2b 20 28 6c 6f 6e 67 29  on + 8) + (long)
2ab0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 31 32 29   (function + 12)
2ac0: 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 64  .#define tramp_d
2ad0: 61 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c  ata(function)  \
2ae0: 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66  .  *(long *)  (f
2af0: 75 6e 63 74 69 6f 6e 20 2b 20 32 29 0a 23 65 6e  unction + 2).#en
2b00: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d 36 38  dif.#ifdef __m68
2b10: 6b 5f 5f 0a 23 69 66 64 65 66 20 5f 5f 4e 65 74  k__.#ifdef __Net
2b20: 42 53 44 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74  BSD__.  /* funct
2b30: 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 6d 6f 76  ion:.   *    mov
2b40: 65 6c 20 23 3c 64 61 74 61 3e 2c 61 31 09 09 32  el #<data>,a1..2
2b50: 32 20 37 43 20 3c 64 61 74 61 3e 0a 20 20 20 2a  2 7C <data>.   *
2b60: 20 20 20 20 6a 6d 70 20 3c 61 64 64 72 65 73 73      jmp <address
2b70: 3e 09 09 09 34 45 20 46 39 20 3c 61 64 64 72 65  >...4E F9 <addre
2b80: 73 73 3e 0a 20 20 20 2a 20 20 20 20 6e 6f 70 09  ss>.   *    nop.
2b90: 09 09 09 34 45 20 37 31 0a 20 20 20 2a 2f 0a 20  ...4E 71.   */. 
2ba0: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e   *(short *) (fun
2bb0: 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20 30 78 32  ction + 0) = 0x2
2bc0: 32 37 43 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29  27C;.  *(long *)
2bd0: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 32 29    (function + 2)
2be0: 20 3d 20 28 6c 6f 6e 67 29 20 64 61 74 61 3b 0a   = (long) data;.
2bf0: 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75    *(short *) (fu
2c00: 6e 63 74 69 6f 6e 20 2b 20 36 29 20 3d 20 30 78  nction + 6) = 0x
2c10: 34 45 46 39 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a  4EF9;.  *(long *
2c20: 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38  )  (function + 8
2c30: 29 20 3d 20 28 6c 6f 6e 67 29 20 61 64 64 72 65  ) = (long) addre
2c40: 73 73 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29  ss;.  *(short *)
2c50: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20   (function +12) 
2c60: 3d 20 30 78 34 45 37 31 3b 0a 23 64 65 66 69 6e  = 0x4E71;.#defin
2c70: 65 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74  e is_tramp(funct
2c80: 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e 73 69  ion)  \.  *(unsi
2c90: 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66  gned short *) (f
2ca0: 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 3d 20  unction + 0) == 
2cb0: 30 78 32 32 37 43 20 26 26 20 5c 0a 20 20 2a 28  0x227C && \.  *(
2cc0: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a  unsigned short *
2cd0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 36 29  ) (function + 6)
2ce0: 20 3d 3d 20 30 78 34 45 46 39 20 26 26 20 5c 0a   == 0x4EF9 && \.
2cf0: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f    *(unsigned sho
2d00: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
2d10: 2b 31 32 29 20 3d 3d 20 30 78 34 45 37 31 0a 23  +12) == 0x4E71.#
2d20: 65 6c 73 65 0a 20 20 2f 2a 20 66 75 6e 63 74 69  else.  /* functi
2d30: 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 6d 6f 76 65  on:.   *    move
2d40: 6c 20 23 3c 64 61 74 61 3e 2c 61 30 09 09 32 30  l #<data>,a0..20
2d50: 20 37 43 20 3c 64 61 74 61 3e 0a 20 20 20 2a 20   7C <data>.   * 
2d60: 20 20 20 6a 6d 70 20 3c 61 64 64 72 65 73 73 3e     jmp <address>
2d70: 09 09 09 34 45 20 46 39 20 3c 61 64 64 72 65 73  ...4E F9 <addres
2d80: 73 3e 0a 20 20 20 2a 20 20 20 20 6e 6f 70 09 09  s>.   *    nop..
2d90: 09 09 34 45 20 37 31 0a 20 20 20 2a 2f 0a 20 20  ..4E 71.   */.  
2da0: 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63  *(short *) (func
2db0: 74 69 6f 6e 20 2b 20 30 29 20 3d 20 30 78 32 30  tion + 0) = 0x20
2dc0: 37 43 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20  7C;.  *(long *) 
2dd0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 32 29 20   (function + 2) 
2de0: 3d 20 28 6c 6f 6e 67 29 20 64 61 74 61 3b 0a 20  = (long) data;. 
2df0: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e   *(short *) (fun
2e00: 63 74 69 6f 6e 20 2b 20 36 29 20 3d 20 30 78 34  ction + 6) = 0x4
2e10: 45 46 39 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29  EF9;.  *(long *)
2e20: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29    (function + 8)
2e30: 20 3d 20 28 6c 6f 6e 67 29 20 61 64 64 72 65 73   = (long) addres
2e40: 73 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20  s;.  *(short *) 
2e50: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d  (function +12) =
2e60: 20 30 78 34 45 37 31 3b 0a 23 64 65 66 69 6e 65   0x4E71;.#define
2e70: 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69   is_tramp(functi
2e80: 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67  on)  \.  *(unsig
2e90: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75  ned short *) (fu
2ea0: 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 3d 20 30  nction + 0) == 0
2eb0: 78 32 30 37 43 20 26 26 20 5c 0a 20 20 2a 28 75  x207C && \.  *(u
2ec0: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29  nsigned short *)
2ed0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 36 29 20   (function + 6) 
2ee0: 3d 3d 20 30 78 34 45 46 39 20 26 26 20 5c 0a 20  == 0x4EF9 && \. 
2ef0: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72   *(unsigned shor
2f00: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
2f10: 31 32 29 20 3d 3d 20 30 78 34 45 37 31 0a 23 65  12) == 0x4E71.#e
2f20: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 74 72 61  ndif.#define tra
2f30: 6d 70 5f 61 64 64 72 65 73 73 28 66 75 6e 63 74  mp_address(funct
2f40: 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 6c 6f 6e 67  ion)  \.  *(long
2f50: 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b   *)  (function +
2f60: 20 38 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d   8).#define tram
2f70: 70 5f 64 61 74 61 28 66 75 6e 63 74 69 6f 6e 29  p_data(function)
2f80: 20 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20    \.  *(long *) 
2f90: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 32 29 0a   (function + 2).
2fa0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
2fb0: 65 64 28 5f 5f 6d 69 70 73 5f 5f 29 20 7c 7c 20  ed(__mips__) || 
2fc0: 64 65 66 69 6e 65 64 28 5f 5f 6d 69 70 73 6e 33  defined(__mipsn3
2fd0: 32 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65 64  2__) && !defined
2fe0: 28 5f 5f 6d 69 70 73 36 34 5f 5f 29 0a 20 20 2f  (__mips64__).  /
2ff0: 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a  * function:.   *
3000: 20 20 20 20 6c 77 20 24 32 2c 31 36 28 24 32 35      lw $2,16($25
3010: 29 09 09 09 38 46 20 32 32 20 30 30 20 31 30 0a  )...8F 22 00 10.
3020: 20 20 20 2a 20 20 20 20 6c 77 20 24 32 35 2c 32     *    lw $25,2
3030: 30 28 24 32 35 29 09 09 09 38 46 20 33 39 20 30  0($25)...8F 39 0
3040: 30 20 31 34 0a 20 20 20 2a 20 20 20 20 6a 20 24  0 14.   *    j $
3050: 32 35 09 09 09 09 30 33 20 32 30 20 30 30 20 30  25....03 20 00 0
3060: 38 0a 20 20 20 2a 20 20 20 20 6e 6f 70 09 09 09  8.   *    nop...
3070: 09 30 30 20 30 30 20 30 30 20 30 30 0a 20 20 20  .00 00 00 00.   
3080: 2a 20 20 20 20 2e 77 6f 72 64 20 3c 64 61 74 61  *    .word <data
3090: 3e 09 09 09 3c 64 61 74 61 3e 0a 20 20 20 2a 20  >...<data>.   * 
30a0: 20 20 20 2e 77 6f 72 64 20 3c 61 64 64 72 65 73     .word <addres
30b0: 73 3e 09 09 09 3c 61 64 64 72 65 73 73 3e 0a 20  s>...<address>. 
30c0: 20 20 2a 2f 0a 20 20 2a 28 75 6e 73 69 67 6e 65    */.  *(unsigne
30d0: 64 20 69 6e 74 20 2a 29 20 28 66 75 6e 63 74 69  d int *) (functi
30e0: 6f 6e 20 2b 20 30 29 20 3d 20 30 78 38 46 32 32  on + 0) = 0x8F22
30f0: 30 30 31 30 3b 0a 20 20 2a 28 75 6e 73 69 67 6e  0010;.  *(unsign
3100: 65 64 20 69 6e 74 20 2a 29 20 28 66 75 6e 63 74  ed int *) (funct
3110: 69 6f 6e 20 2b 20 34 29 20 3d 20 30 78 38 46 33  ion + 4) = 0x8F3
3120: 39 30 30 31 34 3b 0a 20 20 2a 28 75 6e 73 69 67  90014;.  *(unsig
3130: 6e 65 64 20 69 6e 74 20 2a 29 20 28 66 75 6e 63  ned int *) (func
3140: 74 69 6f 6e 20 2b 20 38 29 20 3d 20 30 78 30 33  tion + 8) = 0x03
3150: 32 30 30 30 30 38 3b 0a 20 20 2a 28 75 6e 73 69  200008;.  *(unsi
3160: 67 6e 65 64 20 69 6e 74 20 2a 29 20 28 66 75 6e  gned int *) (fun
3170: 63 74 69 6f 6e 20 2b 31 32 29 20 3d 20 30 78 30  ction +12) = 0x0
3180: 30 30 30 30 30 30 30 3b 0a 20 20 2a 28 75 6e 73  0000000;.  *(uns
3190: 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 28 66 75  igned int *) (fu
31a0: 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20 28 75  nction +16) = (u
31b0: 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 64 61 74  nsigned int) dat
31c0: 61 3b 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20  a;.  *(unsigned 
31d0: 69 6e 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  int *) (function
31e0: 20 2b 32 30 29 20 3d 20 28 75 6e 73 69 67 6e 65   +20) = (unsigne
31f0: 64 20 69 6e 74 29 20 61 64 64 72 65 73 73 3b 0a  d int) address;.
3200: 23 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70  #define is_tramp
3210: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20  (function)  \.  
3220: 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a  *(unsigned int *
3230: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29  ) (function + 0)
3240: 20 3d 3d 20 30 78 38 46 32 32 30 30 31 30 20 26   == 0x8F220010 &
3250: 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64  & \.  *(unsigned
3260: 20 69 6e 74 20 2a 29 20 28 66 75 6e 63 74 69 6f   int *) (functio
3270: 6e 20 2b 20 34 29 20 3d 3d 20 30 78 38 46 33 39  n + 4) == 0x8F39
3280: 30 30 31 34 20 26 26 20 5c 0a 20 20 2a 28 75 6e  0014 && \.  *(un
3290: 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 28 66  signed int *) (f
32a0: 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 3d 20  unction + 8) == 
32b0: 30 78 30 33 32 30 30 30 30 38 20 26 26 20 5c 0a  0x03200008 && \.
32c0: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74    *(unsigned int
32d0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31   *) (function +1
32e0: 32 29 20 3d 3d 20 30 78 30 30 30 30 30 30 30 30  2) == 0x00000000
32f0: 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 61  .#define tramp_a
3300: 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e 29  ddress(function)
3310: 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64    \.  *(unsigned
3320: 20 69 6e 74 20 2a 29 20 28 66 75 6e 63 74 69 6f   int *) (functio
3330: 6e 20 2b 32 30 29 0a 23 64 65 66 69 6e 65 20 74  n +20).#define t
3340: 72 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 74 69  ramp_data(functi
3350: 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67  on)  \.  *(unsig
3360: 6e 65 64 20 69 6e 74 20 2a 29 20 28 66 75 6e 63  ned int *) (func
3370: 74 69 6f 6e 20 2b 31 36 29 0a 23 65 6e 64 69 66  tion +16).#endif
3380: 0a 23 69 66 64 65 66 20 5f 5f 6d 69 70 73 36 34  .#ifdef __mips64
3390: 6f 6c 64 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74  old__.  /* funct
33a0: 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 64 6c 69  ion:.   *    dli
33b0: 20 24 32 2c 3c 64 61 74 61 3e 09 09 09 33 43 20   $2,<data>...3C 
33c0: 30 32 20 68 69 31 36 28 68 69 33 32 28 3c 64 61  02 hi16(hi32(<da
33d0: 74 61 3e 29 29 0a 20 20 20 2a 09 09 09 09 09 33  ta>)).   *.....3
33e0: 34 20 34 32 20 6c 6f 31 36 28 68 69 33 32 28 3c  4 42 lo16(hi32(<
33f0: 64 61 74 61 3e 29 29 0a 20 20 20 2a 09 09 09 09  data>)).   *....
3400: 09 30 30 20 30 32 20 31 34 20 33 38 0a 20 20 20  .00 02 14 38.   
3410: 2a 09 09 09 09 09 33 34 20 34 32 20 68 69 31 36  *.....34 42 hi16
3420: 28 6c 6f 33 32 28 3c 64 61 74 61 3e 29 29 0a 20  (lo32(<data>)). 
3430: 20 20 2a 09 09 09 09 09 30 30 20 30 32 20 31 34    *.....00 02 14
3440: 20 33 38 0a 20 20 20 2a 09 09 09 09 09 33 34 20   38.   *.....34 
3450: 34 32 20 6c 6f 31 36 28 6c 6f 33 32 28 3c 64 61  42 lo16(lo32(<da
3460: 74 61 3e 29 29 0a 20 20 20 2a 20 20 20 20 64 6c  ta>)).   *    dl
3470: 69 20 24 32 35 2c 3c 61 64 64 72 65 73 73 3e 09  i $25,<address>.
3480: 09 33 43 20 31 39 20 68 69 31 36 28 68 69 33 32  .3C 19 hi16(hi32
3490: 28 3c 61 64 64 72 65 73 73 3e 29 29 0a 20 20 20  (<address>)).   
34a0: 2a 09 09 09 09 09 33 37 20 33 39 20 6c 6f 31 36  *.....37 39 lo16
34b0: 28 68 69 33 32 28 3c 61 64 64 72 65 73 73 3e 29  (hi32(<address>)
34c0: 29 0a 20 20 20 2a 09 09 09 09 09 30 30 20 31 39  ).   *.....00 19
34d0: 20 43 43 20 33 38 0a 20 20 20 2a 09 09 09 09 09   CC 38.   *.....
34e0: 33 37 20 33 39 20 68 69 31 36 28 6c 6f 33 32 28  37 39 hi16(lo32(
34f0: 3c 61 64 64 72 65 73 73 3e 29 29 0a 20 20 20 2a  <address>)).   *
3500: 09 09 09 09 09 30 30 20 31 39 20 43 43 20 33 38  .....00 19 CC 38
3510: 0a 20 20 20 2a 09 09 09 09 09 33 37 20 33 39 20  .   *.....37 39 
3520: 6c 6f 31 36 28 6c 6f 33 32 28 3c 61 64 64 72 65  lo16(lo32(<addre
3530: 73 73 3e 29 29 0a 20 20 20 2a 20 20 20 20 6a 20  ss>)).   *    j 
3540: 24 32 35 09 09 09 09 30 33 20 32 30 20 30 30 20  $25....03 20 00 
3550: 30 38 0a 20 20 20 2a 20 20 20 20 6e 6f 70 09 09  08.   *    nop..
3560: 09 09 30 30 20 30 30 20 30 30 20 30 30 0a 20 20  ..00 00 00 00.  
3570: 20 2a 2f 0a 20 20 2f 2a 20 57 68 61 74 20 61 62   */.  /* What ab
3580: 6f 75 74 20 62 69 67 20 65 6e 64 69 61 6e 20 2f  out big endian /
3590: 20 6c 69 74 74 6c 65 20 65 6e 64 69 61 6e 20 3f   little endian ?
35a0: 3f 20 2a 2f 0a 20 20 2a 28 73 68 6f 72 74 20 2a  ? */.  *(short *
35b0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29  ) (function + 0)
35c0: 20 3d 20 30 78 33 43 30 32 3b 0a 20 20 2a 28 73   = 0x3C02;.  *(s
35d0: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
35e0: 6e 20 2b 20 32 29 20 3d 20 28 75 6e 73 69 67 6e  n + 2) = (unsign
35f0: 65 64 20 6c 6f 6e 67 29 20 64 61 74 61 20 3e 3e  ed long) data >>
3600: 20 34 38 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a   48;.  *(short *
3610: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29  ) (function + 4)
3620: 20 3d 20 30 78 33 34 34 32 3b 0a 20 20 2a 28 73   = 0x3442;.  *(s
3630: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
3640: 6e 20 2b 20 36 29 20 3d 20 28 28 75 6e 73 69 67  n + 6) = ((unsig
3650: 6e 65 64 20 6c 6f 6e 67 29 20 64 61 74 61 20 3e  ned long) data >
3660: 3e 20 33 32 29 20 26 20 30 78 66 66 66 66 3b 0a  > 32) & 0xffff;.
3670: 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 28 66 75    *(int *)   (fu
3680: 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 30 78  nction + 8) = 0x
3690: 30 30 30 32 31 34 33 38 3b 0a 20 20 2a 28 73 68  00021438;.  *(sh
36a0: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ort *) (function
36b0: 20 2b 31 32 29 20 3d 20 30 78 33 34 34 32 3b 0a   +12) = 0x3442;.
36c0: 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75    *(short *) (fu
36d0: 6e 63 74 69 6f 6e 20 2b 31 34 29 20 3d 20 28 28  nction +14) = ((
36e0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64  unsigned long) d
36f0: 61 74 61 20 3e 3e 20 31 36 29 20 26 20 30 78 66  ata >> 16) & 0xf
3700: 66 66 66 3b 0a 20 20 2a 28 69 6e 74 20 2a 29 20  fff;.  *(int *) 
3710: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29    (function +16)
3720: 20 3d 20 30 78 30 30 30 32 31 34 33 38 3b 0a 20   = 0x00021438;. 
3730: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e   *(short *) (fun
3740: 63 74 69 6f 6e 20 2b 32 30 29 20 3d 20 30 78 33  ction +20) = 0x3
3750: 34 34 32 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a  442;.  *(short *
3760: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 32 29  ) (function +22)
3770: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e   = (unsigned lon
3780: 67 29 20 64 61 74 61 20 26 20 30 78 66 66 66 66  g) data & 0xffff
3790: 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28  ;.  *(short *) (
37a0: 66 75 6e 63 74 69 6f 6e 20 2b 32 34 29 20 3d 20  function +24) = 
37b0: 30 78 33 43 31 39 3b 0a 20 20 2a 28 73 68 6f 72  0x3C19;.  *(shor
37c0: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
37d0: 32 36 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  26) = (unsigned 
37e0: 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 20 3e 3e  long) address >>
37f0: 20 34 38 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a   48;.  *(short *
3800: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 38 29  ) (function +28)
3810: 20 3d 20 30 78 33 37 33 39 3b 0a 20 20 2a 28 73   = 0x3739;.  *(s
3820: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
3830: 6e 20 2b 33 30 29 20 3d 20 28 28 75 6e 73 69 67  n +30) = ((unsig
3840: 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64 72 65 73  ned long) addres
3850: 73 20 3e 3e 20 33 32 29 20 26 20 30 78 66 66 66  s >> 32) & 0xfff
3860: 66 3b 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 20  f;.  *(int *)   
3870: 28 66 75 6e 63 74 69 6f 6e 20 2b 33 32 29 20 3d  (function +32) =
3880: 20 30 78 30 30 31 39 43 43 33 38 3b 0a 20 20 2a   0x0019CC38;.  *
3890: 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74  (short *) (funct
38a0: 69 6f 6e 20 2b 33 36 29 20 3d 20 30 78 33 37 33  ion +36) = 0x373
38b0: 39 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20  9;.  *(short *) 
38c0: 28 66 75 6e 63 74 69 6f 6e 20 2b 33 38 29 20 3d  (function +38) =
38d0: 20 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67   ((unsigned long
38e0: 29 20 61 64 64 72 65 73 73 20 3e 3e 20 31 36 29  ) address >> 16)
38f0: 20 26 20 30 78 66 66 66 66 3b 0a 20 20 2a 28 69   & 0xffff;.  *(i
3900: 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f  nt *)   (functio
3910: 6e 20 2b 34 30 29 20 3d 20 30 78 30 30 31 39 43  n +40) = 0x0019C
3920: 43 33 38 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a  C38;.  *(short *
3930: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 34 34 29  ) (function +44)
3940: 20 3d 20 30 78 33 37 33 39 3b 0a 20 20 2a 28 73   = 0x3739;.  *(s
3950: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
3960: 6e 20 2b 34 36 29 20 3d 20 28 75 6e 73 69 67 6e  n +46) = (unsign
3970: 65 64 20 6c 6f 6e 67 29 20 61 64 64 72 65 73 73  ed long) address
3980: 20 26 20 30 78 66 66 66 66 3b 0a 20 20 2a 28 69   & 0xffff;.  *(i
3990: 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f  nt *)   (functio
39a0: 6e 20 2b 34 38 29 20 3d 20 30 78 30 33 32 30 30  n +48) = 0x03200
39b0: 30 30 38 3b 0a 20 20 2a 28 69 6e 74 20 2a 29 20  008;.  *(int *) 
39c0: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 35 32 29    (function +52)
39d0: 20 3d 20 30 78 30 30 30 30 30 30 30 30 3b 0a 23   = 0x00000000;.#
39e0: 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 28  define is_tramp(
39f0: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a  function)  \.  *
3a00: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20  (unsigned short 
3a10: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30  *) (function + 0
3a20: 29 20 3d 3d 20 30 78 33 43 30 32 20 26 26 20 5c  ) == 0x3C02 && \
3a30: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68  .  *(unsigned sh
3a40: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ort *) (function
3a50: 20 2b 20 34 29 20 3d 3d 20 30 78 33 34 34 32 20   + 4) == 0x3442 
3a60: 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65  && \.  *(unsigne
3a70: 64 20 69 6e 74 20 2a 29 20 20 20 28 66 75 6e 63  d int *)   (func
3a80: 74 69 6f 6e 20 2b 20 38 29 20 3d 3d 20 30 78 30  tion + 8) == 0x0
3a90: 30 30 32 31 34 33 38 20 26 26 20 5c 0a 20 20 2a  0021438 && \.  *
3aa0: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20  (unsigned short 
3ab0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32  *) (function +12
3ac0: 29 20 3d 3d 20 30 78 33 34 34 32 20 26 26 20 5c  ) == 0x3442 && \
3ad0: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e  .  *(unsigned in
3ae0: 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e  t *)   (function
3af0: 20 2b 31 36 29 20 3d 3d 20 30 78 30 30 30 32 31   +16) == 0x00021
3b00: 34 33 38 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73  438 && \.  *(uns
3b10: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28  igned short *) (
3b20: 66 75 6e 63 74 69 6f 6e 20 2b 32 30 29 20 3d 3d  function +20) ==
3b30: 20 30 78 33 34 34 32 20 26 26 20 5c 0a 20 20 2a   0x3442 && \.  *
3b40: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20  (unsigned short 
3b50: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 34  *) (function +24
3b60: 29 20 3d 3d 20 30 78 33 43 31 39 20 26 26 20 5c  ) == 0x3C19 && \
3b70: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68  .  *(unsigned sh
3b80: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ort *) (function
3b90: 20 2b 32 38 29 20 3d 3d 20 30 78 33 37 33 39 20   +28) == 0x3739 
3ba0: 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65  && \.  *(unsigne
3bb0: 64 20 69 6e 74 20 2a 29 20 20 20 28 66 75 6e 63  d int *)   (func
3bc0: 74 69 6f 6e 20 2b 33 32 29 20 3d 3d 20 30 78 30  tion +32) == 0x0
3bd0: 30 31 39 43 43 33 38 20 26 26 20 5c 0a 20 20 2a  019CC38 && \.  *
3be0: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20  (unsigned short 
3bf0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 33 36  *) (function +36
3c00: 29 20 3d 3d 20 30 78 33 37 33 39 20 26 26 20 5c  ) == 0x3739 && \
3c10: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e  .  *(unsigned in
3c20: 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e  t *)   (function
3c30: 20 2b 34 30 29 20 3d 3d 20 30 78 30 30 31 39 43   +40) == 0x0019C
3c40: 43 33 38 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73  C38 && \.  *(uns
3c50: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28  igned short *) (
3c60: 66 75 6e 63 74 69 6f 6e 20 2b 34 34 29 20 3d 3d  function +44) ==
3c70: 20 30 78 33 37 33 39 20 26 26 20 5c 0a 20 20 2a   0x3739 && \.  *
3c80: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29  (unsigned int *)
3c90: 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 34 38     (function +48
3ca0: 29 20 3d 3d 20 30 78 30 33 32 30 30 30 30 38 20  ) == 0x03200008 
3cb0: 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65  && \.  *(unsigne
3cc0: 64 20 69 6e 74 20 2a 29 20 20 20 28 66 75 6e 63  d int *)   (func
3cd0: 74 69 6f 6e 20 2b 35 32 29 20 3d 3d 20 30 78 30  tion +52) == 0x0
3ce0: 30 30 30 30 30 30 30 0a 23 64 65 66 69 6e 65 20  0000000.#define 
3cf0: 68 69 6c 6f 28 77 6f 72 64 33 2c 77 6f 72 64 32  hilo(word3,word2
3d00: 2c 77 6f 72 64 31 2c 77 6f 72 64 30 29 20 20 5c  ,word1,word0)  \
3d10: 0a 20 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c  .  (((unsigned l
3d20: 6f 6e 67 29 20 28 77 6f 72 64 33 29 20 3c 3c 20  ong) (word3) << 
3d30: 34 38 29 20 7c 20 28 28 75 6e 73 69 67 6e 65 64  48) | ((unsigned
3d40: 20 6c 6f 6e 67 29 20 28 77 6f 72 64 32 29 20 3c   long) (word2) <
3d50: 3c 20 33 32 29 20 7c 20 5c 0a 20 20 20 28 28 75  < 32) | \.   ((u
3d60: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 77  nsigned long) (w
3d70: 6f 72 64 31 29 20 3c 3c 20 31 36 29 20 7c 20 28  ord1) << 16) | (
3d80: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28  unsigned long) (
3d90: 77 6f 72 64 30 29 29 0a 23 64 65 66 69 6e 65 20  word0)).#define 
3da0: 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75  tramp_address(fu
3db0: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c  nction)  \.  hil
3dc0: 6f 28 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f  o(*(unsigned sho
3dd0: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
3de0: 2b 32 36 29 2c 20 5c 0a 20 20 20 20 20 20 20 2a  +26), \.       *
3df0: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20  (unsigned short 
3e00: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 33 30  *) (function +30
3e10: 29 2c 20 5c 0a 20 20 20 20 20 20 20 2a 28 75 6e  ), \.       *(un
3e20: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20  signed short *) 
3e30: 28 66 75 6e 63 74 69 6f 6e 20 2b 33 38 29 2c 20  (function +38), 
3e40: 5c 0a 20 20 20 20 20 20 20 2a 28 75 6e 73 69 67  \.       *(unsig
3e50: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75  ned short *) (fu
3e60: 6e 63 74 69 6f 6e 20 2b 34 36 29 29 0a 23 64 65  nction +46)).#de
3e70: 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 28  fine tramp_data(
3e80: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68  function)  \.  h
3e90: 69 6c 6f 28 2a 28 75 6e 73 69 67 6e 65 64 20 73  ilo(*(unsigned s
3ea0: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
3eb0: 6e 20 2b 20 32 29 2c 20 5c 0a 20 20 20 20 20 20  n + 2), \.      
3ec0: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72   *(unsigned shor
3ed0: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
3ee0: 20 36 29 2c 20 5c 0a 20 20 20 20 20 20 20 2a 28   6), \.       *(
3ef0: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a  unsigned short *
3f00: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 34 29  ) (function +14)
3f10: 2c 20 5c 0a 20 20 20 20 20 20 20 2a 28 75 6e 73  , \.       *(uns
3f20: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28  igned short *) (
3f30: 66 75 6e 63 74 69 6f 6e 20 2b 32 32 29 29 0a 23  function +22)).#
3f40: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d  endif.#ifdef __m
3f50: 69 70 73 36 34 5f 5f 0a 20 20 2f 2a 20 66 75 6e  ips64__.  /* fun
3f60: 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 6c  ction:.   *    l
3f70: 64 20 24 32 2c 31 36 28 24 32 35 29 09 09 09 44  d $2,16($25)...D
3f80: 46 20 32 32 20 30 30 20 31 30 0a 20 20 20 2a 20  F 22 00 10.   * 
3f90: 20 20 20 6c 64 20 24 32 35 2c 32 34 28 24 32 35     ld $25,24($25
3fa0: 29 09 09 09 44 46 20 33 39 20 30 30 20 31 38 0a  )...DF 39 00 18.
3fb0: 20 20 20 2a 20 20 20 20 6a 20 24 32 35 09 09 09     *    j $25...
3fc0: 09 30 33 20 32 30 20 30 30 20 30 38 0a 20 20 20  .03 20 00 08.   
3fd0: 2a 20 20 20 20 6e 6f 70 09 09 09 09 30 30 20 30  *    nop....00 0
3fe0: 30 20 30 30 20 30 30 0a 20 20 20 2a 20 20 20 20  0 00 00.   *    
3ff0: 2e 64 77 6f 72 64 20 3c 64 61 74 61 3e 09 09 09  .dword <data>...
4000: 3c 64 61 74 61 3e 0a 20 20 20 2a 20 20 20 20 2e  <data>.   *    .
4010: 64 77 6f 72 64 20 3c 61 64 64 72 65 73 73 3e 09  dword <address>.
4020: 09 3c 61 64 64 72 65 73 73 3e 0a 20 20 20 2a 2f  .<address>.   */
4030: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e  .  *(unsigned in
4040: 74 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20  t *)  (function 
4050: 2b 20 30 29 20 3d 20 30 78 44 46 32 32 30 30 31  + 0) = 0xDF22001
4060: 30 3b 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20  0;.  *(unsigned 
4070: 69 6e 74 20 2a 29 20 20 28 66 75 6e 63 74 69 6f  int *)  (functio
4080: 6e 20 2b 20 34 29 20 3d 20 30 78 44 46 33 39 30  n + 4) = 0xDF390
4090: 30 31 38 3b 0a 20 20 2a 28 75 6e 73 69 67 6e 65  018;.  *(unsigne
40a0: 64 20 69 6e 74 20 2a 29 20 20 28 66 75 6e 63 74  d int *)  (funct
40b0: 69 6f 6e 20 2b 20 38 29 20 3d 20 30 78 30 33 32  ion + 8) = 0x032
40c0: 30 30 30 30 38 3b 0a 20 20 2a 28 75 6e 73 69 67  00008;.  *(unsig
40d0: 6e 65 64 20 69 6e 74 20 2a 29 20 20 28 66 75 6e  ned int *)  (fun
40e0: 63 74 69 6f 6e 20 2b 31 32 29 20 3d 20 30 78 30  ction +12) = 0x0
40f0: 30 30 30 30 30 30 30 3b 0a 20 20 2a 28 75 6e 73  0000000;.  *(uns
4100: 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 29 20 28 66  igned long *) (f
4110: 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20 28  unction +16) = (
4120: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64  unsigned long) d
4130: 61 74 61 3b 0a 20 20 2a 28 75 6e 73 69 67 6e 65  ata;.  *(unsigne
4140: 64 20 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74  d long *) (funct
4150: 69 6f 6e 20 2b 32 34 29 20 3d 20 28 75 6e 73 69  ion +24) = (unsi
4160: 67 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64 72 65  gned long) addre
4170: 73 73 3b 0a 23 64 65 66 69 6e 65 20 69 73 5f 74  ss;.#define is_t
4180: 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20 20  ramp(function)  
4190: 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69  \.  *(unsigned i
41a0: 6e 74 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e  nt *)  (function
41b0: 20 2b 20 30 29 20 3d 3d 20 30 78 44 46 32 32 30   + 0) == 0xDF220
41c0: 30 31 30 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73  010 && \.  *(uns
41d0: 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 20 28 66  igned int *)  (f
41e0: 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 3d 20  unction + 4) == 
41f0: 30 78 44 46 33 39 30 30 31 38 20 26 26 20 5c 0a  0xDF390018 && \.
4200: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74    *(unsigned int
4210: 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b   *)  (function +
4220: 20 38 29 20 3d 3d 20 30 78 30 33 32 30 30 30 30   8) == 0x0320000
4230: 38 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67  8 && \.  *(unsig
4240: 6e 65 64 20 69 6e 74 20 2a 29 20 20 28 66 75 6e  ned int *)  (fun
4250: 63 74 69 6f 6e 20 2b 31 32 29 20 3d 3d 20 30 78  ction +12) == 0x
4260: 30 30 30 30 30 30 30 30 0a 23 64 65 66 69 6e 65  00000000.#define
4270: 20 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66   tramp_address(f
4280: 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28  unction)  \.  *(
4290: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 29  unsigned long *)
42a0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 34 29 0a   (function +24).
42b0: 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61  #define tramp_da
42c0: 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a  ta(function)  \.
42d0: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e    *(unsigned lon
42e0: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  g *) (function +
42f0: 31 36 29 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  16).#endif.#if d
4300: 65 66 69 6e 65 64 28 5f 5f 73 70 61 72 63 5f 5f  efined(__sparc__
4310: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f  ) && !defined(__
4320: 73 70 61 72 63 36 34 5f 5f 29 0a 20 20 2f 2a 20  sparc64__).  /* 
4330: 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20  function:.   *  
4340: 20 20 73 65 74 68 69 20 25 68 69 28 3c 64 61 74    sethi %hi(<dat
4350: 61 3e 29 2c 25 67 32 09 09 30 35 30 30 30 30 30  a>),%g2..0500000
4360: 30 20 7c 20 28 3c 64 61 74 61 3e 20 3e 3e 20 31  0 | (<data> >> 1
4370: 30 29 0a 20 20 20 2a 20 20 20 20 73 65 74 68 69  0).   *    sethi
4380: 20 25 68 69 28 3c 61 64 64 72 65 73 73 3e 29 2c   %hi(<address>),
4390: 25 67 31 09 30 33 30 30 30 30 30 30 20 7c 20 28  %g1.03000000 | (
43a0: 3c 61 64 64 72 65 73 73 3e 20 3e 3e 20 31 30 29  <address> >> 10)
43b0: 0a 20 20 20 2a 20 20 20 20 6a 6d 70 20 25 67 31  .   *    jmp %g1
43c0: 2b 25 6c 6f 28 3c 61 64 64 72 65 73 73 3e 29 09  +%lo(<address>).
43d0: 09 38 31 43 30 36 30 30 30 20 7c 20 28 3c 61 64  .81C06000 | (<ad
43e0: 64 72 65 73 73 3e 20 26 20 30 78 33 66 66 29 0a  dress> & 0x3ff).
43f0: 20 20 20 2a 20 20 20 20 6f 72 20 25 67 32 2c 25     *    or %g2,%
4400: 6c 6f 28 3c 64 61 74 61 3e 29 2c 25 67 32 09 09  lo(<data>),%g2..
4410: 38 34 31 30 41 30 30 30 20 7c 20 28 3c 64 61 74  8410A000 | (<dat
4420: 61 3e 20 26 20 30 78 33 66 66 29 0a 20 20 20 2a  a> & 0x3ff).   *
4430: 2f 0a 23 64 65 66 69 6e 65 20 68 69 28 77 6f 72  /.#define hi(wor
4440: 64 29 20 20 28 28 75 6e 73 69 67 6e 65 64 20 6c  d)  ((unsigned l
4450: 6f 6e 67 29 20 28 77 6f 72 64 29 20 3e 3e 20 31  ong) (word) >> 1
4460: 30 29 0a 23 64 65 66 69 6e 65 20 6c 6f 28 77 6f  0).#define lo(wo
4470: 72 64 29 20 20 28 28 75 6e 73 69 67 6e 65 64 20  rd)  ((unsigned 
4480: 6c 6f 6e 67 29 20 28 77 6f 72 64 29 20 26 20 30  long) (word) & 0
4490: 78 33 66 66 29 0a 20 20 2a 28 6c 6f 6e 67 20 2a  x3ff).  *(long *
44a0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29  ) (function + 0)
44b0: 20 3d 20 30 78 30 35 30 30 30 30 30 30 20 7c 20   = 0x05000000 | 
44c0: 68 69 28 64 61 74 61 29 3b 0a 20 20 2a 28 6c 6f  hi(data);.  *(lo
44d0: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  ng *) (function 
44e0: 2b 20 34 29 20 3d 20 30 78 30 33 30 30 30 30 30  + 4) = 0x0300000
44f0: 30 20 7c 20 68 69 28 61 64 64 72 65 73 73 29 3b  0 | hi(address);
4500: 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75  .  *(long *) (fu
4510: 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 30 78  nction + 8) = 0x
4520: 38 31 43 30 36 30 30 30 20 7c 20 6c 6f 28 61 64  81C06000 | lo(ad
4530: 64 72 65 73 73 29 3b 0a 20 20 2a 28 6c 6f 6e 67  dress);.  *(long
4540: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31   *) (function +1
4550: 32 29 20 3d 20 30 78 38 34 31 30 41 30 30 30 20  2) = 0x8410A000 
4560: 7c 20 6c 6f 28 64 61 74 61 29 3b 0a 23 64 65 66  | lo(data);.#def
4570: 69 6e 65 20 69 73 5f 74 72 61 6d 70 28 66 75 6e  ine is_tramp(fun
4580: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 2a 28 6c  ction)  \.  (*(l
4590: 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ong *) (function
45a0: 20 2b 20 30 29 20 26 20 30 78 66 66 63 30 30 30   + 0) & 0xffc000
45b0: 30 30 29 20 3d 3d 20 30 78 30 35 30 30 30 30 30  00) == 0x0500000
45c0: 30 20 26 26 20 5c 0a 20 20 28 2a 28 6c 6f 6e 67  0 && \.  (*(long
45d0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20   *) (function + 
45e0: 34 29 20 26 20 30 78 66 66 63 30 30 30 30 30 29  4) & 0xffc00000)
45f0: 20 3d 3d 20 30 78 30 33 30 30 30 30 30 30 20 26   == 0x03000000 &
4600: 26 20 5c 0a 20 20 28 2a 28 6c 6f 6e 67 20 2a 29  & \.  (*(long *)
4610: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20   (function + 8) 
4620: 26 20 30 78 66 66 66 66 66 63 30 30 29 20 3d 3d  & 0xfffffc00) ==
4630: 20 30 78 38 31 43 30 36 30 30 30 20 26 26 20 5c   0x81C06000 && \
4640: 0a 20 20 28 2a 28 6c 6f 6e 67 20 2a 29 20 28 66  .  (*(long *) (f
4650: 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 26 20 30  unction +12) & 0
4660: 78 66 66 66 66 66 63 30 30 29 20 3d 3d 20 30 78  xfffffc00) == 0x
4670: 38 34 31 30 41 30 30 30 0a 23 64 65 66 69 6e 65  8410A000.#define
4680: 20 68 69 6c 6f 28 68 69 77 6f 72 64 2c 6c 6f 77   hilo(hiword,low
4690: 6f 72 64 29 20 20 28 28 28 68 69 77 6f 72 64 29  ord)  (((hiword)
46a0: 20 3c 3c 20 31 30 29 20 7c 20 28 28 6c 6f 77 6f   << 10) | ((lowo
46b0: 72 64 29 20 26 20 30 78 33 66 66 29 29 0a 23 64  rd) & 0x3ff)).#d
46c0: 65 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 72  efine tramp_addr
46d0: 65 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c  ess(function)  \
46e0: 0a 20 20 68 69 6c 6f 28 2a 28 6c 6f 6e 67 20 2a  .  hilo(*(long *
46f0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29  ) (function + 4)
4700: 2c 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e  , *(long *) (fun
4710: 63 74 69 6f 6e 20 2b 20 38 29 29 0a 23 64 65 66  ction + 8)).#def
4720: 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 28 66  ine tramp_data(f
4730: 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69  unction)  \.  hi
4740: 6c 6f 28 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75  lo(*(long *) (fu
4750: 6e 63 74 69 6f 6e 20 2b 20 30 29 2c 20 2a 28 6c  nction + 0), *(l
4760: 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ong *) (function
4770: 20 2b 31 32 29 29 0a 23 65 6e 64 69 66 0a 23 69   +12)).#endif.#i
4780: 66 64 65 66 20 5f 5f 73 70 61 72 63 36 34 5f 5f  fdef __sparc64__
4790: 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a  .  /* function:.
47a0: 20 20 20 2a 20 20 20 20 72 64 20 25 70 63 2c 25     *    rd %pc,%
47b0: 67 31 09 09 09 38 33 34 31 34 30 30 30 0a 20 20  g1...83414000.  
47c0: 20 2a 20 20 20 20 6c 64 78 20 5b 25 67 31 2b 32   *    ldx [%g1+2
47d0: 34 5d 2c 25 67 32 09 09 43 34 35 38 36 30 31 38  4],%g2..C4586018
47e0: 0a 20 20 20 2a 20 20 20 20 6a 6d 70 20 25 67 32  .   *    jmp %g2
47f0: 09 09 09 09 38 31 43 30 38 30 30 30 0a 20 20 20  ....81C08000.   
4800: 2a 20 20 20 20 6c 64 78 20 5b 25 67 31 2b 31 36  *    ldx [%g1+16
4810: 5d 2c 25 67 35 09 09 43 41 35 38 36 30 31 30 0a  ],%g5..CA586010.
4820: 20 20 20 2a 20 20 20 20 2e 6c 6f 6e 67 20 68 69     *    .long hi
4830: 67 68 33 32 28 3c 64 61 74 61 3e 29 09 09 3c 64  gh32(<data>)..<d
4840: 61 74 61 3e 20 3e 3e 20 33 32 0a 20 20 20 2a 20  ata> >> 32.   * 
4850: 20 20 20 2e 6c 6f 6e 67 20 6c 6f 77 33 32 28 3c     .long low32(<
4860: 64 61 74 61 3e 29 09 09 3c 64 61 74 61 3e 20 26  data>)..<data> &
4870: 20 30 78 66 66 66 66 66 66 66 66 0a 20 20 20 2a   0xffffffff.   *
4880: 20 20 20 20 2e 6c 6f 6e 67 20 68 69 67 68 33 32      .long high32
4890: 28 3c 61 64 64 72 65 73 73 3e 29 09 09 3c 61 64  (<address>)..<ad
48a0: 64 72 65 73 73 3e 20 3e 3e 20 33 32 0a 20 20 20  dress> >> 32.   
48b0: 2a 20 20 20 20 2e 6c 6f 6e 67 20 6c 6f 77 33 32  *    .long low32
48c0: 28 3c 61 64 64 72 65 73 73 3e 29 09 09 3c 61 64  (<address>)..<ad
48d0: 64 72 65 73 73 3e 20 26 20 30 78 66 66 66 66 66  dress> & 0xfffff
48e0: 66 66 66 0a 20 20 20 2a 2f 0a 20 20 2a 28 69 6e  fff.   */.  *(in
48f0: 74 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20  t *)  (function 
4900: 2b 20 30 29 20 3d 20 30 78 38 33 34 31 34 30 30  + 0) = 0x8341400
4910: 30 3b 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 28  0;.  *(int *)  (
4920: 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 20  function + 4) = 
4930: 30 78 43 34 35 38 36 30 31 38 3b 0a 20 20 2a 28  0xC4586018;.  *(
4940: 69 6e 74 20 2a 29 20 20 28 66 75 6e 63 74 69 6f  int *)  (functio
4950: 6e 20 2b 20 38 29 20 3d 20 30 78 38 31 43 30 38  n + 8) = 0x81C08
4960: 30 30 30 3b 0a 20 20 2a 28 69 6e 74 20 2a 29 20  000;.  *(int *) 
4970: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20   (function +12) 
4980: 3d 20 30 78 43 41 35 38 36 30 31 30 3b 0a 20 20  = 0xCA586010;.  
4990: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74  *(long *) (funct
49a0: 69 6f 6e 20 2b 31 36 29 20 3d 20 28 6c 6f 6e 67  ion +16) = (long
49b0: 29 20 64 61 74 61 3b 0a 20 20 2a 28 6c 6f 6e 67  ) data;.  *(long
49c0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32   *) (function +2
49d0: 34 29 20 3d 20 28 6c 6f 6e 67 29 20 61 64 64 72  4) = (long) addr
49e0: 65 73 73 3b 0a 23 64 65 66 69 6e 65 20 69 73 5f  ess;.#define is_
49f0: 74 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20  tramp(function) 
4a00: 20 5c 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 28   \.  *(int *)  (
4a10: 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 3d  function + 0) ==
4a20: 20 30 78 38 33 34 31 34 30 30 30 20 26 26 20 5c   0x83414000 && \
4a30: 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 28 66 75  .  *(int *)  (fu
4a40: 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 3d 20 30  nction + 4) == 0
4a50: 78 43 34 35 38 36 30 31 38 20 26 26 20 5c 0a 20  xC4586018 && \. 
4a60: 20 2a 28 69 6e 74 20 2a 29 20 20 28 66 75 6e 63   *(int *)  (func
4a70: 74 69 6f 6e 20 2b 20 38 29 20 3d 3d 20 30 78 38  tion + 8) == 0x8
4a80: 31 43 30 38 30 30 30 20 26 26 20 5c 0a 20 20 2a  1C08000 && \.  *
4a90: 28 69 6e 74 20 2a 29 20 20 28 66 75 6e 63 74 69  (int *)  (functi
4aa0: 6f 6e 20 2b 31 32 29 20 3d 3d 20 30 78 43 41 35  on +12) == 0xCA5
4ab0: 38 36 30 31 30 0a 23 64 65 66 69 6e 65 20 74 72  86010.#define tr
4ac0: 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75 6e 63  amp_address(func
4ad0: 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 6c 6f 6e  tion)  \.  *(lon
4ae0: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  g *) (function +
4af0: 32 34 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d  24).#define tram
4b00: 70 5f 64 61 74 61 28 66 75 6e 63 74 69 6f 6e 29  p_data(function)
4b10: 20 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20    \.  *(long *) 
4b20: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 0a 23  (function +16).#
4b30: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 61  endif.#ifdef __a
4b40: 6c 70 68 61 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63  lpha__.  /* func
4b50: 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 62 72  tion:.   *    br
4b60: 20 24 31 2c 66 75 6e 63 74 69 6f 6e 2e 2e 6e 67   $1,function..ng
4b70: 09 30 30 20 30 30 20 32 30 20 43 30 0a 20 20 20  .00 00 20 C0.   
4b80: 2a 20 66 75 6e 63 74 69 6f 6e 2e 2e 6e 67 3a 0a  * function..ng:.
4b90: 20 20 20 2a 20 20 20 20 6c 64 71 20 24 32 37 2c     *    ldq $27,
4ba0: 32 30 28 24 31 29 09 09 31 34 20 30 30 20 36 31  20($1)..14 00 61
4bb0: 20 41 37 0a 20 20 20 2a 20 20 20 20 6c 64 71 20   A7.   *    ldq 
4bc0: 24 31 2c 31 32 28 24 31 29 09 09 30 43 20 30 30  $1,12($1)..0C 00
4bd0: 20 32 31 20 41 34 0a 20 20 20 2a 20 20 20 20 6a   21 A4.   *    j
4be0: 6d 70 20 24 33 31 2c 28 24 32 37 29 2c 30 09 09  mp $31,($27),0..
4bf0: 30 30 20 30 30 20 46 42 20 36 42 0a 20 20 20 2a  00 00 FB 6B.   *
4c00: 20 20 20 20 2e 71 75 61 64 20 3c 64 61 74 61 3e      .quad <data>
4c10: 09 09 3c 64 61 74 61 3e 0a 20 20 20 2a 20 20 20  ..<data>.   *   
4c20: 20 2e 71 75 61 64 20 3c 61 64 64 72 65 73 73 3e   .quad <address>
4c30: 09 09 3c 61 64 64 72 65 73 73 3e 0a 20 20 20 2a  ..<address>.   *
4c40: 2f 0a 20 20 7b 20 73 74 61 74 69 63 20 69 6e 74  /.  { static int
4c50: 20 63 6f 64 65 20 5b 34 5d 20 3d 0a 20 20 20 20   code [4] =.    
4c60: 20 20 7b 20 30 78 43 30 32 30 30 30 30 30 2c 20    { 0xC0200000, 
4c70: 30 78 41 37 36 31 30 30 31 34 2c 20 30 78 41 34  0xA7610014, 0xA4
4c80: 32 31 30 30 30 43 2c 20 30 78 36 42 46 42 30 30  21000C, 0x6BFB00
4c90: 30 30 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 3b  00 };.    int i;
4ca0: 0a 20 20 20 20 66 6f 72 20 28 69 3d 30 3b 20 69  .    for (i=0; i
4cb0: 3c 34 3b 20 69 2b 2b 29 20 7b 20 28 28 69 6e 74  <4; i++) { ((int
4cc0: 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 69 5d   *) function)[i]
4cd0: 20 3d 20 63 6f 64 65 5b 69 5d 3b 20 7d 0a 20 20   = code[i]; }.  
4ce0: 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63    ((long *) func
4cf0: 74 69 6f 6e 29 5b 32 5d 20 3d 20 28 6c 6f 6e 67  tion)[2] = (long
4d00: 29 20 64 61 74 61 3b 0a 20 20 20 20 28 28 6c 6f  ) data;.    ((lo
4d10: 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b  ng *) function)[
4d20: 33 5d 20 3d 20 28 6c 6f 6e 67 29 20 61 64 64 72  3] = (long) addr
4d30: 65 73 73 3b 0a 20 20 7d 0a 23 64 65 66 69 6e 65  ess;.  }.#define
4d40: 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69   is_tramp(functi
4d50: 6f 6e 29 20 20 5c 0a 20 20 28 28 69 6e 74 20 2a  on)  \.  ((int *
4d60: 29 20 66 75 6e 63 74 69 6f 6e 29 5b 30 5d 20 3d  ) function)[0] =
4d70: 3d 20 30 78 43 30 32 30 30 30 30 30 20 26 26 20  = 0xC0200000 && 
4d80: 5c 0a 20 20 28 28 69 6e 74 20 2a 29 20 66 75 6e  \.  ((int *) fun
4d90: 63 74 69 6f 6e 29 5b 31 5d 20 3d 3d 20 30 78 41  ction)[1] == 0xA
4da0: 37 36 31 30 30 31 34 20 26 26 20 5c 0a 20 20 28  7610014 && \.  (
4db0: 28 69 6e 74 20 2a 29 20 66 75 6e 63 74 69 6f 6e  (int *) function
4dc0: 29 5b 32 5d 20 3d 3d 20 30 78 41 34 32 31 30 30  )[2] == 0xA42100
4dd0: 30 43 20 26 26 20 5c 0a 20 20 28 28 69 6e 74 20  0C && \.  ((int 
4de0: 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 33 5d 20  *) function)[3] 
4df0: 3d 3d 20 30 78 36 42 46 42 30 30 30 30 0a 23 64  == 0x6BFB0000.#d
4e00: 65 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 72  efine tramp_addr
4e10: 65 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c  ess(function)  \
4e20: 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e  .  ((long *) fun
4e30: 63 74 69 6f 6e 29 5b 33 5d 0a 23 64 65 66 69 6e  ction)[3].#defin
4e40: 65 20 74 72 61 6d 70 5f 64 61 74 61 28 66 75 6e  e tramp_data(fun
4e50: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 28 6c 6f  ction)  \.  ((lo
4e60: 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b  ng *) function)[
4e70: 32 5d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  2].#endif.#ifdef
4e80: 20 5f 5f 68 70 70 61 6f 6c 64 5f 5f 0a 20 20 2f   __hppaold__.  /
4e90: 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a  * function:.   *
4ea0: 20 20 20 20 6c 64 69 6c 20 4c 27 3c 64 61 74 61      ldil L'<data
4eb0: 3e 2c 25 72 32 39 09 09 32 33 41 30 30 30 30 30  >,%r29..23A00000
4ec0: 20 7c 20 68 69 28 3c 64 61 74 61 3e 29 0a 20 20   | hi(<data>).  
4ed0: 20 2a 20 20 20 20 6c 64 69 6c 20 4c 27 3c 61 64   *    ldil L'<ad
4ee0: 64 72 65 73 73 3e 2c 25 72 32 31 09 09 32 32 41  dress>,%r21..22A
4ef0: 30 30 30 30 30 20 7c 20 68 69 28 3c 61 64 64 72  00000 | hi(<addr
4f00: 65 73 73 3e 29 0a 20 20 20 2a 20 20 20 20 6c 64  ess>).   *    ld
4f10: 6f 20 52 27 3c 64 61 74 61 3e 28 25 72 32 39 29  o R'<data>(%r29)
4f20: 2c 25 72 32 39 09 09 33 37 42 44 30 30 30 30 20  ,%r29..37BD0000 
4f30: 7c 20 6c 6f 28 3c 64 61 74 61 3e 29 0a 20 20 20  | lo(<data>).   
4f40: 2a 20 20 20 20 6c 64 6f 20 52 27 3c 61 64 64 72  *    ldo R'<addr
4f50: 65 73 73 3e 28 25 72 32 31 29 2c 25 72 32 31 09  ess>(%r21),%r21.
4f60: 33 36 42 35 30 30 30 30 20 7c 20 6c 6f 28 3c 61  36B50000 | lo(<a
4f70: 64 64 72 65 73 73 3e 29 0a 20 20 20 2a 20 20 20  ddress>).   *   
4f80: 20 62 62 2c 3e 3d 2c 6e 20 25 72 32 31 2c 33 30   bb,>=,n %r21,30
4f90: 2c 66 75 6e 63 74 69 6f 6e 32 09 43 37 44 35 43  ,function2.C7D5C
4fa0: 30 31 32 0a 20 20 20 2a 20 20 20 20 64 65 70 69  012.   *    depi
4fb0: 20 30 2c 33 31 2c 32 2c 25 72 32 31 09 09 44 36   0,31,2,%r21..D6
4fc0: 41 30 31 43 31 45 0a 20 20 20 2a 20 20 20 20 6c  A01C1E.   *    l
4fd0: 64 77 20 34 28 30 2c 25 72 32 31 29 2c 25 72 31  dw 4(0,%r21),%r1
4fe0: 39 09 09 34 41 42 33 30 30 30 38 0a 20 20 20 2a  9..4AB30008.   *
4ff0: 20 20 20 20 6c 64 77 20 30 28 30 2c 25 72 32 31      ldw 0(0,%r21
5000: 29 2c 25 72 32 31 09 09 34 41 42 35 30 30 30 30  ),%r21..4AB50000
5010: 0a 20 20 20 2a 20 66 75 6e 63 74 69 6f 6e 32 3a  .   * function2:
5020: 0a 20 20 20 2a 20 20 20 20 6c 64 73 69 64 20 28  .   *    ldsid (
5030: 30 2c 25 72 32 31 29 2c 25 72 31 09 09 30 32 41  0,%r21),%r1..02A
5040: 30 31 30 41 31 0a 20 20 20 2a 20 20 20 20 6d 74  010A1.   *    mt
5050: 73 70 20 25 72 31 2c 25 73 72 30 09 09 09 30 30  sp %r1,%sr0...00
5060: 30 31 31 38 32 30 0a 20 20 20 2a 20 20 20 20 62  011820.   *    b
5070: 65 2c 6e 20 30 28 25 73 72 30 2c 25 72 32 31 29  e,n 0(%sr0,%r21)
5080: 09 09 45 32 41 30 30 30 30 32 0a 20 20 20 2a 20  ..E2A00002.   * 
5090: 20 20 20 6e 6f 70 09 09 09 09 30 38 30 30 30 32     nop....080002
50a0: 34 30 0a 20 20 20 2a 2f 0a 20 20 2f 2a 20 57 68  40.   */.  /* Wh
50b0: 65 6e 20 64 65 63 6f 64 69 6e 67 20 61 20 32 31  en decoding a 21
50c0: 2d 62 69 74 20 61 72 67 75 6d 65 6e 74 20 69 6e  -bit argument in
50d0: 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c   an instruction,
50e0: 20 74 68 65 20 68 70 70 61 20 70 65 72 66 6f 72   the hppa perfor
50f0: 6d 73 0a 20 20 20 2a 20 74 68 65 20 66 6f 6c 6c  ms.   * the foll
5100: 6f 77 69 6e 67 20 62 69 74 20 6d 61 6e 69 70 75  owing bit manipu
5110: 6c 61 74 69 6f 6e 3a 0a 20 20 20 2a 20 61 73 73  lation:.   * ass
5120: 65 6d 62 6c 65 32 31 3a 20 78 5b 32 30 5d 2e 2e  emble21: x[20]..
5130: 2e 78 5b 30 5d 0a 20 20 20 2a 20 20 20 20 20 20  .x[0].   *      
5140: 20 2d 2d 3e 20 78 5b 30 5d 20 78 5b 31 31 5d 2e   --> x[0] x[11].
5150: 2e 2e 78 5b 31 5d 20 78 5b 31 35 5d 2e 2e 78 5b  ..x[1] x[15]..x[
5160: 31 34 5d 20 78 5b 32 30 5d 2e 2e 2e 78 5b 31 36  14] x[20]...x[16
5170: 5d 20 78 5b 31 33 5d 2e 2e 78 5b 31 32 5d 0a 20  ] x[13]..x[12]. 
5180: 20 20 2a 20 57 68 65 6e 20 65 6e 63 6f 64 69 6e    * When encodin
5190: 67 20 61 20 32 31 2d 62 69 74 20 61 72 67 75 6d  g a 21-bit argum
51a0: 65 6e 74 20 69 6e 74 6f 20 61 6e 20 69 6e 73 74  ent into an inst
51b0: 72 75 63 74 69 6f 6e 2c 20 77 65 20 6e 65 65 64  ruction, we need
51c0: 20 74 68 65 0a 20 20 20 2a 20 74 6f 20 70 65 72   the.   * to per
51d0: 66 6f 72 6d 20 74 68 65 20 72 65 76 65 72 73 65  form the reverse
51e0: 20 70 65 72 6d 75 74 61 74 69 6f 6e 3a 0a 20 20   permutation:.  
51f0: 20 2a 20 70 65 72 6d 75 74 65 32 31 3a 20 20 79   * permute21:  y
5200: 5b 32 30 5d 2e 2e 2e 79 5b 30 5d 0a 20 20 20 2a  [20]...y[0].   *
5210: 20 20 20 20 20 20 20 2d 2d 3e 20 79 5b 36 5d 2e         --> y[6].
5220: 2e 2e 79 5b 32 5d 20 79 5b 38 5d 2e 2e 79 5b 37  ..y[2] y[8]..y[7
5230: 5d 20 79 5b 31 5d 2e 2e 79 5b 30 5d 20 79 5b 31  ] y[1]..y[0] y[1
5240: 39 5d 2e 2e 2e 79 5b 39 5d 20 79 5b 32 30 5d 0a  9]...y[9] y[20].
5250: 20 20 20 2a 2f 0a 23 64 65 66 69 6e 65 20 61 73     */.#define as
5260: 73 65 6d 62 6c 65 32 31 28 78 29 20 20 5c 0a 20  semble21(x)  \. 
5270: 20 28 28 28 28 78 29 20 26 20 30 78 31 29 20 3c   ((((x) & 0x1) <
5280: 3c 20 32 30 29 20 7c 20 28 28 28 78 29 20 26 20  < 20) | (((x) & 
5290: 30 78 46 46 45 29 20 3c 3c 20 38 29 20 7c 20 5c  0xFFE) << 8) | \
52a0: 0a 20 20 20 28 28 28 78 29 20 26 20 30 78 43 30  .   (((x) & 0xC0
52b0: 30 30 29 20 3e 3e 20 37 29 20 7c 20 28 28 28 78  00) >> 7) | (((x
52c0: 29 20 26 20 30 78 31 46 30 30 30 30 29 20 3e 3e  ) & 0x1F0000) >>
52d0: 20 31 34 29 20 7c 20 28 28 28 78 29 20 26 20 30   14) | (((x) & 0
52e0: 78 33 30 30 30 29 20 3e 3e 20 31 32 29 29 0a 23  x3000) >> 12)).#
52f0: 64 65 66 69 6e 65 20 70 65 72 6d 75 74 65 32 31  define permute21
5300: 28 79 29 20 20 5c 0a 20 20 28 28 28 28 79 29 20  (y)  \.  ((((y) 
5310: 26 20 30 78 37 43 29 20 3c 3c 20 31 34 29 20 7c  & 0x7C) << 14) |
5320: 20 28 28 28 79 29 20 26 20 30 78 31 38 30 29 20   (((y) & 0x180) 
5330: 3c 3c 20 37 29 20 7c 20 28 28 28 79 29 20 26 20  << 7) | (((y) & 
5340: 30 78 33 29 20 3c 3c 20 31 32 29 20 7c 20 5c 0a  0x3) << 12) | \.
5350: 20 20 20 28 28 28 79 29 20 26 20 30 78 46 46 45     (((y) & 0xFFE
5360: 30 30 29 20 3e 3e 20 38 29 20 7c 20 28 28 28 79  00) >> 8) | (((y
5370: 29 20 26 20 30 78 31 30 30 30 30 30 29 20 3e 3e  ) & 0x100000) >>
5380: 20 32 30 29 29 0a 23 64 65 66 69 6e 65 20 68 69   20)).#define hi
5390: 28 77 6f 72 64 29 20 20 70 65 72 6d 75 74 65 32  (word)  permute2
53a0: 31 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  1((unsigned long
53b0: 29 20 28 77 6f 72 64 29 20 3e 3e 20 31 31 29 0a  ) (word) >> 11).
53c0: 23 64 65 66 69 6e 65 20 6c 6f 28 77 6f 72 64 29  #define lo(word)
53d0: 20 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f    (((unsigned lo
53e0: 6e 67 29 20 28 77 6f 72 64 29 20 26 20 30 78 37  ng) (word) & 0x7
53f0: 46 46 29 20 3c 3c 20 31 29 0a 20 20 2a 28 6c 6f  FF) << 1).  *(lo
5400: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  ng *) (function 
5410: 2b 20 30 29 20 3d 20 30 78 32 33 41 30 30 30 30  + 0) = 0x23A0000
5420: 30 20 7c 20 68 69 28 64 61 74 61 29 3b 0a 20 20  0 | hi(data);.  
5430: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74  *(long *) (funct
5440: 69 6f 6e 20 2b 20 34 29 20 3d 20 30 78 32 32 41  ion + 4) = 0x22A
5450: 30 30 30 30 30 20 7c 20 68 69 28 61 64 64 72 65  00000 | hi(addre
5460: 73 73 29 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29  ss);.  *(long *)
5470: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20   (function + 8) 
5480: 3d 20 30 78 33 37 42 44 30 30 30 30 20 7c 20 6c  = 0x37BD0000 | l
5490: 6f 28 64 61 74 61 29 3b 0a 20 20 2a 28 6c 6f 6e  o(data);.  *(lon
54a0: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  g *) (function +
54b0: 31 32 29 20 3d 20 30 78 33 36 42 35 30 30 30 30  12) = 0x36B50000
54c0: 20 7c 20 6c 6f 28 61 64 64 72 65 73 73 29 3b 0a   | lo(address);.
54d0: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e    *(long *) (fun
54e0: 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20 30 78 43  ction +16) = 0xC
54f0: 37 44 35 43 30 31 32 3b 0a 20 20 2a 28 6c 6f 6e  7D5C012;.  *(lon
5500: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  g *) (function +
5510: 32 30 29 20 3d 20 30 78 44 36 41 30 31 43 31 45  20) = 0xD6A01C1E
5520: 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66  ;.  *(long *) (f
5530: 75 6e 63 74 69 6f 6e 20 2b 32 34 29 20 3d 20 30  unction +24) = 0
5540: 78 34 41 42 33 30 30 30 38 3b 0a 20 20 2a 28 6c  x4AB30008;.  *(l
5550: 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ong *) (function
5560: 20 2b 32 38 29 20 3d 20 30 78 34 41 42 35 30 30   +28) = 0x4AB500
5570: 30 30 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20  00;.  *(long *) 
5580: 28 66 75 6e 63 74 69 6f 6e 20 2b 33 32 29 20 3d  (function +32) =
5590: 20 30 78 30 32 41 30 31 30 41 31 3b 0a 20 20 2a   0x02A010A1;.  *
55a0: 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69  (long *) (functi
55b0: 6f 6e 20 2b 33 36 29 20 3d 20 30 78 30 30 30 31  on +36) = 0x0001
55c0: 31 38 32 30 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a  1820;.  *(long *
55d0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 34 30 29  ) (function +40)
55e0: 20 3d 20 30 78 45 32 41 30 30 30 30 32 3b 0a 20   = 0xE2A00002;. 
55f0: 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63   *(long *) (func
5600: 74 69 6f 6e 20 2b 34 34 29 20 3d 20 30 78 30 38  tion +44) = 0x08
5610: 30 30 30 32 34 30 3b 0a 23 64 65 66 69 6e 65 20  000240;.#define 
5620: 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 6f  is_tramp(functio
5630: 6e 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 29 20  n)  \.  ((long) 
5640: 66 75 6e 63 74 69 6f 6e 20 26 20 33 29 20 3d 3d  function & 3) ==
5650: 20 30 20 26 26 20 5c 0a 20 20 28 2a 28 6c 6f 6e   0 && \.  (*(lon
5660: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  g *) (function +
5670: 20 30 29 20 26 20 30 78 66 66 65 30 30 30 30 30   0) & 0xffe00000
5680: 29 20 3d 3d 20 30 78 32 33 41 30 30 30 30 30 20  ) == 0x23A00000 
5690: 26 26 20 5c 0a 20 20 28 2a 28 6c 6f 6e 67 20 2a  && \.  (*(long *
56a0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29  ) (function + 4)
56b0: 20 26 20 30 78 66 66 65 30 30 30 30 30 29 20 3d   & 0xffe00000) =
56c0: 3d 20 30 78 32 32 41 30 30 30 30 30 20 26 26 20  = 0x22A00000 && 
56d0: 5c 0a 20 20 28 2a 28 6c 6f 6e 67 20 2a 29 20 28  \.  (*(long *) (
56e0: 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 26 20  function + 8) & 
56f0: 30 78 66 66 66 66 66 30 30 30 29 20 3d 3d 20 30  0xfffff000) == 0
5700: 78 33 37 42 44 30 30 30 30 20 26 26 20 5c 0a 20  x37BD0000 && \. 
5710: 20 28 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e   (*(long *) (fun
5720: 63 74 69 6f 6e 20 2b 31 32 29 20 26 20 30 78 66  ction +12) & 0xf
5730: 66 66 66 66 30 30 30 29 20 3d 3d 20 30 78 33 36  ffff000) == 0x36
5740: 42 35 30 30 30 30 20 26 26 20 5c 0a 20 20 2a 28  B50000 && \.  *(
5750: 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f  long *) (functio
5760: 6e 20 2b 31 36 29 20 3d 3d 20 30 78 43 37 44 35  n +16) == 0xC7D5
5770: 43 30 31 32 20 26 26 20 5c 0a 20 20 2a 28 6c 6f  C012 && \.  *(lo
5780: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  ng *) (function 
5790: 2b 32 30 29 20 3d 3d 20 30 78 44 36 41 30 31 43  +20) == 0xD6A01C
57a0: 31 45 20 26 26 20 5c 0a 20 20 2a 28 6c 6f 6e 67  1E && \.  *(long
57b0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32   *) (function +2
57c0: 34 29 20 3d 3d 20 30 78 34 41 42 33 30 30 30 38  4) == 0x4AB30008
57d0: 20 26 26 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a   && \.  *(long *
57e0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 38 29  ) (function +28)
57f0: 20 3d 3d 20 30 78 34 41 42 35 30 30 30 30 20 26   == 0x4AB50000 &
5800: 26 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20  & \.  *(long *) 
5810: 28 66 75 6e 63 74 69 6f 6e 20 2b 33 32 29 20 3d  (function +32) =
5820: 3d 20 30 78 30 32 41 30 31 30 41 31 20 26 26 20  = 0x02A010A1 && 
5830: 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66  \.  *(long *) (f
5840: 75 6e 63 74 69 6f 6e 20 2b 33 36 29 20 3d 3d 20  unction +36) == 
5850: 30 78 30 30 30 31 31 38 32 30 20 26 26 20 5c 0a  0x00011820 && \.
5860: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e    *(long *) (fun
5870: 63 74 69 6f 6e 20 2b 34 30 29 20 3d 3d 20 30 78  ction +40) == 0x
5880: 45 32 41 30 30 30 30 32 20 26 26 20 5c 0a 20 20  E2A00002 && \.  
5890: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74  *(long *) (funct
58a0: 69 6f 6e 20 2b 34 34 29 20 3d 3d 20 30 78 30 38  ion +44) == 0x08
58b0: 30 30 30 32 34 30 0a 23 64 65 66 69 6e 65 20 68  000240.#define h
58c0: 69 6c 6f 28 68 69 77 6f 72 64 2c 6c 6f 77 6f 72  ilo(hiword,lowor
58d0: 64 29 20 20 5c 0a 20 20 28 28 61 73 73 65 6d 62  d)  \.  ((assemb
58e0: 6c 65 32 31 28 28 75 6e 73 69 67 6e 65 64 20 6c  le21((unsigned l
58f0: 6f 6e 67 29 20 28 68 69 77 6f 72 64 29 29 20 3c  ong) (hiword)) <
5900: 3c 20 31 31 29 20 7c 20 5c 0a 20 20 20 28 28 28  < 11) | \.   (((
5910: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28  unsigned long) (
5920: 6c 6f 77 6f 72 64 29 20 26 20 30 78 46 46 45 29  loword) & 0xFFE)
5930: 20 3e 3e 20 31 29 20 5c 0a 20 20 29 0a 23 64 65   >> 1) \.  ).#de
5940: 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 65  fine tramp_addre
5950: 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a  ss(function)  \.
5960: 20 20 68 69 6c 6f 28 2a 28 6c 6f 6e 67 20 2a 29    hilo(*(long *)
5970: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 2c   (function + 4),
5980: 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63   *(long *) (func
5990: 74 69 6f 6e 20 2b 31 32 29 29 0a 23 64 65 66 69  tion +12)).#defi
59a0: 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 28 66 75  ne tramp_data(fu
59b0: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c  nction)  \.  hil
59c0: 6f 28 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e  o(*(long *) (fun
59d0: 63 74 69 6f 6e 20 2b 20 30 29 2c 20 2a 28 6c 6f  ction + 0), *(lo
59e0: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  ng *) (function 
59f0: 2b 20 38 29 29 0a 23 65 6e 64 69 66 0a 23 69 66  + 8)).#endif.#if
5a00: 64 65 66 20 5f 5f 68 70 70 61 6e 65 77 5f 5f 0a  def __hppanew__.
5a10: 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20    /* function:. 
5a20: 20 20 2a 20 20 20 20 2e 6c 6f 6e 67 20 20 20 74    *    .long   t
5a30: 72 61 6d 70 5f 72 0a 20 20 20 2a 20 20 20 20 2e  ramp_r.   *    .
5a40: 6c 6f 6e 67 20 20 20 63 6c 6f 73 75 72 65 0a 20  long   closure. 
5a50: 20 20 2a 20 63 6c 6f 73 75 72 65 3a 0a 20 20 20    * closure:.   
5a60: 2a 20 20 20 20 2e 6c 6f 6e 67 20 20 20 3c 64 61  *    .long   <da
5a70: 74 61 3e 0a 20 20 20 2a 20 20 20 20 2e 6c 6f 6e  ta>.   *    .lon
5a80: 67 20 20 20 3c 61 64 64 72 65 73 73 3e 0a 20 20  g   <address>.  
5a90: 20 2a 2f 0a 20 20 7b 20 2f 2a 20 77 6f 72 6b 20   */.  { /* work 
5aa0: 61 72 6f 75 6e 64 20 61 20 62 75 67 20 69 6e 20  around a bug in 
5ab0: 67 63 63 20 33 2e 2a 20 2a 2f 0a 20 20 20 20 76  gcc 3.* */.    v
5ac0: 6f 69 64 2a 20 74 72 61 6d 70 5f 72 5f 61 64 64  oid* tramp_r_add
5ad0: 72 65 73 73 20 3d 20 26 74 72 61 6d 70 5f 72 3b  ress = &tramp_r;
5ae0: 0a 20 20 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28  .    *(long *) (
5af0: 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20  function + 0) = 
5b00: 28 28 6c 6f 6e 67 20 2a 29 20 28 28 63 68 61 72  ((long *) ((char
5b10: 2a 29 74 72 61 6d 70 5f 72 5f 61 64 64 72 65 73  *)tramp_r_addres
5b20: 73 2d 32 29 29 5b 30 5d 3b 0a 20 20 20 20 2a 28  s-2))[0];.    *(
5b30: 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f  long *) (functio
5b40: 6e 20 2b 20 34 29 20 3d 20 28 6c 6f 6e 67 29 20  n + 4) = (long) 
5b50: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 3b 0a  (function + 8);.
5b60: 20 20 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66      *(long *) (f
5b70: 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 28  unction + 8) = (
5b80: 6c 6f 6e 67 29 20 64 61 74 61 3b 0a 20 20 20 20  long) data;.    
5b90: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74  *(long *) (funct
5ba0: 69 6f 6e 20 2b 31 32 29 20 3d 20 28 6c 6f 6e 67  ion +12) = (long
5bb0: 29 20 61 64 64 72 65 73 73 3b 0a 20 20 7d 0a 23  ) address;.  }.#
5bc0: 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 28  define is_tramp(
5bd0: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28  function)  \.  (
5be0: 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f  (long *) functio
5bf0: 6e 29 5b 30 5d 20 3d 3d 20 28 28 6c 6f 6e 67 20  n)[0] == ((long 
5c00: 2a 29 20 28 28 63 68 61 72 2a 29 74 72 61 6d 70  *) ((char*)tramp
5c10: 5f 72 5f 61 64 64 72 65 73 73 2d 32 29 29 5b 30  _r_address-2))[0
5c20: 5d 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f  ].#define tramp_
5c30: 61 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e  address(function
5c40: 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29  )  \.  ((long *)
5c50: 20 66 75 6e 63 74 69 6f 6e 29 5b 33 5d 0a 23 64   function)[3].#d
5c60: 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61  efine tramp_data
5c70: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20  (function)  \.  
5c80: 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69  ((long *) functi
5c90: 6f 6e 29 5b 32 5d 0a 23 65 6e 64 69 66 0a 23 69  on)[2].#endif.#i
5ca0: 66 64 65 66 20 5f 5f 61 72 6d 5f 5f 0a 20 20 2f  fdef __arm__.  /
5cb0: 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a  * function:.   *
5cc0: 09 61 64 64 09 72 31 32 2c 70 63 2c 23 38 09 09  .add.r12,pc,#8..
5cd0: 09 45 32 38 46 43 30 30 38 0a 20 20 20 2a 09 6c  .E28FC008.   *.l
5ce0: 64 72 09 70 63 2c 5b 70 63 5d 09 09 09 09 45 35  dr.pc,[pc]....E5
5cf0: 39 46 46 30 30 30 0a 20 20 20 2a 20 5f 64 61 74  9FF000.   * _dat
5d00: 61 3a 0a 20 20 20 2a 09 2e 77 6f 72 64 09 3c 64  a:.   *..word.<d
5d10: 61 74 61 3e 0a 20 20 20 2a 20 5f 66 75 6e 63 74  ata>.   * _funct
5d20: 69 6f 6e 3a 0a 20 20 20 2a 09 2e 77 6f 72 64 09  ion:.   *..word.
5d30: 3c 61 64 64 72 65 73 73 3e 0a 20 20 20 2a 2f 0a  <address>.   */.
5d40: 20 20 7b 0a 20 20 20 20 28 28 6c 6f 6e 67 20 2a    {.    ((long *
5d50: 29 20 66 75 6e 63 74 69 6f 6e 29 5b 30 5d 20 3d  ) function)[0] =
5d60: 20 30 78 45 32 38 46 43 30 30 38 3b 0a 20 20 20   0xE28FC008;.   
5d70: 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74   ((long *) funct
5d80: 69 6f 6e 29 5b 31 5d 20 3d 20 30 78 45 35 39 46  ion)[1] = 0xE59F
5d90: 46 30 30 30 3b 0a 20 20 20 20 28 28 6c 6f 6e 67  F000;.    ((long
5da0: 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 32 5d   *) function)[2]
5db0: 20 3d 20 28 6c 6f 6e 67 29 20 64 61 74 61 3b 0a   = (long) data;.
5dc0: 20 20 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75      ((long *) fu
5dd0: 6e 63 74 69 6f 6e 29 5b 33 5d 20 3d 20 28 6c 6f  nction)[3] = (lo
5de0: 6e 67 29 20 61 64 64 72 65 73 73 3b 0a 20 20 7d  ng) address;.  }
5df0: 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d  .#define is_tram
5e00: 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20  p(function)  \. 
5e10: 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74   ((long *) funct
5e20: 69 6f 6e 29 5b 30 5d 20 3d 3d 20 30 78 45 32 38  ion)[0] == 0xE28
5e30: 46 43 30 30 38 20 26 26 20 5c 0a 20 20 28 28 6c  FC008 && \.  ((l
5e40: 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29  ong *) function)
5e50: 5b 31 5d 20 3d 3d 20 30 78 45 35 39 46 46 30 30  [1] == 0xE59FF00
5e60: 30 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f  0.#define tramp_
5e70: 61 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e  address(function
5e80: 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29  )  \.  ((long *)
5e90: 20 66 75 6e 63 74 69 6f 6e 29 5b 33 5d 0a 23 64   function)[3].#d
5ea0: 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61  efine tramp_data
5eb0: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20  (function)  \.  
5ec0: 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69  ((long *) functi
5ed0: 6f 6e 29 5b 32 5d 0a 23 65 6e 64 69 66 0a 23 69  on)[2].#endif.#i
5ee0: 66 64 65 66 20 5f 5f 70 6f 77 65 72 70 63 73 79  fdef __powerpcsy
5ef0: 73 76 34 5f 5f 0a 23 69 66 64 65 66 20 5f 5f 4e  sv4__.#ifdef __N
5f00: 65 74 42 53 44 5f 5f 0a 20 20 2f 2a 20 66 75 6e  etBSD__.  /* fun
5f10: 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 7b  ction:.   *    {
5f20: 6c 69 75 7c 6c 69 73 7d 20 31 33 2c 68 69 31 36  liu|lis} 13,hi16
5f30: 28 3c 64 61 74 61 3e 29 09 09 33 44 20 41 30 20  (<data>)..3D A0 
5f40: 68 69 31 36 28 3c 64 61 74 61 3e 29 0a 20 20 20  hi16(<data>).   
5f50: 2a 20 20 20 20 7b 6f 72 69 6c 7c 6f 72 69 7d 20  *    {oril|ori} 
5f60: 31 33 2c 31 33 2c 6c 6f 31 36 28 3c 64 61 74 61  13,13,lo16(<data
5f70: 3e 29 09 09 36 31 20 41 44 20 6c 6f 31 36 28 3c  >)..61 AD lo16(<
5f80: 64 61 74 61 3e 29 0a 20 20 20 2a 20 20 20 20 7b  data>).   *    {
5f90: 6c 69 75 7c 6c 69 73 7d 20 30 2c 68 69 31 36 28  liu|lis} 0,hi16(
5fa0: 3c 61 64 64 72 65 73 73 3e 29 09 09 33 43 20 30  <address>)..3C 0
5fb0: 30 20 68 69 31 36 28 3c 61 64 64 72 65 73 73 3e  0 hi16(<address>
5fc0: 29 0a 20 20 20 2a 20 20 20 20 7b 6f 72 69 6c 7c  ).   *    {oril|
5fd0: 6f 72 69 7d 20 30 2c 30 2c 6c 6f 31 36 28 3c 61  ori} 0,0,lo16(<a
5fe0: 64 64 72 65 73 73 3e 29 09 09 36 30 20 30 30 20  ddress>)..60 00 
5ff0: 6c 6f 31 36 28 3c 61 64 64 72 65 73 73 3e 29 0a  lo16(<address>).
6000: 20 20 20 2a 20 20 20 20 6d 74 63 74 72 20 30 09     *    mtctr 0.
6010: 09 09 09 09 37 43 20 30 39 20 30 33 20 41 36 0a  ....7C 09 03 A6.
6020: 20 20 20 2a 20 20 20 20 62 63 74 72 09 09 09 09     *    bctr....
6030: 09 34 45 20 38 30 20 30 34 20 32 30 0a 20 20 20  .4E 80 04 20.   
6040: 2a 2f 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20  */.  *(short *) 
6050: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d  (function + 0) =
6060: 20 30 78 33 44 41 30 3b 0a 20 20 2a 28 73 68 6f   0x3DA0;.  *(sho
6070: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
6080: 2b 20 32 29 20 3d 20 28 75 6e 73 69 67 6e 65 64  + 2) = (unsigned
6090: 20 6c 6f 6e 67 29 20 64 61 74 61 20 3e 3e 20 31   long) data >> 1
60a0: 36 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20  6;.  *(short *) 
60b0: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d  (function + 4) =
60c0: 20 30 78 36 31 41 44 3b 0a 20 20 2a 28 73 68 6f   0x61AD;.  *(sho
60d0: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
60e0: 2b 20 36 29 20 3d 20 28 75 6e 73 69 67 6e 65 64  + 6) = (unsigned
60f0: 20 6c 6f 6e 67 29 20 64 61 74 61 20 26 20 30 78   long) data & 0x
6100: 66 66 66 66 3b 0a 20 20 2a 28 73 68 6f 72 74 20  ffff;.  *(short 
6110: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38  *) (function + 8
6120: 29 20 3d 20 30 78 33 43 30 30 3b 0a 20 20 2a 28  ) = 0x3C00;.  *(
6130: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
6140: 6f 6e 20 2b 31 30 29 20 3d 20 28 75 6e 73 69 67  on +10) = (unsig
6150: 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64 72 65 73  ned long) addres
6160: 73 20 3e 3e 20 31 36 3b 0a 20 20 2a 28 73 68 6f  s >> 16;.  *(sho
6170: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
6180: 2b 31 32 29 20 3d 20 30 78 36 30 30 30 3b 0a 20  +12) = 0x6000;. 
6190: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e   *(short *) (fun
61a0: 63 74 69 6f 6e 20 2b 31 34 29 20 3d 20 28 75 6e  ction +14) = (un
61b0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64  signed long) add
61c0: 72 65 73 73 20 26 20 30 78 66 66 66 66 3b 0a 20  ress & 0xffff;. 
61d0: 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e   *(long *)  (fun
61e0: 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20 30 78 37  ction +16) = 0x7
61f0: 43 30 39 30 33 41 36 3b 0a 20 20 2a 28 6c 6f 6e  C0903A6;.  *(lon
6200: 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20  g *)  (function 
6210: 2b 32 30 29 20 3d 20 30 78 34 45 38 30 30 34 32  +20) = 0x4E80042
6220: 30 3b 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72  0;.#define is_tr
6230: 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c  amp(function)  \
6240: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68  .  *(unsigned sh
6250: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ort *) (function
6260: 20 2b 20 30 29 20 3d 3d 20 30 78 33 44 41 30 20   + 0) == 0x3DA0 
6270: 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65  && \.  *(unsigne
6280: 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63  d short *) (func
6290: 74 69 6f 6e 20 2b 20 34 29 20 3d 3d 20 30 78 36  tion + 4) == 0x6
62a0: 31 41 44 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73  1AD && \.  *(uns
62b0: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28  igned short *) (
62c0: 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 3d  function + 8) ==
62d0: 20 30 78 33 43 30 30 20 26 26 20 5c 0a 20 20 2a   0x3C00 && \.  *
62e0: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20  (unsigned short 
62f0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32  *) (function +12
6300: 29 20 3d 3d 20 30 78 36 30 30 30 20 26 26 20 5c  ) == 0x6000 && \
6310: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .  *(unsigned lo
6320: 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e  ng *)  (function
6330: 20 2b 31 36 29 20 3d 3d 20 30 78 37 43 30 39 30   +16) == 0x7C090
6340: 33 41 36 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73  3A6 && \.  *(uns
6350: 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 29 20 20 28  igned long *)  (
6360: 66 75 6e 63 74 69 6f 6e 20 2b 32 30 29 20 3d 3d  function +20) ==
6370: 20 30 78 34 45 38 30 30 34 32 30 0a 23 65 6c 73   0x4E800420.#els
6380: 65 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a  e.  /* function:
6390: 0a 20 20 20 2a 20 20 20 20 7b 6c 69 75 7c 6c 69  .   *    {liu|li
63a0: 73 7d 20 31 31 2c 68 69 31 36 28 3c 64 61 74 61  s} 11,hi16(<data
63b0: 3e 29 09 09 33 44 20 36 30 20 68 69 31 36 28 3c  >)..3D 60 hi16(<
63c0: 64 61 74 61 3e 29 0a 20 20 20 2a 20 20 20 20 7b  data>).   *    {
63d0: 6f 72 69 6c 7c 6f 72 69 7d 20 31 31 2c 31 31 2c  oril|ori} 11,11,
63e0: 6c 6f 31 36 28 3c 64 61 74 61 3e 29 09 09 36 31  lo16(<data>)..61
63f0: 20 36 42 20 6c 6f 31 36 28 3c 64 61 74 61 3e 29   6B lo16(<data>)
6400: 0a 20 20 20 2a 20 20 20 20 7b 6c 69 75 7c 6c 69  .   *    {liu|li
6410: 73 7d 20 30 2c 68 69 31 36 28 3c 61 64 64 72 65  s} 0,hi16(<addre
6420: 73 73 3e 29 09 09 33 43 20 30 30 20 68 69 31 36  ss>)..3C 00 hi16
6430: 28 3c 61 64 64 72 65 73 73 3e 29 0a 20 20 20 2a  (<address>).   *
6440: 20 20 20 20 7b 6f 72 69 6c 7c 6f 72 69 7d 20 30      {oril|ori} 0
6450: 2c 30 2c 6c 6f 31 36 28 3c 61 64 64 72 65 73 73  ,0,lo16(<address
6460: 3e 29 09 09 36 30 20 30 30 20 6c 6f 31 36 28 3c  >)..60 00 lo16(<
6470: 61 64 64 72 65 73 73 3e 29 0a 20 20 20 2a 20 20  address>).   *  
6480: 20 20 6d 74 63 74 72 20 30 09 09 09 09 09 37 43    mtctr 0.....7C
6490: 20 30 39 20 30 33 20 41 36 0a 20 20 20 2a 20 20   09 03 A6.   *  
64a0: 20 20 62 63 74 72 09 09 09 09 09 34 45 20 38 30    bctr.....4E 80
64b0: 20 30 34 20 32 30 0a 20 20 20 2a 2f 0a 20 20 2a   04 20.   */.  *
64c0: 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74  (short *) (funct
64d0: 69 6f 6e 20 2b 20 30 29 20 3d 20 30 78 33 44 36  ion + 0) = 0x3D6
64e0: 30 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20  0;.  *(short *) 
64f0: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 32 29 20 3d  (function + 2) =
6500: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
6510: 20 64 61 74 61 20 3e 3e 20 31 36 3b 0a 20 20 2a   data >> 16;.  *
6520: 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74  (short *) (funct
6530: 69 6f 6e 20 2b 20 34 29 20 3d 20 30 78 36 31 36  ion + 4) = 0x616
6540: 42 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20  B;.  *(short *) 
6550: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 36 29 20 3d  (function + 6) =
6560: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
6570: 20 64 61 74 61 20 26 20 30 78 66 66 66 66 3b 0a   data & 0xffff;.
6580: 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75    *(short *) (fu
6590: 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 30 78  nction + 8) = 0x
65a0: 33 43 30 30 3b 0a 20 20 2a 28 73 68 6f 72 74 20  3C00;.  *(short 
65b0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 30  *) (function +10
65c0: 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ) = (unsigned lo
65d0: 6e 67 29 20 61 64 64 72 65 73 73 20 3e 3e 20 31  ng) address >> 1
65e0: 36 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20  6;.  *(short *) 
65f0: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d  (function +12) =
6600: 20 30 78 36 30 30 30 3b 0a 20 20 2a 28 73 68 6f   0x6000;.  *(sho
6610: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
6620: 2b 31 34 29 20 3d 20 28 75 6e 73 69 67 6e 65 64  +14) = (unsigned
6630: 20 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 20 26   long) address &
6640: 20 30 78 66 66 66 66 3b 0a 20 20 2a 28 6c 6f 6e   0xffff;.  *(lon
6650: 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20  g *)  (function 
6660: 2b 31 36 29 20 3d 20 30 78 37 43 30 39 30 33 41  +16) = 0x7C0903A
6670: 36 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20  6;.  *(long *)  
6680: 28 66 75 6e 63 74 69 6f 6e 20 2b 32 30 29 20 3d  (function +20) =
6690: 20 30 78 34 45 38 30 30 34 32 30 3b 0a 23 64 65   0x4E800420;.#de
66a0: 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 28 66 75  fine is_tramp(fu
66b0: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 75  nction)  \.  *(u
66c0: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29  nsigned short *)
66d0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20   (function + 0) 
66e0: 3d 3d 20 30 78 33 44 36 30 20 26 26 20 5c 0a 20  == 0x3D60 && \. 
66f0: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72   *(unsigned shor
6700: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
6710: 20 34 29 20 3d 3d 20 30 78 36 31 36 42 20 26 26   4) == 0x616B &&
6720: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20   \.  *(unsigned 
6730: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
6740: 6f 6e 20 2b 20 38 29 20 3d 3d 20 30 78 33 43 30  on + 8) == 0x3C0
6750: 30 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67  0 && \.  *(unsig
6760: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75  ned short *) (fu
6770: 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d 3d 20 30  nction +12) == 0
6780: 78 36 30 30 30 20 26 26 20 5c 0a 20 20 2a 28 75  x6000 && \.  *(u
6790: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 29 20  nsigned long *) 
67a0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20   (function +16) 
67b0: 3d 3d 20 30 78 37 43 30 39 30 33 41 36 20 26 26  == 0x7C0903A6 &&
67c0: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20   \.  *(unsigned 
67d0: 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69  long *)  (functi
67e0: 6f 6e 20 2b 32 30 29 20 3d 3d 20 30 78 34 45 38  on +20) == 0x4E8
67f0: 30 30 34 32 30 0a 23 65 6e 64 69 66 0a 23 64 65  00420.#endif.#de
6800: 66 69 6e 65 20 68 69 6c 6f 28 68 69 77 6f 72 64  fine hilo(hiword
6810: 2c 6c 6f 77 6f 72 64 29 20 20 5c 0a 20 20 28 28  ,loword)  \.  ((
6820: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
6830: 28 68 69 77 6f 72 64 29 20 3c 3c 20 31 36 29 20  (hiword) << 16) 
6840: 7c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  | (unsigned long
6850: 29 20 28 6c 6f 77 6f 72 64 29 29 0a 23 64 65 66  ) (loword)).#def
6860: 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 65 73  ine tramp_addres
6870: 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20  s(function)  \. 
6880: 20 68 69 6c 6f 28 2a 28 75 6e 73 69 67 6e 65 64   hilo(*(unsigned
6890: 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74   short *) (funct
68a0: 69 6f 6e 20 2b 31 30 29 2c 20 2a 28 75 6e 73 69  ion +10), *(unsi
68b0: 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66  gned short *) (f
68c0: 75 6e 63 74 69 6f 6e 20 2b 31 34 29 29 0a 23 64  unction +14)).#d
68d0: 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61  efine tramp_data
68e0: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20  (function)  \.  
68f0: 68 69 6c 6f 28 2a 28 75 6e 73 69 67 6e 65 64 20  hilo(*(unsigned 
6900: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
6910: 6f 6e 20 2b 20 32 29 2c 20 2a 28 75 6e 73 69 67  on + 2), *(unsig
6920: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75  ned short *) (fu
6930: 6e 63 74 69 6f 6e 20 2b 20 36 29 29 0a 23 65 6e  nction + 6)).#en
6940: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 70 6f 77  dif.#ifdef __pow
6950: 65 72 70 63 61 69 78 5f 5f 0a 20 20 2f 2a 20 66  erpcaix__.  /* f
6960: 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20  unction:.   *   
6970: 20 2e 6c 6f 6e 67 20 2e 74 72 61 6d 70 5f 72 0a   .long .tramp_r.
6980: 20 20 20 2a 20 20 20 20 2e 6c 6f 6e 67 20 2e 6d     *    .long .m
6990: 79 74 6f 63 0a 20 20 20 2a 20 20 20 20 2e 6c 6f  ytoc.   *    .lo
69a0: 6e 67 20 30 0a 20 20 20 2a 20 2e 6d 79 74 6f 63  ng 0.   * .mytoc
69b0: 3a 0a 20 20 20 2a 20 20 20 20 2e 6c 6f 6e 67 20  :.   *    .long 
69c0: 3c 64 61 74 61 3e 0a 20 20 20 2a 20 20 20 20 2e  <data>.   *    .
69d0: 6c 6f 6e 67 20 3c 61 64 64 72 65 73 73 3e 0a 20  long <address>. 
69e0: 20 20 2a 2f 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29    */.  *(long *)
69f0: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29    (function + 0)
6a00: 20 3d 20 28 28 6c 6f 6e 67 20 2a 29 20 26 74 72   = ((long *) &tr
6a10: 61 6d 70 5f 72 29 5b 30 5d 3b 0a 20 20 2a 28 6c  amp_r)[0];.  *(l
6a20: 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f  ong *)  (functio
6a30: 6e 20 2b 20 34 29 20 3d 20 28 6c 6f 6e 67 29 20  n + 4) = (long) 
6a40: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 31 32 29 3b  (function + 12);
6a50: 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66  .  *(long *)  (f
6a60: 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 30  unction + 8) = 0
6a70: 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28  ;.  *(long *)  (
6a80: 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d 20  function +12) = 
6a90: 28 6c 6f 6e 67 29 20 64 61 74 61 3b 0a 20 20 2a  (long) data;.  *
6aa0: 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74  (long *)  (funct
6ab0: 69 6f 6e 20 2b 31 36 29 20 3d 20 28 6c 6f 6e 67  ion +16) = (long
6ac0: 29 20 61 64 64 72 65 73 73 3b 0a 23 64 65 66 69  ) address;.#defi
6ad0: 6e 65 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63  ne is_tramp(func
6ae0: 74 69 6f 6e 29 20 20 5c 0a 20 20 28 28 6c 6f 6e  tion)  \.  ((lon
6af0: 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 30  g *) function)[0
6b00: 5d 20 3d 3d 20 28 28 6c 6f 6e 67 20 2a 29 20 26  ] == ((long *) &
6b10: 74 72 61 6d 70 5f 72 29 5b 30 5d 0a 23 64 65 66  tramp_r)[0].#def
6b20: 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 65 73  ine tramp_addres
6b30: 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20  s(function)  \. 
6b40: 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74   ((long *) funct
6b50: 69 6f 6e 29 5b 34 5d 0a 23 64 65 66 69 6e 65 20  ion)[4].#define 
6b60: 74 72 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 74  tramp_data(funct
6b70: 69 6f 6e 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67  ion)  \.  ((long
6b80: 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 33 5d   *) function)[3]
6b90: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f  .#endif.#ifdef _
6ba0: 5f 70 6f 77 65 72 70 63 36 34 61 69 78 5f 5f 0a  _powerpc64aix__.
6bb0: 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20    /* function:. 
6bc0: 20 20 2a 20 20 20 20 2e 71 75 61 64 20 2e 74 72    *    .quad .tr
6bd0: 61 6d 70 5f 72 0a 20 20 20 2a 20 20 20 20 2e 71  amp_r.   *    .q
6be0: 75 61 64 20 2e 6d 79 74 6f 63 0a 20 20 20 2a 20  uad .mytoc.   * 
6bf0: 20 20 20 2e 71 75 61 64 20 30 0a 20 20 20 2a 20     .quad 0.   * 
6c00: 2e 6d 79 74 6f 63 3a 0a 20 20 20 2a 20 20 20 20  .mytoc:.   *    
6c10: 2e 71 75 61 64 20 3c 64 61 74 61 3e 0a 20 20 20  .quad <data>.   
6c20: 2a 20 20 20 20 2e 71 75 61 64 20 3c 61 64 64 72  *    .quad <addr
6c30: 65 73 73 3e 0a 20 20 20 2a 2f 0a 20 20 2a 28 6c  ess>.   */.  *(l
6c40: 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f  ong *)  (functio
6c50: 6e 20 2b 20 30 29 20 3d 20 28 28 6c 6f 6e 67 20  n + 0) = ((long 
6c60: 2a 29 20 26 74 72 61 6d 70 5f 72 29 5b 30 5d 3b  *) &tramp_r)[0];
6c70: 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66  .  *(long *)  (f
6c80: 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 28  unction + 8) = (
6c90: 6c 6f 6e 67 29 20 28 66 75 6e 63 74 69 6f 6e 20  long) (function 
6ca0: 2b 20 32 34 29 3b 0a 20 20 2a 28 6c 6f 6e 67 20  + 24);.  *(long 
6cb0: 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31  *)  (function +1
6cc0: 36 29 20 3d 20 30 3b 0a 20 20 2a 28 6c 6f 6e 67  6) = 0;.  *(long
6cd0: 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b   *)  (function +
6ce0: 32 34 29 20 3d 20 28 6c 6f 6e 67 29 20 64 61 74  24) = (long) dat
6cf0: 61 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20  a;.  *(long *)  
6d00: 28 66 75 6e 63 74 69 6f 6e 20 2b 33 32 29 20 3d  (function +32) =
6d10: 20 28 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 3b   (long) address;
6d20: 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d  .#define is_tram
6d30: 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20  p(function)  \. 
6d40: 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74   ((long *) funct
6d50: 69 6f 6e 29 5b 30 5d 20 3d 3d 20 28 28 6c 6f 6e  ion)[0] == ((lon
6d60: 67 20 2a 29 20 26 74 72 61 6d 70 5f 72 29 5b 30  g *) &tramp_r)[0
6d70: 5d 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f  ].#define tramp_
6d80: 61 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e  address(function
6d90: 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29  )  \.  ((long *)
6da0: 20 66 75 6e 63 74 69 6f 6e 29 5b 34 5d 0a 23 64   function)[4].#d
6db0: 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61  efine tramp_data
6dc0: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20  (function)  \.  
6dd0: 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69  ((long *) functi
6de0: 6f 6e 29 5b 33 5d 0a 23 65 6e 64 69 66 0a 23 69  on)[3].#endif.#i
6df0: 66 64 65 66 20 5f 5f 6d 38 38 6b 5f 5f 0a 20 20  fdef __m88k__.  
6e00: 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20  /* function:.   
6e10: 2a 20 20 20 20 6f 72 2e 75 20 20 20 20 23 72 31  *    or.u    #r1
6e20: 31 2c 23 72 30 2c 68 69 31 36 28 3c 64 61 74 61  1,#r0,hi16(<data
6e30: 3e 29 09 09 35 44 20 36 30 20 68 69 31 36 28 3c  >)..5D 60 hi16(<
6e40: 64 61 74 61 3e 29 0a 20 20 20 2a 20 20 20 20 6f  data>).   *    o
6e50: 72 20 20 20 20 20 20 23 72 31 31 2c 23 72 31 31  r      #r11,#r11
6e60: 2c 6c 6f 31 36 28 3c 64 61 74 61 3e 29 09 09 35  ,lo16(<data>)..5
6e70: 39 20 36 42 20 6c 6f 31 36 28 3c 64 61 74 61 3e  9 6B lo16(<data>
6e80: 29 0a 20 20 20 2a 20 20 20 20 6f 72 2e 75 20 20  ).   *    or.u  
6e90: 20 20 23 72 31 33 2c 23 72 30 2c 68 69 31 36 28    #r13,#r0,hi16(
6ea0: 3c 61 64 64 72 65 73 73 3e 29 09 35 44 20 41 30  <address>).5D A0
6eb0: 20 68 69 31 36 28 3c 61 64 64 72 65 73 73 3e 29   hi16(<address>)
6ec0: 0a 20 20 20 2a 20 20 20 20 6f 72 20 20 20 20 20  .   *    or     
6ed0: 20 23 72 31 33 2c 23 72 31 33 2c 6c 6f 31 36 28   #r13,#r13,lo16(
6ee0: 3c 61 64 64 72 65 73 73 3e 29 09 35 39 20 41 44  <address>).59 AD
6ef0: 20 6c 6f 31 36 28 3c 61 64 64 72 65 73 73 3e 29   lo16(<address>)
6f00: 0a 20 20 20 2a 20 20 20 20 6a 6d 70 20 20 20 20  .   *    jmp    
6f10: 20 23 72 31 33 09 09 09 09 46 34 20 30 30 20 43   #r13....F4 00 C
6f20: 30 20 30 44 0a 20 20 20 2a 2f 0a 20 20 2a 28 73  0 0D.   */.  *(s
6f30: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
6f40: 6e 20 2b 20 30 29 20 3d 20 30 78 35 44 36 30 3b  n + 0) = 0x5D60;
6f50: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66  .  *(short *) (f
6f60: 75 6e 63 74 69 6f 6e 20 2b 20 32 29 20 3d 20 28  unction + 2) = (
6f70: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64  unsigned long) d
6f80: 61 74 61 20 3e 3e 20 31 36 3b 0a 20 20 2a 28 73  ata >> 16;.  *(s
6f90: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
6fa0: 6e 20 2b 20 34 29 20 3d 20 30 78 35 39 36 42 3b  n + 4) = 0x596B;
6fb0: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66  .  *(short *) (f
6fc0: 75 6e 63 74 69 6f 6e 20 2b 20 36 29 20 3d 20 28  unction + 6) = (
6fd0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64  unsigned long) d
6fe0: 61 74 61 20 26 20 30 78 66 66 66 66 3b 0a 20 20  ata & 0xffff;.  
6ff0: 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63  *(short *) (func
7000: 74 69 6f 6e 20 2b 20 38 29 20 3d 20 30 78 35 44  tion + 8) = 0x5D
7010: 41 30 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29  A0;.  *(short *)
7020: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 30 29 20   (function +10) 
7030: 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  = (unsigned long
7040: 29 20 61 64 64 72 65 73 73 20 3e 3e 20 31 36 3b  ) address >> 16;
7050: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66  .  *(short *) (f
7060: 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d 20 30  unction +12) = 0
7070: 78 35 39 41 44 3b 0a 20 20 2a 28 73 68 6f 72 74  x59AD;.  *(short
7080: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31   *) (function +1
7090: 34 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c  4) = (unsigned l
70a0: 6f 6e 67 29 20 61 64 64 72 65 73 73 20 26 20 30  ong) address & 0
70b0: 78 66 66 66 66 3b 0a 20 20 2a 28 6c 6f 6e 67 20  xffff;.  *(long 
70c0: 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31  *)  (function +1
70d0: 36 29 20 3d 20 30 78 46 34 30 30 43 30 30 44 3b  6) = 0xF400C00D;
70e0: 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d  .#define is_tram
70f0: 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20  p(function)  \. 
7100: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72   *(unsigned shor
7110: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
7120: 20 30 29 20 3d 3d 20 30 78 35 44 36 30 20 26 26   0) == 0x5D60 &&
7130: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20   \.  *(unsigned 
7140: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
7150: 6f 6e 20 2b 20 34 29 20 3d 3d 20 30 78 35 39 36  on + 4) == 0x596
7160: 42 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67  B && \.  *(unsig
7170: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75  ned short *) (fu
7180: 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 3d 20 30  nction + 8) == 0
7190: 78 35 44 41 30 20 26 26 20 5c 0a 20 20 2a 28 75  x5DA0 && \.  *(u
71a0: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29  nsigned short *)
71b0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20   (function +12) 
71c0: 3d 3d 20 30 78 35 39 41 44 20 26 26 20 5c 0a 20  == 0x59AD && \. 
71d0: 20 2a 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67   *(unsigned long
71e0: 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b   *)  (function +
71f0: 31 36 29 20 3d 3d 20 30 78 46 34 30 30 43 30 30  16) == 0xF400C00
7200: 44 0a 23 64 65 66 69 6e 65 20 68 69 6c 6f 28 68  D.#define hilo(h
7210: 69 77 6f 72 64 2c 6c 6f 77 6f 72 64 29 20 20 5c  iword,loword)  \
7220: 0a 20 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c  .  (((unsigned l
7230: 6f 6e 67 29 20 28 68 69 77 6f 72 64 29 20 3c 3c  ong) (hiword) <<
7240: 20 31 36 29 20 7c 20 28 75 6e 73 69 67 6e 65 64   16) | (unsigned
7250: 20 6c 6f 6e 67 29 20 28 6c 6f 77 6f 72 64 29 29   long) (loword))
7260: 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 61  .#define tramp_a
7270: 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e 29  ddress(function)
7280: 20 20 5c 0a 20 20 68 69 6c 6f 28 2a 28 75 6e 73    \.  hilo(*(uns
7290: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28  igned short *) (
72a0: 66 75 6e 63 74 69 6f 6e 20 2b 31 30 29 2c 20 2a  function +10), *
72b0: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20  (unsigned short 
72c0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 34  *) (function +14
72d0: 29 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70  )).#define tramp
72e0: 5f 64 61 74 61 28 66 75 6e 63 74 69 6f 6e 29 20  _data(function) 
72f0: 20 5c 0a 20 20 68 69 6c 6f 28 2a 28 75 6e 73 69   \.  hilo(*(unsi
7300: 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66  gned short *) (f
7310: 75 6e 63 74 69 6f 6e 20 2b 20 32 29 2c 20 2a 28  unction + 2), *(
7320: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a  unsigned short *
7330: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 36 29  ) (function + 6)
7340: 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ).#endif.#ifdef 
7350: 5f 5f 63 6f 6e 76 65 78 5f 5f 0a 20 20 2f 2a 20  __convex__.  /* 
7360: 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20  function:.   *  
7370: 20 20 6c 64 2e 77 20 23 3c 64 61 74 61 3e 2c 73    ld.w #<data>,s
7380: 30 09 09 09 09 3f 3f 3f 3f 20 3c 64 61 74 61 3e  0....???? <data>
7390: 0a 20 20 20 2a 20 20 20 20 6a 6d 70 20 3c 61 64  .   *    jmp <ad
73a0: 64 72 65 73 73 3e 09 09 09 09 30 31 34 30 20 3c  dress>....0140 <
73b0: 61 64 64 72 65 73 73 3e 0a 20 20 20 2a 20 20 20  address>.   *   
73c0: 20 64 73 2e 68 20 30 09 09 09 09 09 30 30 30 30   ds.h 0.....0000
73d0: 0a 20 20 20 2a 2f 0a 20 20 2a 28 73 68 6f 72 74  .   */.  *(short
73e0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20   *) (function + 
73f0: 30 29 20 3d 20 30 78 3f 3f 3f 3f 3b 0a 20 20 2a  0) = 0x????;.  *
7400: 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74  (long *)  (funct
7410: 69 6f 6e 20 2b 20 32 29 20 3d 20 28 75 6e 73 69  ion + 2) = (unsi
7420: 67 6e 65 64 20 6c 6f 6e 67 29 20 64 61 74 61 3b  gned long) data;
7430: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66  .  *(short *) (f
7440: 75 6e 63 74 69 6f 6e 20 2b 20 36 29 20 3d 20 30  unction + 6) = 0
7450: 78 30 31 34 30 3b 0a 20 20 2a 28 6c 6f 6e 67 20  x0140;.  *(long 
7460: 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20  *)  (function + 
7470: 38 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c  8) = (unsigned l
7480: 6f 6e 67 29 20 61 64 64 72 65 73 73 3b 0a 20 20  ong) address;.  
7490: 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63  *(short *) (func
74a0: 74 69 6f 6e 20 2b 31 32 29 20 3d 20 30 78 30 30  tion +12) = 0x00
74b0: 30 30 3b 0a 23 64 65 66 69 6e 65 20 69 73 5f 74  00;.#define is_t
74c0: 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20 20  ramp(function)  
74d0: 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73  \.  *(unsigned s
74e0: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
74f0: 6e 20 2b 20 30 29 20 3d 3d 20 30 78 3f 3f 3f 3f  n + 0) == 0x????
7500: 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e   && \.  *(unsign
7510: 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e  ed short *) (fun
7520: 63 74 69 6f 6e 20 2b 20 36 29 20 3d 3d 20 30 78  ction + 6) == 0x
7530: 30 31 34 30 20 26 26 20 5c 0a 20 20 2a 28 75 6e  0140 && \.  *(un
7540: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20  signed short *) 
7550: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d  (function +12) =
7560: 3d 20 30 78 30 30 30 30 0a 23 64 65 66 69 6e 65  = 0x0000.#define
7570: 20 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66   tramp_address(f
7580: 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28  unction)  \.  *(
7590: 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69  long *)  (functi
75a0: 6f 6e 20 2b 20 38 29 0a 23 64 65 66 69 6e 65 20  on + 8).#define 
75b0: 74 72 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 74  tramp_data(funct
75c0: 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 6c 6f 6e 67  ion)  \.  *(long
75d0: 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b   *)  (function +
75e0: 20 32 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   2).#endif.#ifde
75f0: 66 20 5f 5f 69 61 36 34 5f 5f 0a 20 20 2f 2a 20  f __ia64__.  /* 
7600: 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20  function:.   *  
7610: 20 20 64 61 74 61 38 20 20 20 74 72 61 6d 70 5f    data8   tramp_
7620: 72 0a 20 20 20 2a 20 20 20 20 64 61 74 61 38 20  r.   *    data8 
7630: 20 20 63 6c 6f 73 75 72 65 0a 20 20 20 2a 20 63    closure.   * c
7640: 6c 6f 73 75 72 65 3a 0a 20 20 20 2a 20 20 20 20  losure:.   *    
7650: 64 61 74 61 38 20 20 20 3c 61 64 64 72 65 73 73  data8   <address
7660: 3e 0a 20 20 20 2a 20 20 20 20 64 61 74 61 38 20  >.   *    data8 
7670: 20 20 3c 64 61 74 61 3e 0a 20 20 20 2a 2f 0a 20    <data>.   */. 
7680: 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63   *(long *) (func
7690: 74 69 6f 6e 20 2b 20 30 29 20 3d 20 28 6c 6f 6e  tion + 0) = (lon
76a0: 67 29 20 26 74 72 61 6d 70 5f 72 3b 0a 20 20 2a  g) &tramp_r;.  *
76b0: 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69  (long *) (functi
76c0: 6f 6e 20 2b 20 38 29 20 3d 20 28 6c 6f 6e 67 29  on + 8) = (long)
76d0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 31 36 29   (function + 16)
76e0: 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66  ;.  *(long *) (f
76f0: 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20 28  unction +16) = (
7700: 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 3b 0a 20  long) address;. 
7710: 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63   *(long *) (func
7720: 74 69 6f 6e 20 2b 32 34 29 20 3d 20 28 6c 6f 6e  tion +24) = (lon
7730: 67 29 20 64 61 74 61 3b 0a 23 64 65 66 69 6e 65  g) data;.#define
7740: 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69   is_tramp(functi
7750: 6f 6e 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20  on)  \.  ((long 
7760: 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 30 5d 20  *) function)[0] 
7770: 3d 3d 20 28 6c 6f 6e 67 29 20 26 74 72 61 6d 70  == (long) &tramp
7780: 5f 72 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70  _r.#define tramp
7790: 5f 61 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f  _address(functio
77a0: 6e 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a  n)  \.  ((long *
77b0: 29 20 66 75 6e 63 74 69 6f 6e 29 5b 32 5d 0a 23  ) function)[2].#
77c0: 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 74  define tramp_dat
77d0: 61 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20  a(function)  \. 
77e0: 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74   ((long *) funct
77f0: 69 6f 6e 29 5b 33 5d 0a 23 65 6e 64 69 66 0a 23  ion)[3].#endif.#
7800: 69 66 64 65 66 20 5f 5f 78 38 36 5f 36 34 5f 5f  ifdef __x86_64__
7810: 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a  .  /* function:.
7820: 20 20 20 2a 20 20 20 20 6d 6f 76 61 62 73 71 20     *    movabsq 
7830: 24 3c 64 61 74 61 3e 2c 25 72 31 30 09 09 34 39  $<data>,%r10..49
7840: 20 42 41 20 3c 64 61 74 61 3e 0a 20 20 20 2a 20   BA <data>.   * 
7850: 20 20 20 6d 6f 76 61 62 73 71 20 24 3c 61 64 64     movabsq $<add
7860: 72 65 73 73 3e 2c 25 72 61 78 09 09 34 38 20 42  ress>,%rax..48 B
7870: 38 20 3c 61 64 64 72 65 73 73 3e 0a 20 20 20 2a  8 <address>.   *
7880: 20 20 20 20 6a 6d 70 20 2a 25 72 61 78 09 09 09      jmp *%rax...
7890: 46 46 20 45 30 0a 20 20 20 2a 2f 0a 20 20 2a 28  FF E0.   */.  *(
78a0: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
78b0: 6f 6e 20 2b 20 30 29 20 3d 20 30 78 42 41 34 39  on + 0) = 0xBA49
78c0: 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28  ;.  *(short *) (
78d0: 66 75 6e 63 74 69 6f 6e 20 2b 20 32 29 20 3d 20  function + 2) = 
78e0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
78f0: 64 61 74 61 20 26 20 30 78 66 66 66 66 3b 0a 20  data & 0xffff;. 
7900: 20 2a 28 69 6e 74 20 2a 29 20 20 20 28 66 75 6e   *(int *)   (fun
7910: 63 74 69 6f 6e 20 2b 20 34 29 20 3d 20 28 28 75  ction + 4) = ((u
7920: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 61  nsigned long) da
7930: 74 61 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66  ta >> 16) & 0xff
7940: 66 66 66 66 66 66 3b 0a 20 20 2a 28 73 68 6f 72  ffffff;.  *(shor
7950: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
7960: 20 38 29 20 3d 20 28 28 75 6e 73 69 67 6e 65 64   8) = ((unsigned
7970: 20 6c 6f 6e 67 29 20 64 61 74 61 20 3e 3e 20 34   long) data >> 4
7980: 38 29 20 26 20 30 78 66 66 66 66 3b 0a 20 20 2a  8) & 0xffff;.  *
7990: 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74  (short *) (funct
79a0: 69 6f 6e 20 2b 31 30 29 20 3d 20 30 78 42 38 34  ion +10) = 0xB84
79b0: 38 3b 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 20  8;.  *(int *)   
79c0: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d  (function +12) =
79d0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
79e0: 20 61 64 64 72 65 73 73 20 26 20 30 78 66 66 66   address & 0xfff
79f0: 66 66 66 66 66 3b 0a 20 20 2a 28 69 6e 74 20 2a  fffff;.  *(int *
7a00: 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31  )   (function +1
7a10: 36 29 20 3d 20 28 28 75 6e 73 69 67 6e 65 64 20  6) = ((unsigned 
7a20: 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 20 3e 3e  long) address >>
7a30: 20 33 32 29 20 26 20 30 78 66 66 66 66 66 66 66   32) & 0xfffffff
7a40: 66 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20  f;.  *(short *) 
7a50: 28 66 75 6e 63 74 69 6f 6e 20 2b 32 30 29 20 3d  (function +20) =
7a60: 20 30 78 45 30 46 46 3b 0a 23 64 65 66 69 6e 65   0xE0FF;.#define
7a70: 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69   is_tramp(functi
7a80: 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67  on)  \.  *(unsig
7a90: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75  ned short *) (fu
7aa0: 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 3d 20 30  nction + 0) == 0
7ab0: 78 42 41 34 39 20 26 26 20 5c 0a 20 20 2a 28 75  xBA49 && \.  *(u
7ac0: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29  nsigned short *)
7ad0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 30 29 20   (function +10) 
7ae0: 3d 3d 20 30 78 42 38 34 38 20 26 26 20 5c 0a 20  == 0xB848 && \. 
7af0: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72   *(unsigned shor
7b00: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
7b10: 32 30 29 20 3d 3d 20 30 78 45 30 46 46 0a 23 64  20) == 0xE0FF.#d
7b20: 65 66 69 6e 65 20 68 69 6c 6f 28 68 69 77 6f 72  efine hilo(hiwor
7b30: 64 2c 6c 6f 77 6f 72 64 29 20 20 5c 0a 20 20 28  d,loword)  \.  (
7b40: 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29  ((unsigned long)
7b50: 20 28 68 69 77 6f 72 64 29 20 3c 3c 20 33 32 29   (hiword) << 32)
7b60: 20 7c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e   | (unsigned lon
7b70: 67 29 20 28 6c 6f 77 6f 72 64 29 29 0a 23 64 65  g) (loword)).#de
7b80: 66 69 6e 65 20 68 69 6d 69 64 6c 6f 28 68 69 73  fine himidlo(his
7b90: 68 6f 72 74 2c 6d 69 64 77 6f 72 64 2c 6c 6f 73  hort,midword,los
7ba0: 68 6f 72 74 29 20 20 5c 0a 20 20 28 28 28 75 6e  hort)  \.  (((un
7bb0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 68 69  signed long) (hi
7bc0: 73 68 6f 72 74 29 20 3c 3c 20 34 38 29 20 7c 20  short) << 48) | 
7bd0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
7be0: 28 6d 69 64 77 6f 72 64 29 20 3c 3c 20 31 36 20  (midword) << 16 
7bf0: 5c 0a 20 20 20 7c 20 28 75 6e 73 69 67 6e 65 64  \.   | (unsigned
7c00: 20 6c 6f 6e 67 29 20 28 6c 6f 73 68 6f 72 74 29   long) (loshort)
7c10: 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f  ).#define tramp_
7c20: 61 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e  address(function
7c30: 29 20 20 5c 0a 20 20 68 69 6c 6f 28 2a 28 75 6e  )  \.  hilo(*(un
7c40: 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 28 66  signed int *) (f
7c50: 75 6e 63 74 69 6f 6e 20 2b 31 36 29 2c 20 2a 28  unction +16), *(
7c60: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20  unsigned int *) 
7c70: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 29 0a  (function +12)).
7c80: 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61  #define tramp_da
7c90: 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a  ta(function)  \.
7ca0: 20 20 68 69 6d 69 64 6c 6f 28 2a 28 75 6e 73 69    himidlo(*(unsi
7cb0: 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66  gned short *) (f
7cc0: 75 6e 63 74 69 6f 6e 20 2b 20 38 29 2c 20 5c 0a  unction + 8), \.
7cd0: 20 20 20 20 20 20 20 20 20 20 2a 28 75 6e 73 69            *(unsi
7ce0: 67 6e 65 64 20 69 6e 74 20 2a 29 20 20 20 28 66  gned int *)   (f
7cf0: 75 6e 63 74 69 6f 6e 20 2b 20 34 29 2c 20 5c 0a  unction + 4), \.
7d00: 20 20 20 20 20 20 20 20 20 20 2a 28 75 6e 73 69            *(unsi
7d10: 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66  gned short *) (f
7d20: 75 6e 63 74 69 6f 6e 20 2b 20 32 29 29 0a 23 65  unction + 2)).#e
7d30: 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 73 33  ndif.#ifdef __s3
7d40: 39 30 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 69  90__.  /* functi
7d50: 6f 6e 3a 0a 0a 20 20 20 20 20 20 20 20 62 72 61  on:..        bra
7d60: 73 20 20 20 20 25 72 31 2c 2e 4c 54 4e 30 5f 30  s    %r1,.LTN0_0
7d70: 0a 2e 4c 54 30 5f 30 3a 0a 2e 4c 43 30 3a 0a 20  ..LT0_0:..LC0:. 
7d80: 20 20 20 20 20 20 20 2e 6c 6f 6e 67 20 20 20 30         .long   0
7d90: 78 37 33 35 35 34 37 31 31 0a 2e 4c 43 31 3a 0a  x73554711..LC1:.
7da0: 20 20 20 20 20 20 20 20 2e 6c 6f 6e 67 20 20 20          .long   
7db0: 30 78 62 61 62 65 62 65 63 30 0a 2e 4c 54 4e 30  0xbabebec0..LTN0
7dc0: 5f 30 3a 0a 20 20 20 20 20 20 20 20 6c 20 20 20  _0:.        l   
7dd0: 20 20 20 20 25 72 30 2c 2e 4c 43 30 2d 2e 4c 54      %r0,.LC0-.LT
7de0: 30 5f 30 28 25 72 31 29 0a 20 20 20 20 20 20 20  0_0(%r1).       
7df0: 20 6c 20 20 20 20 20 20 20 25 72 31 2c 2e 4c 43   l       %r1,.LC
7e00: 31 2d 2e 4c 54 31 5f 30 28 25 72 31 29 0a 20 20  1-.LT1_0(%r1).  
7e10: 20 20 20 20 20 20 62 72 20 20 20 20 20 20 25 72        br      %r
7e20: 31 0a 20 20 2a 2f 0a 20 20 2f 2a 20 57 68 61 74  1.  */.  /* What
7e30: 20 61 62 6f 75 74 20 62 69 67 20 65 6e 64 69 61   about big endia
7e40: 6e 20 2f 20 6c 69 74 74 6c 65 20 65 6e 64 69 61  n / little endia
7e50: 6e 20 3f 3f 20 2a 2f 0a 20 20 2a 28 75 6e 73 69  n ?? */.  *(unsi
7e60: 67 6e 65 64 20 69 6e 74 20 2a 29 20 20 20 28 66  gned int *)   (f
7e70: 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20 30  unction + 0) = 0
7e80: 78 41 37 31 35 30 30 30 36 3b 0a 20 20 2a 28 75  xA7150006;.  *(u
7e90: 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 20  nsigned int *)  
7ea0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20   (function + 4) 
7eb0: 3d 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  = (unsigned int)
7ec0: 20 64 61 74 61 3b 0a 20 20 2a 28 75 6e 73 69 67   data;.  *(unsig
7ed0: 6e 65 64 20 69 6e 74 20 2a 29 20 20 20 28 66 75  ned int *)   (fu
7ee0: 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 28 75  nction + 8) = (u
7ef0: 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 61 64 64  nsigned int) add
7f00: 72 65 73 73 3b 0a 20 20 2a 28 75 6e 73 69 67 6e  ress;.  *(unsign
7f10: 65 64 20 69 6e 74 20 2a 29 20 20 20 28 66 75 6e  ed int *)   (fun
7f20: 63 74 69 6f 6e 20 2b 31 32 29 20 3d 20 30 78 35  ction +12) = 0x5
7f30: 38 30 30 31 30 30 30 3b 0a 20 20 2a 28 75 6e 73  8001000;.  *(uns
7f40: 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 20 20 28  igned int *)   (
7f50: 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20  function +16) = 
7f60: 30 78 35 38 31 30 31 30 30 34 3b 0a 20 20 2a 28  0x58101004;.  *(
7f70: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a  unsigned short *
7f80: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 30 29  ) (function +20)
7f90: 20 3d 20 30 78 30 37 66 31 3b 0a 23 64 65 66 69   = 0x07f1;.#defi
7fa0: 6e 65 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63  ne is_tramp(func
7fb0: 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 69 6e 74  tion)  \.  *(int
7fc0: 20 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 28   *)            (
7fd0: 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 3d  function + 0) ==
7fe0: 20 30 78 41 37 31 35 30 30 30 36 20 26 26 20 5c   0xA7150006 && \
7ff0: 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 20 20  .  *(int *)     
8000: 20 20 20 20 20 20 20 28 66 75 6e 63 74 69 6f 6e         (function
8010: 20 2b 31 32 29 20 3d 3d 20 30 78 35 38 30 30 31   +12) == 0x58001
8020: 30 30 30 20 26 26 20 5c 0a 20 20 2a 28 69 6e 74  000 && \.  *(int
8030: 20 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 28   *)            (
8040: 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 3d  function +16) ==
8050: 20 30 78 35 38 31 30 31 30 30 34 20 26 26 20 5c   0x58101004 && \
8060: 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 20 20  .  *(short *)   
8070: 20 20 20 20 20 20 20 28 66 75 6e 63 74 69 6f 6e         (function
8080: 20 2b 32 30 29 20 3d 3d 20 30 78 30 37 66 31 0a   +20) == 0x07f1.
8090: 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 61 64  #define tramp_ad
80a0: 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e 29 20  dress(function) 
80b0: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20   \.  *(unsigned 
80c0: 69 6e 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  int *) (function
80d0: 20 2b 38 29 0a 23 64 65 66 69 6e 65 20 74 72 61   +8).#define tra
80e0: 6d 70 5f 64 61 74 61 28 66 75 6e 63 74 69 6f 6e  mp_data(function
80f0: 29 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65  )  \.  *(unsigne
8100: 64 20 69 6e 74 20 2a 29 20 28 66 75 6e 63 74 69  d int *) (functi
8110: 6f 6e 20 2b 34 29 0a 23 65 6e 64 69 66 0a 20 20  on +4).#endif.  
8120: 2f 2a 0a 20 20 20 2a 20 64 61 74 61 3a 0a 20 20  /*.   * data:.  
8130: 20 2a 20 20 20 20 3c 64 61 74 61 30 3e 09 09 09   *    <data0>...
8140: 09 3c 64 61 74 61 30 3e 0a 20 20 20 2a 20 20 20  .<data0>.   *   
8150: 20 3c 64 61 74 61 31 3e 09 09 09 09 3c 64 61 74   <data1>....<dat
8160: 61 31 3e 0a 20 20 20 2a 2f 0a 20 20 2a 28 6c 6f  a1>.   */.  *(lo
8170: 6e 67 20 2a 29 20 20 28 64 61 74 61 20 2b 20 30  ng *)  (data + 0
8180: 2a 73 69 7a 65 6f 66 28 76 6f 69 64 2a 29 29 20  *sizeof(void*)) 
8190: 3d 20 28 6c 6f 6e 67 29 20 64 61 74 61 30 3b 0a  = (long) data0;.
81a0: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 64 61    *(long *)  (da
81b0: 74 61 20 2b 20 31 2a 73 69 7a 65 6f 66 28 76 6f  ta + 1*sizeof(vo
81c0: 69 64 2a 29 29 20 3d 20 28 6c 6f 6e 67 29 20 64  id*)) = (long) d
81d0: 61 74 61 31 3b 0a 0a 20 20 2f 2a 20 33 2e 20 53  ata1;..  /* 3. S
81e0: 65 74 20 6d 65 6d 6f 72 79 20 70 72 6f 74 65 63  et memory protec
81f0: 74 69 6f 6e 20 74 6f 20 22 65 78 65 63 75 74 61  tion to "executa
8200: 62 6c 65 22 20 2a 2f 0a 0a 23 69 66 20 21 64 65  ble" */..#if !de
8210: 66 69 6e 65 64 28 43 4f 44 45 5f 45 58 45 43 55  fined(CODE_EXECU
8220: 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65  TABLE) && define
8230: 64 28 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41  d(EXECUTABLE_VIA
8240: 5f 4d 50 52 4f 54 45 43 54 29 0a 20 20 2f 2a 20  _MPROTECT).  /* 
8250: 43 61 6c 6c 20 6d 70 72 6f 74 65 63 74 20 6f 6e  Call mprotect on
8260: 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20   the pages that 
8270: 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 61 6e 67  contain the rang
8280: 65 2e 20 2a 2f 0a 20 20 7b 20 75 6e 73 69 67 6e  e. */.  { unsign
8290: 65 64 20 6c 6f 6e 67 20 73 74 61 72 74 5f 61 64  ed long start_ad
82a0: 64 72 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c  dr = (unsigned l
82b0: 6f 6e 67 29 20 66 75 6e 63 74 69 6f 6e 3b 0a 20  ong) function;. 
82c0: 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67     unsigned long
82d0: 20 65 6e 64 5f 61 64 64 72 20 3d 20 28 75 6e 73   end_addr = (uns
82e0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 66 75 6e  igned long) (fun
82f0: 63 74 69 6f 6e 20 2b 20 54 52 41 4d 50 5f 4c 45  ction + TRAMP_LE
8300: 4e 47 54 48 29 3b 0a 20 20 20 20 73 74 61 72 74  NGTH);.    start
8310: 5f 61 64 64 72 20 3d 20 73 74 61 72 74 5f 61 64  _addr = start_ad
8320: 64 72 20 26 20 2d 70 61 67 65 73 69 7a 65 3b 0a  dr & -pagesize;.
8330: 20 20 20 20 65 6e 64 5f 61 64 64 72 20 3d 20 28      end_addr = (
8340: 65 6e 64 5f 61 64 64 72 20 2b 20 70 61 67 65 73  end_addr + pages
8350: 69 7a 65 2d 31 29 20 26 20 2d 70 61 67 65 73 69  ize-1) & -pagesi
8360: 7a 65 3b 0a 20 20 20 7b 75 6e 73 69 67 6e 65 64  ze;.   {unsigned
8370: 20 6c 6f 6e 67 20 6c 65 6e 20 3d 20 65 6e 64 5f   long len = end_
8380: 61 64 64 72 20 2d 20 73 74 61 72 74 5f 61 64 64  addr - start_add
8390: 72 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48  r;.#if defined(H
83a0: 41 56 45 5f 4d 41 43 48 5f 56 4d 29 0a 20 20 20  AVE_MACH_VM).   
83b0: 20 69 66 20 28 76 6d 5f 70 72 6f 74 65 63 74 28   if (vm_protect(
83c0: 74 61 73 6b 5f 73 65 6c 66 28 29 2c 73 74 61 72  task_self(),star
83d0: 74 5f 61 64 64 72 2c 6c 65 6e 2c 30 2c 56 4d 5f  t_addr,len,0,VM_
83e0: 50 52 4f 54 5f 52 45 41 44 7c 56 4d 5f 50 52 4f  PROT_READ|VM_PRO
83f0: 54 5f 57 52 49 54 45 7c 56 4d 5f 50 52 4f 54 5f  T_WRITE|VM_PROT_
8400: 45 58 45 43 55 54 45 29 20 21 3d 20 4b 45 52 4e  EXECUTE) != KERN
8410: 5f 53 55 43 43 45 53 53 29 0a 23 65 6c 73 65 0a  _SUCCESS).#else.
8420: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 6f  #if defined(__co
8430: 6e 76 65 78 5f 5f 29 0a 20 20 20 20 2f 2a 20 43  nvex__).    /* C
8440: 6f 6e 76 65 78 20 4f 53 20 63 61 6c 6c 73 20 69  onvex OS calls i
8450: 74 20 60 6d 72 65 6d 61 70 28 29 27 2e 20 2a 2f  t `mremap()'. */
8460: 0a 20 20 20 20 6d 72 65 6d 61 70 28 73 74 61 72  .    mremap(star
8470: 74 5f 61 64 64 72 2c 20 26 6c 65 6e 2c 20 50 52  t_addr, &len, PR
8480: 4f 54 5f 52 45 41 44 7c 50 52 4f 54 5f 57 52 49  OT_READ|PROT_WRI
8490: 54 45 7c 50 52 4f 54 5f 45 58 45 43 2c 20 4d 41  TE|PROT_EXEC, MA
84a0: 50 5f 50 52 49 56 41 54 45 29 3b 0a 20 20 20 20  P_PRIVATE);.    
84b0: 69 66 20 28 30 29 0a 23 65 6c 73 65 0a 23 69 66  if (0).#else.#if
84c0: 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 53 59   defined(HAVE_SY
84d0: 53 5f 4d 38 38 4b 42 43 53 5f 48 29 0a 20 20 20  S_M88KBCS_H).   
84e0: 20 69 66 20 28 6d 65 6d 63 74 6c 28 73 74 61 72   if (memctl(star
84f0: 74 5f 61 64 64 72 2c 20 6c 65 6e 2c 20 4d 43 54  t_addr, len, MCT
8500: 5f 54 45 58 54 29 20 3d 3d 20 2d 31 29 0a 23 65  _TEXT) == -1).#e
8510: 6c 73 65 0a 20 20 20 20 69 66 20 28 6d 70 72 6f  lse.    if (mpro
8520: 74 65 63 74 28 28 76 6f 69 64 2a 29 73 74 61 72  tect((void*)star
8530: 74 5f 61 64 64 72 2c 20 6c 65 6e 2c 20 50 52 4f  t_addr, len, PRO
8540: 54 5f 52 45 41 44 7c 50 52 4f 54 5f 57 52 49 54  T_READ|PROT_WRIT
8550: 45 7c 50 52 4f 54 5f 45 58 45 43 29 20 3c 20 30  E|PROT_EXEC) < 0
8560: 29 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  ).#endif.#endif.
8570: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 20 66  #endif.      { f
8580: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 74  printf(stderr,"t
8590: 72 61 6d 70 6f 6c 69 6e 65 3a 20 63 61 6e 6e 6f  rampoline: canno
85a0: 74 20 6d 61 6b 65 20 6d 65 6d 6f 72 79 20 65 78  t make memory ex
85b0: 65 63 75 74 61 62 6c 65 5c 6e 22 29 3b 20 61 62  ecutable\n"); ab
85c0: 6f 72 74 28 29 3b 20 7d 0a 20 20 7d 7d 0a 23 65  ort(); }.  }}.#e
85d0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 34 2e 20 46 6c  ndif..  /* 4. Fl
85e0: 75 73 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ush instruction 
85f0: 63 61 63 68 65 20 2a 2f 0a 20 20 2f 2a 20 57 65  cache */.  /* We
8600: 20 6e 65 65 64 20 74 68 69 73 20 62 65 63 61 75   need this becau
8610: 73 65 20 73 6f 6d 65 20 43 50 55 73 20 68 61 76  se some CPUs hav
8620: 65 20 73 65 70 61 72 61 74 65 20 64 61 74 61 20  e separate data 
8630: 63 61 63 68 65 20 61 6e 64 20 69 6e 73 74 72 75  cache and instru
8640: 63 74 69 6f 6e 0a 20 20 20 2a 20 63 61 63 68 65  ction.   * cache
8650: 2e 20 54 68 65 20 66 72 65 73 68 6c 79 20 62 75  . The freshly bu
8660: 69 6c 74 20 74 72 61 6d 70 6f 6c 69 6e 65 20 69  ilt trampoline i
8670: 73 20 76 69 73 69 62 6c 65 20 74 6f 20 74 68 65  s visible to the
8680: 20 64 61 74 61 20 63 61 63 68 65 2c 20 62 75 74   data cache, but
8690: 20 6e 6f 74 0a 20 20 20 2a 20 6d 61 79 62 65 20   not.   * maybe 
86a0: 6e 6f 74 20 74 6f 20 74 68 65 20 69 6e 73 74 72  not to the instr
86b0: 75 63 74 69 6f 6e 20 63 61 63 68 65 2e 20 54 68  uction cache. Th
86c0: 69 73 20 69 73 20 68 61 69 72 79 2e 0a 20 20 20  is is hairy..   
86d0: 2a 2f 0a 23 69 66 20 21 28 64 65 66 69 6e 65 64  */.#if !(defined
86e0: 28 5f 5f 68 70 70 61 6e 65 77 5f 5f 29 20 7c 7c  (__hppanew__) ||
86f0: 20 64 65 66 69 6e 65 64 28 5f 5f 70 6f 77 65 72   defined(__power
8700: 70 63 61 69 78 5f 5f 29 20 7c 7c 20 64 65 66 69  pcaix__) || defi
8710: 6e 65 64 28 5f 5f 70 6f 77 65 72 70 63 36 34 61  ned(__powerpc64a
8720: 69 78 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64  ix__) || defined
8730: 28 5f 5f 69 61 36 34 5f 5f 29 29 0a 20 20 2f 2a  (__ia64__)).  /*
8740: 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 69 66 20   Only needed if 
8750: 77 65 20 72 65 61 6c 6c 79 20 73 65 74 20 75 70  we really set up
8760: 20 6d 61 63 68 69 6e 65 20 69 6e 73 74 72 75 63   machine instruc
8770: 74 69 6f 6e 73 2e 20 2a 2f 0a 23 69 66 64 65 66  tions. */.#ifdef
8780: 20 5f 5f 69 33 38 36 5f 5f 0a 23 69 66 20 64 65   __i386__.#if de
8790: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a 20 20  fined(_WIN32).  
87a0: 77 68 69 6c 65 20 28 21 46 6c 75 73 68 49 6e 73  while (!FlushIns
87b0: 74 72 75 63 74 69 6f 6e 43 61 63 68 65 28 47 65  tructionCache(Ge
87c0: 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 28  tCurrentProcess(
87d0: 29 2c 66 75 6e 63 74 69 6f 6e 2c 54 52 41 4d 50  ),function,TRAMP
87e0: 5f 4c 45 4e 47 54 48 29 29 0a 20 20 20 20 63 6f  _LENGTH)).    co
87f0: 6e 74 69 6e 75 65 3b 0a 23 65 6e 64 69 66 0a 23  ntinue;.#endif.#
8800: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d  endif.#ifdef __m
8810: 36 38 6b 5f 5f 0a 23 69 66 20 64 65 66 69 6e 65  68k__.#if define
8820: 64 28 4e 65 58 54 29 20 26 26 20 64 65 66 69 6e  d(NeXT) && defin
8830: 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a 20 20 5f  ed(__GNUC__).  _
8840: 5f 61 73 6d 5f 5f 20 5f 5f 76 6f 6c 61 74 69 6c  _asm__ __volatil
8850: 65 5f 5f 20 28 22 74 72 61 70 20 23 32 22 29 3b  e__ ("trap #2");
8860: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
8870: 6e 65 64 28 41 4d 49 47 41 29 0a 20 20 43 61 63  ned(AMIGA).  Cac
8880: 68 65 43 6c 65 61 72 45 28 66 75 6e 63 74 69 6f  heClearE(functio
8890: 6e 2c 54 52 41 4d 50 5f 4c 45 4e 47 54 48 2c 43  n,TRAMP_LENGTH,C
88a0: 41 43 52 46 5f 43 6c 65 61 72 49 7c 43 41 43 52  ACRF_ClearI|CACR
88b0: 46 5f 43 6c 65 61 72 44 29 3b 0a 23 65 6e 64 69  F_ClearD);.#endi
88c0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 61 70  f.#if defined(ap
88d0: 6f 6c 6c 6f 29 0a 20 20 63 61 63 68 65 5f 24 63  ollo).  cache_$c
88e0: 6c 65 61 72 28 29 3b 0a 23 65 6e 64 69 66 0a 23  lear();.#endif.#
88f0: 69 66 20 64 65 66 69 6e 65 64 28 68 70 75 78 29  if defined(hpux)
8900: 0a 20 20 63 61 63 68 65 63 74 6c 28 43 43 5f 49  .  cachectl(CC_I
8910: 50 55 52 47 45 2c 66 75 6e 63 74 69 6f 6e 2c 54  PURGE,function,T
8920: 52 41 4d 50 5f 4c 45 4e 47 54 48 29 3b 0a 23 65  RAMP_LENGTH);.#e
8930: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
8940: 28 5f 5f 4e 65 74 42 53 44 5f 5f 29 20 26 26 20  (__NetBSD__) && 
8950: 64 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f  defined(__GNUC__
8960: 29 0a 20 20 7b 20 72 65 67 69 73 74 65 72 20 75  ).  { register u
8970: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 5f 62 65  nsigned long _be
8980: 67 20 5f 5f 61 73 6d 5f 5f 20 28 22 25 61 31 22  g __asm__ ("%a1"
8990: 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ) = (unsigned lo
89a0: 6e 67 29 20 66 75 6e 63 74 69 6f 6e 3b 0a 20 20  ng) function;.  
89b0: 20 20 72 65 67 69 73 74 65 72 20 75 6e 73 69 67    register unsig
89c0: 6e 65 64 20 6c 6f 6e 67 20 5f 6c 65 6e 20 5f 5f  ned long _len __
89d0: 61 73 6d 5f 5f 20 28 22 25 64 31 22 29 20 3d 20  asm__ ("%d1") = 
89e0: 54 52 41 4d 50 5f 4c 45 4e 47 54 48 3b 0a 20 20  TRAMP_LENGTH;.  
89f0: 20 20 5f 5f 61 73 6d 5f 5f 20 5f 5f 76 6f 6c 61    __asm__ __vola
8a00: 74 69 6c 65 5f 5f 20 28 0a 20 20 20 20 20 20 22  tile__ (.      "
8a10: 6d 6f 76 65 25 2e 6c 20 25 23 30 78 38 30 30 30  move%.l %#0x8000
8a20: 30 30 30 34 2c 25 2f 64 30 5c 6e 5c 74 22 20 2f  0004,%/d0\n\t" /
8a30: 2a 20 43 43 5f 45 58 54 50 55 52 47 45 20 7c 20  * CC_EXTPURGE | 
8a40: 43 5f 49 50 55 52 47 45 20 2a 2f 0a 20 20 20 20  C_IPURGE */.    
8a50: 20 20 22 74 72 61 70 20 23 31 32 22 20 20 20 20    "trap #12"    
8a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a70: 20 20 2f 2a 20 6b 65 72 6e 65 6c 20 63 61 6c 6c    /* kernel call
8a80: 20 60 63 61 63 68 65 63 74 6c 27 20 2a 2f 0a 20   `cachectl' */. 
8a90: 20 20 20 20 20 3a 0a 20 20 20 20 20 20 3a 20 22       :.      : "
8aa0: 61 22 20 28 5f 62 65 67 29 2c 20 22 64 22 20 28  a" (_beg), "d" (
8ab0: 5f 6c 65 6e 29 0a 20 20 20 20 20 20 3a 20 22 25  _len).      : "%
8ac0: 61 30 22 2c 20 22 25 61 31 22 2c 20 22 25 64 30  a0", "%a1", "%d0
8ad0: 22 2c 20 22 25 64 31 22 20 20 20 20 2f 2a 20 63  ", "%d1"    /* c
8ae0: 61 6c 6c 2d 75 73 65 64 20 72 65 67 69 73 74 65  all-used registe
8af0: 72 73 20 2a 2f 0a 20 20 20 20 20 20 29 3b 0a 20  rs */.      );. 
8b00: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65   }.#endif.#if de
8b10: 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29  fined(__linux__)
8b20: 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e   && defined(__GN
8b30: 55 43 5f 5f 29 0a 20 20 7b 20 72 65 67 69 73 74  UC__).  { regist
8b40: 65 72 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  er unsigned long
8b50: 20 5f 62 65 67 20 5f 5f 61 73 6d 5f 5f 20 28 22   _beg __asm__ ("
8b60: 25 64 31 22 29 20 3d 20 28 75 6e 73 69 67 6e 65  %d1") = (unsigne
8b70: 64 20 6c 6f 6e 67 29 20 66 75 6e 63 74 69 6f 6e  d long) function
8b80: 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 75  ;.    register u
8b90: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 5f 6c 65  nsigned long _le
8ba0: 6e 20 5f 5f 61 73 6d 5f 5f 20 28 22 25 64 34 22  n __asm__ ("%d4"
8bb0: 29 20 3d 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48  ) = TRAMP_LENGTH
8bc0: 20 2b 20 33 32 3b 0a 20 20 20 20 5f 5f 61 73 6d   + 32;.    __asm
8bd0: 5f 5f 20 5f 5f 76 6f 6c 61 74 69 6c 65 5f 5f 20  __ __volatile__ 
8be0: 28 0a 20 20 20 20 20 20 22 6d 6f 76 65 25 2e 6c  (.      "move%.l
8bf0: 20 25 23 31 32 33 2c 25 2f 64 30 5c 6e 5c 74 22   %#123,%/d0\n\t"
8c00: 0a 20 20 20 20 20 20 22 6d 6f 76 65 25 2e 6c 20  .      "move%.l 
8c10: 25 23 31 2c 25 2f 64 32 5c 6e 5c 74 22 0a 20 20  %#1,%/d2\n\t".  
8c20: 20 20 20 20 22 6d 6f 76 65 25 2e 6c 20 25 23 33      "move%.l %#3
8c30: 2c 25 2f 64 33 5c 6e 5c 74 22 0a 20 20 20 20 20  ,%/d3\n\t".     
8c40: 20 22 74 72 61 70 20 25 23 30 22 0a 20 20 20 20   "trap %#0".    
8c50: 20 20 3a 0a 20 20 20 20 20 20 3a 20 22 64 22 20    :.      : "d" 
8c60: 28 5f 62 65 67 29 2c 20 22 64 22 20 28 5f 6c 65  (_beg), "d" (_le
8c70: 6e 29 0a 20 20 20 20 20 20 3a 20 22 25 64 30 22  n).      : "%d0"
8c80: 2c 20 22 25 64 32 22 2c 20 22 25 64 33 22 0a 20  , "%d2", "%d3". 
8c90: 20 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64       );.  }.#end
8ca0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 41  if.#if defined(A
8cb0: 55 58 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f  UX) && defined(_
8cc0: 5f 47 4e 55 43 5f 5f 29 0a 20 20 2f 2a 20 73 79  _GNUC__).  /* sy
8cd0: 73 6d 36 38 6b 28 31 30 35 2c 20 61 64 64 72 2c  sm68k(105, addr,
8ce0: 20 73 63 6f 70 65 2c 20 63 61 63 68 65 2c 20 6c   scope, cache, l
8cf0: 65 6e 29 20 2a 2f 0a 20 20 5f 5f 61 73 6d 5f 5f  en) */.  __asm__
8d00: 20 5f 5f 76 6f 6c 61 74 69 6c 65 5f 5f 20 28 0a   __volatile__ (.
8d10: 20 20 20 20 22 6d 6f 76 65 25 2e 6c 20 25 31 2c      "move%.l %1,
8d20: 25 2f 73 70 40 2d 5c 6e 5c 74 22 0a 20 20 20 20  %/sp@-\n\t".    
8d30: 22 6d 6f 76 65 25 2e 6c 20 25 23 33 2c 25 2f 73  "move%.l %#3,%/s
8d40: 70 40 2d 5c 6e 5c 74 22 0a 20 20 20 20 22 6d 6f  p@-\n\t".    "mo
8d50: 76 65 25 2e 6c 20 25 23 31 2c 25 2f 73 70 40 2d  ve%.l %#1,%/sp@-
8d60: 5c 6e 5c 74 22 0a 20 20 20 20 22 6d 6f 76 65 25  \n\t".    "move%
8d70: 2e 6c 20 25 30 2c 25 2f 73 70 40 2d 5c 6e 5c 74  .l %0,%/sp@-\n\t
8d80: 22 0a 20 20 20 20 22 6d 6f 76 65 25 2e 6c 20 25  ".    "move%.l %
8d90: 23 31 30 35 2c 25 2f 73 70 40 2d 5c 6e 5c 74 22  #105,%/sp@-\n\t"
8da0: 0a 20 20 20 20 22 6d 6f 76 65 25 2e 6c 20 25 23  .    "move%.l %#
8db0: 30 2c 25 2f 73 70 40 2d 5c 6e 5c 74 22 0a 20 20  0,%/sp@-\n\t".  
8dc0: 20 20 22 6d 6f 76 65 25 2e 6c 20 25 23 33 38 2c    "move%.l %#38,
8dd0: 25 2f 73 70 40 2d 5c 6e 5c 74 22 0a 20 20 20 20  %/sp@-\n\t".    
8de0: 22 74 72 61 70 20 25 23 30 5c 6e 5c 74 22 0a 20  "trap %#0\n\t". 
8df0: 20 20 20 22 61 64 64 25 2e 6c 20 25 23 32 34 2c     "add%.l %#24,
8e00: 25 2f 73 70 22 0a 20 20 20 20 3a 0a 20 20 20 20  %/sp".    :.    
8e10: 3a 20 22 72 22 20 28 66 75 6e 63 74 69 6f 6e 29  : "r" (function)
8e20: 2c 20 22 67 22 20 28 28 69 6e 74 29 54 52 41 4d  , "g" ((int)TRAM
8e30: 50 5f 4c 45 4e 47 54 48 29 0a 20 20 20 20 3a 20  P_LENGTH).    : 
8e40: 22 25 64 30 22 0a 20 20 20 20 29 3b 0a 23 65 6e  "%d0".    );.#en
8e50: 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  dif.#endif.#if d
8e60: 65 66 69 6e 65 64 28 5f 5f 6d 69 70 73 5f 5f 29  efined(__mips__)
8e70: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 6d 69   || defined(__mi
8e80: 70 73 6e 33 32 5f 5f 29 20 7c 7c 20 64 65 66 69  psn32__) || defi
8e90: 6e 65 64 28 5f 5f 6d 69 70 73 36 34 5f 5f 29 0a  ned(__mips64__).
8ea0: 20 20 63 61 63 68 65 66 6c 75 73 68 28 66 75 6e    cacheflush(fun
8eb0: 63 74 69 6f 6e 2c 54 52 41 4d 50 5f 4c 45 4e 47  ction,TRAMP_LENG
8ec0: 54 48 2c 49 43 41 43 48 45 29 3b 0a 20 20 2f 2a  TH,ICACHE);.  /*
8ed0: 20 67 66 6f 72 74 68 2d 30 2e 33 2e 30 20 75 73   gforth-0.3.0 us
8ee0: 65 73 20 42 43 41 43 48 45 20 69 6e 73 74 65 61  es BCACHE instea
8ef0: 64 20 6f 66 20 49 43 41 43 48 45 2e 20 57 68 79  d of ICACHE. Why
8f00: 3f 3f 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  ?? */.#endif.#if
8f10: 20 64 65 66 69 6e 65 64 28 5f 5f 73 70 61 72 63   defined(__sparc
8f20: 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  __) || defined(_
8f30: 5f 73 70 61 72 63 36 34 5f 5f 29 0a 20 20 2f 2a  _sparc64__).  /*
8f40: 20 54 68 69 73 20 61 73 73 75 6d 65 73 20 74 68   This assumes th
8f50: 61 74 20 74 68 65 20 74 72 61 6d 70 6f 6c 69 6e  at the trampolin
8f60: 65 20 66 69 74 73 20 69 6e 20 61 74 20 6d 6f 73  e fits in at mos
8f70: 74 20 74 77 6f 20 63 61 63 68 65 20 6c 69 6e 65  t two cache line
8f80: 73 2e 20 2a 2f 0a 20 20 5f 5f 54 52 5f 63 6c 65  s. */.  __TR_cle
8f90: 61 72 5f 63 61 63 68 65 5f 32 28 66 75 6e 63 74  ar_cache_2(funct
8fa0: 69 6f 6e 2c 66 75 6e 63 74 69 6f 6e 2b 54 52 41  ion,function+TRA
8fb0: 4d 50 5f 4c 45 4e 47 54 48 2d 31 29 3b 0a 23 65  MP_LENGTH-1);.#e
8fc0: 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 61 6c  ndif.#ifdef __al
8fd0: 70 68 61 5f 5f 0a 20 20 5f 5f 54 52 5f 63 6c 65  pha__.  __TR_cle
8fe0: 61 72 5f 63 61 63 68 65 28 29 3b 0a 23 65 6e 64  ar_cache();.#end
8ff0: 69 66 0a 23 69 66 64 65 66 20 5f 5f 68 70 70 61  if.#ifdef __hppa
9000: 5f 5f 0a 20 20 2f 2a 20 54 68 69 73 20 61 73 73  __.  /* This ass
9010: 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 74 72  umes that the tr
9020: 61 6d 70 6f 6c 69 6e 65 20 66 69 74 73 20 69 6e  ampoline fits in
9030: 20 61 74 20 6d 6f 73 74 20 74 77 6f 20 63 61 63   at most two cac
9040: 68 65 20 6c 69 6e 65 73 2e 20 2a 2f 0a 20 20 5f  he lines. */.  _
9050: 5f 54 52 5f 63 6c 65 61 72 5f 63 61 63 68 65 28  _TR_clear_cache(
9060: 66 75 6e 63 74 69 6f 6e 2c 66 75 6e 63 74 69 6f  function,functio
9070: 6e 2b 54 52 41 4d 50 5f 4c 45 4e 47 54 48 2d 31  n+TRAMP_LENGTH-1
9080: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  );.#endif.#ifdef
9090: 20 5f 5f 61 72 6d 5f 5f 0a 20 20 5f 5f 54 52 5f   __arm__.  __TR_
90a0: 63 6c 65 61 72 5f 63 61 63 68 65 28 66 75 6e 63  clear_cache(func
90b0: 74 69 6f 6e 2c 66 75 6e 63 74 69 6f 6e 2b 54 52  tion,function+TR
90c0: 41 4d 50 5f 4c 45 4e 47 54 48 29 3b 0a 23 65 6e  AMP_LENGTH);.#en
90d0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
90e0: 5f 5f 70 6f 77 65 72 70 63 5f 5f 29 20 26 26 20  __powerpc__) && 
90f0: 21 64 65 66 69 6e 65 64 28 5f 5f 70 6f 77 65 72  !defined(__power
9100: 70 63 36 34 5f 5f 29 0a 20 20 5f 5f 54 52 5f 63  pc64__).  __TR_c
9110: 6c 65 61 72 5f 63 61 63 68 65 28 66 75 6e 63 74  lear_cache(funct
9120: 69 6f 6e 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  ion);.#endif.#if
9130: 64 65 66 20 5f 5f 6d 38 38 6b 5f 5f 0a 20 20 73  def __m88k__.  s
9140: 79 73 6d 6f 74 28 53 38 38 43 41 43 48 45 46 4c  ysmot(S88CACHEFL
9150: 55 53 48 50 41 47 45 2c 20 28 75 6e 73 69 67 6e  USHPAGE, (unsign
9160: 65 64 20 6c 6f 6e 67 29 66 75 6e 63 74 69 6f 6e  ed long)function
9170: 20 26 20 2d 70 61 67 65 73 69 7a 65 29 3b 0a 23   & -pagesize);.#
9180: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 63  endif.#ifdef __c
9190: 6f 6e 76 65 78 5f 5f 0a 20 20 5f 5f 54 52 5f 63  onvex__.  __TR_c
91a0: 6c 65 61 72 5f 63 61 63 68 65 28 29 3b 0a 23 65  lear_cache();.#e
91b0: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  ndif.#endif..  /
91c0: 2a 20 35 2e 20 52 65 74 75 72 6e 2e 20 2a 2f 0a  * 5. Return. */.
91d0: 20 20 72 65 74 75 72 6e 20 28 5f 5f 54 52 5f 66    return (__TR_f
91e0: 75 6e 63 74 69 6f 6e 29 20 28 66 75 6e 63 74 69  unction) (functi
91f0: 6f 6e 20 2b 20 54 52 41 4d 50 5f 42 49 41 53 29  on + TRAMP_BIAS)
9200: 3b 0a 7d 0a 0a 76 6f 69 64 20 66 72 65 65 5f 74  ;.}..void free_t
9210: 72 61 6d 70 6f 6c 69 6e 65 5f 72 20 28 5f 5f 54  rampoline_r (__T
9220: 52 5f 66 75 6e 63 74 69 6f 6e 20 66 75 6e 63 74  R_function funct
9230: 69 6f 6e 29 0a 7b 0a 23 69 66 20 54 52 41 4d 50  ion).{.#if TRAMP
9240: 5f 42 49 41 53 0a 20 20 66 75 6e 63 74 69 6f 6e  _BIAS.  function
9250: 20 3d 20 28 5f 5f 54 52 5f 66 75 6e 63 74 69 6f   = (__TR_functio
9260: 6e 29 28 28 63 68 61 72 2a 29 66 75 6e 63 74 69  n)((char*)functi
9270: 6f 6e 20 2d 20 54 52 41 4d 50 5f 42 49 41 53 29  on - TRAMP_BIAS)
9280: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
9290: 66 69 6e 65 64 28 43 4f 44 45 5f 45 58 45 43 55  fined(CODE_EXECU
92a0: 54 41 42 4c 45 29 20 26 26 20 21 64 65 66 69 6e  TABLE) && !defin
92b0: 65 64 28 45 58 45 43 55 54 41 42 4c 45 5f 56 49  ed(EXECUTABLE_VI
92c0: 41 5f 4d 50 52 4f 54 45 43 54 29 0a 20 20 2a 28  A_MPROTECT).  *(
92d0: 63 68 61 72 2a 2a 29 66 75 6e 63 74 69 6f 6e 20  char**)function 
92e0: 3d 20 66 72 65 65 6c 69 73 74 3b 20 66 72 65 65  = freelist; free
92f0: 6c 69 73 74 20 3d 20 28 63 68 61 72 2a 29 66 75  list = (char*)fu
9300: 6e 63 74 69 6f 6e 3b 0a 20 20 2f 2a 20 49 74 20  nction;.  /* It 
9310: 69 73 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20  is probably not 
9320: 77 6f 72 74 68 20 63 61 6c 6c 69 6e 67 20 6d 75  worth calling mu
9330: 6e 6d 61 70 28 29 20 66 6f 72 20 65 6e 74 69 72  nmap() for entir
9340: 65 6c 79 20 66 72 65 65 64 20 70 61 67 65 73 2e  ely freed pages.
9350: 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 66 72 65 65   */.#else.  free
9360: 28 28 28 63 68 61 72 2a 2a 29 66 75 6e 63 74 69  (((char**)functi
9370: 6f 6e 29 5b 2d 31 5d 29 3b 0a 23 65 6e 64 69 66  on)[-1]);.#endif
9380: 0a 7d 0a 0a 69 6e 74 20 69 73 5f 74 72 61 6d 70  .}..int is_tramp
9390: 6f 6c 69 6e 65 5f 72 20 28 76 6f 69 64 2a 20 66  oline_r (void* f
93a0: 75 6e 63 74 69 6f 6e 29 0a 7b 0a 23 69 66 20 64  unction).{.#if d
93b0: 65 66 69 6e 65 64 28 69 73 5f 74 72 61 6d 70 29  efined(is_tramp)
93c0: 20 26 26 20 64 65 66 69 6e 65 64 28 74 72 61 6d   && defined(tram
93d0: 70 5f 64 61 74 61 29 0a 23 69 66 64 65 66 20 5f  p_data).#ifdef _
93e0: 5f 68 70 70 61 6e 65 77 5f 5f 0a 20 20 76 6f 69  _hppanew__.  voi
93f0: 64 2a 20 74 72 61 6d 70 5f 72 5f 61 64 64 72 65  d* tramp_r_addre
9400: 73 73 20 3d 20 26 74 72 61 6d 70 5f 72 3b 0a 20  ss = &tramp_r;. 
9410: 20 69 66 20 28 21 28 28 28 6c 6f 6e 67 29 66 75   if (!(((long)fu
9420: 6e 63 74 69 6f 6e 20 26 20 33 29 20 3d 3d 20 28  nction & 3) == (
9430: 54 52 41 4d 50 5f 42 49 41 53 20 26 20 33 29 29  TRAMP_BIAS & 3))
9440: 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64  ) return 0;.#end
9450: 69 66 0a 20 20 72 65 74 75 72 6e 0a 20 20 20 28  if.  return.   (
9460: 28 69 73 5f 74 72 61 6d 70 28 28 28 63 68 61 72  (is_tramp(((char
9470: 2a 29 66 75 6e 63 74 69 6f 6e 20 2d 20 54 52 41  *)function - TRA
9480: 4d 50 5f 42 49 41 53 29 29 29 0a 20 20 20 20 26  MP_BIAS))).    &
9490: 26 20 28 28 74 72 61 6d 70 5f 64 61 74 61 28 28  & ((tramp_data((
94a0: 28 63 68 61 72 2a 29 66 75 6e 63 74 69 6f 6e 20  (char*)function 
94b0: 2d 20 54 52 41 4d 50 5f 42 49 41 53 29 29 29 20  - TRAMP_BIAS))) 
94c0: 3d 3d 20 28 6c 6f 6e 67 29 28 28 63 68 61 72 2a  == (long)((char*
94d0: 29 66 75 6e 63 74 69 6f 6e 20 2d 20 54 52 41 4d  )function - TRAM
94e0: 50 5f 42 49 41 53 20 2b 20 54 52 41 4d 50 5f 4c  P_BIAS + TRAMP_L
94f0: 45 4e 47 54 48 29 29 0a 20 20 20 20 3f 20 31 20  ENGTH)).    ? 1 
9500: 3a 20 30 0a 20 20 20 29 3b 0a 23 65 6c 73 65 0a  : 0.   );.#else.
9510: 20 20 61 62 6f 72 74 28 29 3b 0a 23 65 6e 64 69    abort();.#endi
9520: 66 0a 7d 0a 0a 5f 5f 54 52 5f 66 75 6e 63 74 69  f.}..__TR_functi
9530: 6f 6e 20 74 72 61 6d 70 6f 6c 69 6e 65 5f 72 5f  on trampoline_r_
9540: 61 64 64 72 65 73 73 20 28 76 6f 69 64 2a 20 66  address (void* f
9550: 75 6e 63 74 69 6f 6e 29 0a 7b 0a 23 69 66 64 65  unction).{.#ifde
9560: 66 20 74 72 61 6d 70 5f 61 64 64 72 65 73 73 0a  f tramp_address.
9570: 20 20 72 65 74 75 72 6e 20 28 5f 5f 54 52 5f 66    return (__TR_f
9580: 75 6e 63 74 69 6f 6e 29 28 74 72 61 6d 70 5f 61  unction)(tramp_a
9590: 64 64 72 65 73 73 28 28 28 63 68 61 72 2a 29 66  ddress(((char*)f
95a0: 75 6e 63 74 69 6f 6e 20 2d 20 54 52 41 4d 50 5f  unction - TRAMP_
95b0: 42 49 41 53 29 29 29 3b 0a 23 65 6c 73 65 0a 20  BIAS)));.#else. 
95c0: 20 61 62 6f 72 74 28 29 3b 0a 23 65 6e 64 69 66   abort();.#endif
95d0: 0a 7d 0a 0a 76 6f 69 64 2a 20 74 72 61 6d 70 6f  .}..void* trampo
95e0: 6c 69 6e 65 5f 72 5f 64 61 74 61 30 20 28 76 6f  line_r_data0 (vo
95f0: 69 64 2a 20 66 75 6e 63 74 69 6f 6e 29 0a 7b 0a  id* function).{.
9600: 23 69 66 64 65 66 20 74 72 61 6d 70 5f 64 61 74  #ifdef tramp_dat
9610: 61 0a 20 20 72 65 74 75 72 6e 20 28 28 76 6f 69  a.  return ((voi
9620: 64 2a 2a 29 28 28 63 68 61 72 2a 29 66 75 6e 63  d**)((char*)func
9630: 74 69 6f 6e 2d 54 52 41 4d 50 5f 42 49 41 53 2b  tion-TRAMP_BIAS+
9640: 54 52 41 4d 50 5f 4c 45 4e 47 54 48 29 29 5b 30  TRAMP_LENGTH))[0
9650: 5d 3b 0a 23 65 6c 73 65 0a 20 20 61 62 6f 72 74  ];.#else.  abort
9660: 28 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 76 6f  ();.#endif.}..vo
9670: 69 64 2a 20 74 72 61 6d 70 6f 6c 69 6e 65 5f 72  id* trampoline_r
9680: 5f 64 61 74 61 31 20 28 76 6f 69 64 2a 20 66 75  _data1 (void* fu
9690: 6e 63 74 69 6f 6e 29 0a 7b 0a 23 69 66 64 65 66  nction).{.#ifdef
96a0: 20 74 72 61 6d 70 5f 64 61 74 61 0a 20 20 72 65   tramp_data.  re
96b0: 74 75 72 6e 20 28 28 76 6f 69 64 2a 2a 29 28 28  turn ((void**)((
96c0: 63 68 61 72 2a 29 66 75 6e 63 74 69 6f 6e 2d 54  char*)function-T
96d0: 52 41 4d 50 5f 42 49 41 53 2b 54 52 41 4d 50 5f  RAMP_BIAS+TRAMP_
96e0: 4c 45 4e 47 54 48 29 29 5b 31 5d 3b 0a 23 65 6c  LENGTH))[1];.#el
96f0: 73 65 0a 20 20 61 62 6f 72 74 28 29 3b 0a 23 65  se.  abort();.#e
9700: 6e 64 69 66 0a 7d 0a                             ndif.}.