1use riscv::register::sstatus::{self, SPP, Sstatus};
2
3#[repr(C)]
4#[derive(Debug)]
5pub struct TrapContext {
6 pub x: [usize; 32],
7 pub sstatus: Sstatus,
8 pub sepc: usize,
9 pub kernel_satp: usize,
10 pub kernel_sp: usize,
11 pub trap_handler: usize,
12}
13
14impl TrapContext {
15 pub fn set_sp(&mut self, sp: usize) {
16 self.x[2] = sp;
17 }
18 pub fn app_init_context(
19 entry: usize,
20 sp: usize,
21 kernel_satp: usize,
22 kernel_sp: usize,
23 trap_handler: usize,
24 ) -> Self {
25 let mut sstatus = sstatus::read();
26 sstatus.set_spp(SPP::User);
28 let mut cx = Self {
29 x: [0; 32],
30 sstatus,
31 sepc: entry,
32 kernel_satp,
33 kernel_sp,
34 trap_handler,
35 };
36 cx.set_sp(sp);
37 cx
38 }
39}