From 53a964a63d2d384b22ae1949a471a732003a30b9 Mon Sep 17 00:00:00 2001 From: morgan Date: Thu, 23 May 2024 15:30:27 +0800 Subject: [PATCH] riscv32::swap: fix stack push/pop asm --- src/arch/riscv32.rs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) 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