//! Implementation of [`TrapContext`] use riscv::register::sstatus::{self, Sstatus, SPP}; #[repr(C)] #[derive(Debug)] ///trap context structure containing sstatus, sepc and registers pub struct TrapContext { /// general regs[0..31] pub x: [usize; 32], /// CSR sstatus pub sstatus: Sstatus, /// CSR sepc pub sepc: usize, /// Addr of Page Table pub kernel_satp: usize, /// kernel stack pub kernel_sp: usize, /// Addr of trap_handler function pub trap_handler: usize, } impl TrapContext { ///set stack pointer to x_2 reg (sp) pub fn set_sp(&mut self, sp: usize) { self.x[2] = sp; } ///init app context pub fn app_init_context( entry: usize, sp: usize, kernel_satp: usize, kernel_sp: usize, trap_handler: usize, ) -> Self { let mut sstatus = sstatus::read(); // set CPU privilege to User after trapping back sstatus.set_spp(SPP::User); let mut cx = Self { x: [0; 32], sstatus, sepc: entry, kernel_satp, kernel_sp, trap_handler, }; cx.set_sp(sp); cx } }