Artifact b7ec6b10d5b46ebde7fe962a1ed56211c4a05a2d:


0000: 2f 2a 20 54 72 61 6d 70 6f 6c 69 6e 65 20 63 6f  /* Trampoline co
0010: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 2f  nstruction */../
0020: 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 31  *. * Copyright 1
0030: 39 39 35 2d 31 39 39 39 2c 20 32 30 30 31 2d 32  995-1999, 2001-2
0040: 30 30 34 20 42 72 75 6e 6f 20 48 61 69 62 6c 65  004 Bruno Haible
0050: 2c 20 3c 62 72 75 6e 6f 40 63 6c 69 73 70 2e 6f  , <bruno@clisp.o
0060: 72 67 3e 0a 20 2a 0a 20 2a 20 54 68 69 73 20 69  rg>. *. * This i
0070: 73 20 66 72 65 65 20 73 6f 66 74 77 61 72 65 20  s free software 
0080: 64 69 73 74 72 69 62 75 74 65 64 20 75 6e 64 65  distributed unde
0090: 72 20 74 68 65 20 47 4e 55 20 47 65 6e 65 72 61  r the GNU Genera
00a0: 6c 20 50 75 62 6c 69 63 20 4c 69 63 65 6e 63 65  l Public Licence
00b0: 0a 20 2a 20 64 65 73 63 72 69 62 65 64 20 69 6e  . * described in
00c0: 20 74 68 65 20 66 69 6c 65 20 43 4f 50 59 49 4e   the file COPYIN
00d0: 47 2e 20 43 6f 6e 74 61 63 74 20 74 68 65 20 61  G. Contact the a
00e0: 75 74 68 6f 72 20 69 66 20 79 6f 75 20 64 6f 6e  uthor if you don
00f0: 27 74 20 68 61 76 65 20 74 68 69 73 0a 20 2a 20  't have this. * 
0100: 6f 72 20 63 61 6e 27 74 20 6c 69 76 65 20 77 69  or can't live wi
0110: 74 68 20 69 74 2e 20 54 68 65 72 65 20 69 73 20  th it. There is 
0120: 41 42 53 4f 4c 55 54 45 4c 59 20 4e 4f 20 57 41  ABSOLUTELY NO WA
0130: 52 52 41 4e 54 59 2c 20 65 78 70 6c 69 63 69 74  RRANTY, explicit
0140: 20 6f 72 20 69 6d 70 6c 69 65 64 2c 0a 20 2a 20   or implied,. * 
0150: 6f 6e 20 74 68 69 73 20 73 6f 66 74 77 61 72 65  on this software
0160: 2e 0a 20 2a 2f 0a 0a 0a 23 69 6e 63 6c 75 64 65  .. */...#include
0170: 20 22 63 6f 6e 66 69 67 2e 68 22 0a 23 69 6e 63   "config.h".#inc
0180: 6c 75 64 65 20 22 74 72 61 6d 70 6f 6c 69 6e 65  lude "trampoline
0190: 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 72 73  #if defined(__rs
0250: 36 30 30 30 5f 5f 29 0a 23 69 66 20 64 65 66 69  6000__).#if defi
0260: 6e 65 64 28 5f 5f 4e 65 74 42 53 44 5f 5f 29 0a  ned(__NetBSD__).
0270: 23 64 65 66 69 6e 65 20 5f 5f 72 73 36 30 30 30  #define __rs6000
0280: 6e 65 74 62 73 64 5f 5f 0a 23 65 6c 73 65 0a 23  netbsd__.#else.#
0290: 69 66 20 21 64 65 66 69 6e 65 64 28 5f 41 49 58  if !defined(_AIX
02a0: 29 0a 23 64 65 66 69 6e 65 20 5f 5f 72 73 36 30  ).#define __rs60
02b0: 30 30 73 79 73 76 34 5f 5f 20 20 2f 2a 20 53 79  00sysv4__  /* Sy
02c0: 73 56 2e 34 20 41 42 49 2c 20 72 65 61 6c 20 6d  sV.4 ABI, real m
02d0: 61 63 68 69 6e 65 20 63 6f 64 65 2e 20 2a 2f 0a  achine code. */.
02e0: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 5f 5f  #else.#define __
02f0: 72 73 36 30 30 30 61 69 78 5f 5f 20 20 2f 2a 20  rs6000aix__  /* 
0300: 41 49 58 20 41 42 49 2c 20 6a 75 73 74 20 61 20  AIX ABI, just a 
0310: 63 6c 6f 73 75 72 65 2e 20 2a 2f 0a 23 65 6e 64  closure. */.#end
0320: 69 66 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66  if.#endif.#endif
0330: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 68  .#if defined(__h
0340: 70 70 61 6e 65 77 5f 5f 29 0a 2f 2a 0a 20 2a 20  ppanew__)./*. * 
0350: 41 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74  A function point
0360: 65 72 20 69 73 20 61 20 62 69 61 73 65 64 20 70  er is a biased p
0370: 6f 69 6e 74 65 72 20 74 6f 20 61 20 64 61 74 61  ointer to a data
0380: 20 61 72 65 61 20 77 68 6f 73 65 20 66 69 72 73   area whose firs
0390: 74 20 77 6f 72 64 0a 20 2a 20 63 6f 6e 74 61 69  t word. * contai
03a0: 6e 73 20 74 68 65 20 61 63 74 75 61 6c 20 61 64  ns the actual ad
03b0: 64 72 65 73 73 20 6f 66 20 74 68 65 20 66 75 6e  dress of the fun
03c0: 63 74 69 6f 6e 2e 0a 20 2a 2f 0a 65 78 74 65 72  ction.. */.exter
03d0: 6e 20 76 6f 69 64 20 74 72 61 6d 70 5f 72 20 28  n void tramp_r (
03e0: 29 3b 20 2f 2a 20 74 72 61 6d 70 6f 6c 69 6e 65  ); /* trampoline
03f0: 20 70 72 6f 74 6f 74 79 70 65 20 2a 2f 0a 2f 2a   prototype */./*
0400: 20 57 65 20 64 6f 6e 27 74 20 6e 65 65 64 20 74   We don't need t
0410: 6f 20 74 61 6b 65 20 61 6e 79 20 73 70 65 63 69  o take any speci
0420: 61 6c 20 6d 65 61 73 75 72 65 73 20 74 6f 20 6d  al measures to m
0430: 61 6b 65 20 74 68 65 20 63 6f 64 65 20 65 78 65  ake the code exe
0440: 63 75 74 61 62 6c 65 0a 20 2a 20 73 69 6e 63 65  cutable. * since
0450: 20 74 68 65 20 61 63 74 75 61 6c 20 69 6e 73 74   the actual inst
0460: 72 75 63 74 69 6f 6e 73 20 61 72 65 20 69 6e 20  ructions are in 
0470: 74 68 65 20 74 65 78 74 20 73 65 67 6d 65 6e 74  the text segment
0480: 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 43 4f  .. */.#ifndef CO
0490: 44 45 5f 45 58 45 43 55 54 41 42 4c 45 0a 23 64  DE_EXECUTABLE.#d
04a0: 65 66 69 6e 65 20 43 4f 44 45 5f 45 58 45 43 55  efine CODE_EXECU
04b0: 54 41 42 4c 45 0a 23 65 6e 64 69 66 0a 23 65 6e  TABLE.#endif.#en
04c0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
04d0: 5f 5f 72 73 36 30 30 30 61 69 78 5f 5f 29 20 7c  __rs6000aix__) |
04e0: 7c 20 64 65 66 69 6e 65 64 28 5f 5f 69 61 36 34  | defined(__ia64
04f0: 5f 5f 29 0a 2f 2a 0a 20 2a 20 41 20 66 75 6e 63  __)./*. * A func
0500: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 20  tion pointer is 
0510: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 64  a pointer to a d
0520: 61 74 61 20 61 72 65 61 20 77 68 6f 73 65 20 66  ata area whose f
0530: 69 72 73 74 20 77 6f 72 64 20 63 6f 6e 74 61 69  irst word contai
0540: 6e 73 0a 20 2a 20 74 68 65 20 61 63 74 75 61 6c  ns. * the actual
0550: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
0560: 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 2f 0a 65 78  function.. */.ex
0570: 74 65 72 6e 20 76 6f 69 64 20 28 2a 74 72 61 6d  tern void (*tram
0580: 70 5f 72 29 20 28 29 3b 20 2f 2a 20 74 72 61 6d  p_r) (); /* tram
0590: 70 6f 6c 69 6e 65 20 70 72 6f 74 6f 74 79 70 65  poline prototype
05a0: 20 2a 2f 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20   */./* We don't 
05b0: 6e 65 65 64 20 74 6f 20 74 61 6b 65 20 61 6e 79  need to take any
05c0: 20 73 70 65 63 69 61 6c 20 6d 65 61 73 75 72 65   special measure
05d0: 73 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 63 6f  s to make the co
05e0: 64 65 20 65 78 65 63 75 74 61 62 6c 65 0a 20 2a  de executable. *
05f0: 20 73 69 6e 63 65 20 74 68 65 20 61 63 74 75 61   since the actua
0600: 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61  l instructions a
0610: 72 65 20 69 6e 20 74 68 65 20 74 65 78 74 20 73  re in the text s
0620: 65 67 6d 65 6e 74 2e 0a 20 2a 2f 0a 23 69 66 6e  egment.. */.#ifn
0630: 64 65 66 20 43 4f 44 45 5f 45 58 45 43 55 54 41  def CODE_EXECUTA
0640: 42 4c 45 0a 23 64 65 66 69 6e 65 20 43 4f 44 45  BLE.#define CODE
0650: 5f 45 58 45 43 55 54 41 42 4c 45 0a 23 65 6e 64  _EXECUTABLE.#end
0660: 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  if.#endif.#if de
0670: 66 69 6e 65 64 28 5f 5f 6d 36 38 6b 5f 5f 29 0a  fined(__m68k__).
0680: 23 69 66 20 64 65 66 69 6e 65 64 28 41 4d 49 47  #if defined(AMIG
0690: 41 29 20 2f 2a 20 41 6d 69 67 61 20 72 75 6e 6e  A) /* Amiga runn
06a0: 69 6e 67 20 41 6d 69 67 61 4f 53 2c 20 6e 6f 74  ing AmigaOS, not
06b0: 20 4c 69 6e 75 78 20 2a 2f 0a 23 69 66 6e 64 65   Linux */.#ifnde
06c0: 66 20 43 4f 44 45 5f 45 58 45 43 55 54 41 42 4c  f CODE_EXECUTABL
06d0: 45 20 2f 2a 20 63 6f 6e 66 69 67 75 72 65 20 67  E /* configure g
06e0: 75 65 73 73 65 73 20 77 72 6f 6e 67 3f 3f 20 2a  uesses wrong?? *
06f0: 2f 0a 23 64 65 66 69 6e 65 20 43 4f 44 45 5f 45  /.#define CODE_E
0700: 58 45 43 55 54 41 42 4c 45 0a 23 65 6e 64 69 66  XECUTABLE.#endif
0710: 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a  .#endif.#endif..
0720: 23 69 66 6e 64 65 66 20 43 4f 44 45 5f 45 58 45  #ifndef CODE_EXE
0730: 43 55 54 41 42 4c 45 0a 2f 2a 20 48 6f 77 20 64  CUTABLE./* How d
0740: 6f 20 77 65 20 6d 61 6b 65 20 74 68 65 20 74 72  o we make the tr
0750: 61 6d 70 6f 6c 69 6e 65 27 73 20 63 6f 64 65 20  ampoline's code 
0760: 65 78 65 63 75 74 61 62 6c 65 3f 20 2a 2f 0a 23  executable? */.#
0770: 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  if defined(HAVE_
0780: 4d 41 43 48 5f 56 4d 29 20 7c 7c 20 64 65 66 69  MACH_VM) || defi
0790: 6e 65 64 28 5f 5f 63 6f 6e 76 65 78 5f 5f 29 20  ned(__convex__) 
07a0: 7c 7c 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  || defined(HAVE_
07b0: 57 4f 52 4b 49 4e 47 5f 4d 50 52 4f 54 45 43 54  WORKING_MPROTECT
07c0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 48 41 56  ) || defined(HAV
07d0: 45 5f 53 59 53 5f 4d 38 38 4b 42 43 53 5f 48 29  E_SYS_M88KBCS_H)
07e0: 0a 2f 2a 20 6d 70 72 6f 74 65 63 74 28 29 20 5b  ./* mprotect() [
07f0: 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 5d 20 74  or equivalent] t
0800: 68 65 20 6d 61 6c 6c 6f 63 27 65 64 20 61 72 65  he malloc'ed are
0810: 61 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 45 58  a. */.#define EX
0820: 45 43 55 54 41 42 4c 45 5f 56 49 41 5f 4d 50 52  ECUTABLE_VIA_MPR
0830: 4f 54 45 43 54 0a 23 65 6c 73 65 0a 23 69 66 64  OTECT.#else.#ifd
0840: 65 66 20 48 41 56 45 5f 4d 4d 41 50 0a 2f 2a 20  ef HAVE_MMAP./* 
0850: 55 73 65 20 61 6e 20 6d 6d 61 70 27 65 64 20 70  Use an mmap'ed p
0860: 61 67 65 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20  age. */.#define 
0870: 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41 5f 4d  EXECUTABLE_VIA_M
0880: 4d 41 50 0a 23 69 66 64 65 66 20 48 41 56 45 5f  MAP.#ifdef HAVE_
0890: 4d 4d 41 50 5f 41 4e 4f 4e 59 4d 4f 55 53 0a 2f  MMAP_ANONYMOUS./
08a0: 2a 20 55 73 65 20 6d 6d 61 70 20 77 69 74 68 20  * Use mmap with 
08b0: 74 68 65 20 4d 41 50 5f 41 4e 4f 4e 59 4d 4f 55  the MAP_ANONYMOU
08c0: 53 20 6f 72 20 4d 41 50 5f 41 4e 4f 4e 20 66 6c  S or MAP_ANON fl
08d0: 61 67 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 45  ag. */.#define E
08e0: 58 45 43 55 54 41 42 4c 45 5f 56 49 41 5f 4d 4d  XECUTABLE_VIA_MM
08f0: 41 50 5f 41 4e 4f 4e 59 4d 4f 55 53 0a 23 65 6c  AP_ANONYMOUS.#el
0900: 73 65 0a 2f 2a 20 55 73 65 20 6d 6d 61 70 20 6f  se./* Use mmap o
0910: 6e 20 2f 64 65 76 2f 7a 65 72 6f 2e 20 2a 2f 0a  n /dev/zero. */.
0920: 23 64 65 66 69 6e 65 20 45 58 45 43 55 54 41 42  #define EXECUTAB
0930: 4c 45 5f 56 49 41 5f 4d 4d 41 50 5f 44 45 56 5a  LE_VIA_MMAP_DEVZ
0940: 45 52 4f 0a 23 65 6e 64 69 66 0a 23 65 6c 73 65  ERO.#endif.#else
0950: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 48 4d  .#ifdef HAVE_SHM
0960: 0a 2f 2a 20 55 73 65 20 61 6e 20 73 68 6d 61 74  ./* Use an shmat
0970: 27 65 64 20 70 61 67 65 2e 20 2a 2f 0a 23 64 65  'ed page. */.#de
0980: 66 69 6e 65 20 45 58 45 43 55 54 41 42 4c 45 5f  fine EXECUTABLE_
0990: 56 49 41 5f 53 48 4d 0a 23 65 6c 73 65 0a 3f 3f  VIA_SHM.#else.??
09a0: 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23  .#endif.#endif.#
09b0: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 23 69  endif.#endif..#i
09c0: 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e  nclude <stdio.h>
09d0: 20 2f 2a 20 64 65 63 6c 61 72 65 73 20 66 70 72   /* declares fpr
09e0: 69 6e 74 66 28 29 20 2a 2f 0a 0a 23 69 6e 63 6c  intf() */..#incl
09f0: 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73 2e 68  ude <sys/types.h
0a00: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  >.#include <stdl
0a10: 69 62 2e 68 3e 20 2f 2a 20 64 65 63 6c 61 72 65  ib.h> /* declare
0a20: 73 20 61 62 6f 72 74 28 29 2c 20 6d 61 6c 6c 6f  s abort(), mallo
0a30: 63 28 29 2c 20 66 72 65 65 28 29 20 2a 2f 0a 23  c(), free() */.#
0a40: 69 66 64 65 66 20 48 41 56 45 5f 55 4e 49 53 54  ifdef HAVE_UNIST
0a50: 44 5f 48 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e  D_H.#include <un
0a60: 69 73 74 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a  istd.h>.#endif..
0a70: 2f 2a 20 44 65 63 6c 61 72 65 20 67 65 74 70 61  /* Declare getpa
0a80: 67 65 73 69 7a 65 28 29 2e 20 2a 2f 0a 23 69 66  gesize(). */.#if
0a90: 64 65 66 20 48 41 56 45 5f 47 45 54 50 41 47 45  def HAVE_GETPAGE
0aa0: 53 49 5a 45 0a 23 69 66 64 65 66 20 5f 5f 63 70  SIZE.#ifdef __cp
0ab0: 6c 75 73 70 6c 75 73 0a 65 78 74 65 72 6e 20 22  lusplus.extern "
0ac0: 43 22 20 52 45 54 47 45 54 50 41 47 45 53 49 5a  C" RETGETPAGESIZ
0ad0: 45 54 59 50 45 20 67 65 74 70 61 67 65 73 69 7a  ETYPE getpagesiz
0ae0: 65 20 28 76 6f 69 64 29 3b 0a 23 65 6c 69 66 20  e (void);.#elif 
0af0: 64 65 66 69 6e 65 64 28 5f 5f 53 54 44 43 5f 5f  defined(__STDC__
0b00: 29 0a 65 78 74 65 72 6e 20 52 45 54 47 45 54 50  ).extern RETGETP
0b10: 41 47 45 53 49 5a 45 54 59 50 45 20 67 65 74 70  AGESIZETYPE getp
0b20: 61 67 65 73 69 7a 65 20 28 76 6f 69 64 29 3b 0a  agesize (void);.
0b30: 23 65 6c 73 65 0a 65 78 74 65 72 6e 20 52 45 54  #else.extern RET
0b40: 47 45 54 50 41 47 45 53 49 5a 45 54 59 50 45 20  GETPAGESIZETYPE 
0b50: 67 65 74 70 61 67 65 73 69 7a 65 20 28 29 3b 0a  getpagesize ();.
0b60: 23 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 69 66  #endif.#else.#if
0b70: 64 65 66 20 48 41 56 45 5f 53 59 53 5f 50 41 52  def HAVE_SYS_PAR
0b80: 41 4d 5f 48 0a 23 69 6e 63 6c 75 64 65 20 3c 73  AM_H.#include <s
0b90: 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 65 6c 73  ys/param.h>.#els
0ba0: 65 0a 2f 2a 20 4e 6f 74 20 55 6e 69 78 2c 20 65  e./* Not Unix, e
0bb0: 2e 67 2e 20 6d 69 6e 67 77 33 32 20 2a 2f 0a 23  .g. mingw32 */.#
0bc0: 64 65 66 69 6e 65 20 50 41 47 45 53 49 5a 45 20  define PAGESIZE 
0bd0: 34 30 39 36 0a 23 65 6e 64 69 66 0a 23 64 65 66  4096.#endif.#def
0be0: 69 6e 65 20 67 65 74 70 61 67 65 73 69 7a 65 28  ine getpagesize(
0bf0: 29 20 50 41 47 45 53 49 5a 45 0a 23 65 6e 64 69  ) PAGESIZE.#endi
0c00: 66 0a 0a 2f 2a 20 44 65 63 6c 61 72 65 20 6d 70  f../* Declare mp
0c10: 72 6f 74 65 63 74 28 29 20 6f 72 20 65 71 75 69  rotect() or equi
0c20: 76 61 6c 65 6e 74 2e 20 2a 2f 0a 23 69 66 64 65  valent. */.#ifde
0c30: 66 20 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41  f EXECUTABLE_VIA
0c40: 5f 4d 50 52 4f 54 45 43 54 0a 23 69 66 64 65 66  _MPROTECT.#ifdef
0c50: 20 48 41 56 45 5f 4d 41 43 48 5f 56 4d 0a 23 69   HAVE_MACH_VM.#i
0c60: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 72 65 73 6f  nclude <sys/reso
0c70: 75 72 63 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  urce.h>.#include
0c80: 20 3c 6d 61 63 68 2f 6d 61 63 68 5f 69 6e 74 65   <mach/mach_inte
0c90: 72 66 61 63 65 2e 68 3e 0a 23 69 66 64 65 66 20  rface.h>.#ifdef 
0ca0: 4e 65 58 54 0a 23 69 6e 63 6c 75 64 65 20 3c 6d  NeXT.#include <m
0cb0: 61 63 68 2f 6d 61 63 68 5f 69 6e 69 74 2e 68 3e  ach/mach_init.h>
0cc0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f  .#endif.#ifdef _
0cd0: 5f 6f 73 66 5f 5f 0a 23 69 6e 63 6c 75 64 65 20  _osf__.#include 
0ce0: 3c 6d 61 63 68 5f 69 6e 69 74 2e 68 3e 0a 23 65  <mach_init.h>.#e
0cf0: 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20 3c 6d  ndif.#include <m
0d00: 61 63 68 2f 6d 61 63 68 69 6e 65 2f 76 6d 5f 70  ach/machine/vm_p
0d10: 61 72 61 6d 2e 68 3e 0a 23 65 6c 73 65 0a 23 69  aram.h>.#else.#i
0d20: 66 64 65 66 20 48 41 56 45 5f 53 59 53 5f 4d 38  fdef HAVE_SYS_M8
0d30: 38 4b 42 43 53 5f 48 0a 23 69 6e 63 6c 75 64 65  8KBCS_H.#include
0d40: 20 3c 73 79 73 2f 6d 38 38 6b 62 63 73 2e 68 3e   <sys/m88kbcs.h>
0d50: 0a 23 64 65 66 69 6e 65 20 67 65 74 70 61 67 65  .#define getpage
0d60: 73 69 7a 65 28 29 20 20 34 30 39 36 20 20 2f 2a  size()  4096  /*
0d70: 20 3f 3f 20 2a 2f 0a 23 65 6c 73 65 0a 23 69 6e   ?? */.#else.#in
0d80: 63 6c 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73  clude <sys/types
0d90: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
0da0: 73 2f 6d 6d 61 6e 2e 68 3e 0a 23 65 6e 64 69 66  s/mman.h>.#endif
0db0: 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a  .#endif.#endif..
0dc0: 2f 2a 20 44 65 63 6c 61 72 65 20 6d 6d 61 70 28  /* Declare mmap(
0dd0: 29 2e 20 2a 2f 0a 23 69 66 64 65 66 20 45 58 45  ). */.#ifdef EXE
0de0: 43 55 54 41 42 4c 45 5f 56 49 41 5f 4d 4d 41 50  CUTABLE_VIA_MMAP
0df0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
0e00: 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ypes.h>.#include
0e10: 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68 3e 0a 23 69   <sys/mman.h>.#i
0e20: 66 20 21 64 65 66 69 6e 65 64 28 50 52 4f 54 5f  f !defined(PROT_
0e30: 45 58 45 43 29 20 26 26 20 64 65 66 69 6e 65 64  EXEC) && defined
0e40: 28 50 52 4f 54 5f 45 58 45 43 55 54 45 29 20 2f  (PROT_EXECUTE) /
0e50: 2a 20 49 72 69 78 20 34 2e 30 2e 35 20 6e 65 65  * Irix 4.0.5 nee
0e60: 64 73 20 74 68 69 73 20 2a 2f 0a 23 64 65 66 69  ds this */.#defi
0e70: 6e 65 20 50 52 4f 54 5f 45 58 45 43 20 50 52 4f  ne PROT_EXEC PRO
0e80: 54 5f 45 58 45 43 55 54 45 0a 23 65 6e 64 69 66  T_EXECUTE.#endif
0e90: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 44 65 63 6c  .#endif../* Decl
0ea0: 61 72 65 20 6f 70 65 6e 28 29 2e 20 2a 2f 0a 23  are open(). */.#
0eb0: 69 66 64 65 66 20 45 58 45 43 55 54 41 42 4c 45  ifdef EXECUTABLE
0ec0: 5f 56 49 41 5f 4d 4d 41 50 5f 44 45 56 5a 45 52  _VIA_MMAP_DEVZER
0ed0: 4f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  O.#include <sys/
0ee0: 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64  types.h>.#includ
0ef0: 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e  e <unistd.h>.#in
0f00: 63 6c 75 64 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a  clude <fcntl.h>.
0f10: 23 69 66 64 65 66 20 4f 50 45 4e 5f 4e 45 45 44  #ifdef OPEN_NEED
0f20: 53 5f 53 59 53 5f 46 49 4c 45 5f 48 0a 23 69 6e  S_SYS_FILE_H.#in
0f30: 63 6c 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e  clude <sys/file.
0f40: 68 3e 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66  h>.#endif.#endif
0f50: 0a 0a 2f 2a 20 44 65 63 6c 61 72 65 20 73 68 6d  ../* Declare shm
0f60: 67 65 74 28 29 2c 20 73 68 6d 61 74 28 29 2c 20  get(), shmat(), 
0f70: 73 68 6d 63 74 6c 28 29 2e 20 2a 2f 0a 23 69 66  shmctl(). */.#if
0f80: 64 65 66 20 45 58 45 43 55 54 41 42 4c 45 5f 56  def EXECUTABLE_V
0f90: 49 41 5f 53 48 4d 0a 23 69 6e 63 6c 75 64 65 20  IA_SHM.#include 
0fa0: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
0fb0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 69 70 63 2e  nclude <sys/ipc.
0fc0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
0fd0: 2f 73 68 6d 2e 68 3e 0a 23 69 66 64 65 66 20 48  /shm.h>.#ifdef H
0fe0: 41 56 45 5f 53 59 53 5f 53 59 53 4d 41 43 52 4f  AVE_SYS_SYSMACRO
0ff0: 53 5f 48 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  S_H.#include <sy
1000: 73 2f 73 79 73 6d 61 63 72 6f 73 2e 68 3e 0a 23  s/sysmacros.h>.#
1010: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
1020: 20 53 75 70 70 6f 72 74 20 66 6f 72 20 69 6e 73   Support for ins
1030: 74 72 75 63 74 69 6f 6e 20 63 61 63 68 65 20 66  truction cache f
1040: 6c 75 73 68 2e 20 2a 2f 0a 23 69 66 64 65 66 20  lush. */.#ifdef 
1050: 5f 5f 69 33 38 36 5f 5f 0a 23 69 66 20 64 65 66  __i386__.#if def
1060: 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 2f 2a 20  ined(_WIN32) /* 
1070: 57 69 6e 64 6f 77 73 4e 54 20 6f 72 20 57 69 6e  WindowsNT or Win
1080: 64 6f 77 73 39 35 20 2a 2f 0a 23 64 65 66 69 6e  dows95 */.#defin
1090: 65 20 57 49 4e 33 32 5f 4c 45 41 4e 5f 41 4e 44  e WIN32_LEAN_AND
10a0: 5f 4d 45 41 4e 0a 23 64 65 66 69 6e 65 20 57 49  _MEAN.#define WI
10b0: 4e 33 32 5f 45 58 54 52 41 5f 4c 45 41 4e 0a 23  N32_EXTRA_LEAN.#
10c0: 69 6e 63 6c 75 64 65 20 3c 77 69 6e 64 6f 77 73  include <windows
10d0: 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69  .h>.#endif.#endi
10e0: 66 0a 23 69 66 64 65 66 20 5f 5f 6d 36 38 6b 5f  f.#ifdef __m68k_
10f0: 5f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 41 4d  _.#if defined(AM
1100: 49 47 41 29 20 2f 2a 20 41 6d 69 67 61 20 72 75  IGA) /* Amiga ru
1110: 6e 6e 69 6e 67 20 41 6d 69 67 61 4f 53 2c 20 6e  nning AmigaOS, n
1120: 6f 74 20 4c 69 6e 75 78 20 2a 2f 0a 23 69 6e 63  ot Linux */.#inc
1130: 6c 75 64 65 20 3c 65 78 65 63 2f 74 79 70 65 73  lude <exec/types
1140: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 78  .h>.#include <ex
1150: 65 63 2f 65 78 65 63 62 61 73 65 2e 68 3e 0a 23  ec/execbase.h>.#
1160: 69 6e 63 6c 75 64 65 20 3c 70 72 6f 74 6f 2f 65  include <proto/e
1170: 78 65 63 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69  xec.h>.#endif.#i
1180: 66 64 65 66 20 68 70 75 78 0a 23 69 6e 63 6c 75  fdef hpux.#inclu
1190: 64 65 20 3c 73 79 73 2f 63 61 63 68 65 2e 68 3e  de <sys/cache.h>
11a0: 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23  .#endif.#endif.#
11b0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 6d 69 70  if defined(__mip
11c0: 73 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  s__) || defined(
11d0: 5f 5f 6d 69 70 73 6e 33 32 5f 5f 29 20 7c 7c 20  __mipsn32__) || 
11e0: 64 65 66 69 6e 65 64 28 5f 5f 6d 69 70 73 36 34  defined(__mips64
11f0: 5f 5f 29 0a 23 69 66 64 65 66 20 75 6c 74 72 69  __).#ifdef ultri
1200: 78 0a 23 69 6e 63 6c 75 64 65 20 3c 6d 69 70 73  x.#include <mips
1210: 2f 63 61 63 68 65 63 74 6c 2e 68 3e 0a 23 65 6c  /cachectl.h>.#el
1220: 73 65 0a 23 69 66 64 65 66 20 6c 69 6e 75 78 0a  se.#ifdef linux.
1230: 23 69 6e 63 6c 75 64 65 20 3c 61 73 6d 2f 63 61  #include <asm/ca
1240: 63 68 65 63 74 6c 2e 68 3e 0a 23 65 6c 73 65 0a  chectl.h>.#else.
1250: 23 69 66 64 65 66 20 48 41 56 45 5f 53 59 53 5f  #ifdef HAVE_SYS_
1260: 43 41 43 48 45 43 54 4c 5f 48 0a 23 69 6e 63 6c  CACHECTL_H.#incl
1270: 75 64 65 20 3c 73 79 73 2f 63 61 63 68 65 63 74  ude <sys/cachect
1280: 6c 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 65 6e 64  l.h>.#endif.#end
1290: 69 66 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66  if.#endif.#endif
12a0: 0a 23 69 66 64 65 66 20 5f 5f 6d 38 38 6b 5f 5f  .#ifdef __m88k__
12b0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73  .#include <sys/s
12c0: 79 73 6c 6f 63 61 6c 2e 68 3e 0a 23 65 6e 64 69  yslocal.h>.#endi
12d0: 66 0a 2f 2a 20 49 6e 6c 69 6e 65 20 61 73 73 65  f./* Inline asse
12e0: 6d 62 6c 79 20 66 75 6e 63 74 69 6f 6e 20 66 6f  mbly function fo
12f0: 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 61  r instruction ca
1300: 63 68 65 20 66 6c 75 73 68 2e 20 2a 2f 0a 23 69  che flush. */.#i
1310: 66 20 64 65 66 69 6e 65 64 28 5f 5f 73 70 61 72  f defined(__spar
1320: 63 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  c__) || defined(
1330: 5f 5f 73 70 61 72 63 36 34 5f 5f 29 20 7c 7c 20  __sparc64__) || 
1340: 64 65 66 69 6e 65 64 28 5f 5f 61 6c 70 68 61 5f  defined(__alpha_
1350: 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f  _) || defined(__
1360: 68 70 70 61 6f 6c 64 5f 5f 29 20 7c 7c 20 64 65  hppaold__) || de
1370: 66 69 6e 65 64 28 5f 5f 72 73 36 30 30 30 73 79  fined(__rs6000sy
1380: 73 76 34 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65  sv4__) || define
1390: 64 28 5f 5f 72 73 36 30 30 30 6e 65 74 62 73 64  d(__rs6000netbsd
13a0: 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  __) || defined(_
13b0: 5f 63 6f 6e 76 65 78 5f 5f 29 0a 23 69 66 64 65  _convex__).#ifde
13c0: 66 20 5f 5f 47 4e 55 43 5f 5f 0a 65 78 74 65 72  f __GNUC__.exter
13d0: 6e 20 69 6e 6c 69 6e 65 0a 23 69 66 20 64 65 66  n inline.#if def
13e0: 69 6e 65 64 28 5f 5f 73 70 61 72 63 5f 5f 29 20  ined(__sparc__) 
13f0: 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 73 70 61  || defined(__spa
1400: 72 63 36 34 5f 5f 29 0a 23 69 6e 63 6c 75 64 65  rc64__).#include
1410: 20 22 63 61 63 68 65 2d 73 70 61 72 63 2e 63 22   "cache-sparc.c"
1420: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f  .#endif.#ifdef _
1430: 5f 61 6c 70 68 61 5f 5f 0a 23 69 6e 63 6c 75 64  _alpha__.#includ
1440: 65 20 22 63 61 63 68 65 2d 61 6c 70 68 61 2e 63  e "cache-alpha.c
1450: 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ".#endif.#ifdef 
1460: 5f 5f 68 70 70 61 5f 5f 0a 23 69 6e 63 6c 75 64  __hppa__.#includ
1470: 65 20 22 63 61 63 68 65 2d 68 70 70 61 2e 63 22  e "cache-hppa.c"
1480: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f  .#endif.#ifdef _
1490: 5f 72 73 36 30 30 30 5f 5f 0a 23 69 6e 63 6c 75  _rs6000__.#inclu
14a0: 64 65 20 22 63 61 63 68 65 2d 72 73 36 30 30 30  de "cache-rs6000
14b0: 2e 63 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .c".#endif.#ifde
14c0: 66 20 5f 5f 63 6f 6e 76 65 78 5f 5f 0a 23 69 6e  f __convex__.#in
14d0: 63 6c 75 64 65 20 22 63 61 63 68 65 2d 63 6f 6e  clude "cache-con
14e0: 76 65 78 2e 63 22 0a 23 65 6e 64 69 66 0a 23 65  vex.c".#endif.#e
14f0: 6c 73 65 0a 23 69 66 20 64 65 66 69 6e 65 64 28  lse.#if defined(
1500: 5f 5f 73 70 61 72 63 5f 5f 29 20 7c 7c 20 64 65  __sparc__) || de
1510: 66 69 6e 65 64 28 5f 5f 73 70 61 72 63 36 34 5f  fined(__sparc64_
1520: 5f 29 0a 65 78 74 65 72 6e 20 76 6f 69 64 20 5f  _).extern void _
1530: 5f 54 52 5f 63 6c 65 61 72 5f 63 61 63 68 65 5f  _TR_clear_cache_
1540: 34 28 29 3b 0a 23 65 6c 73 65 0a 65 78 74 65 72  4();.#else.exter
1550: 6e 20 76 6f 69 64 20 5f 5f 54 52 5f 63 6c 65 61  n void __TR_clea
1560: 72 5f 63 61 63 68 65 28 29 3b 0a 23 65 6e 64 69  r_cache();.#endi
1570: 66 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  f.#endif.#endif.
1580: 0a 2f 2a 20 4c 65 6e 67 74 68 20 61 6e 64 20 61  ./* Length and a
1590: 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 74 72 61 6d  lignment of tram
15a0: 70 6f 6c 69 6e 65 20 2a 2f 0a 23 69 66 64 65 66  poline */.#ifdef
15b0: 20 5f 5f 69 33 38 36 5f 5f 0a 23 64 65 66 69 6e   __i386__.#defin
15c0: 65 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 31  e TRAMP_LENGTH 1
15d0: 36 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f  6.#define TRAMP_
15e0: 41 4c 49 47 4e 20 31 36 20 20 2f 2a 20 34 20 66  ALIGN 16  /* 4 f
15f0: 6f 72 20 61 20 69 33 38 36 2c 20 31 36 20 66 6f  or a i386, 16 fo
1600: 72 20 61 20 69 34 38 36 20 2a 2f 0a 23 65 6e 64  r a i486 */.#end
1610: 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d 36 38 6b  if.#ifdef __m68k
1620: 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50  __.#define TRAMP
1630: 5f 4c 45 4e 47 54 48 20 31 34 0a 23 64 65 66 69  _LENGTH 14.#defi
1640: 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20 31  ne TRAMP_ALIGN 1
1650: 36 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  6.#endif.#if def
1660: 69 6e 65 64 28 5f 5f 6d 69 70 73 5f 5f 29 20 26  ined(__mips__) &
1670: 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 6d 69 70  & !defined(__mip
1680: 73 6e 33 32 5f 5f 29 0a 23 64 65 66 69 6e 65 20  sn32__).#define 
1690: 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 32 34 0a  TRAMP_LENGTH 24.
16a0: 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c  #define TRAMP_AL
16b0: 49 47 4e 20 34 0a 23 65 6e 64 69 66 0a 23 69 66  IGN 4.#endif.#if
16c0: 64 65 66 20 5f 5f 6d 69 70 73 6e 33 32 5f 5f 0a  def __mipsn32__.
16d0: 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45  #define TRAMP_LE
16e0: 4e 47 54 48 20 32 34 0a 23 64 65 66 69 6e 65 20  NGTH 24.#define 
16f0: 54 52 41 4d 50 5f 41 4c 49 47 4e 20 34 0a 23 65  TRAMP_ALIGN 4.#e
1700: 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d 69  ndif.#ifdef __mi
1710: 70 73 36 34 6f 6c 64 5f 5f 0a 23 64 65 66 69 6e  ps64old__.#defin
1720: 65 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 35  e TRAMP_LENGTH 5
1730: 36 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f  6.#define TRAMP_
1740: 41 4c 49 47 4e 20 34 0a 23 65 6e 64 69 66 0a 23  ALIGN 4.#endif.#
1750: 69 66 64 65 66 20 5f 5f 6d 69 70 73 36 34 5f 5f  ifdef __mips64__
1760: 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c  .#define TRAMP_L
1770: 45 4e 47 54 48 20 33 32 0a 23 64 65 66 69 6e 65  ENGTH 32.#define
1780: 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20 38 0a 23   TRAMP_ALIGN 8.#
1790: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
17a0: 64 28 5f 5f 73 70 61 72 63 5f 5f 29 20 26 26 20  d(__sparc__) && 
17b0: 21 64 65 66 69 6e 65 64 28 5f 5f 73 70 61 72 63  !defined(__sparc
17c0: 36 34 5f 5f 29 0a 23 64 65 66 69 6e 65 20 54 52  64__).#define TR
17d0: 41 4d 50 5f 4c 45 4e 47 54 48 20 31 36 0a 23 64  AMP_LENGTH 16.#d
17e0: 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47  efine TRAMP_ALIG
17f0: 4e 20 31 36 0a 23 65 6e 64 69 66 0a 23 69 66 64  N 16.#endif.#ifd
1800: 65 66 20 5f 5f 73 70 61 72 63 36 34 5f 5f 0a 23  ef __sparc64__.#
1810: 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e  define TRAMP_LEN
1820: 47 54 48 20 33 32 0a 23 64 65 66 69 6e 65 20 54  GTH 32.#define T
1830: 52 41 4d 50 5f 41 4c 49 47 4e 20 31 36 0a 23 65  RAMP_ALIGN 16.#e
1840: 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 61 6c  ndif.#ifdef __al
1850: 70 68 61 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52  pha__.#define TR
1860: 41 4d 50 5f 4c 45 4e 47 54 48 20 33 32 0a 23 64  AMP_LENGTH 32.#d
1870: 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47  efine TRAMP_ALIG
1880: 4e 20 38 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  N 8.#endif.#ifde
1890: 66 20 5f 5f 68 70 70 61 6f 6c 64 5f 5f 0a 23 64  f __hppaold__.#d
18a0: 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47  efine TRAMP_LENG
18b0: 54 48 20 34 38 0a 23 64 65 66 69 6e 65 20 54 52  TH 48.#define TR
18c0: 41 4d 50 5f 41 4c 49 47 4e 20 31 36 0a 23 65 6e  AMP_ALIGN 16.#en
18d0: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 68 70 70  dif.#ifdef __hpp
18e0: 61 6e 65 77 5f 5f 0a 23 64 65 66 69 6e 65 20 54  anew__.#define T
18f0: 52 41 4d 50 5f 4c 45 4e 47 54 48 20 31 36 0a 23  RAMP_LENGTH 16.#
1900: 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49  define TRAMP_ALI
1910: 47 4e 20 31 36 0a 23 64 65 66 69 6e 65 20 54 52  GN 16.#define TR
1920: 41 4d 50 5f 42 49 41 53 20 32 0a 23 65 6e 64 69  AMP_BIAS 2.#endi
1930: 66 0a 23 69 66 64 65 66 20 5f 5f 61 72 6d 5f 5f  f.#ifdef __arm__
1940: 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c  .#define TRAMP_L
1950: 45 4e 47 54 48 20 33 32 0a 23 64 65 66 69 6e 65  ENGTH 32.#define
1960: 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20 34 0a 23   TRAMP_ALIGN 4.#
1970: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 72  endif.#ifdef __r
1980: 73 36 30 30 30 73 79 73 76 34 5f 5f 0a 23 64 65  s6000sysv4__.#de
1990: 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47 54  fine TRAMP_LENGT
19a0: 48 20 32 34 0a 23 64 65 66 69 6e 65 20 54 52 41  H 24.#define TRA
19b0: 4d 50 5f 41 4c 49 47 4e 20 34 0a 23 65 6e 64 69  MP_ALIGN 4.#endi
19c0: 66 0a 23 69 66 64 65 66 20 5f 5f 72 73 36 30 30  f.#ifdef __rs600
19d0: 30 6e 65 74 62 73 64 5f 5f 0a 23 64 65 66 69 6e  0netbsd__.#defin
19e0: 65 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 32  e TRAMP_LENGTH 2
19f0: 34 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f  4.#define TRAMP_
1a00: 41 4c 49 47 4e 20 34 0a 23 65 6e 64 69 66 0a 23  ALIGN 4.#endif.#
1a10: 69 66 64 65 66 20 5f 5f 72 73 36 30 30 30 61 69  ifdef __rs6000ai
1a20: 78 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52 41 4d  x__.#define TRAM
1a30: 50 5f 4c 45 4e 47 54 48 20 32 30 0a 23 64 65 66  P_LENGTH 20.#def
1a40: 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20  ine TRAMP_ALIGN 
1a50: 34 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  4.#endif.#ifdef 
1a60: 5f 5f 6d 38 38 6b 5f 5f 0a 23 64 65 66 69 6e 65  __m88k__.#define
1a70: 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 20 32 30   TRAMP_LENGTH 20
1a80: 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 41  .#define TRAMP_A
1a90: 4c 49 47 4e 20 38 0a 23 65 6e 64 69 66 0a 23 69  LIGN 8.#endif.#i
1aa0: 66 64 65 66 20 5f 5f 63 6f 6e 76 65 78 5f 5f 0a  fdef __convex__.
1ab0: 23 64 65 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45  #define TRAMP_LE
1ac0: 4e 47 54 48 20 31 34 0a 23 64 65 66 69 6e 65 20  NGTH 14.#define 
1ad0: 54 52 41 4d 50 5f 41 4c 49 47 4e 20 34 0a 23 65  TRAMP_ALIGN 4.#e
1ae0: 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 69 61  ndif.#ifdef __ia
1af0: 36 34 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52 41  64__.#define TRA
1b00: 4d 50 5f 4c 45 4e 47 54 48 20 33 32 0a 23 64 65  MP_LENGTH 32.#de
1b10: 66 69 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e  fine TRAMP_ALIGN
1b20: 20 31 36 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   16.#endif.#ifde
1b30: 66 20 5f 5f 78 38 36 5f 36 34 5f 5f 0a 23 64 65  f __x86_64__.#de
1b40: 66 69 6e 65 20 54 52 41 4d 50 5f 4c 45 4e 47 54  fine TRAMP_LENGT
1b50: 48 20 32 32 0a 23 64 65 66 69 6e 65 20 54 52 41  H 22.#define TRA
1b60: 4d 50 5f 41 4c 49 47 4e 20 31 36 0a 23 65 6e 64  MP_ALIGN 16.#end
1b70: 69 66 0a 23 69 66 64 65 66 20 5f 5f 73 33 39 30  if.#ifdef __s390
1b80: 5f 5f 0a 23 64 65 66 69 6e 65 20 54 52 41 4d 50  __.#define TRAMP
1b90: 5f 4c 45 4e 47 54 48 20 32 32 0a 23 64 65 66 69  _LENGTH 22.#defi
1ba0: 6e 65 20 54 52 41 4d 50 5f 41 4c 49 47 4e 20 32  ne TRAMP_ALIGN 2
1bb0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
1bc0: 20 54 52 41 4d 50 5f 42 49 41 53 0a 23 64 65 66   TRAMP_BIAS.#def
1bd0: 69 6e 65 20 54 52 41 4d 50 5f 42 49 41 53 20 30  ine TRAMP_BIAS 0
1be0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
1bf0: 20 54 52 41 4d 50 5f 54 4f 54 41 4c 5f 4c 45 4e   TRAMP_TOTAL_LEN
1c00: 47 54 48 20 28 54 52 41 4d 50 5f 4c 45 4e 47 54  GTH (TRAMP_LENGT
1c10: 48 20 2b 20 32 2a 73 69 7a 65 6f 66 28 76 6f 69  H + 2*sizeof(voi
1c20: 64 2a 29 29 0a 0a 23 69 66 20 21 64 65 66 69 6e  d*))..#if !defin
1c30: 65 64 28 43 4f 44 45 5f 45 58 45 43 55 54 41 42  ed(CODE_EXECUTAB
1c40: 4c 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  LE) && !defined(
1c50: 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41 5f 4d  EXECUTABLE_VIA_M
1c60: 50 52 4f 54 45 43 54 29 0a 2f 2a 20 41 49 58 20  PROTECT)./* AIX 
1c70: 64 6f 65 73 6e 27 74 20 73 75 70 70 6f 72 74 20  doesn't support 
1c80: 6d 70 72 6f 74 65 63 74 28 29 20 69 6e 20 6d 61  mprotect() in ma
1c90: 6c 6c 6f 63 27 65 64 20 6d 65 6d 6f 72 79 2e 20  lloc'ed memory. 
1ca0: 4d 75 73 74 20 67 65 74 20 70 61 67 65 73 20 6f  Must get pages o
1cb0: 66 0a 20 2a 20 6d 65 6d 6f 72 79 20 77 69 74 68  f. * memory with
1cc0: 20 65 78 65 63 75 74 65 20 70 65 72 6d 69 73 73   execute permiss
1cd0: 69 6f 6e 20 76 69 61 20 6d 6d 61 70 28 29 2e 20  ion via mmap(). 
1ce0: 54 68 65 6e 20 6b 65 65 70 20 61 20 66 72 65 65  Then keep a free
1cf0: 20 6c 69 73 74 20 6f 66 0a 20 2a 20 66 72 65 65   list of. * free
1d00: 20 74 72 61 6d 70 6f 6c 69 6e 65 73 2e 0a 20 2a   trampolines.. *
1d10: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 2a 20 66  /.static char* f
1d20: 72 65 65 6c 69 73 74 20 3d 20 4e 55 4c 4c 3b 0a  reelist = NULL;.
1d30: 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
1d40: 6e 65 64 28 5f 5f 53 54 44 43 5f 5f 29 20 7c 7c  ned(__STDC__) ||
1d50: 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f   defined(__GNUC_
1d60: 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f  _) || defined(__
1d70: 63 70 6c 75 73 70 6c 75 73 29 0a 5f 5f 54 52 5f  cplusplus).__TR_
1d80: 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 5f 74  function alloc_t
1d90: 72 61 6d 70 6f 6c 69 6e 65 5f 72 20 28 5f 5f 54  rampoline_r (__T
1da0: 52 5f 66 75 6e 63 74 69 6f 6e 20 61 64 64 72 65  R_function addre
1db0: 73 73 2c 20 76 6f 69 64 2a 20 64 61 74 61 30 2c  ss, void* data0,
1dc0: 20 76 6f 69 64 2a 20 64 61 74 61 31 29 0a 23 65   void* data1).#e
1dd0: 6c 73 65 0a 5f 5f 54 52 5f 66 75 6e 63 74 69 6f  lse.__TR_functio
1de0: 6e 20 61 6c 6c 6f 63 5f 74 72 61 6d 70 6f 6c 69  n alloc_trampoli
1df0: 6e 65 5f 72 20 28 61 64 64 72 65 73 73 2c 20 64  ne_r (address, d
1e00: 61 74 61 30 2c 20 64 61 74 61 31 29 0a 20 20 5f  ata0, data1).  _
1e10: 5f 54 52 5f 66 75 6e 63 74 69 6f 6e 20 61 64 64  _TR_function add
1e20: 72 65 73 73 3b 0a 20 20 76 6f 69 64 2a 20 64 61  ress;.  void* da
1e30: 74 61 30 3b 0a 20 20 76 6f 69 64 2a 20 64 61 74  ta0;.  void* dat
1e40: 61 31 3b 0a 23 65 6e 64 69 66 0a 7b 0a 20 20 63  a1;.#endif.{.  c
1e50: 68 61 72 2a 20 66 75 6e 63 74 69 6f 6e 3b 0a 20  har* function;. 
1e60: 20 63 68 61 72 2a 20 64 61 74 61 3b 0a 0a 23 69   char* data;..#i
1e70: 66 20 21 64 65 66 69 6e 65 64 28 43 4f 44 45 5f  f !defined(CODE_
1e80: 45 58 45 43 55 54 41 42 4c 45 29 0a 20 20 73 74  EXECUTABLE).  st
1e90: 61 74 69 63 20 6c 6f 6e 67 20 70 61 67 65 73 69  atic long pagesi
1ea0: 7a 65 20 3d 20 30 3b 0a 23 69 66 20 64 65 66 69  ze = 0;.#if defi
1eb0: 6e 65 64 28 45 58 45 43 55 54 41 42 4c 45 5f 56  ned(EXECUTABLE_V
1ec0: 49 41 5f 4d 4d 41 50 5f 44 45 56 5a 45 52 4f 29  IA_MMAP_DEVZERO)
1ed0: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 7a 65  .  static int ze
1ee0: 72 6f 5f 66 64 3b 0a 23 65 6e 64 69 66 0a 20 20  ro_fd;.#endif.  
1ef0: 2f 2a 20 46 69 72 73 74 2c 20 67 65 74 20 74 68  /* First, get th
1f00: 65 20 70 61 67 65 20 73 69 7a 65 20 6f 6e 63 65  e page size once
1f10: 20 61 6e 64 20 66 6f 72 20 61 6c 6c 2e 20 2a 2f   and for all. */
1f20: 0a 20 20 69 66 20 28 21 70 61 67 65 73 69 7a 65  .  if (!pagesize
1f30: 29 0a 20 20 20 20 7b 0a 23 69 66 20 64 65 66 69  ).    {.#if defi
1f40: 6e 65 64 28 48 41 56 45 5f 4d 41 43 48 5f 56 4d  ned(HAVE_MACH_VM
1f50: 29 0a 20 20 20 20 20 20 70 61 67 65 73 69 7a 65  ).      pagesize
1f60: 20 3d 20 76 6d 5f 70 61 67 65 5f 73 69 7a 65 3b   = vm_page_size;
1f70: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 70 61 67  .#else.      pag
1f80: 65 73 69 7a 65 20 3d 20 67 65 74 70 61 67 65 73  esize = getpages
1f90: 69 7a 65 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69  ize();.#endif.#i
1fa0: 66 20 64 65 66 69 6e 65 64 28 45 58 45 43 55 54  f defined(EXECUT
1fb0: 41 42 4c 45 5f 56 49 41 5f 4d 4d 41 50 5f 44 45  ABLE_VIA_MMAP_DE
1fc0: 56 5a 45 52 4f 29 0a 20 20 20 20 20 20 7a 65 72  VZERO).      zer
1fd0: 6f 5f 66 64 20 3d 20 6f 70 65 6e 28 22 2f 64 65  o_fd = open("/de
1fe0: 76 2f 7a 65 72 6f 22 2c 4f 5f 52 44 4f 4e 4c 59  v/zero",O_RDONLY
1ff0: 2c 30 36 34 34 29 3b 0a 20 20 20 20 20 20 69 66  ,0644);.      if
2000: 20 28 7a 65 72 6f 5f 66 64 20 3c 20 30 29 0a 20   (zero_fd < 0). 
2010: 20 20 20 20 20 20 20 7b 20 66 70 72 69 6e 74 66         { fprintf
2020: 28 73 74 64 65 72 72 2c 22 74 72 61 6d 70 6f 6c  (stderr,"trampol
2030: 69 6e 65 3a 20 43 61 6e 6e 6f 74 20 6f 70 65 6e  ine: Cannot open
2040: 20 2f 64 65 76 2f 7a 65 72 6f 21 5c 6e 22 29 3b   /dev/zero!\n");
2050: 20 61 62 6f 72 74 28 29 3b 20 7d 0a 23 65 6e 64   abort(); }.#end
2060: 69 66 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  if.    }.#endif.
2070: 0a 20 20 2f 2a 20 31 2e 20 41 6c 6c 6f 63 61 74  .  /* 1. Allocat
2080: 65 20 72 6f 6f 6d 20 2a 2f 0a 0a 23 69 66 20 21  e room */..#if !
2090: 64 65 66 69 6e 65 64 28 43 4f 44 45 5f 45 58 45  defined(CODE_EXE
20a0: 43 55 54 41 42 4c 45 29 20 26 26 20 21 64 65 66  CUTABLE) && !def
20b0: 69 6e 65 64 28 45 58 45 43 55 54 41 42 4c 45 5f  ined(EXECUTABLE_
20c0: 56 49 41 5f 4d 50 52 4f 54 45 43 54 29 0a 20 20  VIA_MPROTECT).  
20d0: 2f 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 6d 65  /* Note: This me
20e0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
20f0: 69 73 20 6e 6f 74 20 6d 75 6c 74 69 74 68 72 65  is not multithre
2100: 61 64 2d 73 61 66 65 2e 20 57 65 20 6d 69 67 68  ad-safe. We migh
2110: 74 20 6e 65 65 64 0a 20 20 20 2a 20 74 6f 20 61  t need.   * to a
2120: 64 64 20 73 70 65 63 69 61 6c 20 28 70 6c 61 74  dd special (plat
2130: 66 6f 72 6d 20 64 65 70 65 6e 64 65 6e 74 29 20  form dependent) 
2140: 63 6f 64 65 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  code for locking
2150: 2e 0a 20 20 20 2a 20 46 6f 72 74 75 6e 61 74 65  ..   * Fortunate
2160: 6c 79 2c 20 6d 6f 73 74 20 6d 6f 64 65 72 6e 20  ly, most modern 
2170: 73 79 73 74 65 6d 73 20 77 68 65 72 65 20 6d 75  systems where mu
2180: 6c 74 69 74 68 72 65 61 64 2d 73 61 66 65 74 79  ltithread-safety
2190: 20 6d 61 74 74 65 72 73 0a 20 20 20 2a 20 68 61   matters.   * ha
21a0: 76 65 20 45 58 45 43 55 54 41 42 4c 45 5f 56 49  ve EXECUTABLE_VI
21b0: 41 5f 4d 50 52 4f 54 45 43 54 2c 20 61 6e 64 20  A_MPROTECT, and 
21c0: 74 68 6f 73 65 20 77 68 69 63 68 20 64 6f 6e 27  those which don'
21d0: 74 20 28 41 49 58 20 6f 6e 20 72 73 36 30 30 30  t (AIX on rs6000
21e0: 20 61 6e 64 0a 20 20 20 2a 20 48 50 2d 55 58 20   and.   * HP-UX 
21f0: 6f 6e 20 68 70 70 61 29 20 68 61 76 65 20 43 4f  on hppa) have CO
2200: 44 45 5f 45 58 45 43 55 54 41 42 4c 45 2e 20 54  DE_EXECUTABLE. T
2210: 68 75 73 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 63  hus no locking c
2220: 6f 64 65 20 69 73 20 6e 65 65 64 65 64 0a 20 20  ode is needed.  
2230: 20 2a 20 66 6f 72 20 74 68 65 20 6d 6f 6d 65 6e   * for the momen
2240: 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 20 28 66  t..   */.  if (f
2250: 72 65 65 6c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29  reelist == NULL)
2260: 0a 20 20 20 20 7b 20 2f 2a 20 47 65 74 20 61 20  .    { /* Get a 
2270: 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  new page. */.   
2280: 20 20 20 63 68 61 72 2a 20 70 61 67 65 3b 0a 23     char* page;.#
2290: 69 66 64 65 66 20 45 58 45 43 55 54 41 42 4c 45  ifdef EXECUTABLE
22a0: 5f 56 49 41 5f 4d 4d 41 50 5f 41 4e 4f 4e 59 4d  _VIA_MMAP_ANONYM
22b0: 4f 55 53 0a 20 20 20 20 20 20 70 61 67 65 20 3d  OUS.      page =
22c0: 20 6d 6d 61 70 28 30 2c 20 70 61 67 65 73 69 7a   mmap(0, pagesiz
22d0: 65 2c 20 50 52 4f 54 5f 52 45 41 44 20 7c 20 50  e, PROT_READ | P
22e0: 52 4f 54 5f 57 52 49 54 45 20 7c 20 50 52 4f 54  ROT_WRITE | PROT
22f0: 5f 45 58 45 43 2c 20 4d 41 50 5f 41 4e 4f 4e 59  _EXEC, MAP_ANONY
2300: 4d 4f 55 53 20 7c 20 4d 41 50 5f 56 41 52 49 41  MOUS | MAP_VARIA
2310: 42 4c 45 2c 20 2d 31 2c 20 30 29 3b 0a 23 65 6e  BLE, -1, 0);.#en
2320: 64 69 66 0a 23 69 66 64 65 66 20 45 58 45 43 55  dif.#ifdef EXECU
2330: 54 41 42 4c 45 5f 56 49 41 5f 4d 4d 41 50 5f 44  TABLE_VIA_MMAP_D
2340: 45 56 5a 45 52 4f 0a 20 20 20 20 20 20 70 61 67  EVZERO.      pag
2350: 65 20 3d 20 6d 6d 61 70 28 30 2c 20 70 61 67 65  e = mmap(0, page
2360: 73 69 7a 65 2c 20 50 52 4f 54 5f 52 45 41 44 20  size, PROT_READ 
2370: 7c 20 50 52 4f 54 5f 57 52 49 54 45 20 7c 20 50  | PROT_WRITE | P
2380: 52 4f 54 5f 45 58 45 43 2c 20 4d 41 50 5f 50 52  ROT_EXEC, MAP_PR
2390: 49 56 41 54 45 2c 20 7a 65 72 6f 5f 66 64 2c 20  IVATE, zero_fd, 
23a0: 30 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  0);.#endif.#ifde
23b0: 66 20 45 58 45 43 55 54 41 42 4c 45 5f 56 49 41  f EXECUTABLE_VIA
23c0: 5f 53 48 4d 0a 20 20 20 20 20 20 69 6e 74 20 73  _SHM.      int s
23d0: 68 6d 69 64 20 3d 20 73 68 6d 67 65 74 28 49 50  hmid = shmget(IP
23e0: 43 5f 50 52 49 56 41 54 45 2c 20 70 61 67 65 73  C_PRIVATE, pages
23f0: 69 7a 65 2c 20 30 37 30 30 7c 49 50 43 5f 43 52  ize, 0700|IPC_CR
2400: 45 41 54 29 3b 0a 20 20 20 20 20 20 69 66 20 28  EAT);.      if (
2410: 73 68 6d 69 64 3c 30 29 0a 20 20 20 20 20 20 20  shmid<0).       
2420: 20 7b 20 70 61 67 65 20 3d 20 28 63 68 61 72 2a   { page = (char*
2430: 29 28 2d 31 29 3b 20 7d 0a 20 20 20 20 20 20 65  )(-1); }.      e
2440: 6c 73 65 0a 20 20 20 20 20 20 20 20 7b 20 70 61  lse.        { pa
2450: 67 65 20 3d 20 73 68 6d 61 74 28 73 68 6d 69 64  ge = shmat(shmid
2460: 2c 20 30 2c 20 30 29 3b 20 73 68 6d 63 74 6c 28  , 0, 0); shmctl(
2470: 73 68 6d 69 64 2c 20 49 50 43 5f 52 4d 49 44 2c  shmid, IPC_RMID,
2480: 20 30 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20   0); }.#endif.  
2490: 20 20 20 20 69 66 20 28 70 61 67 65 20 3d 3d 20      if (page == 
24a0: 28 63 68 61 72 2a 29 28 2d 31 29 29 0a 20 20 20  (char*)(-1)).   
24b0: 20 20 20 20 20 7b 20 66 70 72 69 6e 74 66 28 73       { fprintf(s
24c0: 74 64 65 72 72 2c 22 74 72 61 6d 70 6f 6c 69 6e  tderr,"trampolin
24d0: 65 3a 20 4f 75 74 20 6f 66 20 76 69 72 74 75 61  e: Out of virtua
24e0: 6c 20 6d 65 6d 6f 72 79 21 5c 6e 22 29 3b 20 61  l memory!\n"); a
24f0: 62 6f 72 74 28 29 3b 20 7d 0a 20 20 20 20 20 20  bort(); }.      
2500: 2f 2a 20 46 69 6c 6c 20 69 74 20 77 69 74 68 20  /* Fill it with 
2510: 66 72 65 65 20 74 72 61 6d 70 6f 6c 69 6e 65 73  free trampolines
2520: 2e 20 2a 2f 0a 20 20 20 20 20 20 7b 20 63 68 61  . */.      { cha
2530: 72 2a 2a 20 6c 61 73 74 20 3d 20 26 66 72 65 65  r** last = &free
2540: 6c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 63 68  list;.        ch
2550: 61 72 2a 20 70 61 67 65 5f 65 6e 64 20 3d 20 70  ar* page_end = p
2560: 61 67 65 20 2b 20 70 61 67 65 73 69 7a 65 3b 0a  age + pagesize;.
2570: 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 28 70          while (p
2580: 61 67 65 2b 54 52 41 4d 50 5f 54 4f 54 41 4c 5f  age+TRAMP_TOTAL_
2590: 4c 45 4e 47 54 48 20 3c 3d 20 70 61 67 65 5f 65  LENGTH <= page_e
25a0: 6e 64 29 0a 20 20 20 20 20 20 20 20 20 20 7b 20  nd).          { 
25b0: 2a 6c 61 73 74 20 3d 20 70 61 67 65 3b 20 6c 61  *last = page; la
25c0: 73 74 20 3d 20 28 63 68 61 72 2a 2a 29 70 61 67  st = (char**)pag
25d0: 65 3b 20 70 61 67 65 20 2b 3d 20 54 52 41 4d 50  e; page += TRAMP
25e0: 5f 54 4f 54 41 4c 5f 4c 45 4e 47 54 48 3b 20 7d  _TOTAL_LENGTH; }
25f0: 0a 20 20 20 20 20 20 20 20 2a 6c 61 73 74 20 3d  .        *last =
2600: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 20 7d 0a 20   NULL;.    } }. 
2610: 20 66 75 6e 63 74 69 6f 6e 20 3d 20 66 72 65 65   function = free
2620: 6c 69 73 74 3b 20 66 72 65 65 6c 69 73 74 20 3d  list; freelist =
2630: 20 2a 28 63 68 61 72 2a 2a 29 66 72 65 65 6c 69   *(char**)freeli
2640: 73 74 3b 0a 23 65 6c 73 65 0a 20 20 7b 20 63 68  st;.#else.  { ch
2650: 61 72 2a 20 72 6f 6f 6d 20 3d 20 28 63 68 61 72  ar* room = (char
2660: 2a 29 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  *) malloc(sizeof
2670: 28 76 6f 69 64 2a 29 20 2b 20 54 52 41 4d 50 5f  (void*) + TRAMP_
2680: 54 4f 54 41 4c 5f 4c 45 4e 47 54 48 20 2b 20 54  TOTAL_LENGTH + T
2690: 52 41 4d 50 5f 41 4c 49 47 4e 2d 31 29 3b 0a 20  RAMP_ALIGN-1);. 
26a0: 20 20 20 69 66 20 28 21 72 6f 6f 6d 29 0a 20 20     if (!room).  
26b0: 20 20 20 20 7b 20 66 70 72 69 6e 74 66 28 73 74      { fprintf(st
26c0: 64 65 72 72 2c 22 74 72 61 6d 70 6f 6c 69 6e 65  derr,"trampoline
26d0: 3a 20 4f 75 74 20 6f 66 20 76 69 72 74 75 61 6c  : Out of virtual
26e0: 20 6d 65 6d 6f 72 79 21 5c 6e 22 29 3b 20 61 62   memory!\n"); ab
26f0: 6f 72 74 28 29 3b 20 7d 0a 20 20 20 20 66 75 6e  ort(); }.    fun
2700: 63 74 69 6f 6e 20 3d 20 28 63 68 61 72 2a 29 28  ction = (char*)(
2710: 28 28 6c 6f 6e 67 29 72 6f 6f 6d 20 2b 20 73 69  ((long)room + si
2720: 7a 65 6f 66 28 76 6f 69 64 2a 29 20 2b 20 54 52  zeof(void*) + TR
2730: 41 4d 50 5f 41 4c 49 47 4e 2d 31 29 20 26 20 2d  AMP_ALIGN-1) & -
2740: 54 52 41 4d 50 5f 41 4c 49 47 4e 29 3b 0a 20 20  TRAMP_ALIGN);.  
2750: 20 20 28 28 63 68 61 72 2a 2a 29 66 75 6e 63 74    ((char**)funct
2760: 69 6f 6e 29 5b 2d 31 5d 20 3d 20 72 6f 6f 6d 3b  ion)[-1] = room;
2770: 20 2f 2a 20 62 61 63 6b 70 6f 69 6e 74 65 72 20   /* backpointer 
2780: 66 6f 72 20 66 72 65 65 5f 74 72 61 6d 70 6f 6c  for free_trampol
2790: 69 6e 65 28 29 20 2a 2f 0a 20 20 7d 0a 23 65 6e  ine() */.  }.#en
27a0: 64 69 66 0a 0a 20 20 2f 2a 20 32 2e 20 46 69 6c  dif..  /* 2. Fil
27b0: 6c 20 6f 75 74 20 74 68 65 20 74 72 61 6d 70 6f  l out the trampo
27c0: 6c 69 6e 65 20 2a 2f 0a 20 20 64 61 74 61 20 3d  line */.  data =
27d0: 20 66 75 6e 63 74 69 6f 6e 20 2b 20 54 52 41 4d   function + TRAM
27e0: 50 5f 4c 45 4e 47 54 48 3b 0a 20 20 2f 2a 20 4b  P_LENGTH;.  /* K
27f0: 6e 6f 77 69 6e 67 20 74 68 61 74 20 64 61 74 61  nowing that data
2800: 20 3d 20 66 75 6e 63 74 69 6f 6e 20 2b 20 54 52   = function + TR
2810: 41 4d 50 5f 4c 45 4e 47 54 48 2c 20 77 65 20 63  AMP_LENGTH, we c
2820: 6f 75 6c 64 20 63 65 72 74 61 69 6e 6c 79 20 6f  ould certainly o
2830: 70 74 69 6d 69 7a 65 0a 20 20 20 2a 20 74 68 65  ptimize.   * the
2840: 20 74 72 61 6d 70 6f 6c 69 6e 65 73 20 61 20 6c   trampolines a l
2850: 69 74 74 6c 65 20 62 69 74 20 6d 6f 72 65 2c 20  ittle bit more, 
2860: 75 73 69 6e 67 20 50 43 20 72 65 6c 61 74 69 76  using PC relativ
2870: 65 20 61 64 64 72 65 73 73 69 6e 67 20 6d 6f 64  e addressing mod
2880: 65 73 2e 0a 20 20 20 2a 20 42 75 74 20 49 20 64  es..   * But I d
2890: 6f 75 62 74 20 69 74 27 73 20 72 65 61 6c 6c 79  oubt it's really
28a0: 20 77 6f 72 74 68 20 69 74 2e 0a 20 20 20 2a 2f   worth it..   */
28b0: 0a 23 69 66 64 65 66 20 5f 5f 69 33 38 36 5f 5f  .#ifdef __i386__
28c0: 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a  .  /* function:.
28d0: 20 20 20 2a 20 20 20 20 70 6f 70 6c 20 25 65 63     *    popl %ec
28e0: 78 09 09 09 35 39 0a 20 20 20 2a 20 20 20 20 70  x...59.   *    p
28f0: 75 73 68 6c 20 24 3c 64 61 74 61 3e 09 09 09 36  ushl $<data>...6
2900: 38 20 3c 64 61 74 61 3e 0a 20 20 20 2a 20 20 20  8 <data>.   *   
2910: 20 70 75 73 68 6c 20 25 65 63 78 09 09 09 35 31   pushl %ecx...51
2920: 0a 20 20 20 2a 20 20 20 20 6a 6d 70 20 3c 61 64  .   *    jmp <ad
2930: 64 72 65 73 73 3e 09 09 09 45 39 20 3c 61 64 64  dress>...E9 <add
2940: 72 65 73 73 3e 2d 3c 68 65 72 65 3e 0a 20 20 20  ress>-<here>.   
2950: 2a 20 68 65 72 65 3a 0a 20 20 20 2a 20 20 20 20  * here:.   *    
2960: 6e 6f 70 09 09 09 09 39 30 0a 20 20 20 2a 20 20  nop....90.   *  
2970: 20 20 6e 6f 70 09 09 09 09 39 30 0a 20 20 20 2a    nop....90.   *
2980: 20 20 20 20 6e 6f 70 09 09 09 09 39 30 0a 20 20      nop....90.  
2990: 20 2a 20 20 20 20 6e 6f 70 09 09 09 09 39 30 0a   *    nop....90.
29a0: 20 20 20 2a 2f 0a 20 20 2a 28 73 68 6f 72 74 20     */.  *(short 
29b0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30  *) (function + 0
29c0: 29 20 3d 20 30 78 36 38 35 39 3b 0a 20 20 2a 28  ) = 0x6859;.  *(
29d0: 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69  long *)  (functi
29e0: 6f 6e 20 2b 20 32 29 20 3d 20 28 6c 6f 6e 67 29  on + 2) = (long)
29f0: 20 64 61 74 61 3b 0a 20 20 2a 28 73 68 6f 72 74   data;.  *(short
2a00: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20   *) (function + 
2a10: 36 29 20 3d 20 30 78 45 39 35 31 3b 0a 20 20 2a  6) = 0xE951;.  *
2a20: 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74  (long *)  (funct
2a30: 69 6f 6e 20 2b 20 38 29 20 3d 20 28 6c 6f 6e 67  ion + 8) = (long
2a40: 29 20 61 64 64 72 65 73 73 20 2d 20 28 6c 6f 6e  ) address - (lon
2a50: 67 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 31  g) (function + 1
2a60: 32 29 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20  2);.  *(long *) 
2a70: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20   (function +12) 
2a80: 3d 20 30 78 39 30 39 30 39 30 39 30 3b 20 20 20  = 0x90909090;   
2a90: 2f 2a 20 6e 6f 70 20 6e 6f 70 20 6e 6f 70 20 6e  /* nop nop nop n
2aa0: 6f 70 2c 20 66 6f 72 20 61 6c 69 67 6e 6d 65 6e  op, for alignmen
2ab0: 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73 5f  t */.#define is_
2ac0: 74 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20  tramp(function) 
2ad0: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20   \.  *(unsigned 
2ae0: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
2af0: 6f 6e 20 2b 20 30 29 20 3d 3d 20 30 78 36 38 35  on + 0) == 0x685
2b00: 39 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67  9 && \.  *(unsig
2b10: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75  ned short *) (fu
2b20: 6e 63 74 69 6f 6e 20 2b 20 36 29 20 3d 3d 20 30  nction + 6) == 0
2b30: 78 45 39 35 31 0a 23 64 65 66 69 6e 65 20 74 72  xE951.#define tr
2b40: 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75 6e 63  amp_address(func
2b50: 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 6c 6f 6e  tion)  \.  *(lon
2b60: 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20  g *)  (function 
2b70: 2b 20 38 29 20 2b 20 28 6c 6f 6e 67 29 20 28 66  + 8) + (long) (f
2b80: 75 6e 63 74 69 6f 6e 20 2b 20 31 32 29 0a 23 64  unction + 12).#d
2b90: 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61  efine tramp_data
2ba0: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20  (function)  \.  
2bb0: 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63  *(long *)  (func
2bc0: 74 69 6f 6e 20 2b 20 32 29 0a 23 65 6e 64 69 66  tion + 2).#endif
2bd0: 0a 23 69 66 64 65 66 20 5f 5f 6d 36 38 6b 5f 5f  .#ifdef __m68k__
2be0: 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a  .  /* function:.
2bf0: 20 20 20 2a 20 20 20 20 6d 6f 76 65 6c 20 23 3c     *    movel #<
2c00: 64 61 74 61 3e 2c 61 30 09 09 32 30 20 37 43 20  data>,a0..20 7C 
2c10: 3c 64 61 74 61 3e 0a 20 20 20 2a 20 20 20 20 6a  <data>.   *    j
2c20: 6d 70 20 3c 61 64 64 72 65 73 73 3e 09 09 09 34  mp <address>...4
2c30: 45 20 46 39 20 3c 61 64 64 72 65 73 73 3e 0a 20  E F9 <address>. 
2c40: 20 20 2a 20 20 20 20 6e 6f 70 09 09 09 09 34 45    *    nop....4E
2c50: 20 37 31 0a 20 20 20 2a 2f 0a 20 20 2a 28 73 68   71.   */.  *(sh
2c60: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ort *) (function
2c70: 20 2b 20 30 29 20 3d 20 30 78 32 30 37 43 3b 0a   + 0) = 0x207C;.
2c80: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75    *(long *)  (fu
2c90: 6e 63 74 69 6f 6e 20 2b 20 32 29 20 3d 20 28 6c  nction + 2) = (l
2ca0: 6f 6e 67 29 20 64 61 74 61 3b 0a 20 20 2a 28 73  ong) data;.  *(s
2cb0: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
2cc0: 6e 20 2b 20 36 29 20 3d 20 30 78 34 45 46 39 3b  n + 6) = 0x4EF9;
2cd0: 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66  .  *(long *)  (f
2ce0: 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 28  unction + 8) = (
2cf0: 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 3b 0a 20  long) address;. 
2d00: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e   *(short *) (fun
2d10: 63 74 69 6f 6e 20 2b 31 32 29 20 3d 20 30 78 34  ction +12) = 0x4
2d20: 45 37 31 3b 0a 23 64 65 66 69 6e 65 20 69 73 5f  E71;.#define is_
2d30: 74 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20  tramp(function) 
2d40: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20   \.  *(unsigned 
2d50: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
2d60: 6f 6e 20 2b 20 30 29 20 3d 3d 20 30 78 32 30 37  on + 0) == 0x207
2d70: 43 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67  C && \.  *(unsig
2d80: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75  ned short *) (fu
2d90: 6e 63 74 69 6f 6e 20 2b 20 36 29 20 3d 3d 20 30  nction + 6) == 0
2da0: 78 34 45 46 39 20 26 26 20 5c 0a 20 20 2a 28 75  x4EF9 && \.  *(u
2db0: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29  nsigned short *)
2dc0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20   (function +12) 
2dd0: 3d 3d 20 30 78 34 45 37 31 0a 23 64 65 66 69 6e  == 0x4E71.#defin
2de0: 65 20 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28  e tramp_address(
2df0: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a  function)  \.  *
2e00: 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74  (long *)  (funct
2e10: 69 6f 6e 20 2b 20 38 29 0a 23 64 65 66 69 6e 65  ion + 8).#define
2e20: 20 74 72 61 6d 70 5f 64 61 74 61 28 66 75 6e 63   tramp_data(func
2e30: 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 6c 6f 6e  tion)  \.  *(lon
2e40: 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20  g *)  (function 
2e50: 2b 20 32 29 0a 23 65 6e 64 69 66 0a 23 69 66 20  + 2).#endif.#if 
2e60: 64 65 66 69 6e 65 64 28 5f 5f 6d 69 70 73 5f 5f  defined(__mips__
2e70: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f  ) && !defined(__
2e80: 6d 69 70 73 6e 33 32 5f 5f 29 0a 20 20 2f 2a 20  mipsn32__).  /* 
2e90: 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20  function:.   *  
2ea0: 20 20 6c 69 20 24 32 2c 3c 64 61 74 61 3e 26 30    li $2,<data>&0
2eb0: 78 66 66 66 66 30 30 30 30 09 09 33 43 20 30 32  xffff0000..3C 02
2ec0: 20 68 69 31 36 28 3c 64 61 74 61 3e 29 0a 20 20   hi16(<data>).  
2ed0: 20 2a 20 20 20 20 6f 72 69 20 24 32 2c 24 32 2c   *    ori $2,$2,
2ee0: 3c 64 61 74 61 3e 26 30 78 66 66 66 66 09 09 33  <data>&0xffff..3
2ef0: 34 20 34 32 20 6c 6f 31 36 28 3c 64 61 74 61 3e  4 42 lo16(<data>
2f00: 29 0a 20 20 20 2a 20 20 20 20 6c 69 20 24 32 35  ).   *    li $25
2f10: 2c 3c 61 64 64 72 65 73 73 3e 26 30 78 66 66 66  ,<address>&0xfff
2f20: 66 30 30 30 30 09 33 43 20 31 39 20 68 69 31 36  f0000.3C 19 hi16
2f30: 28 3c 61 64 64 72 65 73 73 3e 29 0a 20 20 20 2a  (<address>).   *
2f40: 20 20 20 20 6f 72 69 20 24 32 35 2c 24 32 35 2c      ori $25,$25,
2f50: 3c 61 64 64 72 65 73 73 3e 26 30 78 66 66 66 66  <address>&0xffff
2f60: 09 33 37 20 33 39 20 6c 6f 31 36 28 3c 61 64 64  .37 39 lo16(<add
2f70: 72 65 73 73 3e 29 0a 20 20 20 2a 20 20 20 20 6a  ress>).   *    j
2f80: 20 24 32 35 09 09 09 09 30 33 20 32 30 20 30 30   $25....03 20 00
2f90: 20 30 38 0a 20 20 20 2a 20 20 20 20 6e 6f 70 09   08.   *    nop.
2fa0: 09 09 09 30 30 20 30 30 20 30 30 20 30 30 0a 20  ...00 00 00 00. 
2fb0: 20 20 2a 2f 0a 20 20 2f 2a 20 57 68 61 74 20 61    */.  /* What a
2fc0: 62 6f 75 74 20 62 69 67 20 65 6e 64 69 61 6e 20  bout big endian 
2fd0: 2f 20 6c 69 74 74 6c 65 20 65 6e 64 69 61 6e 20  / little endian 
2fe0: 3f 3f 20 2a 2f 0a 20 20 2a 28 73 68 6f 72 74 20  ?? */.  *(short 
2ff0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30  *) (function + 0
3000: 29 20 3d 20 30 78 33 43 30 32 3b 0a 20 20 2a 28  ) = 0x3C02;.  *(
3010: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
3020: 6f 6e 20 2b 20 32 29 20 3d 20 28 75 6e 73 69 67  on + 2) = (unsig
3030: 6e 65 64 20 6c 6f 6e 67 29 20 64 61 74 61 20 3e  ned long) data >
3040: 3e 20 31 36 3b 0a 20 20 2a 28 73 68 6f 72 74 20  > 16;.  *(short 
3050: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34  *) (function + 4
3060: 29 20 3d 20 30 78 33 34 34 32 3b 0a 20 20 2a 28  ) = 0x3442;.  *(
3070: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
3080: 6f 6e 20 2b 20 36 29 20 3d 20 28 75 6e 73 69 67  on + 6) = (unsig
3090: 6e 65 64 20 6c 6f 6e 67 29 20 64 61 74 61 20 26  ned long) data &
30a0: 20 30 78 66 66 66 66 3b 0a 20 20 2a 28 73 68 6f   0xffff;.  *(sho
30b0: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
30c0: 2b 20 38 29 20 3d 20 30 78 33 43 31 39 3b 0a 20  + 8) = 0x3C19;. 
30d0: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e   *(short *) (fun
30e0: 63 74 69 6f 6e 20 2b 31 30 29 20 3d 20 28 75 6e  ction +10) = (un
30f0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64  signed long) add
3100: 72 65 73 73 20 3e 3e 20 31 36 3b 0a 20 20 2a 28  ress >> 16;.  *(
3110: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
3120: 6f 6e 20 2b 31 32 29 20 3d 20 30 78 33 37 33 39  on +12) = 0x3739
3130: 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28  ;.  *(short *) (
3140: 66 75 6e 63 74 69 6f 6e 20 2b 31 34 29 20 3d 20  function +14) = 
3150: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
3160: 61 64 64 72 65 73 73 20 26 20 30 78 66 66 66 66  address & 0xffff
3170: 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28  ;.  *(long *)  (
3180: 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20  function +16) = 
3190: 30 78 30 33 32 30 30 30 30 38 3b 0a 20 20 2a 28  0x03200008;.  *(
31a0: 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69  long *)  (functi
31b0: 6f 6e 20 2b 32 30 29 20 3d 20 30 78 30 30 30 30  on +20) = 0x0000
31c0: 30 30 30 30 3b 0a 23 64 65 66 69 6e 65 20 69 73  0000;.#define is
31d0: 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29  _tramp(function)
31e0: 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64    \.  *(unsigned
31f0: 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74   short *) (funct
3200: 69 6f 6e 20 2b 20 30 29 20 3d 3d 20 30 78 33 43  ion + 0) == 0x3C
3210: 30 32 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69  02 && \.  *(unsi
3220: 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66  gned short *) (f
3230: 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 3d 20  unction + 4) == 
3240: 30 78 33 34 34 32 20 26 26 20 5c 0a 20 20 2a 28  0x3442 && \.  *(
3250: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a  unsigned short *
3260: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29  ) (function + 8)
3270: 20 3d 3d 20 30 78 33 43 31 39 20 26 26 20 5c 0a   == 0x3C19 && \.
3280: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f    *(unsigned sho
3290: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
32a0: 2b 31 32 29 20 3d 3d 20 30 78 33 37 33 39 20 26  +12) == 0x3739 &
32b0: 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64  & \.  *(unsigned
32c0: 20 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74   long *)  (funct
32d0: 69 6f 6e 20 2b 31 36 29 20 3d 3d 20 30 78 30 33  ion +16) == 0x03
32e0: 32 30 30 30 30 38 20 26 26 20 5c 0a 20 20 2a 28  200008 && \.  *(
32f0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 29  unsigned long *)
3300: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 30 29    (function +20)
3310: 20 3d 3d 20 30 78 30 30 30 30 30 30 30 30 0a 23   == 0x00000000.#
3320: 64 65 66 69 6e 65 20 68 69 6c 6f 28 68 69 77 6f  define hilo(hiwo
3330: 72 64 2c 6c 6f 77 6f 72 64 29 20 20 5c 0a 20 20  rd,loword)  \.  
3340: 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  (((unsigned long
3350: 29 20 28 68 69 77 6f 72 64 29 20 3c 3c 20 31 36  ) (hiword) << 16
3360: 29 20 7c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ) | (unsigned lo
3370: 6e 67 29 20 28 6c 6f 77 6f 72 64 29 29 0a 23 64  ng) (loword)).#d
3380: 65 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 72  efine tramp_addr
3390: 65 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c  ess(function)  \
33a0: 0a 20 20 68 69 6c 6f 28 2a 28 75 6e 73 69 67 6e  .  hilo(*(unsign
33b0: 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e  ed short *) (fun
33c0: 63 74 69 6f 6e 20 2b 31 30 29 2c 20 2a 28 75 6e  ction +10), *(un
33d0: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20  signed short *) 
33e0: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 34 29 29 0a  (function +14)).
33f0: 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61  #define tramp_da
3400: 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a  ta(function)  \.
3410: 20 20 68 69 6c 6f 28 2a 28 75 6e 73 69 67 6e 65    hilo(*(unsigne
3420: 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63  d short *) (func
3430: 74 69 6f 6e 20 2b 20 32 29 2c 20 2a 28 75 6e 73  tion + 2), *(uns
3440: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28  igned short *) (
3450: 66 75 6e 63 74 69 6f 6e 20 2b 20 36 29 29 0a 23  function + 6)).#
3460: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d  endif.#ifdef __m
3470: 69 70 73 6e 33 32 5f 5f 0a 20 20 2f 2a 20 66 75  ipsn32__.  /* fu
3480: 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20  nction:.   *    
3490: 6c 77 20 24 32 2c 31 36 28 24 32 35 29 09 09 09  lw $2,16($25)...
34a0: 38 46 20 32 32 20 30 30 20 31 30 0a 20 20 20 2a  8F 22 00 10.   *
34b0: 20 20 20 20 6c 77 20 24 32 35 2c 32 30 28 24 32      lw $25,20($2
34c0: 35 29 09 09 09 38 46 20 33 39 20 30 30 20 31 34  5)...8F 39 00 14
34d0: 0a 20 20 20 2a 20 20 20 20 6a 20 24 32 35 09 09  .   *    j $25..
34e0: 09 09 30 33 20 32 30 20 30 30 20 30 38 0a 20 20  ..03 20 00 08.  
34f0: 20 2a 20 20 20 20 6e 6f 70 09 09 09 09 30 30 20   *    nop....00 
3500: 30 30 20 30 30 20 30 30 0a 20 20 20 2a 20 20 20  00 00 00.   *   
3510: 20 2e 77 6f 72 64 20 3c 64 61 74 61 3e 09 09 09   .word <data>...
3520: 3c 64 61 74 61 3e 0a 20 20 20 2a 20 20 20 20 2e  <data>.   *    .
3530: 77 6f 72 64 20 3c 61 64 64 72 65 73 73 3e 09 09  word <address>..
3540: 09 3c 61 64 64 72 65 73 73 3e 0a 20 20 20 2a 2f  .<address>.   */
3550: 0a 20 20 2f 2a 20 57 68 61 74 20 61 62 6f 75 74  .  /* What about
3560: 20 62 69 67 20 65 6e 64 69 61 6e 20 2f 20 6c 69   big endian / li
3570: 74 74 6c 65 20 65 6e 64 69 61 6e 20 3f 3f 20 2a  ttle endian ?? *
3580: 2f 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69  /.  *(unsigned i
3590: 6e 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  nt *) (function 
35a0: 2b 20 30 29 20 3d 20 30 78 38 46 32 32 30 30 31  + 0) = 0x8F22001
35b0: 30 3b 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20  0;.  *(unsigned 
35c0: 69 6e 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  int *) (function
35d0: 20 2b 20 34 29 20 3d 20 30 78 38 46 33 39 30 30   + 4) = 0x8F3900
35e0: 31 34 3b 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64  14;.  *(unsigned
35f0: 20 69 6e 74 20 2a 29 20 28 66 75 6e 63 74 69 6f   int *) (functio
3600: 6e 20 2b 20 38 29 20 3d 20 30 78 30 33 32 30 30  n + 8) = 0x03200
3610: 30 30 38 3b 0a 20 20 2a 28 75 6e 73 69 67 6e 65  008;.  *(unsigne
3620: 64 20 69 6e 74 20 2a 29 20 28 66 75 6e 63 74 69  d int *) (functi
3630: 6f 6e 20 2b 31 32 29 20 3d 20 30 78 30 30 30 30  on +12) = 0x0000
3640: 30 30 30 30 3b 0a 20 20 2a 28 75 6e 73 69 67 6e  0000;.  *(unsign
3650: 65 64 20 69 6e 74 20 2a 29 20 28 66 75 6e 63 74  ed int *) (funct
3660: 69 6f 6e 20 2b 31 36 29 20 3d 20 28 75 6e 73 69  ion +16) = (unsi
3670: 67 6e 65 64 20 69 6e 74 29 20 64 61 74 61 3b 0a  gned int) data;.
3680: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74    *(unsigned int
3690: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32   *) (function +2
36a0: 30 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 69  0) = (unsigned i
36b0: 6e 74 29 20 61 64 64 72 65 73 73 3b 0a 23 64 65  nt) address;.#de
36c0: 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 28 66 75  fine is_tramp(fu
36d0: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 69  nction)  \.  *(i
36e0: 6e 74 20 2a 29 20 20 20 20 20 20 20 20 20 20 28  nt *)          (
36f0: 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 3d  function + 0) ==
3700: 20 30 78 38 46 32 32 30 30 31 30 20 26 26 20 5c   0x8F220010 && \
3710: 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 20 20  .  *(int *)     
3720: 20 20 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b       (function +
3730: 20 34 29 20 3d 3d 20 30 78 38 46 33 39 30 30 31   4) == 0x8F39001
3740: 34 20 26 26 20 5c 0a 20 20 2a 28 69 6e 74 20 2a  4 && \.  *(int *
3750: 29 20 20 20 20 20 20 20 20 20 20 28 66 75 6e 63  )          (func
3760: 74 69 6f 6e 20 2b 20 38 29 20 3d 3d 20 30 78 30  tion + 8) == 0x0
3770: 33 32 30 30 30 30 38 20 26 26 20 5c 0a 20 20 2a  3200008 && \.  *
3780: 28 69 6e 74 20 2a 29 20 20 20 20 20 20 20 20 20  (int *)         
3790: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20   (function +12) 
37a0: 3d 3d 20 30 78 30 30 30 30 30 30 30 30 0a 23 64  == 0x00000000.#d
37b0: 65 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 72  efine tramp_addr
37c0: 65 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c  ess(function)  \
37d0: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e  .  *(unsigned in
37e0: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
37f0: 32 30 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d  20).#define tram
3800: 70 5f 64 61 74 61 28 66 75 6e 63 74 69 6f 6e 29  p_data(function)
3810: 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64    \.  *(unsigned
3820: 20 69 6e 74 20 2a 29 20 28 66 75 6e 63 74 69 6f   int *) (functio
3830: 6e 20 2b 31 36 29 0a 23 65 6e 64 69 66 0a 23 69  n +16).#endif.#i
3840: 66 64 65 66 20 5f 5f 6d 69 70 73 36 34 6f 6c 64  fdef __mips64old
3850: 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e  __.  /* function
3860: 3a 0a 20 20 20 2a 20 20 20 20 64 6c 69 20 24 32  :.   *    dli $2
3870: 2c 3c 64 61 74 61 3e 09 09 09 33 43 20 30 32 20  ,<data>...3C 02 
3880: 68 69 31 36 28 68 69 33 32 28 3c 64 61 74 61 3e  hi16(hi32(<data>
3890: 29 29 0a 20 20 20 2a 09 09 09 09 09 33 34 20 34  )).   *.....34 4
38a0: 32 20 6c 6f 31 36 28 68 69 33 32 28 3c 64 61 74  2 lo16(hi32(<dat
38b0: 61 3e 29 29 0a 20 20 20 2a 09 09 09 09 09 30 30  a>)).   *.....00
38c0: 20 30 32 20 31 34 20 33 38 0a 20 20 20 2a 09 09   02 14 38.   *..
38d0: 09 09 09 33 34 20 34 32 20 68 69 31 36 28 6c 6f  ...34 42 hi16(lo
38e0: 33 32 28 3c 64 61 74 61 3e 29 29 0a 20 20 20 2a  32(<data>)).   *
38f0: 09 09 09 09 09 30 30 20 30 32 20 31 34 20 33 38  .....00 02 14 38
3900: 0a 20 20 20 2a 09 09 09 09 09 33 34 20 34 32 20  .   *.....34 42 
3910: 6c 6f 31 36 28 6c 6f 33 32 28 3c 64 61 74 61 3e  lo16(lo32(<data>
3920: 29 29 0a 20 20 20 2a 20 20 20 20 64 6c 69 20 24  )).   *    dli $
3930: 32 35 2c 3c 61 64 64 72 65 73 73 3e 09 09 33 43  25,<address>..3C
3940: 20 31 39 20 68 69 31 36 28 68 69 33 32 28 3c 61   19 hi16(hi32(<a
3950: 64 64 72 65 73 73 3e 29 29 0a 20 20 20 2a 09 09  ddress>)).   *..
3960: 09 09 09 33 37 20 33 39 20 6c 6f 31 36 28 68 69  ...37 39 lo16(hi
3970: 33 32 28 3c 61 64 64 72 65 73 73 3e 29 29 0a 20  32(<address>)). 
3980: 20 20 2a 09 09 09 09 09 30 30 20 31 39 20 43 43    *.....00 19 CC
3990: 20 33 38 0a 20 20 20 2a 09 09 09 09 09 33 37 20   38.   *.....37 
39a0: 33 39 20 68 69 31 36 28 6c 6f 33 32 28 3c 61 64  39 hi16(lo32(<ad
39b0: 64 72 65 73 73 3e 29 29 0a 20 20 20 2a 09 09 09  dress>)).   *...
39c0: 09 09 30 30 20 31 39 20 43 43 20 33 38 0a 20 20  ..00 19 CC 38.  
39d0: 20 2a 09 09 09 09 09 33 37 20 33 39 20 6c 6f 31   *.....37 39 lo1
39e0: 36 28 6c 6f 33 32 28 3c 61 64 64 72 65 73 73 3e  6(lo32(<address>
39f0: 29 29 0a 20 20 20 2a 20 20 20 20 6a 20 24 32 35  )).   *    j $25
3a00: 09 09 09 09 30 33 20 32 30 20 30 30 20 30 38 0a  ....03 20 00 08.
3a10: 20 20 20 2a 20 20 20 20 6e 6f 70 09 09 09 09 30     *    nop....0
3a20: 30 20 30 30 20 30 30 20 30 30 0a 20 20 20 2a 2f  0 00 00 00.   */
3a30: 0a 20 20 2f 2a 20 57 68 61 74 20 61 62 6f 75 74  .  /* What about
3a40: 20 62 69 67 20 65 6e 64 69 61 6e 20 2f 20 6c 69   big endian / li
3a50: 74 74 6c 65 20 65 6e 64 69 61 6e 20 3f 3f 20 2a  ttle endian ?? *
3a60: 2f 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28  /.  *(short *) (
3a70: 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20  function + 0) = 
3a80: 30 78 33 43 30 32 3b 0a 20 20 2a 28 73 68 6f 72  0x3C02;.  *(shor
3a90: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
3aa0: 20 32 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20   2) = (unsigned 
3ab0: 6c 6f 6e 67 29 20 64 61 74 61 20 3e 3e 20 34 38  long) data >> 48
3ac0: 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28  ;.  *(short *) (
3ad0: 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 20  function + 4) = 
3ae0: 30 78 33 34 34 32 3b 0a 20 20 2a 28 73 68 6f 72  0x3442;.  *(shor
3af0: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
3b00: 20 36 29 20 3d 20 28 28 75 6e 73 69 67 6e 65 64   6) = ((unsigned
3b10: 20 6c 6f 6e 67 29 20 64 61 74 61 20 3e 3e 20 33   long) data >> 3
3b20: 32 29 20 26 20 30 78 66 66 66 66 3b 0a 20 20 2a  2) & 0xffff;.  *
3b30: 28 69 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74  (int *)   (funct
3b40: 69 6f 6e 20 2b 20 38 29 20 3d 20 30 78 30 30 30  ion + 8) = 0x000
3b50: 32 31 34 33 38 3b 0a 20 20 2a 28 73 68 6f 72 74  21438;.  *(short
3b60: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31   *) (function +1
3b70: 32 29 20 3d 20 30 78 33 34 34 32 3b 0a 20 20 2a  2) = 0x3442;.  *
3b80: 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74  (short *) (funct
3b90: 69 6f 6e 20 2b 31 34 29 20 3d 20 28 28 75 6e 73  ion +14) = ((uns
3ba0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 61 74 61  igned long) data
3bb0: 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66 66 66   >> 16) & 0xffff
3bc0: 3b 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 28  ;.  *(int *)   (
3bd0: 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20  function +16) = 
3be0: 30 78 30 30 30 32 31 34 33 38 3b 0a 20 20 2a 28  0x00021438;.  *(
3bf0: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
3c00: 6f 6e 20 2b 32 30 29 20 3d 20 30 78 33 34 34 32  on +20) = 0x3442
3c10: 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28  ;.  *(short *) (
3c20: 66 75 6e 63 74 69 6f 6e 20 2b 32 32 29 20 3d 20  function +22) = 
3c30: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
3c40: 64 61 74 61 20 26 20 30 78 66 66 66 66 3b 0a 20  data & 0xffff;. 
3c50: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e   *(short *) (fun
3c60: 63 74 69 6f 6e 20 2b 32 34 29 20 3d 20 30 78 33  ction +24) = 0x3
3c70: 43 31 39 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a  C19;.  *(short *
3c80: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 36 29  ) (function +26)
3c90: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e   = (unsigned lon
3ca0: 67 29 20 61 64 64 72 65 73 73 20 3e 3e 20 34 38  g) address >> 48
3cb0: 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28  ;.  *(short *) (
3cc0: 66 75 6e 63 74 69 6f 6e 20 2b 32 38 29 20 3d 20  function +28) = 
3cd0: 30 78 33 37 33 39 3b 0a 20 20 2a 28 73 68 6f 72  0x3739;.  *(shor
3ce0: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
3cf0: 33 30 29 20 3d 20 28 28 75 6e 73 69 67 6e 65 64  30) = ((unsigned
3d00: 20 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 20 3e   long) address >
3d10: 3e 20 33 32 29 20 26 20 30 78 66 66 66 66 3b 0a  > 32) & 0xffff;.
3d20: 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 28 66 75    *(int *)   (fu
3d30: 6e 63 74 69 6f 6e 20 2b 33 32 29 20 3d 20 30 78  nction +32) = 0x
3d40: 30 30 31 39 43 43 33 38 3b 0a 20 20 2a 28 73 68  0019CC38;.  *(sh
3d50: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ort *) (function
3d60: 20 2b 33 36 29 20 3d 20 30 78 33 37 33 39 3b 0a   +36) = 0x3739;.
3d70: 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75    *(short *) (fu
3d80: 6e 63 74 69 6f 6e 20 2b 33 38 29 20 3d 20 28 28  nction +38) = ((
3d90: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 61  unsigned long) a
3da0: 64 64 72 65 73 73 20 3e 3e 20 31 36 29 20 26 20  ddress >> 16) & 
3db0: 30 78 66 66 66 66 3b 0a 20 20 2a 28 69 6e 74 20  0xffff;.  *(int 
3dc0: 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b  *)   (function +
3dd0: 34 30 29 20 3d 20 30 78 30 30 31 39 43 43 33 38  40) = 0x0019CC38
3de0: 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28  ;.  *(short *) (
3df0: 66 75 6e 63 74 69 6f 6e 20 2b 34 34 29 20 3d 20  function +44) = 
3e00: 30 78 33 37 33 39 3b 0a 20 20 2a 28 73 68 6f 72  0x3739;.  *(shor
3e10: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
3e20: 34 36 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  46) = (unsigned 
3e30: 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 20 26 20  long) address & 
3e40: 30 78 66 66 66 66 3b 0a 20 20 2a 28 69 6e 74 20  0xffff;.  *(int 
3e50: 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b  *)   (function +
3e60: 34 38 29 20 3d 20 30 78 30 33 32 30 30 30 30 38  48) = 0x03200008
3e70: 3b 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 28  ;.  *(int *)   (
3e80: 66 75 6e 63 74 69 6f 6e 20 2b 35 32 29 20 3d 20  function +52) = 
3e90: 30 78 30 30 30 30 30 30 30 30 3b 0a 23 64 65 66  0x00000000;.#def
3ea0: 69 6e 65 20 69 73 5f 74 72 61 6d 70 28 66 75 6e  ine is_tramp(fun
3eb0: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e  ction)  \.  *(un
3ec0: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20  signed short *) 
3ed0: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d  (function + 0) =
3ee0: 3d 20 30 78 33 43 30 32 20 26 26 20 5c 0a 20 20  = 0x3C02 && \.  
3ef0: 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74  *(unsigned short
3f00: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20   *) (function + 
3f10: 34 29 20 3d 3d 20 30 78 33 34 34 32 20 26 26 20  4) == 0x3442 && 
3f20: 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69  \.  *(unsigned i
3f30: 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f  nt *)   (functio
3f40: 6e 20 2b 20 38 29 20 3d 3d 20 30 78 30 30 30 32  n + 8) == 0x0002
3f50: 31 34 33 38 20 26 26 20 5c 0a 20 20 2a 28 75 6e  1438 && \.  *(un
3f60: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20  signed short *) 
3f70: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d  (function +12) =
3f80: 3d 20 30 78 33 34 34 32 20 26 26 20 5c 0a 20 20  = 0x3442 && \.  
3f90: 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a  *(unsigned int *
3fa0: 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31  )   (function +1
3fb0: 36 29 20 3d 3d 20 30 78 30 30 30 32 31 34 33 38  6) == 0x00021438
3fc0: 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e   && \.  *(unsign
3fd0: 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e  ed short *) (fun
3fe0: 63 74 69 6f 6e 20 2b 32 30 29 20 3d 3d 20 30 78  ction +20) == 0x
3ff0: 33 34 34 32 20 26 26 20 5c 0a 20 20 2a 28 75 6e  3442 && \.  *(un
4000: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20  signed short *) 
4010: 28 66 75 6e 63 74 69 6f 6e 20 2b 32 34 29 20 3d  (function +24) =
4020: 3d 20 30 78 33 43 31 39 20 26 26 20 5c 0a 20 20  = 0x3C19 && \.  
4030: 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74  *(unsigned short
4040: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32   *) (function +2
4050: 38 29 20 3d 3d 20 30 78 33 37 33 39 20 26 26 20  8) == 0x3739 && 
4060: 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69  \.  *(unsigned i
4070: 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f  nt *)   (functio
4080: 6e 20 2b 33 32 29 20 3d 3d 20 30 78 30 30 31 39  n +32) == 0x0019
4090: 43 43 33 38 20 26 26 20 5c 0a 20 20 2a 28 75 6e  CC38 && \.  *(un
40a0: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20  signed short *) 
40b0: 28 66 75 6e 63 74 69 6f 6e 20 2b 33 36 29 20 3d  (function +36) =
40c0: 3d 20 30 78 33 37 33 39 20 26 26 20 5c 0a 20 20  = 0x3739 && \.  
40d0: 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a  *(unsigned int *
40e0: 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 34  )   (function +4
40f0: 30 29 20 3d 3d 20 30 78 30 30 31 39 43 43 33 38  0) == 0x0019CC38
4100: 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e   && \.  *(unsign
4110: 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e  ed short *) (fun
4120: 63 74 69 6f 6e 20 2b 34 34 29 20 3d 3d 20 30 78  ction +44) == 0x
4130: 33 37 33 39 20 26 26 20 5c 0a 20 20 2a 28 75 6e  3739 && \.  *(un
4140: 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 20 20  signed int *)   
4150: 28 66 75 6e 63 74 69 6f 6e 20 2b 34 38 29 20 3d  (function +48) =
4160: 3d 20 30 78 30 33 32 30 30 30 30 38 20 26 26 20  = 0x03200008 && 
4170: 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69  \.  *(unsigned i
4180: 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f  nt *)   (functio
4190: 6e 20 2b 35 32 29 20 3d 3d 20 30 78 30 30 30 30  n +52) == 0x0000
41a0: 30 30 30 30 0a 23 64 65 66 69 6e 65 20 68 69 6c  0000.#define hil
41b0: 6f 28 77 6f 72 64 33 2c 77 6f 72 64 32 2c 77 6f  o(word3,word2,wo
41c0: 72 64 31 2c 77 6f 72 64 30 29 20 20 5c 0a 20 20  rd1,word0)  \.  
41d0: 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  (((unsigned long
41e0: 29 20 28 77 6f 72 64 33 29 20 3c 3c 20 34 38 29  ) (word3) << 48)
41f0: 20 7c 20 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f   | ((unsigned lo
4200: 6e 67 29 20 28 77 6f 72 64 32 29 20 3c 3c 20 33  ng) (word2) << 3
4210: 32 29 20 7c 20 5c 0a 20 20 20 28 28 75 6e 73 69  2) | \.   ((unsi
4220: 67 6e 65 64 20 6c 6f 6e 67 29 20 28 77 6f 72 64  gned long) (word
4230: 31 29 20 3c 3c 20 31 36 29 20 7c 20 28 75 6e 73  1) << 16) | (uns
4240: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 77 6f 72  igned long) (wor
4250: 64 30 29 29 0a 23 64 65 66 69 6e 65 20 74 72 61  d0)).#define tra
4260: 6d 70 5f 61 64 64 72 65 73 73 28 66 75 6e 63 74  mp_address(funct
4270: 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c 6f 28 2a  ion)  \.  hilo(*
4280: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20  (unsigned short 
4290: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 36  *) (function +26
42a0: 29 2c 20 5c 0a 20 20 20 20 20 20 20 2a 28 75 6e  ), \.       *(un
42b0: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20  signed short *) 
42c0: 28 66 75 6e 63 74 69 6f 6e 20 2b 33 30 29 2c 20  (function +30), 
42d0: 5c 0a 20 20 20 20 20 20 20 2a 28 75 6e 73 69 67  \.       *(unsig
42e0: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75  ned short *) (fu
42f0: 6e 63 74 69 6f 6e 20 2b 33 38 29 2c 20 5c 0a 20  nction +38), \. 
4300: 20 20 20 20 20 20 2a 28 75 6e 73 69 67 6e 65 64        *(unsigned
4310: 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74   short *) (funct
4320: 69 6f 6e 20 2b 34 36 29 29 0a 23 64 65 66 69 6e  ion +46)).#defin
4330: 65 20 74 72 61 6d 70 5f 64 61 74 61 28 66 75 6e  e tramp_data(fun
4340: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c 6f  ction)  \.  hilo
4350: 28 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72  (*(unsigned shor
4360: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
4370: 20 32 29 2c 20 5c 0a 20 20 20 20 20 20 20 2a 28   2), \.       *(
4380: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a  unsigned short *
4390: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 36 29  ) (function + 6)
43a0: 2c 20 5c 0a 20 20 20 20 20 20 20 2a 28 75 6e 73  , \.       *(uns
43b0: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28  igned short *) (
43c0: 66 75 6e 63 74 69 6f 6e 20 2b 31 34 29 2c 20 5c  function +14), \
43d0: 0a 20 20 20 20 20 20 20 2a 28 75 6e 73 69 67 6e  .       *(unsign
43e0: 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e  ed short *) (fun
43f0: 63 74 69 6f 6e 20 2b 32 32 29 29 0a 23 65 6e 64  ction +22)).#end
4400: 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d 69 70 73  if.#ifdef __mips
4410: 36 34 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 69  64__.  /* functi
4420: 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 6c 64 20 24  on:.   *    ld $
4430: 32 2c 31 36 28 24 32 35 29 09 09 09 44 46 20 32  2,16($25)...DF 2
4440: 32 20 30 30 20 31 30 0a 20 20 20 2a 20 20 20 20  2 00 10.   *    
4450: 6c 64 20 24 32 35 2c 32 34 28 24 32 35 29 09 09  ld $25,24($25)..
4460: 09 44 46 20 33 39 20 30 30 20 31 38 0a 20 20 20  .DF 39 00 18.   
4470: 2a 20 20 20 20 6a 20 24 32 35 09 09 09 09 30 33  *    j $25....03
4480: 20 32 30 20 30 30 20 30 38 0a 20 20 20 2a 20 20   20 00 08.   *  
4490: 20 20 6e 6f 70 09 09 09 09 30 30 20 30 30 20 30    nop....00 00 0
44a0: 30 20 30 30 0a 20 20 20 2a 20 20 20 20 2e 64 77  0 00.   *    .dw
44b0: 6f 72 64 20 3c 64 61 74 61 3e 09 09 09 3c 64 61  ord <data>...<da
44c0: 74 61 3e 0a 20 20 20 2a 20 20 20 20 2e 64 77 6f  ta>.   *    .dwo
44d0: 72 64 20 3c 61 64 64 72 65 73 73 3e 09 09 3c 61  rd <address>..<a
44e0: 64 64 72 65 73 73 3e 0a 20 20 20 2a 2f 0a 20 20  ddress>.   */.  
44f0: 2f 2a 20 57 68 61 74 20 61 62 6f 75 74 20 62 69  /* What about bi
4500: 67 20 65 6e 64 69 61 6e 20 2f 20 6c 69 74 74 6c  g endian / littl
4510: 65 20 65 6e 64 69 61 6e 20 3f 3f 20 2a 2f 0a 20  e endian ?? */. 
4520: 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 20 20 20 20   *(long *)      
4530: 20 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20      (function + 
4540: 30 29 20 3d 20 30 78 44 46 32 32 30 30 31 30 44  0) = 0xDF220010D
4550: 46 33 39 30 30 31 38 4c 3b 0a 20 20 2a 28 6c 6f  F390018L;.  *(lo
4560: 6e 67 20 2a 29 20 20 20 20 20 20 20 20 20 20 28  ng *)          (
4570: 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20  function + 8) = 
4580: 30 78 30 33 32 30 30 30 30 38 30 30 30 30 30 30  0x03200008000000
4590: 30 30 4c 3b 0a 20 20 2a 28 75 6e 73 69 67 6e 65  00L;.  *(unsigne
45a0: 64 20 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74  d long *) (funct
45b0: 69 6f 6e 20 2b 31 36 29 20 3d 20 28 75 6e 73 69  ion +16) = (unsi
45c0: 67 6e 65 64 20 6c 6f 6e 67 29 20 64 61 74 61 3b  gned long) data;
45d0: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .  *(unsigned lo
45e0: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  ng *) (function 
45f0: 2b 32 34 29 20 3d 20 28 75 6e 73 69 67 6e 65 64  +24) = (unsigned
4600: 20 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 3b 0a   long) address;.
4610: 23 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70  #define is_tramp
4620: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20  (function)  \.  
4630: 2a 28 6c 6f 6e 67 20 2a 29 20 20 20 20 20 20 20  *(long *)       
4640: 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30     (function + 0
4650: 29 20 3d 3d 20 30 78 44 46 32 32 30 30 31 30 44  ) == 0xDF220010D
4660: 46 33 39 30 30 31 38 4c 20 26 26 20 5c 0a 20 20  F390018L && \.  
4670: 2a 28 6c 6f 6e 67 20 2a 29 20 20 20 20 20 20 20  *(long *)       
4680: 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38     (function + 8
4690: 29 20 3d 3d 20 30 78 30 33 32 30 30 30 30 38 30  ) == 0x032000080
46a0: 30 30 30 30 30 30 30 4c 0a 23 64 65 66 69 6e 65  0000000L.#define
46b0: 20 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66   tramp_address(f
46c0: 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28  unction)  \.  *(
46d0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 29  unsigned long *)
46e0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 34 29 0a   (function +24).
46f0: 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61  #define tramp_da
4700: 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a  ta(function)  \.
4710: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e    *(unsigned lon
4720: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  g *) (function +
4730: 31 36 29 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  16).#endif.#if d
4740: 65 66 69 6e 65 64 28 5f 5f 73 70 61 72 63 5f 5f  efined(__sparc__
4750: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f  ) && !defined(__
4760: 73 70 61 72 63 36 34 5f 5f 29 0a 20 20 2f 2a 20  sparc64__).  /* 
4770: 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20  function:.   *  
4780: 20 20 73 65 74 68 69 20 25 68 69 28 3c 64 61 74    sethi %hi(<dat
4790: 61 3e 29 2c 25 67 32 09 09 30 35 30 30 30 30 30  a>),%g2..0500000
47a0: 30 20 7c 20 28 3c 64 61 74 61 3e 20 3e 3e 20 31  0 | (<data> >> 1
47b0: 30 29 0a 20 20 20 2a 20 20 20 20 73 65 74 68 69  0).   *    sethi
47c0: 20 25 68 69 28 3c 61 64 64 72 65 73 73 3e 29 2c   %hi(<address>),
47d0: 25 67 31 09 30 33 30 30 30 30 30 30 20 7c 20 28  %g1.03000000 | (
47e0: 3c 61 64 64 72 65 73 73 3e 20 3e 3e 20 31 30 29  <address> >> 10)
47f0: 0a 20 20 20 2a 20 20 20 20 6a 6d 70 20 25 67 31  .   *    jmp %g1
4800: 2b 25 6c 6f 28 3c 61 64 64 72 65 73 73 3e 29 09  +%lo(<address>).
4810: 09 38 31 43 30 36 30 30 30 20 7c 20 28 3c 61 64  .81C06000 | (<ad
4820: 64 72 65 73 73 3e 20 26 20 30 78 33 66 66 29 0a  dress> & 0x3ff).
4830: 20 20 20 2a 20 20 20 20 6f 72 20 25 67 32 2c 25     *    or %g2,%
4840: 6c 6f 28 3c 64 61 74 61 3e 29 2c 25 67 32 09 09  lo(<data>),%g2..
4850: 38 34 31 30 41 30 30 30 20 7c 20 28 3c 64 61 74  8410A000 | (<dat
4860: 61 3e 20 26 20 30 78 33 66 66 29 0a 20 20 20 2a  a> & 0x3ff).   *
4870: 2f 0a 23 64 65 66 69 6e 65 20 68 69 28 77 6f 72  /.#define hi(wor
4880: 64 29 20 20 28 28 75 6e 73 69 67 6e 65 64 20 6c  d)  ((unsigned l
4890: 6f 6e 67 29 20 28 77 6f 72 64 29 20 3e 3e 20 31  ong) (word) >> 1
48a0: 30 29 0a 23 64 65 66 69 6e 65 20 6c 6f 28 77 6f  0).#define lo(wo
48b0: 72 64 29 20 20 28 28 75 6e 73 69 67 6e 65 64 20  rd)  ((unsigned 
48c0: 6c 6f 6e 67 29 20 28 77 6f 72 64 29 20 26 20 30  long) (word) & 0
48d0: 78 33 66 66 29 0a 20 20 2a 28 6c 6f 6e 67 20 2a  x3ff).  *(long *
48e0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29  ) (function + 0)
48f0: 20 3d 20 30 78 30 35 30 30 30 30 30 30 20 7c 20   = 0x05000000 | 
4900: 68 69 28 64 61 74 61 29 3b 0a 20 20 2a 28 6c 6f  hi(data);.  *(lo
4910: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  ng *) (function 
4920: 2b 20 34 29 20 3d 20 30 78 30 33 30 30 30 30 30  + 4) = 0x0300000
4930: 30 20 7c 20 68 69 28 61 64 64 72 65 73 73 29 3b  0 | hi(address);
4940: 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75  .  *(long *) (fu
4950: 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 30 78  nction + 8) = 0x
4960: 38 31 43 30 36 30 30 30 20 7c 20 6c 6f 28 61 64  81C06000 | lo(ad
4970: 64 72 65 73 73 29 3b 0a 20 20 2a 28 6c 6f 6e 67  dress);.  *(long
4980: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31   *) (function +1
4990: 32 29 20 3d 20 30 78 38 34 31 30 41 30 30 30 20  2) = 0x8410A000 
49a0: 7c 20 6c 6f 28 64 61 74 61 29 3b 0a 23 64 65 66  | lo(data);.#def
49b0: 69 6e 65 20 69 73 5f 74 72 61 6d 70 28 66 75 6e  ine is_tramp(fun
49c0: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 2a 28 6c  ction)  \.  (*(l
49d0: 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ong *) (function
49e0: 20 2b 20 30 29 20 26 20 30 78 66 66 63 30 30 30   + 0) & 0xffc000
49f0: 30 30 29 20 3d 3d 20 30 78 30 35 30 30 30 30 30  00) == 0x0500000
4a00: 30 20 26 26 20 5c 0a 20 20 28 2a 28 6c 6f 6e 67  0 && \.  (*(long
4a10: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20   *) (function + 
4a20: 34 29 20 26 20 30 78 66 66 63 30 30 30 30 30 29  4) & 0xffc00000)
4a30: 20 3d 3d 20 30 78 30 33 30 30 30 30 30 30 20 26   == 0x03000000 &
4a40: 26 20 5c 0a 20 20 28 2a 28 6c 6f 6e 67 20 2a 29  & \.  (*(long *)
4a50: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20   (function + 8) 
4a60: 26 20 30 78 66 66 66 66 66 63 30 30 29 20 3d 3d  & 0xfffffc00) ==
4a70: 20 30 78 38 31 43 30 36 30 30 30 20 26 26 20 5c   0x81C06000 && \
4a80: 0a 20 20 28 2a 28 6c 6f 6e 67 20 2a 29 20 28 66  .  (*(long *) (f
4a90: 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 26 20 30  unction +12) & 0
4aa0: 78 66 66 66 66 66 63 30 30 29 20 3d 3d 20 30 78  xfffffc00) == 0x
4ab0: 38 34 31 30 41 30 30 30 0a 23 64 65 66 69 6e 65  8410A000.#define
4ac0: 20 68 69 6c 6f 28 68 69 77 6f 72 64 2c 6c 6f 77   hilo(hiword,low
4ad0: 6f 72 64 29 20 20 28 28 28 68 69 77 6f 72 64 29  ord)  (((hiword)
4ae0: 20 3c 3c 20 31 30 29 20 7c 20 28 28 6c 6f 77 6f   << 10) | ((lowo
4af0: 72 64 29 20 26 20 30 78 33 66 66 29 29 0a 23 64  rd) & 0x3ff)).#d
4b00: 65 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 72  efine tramp_addr
4b10: 65 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c  ess(function)  \
4b20: 0a 20 20 68 69 6c 6f 28 2a 28 6c 6f 6e 67 20 2a  .  hilo(*(long *
4b30: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29  ) (function + 4)
4b40: 2c 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e  , *(long *) (fun
4b50: 63 74 69 6f 6e 20 2b 20 38 29 29 0a 23 64 65 66  ction + 8)).#def
4b60: 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 28 66  ine tramp_data(f
4b70: 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69  unction)  \.  hi
4b80: 6c 6f 28 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75  lo(*(long *) (fu
4b90: 6e 63 74 69 6f 6e 20 2b 20 30 29 2c 20 2a 28 6c  nction + 0), *(l
4ba0: 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ong *) (function
4bb0: 20 2b 31 32 29 29 0a 23 65 6e 64 69 66 0a 23 69   +12)).#endif.#i
4bc0: 66 64 65 66 20 5f 5f 73 70 61 72 63 36 34 5f 5f  fdef __sparc64__
4bd0: 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a  .  /* function:.
4be0: 20 20 20 2a 20 20 20 20 72 64 20 25 70 63 2c 25     *    rd %pc,%
4bf0: 67 31 09 09 09 38 33 34 31 34 30 30 30 0a 20 20  g1...83414000.  
4c00: 20 2a 20 20 20 20 6c 64 78 20 5b 25 67 31 2b 32   *    ldx [%g1+2
4c10: 34 5d 2c 25 67 32 09 09 43 34 35 38 36 30 31 38  4],%g2..C4586018
4c20: 0a 20 20 20 2a 20 20 20 20 6a 6d 70 20 25 67 32  .   *    jmp %g2
4c30: 09 09 09 09 38 31 43 30 38 30 30 30 0a 20 20 20  ....81C08000.   
4c40: 2a 20 20 20 20 6c 64 78 20 5b 25 67 31 2b 31 36  *    ldx [%g1+16
4c50: 5d 2c 25 67 35 09 09 43 41 35 38 36 30 31 30 0a  ],%g5..CA586010.
4c60: 20 20 20 2a 20 20 20 20 2e 6c 6f 6e 67 20 68 69     *    .long hi
4c70: 67 68 33 32 28 3c 64 61 74 61 3e 29 09 09 3c 64  gh32(<data>)..<d
4c80: 61 74 61 3e 20 3e 3e 20 33 32 0a 20 20 20 2a 20  ata> >> 32.   * 
4c90: 20 20 20 2e 6c 6f 6e 67 20 6c 6f 77 33 32 28 3c     .long low32(<
4ca0: 64 61 74 61 3e 29 09 09 3c 64 61 74 61 3e 20 26  data>)..<data> &
4cb0: 20 30 78 66 66 66 66 66 66 66 66 0a 20 20 20 2a   0xffffffff.   *
4cc0: 20 20 20 20 2e 6c 6f 6e 67 20 68 69 67 68 33 32      .long high32
4cd0: 28 3c 61 64 64 72 65 73 73 3e 29 09 09 3c 61 64  (<address>)..<ad
4ce0: 64 72 65 73 73 3e 20 3e 3e 20 33 32 0a 20 20 20  dress> >> 32.   
4cf0: 2a 20 20 20 20 2e 6c 6f 6e 67 20 6c 6f 77 33 32  *    .long low32
4d00: 28 3c 61 64 64 72 65 73 73 3e 29 09 09 3c 61 64  (<address>)..<ad
4d10: 64 72 65 73 73 3e 20 26 20 30 78 66 66 66 66 66  dress> & 0xfffff
4d20: 66 66 66 0a 20 20 20 2a 2f 0a 20 20 2a 28 69 6e  fff.   */.  *(in
4d30: 74 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20  t *)  (function 
4d40: 2b 20 30 29 20 3d 20 30 78 38 33 34 31 34 30 30  + 0) = 0x8341400
4d50: 30 3b 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 28  0;.  *(int *)  (
4d60: 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 20  function + 4) = 
4d70: 30 78 43 34 35 38 36 30 31 38 3b 0a 20 20 2a 28  0xC4586018;.  *(
4d80: 69 6e 74 20 2a 29 20 20 28 66 75 6e 63 74 69 6f  int *)  (functio
4d90: 6e 20 2b 20 38 29 20 3d 20 30 78 38 31 43 30 38  n + 8) = 0x81C08
4da0: 30 30 30 3b 0a 20 20 2a 28 69 6e 74 20 2a 29 20  000;.  *(int *) 
4db0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20   (function +12) 
4dc0: 3d 20 30 78 43 41 35 38 36 30 31 30 3b 0a 20 20  = 0xCA586010;.  
4dd0: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74  *(long *) (funct
4de0: 69 6f 6e 20 2b 31 36 29 20 3d 20 28 6c 6f 6e 67  ion +16) = (long
4df0: 29 20 64 61 74 61 3b 0a 20 20 2a 28 6c 6f 6e 67  ) data;.  *(long
4e00: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32   *) (function +2
4e10: 34 29 20 3d 20 28 6c 6f 6e 67 29 20 61 64 64 72  4) = (long) addr
4e20: 65 73 73 3b 0a 23 64 65 66 69 6e 65 20 69 73 5f  ess;.#define is_
4e30: 74 72 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20  tramp(function) 
4e40: 20 5c 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 28   \.  *(int *)  (
4e50: 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 3d  function + 0) ==
4e60: 20 30 78 38 33 34 31 34 30 30 30 20 26 26 20 5c   0x83414000 && \
4e70: 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 28 66 75  .  *(int *)  (fu
4e80: 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 3d 20 30  nction + 4) == 0
4e90: 78 43 34 35 38 36 30 31 38 20 26 26 20 5c 0a 20  xC4586018 && \. 
4ea0: 20 2a 28 69 6e 74 20 2a 29 20 20 28 66 75 6e 63   *(int *)  (func
4eb0: 74 69 6f 6e 20 2b 20 38 29 20 3d 3d 20 30 78 38  tion + 8) == 0x8
4ec0: 31 43 30 38 30 30 30 20 26 26 20 5c 0a 20 20 2a  1C08000 && \.  *
4ed0: 28 69 6e 74 20 2a 29 20 20 28 66 75 6e 63 74 69  (int *)  (functi
4ee0: 6f 6e 20 2b 31 32 29 20 3d 3d 20 30 78 43 41 35  on +12) == 0xCA5
4ef0: 38 36 30 31 30 0a 23 64 65 66 69 6e 65 20 74 72  86010.#define tr
4f00: 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75 6e 63  amp_address(func
4f10: 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 6c 6f 6e  tion)  \.  *(lon
4f20: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  g *) (function +
4f30: 32 34 29 0a 23 64 65 66 69 6e 65 20 74 72 61 6d  24).#define tram
4f40: 70 5f 64 61 74 61 28 66 75 6e 63 74 69 6f 6e 29  p_data(function)
4f50: 20 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20    \.  *(long *) 
4f60: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 36 29 0a 23  (function +16).#
4f70: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 61  endif.#ifdef __a
4f80: 6c 70 68 61 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63  lpha__.  /* func
4f90: 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 62 72  tion:.   *    br
4fa0: 20 24 31 2c 66 75 6e 63 74 69 6f 6e 2e 2e 6e 67   $1,function..ng
4fb0: 09 30 30 20 30 30 20 32 30 20 43 30 0a 20 20 20  .00 00 20 C0.   
4fc0: 2a 20 66 75 6e 63 74 69 6f 6e 2e 2e 6e 67 3a 0a  * function..ng:.
4fd0: 20 20 20 2a 20 20 20 20 6c 64 71 20 24 32 37 2c     *    ldq $27,
4fe0: 32 30 28 24 31 29 09 09 31 34 20 30 30 20 36 31  20($1)..14 00 61
4ff0: 20 41 37 0a 20 20 20 2a 20 20 20 20 6c 64 71 20   A7.   *    ldq 
5000: 24 31 2c 31 32 28 24 31 29 09 09 30 43 20 30 30  $1,12($1)..0C 00
5010: 20 32 31 20 41 34 0a 20 20 20 2a 20 20 20 20 6a   21 A4.   *    j
5020: 6d 70 20 24 33 31 2c 28 24 32 37 29 2c 30 09 09  mp $31,($27),0..
5030: 30 30 20 30 30 20 46 42 20 36 42 0a 20 20 20 2a  00 00 FB 6B.   *
5040: 20 20 20 20 2e 71 75 61 64 20 3c 64 61 74 61 3e      .quad <data>
5050: 09 09 3c 64 61 74 61 3e 0a 20 20 20 2a 20 20 20  ..<data>.   *   
5060: 20 2e 71 75 61 64 20 3c 61 64 64 72 65 73 73 3e   .quad <address>
5070: 09 09 3c 61 64 64 72 65 73 73 3e 0a 20 20 20 2a  ..<address>.   *
5080: 2f 0a 20 20 7b 20 73 74 61 74 69 63 20 69 6e 74  /.  { static int
5090: 20 63 6f 64 65 20 5b 34 5d 20 3d 0a 20 20 20 20   code [4] =.    
50a0: 20 20 7b 20 30 78 43 30 32 30 30 30 30 30 2c 20    { 0xC0200000, 
50b0: 30 78 41 37 36 31 30 30 31 34 2c 20 30 78 41 34  0xA7610014, 0xA4
50c0: 32 31 30 30 30 43 2c 20 30 78 36 42 46 42 30 30  21000C, 0x6BFB00
50d0: 30 30 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 3b  00 };.    int i;
50e0: 0a 20 20 20 20 66 6f 72 20 28 69 3d 30 3b 20 69  .    for (i=0; i
50f0: 3c 34 3b 20 69 2b 2b 29 20 7b 20 28 28 69 6e 74  <4; i++) { ((int
5100: 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 69 5d   *) function)[i]
5110: 20 3d 20 63 6f 64 65 5b 69 5d 3b 20 7d 0a 20 20   = code[i]; }.  
5120: 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63    ((long *) func
5130: 74 69 6f 6e 29 5b 32 5d 20 3d 20 28 6c 6f 6e 67  tion)[2] = (long
5140: 29 20 64 61 74 61 3b 0a 20 20 20 20 28 28 6c 6f  ) data;.    ((lo
5150: 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b  ng *) function)[
5160: 33 5d 20 3d 20 28 6c 6f 6e 67 29 20 61 64 64 72  3] = (long) addr
5170: 65 73 73 3b 0a 20 20 7d 0a 23 64 65 66 69 6e 65  ess;.  }.#define
5180: 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69   is_tramp(functi
5190: 6f 6e 29 20 20 5c 0a 20 20 28 28 69 6e 74 20 2a  on)  \.  ((int *
51a0: 29 20 66 75 6e 63 74 69 6f 6e 29 5b 30 5d 20 3d  ) function)[0] =
51b0: 3d 20 30 78 43 30 32 30 30 30 30 30 20 26 26 20  = 0xC0200000 && 
51c0: 5c 0a 20 20 28 28 69 6e 74 20 2a 29 20 66 75 6e  \.  ((int *) fun
51d0: 63 74 69 6f 6e 29 5b 31 5d 20 3d 3d 20 30 78 41  ction)[1] == 0xA
51e0: 37 36 31 30 30 31 34 20 26 26 20 5c 0a 20 20 28  7610014 && \.  (
51f0: 28 69 6e 74 20 2a 29 20 66 75 6e 63 74 69 6f 6e  (int *) function
5200: 29 5b 32 5d 20 3d 3d 20 30 78 41 34 32 31 30 30  )[2] == 0xA42100
5210: 30 43 20 26 26 20 5c 0a 20 20 28 28 69 6e 74 20  0C && \.  ((int 
5220: 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 33 5d 20  *) function)[3] 
5230: 3d 3d 20 30 78 36 42 46 42 30 30 30 30 0a 23 64  == 0x6BFB0000.#d
5240: 65 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 72  efine tramp_addr
5250: 65 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c  ess(function)  \
5260: 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e  .  ((long *) fun
5270: 63 74 69 6f 6e 29 5b 33 5d 0a 23 64 65 66 69 6e  ction)[3].#defin
5280: 65 20 74 72 61 6d 70 5f 64 61 74 61 28 66 75 6e  e tramp_data(fun
5290: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28 28 6c 6f  ction)  \.  ((lo
52a0: 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b  ng *) function)[
52b0: 32 5d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  2].#endif.#ifdef
52c0: 20 5f 5f 68 70 70 61 6f 6c 64 5f 5f 0a 20 20 2f   __hppaold__.  /
52d0: 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a  * function:.   *
52e0: 20 20 20 20 6c 64 69 6c 20 4c 27 3c 64 61 74 61      ldil L'<data
52f0: 3e 2c 25 72 32 39 09 09 32 33 41 30 30 30 30 30  >,%r29..23A00000
5300: 20 7c 20 68 69 28 3c 64 61 74 61 3e 29 0a 20 20   | hi(<data>).  
5310: 20 2a 20 20 20 20 6c 64 69 6c 20 4c 27 3c 61 64   *    ldil L'<ad
5320: 64 72 65 73 73 3e 2c 25 72 32 31 09 09 32 32 41  dress>,%r21..22A
5330: 30 30 30 30 30 20 7c 20 68 69 28 3c 61 64 64 72  00000 | hi(<addr
5340: 65 73 73 3e 29 0a 20 20 20 2a 20 20 20 20 6c 64  ess>).   *    ld
5350: 6f 20 52 27 3c 64 61 74 61 3e 28 25 72 32 39 29  o R'<data>(%r29)
5360: 2c 25 72 32 39 09 09 33 37 42 44 30 30 30 30 20  ,%r29..37BD0000 
5370: 7c 20 6c 6f 28 3c 64 61 74 61 3e 29 0a 20 20 20  | lo(<data>).   
5380: 2a 20 20 20 20 6c 64 6f 20 52 27 3c 61 64 64 72  *    ldo R'<addr
5390: 65 73 73 3e 28 25 72 32 31 29 2c 25 72 32 31 09  ess>(%r21),%r21.
53a0: 33 36 42 35 30 30 30 30 20 7c 20 6c 6f 28 3c 61  36B50000 | lo(<a
53b0: 64 64 72 65 73 73 3e 29 0a 20 20 20 2a 20 20 20  ddress>).   *   
53c0: 20 62 62 2c 3e 3d 2c 6e 20 25 72 32 31 2c 33 30   bb,>=,n %r21,30
53d0: 2c 66 75 6e 63 74 69 6f 6e 32 09 43 37 44 35 43  ,function2.C7D5C
53e0: 30 31 32 0a 20 20 20 2a 20 20 20 20 64 65 70 69  012.   *    depi
53f0: 20 30 2c 33 31 2c 32 2c 25 72 32 31 09 09 44 36   0,31,2,%r21..D6
5400: 41 30 31 43 31 45 0a 20 20 20 2a 20 20 20 20 6c  A01C1E.   *    l
5410: 64 77 20 34 28 30 2c 25 72 32 31 29 2c 25 72 31  dw 4(0,%r21),%r1
5420: 39 09 09 34 41 42 33 30 30 30 38 0a 20 20 20 2a  9..4AB30008.   *
5430: 20 20 20 20 6c 64 77 20 30 28 30 2c 25 72 32 31      ldw 0(0,%r21
5440: 29 2c 25 72 32 31 09 09 34 41 42 35 30 30 30 30  ),%r21..4AB50000
5450: 0a 20 20 20 2a 20 66 75 6e 63 74 69 6f 6e 32 3a  .   * function2:
5460: 0a 20 20 20 2a 20 20 20 20 6c 64 73 69 64 20 28  .   *    ldsid (
5470: 30 2c 25 72 32 31 29 2c 25 72 31 09 09 30 32 41  0,%r21),%r1..02A
5480: 30 31 30 41 31 0a 20 20 20 2a 20 20 20 20 6d 74  010A1.   *    mt
5490: 73 70 20 25 72 31 2c 25 73 72 30 09 09 09 30 30  sp %r1,%sr0...00
54a0: 30 31 31 38 32 30 0a 20 20 20 2a 20 20 20 20 62  011820.   *    b
54b0: 65 2c 6e 20 30 28 25 73 72 30 2c 25 72 32 31 29  e,n 0(%sr0,%r21)
54c0: 09 09 45 32 41 30 30 30 30 32 0a 20 20 20 2a 20  ..E2A00002.   * 
54d0: 20 20 20 6e 6f 70 09 09 09 09 30 38 30 30 30 32     nop....080002
54e0: 34 30 0a 20 20 20 2a 2f 0a 20 20 2f 2a 20 57 68  40.   */.  /* Wh
54f0: 65 6e 20 64 65 63 6f 64 69 6e 67 20 61 20 32 31  en decoding a 21
5500: 2d 62 69 74 20 61 72 67 75 6d 65 6e 74 20 69 6e  -bit argument in
5510: 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c   an instruction,
5520: 20 74 68 65 20 68 70 70 61 20 70 65 72 66 6f 72   the hppa perfor
5530: 6d 73 0a 20 20 20 2a 20 74 68 65 20 66 6f 6c 6c  ms.   * the foll
5540: 6f 77 69 6e 67 20 62 69 74 20 6d 61 6e 69 70 75  owing bit manipu
5550: 6c 61 74 69 6f 6e 3a 0a 20 20 20 2a 20 61 73 73  lation:.   * ass
5560: 65 6d 62 6c 65 32 31 3a 20 78 5b 32 30 5d 2e 2e  emble21: x[20]..
5570: 2e 78 5b 30 5d 0a 20 20 20 2a 20 20 20 20 20 20  .x[0].   *      
5580: 20 2d 2d 3e 20 78 5b 30 5d 20 78 5b 31 31 5d 2e   --> x[0] x[11].
5590: 2e 2e 78 5b 31 5d 20 78 5b 31 35 5d 2e 2e 78 5b  ..x[1] x[15]..x[
55a0: 31 34 5d 20 78 5b 32 30 5d 2e 2e 2e 78 5b 31 36  14] x[20]...x[16
55b0: 5d 20 78 5b 31 33 5d 2e 2e 78 5b 31 32 5d 0a 20  ] x[13]..x[12]. 
55c0: 20 20 2a 20 57 68 65 6e 20 65 6e 63 6f 64 69 6e    * When encodin
55d0: 67 20 61 20 32 31 2d 62 69 74 20 61 72 67 75 6d  g a 21-bit argum
55e0: 65 6e 74 20 69 6e 74 6f 20 61 6e 20 69 6e 73 74  ent into an inst
55f0: 72 75 63 74 69 6f 6e 2c 20 77 65 20 6e 65 65 64  ruction, we need
5600: 20 74 68 65 0a 20 20 20 2a 20 74 6f 20 70 65 72   the.   * to per
5610: 66 6f 72 6d 20 74 68 65 20 72 65 76 65 72 73 65  form the reverse
5620: 20 70 65 72 6d 75 74 61 74 69 6f 6e 3a 0a 20 20   permutation:.  
5630: 20 2a 20 70 65 72 6d 75 74 65 32 31 3a 20 20 79   * permute21:  y
5640: 5b 32 30 5d 2e 2e 2e 79 5b 30 5d 0a 20 20 20 2a  [20]...y[0].   *
5650: 20 20 20 20 20 20 20 2d 2d 3e 20 79 5b 36 5d 2e         --> y[6].
5660: 2e 2e 79 5b 32 5d 20 79 5b 38 5d 2e 2e 79 5b 37  ..y[2] y[8]..y[7
5670: 5d 20 79 5b 31 5d 2e 2e 79 5b 30 5d 20 79 5b 31  ] y[1]..y[0] y[1
5680: 39 5d 2e 2e 2e 79 5b 39 5d 20 79 5b 32 30 5d 0a  9]...y[9] y[20].
5690: 20 20 20 2a 2f 0a 23 64 65 66 69 6e 65 20 61 73     */.#define as
56a0: 73 65 6d 62 6c 65 32 31 28 78 29 20 20 5c 0a 20  semble21(x)  \. 
56b0: 20 28 28 28 28 78 29 20 26 20 30 78 31 29 20 3c   ((((x) & 0x1) <
56c0: 3c 20 32 30 29 20 7c 20 28 28 28 78 29 20 26 20  < 20) | (((x) & 
56d0: 30 78 46 46 45 29 20 3c 3c 20 38 29 20 7c 20 5c  0xFFE) << 8) | \
56e0: 0a 20 20 20 28 28 28 78 29 20 26 20 30 78 43 30  .   (((x) & 0xC0
56f0: 30 30 29 20 3e 3e 20 37 29 20 7c 20 28 28 28 78  00) >> 7) | (((x
5700: 29 20 26 20 30 78 31 46 30 30 30 30 29 20 3e 3e  ) & 0x1F0000) >>
5710: 20 31 34 29 20 7c 20 28 28 28 78 29 20 26 20 30   14) | (((x) & 0
5720: 78 33 30 30 30 29 20 3e 3e 20 31 32 29 29 0a 23  x3000) >> 12)).#
5730: 64 65 66 69 6e 65 20 70 65 72 6d 75 74 65 32 31  define permute21
5740: 28 79 29 20 20 5c 0a 20 20 28 28 28 28 79 29 20  (y)  \.  ((((y) 
5750: 26 20 30 78 37 43 29 20 3c 3c 20 31 34 29 20 7c  & 0x7C) << 14) |
5760: 20 28 28 28 79 29 20 26 20 30 78 31 38 30 29 20   (((y) & 0x180) 
5770: 3c 3c 20 37 29 20 7c 20 28 28 28 79 29 20 26 20  << 7) | (((y) & 
5780: 30 78 33 29 20 3c 3c 20 31 32 29 20 7c 20 5c 0a  0x3) << 12) | \.
5790: 20 20 20 28 28 28 79 29 20 26 20 30 78 46 46 45     (((y) & 0xFFE
57a0: 30 30 29 20 3e 3e 20 38 29 20 7c 20 28 28 28 79  00) >> 8) | (((y
57b0: 29 20 26 20 30 78 31 30 30 30 30 30 29 20 3e 3e  ) & 0x100000) >>
57c0: 20 32 30 29 29 0a 23 64 65 66 69 6e 65 20 68 69   20)).#define hi
57d0: 28 77 6f 72 64 29 20 20 70 65 72 6d 75 74 65 32  (word)  permute2
57e0: 31 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  1((unsigned long
57f0: 29 20 28 77 6f 72 64 29 20 3e 3e 20 31 31 29 0a  ) (word) >> 11).
5800: 23 64 65 66 69 6e 65 20 6c 6f 28 77 6f 72 64 29  #define lo(word)
5810: 20 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f    (((unsigned lo
5820: 6e 67 29 20 28 77 6f 72 64 29 20 26 20 30 78 37  ng) (word) & 0x7
5830: 46 46 29 20 3c 3c 20 31 29 0a 20 20 2a 28 6c 6f  FF) << 1).  *(lo
5840: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  ng *) (function 
5850: 2b 20 30 29 20 3d 20 30 78 32 33 41 30 30 30 30  + 0) = 0x23A0000
5860: 30 20 7c 20 68 69 28 64 61 74 61 29 3b 0a 20 20  0 | hi(data);.  
5870: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74  *(long *) (funct
5880: 69 6f 6e 20 2b 20 34 29 20 3d 20 30 78 32 32 41  ion + 4) = 0x22A
5890: 30 30 30 30 30 20 7c 20 68 69 28 61 64 64 72 65  00000 | hi(addre
58a0: 73 73 29 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29  ss);.  *(long *)
58b0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20   (function + 8) 
58c0: 3d 20 30 78 33 37 42 44 30 30 30 30 20 7c 20 6c  = 0x37BD0000 | l
58d0: 6f 28 64 61 74 61 29 3b 0a 20 20 2a 28 6c 6f 6e  o(data);.  *(lon
58e0: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  g *) (function +
58f0: 31 32 29 20 3d 20 30 78 33 36 42 35 30 30 30 30  12) = 0x36B50000
5900: 20 7c 20 6c 6f 28 61 64 64 72 65 73 73 29 3b 0a   | lo(address);.
5910: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e    *(long *) (fun
5920: 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20 30 78 43  ction +16) = 0xC
5930: 37 44 35 43 30 31 32 3b 0a 20 20 2a 28 6c 6f 6e  7D5C012;.  *(lon
5940: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  g *) (function +
5950: 32 30 29 20 3d 20 30 78 44 36 41 30 31 43 31 45  20) = 0xD6A01C1E
5960: 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66  ;.  *(long *) (f
5970: 75 6e 63 74 69 6f 6e 20 2b 32 34 29 20 3d 20 30  unction +24) = 0
5980: 78 34 41 42 33 30 30 30 38 3b 0a 20 20 2a 28 6c  x4AB30008;.  *(l
5990: 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ong *) (function
59a0: 20 2b 32 38 29 20 3d 20 30 78 34 41 42 35 30 30   +28) = 0x4AB500
59b0: 30 30 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20  00;.  *(long *) 
59c0: 28 66 75 6e 63 74 69 6f 6e 20 2b 33 32 29 20 3d  (function +32) =
59d0: 20 30 78 30 32 41 30 31 30 41 31 3b 0a 20 20 2a   0x02A010A1;.  *
59e0: 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69  (long *) (functi
59f0: 6f 6e 20 2b 33 36 29 20 3d 20 30 78 30 30 30 31  on +36) = 0x0001
5a00: 31 38 32 30 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a  1820;.  *(long *
5a10: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 34 30 29  ) (function +40)
5a20: 20 3d 20 30 78 45 32 41 30 30 30 30 32 3b 0a 20   = 0xE2A00002;. 
5a30: 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63   *(long *) (func
5a40: 74 69 6f 6e 20 2b 34 34 29 20 3d 20 30 78 30 38  tion +44) = 0x08
5a50: 30 30 30 32 34 30 3b 0a 23 64 65 66 69 6e 65 20  000240;.#define 
5a60: 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69 6f  is_tramp(functio
5a70: 6e 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 29 20  n)  \.  ((long) 
5a80: 66 75 6e 63 74 69 6f 6e 20 26 20 33 29 20 3d 3d  function & 3) ==
5a90: 20 30 20 26 26 20 5c 0a 20 20 28 2a 28 6c 6f 6e   0 && \.  (*(lon
5aa0: 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  g *) (function +
5ab0: 20 30 29 20 26 20 30 78 66 66 65 30 30 30 30 30   0) & 0xffe00000
5ac0: 29 20 3d 3d 20 30 78 32 33 41 30 30 30 30 30 20  ) == 0x23A00000 
5ad0: 26 26 20 5c 0a 20 20 28 2a 28 6c 6f 6e 67 20 2a  && \.  (*(long *
5ae0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29  ) (function + 4)
5af0: 20 26 20 30 78 66 66 65 30 30 30 30 30 29 20 3d   & 0xffe00000) =
5b00: 3d 20 30 78 32 32 41 30 30 30 30 30 20 26 26 20  = 0x22A00000 && 
5b10: 5c 0a 20 20 28 2a 28 6c 6f 6e 67 20 2a 29 20 28  \.  (*(long *) (
5b20: 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 26 20  function + 8) & 
5b30: 30 78 66 66 66 66 66 30 30 30 29 20 3d 3d 20 30  0xfffff000) == 0
5b40: 78 33 37 42 44 30 30 30 30 20 26 26 20 5c 0a 20  x37BD0000 && \. 
5b50: 20 28 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e   (*(long *) (fun
5b60: 63 74 69 6f 6e 20 2b 31 32 29 20 26 20 30 78 66  ction +12) & 0xf
5b70: 66 66 66 66 30 30 30 29 20 3d 3d 20 30 78 33 36  ffff000) == 0x36
5b80: 42 35 30 30 30 30 20 26 26 20 5c 0a 20 20 2a 28  B50000 && \.  *(
5b90: 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f  long *) (functio
5ba0: 6e 20 2b 31 36 29 20 3d 3d 20 30 78 43 37 44 35  n +16) == 0xC7D5
5bb0: 43 30 31 32 20 26 26 20 5c 0a 20 20 2a 28 6c 6f  C012 && \.  *(lo
5bc0: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  ng *) (function 
5bd0: 2b 32 30 29 20 3d 3d 20 30 78 44 36 41 30 31 43  +20) == 0xD6A01C
5be0: 31 45 20 26 26 20 5c 0a 20 20 2a 28 6c 6f 6e 67  1E && \.  *(long
5bf0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32   *) (function +2
5c00: 34 29 20 3d 3d 20 30 78 34 41 42 33 30 30 30 38  4) == 0x4AB30008
5c10: 20 26 26 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a   && \.  *(long *
5c20: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 38 29  ) (function +28)
5c30: 20 3d 3d 20 30 78 34 41 42 35 30 30 30 30 20 26   == 0x4AB50000 &
5c40: 26 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20  & \.  *(long *) 
5c50: 28 66 75 6e 63 74 69 6f 6e 20 2b 33 32 29 20 3d  (function +32) =
5c60: 3d 20 30 78 30 32 41 30 31 30 41 31 20 26 26 20  = 0x02A010A1 && 
5c70: 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66  \.  *(long *) (f
5c80: 75 6e 63 74 69 6f 6e 20 2b 33 36 29 20 3d 3d 20  unction +36) == 
5c90: 30 78 30 30 30 31 31 38 32 30 20 26 26 20 5c 0a  0x00011820 && \.
5ca0: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e    *(long *) (fun
5cb0: 63 74 69 6f 6e 20 2b 34 30 29 20 3d 3d 20 30 78  ction +40) == 0x
5cc0: 45 32 41 30 30 30 30 32 20 26 26 20 5c 0a 20 20  E2A00002 && \.  
5cd0: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74  *(long *) (funct
5ce0: 69 6f 6e 20 2b 34 34 29 20 3d 3d 20 30 78 30 38  ion +44) == 0x08
5cf0: 30 30 30 32 34 30 0a 23 64 65 66 69 6e 65 20 68  000240.#define h
5d00: 69 6c 6f 28 68 69 77 6f 72 64 2c 6c 6f 77 6f 72  ilo(hiword,lowor
5d10: 64 29 20 20 5c 0a 20 20 28 28 61 73 73 65 6d 62  d)  \.  ((assemb
5d20: 6c 65 32 31 28 28 75 6e 73 69 67 6e 65 64 20 6c  le21((unsigned l
5d30: 6f 6e 67 29 20 28 68 69 77 6f 72 64 29 29 20 3c  ong) (hiword)) <
5d40: 3c 20 31 31 29 20 7c 20 5c 0a 20 20 20 28 28 28  < 11) | \.   (((
5d50: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28  unsigned long) (
5d60: 6c 6f 77 6f 72 64 29 20 26 20 30 78 46 46 45 29  loword) & 0xFFE)
5d70: 20 3e 3e 20 31 29 20 5c 0a 20 20 29 0a 23 64 65   >> 1) \.  ).#de
5d80: 66 69 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 65  fine tramp_addre
5d90: 73 73 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a  ss(function)  \.
5da0: 20 20 68 69 6c 6f 28 2a 28 6c 6f 6e 67 20 2a 29    hilo(*(long *)
5db0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 2c   (function + 4),
5dc0: 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63   *(long *) (func
5dd0: 74 69 6f 6e 20 2b 31 32 29 29 0a 23 64 65 66 69  tion +12)).#defi
5de0: 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 28 66 75  ne tramp_data(fu
5df0: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c  nction)  \.  hil
5e00: 6f 28 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e  o(*(long *) (fun
5e10: 63 74 69 6f 6e 20 2b 20 30 29 2c 20 2a 28 6c 6f  ction + 0), *(lo
5e20: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  ng *) (function 
5e30: 2b 20 38 29 29 0a 23 65 6e 64 69 66 0a 23 69 66  + 8)).#endif.#if
5e40: 64 65 66 20 5f 5f 68 70 70 61 6e 65 77 5f 5f 0a  def __hppanew__.
5e50: 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20    /* function:. 
5e60: 20 20 2a 20 20 20 20 2e 6c 6f 6e 67 20 20 20 74    *    .long   t
5e70: 72 61 6d 70 5f 72 0a 20 20 20 2a 20 20 20 20 2e  ramp_r.   *    .
5e80: 6c 6f 6e 67 20 20 20 63 6c 6f 73 75 72 65 0a 20  long   closure. 
5e90: 20 20 2a 20 63 6c 6f 73 75 72 65 3a 0a 20 20 20    * closure:.   
5ea0: 2a 20 20 20 20 2e 6c 6f 6e 67 20 20 20 3c 64 61  *    .long   <da
5eb0: 74 61 3e 0a 20 20 20 2a 20 20 20 20 2e 6c 6f 6e  ta>.   *    .lon
5ec0: 67 20 20 20 3c 61 64 64 72 65 73 73 3e 0a 20 20  g   <address>.  
5ed0: 20 2a 2f 0a 20 20 7b 20 2f 2a 20 77 6f 72 6b 20   */.  { /* work 
5ee0: 61 72 6f 75 6e 64 20 61 20 62 75 67 20 69 6e 20  around a bug in 
5ef0: 67 63 63 20 33 2e 2a 20 2a 2f 0a 20 20 20 20 76  gcc 3.* */.    v
5f00: 6f 69 64 2a 20 74 72 61 6d 70 5f 72 5f 61 64 64  oid* tramp_r_add
5f10: 72 65 73 73 20 3d 20 26 74 72 61 6d 70 5f 72 3b  ress = &tramp_r;
5f20: 0a 20 20 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28  .    *(long *) (
5f30: 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20  function + 0) = 
5f40: 28 28 6c 6f 6e 67 20 2a 29 20 28 28 63 68 61 72  ((long *) ((char
5f50: 2a 29 74 72 61 6d 70 5f 72 5f 61 64 64 72 65 73  *)tramp_r_addres
5f60: 73 2d 32 29 29 5b 30 5d 3b 0a 20 20 20 20 2a 28  s-2))[0];.    *(
5f70: 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f  long *) (functio
5f80: 6e 20 2b 20 34 29 20 3d 20 28 6c 6f 6e 67 29 20  n + 4) = (long) 
5f90: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 3b 0a  (function + 8);.
5fa0: 20 20 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 28 66      *(long *) (f
5fb0: 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 28  unction + 8) = (
5fc0: 6c 6f 6e 67 29 20 64 61 74 61 3b 0a 20 20 20 20  long) data;.    
5fd0: 2a 28 6c 6f 6e 67 20 2a 29 20 28 66 75 6e 63 74  *(long *) (funct
5fe0: 69 6f 6e 20 2b 31 32 29 20 3d 20 28 6c 6f 6e 67  ion +12) = (long
5ff0: 29 20 61 64 64 72 65 73 73 3b 0a 20 20 7d 0a 23  ) address;.  }.#
6000: 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70 28  define is_tramp(
6010: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28  function)  \.  (
6020: 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f  (long *) functio
6030: 6e 29 5b 30 5d 20 3d 3d 20 28 28 6c 6f 6e 67 20  n)[0] == ((long 
6040: 2a 29 20 28 28 63 68 61 72 2a 29 74 72 61 6d 70  *) ((char*)tramp
6050: 5f 72 5f 61 64 64 72 65 73 73 2d 32 29 29 5b 30  _r_address-2))[0
6060: 5d 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f  ].#define tramp_
6070: 61 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e  address(function
6080: 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29  )  \.  ((long *)
6090: 20 66 75 6e 63 74 69 6f 6e 29 5b 33 5d 0a 23 64   function)[3].#d
60a0: 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61  efine tramp_data
60b0: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20  (function)  \.  
60c0: 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69  ((long *) functi
60d0: 6f 6e 29 5b 32 5d 0a 23 65 6e 64 69 66 0a 23 69  on)[2].#endif.#i
60e0: 66 64 65 66 20 5f 5f 61 72 6d 5f 5f 0a 20 20 2f  fdef __arm__.  /
60f0: 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a  * function:.   *
6100: 20 20 20 20 6c 64 72 20 20 20 20 20 69 70 2c 5b      ldr     ip,[
6110: 70 63 2c 23 5f 66 75 6e 63 74 69 6f 6e 2d 2e 2d  pc,#_function-.-
6120: 38 5d 09 09 45 35 39 46 43 30 31 34 0a 20 20 20  8]..E59FC014.   
6130: 2a 20 20 20 20 6c 64 72 20 20 20 20 20 69 70 2c  *    ldr     ip,
6140: 5b 69 70 2c 23 30 5d 09 09 09 45 35 39 43 43 30  [ip,#0]...E59CC0
6150: 30 30 20 20 3f 3f 49 73 20 74 68 69 73 20 63 6f  00  ??Is this co
6160: 72 72 65 63 74 3f 3f 0a 20 20 20 2a 20 20 20 20  rrect??.   *    
6170: 73 74 6d 66 64 20 20 20 73 70 21 2c 7b 69 70 7d  stmfd   sp!,{ip}
6180: 09 09 09 45 39 32 44 31 30 30 30 0a 20 20 20 2a  ...E92D1000.   *
6190: 20 20 20 20 6c 64 72 20 20 20 20 20 69 70 2c 5b      ldr     ip,[
61a0: 70 63 2c 23 5f 64 61 74 61 2d 2e 2d 38 5d 09 09  pc,#_data-.-8]..
61b0: 45 35 39 46 43 30 30 34 0a 20 20 20 2a 20 20 20  E59FC004.   *   
61c0: 20 6c 64 72 20 20 20 20 20 69 70 2c 5b 69 70 2c   ldr     ip,[ip,
61d0: 23 30 5d 09 09 09 45 35 39 43 43 30 30 30 20 20  #0]...E59CC000  
61e0: 3f 3f 49 73 20 74 68 69 73 20 63 6f 72 72 65 63  ??Is this correc
61f0: 74 3f 3f 0a 20 20 20 2a 20 20 20 20 6c 64 6d 66  t??.   *    ldmf
6200: 64 20 20 20 73 70 21 2c 7b 70 63 7d 5e 09 09 09  d   sp!,{pc}^...
6210: 45 38 46 44 38 30 30 30 0a 20 20 20 2a 20 5f 64  E8FD8000.   * _d
6220: 61 74 61 3a 0a 20 20 20 2a 20 20 20 20 2e 77 6f  ata:.   *    .wo
6230: 72 64 20 20 20 3c 64 61 74 61 3e 09 09 09 09 3c  rd   <data>....<
6240: 64 61 74 61 3e 0a 20 20 20 2a 20 5f 66 75 6e 63  data>.   * _func
6250: 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 2e 77  tion:.   *    .w
6260: 6f 72 64 20 20 20 3c 61 64 64 72 65 73 73 3e 09  ord   <address>.
6270: 09 09 3c 61 64 64 72 65 73 73 3e 0a 20 20 20 2a  ..<address>.   *
6280: 2f 0a 20 20 7b 20 73 74 61 74 69 63 20 6c 6f 6e  /.  { static lon
6290: 67 20 63 6f 64 65 20 5b 36 5d 20 3d 0a 20 20 20  g code [6] =.   
62a0: 20 20 20 7b 20 30 78 45 35 39 46 43 30 31 34 2c     { 0xE59FC014,
62b0: 20 30 78 45 35 39 43 43 30 30 30 2c 20 30 78 45   0xE59CC000, 0xE
62c0: 39 32 44 31 30 30 30 2c 20 30 78 45 35 39 46 43  92D1000, 0xE59FC
62d0: 30 30 34 2c 0a 20 20 20 20 20 20 20 20 30 78 45  004,.        0xE
62e0: 35 39 43 43 30 30 30 2c 20 30 78 45 38 46 44 38  59CC000, 0xE8FD8
62f0: 30 30 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  000.      };.   
6300: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 20   int i;.    for 
6310: 28 69 3d 30 3b 20 69 3c 36 3b 20 69 2b 2b 29 20  (i=0; i<6; i++) 
6320: 7b 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63  { ((long *) func
6330: 74 69 6f 6e 29 5b 69 5d 20 3d 20 63 6f 64 65 5b  tion)[i] = code[
6340: 69 5d 3b 20 7d 0a 20 20 20 20 28 28 6c 6f 6e 67  i]; }.    ((long
6350: 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 36 5d   *) function)[6]
6360: 20 3d 20 28 6c 6f 6e 67 29 20 64 61 74 61 3b 0a   = (long) data;.
6370: 20 20 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75      ((long *) fu
6380: 6e 63 74 69 6f 6e 29 5b 37 5d 20 3d 20 28 6c 6f  nction)[7] = (lo
6390: 6e 67 29 20 61 64 64 72 65 73 73 3b 0a 20 20 7d  ng) address;.  }
63a0: 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d  .#define is_tram
63b0: 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20  p(function)  \. 
63c0: 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74   ((long *) funct
63d0: 69 6f 6e 29 5b 30 5d 20 3d 3d 20 30 78 45 35 39  ion)[0] == 0xE59
63e0: 46 43 30 31 34 20 26 26 20 5c 0a 20 20 28 28 6c  FC014 && \.  ((l
63f0: 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29  ong *) function)
6400: 5b 31 5d 20 3d 3d 20 30 78 45 35 39 43 43 30 30  [1] == 0xE59CC00
6410: 30 20 26 26 20 5c 0a 20 20 28 28 6c 6f 6e 67 20  0 && \.  ((long 
6420: 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 32 5d 20  *) function)[2] 
6430: 3d 3d 20 30 78 45 39 32 44 31 30 30 30 20 26 26  == 0xE92D1000 &&
6440: 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29 20 66   \.  ((long *) f
6450: 75 6e 63 74 69 6f 6e 29 5b 33 5d 20 3d 3d 20 30  unction)[3] == 0
6460: 78 45 35 39 46 43 30 30 34 20 26 26 20 5c 0a 20  xE59FC004 && \. 
6470: 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74   ((long *) funct
6480: 69 6f 6e 29 5b 34 5d 20 3d 3d 20 30 78 45 35 39  ion)[4] == 0xE59
6490: 43 43 30 30 30 20 26 26 20 5c 0a 20 20 28 28 6c  CC000 && \.  ((l
64a0: 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f 6e 29  ong *) function)
64b0: 5b 35 5d 20 3d 3d 20 30 78 45 38 46 44 38 30 30  [5] == 0xE8FD800
64c0: 30 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f  0.#define tramp_
64d0: 61 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e  address(function
64e0: 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a 29  )  \.  ((long *)
64f0: 20 66 75 6e 63 74 69 6f 6e 29 5b 37 5d 0a 23 64   function)[7].#d
6500: 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61  efine tramp_data
6510: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20  (function)  \.  
6520: 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69  ((long *) functi
6530: 6f 6e 29 5b 36 5d 0a 23 65 6e 64 69 66 0a 23 69  on)[6].#endif.#i
6540: 66 64 65 66 20 5f 5f 72 73 36 30 30 30 73 79 73  fdef __rs6000sys
6550: 76 34 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 69  v4__.  /* functi
6560: 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 7b 6c 69 75  on:.   *    {liu
6570: 7c 6c 69 73 7d 20 31 31 2c 68 69 31 36 28 3c 64  |lis} 11,hi16(<d
6580: 61 74 61 3e 29 09 09 33 44 20 36 30 20 68 69 31  ata>)..3D 60 hi1
6590: 36 28 3c 64 61 74 61 3e 29 0a 20 20 20 2a 20 20  6(<data>).   *  
65a0: 20 20 7b 6f 72 69 6c 7c 6f 72 69 7d 20 31 31 2c    {oril|ori} 11,
65b0: 31 31 2c 6c 6f 31 36 28 3c 64 61 74 61 3e 29 09  11,lo16(<data>).
65c0: 09 36 31 20 36 42 20 6c 6f 31 36 28 3c 64 61 74  .61 6B lo16(<dat
65d0: 61 3e 29 0a 20 20 20 2a 20 20 20 20 7b 6c 69 75  a>).   *    {liu
65e0: 7c 6c 69 73 7d 20 30 2c 68 69 31 36 28 3c 61 64  |lis} 0,hi16(<ad
65f0: 64 72 65 73 73 3e 29 09 09 33 43 20 30 30 20 68  dress>)..3C 00 h
6600: 69 31 36 28 3c 61 64 64 72 65 73 73 3e 29 0a 20  i16(<address>). 
6610: 20 20 2a 20 20 20 20 7b 6f 72 69 6c 7c 6f 72 69    *    {oril|ori
6620: 7d 20 30 2c 30 2c 6c 6f 31 36 28 3c 61 64 64 72  } 0,0,lo16(<addr
6630: 65 73 73 3e 29 09 09 36 30 20 30 30 20 6c 6f 31  ess>)..60 00 lo1
6640: 36 28 3c 61 64 64 72 65 73 73 3e 29 0a 20 20 20  6(<address>).   
6650: 2a 20 20 20 20 6d 74 63 74 72 20 30 09 09 09 09  *    mtctr 0....
6660: 09 37 43 20 30 39 20 30 33 20 41 36 0a 20 20 20  .7C 09 03 A6.   
6670: 2a 20 20 20 20 62 63 74 72 09 09 09 09 09 34 45  *    bctr.....4E
6680: 20 38 30 20 30 34 20 32 30 0a 20 20 20 2a 2f 0a   80 04 20.   */.
6690: 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75    *(short *) (fu
66a0: 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20 30 78  nction + 0) = 0x
66b0: 33 44 36 30 3b 0a 20 20 2a 28 73 68 6f 72 74 20  3D60;.  *(short 
66c0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 32  *) (function + 2
66d0: 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ) = (unsigned lo
66e0: 6e 67 29 20 64 61 74 61 20 3e 3e 20 31 36 3b 0a  ng) data >> 16;.
66f0: 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75    *(short *) (fu
6700: 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d 20 30 78  nction + 4) = 0x
6710: 36 31 36 42 3b 0a 20 20 2a 28 73 68 6f 72 74 20  616B;.  *(short 
6720: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 36  *) (function + 6
6730: 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ) = (unsigned lo
6740: 6e 67 29 20 64 61 74 61 20 26 20 30 78 66 66 66  ng) data & 0xfff
6750: 66 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20  f;.  *(short *) 
6760: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d  (function + 8) =
6770: 20 30 78 33 43 30 30 3b 0a 20 20 2a 28 73 68 6f   0x3C00;.  *(sho
6780: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
6790: 2b 31 30 29 20 3d 20 28 75 6e 73 69 67 6e 65 64  +10) = (unsigned
67a0: 20 6c 6f 6e 67 29 20 61 64 64 72 65 73 73 20 3e   long) address >
67b0: 3e 20 31 36 3b 0a 20 20 2a 28 73 68 6f 72 74 20  > 16;.  *(short 
67c0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32  *) (function +12
67d0: 29 20 3d 20 30 78 36 30 30 30 3b 0a 20 20 2a 28  ) = 0x6000;.  *(
67e0: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
67f0: 6f 6e 20 2b 31 34 29 20 3d 20 28 75 6e 73 69 67  on +14) = (unsig
6800: 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64 72 65 73  ned long) addres
6810: 73 20 26 20 30 78 66 66 66 66 3b 0a 20 20 2a 28  s & 0xffff;.  *(
6820: 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69  long *)  (functi
6830: 6f 6e 20 2b 31 36 29 20 3d 20 30 78 37 43 30 39  on +16) = 0x7C09
6840: 30 33 41 36 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a  03A6;.  *(long *
6850: 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 30  )  (function +20
6860: 29 20 3d 20 30 78 34 45 38 30 30 34 32 30 3b 0a  ) = 0x4E800420;.
6870: 23 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d 70  #define is_tramp
6880: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20  (function)  \.  
6890: 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74  *(unsigned short
68a0: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20   *) (function + 
68b0: 30 29 20 3d 3d 20 30 78 33 44 36 30 20 26 26 20  0) == 0x3D60 && 
68c0: 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73  \.  *(unsigned s
68d0: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
68e0: 6e 20 2b 20 34 29 20 3d 3d 20 30 78 36 31 36 42  n + 4) == 0x616B
68f0: 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e   && \.  *(unsign
6900: 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e  ed short *) (fun
6910: 63 74 69 6f 6e 20 2b 20 38 29 20 3d 3d 20 30 78  ction + 8) == 0x
6920: 33 43 30 30 20 26 26 20 5c 0a 20 20 2a 28 75 6e  3C00 && \.  *(un
6930: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20  signed short *) 
6940: 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d  (function +12) =
6950: 3d 20 30 78 36 30 30 30 20 26 26 20 5c 0a 20 20  = 0x6000 && \.  
6960: 2a 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  *(unsigned long 
6970: 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31  *)  (function +1
6980: 36 29 20 3d 3d 20 30 78 37 43 30 39 30 33 41 36  6) == 0x7C0903A6
6990: 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e   && \.  *(unsign
69a0: 65 64 20 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e  ed long *)  (fun
69b0: 63 74 69 6f 6e 20 2b 32 30 29 20 3d 3d 20 30 78  ction +20) == 0x
69c0: 34 45 38 30 30 34 32 30 0a 23 64 65 66 69 6e 65  4E800420.#define
69d0: 20 68 69 6c 6f 28 68 69 77 6f 72 64 2c 6c 6f 77   hilo(hiword,low
69e0: 6f 72 64 29 20 20 5c 0a 20 20 28 28 28 75 6e 73  ord)  \.  (((uns
69f0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 68 69 77  igned long) (hiw
6a00: 6f 72 64 29 20 3c 3c 20 31 36 29 20 7c 20 28 75  ord) << 16) | (u
6a10: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 6c  nsigned long) (l
6a20: 6f 77 6f 72 64 29 29 0a 23 64 65 66 69 6e 65 20  oword)).#define 
6a30: 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75  tramp_address(fu
6a40: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c  nction)  \.  hil
6a50: 6f 28 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f  o(*(unsigned sho
6a60: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
6a70: 2b 31 30 29 2c 20 2a 28 75 6e 73 69 67 6e 65 64  +10), *(unsigned
6a80: 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74   short *) (funct
6a90: 69 6f 6e 20 2b 31 34 29 29 0a 23 64 65 66 69 6e  ion +14)).#defin
6aa0: 65 20 74 72 61 6d 70 5f 64 61 74 61 28 66 75 6e  e tramp_data(fun
6ab0: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c 6f  ction)  \.  hilo
6ac0: 28 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72  (*(unsigned shor
6ad0: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
6ae0: 20 32 29 2c 20 2a 28 75 6e 73 69 67 6e 65 64 20   2), *(unsigned 
6af0: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
6b00: 6f 6e 20 2b 20 36 29 29 0a 23 65 6e 64 69 66 0a  on + 6)).#endif.
6b10: 23 69 66 64 65 66 20 5f 5f 72 73 36 30 30 30 6e  #ifdef __rs6000n
6b20: 65 74 62 73 64 5f 5f 0a 20 20 2f 2a 20 66 75 6e  etbsd__.  /* fun
6b30: 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 7b  ction:.   *    {
6b40: 6c 69 75 7c 6c 69 73 7d 20 31 33 2c 68 69 31 36  liu|lis} 13,hi16
6b50: 28 3c 64 61 74 61 3e 29 09 09 33 44 20 41 30 20  (<data>)..3D A0 
6b60: 68 69 31 36 28 3c 64 61 74 61 3e 29 0a 20 20 20  hi16(<data>).   
6b70: 2a 20 20 20 20 7b 6f 72 69 6c 7c 6f 72 69 7d 20  *    {oril|ori} 
6b80: 31 33 2c 31 33 2c 6c 6f 31 36 28 3c 64 61 74 61  13,13,lo16(<data
6b90: 3e 29 09 09 36 31 20 41 44 20 6c 6f 31 36 28 3c  >)..61 AD lo16(<
6ba0: 64 61 74 61 3e 29 0a 20 20 20 2a 20 20 20 20 7b  data>).   *    {
6bb0: 6c 69 75 7c 6c 69 73 7d 20 30 2c 68 69 31 36 28  liu|lis} 0,hi16(
6bc0: 3c 61 64 64 72 65 73 73 3e 29 09 09 33 43 20 30  <address>)..3C 0
6bd0: 30 20 68 69 31 36 28 3c 61 64 64 72 65 73 73 3e  0 hi16(<address>
6be0: 29 0a 20 20 20 2a 20 20 20 20 7b 6f 72 69 6c 7c  ).   *    {oril|
6bf0: 6f 72 69 7d 20 30 2c 30 2c 6c 6f 31 36 28 3c 61  ori} 0,0,lo16(<a
6c00: 64 64 72 65 73 73 3e 29 09 09 36 30 20 30 30 20  ddress>)..60 00 
6c10: 6c 6f 31 36 28 3c 61 64 64 72 65 73 73 3e 29 0a  lo16(<address>).
6c20: 20 20 20 2a 20 20 20 20 6d 74 63 74 72 20 30 09     *    mtctr 0.
6c30: 09 09 09 09 37 43 20 30 39 20 30 33 20 41 36 0a  ....7C 09 03 A6.
6c40: 20 20 20 2a 20 20 20 20 62 63 74 72 09 09 09 09     *    bctr....
6c50: 09 34 45 20 38 30 20 30 34 20 32 30 0a 20 20 20  .4E 80 04 20.   
6c60: 2a 2f 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20  */.  *(short *) 
6c70: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d  (function + 0) =
6c80: 20 30 78 33 44 41 30 3b 0a 20 20 2a 28 73 68 6f   0x3DA0;.  *(sho
6c90: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
6ca0: 2b 20 32 29 20 3d 20 28 75 6e 73 69 67 6e 65 64  + 2) = (unsigned
6cb0: 20 6c 6f 6e 67 29 20 64 61 74 61 20 3e 3e 20 31   long) data >> 1
6cc0: 36 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20  6;.  *(short *) 
6cd0: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d  (function + 4) =
6ce0: 20 30 78 36 31 41 44 3b 0a 20 20 2a 28 73 68 6f   0x61AD;.  *(sho
6cf0: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
6d00: 2b 20 36 29 20 3d 20 28 75 6e 73 69 67 6e 65 64  + 6) = (unsigned
6d10: 20 6c 6f 6e 67 29 20 64 61 74 61 20 26 20 30 78   long) data & 0x
6d20: 66 66 66 66 3b 0a 20 20 2a 28 73 68 6f 72 74 20  ffff;.  *(short 
6d30: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38  *) (function + 8
6d40: 29 20 3d 20 30 78 33 43 30 30 3b 0a 20 20 2a 28  ) = 0x3C00;.  *(
6d50: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
6d60: 6f 6e 20 2b 31 30 29 20 3d 20 28 75 6e 73 69 67  on +10) = (unsig
6d70: 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64 72 65 73  ned long) addres
6d80: 73 20 3e 3e 20 31 36 3b 0a 20 20 2a 28 73 68 6f  s >> 16;.  *(sho
6d90: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
6da0: 2b 31 32 29 20 3d 20 30 78 36 30 30 30 3b 0a 20  +12) = 0x6000;. 
6db0: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e   *(short *) (fun
6dc0: 63 74 69 6f 6e 20 2b 31 34 29 20 3d 20 28 75 6e  ction +14) = (un
6dd0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64  signed long) add
6de0: 72 65 73 73 20 26 20 30 78 66 66 66 66 3b 0a 20  ress & 0xffff;. 
6df0: 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e   *(long *)  (fun
6e00: 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20 30 78 37  ction +16) = 0x7
6e10: 43 30 39 30 33 41 36 3b 0a 20 20 2a 28 6c 6f 6e  C0903A6;.  *(lon
6e20: 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20  g *)  (function 
6e30: 2b 32 30 29 20 3d 20 30 78 34 45 38 30 30 34 32  +20) = 0x4E80042
6e40: 30 3b 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72  0;.#define is_tr
6e50: 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c  amp(function)  \
6e60: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68  .  *(unsigned sh
6e70: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ort *) (function
6e80: 20 2b 20 30 29 20 3d 3d 20 30 78 33 44 41 30 20   + 0) == 0x3DA0 
6e90: 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65  && \.  *(unsigne
6ea0: 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63  d short *) (func
6eb0: 74 69 6f 6e 20 2b 20 34 29 20 3d 3d 20 30 78 36  tion + 4) == 0x6
6ec0: 31 41 44 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73  1AD && \.  *(uns
6ed0: 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28  igned short *) (
6ee0: 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 3d  function + 8) ==
6ef0: 20 30 78 33 43 30 30 20 26 26 20 5c 0a 20 20 2a   0x3C00 && \.  *
6f00: 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20  (unsigned short 
6f10: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32  *) (function +12
6f20: 29 20 3d 3d 20 30 78 36 30 30 30 20 26 26 20 5c  ) == 0x6000 && \
6f30: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .  *(unsigned lo
6f40: 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e  ng *)  (function
6f50: 20 2b 31 36 29 20 3d 3d 20 30 78 37 43 30 39 30   +16) == 0x7C090
6f60: 33 41 36 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73  3A6 && \.  *(uns
6f70: 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 29 20 20 28  igned long *)  (
6f80: 66 75 6e 63 74 69 6f 6e 20 2b 32 30 29 20 3d 3d  function +20) ==
6f90: 20 30 78 34 45 38 30 30 34 32 30 0a 23 64 65 66   0x4E800420.#def
6fa0: 69 6e 65 20 68 69 6c 6f 28 68 69 77 6f 72 64 2c  ine hilo(hiword,
6fb0: 6c 6f 77 6f 72 64 29 20 20 5c 0a 20 20 28 28 28  loword)  \.  (((
6fc0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28  unsigned long) (
6fd0: 68 69 77 6f 72 64 29 20 3c 3c 20 31 36 29 20 7c  hiword) << 16) |
6fe0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
6ff0: 20 28 6c 6f 77 6f 72 64 29 29 0a 23 64 65 66 69   (loword)).#defi
7000: 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 65 73 73  ne tramp_address
7010: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20  (function)  \.  
7020: 68 69 6c 6f 28 2a 28 75 6e 73 69 67 6e 65 64 20  hilo(*(unsigned 
7030: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
7040: 6f 6e 20 2b 31 30 29 2c 20 2a 28 75 6e 73 69 67  on +10), *(unsig
7050: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75  ned short *) (fu
7060: 6e 63 74 69 6f 6e 20 2b 31 34 29 29 0a 23 64 65  nction +14)).#de
7070: 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 28  fine tramp_data(
7080: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68  function)  \.  h
7090: 69 6c 6f 28 2a 28 75 6e 73 69 67 6e 65 64 20 73  ilo(*(unsigned s
70a0: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
70b0: 6e 20 2b 20 32 29 2c 20 2a 28 75 6e 73 69 67 6e  n + 2), *(unsign
70c0: 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e  ed short *) (fun
70d0: 63 74 69 6f 6e 20 2b 20 36 29 29 0a 23 65 6e 64  ction + 6)).#end
70e0: 69 66 0a 23 69 66 64 65 66 20 5f 5f 72 73 36 30  if.#ifdef __rs60
70f0: 30 30 61 69 78 5f 5f 0a 20 20 2f 2a 20 66 75 6e  00aix__.  /* fun
7100: 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 2e  ction:.   *    .
7110: 6c 6f 6e 67 20 2e 74 72 61 6d 70 5f 72 0a 20 20  long .tramp_r.  
7120: 20 2a 20 20 20 20 2e 6c 6f 6e 67 20 2e 6d 79 74   *    .long .myt
7130: 6f 63 0a 20 20 20 2a 20 20 20 20 2e 6c 6f 6e 67  oc.   *    .long
7140: 20 30 0a 20 20 20 2a 20 2e 6d 79 74 6f 63 3a 0a   0.   * .mytoc:.
7150: 20 20 20 2a 20 20 20 20 2e 6c 6f 6e 67 20 3c 64     *    .long <d
7160: 61 74 61 3e 0a 20 20 20 2a 20 20 20 20 2e 6c 6f  ata>.   *    .lo
7170: 6e 67 20 3c 61 64 64 72 65 73 73 3e 0a 20 20 20  ng <address>.   
7180: 2a 2f 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20  */.  *(long *)  
7190: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d  (function + 0) =
71a0: 20 28 28 6c 6f 6e 67 20 2a 29 20 26 74 72 61 6d   ((long *) &tram
71b0: 70 5f 72 29 5b 30 5d 3b 0a 20 20 2a 28 6c 6f 6e  p_r)[0];.  *(lon
71c0: 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f 6e 20  g *)  (function 
71d0: 2b 20 34 29 20 3d 20 28 6c 6f 6e 67 29 20 28 66  + 4) = (long) (f
71e0: 75 6e 63 74 69 6f 6e 20 2b 20 31 32 29 3b 0a 20  unction + 12);. 
71f0: 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e   *(long *)  (fun
7200: 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 30 3b 0a  ction + 8) = 0;.
7210: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75    *(long *)  (fu
7220: 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d 20 28 6c  nction +12) = (l
7230: 6f 6e 67 29 20 64 61 74 61 3b 0a 20 20 2a 28 6c  ong) data;.  *(l
7240: 6f 6e 67 20 2a 29 20 20 28 66 75 6e 63 74 69 6f  ong *)  (functio
7250: 6e 20 2b 31 36 29 20 3d 20 28 6c 6f 6e 67 29 20  n +16) = (long) 
7260: 61 64 64 72 65 73 73 3b 0a 23 64 65 66 69 6e 65  address;.#define
7270: 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69   is_tramp(functi
7280: 6f 6e 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20  on)  \.  ((long 
7290: 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 30 5d 20  *) function)[0] 
72a0: 3d 3d 20 28 28 6c 6f 6e 67 20 2a 29 20 26 74 72  == ((long *) &tr
72b0: 61 6d 70 5f 72 29 5b 30 5d 0a 23 64 65 66 69 6e  amp_r)[0].#defin
72c0: 65 20 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28  e tramp_address(
72d0: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 28  function)  \.  (
72e0: 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69 6f  (long *) functio
72f0: 6e 29 5b 34 5d 0a 23 64 65 66 69 6e 65 20 74 72  n)[4].#define tr
7300: 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 74 69 6f  amp_data(functio
7310: 6e 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20 2a  n)  \.  ((long *
7320: 29 20 66 75 6e 63 74 69 6f 6e 29 5b 33 5d 0a 23  ) function)[3].#
7330: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d  endif.#ifdef __m
7340: 38 38 6b 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74  88k__.  /* funct
7350: 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20 6f 72 2e  ion:.   *    or.
7360: 75 20 20 20 20 23 72 31 31 2c 23 72 30 2c 68 69  u    #r11,#r0,hi
7370: 31 36 28 3c 64 61 74 61 3e 29 09 09 35 44 20 36  16(<data>)..5D 6
7380: 30 20 68 69 31 36 28 3c 64 61 74 61 3e 29 0a 20  0 hi16(<data>). 
7390: 20 20 2a 20 20 20 20 6f 72 20 20 20 20 20 20 23    *    or      #
73a0: 72 31 31 2c 23 72 31 31 2c 6c 6f 31 36 28 3c 64  r11,#r11,lo16(<d
73b0: 61 74 61 3e 29 09 09 35 39 20 36 42 20 6c 6f 31  ata>)..59 6B lo1
73c0: 36 28 3c 64 61 74 61 3e 29 0a 20 20 20 2a 20 20  6(<data>).   *  
73d0: 20 20 6f 72 2e 75 20 20 20 20 23 72 31 33 2c 23    or.u    #r13,#
73e0: 72 30 2c 68 69 31 36 28 3c 61 64 64 72 65 73 73  r0,hi16(<address
73f0: 3e 29 09 35 44 20 41 30 20 68 69 31 36 28 3c 61  >).5D A0 hi16(<a
7400: 64 64 72 65 73 73 3e 29 0a 20 20 20 2a 20 20 20  ddress>).   *   
7410: 20 6f 72 20 20 20 20 20 20 23 72 31 33 2c 23 72   or      #r13,#r
7420: 31 33 2c 6c 6f 31 36 28 3c 61 64 64 72 65 73 73  13,lo16(<address
7430: 3e 29 09 35 39 20 41 44 20 6c 6f 31 36 28 3c 61  >).59 AD lo16(<a
7440: 64 64 72 65 73 73 3e 29 0a 20 20 20 2a 20 20 20  ddress>).   *   
7450: 20 6a 6d 70 20 20 20 20 20 23 72 31 33 09 09 09   jmp     #r13...
7460: 09 46 34 20 30 30 20 43 30 20 30 44 0a 20 20 20  .F4 00 C0 0D.   
7470: 2a 2f 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20  */.  *(short *) 
7480: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d  (function + 0) =
7490: 20 30 78 35 44 36 30 3b 0a 20 20 2a 28 73 68 6f   0x5D60;.  *(sho
74a0: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
74b0: 2b 20 32 29 20 3d 20 28 75 6e 73 69 67 6e 65 64  + 2) = (unsigned
74c0: 20 6c 6f 6e 67 29 20 64 61 74 61 20 3e 3e 20 31   long) data >> 1
74d0: 36 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29 20  6;.  *(short *) 
74e0: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20 3d  (function + 4) =
74f0: 20 30 78 35 39 36 42 3b 0a 20 20 2a 28 73 68 6f   0x596B;.  *(sho
7500: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
7510: 2b 20 36 29 20 3d 20 28 75 6e 73 69 67 6e 65 64  + 6) = (unsigned
7520: 20 6c 6f 6e 67 29 20 64 61 74 61 20 26 20 30 78   long) data & 0x
7530: 66 66 66 66 3b 0a 20 20 2a 28 73 68 6f 72 74 20  ffff;.  *(short 
7540: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38  *) (function + 8
7550: 29 20 3d 20 30 78 35 44 41 30 3b 0a 20 20 2a 28  ) = 0x5DA0;.  *(
7560: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
7570: 6f 6e 20 2b 31 30 29 20 3d 20 28 75 6e 73 69 67  on +10) = (unsig
7580: 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64 72 65 73  ned long) addres
7590: 73 20 3e 3e 20 31 36 3b 0a 20 20 2a 28 73 68 6f  s >> 16;.  *(sho
75a0: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
75b0: 2b 31 32 29 20 3d 20 30 78 35 39 41 44 3b 0a 20  +12) = 0x59AD;. 
75c0: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e   *(short *) (fun
75d0: 63 74 69 6f 6e 20 2b 31 34 29 20 3d 20 28 75 6e  ction +14) = (un
75e0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64  signed long) add
75f0: 72 65 73 73 20 26 20 30 78 66 66 66 66 3b 0a 20  ress & 0xffff;. 
7600: 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e   *(long *)  (fun
7610: 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20 30 78 46  ction +16) = 0xF
7620: 34 30 30 43 30 30 44 3b 0a 23 64 65 66 69 6e 65  400C00D;.#define
7630: 20 69 73 5f 74 72 61 6d 70 28 66 75 6e 63 74 69   is_tramp(functi
7640: 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e 73 69 67  on)  \.  *(unsig
7650: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75  ned short *) (fu
7660: 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d 3d 20 30  nction + 0) == 0
7670: 78 35 44 36 30 20 26 26 20 5c 0a 20 20 2a 28 75  x5D60 && \.  *(u
7680: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29  nsigned short *)
7690: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 34 29 20   (function + 4) 
76a0: 3d 3d 20 30 78 35 39 36 42 20 26 26 20 5c 0a 20  == 0x596B && \. 
76b0: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72   *(unsigned shor
76c0: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
76d0: 20 38 29 20 3d 3d 20 30 78 35 44 41 30 20 26 26   8) == 0x5DA0 &&
76e0: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20   \.  *(unsigned 
76f0: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
7700: 6f 6e 20 2b 31 32 29 20 3d 3d 20 30 78 35 39 41  on +12) == 0x59A
7710: 44 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67  D && \.  *(unsig
7720: 6e 65 64 20 6c 6f 6e 67 20 2a 29 20 20 28 66 75  ned long *)  (fu
7730: 6e 63 74 69 6f 6e 20 2b 31 36 29 20 3d 3d 20 30  nction +16) == 0
7740: 78 46 34 30 30 43 30 30 44 0a 23 64 65 66 69 6e  xF400C00D.#defin
7750: 65 20 68 69 6c 6f 28 68 69 77 6f 72 64 2c 6c 6f  e hilo(hiword,lo
7760: 77 6f 72 64 29 20 20 5c 0a 20 20 28 28 28 75 6e  word)  \.  (((un
7770: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 68 69  signed long) (hi
7780: 77 6f 72 64 29 20 3c 3c 20 31 36 29 20 7c 20 28  word) << 16) | (
7790: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28  unsigned long) (
77a0: 6c 6f 77 6f 72 64 29 29 0a 23 64 65 66 69 6e 65  loword)).#define
77b0: 20 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66   tramp_address(f
77c0: 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69  unction)  \.  hi
77d0: 6c 6f 28 2a 28 75 6e 73 69 67 6e 65 64 20 73 68  lo(*(unsigned sh
77e0: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ort *) (function
77f0: 20 2b 31 30 29 2c 20 2a 28 75 6e 73 69 67 6e 65   +10), *(unsigne
7800: 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63  d short *) (func
7810: 74 69 6f 6e 20 2b 31 34 29 29 0a 23 64 65 66 69  tion +14)).#defi
7820: 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 28 66 75  ne tramp_data(fu
7830: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6c  nction)  \.  hil
7840: 6f 28 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f  o(*(unsigned sho
7850: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
7860: 2b 20 32 29 2c 20 2a 28 75 6e 73 69 67 6e 65 64  + 2), *(unsigned
7870: 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74   short *) (funct
7880: 69 6f 6e 20 2b 20 36 29 29 0a 23 65 6e 64 69 66  ion + 6)).#endif
7890: 0a 23 69 66 64 65 66 20 5f 5f 63 6f 6e 76 65 78  .#ifdef __convex
78a0: 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e  __.  /* function
78b0: 3a 0a 20 20 20 2a 20 20 20 20 6c 64 2e 77 20 23  :.   *    ld.w #
78c0: 3c 64 61 74 61 3e 2c 73 30 09 09 09 09 3f 3f 3f  <data>,s0....???
78d0: 3f 20 3c 64 61 74 61 3e 0a 20 20 20 2a 20 20 20  ? <data>.   *   
78e0: 20 6a 6d 70 20 3c 61 64 64 72 65 73 73 3e 09 09   jmp <address>..
78f0: 09 09 30 31 34 30 20 3c 61 64 64 72 65 73 73 3e  ..0140 <address>
7900: 0a 20 20 20 2a 20 20 20 20 64 73 2e 68 20 30 09  .   *    ds.h 0.
7910: 09 09 09 09 30 30 30 30 0a 20 20 20 2a 2f 0a 20  ....0000.   */. 
7920: 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75 6e   *(short *) (fun
7930: 63 74 69 6f 6e 20 2b 20 30 29 20 3d 20 30 78 3f  ction + 0) = 0x?
7940: 3f 3f 3f 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29  ???;.  *(long *)
7950: 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 32 29    (function + 2)
7960: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e   = (unsigned lon
7970: 67 29 20 64 61 74 61 3b 0a 20 20 2a 28 73 68 6f  g) data;.  *(sho
7980: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
7990: 2b 20 36 29 20 3d 20 30 78 30 31 34 30 3b 0a 20  + 6) = 0x0140;. 
79a0: 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75 6e   *(long *)  (fun
79b0: 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 28 75 6e  ction + 8) = (un
79c0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 61 64 64  signed long) add
79d0: 72 65 73 73 3b 0a 20 20 2a 28 73 68 6f 72 74 20  ress;.  *(short 
79e0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 32  *) (function +12
79f0: 29 20 3d 20 30 78 30 30 30 30 3b 0a 23 64 65 66  ) = 0x0000;.#def
7a00: 69 6e 65 20 69 73 5f 74 72 61 6d 70 28 66 75 6e  ine is_tramp(fun
7a10: 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 75 6e  ction)  \.  *(un
7a20: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 2a 29 20  signed short *) 
7a30: 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20 3d  (function + 0) =
7a40: 3d 20 30 78 3f 3f 3f 3f 20 26 26 20 5c 0a 20 20  = 0x???? && \.  
7a50: 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74  *(unsigned short
7a60: 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20   *) (function + 
7a70: 36 29 20 3d 3d 20 30 78 30 31 34 30 20 26 26 20  6) == 0x0140 && 
7a80: 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73  \.  *(unsigned s
7a90: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
7aa0: 6e 20 2b 31 32 29 20 3d 3d 20 30 78 30 30 30 30  n +12) == 0x0000
7ab0: 0a 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 61  .#define tramp_a
7ac0: 64 64 72 65 73 73 28 66 75 6e 63 74 69 6f 6e 29  ddress(function)
7ad0: 20 20 5c 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20    \.  *(long *) 
7ae0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 0a   (function + 8).
7af0: 23 64 65 66 69 6e 65 20 74 72 61 6d 70 5f 64 61  #define tramp_da
7b00: 74 61 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a  ta(function)  \.
7b10: 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28 66 75    *(long *)  (fu
7b20: 6e 63 74 69 6f 6e 20 2b 20 32 29 0a 23 65 6e 64  nction + 2).#end
7b30: 69 66 0a 23 69 66 64 65 66 20 5f 5f 69 61 36 34  if.#ifdef __ia64
7b40: 5f 5f 0a 20 20 2f 2a 20 66 75 6e 63 74 69 6f 6e  __.  /* function
7b50: 3a 0a 20 20 20 2a 20 20 20 20 64 61 74 61 38 20  :.   *    data8 
7b60: 20 20 74 72 61 6d 70 5f 72 0a 20 20 20 2a 20 20    tramp_r.   *  
7b70: 20 20 64 61 74 61 38 20 20 20 63 6c 6f 73 75 72    data8   closur
7b80: 65 0a 20 20 20 2a 20 63 6c 6f 73 75 72 65 3a 0a  e.   * closure:.
7b90: 20 20 20 2a 20 20 20 20 64 61 74 61 38 20 20 20     *    data8   
7ba0: 3c 61 64 64 72 65 73 73 3e 0a 20 20 20 2a 20 20  <address>.   *  
7bb0: 20 20 64 61 74 61 38 20 20 20 3c 64 61 74 61 3e    data8   <data>
7bc0: 0a 20 20 20 2a 2f 0a 20 20 2a 28 6c 6f 6e 67 20  .   */.  *(long 
7bd0: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30  *) (function + 0
7be0: 29 20 3d 20 28 6c 6f 6e 67 29 20 26 74 72 61 6d  ) = (long) &tram
7bf0: 70 5f 72 3b 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29  p_r;.  *(long *)
7c00: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 38 29 20   (function + 8) 
7c10: 3d 20 28 6c 6f 6e 67 29 20 28 66 75 6e 63 74 69  = (long) (functi
7c20: 6f 6e 20 2b 20 31 36 29 3b 0a 20 20 2a 28 6c 6f  on + 16);.  *(lo
7c30: 6e 67 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  ng *) (function 
7c40: 2b 31 36 29 20 3d 20 28 6c 6f 6e 67 29 20 61 64  +16) = (long) ad
7c50: 64 72 65 73 73 3b 0a 20 20 2a 28 6c 6f 6e 67 20  dress;.  *(long 
7c60: 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 32 34  *) (function +24
7c70: 29 20 3d 20 28 6c 6f 6e 67 29 20 64 61 74 61 3b  ) = (long) data;
7c80: 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d  .#define is_tram
7c90: 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20  p(function)  \. 
7ca0: 20 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74   ((long *) funct
7cb0: 69 6f 6e 29 5b 30 5d 20 3d 3d 20 28 6c 6f 6e 67  ion)[0] == (long
7cc0: 29 20 26 74 72 61 6d 70 5f 72 0a 23 64 65 66 69  ) &tramp_r.#defi
7cd0: 6e 65 20 74 72 61 6d 70 5f 61 64 64 72 65 73 73  ne tramp_address
7ce0: 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20  (function)  \.  
7cf0: 28 28 6c 6f 6e 67 20 2a 29 20 66 75 6e 63 74 69  ((long *) functi
7d00: 6f 6e 29 5b 32 5d 0a 23 64 65 66 69 6e 65 20 74  on)[2].#define t
7d10: 72 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 74 69  ramp_data(functi
7d20: 6f 6e 29 20 20 5c 0a 20 20 28 28 6c 6f 6e 67 20  on)  \.  ((long 
7d30: 2a 29 20 66 75 6e 63 74 69 6f 6e 29 5b 33 5d 0a  *) function)[3].
7d40: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f  #endif.#ifdef __
7d50: 78 38 36 5f 36 34 5f 5f 0a 20 20 2f 2a 20 66 75  x86_64__.  /* fu
7d60: 6e 63 74 69 6f 6e 3a 0a 20 20 20 2a 20 20 20 20  nction:.   *    
7d70: 6d 6f 76 61 62 73 71 20 24 3c 64 61 74 61 3e 2c  movabsq $<data>,
7d80: 25 72 31 30 09 09 34 39 20 42 41 20 3c 64 61 74  %r10..49 BA <dat
7d90: 61 3e 0a 20 20 20 2a 20 20 20 20 6d 6f 76 61 62  a>.   *    movab
7da0: 73 71 20 24 3c 61 64 64 72 65 73 73 3e 2c 25 72  sq $<address>,%r
7db0: 61 78 09 09 34 38 20 42 38 20 3c 61 64 64 72 65  ax..48 B8 <addre
7dc0: 73 73 3e 0a 20 20 20 2a 20 20 20 20 6a 6d 70 20  ss>.   *    jmp 
7dd0: 2a 25 72 61 78 09 09 09 46 46 20 45 30 0a 20 20  *%rax...FF E0.  
7de0: 20 2a 2f 0a 20 20 2a 28 73 68 6f 72 74 20 2a 29   */.  *(short *)
7df0: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20 30 29 20   (function + 0) 
7e00: 3d 20 30 78 42 41 34 39 3b 0a 20 20 2a 28 73 68  = 0xBA49;.  *(sh
7e10: 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e  ort *) (function
7e20: 20 2b 20 32 29 20 3d 20 28 75 6e 73 69 67 6e 65   + 2) = (unsigne
7e30: 64 20 6c 6f 6e 67 29 20 64 61 74 61 20 26 20 30  d long) data & 0
7e40: 78 66 66 66 66 3b 0a 20 20 2a 28 69 6e 74 20 2a  xffff;.  *(int *
7e50: 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20  )   (function + 
7e60: 34 29 20 3d 20 28 28 75 6e 73 69 67 6e 65 64 20  4) = ((unsigned 
7e70: 6c 6f 6e 67 29 20 64 61 74 61 20 3e 3e 20 31 36  long) data >> 16
7e80: 29 20 26 20 30 78 66 66 66 66 66 66 66 66 3b 0a  ) & 0xffffffff;.
7e90: 20 20 2a 28 73 68 6f 72 74 20 2a 29 20 28 66 75    *(short *) (fu
7ea0: 6e 63 74 69 6f 6e 20 2b 20 38 29 20 3d 20 28 28  nction + 8) = ((
7eb0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64  unsigned long) d
7ec0: 61 74 61 20 3e 3e 20 34 38 29 20 26 20 30 78 66  ata >> 48) & 0xf
7ed0: 66 66 66 3b 0a 20 20 2a 28 73 68 6f 72 74 20 2a  fff;.  *(short *
7ee0: 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31 30 29  ) (function +10)
7ef0: 20 3d 20 30 78 42 38 34 38 3b 0a 20 20 2a 28 69   = 0xB848;.  *(i
7f00: 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f  nt *)   (functio
7f10: 6e 20 2b 31 32 29 20 3d 20 28 75 6e 73 69 67 6e  n +12) = (unsign
7f20: 65 64 20 6c 6f 6e 67 29 20 61 64 64 72 65 73 73  ed long) address
7f30: 20 26 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20   & 0xffffffff;. 
7f40: 20 2a 28 69 6e 74 20 2a 29 20 20 20 28 66 75 6e   *(int *)   (fun
7f50: 63 74 69 6f 6e 20 2b 31 36 29 20 3d 20 28 28 75  ction +16) = ((u
7f60: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 61 64  nsigned long) ad
7f70: 64 72 65 73 73 20 3e 3e 20 33 32 29 20 26 20 30  dress >> 32) & 0
7f80: 78 66 66 66 66 66 66 66 66 3b 0a 20 20 2a 28 73  xffffffff;.  *(s
7f90: 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f  hort *) (functio
7fa0: 6e 20 2b 32 30 29 20 3d 20 30 78 45 30 46 46 3b  n +20) = 0xE0FF;
7fb0: 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72 61 6d  .#define is_tram
7fc0: 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20  p(function)  \. 
7fd0: 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f 72   *(unsigned shor
7fe0: 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  t *) (function +
7ff0: 20 30 29 20 3d 3d 20 30 78 42 41 34 39 20 26 26   0) == 0xBA49 &&
8000: 20 5c 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20   \.  *(unsigned 
8010: 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74 69  short *) (functi
8020: 6f 6e 20 2b 31 30 29 20 3d 3d 20 30 78 42 38 34  on +10) == 0xB84
8030: 38 20 26 26 20 5c 0a 20 20 2a 28 75 6e 73 69 67  8 && \.  *(unsig
8040: 6e 65 64 20 73 68 6f 72 74 20 2a 29 20 28 66 75  ned short *) (fu
8050: 6e 63 74 69 6f 6e 20 2b 32 30 29 20 3d 3d 20 30  nction +20) == 0
8060: 78 45 30 46 46 0a 23 64 65 66 69 6e 65 20 68 69  xE0FF.#define hi
8070: 6c 6f 28 68 69 77 6f 72 64 2c 6c 6f 77 6f 72 64  lo(hiword,loword
8080: 29 20 20 5c 0a 20 20 28 28 28 75 6e 73 69 67 6e  )  \.  (((unsign
8090: 65 64 20 6c 6f 6e 67 29 20 28 68 69 77 6f 72 64  ed long) (hiword
80a0: 29 20 3c 3c 20 33 32 29 20 7c 20 28 75 6e 73 69  ) << 32) | (unsi
80b0: 67 6e 65 64 20 6c 6f 6e 67 29 20 28 6c 6f 77 6f  gned long) (lowo
80c0: 72 64 29 29 0a 23 64 65 66 69 6e 65 20 68 69 6d  rd)).#define him
80d0: 69 64 6c 6f 28 68 69 73 68 6f 72 74 2c 6d 69 64  idlo(hishort,mid
80e0: 77 6f 72 64 2c 6c 6f 73 68 6f 72 74 29 20 20 5c  word,loshort)  \
80f0: 0a 20 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c  .  (((unsigned l
8100: 6f 6e 67 29 20 28 68 69 73 68 6f 72 74 29 20 3c  ong) (hishort) <
8110: 3c 20 34 38 29 20 7c 20 28 75 6e 73 69 67 6e 65  < 48) | (unsigne
8120: 64 20 6c 6f 6e 67 29 20 28 6d 69 64 77 6f 72 64  d long) (midword
8130: 29 20 3c 3c 20 31 36 20 5c 0a 20 20 20 7c 20 28  ) << 16 \.   | (
8140: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28  unsigned long) (
8150: 6c 6f 73 68 6f 72 74 29 29 0a 23 64 65 66 69 6e  loshort)).#defin
8160: 65 20 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28  e tramp_address(
8170: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 68  function)  \.  h
8180: 69 6c 6f 28 2a 28 75 6e 73 69 67 6e 65 64 20 69  ilo(*(unsigned i
8190: 6e 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  nt *) (function 
81a0: 2b 31 36 29 2c 20 2a 28 75 6e 73 69 67 6e 65 64  +16), *(unsigned
81b0: 20 69 6e 74 20 2a 29 20 28 66 75 6e 63 74 69 6f   int *) (functio
81c0: 6e 20 2b 31 32 29 29 0a 23 64 65 66 69 6e 65 20  n +12)).#define 
81d0: 74 72 61 6d 70 5f 64 61 74 61 28 66 75 6e 63 74  tramp_data(funct
81e0: 69 6f 6e 29 20 20 5c 0a 20 20 68 69 6d 69 64 6c  ion)  \.  himidl
81f0: 6f 28 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f  o(*(unsigned sho
8200: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
8210: 2b 20 38 29 2c 20 5c 0a 20 20 20 20 20 20 20 20  + 8), \.        
8220: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74    *(unsigned int
8230: 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20   *)   (function 
8240: 2b 20 34 29 2c 20 5c 0a 20 20 20 20 20 20 20 20  + 4), \.        
8250: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 73 68 6f    *(unsigned sho
8260: 72 74 20 2a 29 20 28 66 75 6e 63 74 69 6f 6e 20  rt *) (function 
8270: 2b 20 32 29 29 0a 23 65 6e 64 69 66 0a 23 69 66  + 2)).#endif.#if
8280: 64 65 66 20 5f 5f 73 33 39 30 5f 5f 0a 20 20 2f  def __s390__.  /
8290: 2a 20 66 75 6e 63 74 69 6f 6e 3a 0a 0a 20 20 20  * function:..   
82a0: 20 20 20 20 20 62 72 61 73 20 20 20 20 25 72 31       bras    %r1
82b0: 2c 2e 4c 54 4e 30 5f 30 0a 2e 4c 54 30 5f 30 3a  ,.LTN0_0..LT0_0:
82c0: 0a 2e 4c 43 30 3a 0a 20 20 20 20 20 20 20 20 2e  ..LC0:.        .
82d0: 6c 6f 6e 67 20 20 20 30 78 37 33 35 35 34 37 31  long   0x7355471
82e0: 31 0a 2e 4c 43 31 3a 0a 20 20 20 20 20 20 20 20  1..LC1:.        
82f0: 2e 6c 6f 6e 67 20 20 20 30 78 62 61 62 65 62 65  .long   0xbabebe
8300: 63 30 0a 2e 4c 54 4e 30 5f 30 3a 0a 20 20 20 20  c0..LTN0_0:.    
8310: 20 20 20 20 6c 20 20 20 20 20 20 20 25 72 30 2c      l       %r0,
8320: 2e 4c 43 30 2d 2e 4c 54 30 5f 30 28 25 72 31 29  .LC0-.LT0_0(%r1)
8330: 0a 20 20 20 20 20 20 20 20 6c 20 20 20 20 20 20  .        l      
8340: 20 25 72 31 2c 2e 4c 43 31 2d 2e 4c 54 31 5f 30   %r1,.LC1-.LT1_0
8350: 28 25 72 31 29 0a 20 20 20 20 20 20 20 20 62 72  (%r1).        br
8360: 20 20 20 20 20 20 25 72 31 0a 20 20 2a 2f 0a 20        %r1.  */. 
8370: 20 2f 2a 20 57 68 61 74 20 61 62 6f 75 74 20 62   /* What about b
8380: 69 67 20 65 6e 64 69 61 6e 20 2f 20 6c 69 74 74  ig endian / litt
8390: 6c 65 20 65 6e 64 69 61 6e 20 3f 3f 20 2a 2f 0a  le endian ?? */.
83a0: 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74    *(unsigned int
83b0: 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20   *)   (function 
83c0: 2b 20 30 29 20 3d 20 30 78 41 37 31 35 30 30 30  + 0) = 0xA715000
83d0: 36 3b 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20  6;.  *(unsigned 
83e0: 69 6e 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69  int *)   (functi
83f0: 6f 6e 20 2b 20 34 29 20 3d 20 28 75 6e 73 69 67  on + 4) = (unsig
8400: 6e 65 64 20 69 6e 74 29 20 64 61 74 61 3b 0a 20  ned int) data;. 
8410: 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20   *(unsigned int 
8420: 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b  *)   (function +
8430: 20 38 29 20 3d 20 28 75 6e 73 69 67 6e 65 64 20   8) = (unsigned 
8440: 69 6e 74 29 20 61 64 64 72 65 73 73 3b 0a 20 20  int) address;.  
8450: 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a  *(unsigned int *
8460: 29 20 20 20 28 66 75 6e 63 74 69 6f 6e 20 2b 31  )   (function +1
8470: 32 29 20 3d 20 30 78 35 38 30 30 31 30 30 30 3b  2) = 0x58001000;
8480: 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64 20 69 6e  .  *(unsigned in
8490: 74 20 2a 29 20 20 20 28 66 75 6e 63 74 69 6f 6e  t *)   (function
84a0: 20 2b 31 36 29 20 3d 20 30 78 35 38 31 30 31 30   +16) = 0x581010
84b0: 30 34 3b 0a 20 20 2a 28 75 6e 73 69 67 6e 65 64  04;.  *(unsigned
84c0: 20 73 68 6f 72 74 20 2a 29 20 28 66 75 6e 63 74   short *) (funct
84d0: 69 6f 6e 20 2b 32 30 29 20 3d 20 30 78 30 37 66  ion +20) = 0x07f
84e0: 31 3b 0a 23 64 65 66 69 6e 65 20 69 73 5f 74 72  1;.#define is_tr
84f0: 61 6d 70 28 66 75 6e 63 74 69 6f 6e 29 20 20 5c  amp(function)  \
8500: 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 20 20  .  *(int *)     
8510: 20 20 20 20 20 20 20 28 66 75 6e 63 74 69 6f 6e         (function
8520: 20 2b 20 30 29 20 3d 3d 20 30 78 41 37 31 35 30   + 0) == 0xA7150
8530: 30 30 36 20 26 26 20 5c 0a 20 20 2a 28 69 6e 74  006 && \.  *(int
8540: 20 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 28   *)            (
8550: 66 75 6e 63 74 69 6f 6e 20 2b 31 32 29 20 3d 3d  function +12) ==
8560: 20 30 78 35 38 30 30 31 30 30 30 20 26 26 20 5c   0x58001000 && \
8570: 0a 20 20 2a 28 69 6e 74 20 2a 29 20 20 20 20 20  .  *(int *)     
8580: 20 20 20 20 20 20 20 28 66 75 6e 63 74 69 6f 6e         (function
8590: 20 2b 31 36 29 20 3d 3d 20 30 78 35 38 31 30 31   +16) == 0x58101
85a0: 30 30 34 20 26 26 20 5c 0a 20 20 2a 28 73 68 6f  004 && \.  *(sho
85b0: 72 74 20 2a 29 20 20 20 20 20 20 20 20 20 20 28  rt *)          (
85c0: 66 75 6e 63 74 69 6f 6e 20 2b 32 30 29 20 3d 3d  function +20) ==
85d0: 20 30 78 30 37 66 31 0a 23 64 65 66 69 6e 65 20   0x07f1.#define 
85e0: 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28 66 75  tramp_address(fu
85f0: 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a 28 75  nction)  \.  *(u
8600: 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29 20 28  nsigned int *) (
8610: 66 75 6e 63 74 69 6f 6e 20 2b 38 29 0a 23 64 65  function +8).#de
8620: 66 69 6e 65 20 74 72 61 6d 70 5f 64 61 74 61 28  fine tramp_data(
8630: 66 75 6e 63 74 69 6f 6e 29 20 20 5c 0a 20 20 2a  function)  \.  *
8640: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 29  (unsigned int *)
8650: 20 28 66 75 6e 63 74 69 6f 6e 20 2b 34 29 0a 23   (function +4).#
8660: 65 6e 64 69 66 0a 20 20 2f 2a 0a 20 20 20 2a 20  endif.  /*.   * 
8670: 64 61 74 61 3a 0a 20 20 20 2a 20 20 20 20 3c 64  data:.   *    <d
8680: 61 74 61 30 3e 09 09 09 09 3c 64 61 74 61 30 3e  ata0>....<data0>
8690: 0a 20 20 20 2a 20 20 20 20 3c 64 61 74 61 31 3e  .   *    <data1>
86a0: 09 09 09 09 3c 64 61 74 61 31 3e 0a 20 20 20 2a  ....<data1>.   *
86b0: 2f 0a 20 20 2a 28 6c 6f 6e 67 20 2a 29 20 20 28  /.  *(long *)  (
86c0: 64 61 74 61 20 2b 20 30 2a 73 69 7a 65 6f 66 28  data + 0*sizeof(
86d0: 76 6f 69 64 2a 29 29 20 3d 20 28 6c 6f 6e 67 29  void*)) = (long)
86e0: 20 64 61 74 61 30 3b 0a 20 20 2a 28 6c 6f 6e 67   data0;.  *(long
86f0: 20 2a 29 20 20 28 64 61 74 61 20 2b 20 31 2a 73   *)  (data + 1*s
8700: 69 7a 65 6f 66 28 76 6f 69 64 2a 29 29 20 3d 20  izeof(void*)) = 
8710: 28 6c 6f 6e 67 29 20 64 61 74 61 31 3b 0a 0a 20  (long) data1;.. 
8720: 20 2f 2a 20 33 2e 20 53 65 74 20 6d 65 6d 6f 72   /* 3. Set memor
8730: 79 20 70 72 6f 74 65 63 74 69 6f 6e 20 74 6f 20  y protection to 
8740: 22 65 78 65 63 75 74 61 62 6c 65 22 20 2a 2f 0a  "executable" */.
8750: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 43 4f  .#if !defined(CO
8760: 44 45 5f 45 58 45 43 55 54 41 42 4c 45 29 20 26  DE_EXECUTABLE) &
8770: 26 20 64 65 66 69 6e 65 64 28 45 58 45 43 55 54  & defined(EXECUT
8780: 41 42 4c 45 5f 56 49 41 5f 4d 50 52 4f 54 45 43  ABLE_VIA_MPROTEC
8790: 54 29 0a 20 20 2f 2a 20 43 61 6c 6c 20 6d 70 72  T).  /* Call mpr
87a0: 6f 74 65 63 74 20 6f 6e 20 74 68 65 20 70 61 67  otect on the pag
87b0: 65 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20  es that contain 
87c0: 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20  the range. */.  
87d0: 7b 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  { unsigned long 
87e0: 73 74 61 72 74 5f 61 64 64 72 20 3d 20 28 75 6e  start_addr = (un
87f0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 66 75 6e  signed long) fun
8800: 63 74 69 6f 6e 3b 0a 20 20 20 20 75 6e 73 69 67  ction;.    unsig
8810: 6e 65 64 20 6c 6f 6e 67 20 65 6e 64 5f 61 64 64  ned long end_add
8820: 72 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  r = (unsigned lo
8830: 6e 67 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b 20  ng) (function + 
8840: 54 52 41 4d 50 5f 4c 45 4e 47 54 48 29 3b 0a 20  TRAMP_LENGTH);. 
8850: 20 20 20 73 74 61 72 74 5f 61 64 64 72 20 3d 20     start_addr = 
8860: 73 74 61 72 74 5f 61 64 64 72 20 26 20 2d 70 61  start_addr & -pa
8870: 67 65 73 69 7a 65 3b 0a 20 20 20 20 65 6e 64 5f  gesize;.    end_
8880: 61 64 64 72 20 3d 20 28 65 6e 64 5f 61 64 64 72  addr = (end_addr
8890: 20 2b 20 70 61 67 65 73 69 7a 65 2d 31 29 20 26   + pagesize-1) &
88a0: 20 2d 70 61 67 65 73 69 7a 65 3b 0a 20 20 20 7b   -pagesize;.   {
88b0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 65  unsigned long le
88c0: 6e 20 3d 20 65 6e 64 5f 61 64 64 72 20 2d 20 73  n = end_addr - s
88d0: 74 61 72 74 5f 61 64 64 72 3b 0a 23 69 66 20 64  tart_addr;.#if d
88e0: 65 66 69 6e 65 64 28 48 41 56 45 5f 4d 41 43 48  efined(HAVE_MACH
88f0: 5f 56 4d 29 0a 20 20 20 20 69 66 20 28 76 6d 5f  _VM).    if (vm_
8900: 70 72 6f 74 65 63 74 28 74 61 73 6b 5f 73 65 6c  protect(task_sel
8910: 66 28 29 2c 73 74 61 72 74 5f 61 64 64 72 2c 6c  f(),start_addr,l
8920: 65 6e 2c 30 2c 56 4d 5f 50 52 4f 54 5f 52 45 41  en,0,VM_PROT_REA
8930: 44 7c 56 4d 5f 50 52 4f 54 5f 57 52 49 54 45 7c  D|VM_PROT_WRITE|
8940: 56 4d 5f 50 52 4f 54 5f 45 58 45 43 55 54 45 29  VM_PROT_EXECUTE)
8950: 20 21 3d 20 4b 45 52 4e 5f 53 55 43 43 45 53 53   != KERN_SUCCESS
8960: 29 0a 23 65 6c 73 65 0a 23 69 66 20 64 65 66 69  ).#else.#if defi
8970: 6e 65 64 28 5f 5f 63 6f 6e 76 65 78 5f 5f 29 0a  ned(__convex__).
8980: 20 20 20 20 2f 2a 20 43 6f 6e 76 65 78 20 4f 53      /* Convex OS
8990: 20 63 61 6c 6c 73 20 69 74 20 60 6d 72 65 6d 61   calls it `mrema
89a0: 70 28 29 27 2e 20 2a 2f 0a 20 20 20 20 6d 72 65  p()'. */.    mre
89b0: 6d 61 70 28 73 74 61 72 74 5f 61 64 64 72 2c 20  map(start_addr, 
89c0: 26 6c 65 6e 2c 20 50 52 4f 54 5f 52 45 41 44 7c  &len, PROT_READ|
89d0: 50 52 4f 54 5f 57 52 49 54 45 7c 50 52 4f 54 5f  PROT_WRITE|PROT_
89e0: 45 58 45 43 2c 20 4d 41 50 5f 50 52 49 56 41 54  EXEC, MAP_PRIVAT
89f0: 45 29 3b 0a 20 20 20 20 69 66 20 28 30 29 0a 23  E);.    if (0).#
8a00: 65 6c 73 65 0a 23 69 66 20 64 65 66 69 6e 65 64  else.#if defined
8a10: 28 48 41 56 45 5f 53 59 53 5f 4d 38 38 4b 42 43  (HAVE_SYS_M88KBC
8a20: 53 5f 48 29 0a 20 20 20 20 69 66 20 28 6d 65 6d  S_H).    if (mem
8a30: 63 74 6c 28 73 74 61 72 74 5f 61 64 64 72 2c 20  ctl(start_addr, 
8a40: 6c 65 6e 2c 20 4d 43 54 5f 54 45 58 54 29 20 3d  len, MCT_TEXT) =
8a50: 3d 20 2d 31 29 0a 23 65 6c 73 65 0a 20 20 20 20  = -1).#else.    
8a60: 69 66 20 28 6d 70 72 6f 74 65 63 74 28 28 76 6f  if (mprotect((vo
8a70: 69 64 2a 29 73 74 61 72 74 5f 61 64 64 72 2c 20  id*)start_addr, 
8a80: 6c 65 6e 2c 20 50 52 4f 54 5f 52 45 41 44 7c 50  len, PROT_READ|P
8a90: 52 4f 54 5f 57 52 49 54 45 7c 50 52 4f 54 5f 45  ROT_WRITE|PROT_E
8aa0: 58 45 43 29 20 3c 20 30 29 0a 23 65 6e 64 69 66  XEC) < 0).#endif
8ab0: 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 20  .#endif.#endif. 
8ac0: 20 20 20 20 20 7b 20 66 70 72 69 6e 74 66 28 73       { fprintf(s
8ad0: 74 64 65 72 72 2c 22 74 72 61 6d 70 6f 6c 69 6e  tderr,"trampolin
8ae0: 65 3a 20 63 61 6e 6e 6f 74 20 6d 61 6b 65 20 6d  e: cannot make m
8af0: 65 6d 6f 72 79 20 65 78 65 63 75 74 61 62 6c 65  emory executable
8b00: 5c 6e 22 29 3b 20 61 62 6f 72 74 28 29 3b 20 7d  \n"); abort(); }
8b10: 0a 20 20 7d 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  .  }}.#endif..  
8b20: 2f 2a 20 34 2e 20 46 6c 75 73 68 20 69 6e 73 74  /* 4. Flush inst
8b30: 72 75 63 74 69 6f 6e 20 63 61 63 68 65 20 2a 2f  ruction cache */
8b40: 0a 20 20 2f 2a 20 57 65 20 6e 65 65 64 20 74 68  .  /* We need th
8b50: 69 73 20 62 65 63 61 75 73 65 20 73 6f 6d 65 20  is because some 
8b60: 43 50 55 73 20 68 61 76 65 20 73 65 70 61 72 61  CPUs have separa
8b70: 74 65 20 64 61 74 61 20 63 61 63 68 65 20 61 6e  te data cache an
8b80: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20  d instruction.  
8b90: 20 2a 20 63 61 63 68 65 2e 20 54 68 65 20 66 72   * cache. The fr
8ba0: 65 73 68 6c 79 20 62 75 69 6c 74 20 74 72 61 6d  eshly built tram
8bb0: 70 6f 6c 69 6e 65 20 69 73 20 76 69 73 69 62 6c  poline is visibl
8bc0: 65 20 74 6f 20 74 68 65 20 64 61 74 61 20 63 61  e to the data ca
8bd0: 63 68 65 2c 20 62 75 74 20 6e 6f 74 0a 20 20 20  che, but not.   
8be0: 2a 20 6d 61 79 62 65 20 6e 6f 74 20 74 6f 20 74  * maybe not to t
8bf0: 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 63  he instruction c
8c00: 61 63 68 65 2e 20 54 68 69 73 20 69 73 20 68 61  ache. This is ha
8c10: 69 72 79 2e 0a 20 20 20 2a 2f 0a 23 69 66 20 21  iry..   */.#if !
8c20: 28 64 65 66 69 6e 65 64 28 5f 5f 68 70 70 61 6e  (defined(__hppan
8c30: 65 77 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64  ew__) || defined
8c40: 28 5f 5f 72 73 36 30 30 30 61 69 78 5f 5f 29 20  (__rs6000aix__) 
8c50: 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 69 61 36  || defined(__ia6
8c60: 34 5f 5f 29 29 0a 20 20 2f 2a 20 4f 6e 6c 79 20  4__)).  /* Only 
8c70: 6e 65 65 64 65 64 20 69 66 20 77 65 20 72 65 61  needed if we rea
8c80: 6c 6c 79 20 73 65 74 20 75 70 20 6d 61 63 68 69  lly set up machi
8c90: 6e 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e  ne instructions.
8ca0: 20 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 69 33 38   */.#ifdef __i38
8cb0: 36 5f 5f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  6__.#if defined(
8cc0: 5f 57 49 4e 33 32 29 0a 20 20 77 68 69 6c 65 20  _WIN32).  while 
8cd0: 28 21 46 6c 75 73 68 49 6e 73 74 72 75 63 74 69  (!FlushInstructi
8ce0: 6f 6e 43 61 63 68 65 28 47 65 74 43 75 72 72 65  onCache(GetCurre
8cf0: 6e 74 50 72 6f 63 65 73 73 28 29 2c 66 75 6e 63  ntProcess(),func
8d00: 74 69 6f 6e 2c 54 52 41 4d 50 5f 4c 45 4e 47 54  tion,TRAMP_LENGT
8d10: 48 29 29 0a 20 20 20 20 63 6f 6e 74 69 6e 75 65  H)).    continue
8d20: 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  ;.#endif.#endif.
8d30: 23 69 66 64 65 66 20 5f 5f 6d 36 38 6b 5f 5f 0a  #ifdef __m68k__.
8d40: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 65 58 54  #if defined(NeXT
8d50: 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 47  ) && defined(__G
8d60: 4e 55 43 5f 5f 29 0a 20 20 5f 5f 61 73 6d 5f 5f  NUC__).  __asm__
8d70: 20 5f 5f 76 6f 6c 61 74 69 6c 65 5f 5f 20 28 22   __volatile__ ("
8d80: 74 72 61 70 20 23 32 22 29 3b 0a 23 65 6e 64 69  trap #2");.#endi
8d90: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 41 4d  f.#if defined(AM
8da0: 49 47 41 29 0a 20 20 43 61 63 68 65 43 6c 65 61  IGA).  CacheClea
8db0: 72 45 28 66 75 6e 63 74 69 6f 6e 2c 54 52 41 4d  rE(function,TRAM
8dc0: 50 5f 4c 45 4e 47 54 48 2c 43 41 43 52 46 5f 43  P_LENGTH,CACRF_C
8dd0: 6c 65 61 72 49 7c 43 41 43 52 46 5f 43 6c 65 61  learI|CACRF_Clea
8de0: 72 44 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  rD);.#endif.#if 
8df0: 64 65 66 69 6e 65 64 28 61 70 6f 6c 6c 6f 29 0a  defined(apollo).
8e00: 20 20 63 61 63 68 65 5f 24 63 6c 65 61 72 28 29    cache_$clear()
8e10: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
8e20: 69 6e 65 64 28 68 70 75 78 29 0a 20 20 63 61 63  ined(hpux).  cac
8e30: 68 65 63 74 6c 28 43 43 5f 49 50 55 52 47 45 2c  hectl(CC_IPURGE,
8e40: 66 75 6e 63 74 69 6f 6e 2c 54 52 41 4d 50 5f 4c  function,TRAMP_L
8e50: 45 4e 47 54 48 29 3b 0a 23 65 6e 64 69 66 0a 23  ENGTH);.#endif.#
8e60: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 4e 65 74  if defined(__Net
8e70: 42 53 44 5f 5f 29 20 26 26 20 64 65 66 69 6e 65  BSD__) && define
8e80: 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a 20 20 7b 20  d(__GNUC__).  { 
8e90: 72 65 67 69 73 74 65 72 20 75 6e 73 69 67 6e 65  register unsigne
8ea0: 64 20 6c 6f 6e 67 20 5f 62 65 67 20 5f 5f 61 73  d long _beg __as
8eb0: 6d 5f 5f 20 28 22 25 61 31 22 29 20 3d 20 28 75  m__ ("%a1") = (u
8ec0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 66 75  nsigned long) fu
8ed0: 6e 63 74 69 6f 6e 3b 0a 20 20 20 20 72 65 67 69  nction;.    regi
8ee0: 73 74 65 72 20 75 6e 73 69 67 6e 65 64 20 6c 6f  ster unsigned lo
8ef0: 6e 67 20 5f 6c 65 6e 20 5f 5f 61 73 6d 5f 5f 20  ng _len __asm__ 
8f00: 28 22 25 64 31 22 29 20 3d 20 54 52 41 4d 50 5f  ("%d1") = TRAMP_
8f10: 4c 45 4e 47 54 48 3b 0a 20 20 20 20 5f 5f 61 73  LENGTH;.    __as
8f20: 6d 5f 5f 20 5f 5f 76 6f 6c 61 74 69 6c 65 5f 5f  m__ __volatile__
8f30: 20 28 0a 20 20 20 20 20 20 22 6d 6f 76 65 25 2e   (.      "move%.
8f40: 6c 20 25 23 30 78 38 30 30 30 30 30 30 34 2c 25  l %#0x80000004,%
8f50: 2f 64 30 5c 6e 5c 74 22 20 2f 2a 20 43 43 5f 45  /d0\n\t" /* CC_E
8f60: 58 54 50 55 52 47 45 20 7c 20 43 5f 49 50 55 52  XTPURGE | C_IPUR
8f70: 47 45 20 2a 2f 0a 20 20 20 20 20 20 22 74 72 61  GE */.      "tra
8f80: 70 20 23 31 32 22 20 20 20 20 20 20 20 20 20 20  p #12"          
8f90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6b              /* k
8fa0: 65 72 6e 65 6c 20 63 61 6c 6c 20 60 63 61 63 68  ernel call `cach
8fb0: 65 63 74 6c 27 20 2a 2f 0a 20 20 20 20 20 20 3a  ectl' */.      :
8fc0: 0a 20 20 20 20 20 20 3a 20 22 61 22 20 28 5f 62  .      : "a" (_b
8fd0: 65 67 29 2c 20 22 64 22 20 28 5f 6c 65 6e 29 0a  eg), "d" (_len).
8fe0: 20 20 20 20 20 20 3a 20 22 25 61 30 22 2c 20 22        : "%a0", "
8ff0: 25 61 31 22 2c 20 22 25 64 30 22 2c 20 22 25 64  %a1", "%d0", "%d
9000: 31 22 20 20 20 20 2f 2a 20 63 61 6c 6c 2d 75 73  1"    /* call-us
9010: 65 64 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  ed registers */.
9020: 20 20 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e        );.  }.#en
9030: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
9040: 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20 64 65  __linux__) && de
9050: 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a  fined(__GNUC__).
9060: 20 20 7b 20 72 65 67 69 73 74 65 72 20 75 6e 73    { register uns
9070: 69 67 6e 65 64 20 6c 6f 6e 67 20 5f 62 65 67 20  igned long _beg 
9080: 5f 5f 61 73 6d 5f 5f 20 28 22 25 64 31 22 29 20  __asm__ ("%d1") 
9090: 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  = (unsigned long
90a0: 29 20 66 75 6e 63 74 69 6f 6e 3b 0a 20 20 20 20  ) function;.    
90b0: 72 65 67 69 73 74 65 72 20 75 6e 73 69 67 6e 65  register unsigne
90c0: 64 20 6c 6f 6e 67 20 5f 6c 65 6e 20 5f 5f 61 73  d long _len __as
90d0: 6d 5f 5f 20 28 22 25 64 34 22 29 20 3d 20 54 52  m__ ("%d4") = TR
90e0: 41 4d 50 5f 4c 45 4e 47 54 48 20 2b 20 33 32 3b  AMP_LENGTH + 32;
90f0: 0a 20 20 20 20 5f 5f 61 73 6d 5f 5f 20 5f 5f 76  .    __asm__ __v
9100: 6f 6c 61 74 69 6c 65 5f 5f 20 28 0a 20 20 20 20  olatile__ (.    
9110: 20 20 22 6d 6f 76 65 25 2e 6c 20 25 23 31 32 33    "move%.l %#123
9120: 2c 25 2f 64 30 5c 6e 5c 74 22 0a 20 20 20 20 20  ,%/d0\n\t".     
9130: 20 22 6d 6f 76 65 25 2e 6c 20 25 23 31 2c 25 2f   "move%.l %#1,%/
9140: 64 32 5c 6e 5c 74 22 0a 20 20 20 20 20 20 22 6d  d2\n\t".      "m
9150: 6f 76 65 25 2e 6c 20 25 23 33 2c 25 2f 64 33 5c  ove%.l %#3,%/d3\
9160: 6e 5c 74 22 0a 20 20 20 20 20 20 22 74 72 61 70  n\t".      "trap
9170: 20 25 23 30 22 0a 20 20 20 20 20 20 3a 0a 20 20   %#0".      :.  
9180: 20 20 20 20 3a 20 22 64 22 20 28 5f 62 65 67 29      : "d" (_beg)
9190: 2c 20 22 64 22 20 28 5f 6c 65 6e 29 0a 20 20 20  , "d" (_len).   
91a0: 20 20 20 3a 20 22 25 64 30 22 2c 20 22 25 64 32     : "%d0", "%d2
91b0: 22 2c 20 22 25 64 33 22 0a 20 20 20 20 20 20 29  ", "%d3".      )
91c0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66  ;.  }.#endif.#if
91d0: 20 64 65 66 69 6e 65 64 28 41 55 58 29 20 26 26   defined(AUX) &&
91e0: 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f   defined(__GNUC_
91f0: 5f 29 0a 20 20 2f 2a 20 73 79 73 6d 36 38 6b 28  _).  /* sysm68k(
9200: 31 30 35 2c 20 61 64 64 72 2c 20 73 63 6f 70 65  105, addr, scope
9210: 2c 20 63 61 63 68 65 2c 20 6c 65 6e 29 20 2a 2f  , cache, len) */
9220: 0a 20 20 5f 5f 61 73 6d 5f 5f 20 5f 5f 76 6f 6c  .  __asm__ __vol
9230: 61 74 69 6c 65 5f 5f 20 28 0a 20 20 20 20 22 6d  atile__ (.    "m
9240: 6f 76 65 25 2e 6c 20 25 31 2c 25 2f 73 70 40 2d  ove%.l %1,%/sp@-
9250: 5c 6e 5c 74 22 0a 20 20 20 20 22 6d 6f 76 65 25  \n\t".    "move%
9260: 2e 6c 20 25 23 33 2c 25 2f 73 70 40 2d 5c 6e 5c  .l %#3,%/sp@-\n\
9270: 74 22 0a 20 20 20 20 22 6d 6f 76 65 25 2e 6c 20  t".    "move%.l 
9280: 25 23 31 2c 25 2f 73 70 40 2d 5c 6e 5c 74 22 0a  %#1,%/sp@-\n\t".
9290: 20 20 20 20 22 6d 6f 76 65 25 2e 6c 20 25 30 2c      "move%.l %0,
92a0: 25 2f 73 70 40 2d 5c 6e 5c 74 22 0a 20 20 20 20  %/sp@-\n\t".    
92b0: 22 6d 6f 76 65 25 2e 6c 20 25 23 31 30 35 2c 25  "move%.l %#105,%
92c0: 2f 73 70 40 2d 5c 6e 5c 74 22 0a 20 20 20 20 22  /sp@-\n\t".    "
92d0: 6d 6f 76 65 25 2e 6c 20 25 23 30 2c 25 2f 73 70  move%.l %#0,%/sp
92e0: 40 2d 5c 6e 5c 74 22 0a 20 20 20 20 22 6d 6f 76  @-\n\t".    "mov
92f0: 65 25 2e 6c 20 25 23 33 38 2c 25 2f 73 70 40 2d  e%.l %#38,%/sp@-
9300: 5c 6e 5c 74 22 0a 20 20 20 20 22 74 72 61 70 20  \n\t".    "trap 
9310: 25 23 30 5c 6e 5c 74 22 0a 20 20 20 20 22 61 64  %#0\n\t".    "ad
9320: 64 25 2e 6c 20 25 23 32 34 2c 25 2f 73 70 22 0a  d%.l %#24,%/sp".
9330: 20 20 20 20 3a 0a 20 20 20 20 3a 20 22 72 22 20      :.    : "r" 
9340: 28 66 75 6e 63 74 69 6f 6e 29 2c 20 22 67 22 20  (function), "g" 
9350: 28 28 69 6e 74 29 54 52 41 4d 50 5f 4c 45 4e 47  ((int)TRAMP_LENG
9360: 54 48 29 0a 20 20 20 20 3a 20 22 25 64 30 22 0a  TH).    : "%d0".
9370: 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a 23 65      );.#endif.#e
9380: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
9390: 28 5f 5f 6d 69 70 73 5f 5f 29 20 7c 7c 20 64 65  (__mips__) || de
93a0: 66 69 6e 65 64 28 5f 5f 6d 69 70 73 6e 33 32 5f  fined(__mipsn32_
93b0: 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f  _) || defined(__
93c0: 6d 69 70 73 36 34 5f 5f 29 0a 20 20 63 61 63 68  mips64__).  cach
93d0: 65 66 6c 75 73 68 28 66 75 6e 63 74 69 6f 6e 2c  eflush(function,
93e0: 54 52 41 4d 50 5f 4c 45 4e 47 54 48 2c 49 43 41  TRAMP_LENGTH,ICA
93f0: 43 48 45 29 3b 0a 20 20 2f 2a 20 67 66 6f 72 74  CHE);.  /* gfort
9400: 68 2d 30 2e 33 2e 30 20 75 73 65 73 20 42 43 41  h-0.3.0 uses BCA
9410: 43 48 45 20 69 6e 73 74 65 61 64 20 6f 66 20 49  CHE instead of I
9420: 43 41 43 48 45 2e 20 57 68 79 3f 3f 20 2a 2f 0a  CACHE. Why?? */.
9430: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
9440: 65 64 28 5f 5f 73 70 61 72 63 5f 5f 29 20 7c 7c  ed(__sparc__) ||
9450: 20 64 65 66 69 6e 65 64 28 5f 5f 73 70 61 72 63   defined(__sparc
9460: 36 34 5f 5f 29 0a 20 20 2f 2a 20 54 68 69 73 20  64__).  /* This 
9470: 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65  assumes that the
9480: 20 74 72 61 6d 70 6f 6c 69 6e 65 20 66 69 74 73   trampoline fits
9490: 20 69 6e 20 61 74 20 6d 6f 73 74 20 74 77 6f 20   in at most two 
94a0: 63 61 63 68 65 20 6c 69 6e 65 73 2e 20 2a 2f 0a  cache lines. */.
94b0: 20 20 5f 5f 54 52 5f 63 6c 65 61 72 5f 63 61 63    __TR_clear_cac
94c0: 68 65 5f 32 28 66 75 6e 63 74 69 6f 6e 2c 66 75  he_2(function,fu
94d0: 6e 63 74 69 6f 6e 2b 54 52 41 4d 50 5f 4c 45 4e  nction+TRAMP_LEN
94e0: 47 54 48 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 23  GTH-1);.#endif.#
94f0: 69 66 64 65 66 20 5f 5f 61 6c 70 68 61 5f 5f 0a  ifdef __alpha__.
9500: 20 20 5f 5f 54 52 5f 63 6c 65 61 72 5f 63 61 63    __TR_clear_cac
9510: 68 65 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  he();.#endif.#if
9520: 64 65 66 20 5f 5f 68 70 70 61 5f 5f 0a 20 20 2f  def __hppa__.  /
9530: 2a 20 54 68 69 73 20 61 73 73 75 6d 65 73 20 74  * This assumes t
9540: 68 61 74 20 74 68 65 20 74 72 61 6d 70 6f 6c 69  hat the trampoli
9550: 6e 65 20 66 69 74 73 20 69 6e 20 61 74 20 6d 6f  ne fits in at mo
9560: 73 74 20 74 77 6f 20 63 61 63 68 65 20 6c 69 6e  st two cache lin
9570: 65 73 2e 20 2a 2f 0a 20 20 5f 5f 54 52 5f 63 6c  es. */.  __TR_cl
9580: 65 61 72 5f 63 61 63 68 65 28 66 75 6e 63 74 69  ear_cache(functi
9590: 6f 6e 2c 66 75 6e 63 74 69 6f 6e 2b 54 52 41 4d  on,function+TRAM
95a0: 50 5f 4c 45 4e 47 54 48 2d 31 29 3b 0a 23 65 6e  P_LENGTH-1);.#en
95b0: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 61 72 6d  dif.#ifdef __arm
95c0: 5f 5f 0a 20 20 2f 2a 20 54 68 69 73 20 43 50 55  __.  /* This CPU
95d0: 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61   does not have a
95e0: 20 73 65 70 61 72 61 74 65 20 69 6e 73 74 72 75   separate instru
95f0: 63 74 69 6f 6e 20 63 61 63 68 65 2e 20 28 49 20  ction cache. (I 
9600: 74 68 69 6e 6b 2e 29 20 2a 2f 0a 23 65 6e 64 69  think.) */.#endi
9610: 66 0a 23 69 66 64 65 66 20 5f 5f 72 73 36 30 30  f.#ifdef __rs600
9620: 30 5f 5f 0a 20 20 5f 5f 54 52 5f 63 6c 65 61 72  0__.  __TR_clear
9630: 5f 63 61 63 68 65 28 66 75 6e 63 74 69 6f 6e 29  _cache(function)
9640: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
9650: 5f 5f 6d 38 38 6b 5f 5f 0a 20 20 73 79 73 6d 6f  __m88k__.  sysmo
9660: 74 28 53 38 38 43 41 43 48 45 46 4c 55 53 48 50  t(S88CACHEFLUSHP
9670: 41 47 45 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  AGE, (unsigned l
9680: 6f 6e 67 29 66 75 6e 63 74 69 6f 6e 20 26 20 2d  ong)function & -
9690: 70 61 67 65 73 69 7a 65 29 3b 0a 23 65 6e 64 69  pagesize);.#endi
96a0: 66 0a 23 69 66 64 65 66 20 5f 5f 63 6f 6e 76 65  f.#ifdef __conve
96b0: 78 5f 5f 0a 20 20 5f 5f 54 52 5f 63 6c 65 61 72  x__.  __TR_clear
96c0: 5f 63 61 63 68 65 28 29 3b 0a 23 65 6e 64 69 66  _cache();.#endif
96d0: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 35 2e  .#endif..  /* 5.
96e0: 20 52 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65   Return. */.  re
96f0: 74 75 72 6e 20 28 5f 5f 54 52 5f 66 75 6e 63 74  turn (__TR_funct
9700: 69 6f 6e 29 20 28 66 75 6e 63 74 69 6f 6e 20 2b  ion) (function +
9710: 20 54 52 41 4d 50 5f 42 49 41 53 29 3b 0a 7d 0a   TRAMP_BIAS);.}.
9720: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 53  .#if defined(__S
9730: 54 44 43 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65  TDC__) || define
9740: 64 28 5f 5f 47 4e 55 43 5f 5f 29 20 7c 7c 20 64  d(__GNUC__) || d
9750: 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75 73 70 6c  efined(__cpluspl
9760: 75 73 29 0a 76 6f 69 64 20 66 72 65 65 5f 74 72  us).void free_tr
9770: 61 6d 70 6f 6c 69 6e 65 5f 72 20 28 5f 5f 54 52  ampoline_r (__TR
9780: 5f 66 75 6e 63 74 69 6f 6e 20 66 75 6e 63 74 69  _function functi
9790: 6f 6e 29 0a 23 65 6c 73 65 0a 76 6f 69 64 20 66  on).#else.void f
97a0: 72 65 65 5f 74 72 61 6d 70 6f 6c 69 6e 65 5f 72  ree_trampoline_r
97b0: 20 28 66 75 6e 63 74 69 6f 6e 29 0a 20 20 5f 5f   (function).  __
97c0: 54 52 5f 66 75 6e 63 74 69 6f 6e 20 66 75 6e 63  TR_function func
97d0: 74 69 6f 6e 3b 0a 23 65 6e 64 69 66 0a 7b 0a 23  tion;.#endif.{.#
97e0: 69 66 20 54 52 41 4d 50 5f 42 49 41 53 0a 20 20  if TRAMP_BIAS.  
97f0: 66 75 6e 63 74 69 6f 6e 20 3d 20 28 5f 5f 54 52  function = (__TR
9800: 5f 66 75 6e 63 74 69 6f 6e 29 28 28 63 68 61 72  _function)((char
9810: 2a 29 66 75 6e 63 74 69 6f 6e 20 2d 20 54 52 41  *)function - TRA
9820: 4d 50 5f 42 49 41 53 29 3b 0a 23 65 6e 64 69 66  MP_BIAS);.#endif
9830: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 43 4f  .#if !defined(CO
9840: 44 45 5f 45 58 45 43 55 54 41 42 4c 45 29 20 26  DE_EXECUTABLE) &
9850: 26 20 21 64 65 66 69 6e 65 64 28 45 58 45 43 55  & !defined(EXECU
9860: 54 41 42 4c 45 5f 56 49 41 5f 4d 50 52 4f 54 45  TABLE_VIA_MPROTE
9870: 43 54 29 0a 20 20 2a 28 63 68 61 72 2a 2a 29 66  CT).  *(char**)f
9880: 75 6e 63 74 69 6f 6e 20 3d 20 66 72 65 65 6c 69  unction = freeli
9890: 73 74 3b 20 66 72 65 65 6c 69 73 74 20 3d 20 28  st; freelist = (
98a0: 63 68 61 72 2a 29 66 75 6e 63 74 69 6f 6e 3b 0a  char*)function;.
98b0: 20 20 2f 2a 20 49 74 20 69 73 20 70 72 6f 62 61    /* It is proba
98c0: 62 6c 79 20 6e 6f 74 20 77 6f 72 74 68 20 63 61  bly not worth ca
98d0: 6c 6c 69 6e 67 20 6d 75 6e 6d 61 70 28 29 20 66  lling munmap() f
98e0: 6f 72 20 65 6e 74 69 72 65 6c 79 20 66 72 65 65  or entirely free
98f0: 64 20 70 61 67 65 73 2e 20 2a 2f 0a 23 65 6c 73  d pages. */.#els
9900: 65 0a 20 20 66 72 65 65 28 28 28 63 68 61 72 2a  e.  free(((char*
9910: 2a 29 66 75 6e 63 74 69 6f 6e 29 5b 2d 31 5d 29  *)function)[-1])
9920: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 20  ;.#endif.}..#if 
9930: 64 65 66 69 6e 65 64 28 5f 5f 53 54 44 43 5f 5f  defined(__STDC__
9940: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 47  ) || defined(__G
9950: 4e 55 43 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65  NUC__) || define
9960: 64 28 5f 5f 63 70 6c 75 73 70 6c 75 73 29 0a 69  d(__cplusplus).i
9970: 6e 74 20 69 73 5f 74 72 61 6d 70 6f 6c 69 6e 65  nt is_trampoline
9980: 5f 72 20 28 76 6f 69 64 2a 20 66 75 6e 63 74 69  _r (void* functi
9990: 6f 6e 29 0a 23 65 6c 73 65 0a 69 6e 74 20 69 73  on).#else.int is
99a0: 5f 74 72 61 6d 70 6f 6c 69 6e 65 5f 72 20 28 66  _trampoline_r (f
99b0: 75 6e 63 74 69 6f 6e 29 0a 20 20 76 6f 69 64 2a  unction).  void*
99c0: 20 66 75 6e 63 74 69 6f 6e 3b 0a 23 65 6e 64 69   function;.#endi
99d0: 66 0a 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  f.{.#if defined(
99e0: 69 73 5f 74 72 61 6d 70 29 20 26 26 20 64 65 66  is_tramp) && def
99f0: 69 6e 65 64 28 74 72 61 6d 70 5f 64 61 74 61 29  ined(tramp_data)
9a00: 0a 23 69 66 64 65 66 20 5f 5f 68 70 70 61 6e 65  .#ifdef __hppane
9a10: 77 5f 5f 0a 20 20 76 6f 69 64 2a 20 74 72 61 6d  w__.  void* tram
9a20: 70 5f 72 5f 61 64 64 72 65 73 73 20 3d 20 26 74  p_r_address = &t
9a30: 72 61 6d 70 5f 72 3b 0a 20 20 69 66 20 28 21 28  ramp_r;.  if (!(
9a40: 28 28 6c 6f 6e 67 29 66 75 6e 63 74 69 6f 6e 20  ((long)function 
9a50: 26 20 33 29 20 3d 3d 20 28 54 52 41 4d 50 5f 42  & 3) == (TRAMP_B
9a60: 49 41 53 20 26 20 33 29 29 29 20 72 65 74 75 72  IAS & 3))) retur
9a70: 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  n 0;.#endif.  re
9a80: 74 75 72 6e 0a 20 20 20 28 28 69 73 5f 74 72 61  turn.   ((is_tra
9a90: 6d 70 28 28 28 63 68 61 72 2a 29 66 75 6e 63 74  mp(((char*)funct
9aa0: 69 6f 6e 20 2d 20 54 52 41 4d 50 5f 42 49 41 53  ion - TRAMP_BIAS
9ab0: 29 29 29 0a 20 20 20 20 26 26 20 28 28 74 72 61  ))).    && ((tra
9ac0: 6d 70 5f 64 61 74 61 28 28 28 63 68 61 72 2a 29  mp_data(((char*)
9ad0: 66 75 6e 63 74 69 6f 6e 20 2d 20 54 52 41 4d 50  function - TRAMP
9ae0: 5f 42 49 41 53 29 29 29 20 3d 3d 20 28 6c 6f 6e  _BIAS))) == (lon
9af0: 67 29 28 28 63 68 61 72 2a 29 66 75 6e 63 74 69  g)((char*)functi
9b00: 6f 6e 20 2d 20 54 52 41 4d 50 5f 42 49 41 53 20  on - TRAMP_BIAS 
9b10: 2b 20 54 52 41 4d 50 5f 4c 45 4e 47 54 48 29 29  + TRAMP_LENGTH))
9b20: 0a 20 20 20 20 3f 20 31 20 3a 20 30 0a 20 20 20  .    ? 1 : 0.   
9b30: 29 3b 0a 23 65 6c 73 65 0a 20 20 61 62 6f 72 74  );.#else.  abort
9b40: 28 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69  ();.#endif.}..#i
9b50: 66 20 64 65 66 69 6e 65 64 28 5f 5f 53 54 44 43  f defined(__STDC
9b60: 5f 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  __) || defined(_
9b70: 5f 47 4e 55 43 5f 5f 29 20 7c 7c 20 64 65 66 69  _GNUC__) || defi
9b80: 6e 65 64 28 5f 5f 63 70 6c 75 73 70 6c 75 73 29  ned(__cplusplus)
9b90: 0a 5f 5f 54 52 5f 66 75 6e 63 74 69 6f 6e 20 74  .__TR_function t
9ba0: 72 61 6d 70 6f 6c 69 6e 65 5f 72 5f 61 64 64 72  rampoline_r_addr
9bb0: 65 73 73 20 28 76 6f 69 64 2a 20 66 75 6e 63 74  ess (void* funct
9bc0: 69 6f 6e 29 0a 23 65 6c 73 65 0a 5f 5f 54 52 5f  ion).#else.__TR_
9bd0: 66 75 6e 63 74 69 6f 6e 20 74 72 61 6d 70 6f 6c  function trampol
9be0: 69 6e 65 5f 72 5f 61 64 64 72 65 73 73 20 28 66  ine_r_address (f
9bf0: 75 6e 63 74 69 6f 6e 29 0a 20 20 76 6f 69 64 2a  unction).  void*
9c00: 20 66 75 6e 63 74 69 6f 6e 3b 0a 23 65 6e 64 69   function;.#endi
9c10: 66 0a 7b 0a 23 69 66 64 65 66 20 74 72 61 6d 70  f.{.#ifdef tramp
9c20: 5f 61 64 64 72 65 73 73 0a 20 20 72 65 74 75 72  _address.  retur
9c30: 6e 20 28 5f 5f 54 52 5f 66 75 6e 63 74 69 6f 6e  n (__TR_function
9c40: 29 28 74 72 61 6d 70 5f 61 64 64 72 65 73 73 28  )(tramp_address(
9c50: 28 28 63 68 61 72 2a 29 66 75 6e 63 74 69 6f 6e  ((char*)function
9c60: 20 2d 20 54 52 41 4d 50 5f 42 49 41 53 29 29 29   - TRAMP_BIAS)))
9c70: 3b 0a 23 65 6c 73 65 0a 20 20 61 62 6f 72 74 28  ;.#else.  abort(
9c80: 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66  );.#endif.}..#if
9c90: 20 64 65 66 69 6e 65 64 28 5f 5f 53 54 44 43 5f   defined(__STDC_
9ca0: 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f  _) || defined(__
9cb0: 47 4e 55 43 5f 5f 29 20 7c 7c 20 64 65 66 69 6e  GNUC__) || defin
9cc0: 65 64 28 5f 5f 63 70 6c 75 73 70 6c 75 73 29 0a  ed(__cplusplus).
9cd0: 76 6f 69 64 2a 20 74 72 61 6d 70 6f 6c 69 6e 65  void* trampoline
9ce0: 5f 72 5f 64 61 74 61 30 20 28 76 6f 69 64 2a 20  _r_data0 (void* 
9cf0: 66 75 6e 63 74 69 6f 6e 29 0a 23 65 6c 73 65 0a  function).#else.
9d00: 76 6f 69 64 2a 20 74 72 61 6d 70 6f 6c 69 6e 65  void* trampoline
9d10: 5f 72 5f 64 61 74 61 30 20 28 66 75 6e 63 74 69  _r_data0 (functi
9d20: 6f 6e 29 0a 20 20 76 6f 69 64 2a 20 66 75 6e 63  on).  void* func
9d30: 74 69 6f 6e 3b 0a 23 65 6e 64 69 66 0a 7b 0a 23  tion;.#endif.{.#
9d40: 69 66 64 65 66 20 74 72 61 6d 70 5f 64 61 74 61  ifdef tramp_data
9d50: 0a 20 20 72 65 74 75 72 6e 20 28 28 76 6f 69 64  .  return ((void
9d60: 2a 2a 29 28 28 63 68 61 72 2a 29 66 75 6e 63 74  **)((char*)funct
9d70: 69 6f 6e 2d 54 52 41 4d 50 5f 42 49 41 53 2b 54  ion-TRAMP_BIAS+T
9d80: 52 41 4d 50 5f 4c 45 4e 47 54 48 29 29 5b 30 5d  RAMP_LENGTH))[0]
9d90: 3b 0a 23 65 6c 73 65 0a 20 20 61 62 6f 72 74 28  ;.#else.  abort(
9da0: 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66  );.#endif.}..#if
9db0: 20 64 65 66 69 6e 65 64 28 5f 5f 53 54 44 43 5f   defined(__STDC_
9dc0: 5f 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f  _) || defined(__
9dd0: 47 4e 55 43 5f 5f 29 20 7c 7c 20 64 65 66 69 6e  GNUC__) || defin
9de0: 65 64 28 5f 5f 63 70 6c 75 73 70 6c 75 73 29 0a  ed(__cplusplus).
9df0: 76 6f 69 64 2a 20 74 72 61 6d 70 6f 6c 69 6e 65  void* trampoline
9e00: 5f 72 5f 64 61 74 61 31 20 28 76 6f 69 64 2a 20  _r_data1 (void* 
9e10: 66 75 6e 63 74 69 6f 6e 29 0a 23 65 6c 73 65 0a  function).#else.
9e20: 76 6f 69 64 2a 20 74 72 61 6d 70 6f 6c 69 6e 65  void* trampoline
9e30: 5f 72 5f 64 61 74 61 31 20 28 66 75 6e 63 74 69  _r_data1 (functi
9e40: 6f 6e 29 0a 20 20 76 6f 69 64 2a 20 66 75 6e 63  on).  void* func
9e50: 74 69 6f 6e 3b 0a 23 65 6e 64 69 66 0a 7b 0a 23  tion;.#endif.{.#
9e60: 69 66 64 65 66 20 74 72 61 6d 70 5f 64 61 74 61  ifdef tramp_data
9e70: 0a 20 20 72 65 74 75 72 6e 20 28 28 76 6f 69 64  .  return ((void
9e80: 2a 2a 29 28 28 63 68 61 72 2a 29 66 75 6e 63 74  **)((char*)funct
9e90: 69 6f 6e 2d 54 52 41 4d 50 5f 42 49 41 53 2b 54  ion-TRAMP_BIAS+T
9ea0: 52 41 4d 50 5f 4c 45 4e 47 54 48 29 29 5b 31 5d  RAMP_LENGTH))[1]
9eb0: 3b 0a 23 65 6c 73 65 0a 20 20 61 62 6f 72 74 28  ;.#else.  abort(
9ec0: 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a              );.#endif.}.