feat: kernel W^X (per-section perms, firmware unmapped, stack guard, boot check), halt on kernel faults, region W^X across processes
This commit is contained in:
@@ -123,6 +123,8 @@ const CAUSE_INTERRUPT_BIT: usize = 1 << 63;
|
||||
const CAUSE_S_TIMER: usize = 5;
|
||||
const CAUSE_S_EXTERNAL: usize = 9;
|
||||
const CAUSE_ECALL_U: usize = 8;
|
||||
/// Set in `sstatus` when the trap came from supervisor mode.
|
||||
const SSTATUS_SPP: usize = 1 << 8;
|
||||
|
||||
pub fn init() {
|
||||
unsafe extern "C" {
|
||||
@@ -347,6 +349,22 @@ fn handle_exception(frame: &mut TrapFrame, scause: usize) {
|
||||
}
|
||||
}
|
||||
}
|
||||
_ if frame.sstatus & SSTATUS_SPP != 0 => {
|
||||
// The kernel itself faulted (a W^X violation, the stack guard,
|
||||
// a bad pointer). Its state can no longer be trusted, and no
|
||||
// user thread is to blame.
|
||||
let uart = crate::hw::uart::Uart::new();
|
||||
uart.write_str("KERNEL FAULT: scause=");
|
||||
uart.write_hex(scause);
|
||||
let stval: usize;
|
||||
unsafe { core::arch::asm!("csrr {0}, stval", out(reg) stval) };
|
||||
uart.write_str(" stval=");
|
||||
uart.write_hex(stval);
|
||||
uart.write_str(" sepc=");
|
||||
uart.write_hex(frame.sepc);
|
||||
uart.put_char(b'\n');
|
||||
crate::halt(&uart, "fault in kernel mode");
|
||||
}
|
||||
_ => {
|
||||
let uart = crate::hw::uart::Uart::new();
|
||||
uart.write_str("FAULT: scause=");
|
||||
|
||||
Reference in New Issue
Block a user