diff --git a/src/arch/riscv32.rs b/src/arch/riscv32.rs index 4d18ecb..7ee487e 100644 --- a/src/arch/riscv32.rs +++ b/src/arch/riscv32.rs @@ -174,9 +174,9 @@ pub unsafe fn swap(arg: usize, new_sp: StackPointer, # from the stack; unwinder uses them to find the CFA of the caller, # and so they have to have the correct value immediately after the # call instruction that invoked the trampoline. - sw fp, -12(sp) - sw ra, -16(sp) addi sp, sp, -16 + sw fp, 4(sp) + sw ra, 0(sp) .cfi_offset fp, 4 .cfi_offset ra, 0 @@ -191,13 +191,12 @@ pub unsafe fn swap(arg: usize, new_sp: StackPointer, or a1, zero, sp # Load stack pointer of the new context. or sp, zero, a2 - # Deallocate the 16 bytes - addi sp, sp, 16 # Restore frame pointer and link register of the new context. # Load frame and instruction pointers of the new context. - lw fp, -12(sp) - lw ra, -16(sp) + lw fp, 4(sp) + lw ra, 0(sp) + addi sp, sp, 16 # Return into the new context. jr ra