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}