1use riscv::register::sstatus::{self, SPP, Sstatus};
3
4#[repr(C)]
5#[derive(Debug)]
6pub struct TrapContext {
8 pub x: [usize; 32],
10 pub sstatus: Sstatus,
12 pub sepc: usize,
14 pub kernel_satp: usize,
16 pub kernel_sp: usize,
18 pub trap_handler: usize,
20}
21
22impl TrapContext {
23 pub fn set_sp(&mut self, sp: usize) {
25 self.x[2] = sp;
26 }
27 pub fn app_init_context(
29 entry: usize,
30 sp: usize,
31 kernel_satp: usize,
32 kernel_sp: usize,
33 trap_handler: usize,
34 ) -> Self {
35 let mut sstatus = sstatus::read();
36 sstatus.set_spp(SPP::User);
38 let mut cx = Self {
39 x: [0; 32],
40 sstatus,
41 sepc: entry,
42 kernel_satp,
43 kernel_sp,
44 trap_handler,
45 };
46 cx.set_sp(sp);
47 cx
48 }
49}