|
|
|
@ -86,10 +86,15 @@ pub fn trap_return() -> ! {
|
|
|
|
|
}
|
|
|
|
|
let restore_va = __restore as usize - __alltraps as usize + TRAMPOLINE;
|
|
|
|
|
unsafe {
|
|
|
|
|
llvm_asm!("fence.i" :::: "volatile");
|
|
|
|
|
llvm_asm!("jr $0" :: "r"(restore_va), "{a0}"(trap_cx_ptr), "{a1}"(user_satp) :: "volatile");
|
|
|
|
|
asm!(
|
|
|
|
|
"fence.i",
|
|
|
|
|
"jr {restore_va}",
|
|
|
|
|
restore_va = in(reg) restore_va,
|
|
|
|
|
in("a0") trap_cx_ptr,
|
|
|
|
|
in("a1") user_satp,
|
|
|
|
|
options(noreturn)
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
panic!("Unreachable in back_to_user!");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[no_mangle]
|
|
|
|
|