Fix user trap

toolchain_update
WangRunji 7 years ago
parent 69bc5caa81
commit 27daa6d491

@ -1 +1 @@
Subproject commit aa26e4dd950089e115ae0573bab7fb7aeac7764e Subproject commit 590eb508d4ddc503bf7220b8ec78a291129af4ef

@ -1,6 +1,13 @@
.macro SAVE_ALL .macro SAVE_ALL
# store sp in sscratch # If coming from userspace, preserve the user stack pointer and load
csrw sscratch, sp # the kernel stack pointer. If we came from the kernel, sscratch
# will contain 0, and we should continue on the current stack.
csrrw sp, sscratch, sp
bnez sp, _save_context
_restore_kernel_sp:
csrr sp, sscratch
# sscratch = previous-sp, sp = kernel-sp
_save_context:
# provide room for trap frame # provide room for trap frame
addi sp, sp, -36 * 4 addi sp, sp, -36 * 4
# save x registers except x2 (sp) # save x registers except x2 (sp)
@ -36,7 +43,8 @@
sw x31, 31*4(sp) sw x31, 31*4(sp)
# get sp, sstatus, sepc, sbadvaddr, scause # get sp, sstatus, sepc, sbadvaddr, scause
csrr s0, sscratch # set sscratch = 0
csrrw s0, sscratch, x0
csrr s1, sstatus csrr s1, sstatus
csrr s2, sepc csrr s2, sepc
csrr s3, sbadaddr csrr s3, sbadaddr
@ -50,9 +58,15 @@
.endm .endm
.macro RESTORE_ALL .macro RESTORE_ALL
# sstatus and sepc may be changed in ISR lw s1, 32*4(sp) # s1 = sstatus
lw s1, 32*4(sp) lw s2, 33*4(sp) # s2 = sepc
lw s2, 33*4(sp) andi s0, s1, 1 << 8
bnez s0, _restore_context # back to U-mode? (sstatus.SPP = 1)
_save_kernel_sp:
addi s0, sp, 36*4
csrw sscratch, s0 # sscratch = kernel-sp
_restore_context:
# restore sstatus, sepc
csrw sstatus, s1 csrw sstatus, s1
csrw sepc, s2 csrw sepc, s2

@ -6,10 +6,13 @@ mod context;
pub fn init() { pub fn init() {
unsafe { unsafe {
// Set sscratch register to 0, indicating to exception vector that we are
// presently executing in the kernel
sscratch::write(0);
// Set the exception vector address // Set the exception vector address
stvec::write(__alltraps as usize, stvec::TrapMode::Direct); stvec::write(__alltraps as usize, stvec::TrapMode::Direct);
} }
info!("stvec: init end"); info!("interrupt: init end");
} }
#[inline(always)] #[inline(always)]

Loading…
Cancel
Save