Compare commits

...

3 Commits

Author SHA1 Message Date
morgan 53a964a63d riscv32::swap: fix stack push/pop asm 2024-05-23 15:30:27 +08:00
occheung 3ecbe53f76 riscv32: env call on context switch 2021-10-08 11:00:30 +08:00
occheung 17ba0a3429 riscv32: align stack to 4k boundary 2021-10-08 10:59:40 +08:00
1 changed files with 16 additions and 7 deletions

View File

@ -44,7 +44,7 @@
use core::mem; use core::mem;
use stack::Stack; use stack::Stack;
pub const STACK_ALIGNMENT: usize = 16; pub const STACK_ALIGNMENT: usize = 4096;
#[derive(Debug, Clone, Copy)] #[derive(Debug, Clone, Copy)]
#[repr(transparent)] #[repr(transparent)]
@ -159,6 +159,12 @@ pub unsafe fn swap(arg: usize, new_sp: StackPointer,
// Just pass a dummy pointer if we aren't linking the stack // Just pass a dummy pointer if we aren't linking the stack
&mut dummy &mut dummy
}; };
let stack_limit = if let Some(new_stack) = new_stack {
new_stack.limit() as *mut usize
} else {
// Stack should not reach all the way to address 0
0 as *mut usize
};
#[naked] #[naked]
unsafe extern "C" fn trampoline() { unsafe extern "C" fn trampoline() {
@ -168,12 +174,15 @@ pub unsafe fn swap(arg: usize, new_sp: StackPointer,
# from the stack; unwinder uses them to find the CFA of the caller, # 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 # and so they have to have the correct value immediately after the
# call instruction that invoked the trampoline. # call instruction that invoked the trampoline.
sw fp, -12(sp)
sw ra, -16(sp)
addi sp, sp, -16 addi sp, sp, -16
sw fp, 4(sp)
sw ra, 0(sp)
.cfi_offset fp, 4 .cfi_offset fp, 4
.cfi_offset ra, 0 .cfi_offset ra, 0
# Perform environment call to modify the PMP regions
ecall
# Link the call stacks together by writing the current stack bottom # Link the call stacks together by writing the current stack bottom
# address to the CFA slot in the new stack. # address to the CFA slot in the new stack.
sw sp, 0(a3) sw sp, 0(a3)
@ -182,13 +191,12 @@ pub unsafe fn swap(arg: usize, new_sp: StackPointer,
or a1, zero, sp or a1, zero, sp
# Load stack pointer of the new context. # Load stack pointer of the new context.
or sp, zero, a2 or sp, zero, a2
# Deallocate the 16 bytes
addi sp, sp, 16
# Restore frame pointer and link register of the new context. # Restore frame pointer and link register of the new context.
# Load frame and instruction pointers of the new context. # Load frame and instruction pointers of the new context.
lw fp, -12(sp) lw fp, 4(sp)
lw ra, -16(sp) lw ra, 0(sp)
addi sp, sp, 16
# Return into the new context. # Return into the new context.
jr ra jr ra
@ -209,6 +217,7 @@ pub unsafe fn swap(arg: usize, new_sp: StackPointer,
"{a0}" (arg) "{a0}" (arg)
"{a2}" (new_sp.0) "{a2}" (new_sp.0)
"{a3}" (new_cfa) "{a3}" (new_cfa)
"{a7}" (stack_limit)
:/*"zero",*/"ra",/*"sp","gp","tp",*/"t0","t1","t2", :/*"zero",*/"ra",/*"sp","gp","tp",*/"t0","t1","t2",
/*"fp",*/"s1",/*"a0", "a1"*/"a2", "a3", "a4", "a5", /*"fp",*/"s1",/*"a0", "a1"*/"a2", "a3", "a4", "a5",
"a6", "a7", "s2", "s3", "s4", "s5", "s6", "s7", "a6", "a7", "s2", "s3", "s4", "s5", "s6", "s7",