diff options
| author | Mike Pall <mike> | 2009-12-29 02:04:20 +0100 |
|---|---|---|
| committer | Mike Pall <mike> | 2009-12-29 02:04:20 +0100 |
| commit | d18d1573d8f37de44cfeef580d244d17561c73d7 (patch) | |
| tree | b7b6de9ba326494b6ca8d82ce7024e54af6bef8c | |
| parent | 374f53471528e1592d9075c47e579d2f3c546beb (diff) | |
| download | luajit-d18d1573d8f37de44cfeef580d244d17561c73d7.tar.gz luajit-d18d1573d8f37de44cfeef580d244d17561c73d7.tar.bz2 luajit-d18d1573d8f37de44cfeef580d244d17561c73d7.zip | |
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.
| -rw-r--r-- | src/buildvm_x86.dasc | 30 | ||||
| -rw-r--r-- | src/lj_arch.h | 2 | ||||
| -rw-r--r-- | 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 @@ | |||
| 165 | |.define CFRAME_SPACE, aword*5 // Delta for rsp (see <--). | 165 | |.define CFRAME_SPACE, aword*5 // Delta for rsp (see <--). |
| 166 | |.macro saveregs | 166 | |.macro saveregs |
| 167 | | push rbp; push rdi; push rsi; push rbx | 167 | | push rbp; push rdi; push rsi; push rbx |
| 168 | | push r15; push r14; push r13; push r12 | ||
| 168 | | sub rsp, CFRAME_SPACE | 169 | | sub rsp, CFRAME_SPACE |
| 169 | |.endmacro | 170 | |.endmacro |
| 170 | |.macro restoreregs | 171 | |.macro restoreregs |
| 171 | | add rsp, CFRAME_SPACE | 172 | | add rsp, CFRAME_SPACE |
| 173 | | pop r12; pop r13; pop r14; pop r15 | ||
| 172 | | pop rbx; pop rsi; pop rdi; pop rbp | 174 | | pop rbx; pop rsi; pop rdi; pop rbp |
| 173 | |.endmacro | 175 | |.endmacro |
| 174 | | | 176 | | |
| 175 | |.define SAVE_CFRAME, aword [rsp+aword*13] | 177 | |.define SAVE_CFRAME, aword [rsp+aword*17] |
| 176 | |.define SAVE_PC, dword [rsp+dword*25] | 178 | |.define SAVE_PC, dword [rsp+dword*33] |
| 177 | |.define SAVE_L, dword [rsp+dword*24] | 179 | |.define SAVE_L, dword [rsp+dword*32] |
| 178 | |.define SAVE_ERRF, dword [rsp+dword*23] | 180 | |.define SAVE_ERRF, dword [rsp+dword*31] |
| 179 | |.define SAVE_NRES, dword [rsp+dword*22] | 181 | |.define SAVE_NRES, dword [rsp+dword*30] |
| 180 | |.define TMP2, dword [rsp+dword*21] | 182 | |.define TMP2, dword [rsp+dword*29] |
| 181 | |.define TMP1, dword [rsp+dword*20] | 183 | |.define TMP1, dword [rsp+dword*28] |
| 182 | |//----- 16 byte aligned, ^^^ 32 byte register save area, owned by interpreter | 184 | |//----- 16 byte aligned, ^^^ 32 byte register save area, owned by interpreter |
| 183 | |.define SAVE_RET, aword [rsp+aword*9] //<-- rsp entering interpreter. | 185 | |.define SAVE_RET, aword [rsp+aword*13] //<-- rsp entering interpreter. |
| 186 | |.define SAVE_R8, aword [rsp+aword*12] | ||
| 187 | |.define SAVE_R7, aword [rsp+aword*11] | ||
| 188 | |.define SAVE_R6, aword [rsp+aword*10] | ||
| 189 | |.define SAVE_R5, aword [rsp+aword*9] | ||
| 184 | |.define SAVE_R4, aword [rsp+aword*8] | 190 | |.define SAVE_R4, aword [rsp+aword*8] |
| 185 | |.define SAVE_R3, aword [rsp+aword*7] | 191 | |.define SAVE_R3, aword [rsp+aword*7] |
| 186 | |.define SAVE_R2, aword [rsp+aword*6] | 192 | |.define SAVE_R2, aword [rsp+aword*6] |
| @@ -204,16 +210,18 @@ | |||
| 204 | | | 210 | | |
| 205 | |.define CFRAME_SPACE, aword*5 // Delta for rsp (see <--). | 211 | |.define CFRAME_SPACE, aword*5 // Delta for rsp (see <--). |
| 206 | |.macro saveregs | 212 | |.macro saveregs |
| 207 | | push rbp; push r14; push r15; push rbx | 213 | | push rbp; push rbx; push r15; push r14; push r13; push r12 |
| 208 | | sub rsp, CFRAME_SPACE | 214 | | sub rsp, CFRAME_SPACE |
| 209 | |.endmacro | 215 | |.endmacro |
| 210 | |.macro restoreregs | 216 | |.macro restoreregs |
| 211 | | add rsp, CFRAME_SPACE | 217 | | add rsp, CFRAME_SPACE |
| 212 | | pop rbx; pop r15; pop r14; pop rbp | 218 | | pop r12; pop r13; pop r14; pop r15; pop rbx; pop rbp |
| 213 | |.endmacro | 219 | |.endmacro |
| 214 | | | 220 | | |
| 215 | |//----- 16 byte aligned, | 221 | |//----- 16 byte aligned, |
| 216 | |.define SAVE_RET, aword [rsp+aword*9] //<-- rsp entering interpreter. | 222 | |.define SAVE_RET, aword [rsp+aword*11] //<-- rsp entering interpreter. |
| 223 | |.define SAVE_R6, aword [rsp+aword*10] | ||
| 224 | |.define SAVE_R5, aword [rsp+aword*9] | ||
| 217 | |.define SAVE_R4, aword [rsp+aword*8] | 225 | |.define SAVE_R4, aword [rsp+aword*8] |
| 218 | |.define SAVE_R3, aword [rsp+aword*7] | 226 | |.define SAVE_R3, aword [rsp+aword*7] |
| 219 | |.define SAVE_R2, aword [rsp+aword*6] | 227 | |.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 @@ | |||
| 48 | #define LJ_TARGET_X64 1 | 48 | #define LJ_TARGET_X64 1 |
| 49 | #define LJ_TARGET_X86ORX64 1 | 49 | #define LJ_TARGET_X86ORX64 1 |
| 50 | #define LJ_PAGESIZE 4096 | 50 | #define LJ_PAGESIZE 4096 |
| 51 | #error "No support for x64 architecture (yet)" | 51 | #define LJ_ARCH_NOJIT 1 /* NYI */ |
| 52 | #else | 52 | #else |
| 53 | #error "No target architecture defined" | 53 | #error "No target architecture defined" |
| 54 | #endif | 54 | #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 { | |||
| 66 | #define CFRAME_SIZE (12*4) | 66 | #define CFRAME_SIZE (12*4) |
| 67 | #elif LJ_TARGET_X64 | 67 | #elif LJ_TARGET_X64 |
| 68 | #if _WIN64 | 68 | #if _WIN64 |
| 69 | #define CFRAME_OFS_ERRF (23*4) | 69 | #define CFRAME_OFS_PREV (17*8) |
| 70 | #define CFRAME_OFS_NRES (22*4) | 70 | #define CFRAME_OFS_PC (33*4) |
| 71 | #define CFRAME_OFS_PREV (13*8) | 71 | #define CFRAME_OFS_L (32*4) |
| 72 | #define CFRAME_OFS_L (24*4) | 72 | #define CFRAME_OFS_ERRF (31*4) |
| 73 | #define CFRAME_OFS_PC (25*4) | 73 | #define CFRAME_OFS_NRES (30*4) |
| 74 | #define CFRAME_SIZE (10*8) | 74 | #define CFRAME_SIZE (14*8) |
| 75 | #else | 75 | #else |
| 76 | #define CFRAME_OFS_ERRF (3*4) | ||
| 77 | #define CFRAME_OFS_NRES (2*4) | ||
| 78 | #define CFRAME_OFS_PREV (4*8) | 76 | #define CFRAME_OFS_PREV (4*8) |
| 79 | #define CFRAME_OFS_L (4*4) | ||
| 80 | #define CFRAME_OFS_PC (5*4) | 77 | #define CFRAME_OFS_PC (5*4) |
| 81 | #define CFRAME_SIZE (10*8) | 78 | #define CFRAME_OFS_L (4*4) |
| 79 | #define CFRAME_OFS_ERRF (3*4) | ||
| 80 | #define CFRAME_OFS_NRES (2*4) | ||
| 81 | #define CFRAME_SIZE (12*8) | ||
| 82 | #endif | 82 | #endif |
| 83 | #else | 83 | #else |
| 84 | #error "Missing CFRAME_* definitions for this architecture" | 84 | #error "Missing CFRAME_* definitions for this architecture" |
