Skip to main content

os/trap/
context.rs

1//! Implementation of [`TrapContext`]
2use riscv::register::sstatus::{self, SPP, Sstatus};
3
4#[repr(C)]
5#[derive(Debug)]
6///trap context structure containing sstatus, sepc and registers
7pub struct TrapContext {
8    /// general regs[0..31]
9    pub x: [usize; 32],
10    /// CSR sstatus      
11    pub sstatus: Sstatus,
12    /// CSR sepc
13    pub sepc: usize,
14    /// Addr of Page Table
15    pub kernel_satp: usize,
16    /// kernel stack
17    pub kernel_sp: usize,
18    /// Addr of trap_handler function
19    pub trap_handler: usize,
20}
21
22impl TrapContext {
23    ///set stack pointer to x_2 reg (sp)
24    pub fn set_sp(&mut self, sp: usize) {
25        self.x[2] = sp;
26    }
27    ///init app context
28    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        // set CPU privilege to User after trapping back
37        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}