From d18d1573d8f37de44cfeef580d244d17561c73d7 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Tue, 29 Dec 2009 02:04:20 +0100 Subject: [PATCH] Save all callee-saved x64 integer regs for unwinding. Temporary measure. Does not cover xmm saves on WIN64. May have to use unwind info or waste another 160 bytes per CFRAME. --- src/buildvm_x86.dasc | 30 +++++++++++++++++++----------- src/lj_arch.h | 2 +- src/lj_frame.h | 20 ++++++++++---------- 3 files changed, 30 insertions(+), 22 deletions(-) diff --git a/src/buildvm_x86.dasc b/src/buildvm_x86.dasc index d2bb80df..3b89debb 100644 --- a/src/buildvm_x86.dasc +++ b/src/buildvm_x86.dasc @@ -165,22 +165,28 @@ |.define CFRAME_SPACE, aword*5 // Delta for rsp (see <--). |.macro saveregs | push rbp; push rdi; push rsi; push rbx +| push r15; push r14; push r13; push r12 | sub rsp, CFRAME_SPACE |.endmacro |.macro restoreregs | add rsp, CFRAME_SPACE +| pop r12; pop r13; pop r14; pop r15 | pop rbx; pop rsi; pop rdi; pop rbp |.endmacro | -|.define SAVE_CFRAME, aword [rsp+aword*13] -|.define SAVE_PC, dword [rsp+dword*25] -|.define SAVE_L, dword [rsp+dword*24] -|.define SAVE_ERRF, dword [rsp+dword*23] -|.define SAVE_NRES, dword [rsp+dword*22] -|.define TMP2, dword [rsp+dword*21] -|.define TMP1, dword [rsp+dword*20] +|.define SAVE_CFRAME, aword [rsp+aword*17] +|.define SAVE_PC, dword [rsp+dword*33] +|.define SAVE_L, dword [rsp+dword*32] +|.define SAVE_ERRF, dword [rsp+dword*31] +|.define SAVE_NRES, dword [rsp+dword*30] +|.define TMP2, dword [rsp+dword*29] +|.define TMP1, dword [rsp+dword*28] |//----- 16 byte aligned, ^^^ 32 byte register save area, owned by interpreter -|.define SAVE_RET, aword [rsp+aword*9] //<-- rsp entering interpreter. +|.define SAVE_RET, aword [rsp+aword*13] //<-- rsp entering interpreter. +|.define SAVE_R8, aword [rsp+aword*12] +|.define SAVE_R7, aword [rsp+aword*11] +|.define SAVE_R6, aword [rsp+aword*10] +|.define SAVE_R5, aword [rsp+aword*9] |.define SAVE_R4, aword [rsp+aword*8] |.define SAVE_R3, aword [rsp+aword*7] |.define SAVE_R2, aword [rsp+aword*6] @@ -204,16 +210,18 @@ | |.define CFRAME_SPACE, aword*5 // Delta for rsp (see <--). |.macro saveregs -| push rbp; push r14; push r15; push rbx +| push rbp; push rbx; push r15; push r14; push r13; push r12 | sub rsp, CFRAME_SPACE |.endmacro |.macro restoreregs | add rsp, CFRAME_SPACE -| pop rbx; pop r15; pop r14; pop rbp +| pop r12; pop r13; pop r14; pop r15; pop rbx; pop rbp |.endmacro | |//----- 16 byte aligned, -|.define SAVE_RET, aword [rsp+aword*9] //<-- rsp entering interpreter. +|.define SAVE_RET, aword [rsp+aword*11] //<-- rsp entering interpreter. +|.define SAVE_R6, aword [rsp+aword*10] +|.define SAVE_R5, aword [rsp+aword*9] |.define SAVE_R4, aword [rsp+aword*8] |.define SAVE_R3, aword [rsp+aword*7] |.define SAVE_R2, aword [rsp+aword*6] diff --git a/src/lj_arch.h b/src/lj_arch.h index abdb5af9..0b69e574 100644 --- a/src/lj_arch.h +++ b/src/lj_arch.h @@ -48,7 +48,7 @@ #define LJ_TARGET_X64 1 #define LJ_TARGET_X86ORX64 1 #define LJ_PAGESIZE 4096 -#error "No support for x64 architecture (yet)" +#define LJ_ARCH_NOJIT 1 /* NYI */ #else #error "No target architecture defined" #endif diff --git a/src/lj_frame.h b/src/lj_frame.h index 14d640cd..398ec4e5 100644 --- a/src/lj_frame.h +++ b/src/lj_frame.h @@ -66,19 +66,19 @@ enum { #define CFRAME_SIZE (12*4) #elif LJ_TARGET_X64 #if _WIN64 -#define CFRAME_OFS_ERRF (23*4) -#define CFRAME_OFS_NRES (22*4) -#define CFRAME_OFS_PREV (13*8) -#define CFRAME_OFS_L (24*4) -#define CFRAME_OFS_PC (25*4) -#define CFRAME_SIZE (10*8) +#define CFRAME_OFS_PREV (17*8) +#define CFRAME_OFS_PC (33*4) +#define CFRAME_OFS_L (32*4) +#define CFRAME_OFS_ERRF (31*4) +#define CFRAME_OFS_NRES (30*4) +#define CFRAME_SIZE (14*8) #else +#define CFRAME_OFS_PREV (4*8) +#define CFRAME_OFS_PC (5*4) +#define CFRAME_OFS_L (4*4) #define CFRAME_OFS_ERRF (3*4) #define CFRAME_OFS_NRES (2*4) -#define CFRAME_OFS_PREV (4*8) -#define CFRAME_OFS_L (4*4) -#define CFRAME_OFS_PC (5*4) -#define CFRAME_SIZE (10*8) +#define CFRAME_SIZE (12*8) #endif #else #error "Missing CFRAME_* definitions for this architecture"