Artifact cd8b257f7c39fb461a97cb3a9a18c157bb77d430:


0000: 2f 2a 20 54 72 61 6d 70 6f 6c 69 6e 65 20 74 65  /* Trampoline te
0010: 73 74 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 43 6f 70  st */../*. * Cop
0020: 79 72 69 67 68 74 20 31 39 39 35 2d 31 39 39 39  yright 1995-1999
0030: 2c 20 32 30 30 31 2d 32 30 30 32 2c 20 32 30 30  , 2001-2002, 200
0040: 34 2d 32 30 30 36 20 42 72 75 6e 6f 20 48 61 69  4-2006 Bruno Hai
0050: 62 6c 65 2c 20 3c 62 72 75 6e 6f 40 63 6c 69 73  ble, <bruno@clis
0060: 70 2e 6f 72 67 3e 0a 20 2a 0a 20 2a 20 54 68 69  p.org>. *. * Thi
0070: 73 20 69 73 20 66 72 65 65 20 73 6f 66 74 77 61  s is free softwa
0080: 72 65 20 64 69 73 74 72 69 62 75 74 65 64 20 75  re distributed u
0090: 6e 64 65 72 20 74 68 65 20 47 4e 55 20 47 65 6e  nder the GNU Gen
00a0: 65 72 61 6c 20 50 75 62 6c 69 63 20 4c 69 63 65  eral Public Lice
00b0: 6e 63 65 0a 20 2a 20 64 65 73 63 72 69 62 65 64  nce. * described
00c0: 20 69 6e 20 74 68 65 20 66 69 6c 65 20 43 4f 50   in the file COP
00d0: 59 49 4e 47 2e 20 43 6f 6e 74 61 63 74 20 74 68  YING. Contact th
00e0: 65 20 61 75 74 68 6f 72 20 69 66 20 79 6f 75 20  e author if you 
00f0: 64 6f 6e 27 74 20 68 61 76 65 20 74 68 69 73 0a  don't have this.
0100: 20 2a 20 6f 72 20 63 61 6e 27 74 20 6c 69 76 65   * or can't live
0110: 20 77 69 74 68 20 69 74 2e 20 54 68 65 72 65 20   with it. There 
0120: 69 73 20 41 42 53 4f 4c 55 54 45 4c 59 20 4e 4f  is ABSOLUTELY NO
0130: 20 57 41 52 52 41 4e 54 59 2c 20 65 78 70 6c 69   WARRANTY, expli
0140: 63 69 74 20 6f 72 20 69 6d 70 6c 69 65 64 2c 0a  cit or implied,.
0150: 20 2a 20 6f 6e 20 74 68 69 73 20 73 6f 66 74 77   * on this softw
0160: 61 72 65 2e 0a 20 2a 2f 0a 0a 23 69 6e 63 6c 75  are.. */..#inclu
0170: 64 65 20 22 63 6f 6e 66 69 67 2e 68 22 20 20 2f  de "config.h"  /
0180: 2a 20 44 65 66 69 6e 65 20 5f 5f 24 7b 68 6f 73  * Define __${hos
0190: 74 5f 63 70 75 7d 5f 5f 20 2a 2f 0a 0a 23 69 6e  t_cpu}__ */..#in
01a0: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a  clude <stdio.h>.
01b0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62  #include <stdlib
01c0: 2e 68 3e 0a 0a 23 69 6e 63 6c 75 64 65 20 22 74  .h>..#include "t
01d0: 72 61 6d 70 6f 6c 69 6e 65 5f 72 2e 68 22 0a 0a  rampoline_r.h"..
01e0: 23 64 65 66 69 6e 65 20 4d 41 47 49 43 31 20 20  #define MAGIC1  
01f0: 30 78 39 64 62 39 61 66 34 32 0a 23 64 65 66 69  0x9db9af42.#defi
0200: 6e 65 20 4d 41 47 49 43 32 20 20 30 78 36 31 34  ne MAGIC2  0x614
0210: 61 31 33 63 39 0a 23 64 65 66 69 6e 65 20 4d 41  a13c9.#define MA
0220: 47 49 43 33 20 20 30 78 37 61 66 66 33 63 62 34  GIC3  0x7aff3cb4
0230: 0a 23 64 65 66 69 6e 65 20 4d 41 47 49 43 34 20  .#define MAGIC4 
0240: 20 30 78 61 32 66 39 64 30 34 35 0a 0a 23 69 66   0xa2f9d045..#if
0250: 64 65 66 20 5f 5f 63 70 6c 75 73 70 6c 75 73 0a  def __cplusplus.
0260: 74 79 70 65 64 65 66 20 69 6e 74 20 28 2a 66 75  typedef int (*fu
0270: 6e 63 74 69 6f 6e 29 28 2e 2e 2e 29 3b 0a 23 65  nction)(...);.#e
0280: 6c 73 65 0a 74 79 70 65 64 65 66 20 69 6e 74 20  lse.typedef int 
0290: 28 2a 66 75 6e 63 74 69 6f 6e 29 28 29 3b 0a 23  (*function)();.#
02a0: 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
02b0: 65 64 28 5f 5f 69 33 38 36 5f 5f 29 0a 69 6e 74  ed(__i386__).int
02c0: 20 66 20 28 76 6f 69 64 2a 20 65 6e 76 2c 20 69   f (void* env, i
02d0: 6e 74 20 78 29 0a 23 65 6c 73 65 0a 69 6e 74 20  nt x).#else.int 
02e0: 66 20 28 69 6e 74 20 78 29 0a 23 65 6e 64 69 66  f (int x).#endif
02f0: 0a 7b 0a 23 69 66 64 65 66 20 5f 5f 47 4e 55 43  .{.#ifdef __GNUC
0300: 5f 5f 0a 23 69 66 64 65 66 20 5f 5f 6d 36 38 6b  __.#ifdef __m68k
0310: 5f 5f 0a 23 69 66 64 65 66 20 5f 5f 4e 65 74 42  __.#ifdef __NetB
0320: 53 44 5f 5f 0a 72 65 67 69 73 74 65 72 20 76 6f  SD__.register vo
0330: 69 64 2a 20 65 6e 76 20 5f 5f 61 73 6d 5f 5f 28  id* env __asm__(
0340: 22 61 31 22 29 3b 0a 23 65 6c 73 65 0a 72 65 67  "a1");.#else.reg
0350: 69 73 74 65 72 20 76 6f 69 64 2a 20 65 6e 76 20  ister void* env 
0360: 5f 5f 61 73 6d 5f 5f 28 22 61 30 22 29 3b 0a 23  __asm__("a0");.#
0370: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66  endif.#endif.#if
0380: 64 65 66 20 5f 5f 6d 69 70 73 5f 5f 0a 72 65 67  def __mips__.reg
0390: 69 73 74 65 72 20 76 6f 69 64 2a 20 65 6e 76 20  ister void* env 
03a0: 5f 5f 61 73 6d 5f 5f 28 22 24 32 22 29 3b 0a 23  __asm__("$2");.#
03b0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d  endif.#ifdef __m
03c0: 69 70 73 36 34 5f 5f 0a 72 65 67 69 73 74 65 72  ips64__.register
03d0: 20 76 6f 69 64 2a 20 65 6e 76 20 5f 5f 61 73 6d   void* env __asm
03e0: 5f 5f 28 22 24 32 22 29 3b 0a 23 65 6e 64 69 66  __("$2");.#endif
03f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 73  .#if defined(__s
0400: 70 61 72 63 5f 5f 29 20 26 26 20 21 64 65 66 69  parc__) && !defi
0410: 6e 65 64 28 5f 5f 73 70 61 72 63 36 34 5f 5f 29  ned(__sparc64__)
0420: 0a 72 65 67 69 73 74 65 72 20 76 6f 69 64 2a 20  .register void* 
0430: 65 6e 76 20 5f 5f 61 73 6d 5f 5f 28 22 25 67 32  env __asm__("%g2
0440: 22 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  ");.#endif.#ifde
0450: 66 20 5f 5f 73 70 61 72 63 36 34 5f 5f 0a 72 65  f __sparc64__.re
0460: 67 69 73 74 65 72 20 76 6f 69 64 2a 20 65 6e 76  gister void* env
0470: 20 5f 5f 61 73 6d 5f 5f 28 22 25 67 35 22 29 3b   __asm__("%g5");
0480: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f  .#endif.#ifdef _
0490: 5f 61 6c 70 68 61 5f 5f 0a 72 65 67 69 73 74 65  _alpha__.registe
04a0: 72 20 76 6f 69 64 2a 20 65 6e 76 20 5f 5f 61 73  r void* env __as
04b0: 6d 5f 5f 28 22 24 31 22 29 3b 0a 23 65 6e 64 69  m__("$1");.#endi
04c0: 66 0a 23 69 66 64 65 66 20 5f 5f 68 70 70 61 5f  f.#ifdef __hppa_
04d0: 5f 0a 72 65 67 69 73 74 65 72 20 76 6f 69 64 2a  _.register void*
04e0: 20 65 6e 76 20 5f 5f 61 73 6d 5f 5f 28 22 25 72   env __asm__("%r
04f0: 32 39 22 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  29");.#endif.#if
0500: 64 65 66 20 5f 5f 61 72 6d 5f 5f 0a 72 65 67 69  def __arm__.regi
0510: 73 74 65 72 20 76 6f 69 64 2a 20 65 6e 76 20 5f  ster void* env _
0520: 5f 61 73 6d 5f 5f 28 22 72 31 32 22 29 3b 0a 23  _asm__("r12");.#
0530: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 70  endif.#ifdef __p
0540: 6f 77 65 72 70 63 5f 5f 0a 23 69 66 64 65 66 20  owerpc__.#ifdef 
0550: 5f 5f 4e 65 74 42 53 44 5f 5f 0a 72 65 67 69 73  __NetBSD__.regis
0560: 74 65 72 20 76 6f 69 64 2a 20 65 6e 76 20 5f 5f  ter void* env __
0570: 61 73 6d 5f 5f 28 22 72 31 33 22 29 3b 0a 23 65  asm__("r13");.#e
0580: 6c 73 65 0a 72 65 67 69 73 74 65 72 20 76 6f 69  lse.register voi
0590: 64 2a 20 65 6e 76 20 5f 5f 61 73 6d 5f 5f 28 22  d* env __asm__("
05a0: 72 31 31 22 29 3b 0a 23 65 6e 64 69 66 0a 23 65  r11");.#endif.#e
05b0: 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 6d 38  ndif.#ifdef __m8
05c0: 38 6b 5f 5f 0a 72 65 67 69 73 74 65 72 20 76 6f  8k__.register vo
05d0: 69 64 2a 20 65 6e 76 20 5f 5f 61 73 6d 5f 5f 28  id* env __asm__(
05e0: 22 72 31 31 22 29 3b 0a 23 65 6e 64 69 66 0a 23  "r11");.#endif.#
05f0: 69 66 64 65 66 20 5f 5f 63 6f 6e 76 65 78 5f 5f  ifdef __convex__
0600: 0a 72 65 67 69 73 74 65 72 20 76 6f 69 64 2a 20  .register void* 
0610: 65 6e 76 20 5f 5f 61 73 6d 5f 5f 28 22 73 30 22  env __asm__("s0"
0620: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  );.#endif.#ifdef
0630: 20 5f 5f 69 61 36 34 5f 5f 0a 72 65 67 69 73 74   __ia64__.regist
0640: 65 72 20 76 6f 69 64 2a 20 65 6e 76 20 5f 5f 61  er void* env __a
0650: 73 6d 5f 5f 28 22 72 31 35 22 29 3b 0a 23 65 6e  sm__("r15");.#en
0660: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 78 38 36  dif.#ifdef __x86
0670: 5f 36 34 5f 5f 0a 72 65 67 69 73 74 65 72 20 76  _64__.register v
0680: 6f 69 64 2a 20 65 6e 76 20 5f 5f 61 73 6d 5f 5f  oid* env __asm__
0690: 28 22 72 31 30 22 29 3b 0a 23 65 6e 64 69 66 0a  ("r10");.#endif.
06a0: 23 69 66 64 65 66 20 5f 5f 73 33 39 30 5f 5f 0a  #ifdef __s390__.
06b0: 72 65 67 69 73 74 65 72 20 76 6f 69 64 2a 20 65  register void* e
06c0: 6e 76 20 5f 5f 61 73 6d 5f 5f 28 22 72 30 22 29  nv __asm__("r0")
06d0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  ;.#endif..  retu
06e0: 72 6e 20 78 20 2b 20 28 69 6e 74 29 28 28 6c 6f  rn x + (int)((lo
06f0: 6e 67 2a 29 65 6e 76 29 5b 30 5d 20 2b 20 28 69  ng*)env)[0] + (i
0700: 6e 74 29 28 28 6c 6f 6e 67 2a 29 65 6e 76 29 5b  nt)((long*)env)[
0710: 31 5d 20 2b 20 4d 41 47 49 43 33 3b 0a 23 65 6c  1] + MAGIC3;.#el
0720: 73 65 0a 20 20 72 65 74 75 72 6e 20 78 20 2b 20  se.  return x + 
0730: 4d 41 47 49 43 33 3b 0a 23 65 6e 64 69 66 0a 7d  MAGIC3;.#endif.}
0740: 0a 0a 69 6e 74 20 6d 61 69 6e 20 28 29 0a 7b 0a  ..int main ().{.
0750: 20 20 66 75 6e 63 74 69 6f 6e 20 63 66 20 3d 20    function cf = 
0760: 61 6c 6c 6f 63 5f 74 72 61 6d 70 6f 6c 69 6e 65  alloc_trampoline
0770: 5f 72 28 28 66 75 6e 63 74 69 6f 6e 29 26 66 2c  _r((function)&f,
0780: 20 28 76 6f 69 64 2a 29 4d 41 47 49 43 31 2c 20   (void*)MAGIC1, 
0790: 28 76 6f 69 64 2a 29 4d 41 47 49 43 32 29 3b 0a  (void*)MAGIC2);.
07a0: 23 69 66 64 65 66 20 5f 5f 47 4e 55 43 5f 5f 0a  #ifdef __GNUC__.
07b0: 20 20 69 66 20 28 28 2a 63 66 29 28 4d 41 47 49    if ((*cf)(MAGI
07c0: 43 34 29 20 3d 3d 20 4d 41 47 49 43 31 2b 4d 41  C4) == MAGIC1+MA
07d0: 47 49 43 32 2b 4d 41 47 49 43 33 2b 4d 41 47 49  GIC2+MAGIC3+MAGI
07e0: 43 34 29 0a 23 65 6c 73 65 0a 20 20 69 66 20 28  C4).#else.  if (
07f0: 28 2a 63 66 29 28 4d 41 47 49 43 34 29 20 3d 3d  (*cf)(MAGIC4) ==
0800: 20 4d 41 47 49 43 33 2b 4d 41 47 49 43 34 29 0a   MAGIC3+MAGIC4).
0810: 23 65 6e 64 69 66 0a 20 20 20 20 7b 20 66 72 65  #endif.    { fre
0820: 65 5f 74 72 61 6d 70 6f 6c 69 6e 65 5f 72 28 63  e_trampoline_r(c
0830: 66 29 3b 20 70 72 69 6e 74 66 28 22 57 6f 72 6b  f); printf("Work
0840: 73 2c 20 74 65 73 74 31 20 70 61 73 73 65 64 2e  s, test1 passed.
0850: 5c 6e 22 29 3b 20 65 78 69 74 28 30 29 3b 20 7d  \n"); exit(0); }
0860: 0a 20 20 65 6c 73 65 0a 20 20 20 20 7b 20 70 72  .  else.    { pr
0870: 69 6e 74 66 28 22 44 6f 65 73 6e 27 74 20 77 6f  intf("Doesn't wo
0880: 72 6b 21 5c 6e 22 29 3b 20 65 78 69 74 28 31 29  rk!\n"); exit(1)
0890: 3b 20 7d 0a 7d 0a                                ; }.}.