')
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))
` 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))