os/trap/
context.rs

1use riscv::register::sstatus::{self, SPP, Sstatus};
2/// Trap Context
3#[repr(C)]
4pub struct TrapContext {
5    /// general regs[0..31]
6    pub x: [usize; 32],
7    /// CSR sstatus      
8    pub sstatus: Sstatus,
9    /// CSR sepc
10    pub sepc: usize,
11}
12
13impl TrapContext {
14    /// set stack pointer to x_2 reg (sp)
15    pub fn set_sp(&mut self, sp: usize) {
16        self.x[2] = sp;
17    }
18    /// init app context
19    pub fn app_init_context(entry: usize, sp: usize) -> Self {
20        let mut sstatus = sstatus::read(); // CSR sstatus
21        sstatus.set_spp(SPP::User); //previous privilege mode: user mode
22        let mut cx = Self {
23            x: [0; 32],
24            sstatus,
25            sepc: entry, // entry point of app
26        };
27        cx.set_sp(sp); // app's user stack pointer
28        cx // return initial Trap Context of app
29    }
30}