aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2009-12-29 02:04:20 +0100
committerMike Pall <mike>2009-12-29 02:04:20 +0100
commitd18d1573d8f37de44cfeef580d244d17561c73d7 (patch)
treeb7b6de9ba326494b6ca8d82ce7024e54af6bef8c /src
parent374f53471528e1592d9075c47e579d2f3c546beb (diff)
downloadluajit-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.
Diffstat (limited to 'src')
-rw-r--r--src/buildvm_x86.dasc30
-rw-r--r--src/lj_arch.h2
-rw-r--r--src/lj_frame.h20
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"