microcode: Restore frame pointer as well as stack pointer.
authorMatt Birkholz <matt@birchwood-abbey.net>
Sat, 16 Sep 2017 21:36:58 +0000 (14:36 -0700)
committerMatt Birkholz <matt@birchwood-abbey.net>
Sat, 16 Sep 2017 22:36:53 +0000 (15:36 -0700)
src/microcode/cmpauxmd/i386.m4
src/microcode/cmpauxmd/x86-64.m4

index 7d9fe7c9edc069b9819c0f28c6878b76a79cc197..aea85be5d53ba86d687b579a8da03783db683c28 100644 (file)
@@ -677,12 +677,14 @@ interface_to_scheme_proceed:
 ')
        OP(mov,l)       TW(EVR(Free),rfree)             # Free pointer = %edi
        OP(mov,l)       TW(LOF(REGBLOCK_VAL(),regs),REG(eax)) # Value/dynamic link
-       OP(mov,l)       TW(IMM(ADDRESS_MASK),rmask)     # = %ebp
-
        # Restore the C stack pointer, which we zeroed back in
        # scheme_to_interface, for within_c_stack.
+       # Restore the C frame pointer too; the interface may have called
+       # Re_Enter_Interpreter which probably clobbered both.
        OP(mov,l)       TW(REG(esp),EVR(C_Stack_Pointer))
        OP(mov,l)       TW(EVR(stack_pointer),REG(esp))
+       OP(mov,l)       TW(REG(ebp),EVT(C_Frame_Pointer))
+       OP(mov,l)       TW(IMM(ADDRESS_MASK),rmask)     # = %ebp
        OP(mov,l)       TW(REG(eax),REG(ecx))           # Preserve if used
        OP(and,l)       TW(rmask,REG(ecx))              # Restore potential dynamic link
        OP(mov,l)       TW(REG(ecx),LOF(REGBLOCK_DLINK(),regs))
index b7a19c93dd6d51ba7f109e3f363c0b18873cb806..ed1a5cbca82d2751476d799f7304bc219640fe15 100644 (file)
@@ -476,11 +476,14 @@ ifdef(`WIN32',                                            # Register block = %rsi
 `      OP(lea,q)       TW(ABS(EVR(Registers)),regs)')
        OP(mov,q)       TW(ABS(EVR(Free)),rfree)        # Free pointer = %rdi
        OP(mov,q)       TW(QOF(REGBLOCK_VAL(),regs),REG(rax)) # Value/dynamic link
-       OP(mov,q)       TW(IMM(ADDRESS_MASK),rmask)     # = %rbp
        # Restore the C stack pointer, which we zeroed back in
        # scheme_to_interface, for within_c_stack.
+       # Restore the C frame pointer too; the interface may have called
+       # Re_Enter_Interpreter which probably clobbered both.
        OP(mov,q)       TW(REG(rsp),ABS(EVR(C_Stack_Pointer)))
        OP(mov,q)       TW(ABS(EVR(stack_pointer)),REG(rsp))
+       OP(mov,q)       TW(REG(rbp),ABS(EVR(C_Frame_Pointer)))
+       OP(mov,q)       TW(IMM(ADDRESS_MASK),rmask)     # = %rbp
        OP(mov,q)       TW(REG(rax),REG(rcx))           # Preserve if used
        OP(and,q)       TW(rmask,REG(rcx))              # Restore potential dynamic link
        OP(mov,q)       TW(REG(rcx),QOF(REGBLOCK_DLINK(),regs))