1use riscv::register::sstatus::{self, SPP, Sstatus};
3
4#[repr(C)]
5pub struct TrapContext {
7 pub x: [usize; 32],
9 pub sstatus: Sstatus,
11 pub sepc: usize,
13 pub kernel_satp: usize,
15 pub kernel_sp: usize,
17 pub trap_handler: usize,
19}
20
21impl TrapContext {
22 pub fn set_sp(&mut self, sp: usize) {
24 self.x[2] = sp;
25 }
26 pub fn app_init_context(
28 entry: usize,
29 sp: usize,
30 kernel_satp: usize,
31 kernel_sp: usize,
32 trap_handler: usize,
33 ) -> Self {
34 let mut sstatus = sstatus::read();
35 sstatus.set_spp(SPP::User);
37 let mut cx = Self {
38 x: [0; 32],
39 sstatus,
40 sepc: entry,
41 kernel_satp,
42 kernel_sp,
43 trap_handler,
44 };
45 cx.set_sp(sp);
46 cx
47 }
48}