#! /bin/sh /usr/share/dpatch/dpatch-run ## 99_amd64.dpatch by Aaron M. Ucko ## ## All lines beginning with `## DP:' are a description of the patch. ## DP: patch for the amd64 architecture @DPATCH@ diff -urNad rscheme-0.7.3.4.b3~/handc/config.h.in rscheme-0.7.3.4.b3/handc/config.h.in --- rscheme-0.7.3.4.b3~/handc/config.h.in 2006-04-22 13:20:45.064073859 -0400 +++ rscheme-0.7.3.4.b3/handc/config.h.in 2006-04-22 13:27:07.442262027 -0400 @@ -14,6 +14,7 @@ #define PLATFORM_ARCH_PPC 0 #define PLATFORM_ARCH_I386 0 +#define PLATFORM_ARCH_AMD64 0 #define PLATFORM_ARCH_MIPS 0 #define PLATFORM_ARCH_SPARC 0 #define PLATFORM_ARCH_M68K 0 @@ -154,7 +155,7 @@ typedef unsigned int XUINT_32; /* 32 bits even on alpha */ -#if PLATFORM_ARCH_ALPHA +#if PLATFORM_ARCH_ALPHA || PLATFORM_ARCH_AMD64 #define WORD_SIZE_BITS (64) #else #define WORD_SIZE_BITS (32) diff -urNad rscheme-0.7.3.4.b3~/handc/configure rscheme-0.7.3.4.b3/handc/configure --- rscheme-0.7.3.4.b3~/handc/configure 2006-04-22 13:00:49.000000000 -0400 +++ rscheme-0.7.3.4.b3/handc/configure 2006-04-22 13:20:45.399017040 -0400 @@ -3286,6 +3286,10 @@ #define PLATFORM_ARCH_I386 1 _ACEOF ;; + x86_64-*-*) ARCH=amd64 ; cat >>confdefs.h <<\_ACEOF +#define PLATFORM_ARCH_AMD64 1 +_ACEOF + ;; mips-*-*) ARCH=mips ; cat >>confdefs.h <<\_ACEOF #define PLATFORM_ARCH_MIPS 1 _ACEOF diff -urNad rscheme-0.7.3.4.b3~/handc/configure.in rscheme-0.7.3.4.b3/handc/configure.in --- rscheme-0.7.3.4.b3~/handc/configure.in 2006-04-22 13:00:49.000000000 -0400 +++ rscheme-0.7.3.4.b3/handc/configure.in 2006-04-22 13:20:45.399017040 -0400 @@ -70,6 +70,7 @@ powerpc-*-*) ARCH=powerpc ; AC_DEFINE(PLATFORM_ARCH_PPC,1) ;; rs6000-*-*) ARCH=powerpc ; AC_DEFINE(PLATFORM_ARCH_PPC,1) ;; i?86-*-*) ARCH=i386 ; AC_DEFINE(PLATFORM_ARCH_I386,1) ;; + x86_64-*-*) ARCH=amd64 ; AC_DEFINE(PLATFORM_ARCH_AMD64,1) ;; mips-*-*) ARCH=mips ; AC_DEFINE(PLATFORM_ARCH_MIPS,1) ;; sparc-*-*) ARCH=sparc ; AC_DEFINE(PLATFORM_ARCH_SPARC,1) ;; alpha*-*-*) ARCH=alpha ; AC_DEFINE(PLATFORM_ARCH_ALPHA,1) ;; diff -urNad rscheme-0.7.3.4.b3~/handc/platform/com/osglue.c rscheme-0.7.3.4.b3/handc/platform/com/osglue.c --- rscheme-0.7.3.4.b3~/handc/platform/com/osglue.c 2006-04-22 13:00:49.000000000 -0400 +++ rscheme-0.7.3.4.b3/handc/platform/com/osglue.c 2006-04-22 13:20:45.400016871 -0400 @@ -410,12 +410,14 @@ #define PLATFORM_ARCH_STRING "powerpc" #elif PLATFORM_ARCH_I386 #define PLATFORM_ARCH_STRING "i386" +#elif PLATFORM_ARCH_AMD64 +#define PLATFORM_ARCH_STRING "amd64" #elif PLATFORM_ARCH_MIPS #define PLATFORM_ARCH_STRING "mips" #elif PLATFORM_ARCH_SPARC #define PLATFORM_ARCH_STRING "sparc" #elif PLATFORM_ARCH_M68K -#define PLATFORM_ARCH_STRING "sparc" +#define PLATFORM_ARCH_STRING "m68k" #elif PLATFORM_ARCH_ALPHA #define PLATFORM_ARCH_STRING "alpha" #elif PLATFORM_ARCH_S390 diff -urNad rscheme-0.7.3.4.b3~/packages/fasl/ldcode.c rscheme-0.7.3.4.b3/packages/fasl/ldcode.c --- rscheme-0.7.3.4.b3~/packages/fasl/ldcode.c 2004-07-02 16:34:08.000000000 -0400 +++ rscheme-0.7.3.4.b3/packages/fasl/ldcode.c 2006-04-22 13:55:38.390916800 -0400 @@ -59,7 +59,43 @@ *d++ = (addr >> 16) & 0xFF; *d++ = (addr >> 24) & 0xFF; } -#endif /* LINUX */ +#endif /* ARCH I386 */ + +#if PLATFORM_ARCH_AMD64 + +void init_stub_procs( struct FASL_Header *hdr, jump_addr stub ) +{ + static unsigned long stub_ptr; + UINT_8 *d = (UINT_8 *)hdr->stub_proc; + unsigned long addr; + + stub_ptr = (unsigned long)stub; + addr = (unsigned long)&stub_ptr; + + if (addr <= 0xffffffffUL) { + *d++ = 0xff; /* jmp absolute indirect (4-byte[!] addr of fn ptr) */ + *d++ = 0x24; + *d++ = 0x25; + *d++ = addr & 0xFF; + *d++ = (addr >> 8) & 0xFF; + *d++ = (addr >> 16) & 0xFF; + *d++ = (addr >> 24) & 0xFF; + } else { /* mov addr, %rax; jmpq *(%rax) */ + *d++ = 0x48; + *d++ = 0xb8; + *d++ = addr & 0xFF; + *d++ = (addr >> 8) & 0xFF; + *d++ = (addr >> 16) & 0xFF; + *d++ = (addr >> 24) & 0xFF; + *d++ = (addr >> 32) & 0xFF; + *d++ = (addr >> 40) & 0xFF; + *d++ = (addr >> 48) & 0xFF; + *d++ = (addr >> 56) & 0xFF; + *d++ = 0xff; + *d++ = 0x20; + } +} +#endif /* ARCH AMD64 */ #if PLATFORM_ARCH_SPARC diff -urNad rscheme-0.7.3.4.b3~/packages/rstore/mmglue.lnx rscheme-0.7.3.4.b3/packages/rstore/mmglue.lnx --- rscheme-0.7.3.4.b3~/packages/rstore/mmglue.lnx 2006-04-22 13:00:49.000000000 -0400 +++ rscheme-0.7.3.4.b3/packages/rstore/mmglue.lnx 2006-04-22 13:20:45.400016871 -0400 @@ -50,7 +50,7 @@ mmc_access_failed( (void *)info->si_addr ); } #else -static void handler( int sig, struct sigcontext_struct SCP ) +static void handler( int sig, struct sigcontext SCP ) { void *at; @@ -63,7 +63,7 @@ elf_greg_t *rr = (void *)SCP.regs; at = (void *)rr[PT_DAR]; #else -#if PLATFORM_ARCH_I386 +#if PLATFORM_ARCH_I386 || PLATFORM_ARCH_AMD64 at = (void *)SCP.cr2; #else #if PLATFORM_ARCH_ALPHA @@ -103,7 +103,7 @@ at = PLEASE_EXTRACT_FAULT_ADDRESS( SCP ); #endif /* M68K */ #endif /* ALPHA */ -#endif /* I386 */ +#endif /* I386 | AMD64 */ #endif /* PPC */ mmc_access_failed( at ); } diff -urNad rscheme-0.7.3.4.b3~/stage0/config.h.in rscheme-0.7.3.4.b3/stage0/config.h.in --- rscheme-0.7.3.4.b3~/stage0/config.h.in 2006-04-22 13:20:45.064073859 -0400 +++ rscheme-0.7.3.4.b3/stage0/config.h.in 2006-04-22 13:27:55.639100097 -0400 @@ -14,6 +14,7 @@ #define PLATFORM_ARCH_PPC 0 #define PLATFORM_ARCH_I386 0 +#define PLATFORM_ARCH_AMD64 0 #define PLATFORM_ARCH_MIPS 0 #define PLATFORM_ARCH_SPARC 0 #define PLATFORM_ARCH_M68K 0 @@ -154,7 +155,7 @@ typedef unsigned int XUINT_32; /* 32 bits even on alpha */ -#if PLATFORM_ARCH_ALPHA +#if PLATFORM_ARCH_ALPHA || PLATFORM_ARCH_AMD64 #define WORD_SIZE_BITS (64) #else #define WORD_SIZE_BITS (32) diff -urNad rscheme-0.7.3.4.b3~/stage0/configure rscheme-0.7.3.4.b3/stage0/configure --- rscheme-0.7.3.4.b3~/stage0/configure 2006-04-22 13:00:49.000000000 -0400 +++ rscheme-0.7.3.4.b3/stage0/configure 2006-04-22 13:20:45.403016362 -0400 @@ -3286,6 +3286,10 @@ #define PLATFORM_ARCH_I386 1 _ACEOF ;; + x86_64-*-*) ARCH=amd64 ; cat >>confdefs.h <<\_ACEOF +#define PLATFORM_ARCH_AMD64 1 +_ACEOF + ;; mips-*-*) ARCH=mips ; cat >>confdefs.h <<\_ACEOF #define PLATFORM_ARCH_MIPS 1 _ACEOF diff -urNad rscheme-0.7.3.4.b3~/stage0/configure.in rscheme-0.7.3.4.b3/stage0/configure.in --- rscheme-0.7.3.4.b3~/stage0/configure.in 2006-04-22 13:00:49.000000000 -0400 +++ rscheme-0.7.3.4.b3/stage0/configure.in 2006-04-22 13:20:45.403016362 -0400 @@ -70,6 +70,7 @@ powerpc-*-*) ARCH=powerpc ; AC_DEFINE(PLATFORM_ARCH_PPC,1) ;; rs6000-*-*) ARCH=powerpc ; AC_DEFINE(PLATFORM_ARCH_PPC,1) ;; i?86-*-*) ARCH=i386 ; AC_DEFINE(PLATFORM_ARCH_I386,1) ;; + x86_64-*-*) ARCH=amd64 ; AC_DEFINE(PLATFORM_ARCH_AMD64,1) ;; mips-*-*) ARCH=mips ; AC_DEFINE(PLATFORM_ARCH_MIPS,1) ;; sparc-*-*) ARCH=sparc ; AC_DEFINE(PLATFORM_ARCH_SPARC,1) ;; alpha*-*-*) ARCH=alpha ; AC_DEFINE(PLATFORM_ARCH_ALPHA,1) ;; diff -urNad rscheme-0.7.3.4.b3~/stage0/platform/com/osglue.c rscheme-0.7.3.4.b3/stage0/platform/com/osglue.c --- rscheme-0.7.3.4.b3~/stage0/platform/com/osglue.c 2006-04-22 13:00:49.000000000 -0400 +++ rscheme-0.7.3.4.b3/stage0/platform/com/osglue.c 2006-04-22 13:20:45.404016192 -0400 @@ -410,12 +410,14 @@ #define PLATFORM_ARCH_STRING "powerpc" #elif PLATFORM_ARCH_I386 #define PLATFORM_ARCH_STRING "i386" +#elif PLATFORM_ARCH_AMD64 +#define PLATFORM_ARCH_STRING "amd64" #elif PLATFORM_ARCH_MIPS #define PLATFORM_ARCH_STRING "mips" #elif PLATFORM_ARCH_SPARC #define PLATFORM_ARCH_STRING "sparc" #elif PLATFORM_ARCH_M68K -#define PLATFORM_ARCH_STRING "sparc" +#define PLATFORM_ARCH_STRING "m68k" #elif PLATFORM_ARCH_ALPHA #define PLATFORM_ARCH_STRING "alpha" #elif PLATFORM_ARCH_S390