From ae5c6aaed1c55a5f5b8bbaec6bf14fef572533ff Mon Sep 17 00:00:00 2001 From: Luke Gorrie Date: Fri, 24 Nov 2017 08:39:41 +0000 Subject: [PATCH] vm_x64.dasc: Fixes to ensure g.lasttrace is a trace number Had previously been clobbered by VM states in some cases. --- src/vm_x64.dasc | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/vm_x64.dasc b/src/vm_x64.dasc index e188b9f14a..6d1c6b28cb 100644 --- a/src/vm_x64.dasc +++ b/src/vm_x64.dasc @@ -2018,6 +2018,7 @@ static void build_subroutines(BuildCtx *ctx) | set_vmstate EXIT | mov [DISPATCH+DISPATCH_J(exitno)], RCd | mov [DISPATCH+DISPATCH_J(parent)], RAd + | mov dword [DISPATCH+DISPATCH_GL(lasttrace)], RAd | sub rsp, 16*8 // Room for SSE regs. | add rbp, -128 | movsd qword [rbp-8], xmm15; movsd qword [rbp-16], xmm14 @@ -2048,6 +2049,11 @@ static void build_subroutines(BuildCtx *ctx) | // RD = MULTRES or negated error code, BASE, PC and DISPATCH set. | // Restore additional callee-save registers only used in compiled code. | lea RA, [rsp+16] + | // Record which trace exited to the interpreter (if called from a trace) + | mov TMPRd, dword [DISPATCH+DISPATCH_GL(vmstate)] + | cmp TMPRd, 1 + | jb >1 + | mov dword [DISPATCH+DISPATCH_GL(lasttrace)], TMPRd |1: | mov r13, [RA-8] | mov r12, [RA] @@ -2062,9 +2068,6 @@ static void build_subroutines(BuildCtx *ctx) | mov L:RB->base, BASE | mov qword [DISPATCH+DISPATCH_GL(jit_base)], 0 | mov TMPRd, dword [DISPATCH+DISPATCH_GL(vmstate)] - | // Record which trace exited to the interpreter, then switch state - | mov TMPRd, dword [DISPATCH+DISPATCH_GL(vmstate)] - | mov dword [DISPATCH+DISPATCH_GL(lasttrace)], TMPRd | set_vmstate INTERP | // Modified copy of ins_next which handles function header dispatch, too. | mov RCd, [PC]