use riscv::register::sstatus::{self, Sstatus, SPP}; #[repr(C)] pub struct TrapContext { pub x: [usize; 32], pub s_status: Sstatus, pub sepc: usize, } impl TrapContext { pub fn init_application_context(entry: usize, sp: usize) -> Self { let sstatus = sstatus::read(); unsafe { sstatus::set_spp(SPP::User); } let mut context = Self { x: [0; 32], s_status: sstatus, sepc: entry, }; context.set_sp(sp); context } pub fn set_sp(&mut self, sp: usize) { // x2 is stack pointer register self.x[2] = sp; } }