Skip to main content

os/trap/
context.rs

1//! Implementation of [`TrapContext`]
2
3use riscv::register::sstatus::{self, SPP, Sstatus};
4
5#[repr(C)]
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(); // CSR sstatus
36        sstatus.set_spp(SPP::User); //previous privilege mode: user mode
37        let mut cx = Self {
38            x: [0; 32],
39            sstatus,
40            sepc: entry,  // entry point of app
41            kernel_satp,  // addr of page table
42            kernel_sp,    // kernel stack
43            trap_handler, // addr of trap_handler function
44        };
45        cx.set_sp(sp); // app's user stack pointer
46        cx // return initial Trap Context of app
47    }
48}