os/trap/
context.rs

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        // set CPU privilege to User after trapping back
27        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}