kernel panic and trapping :)
This commit is contained in:
parent
fae2e42f8f
commit
da95a4acfa
5 changed files with 70 additions and 1 deletions
|
|
@ -2,11 +2,15 @@
|
|||
.global _start
|
||||
_start:
|
||||
la sp, stack_top # Set up the stack pointer
|
||||
la t0, trap_entry # Set up the trap handler
|
||||
csrw mtvec, t0 # Set the trap vector to our trap handler
|
||||
call kmain # Jump to our C code
|
||||
loop:
|
||||
wfi # Wait for Interrupt (saves CPU)
|
||||
j loop # Infinite loop if C returns
|
||||
|
||||
.align 4
|
||||
trap_entry:
|
||||
j handle_trap
|
||||
.section .bss
|
||||
.align 16
|
||||
stack_low:
|
||||
|
|
|
|||
|
|
@ -2,8 +2,10 @@
|
|||
#include <stddef.h>
|
||||
#include <drivers/uart.h>
|
||||
#include <syscon/syscon.h>
|
||||
#include <kernel/panic.h>
|
||||
|
||||
void kmain() {
|
||||
kprint("Hello, OS World!\n");
|
||||
kpanic_force();
|
||||
poweroff();
|
||||
}
|
||||
|
|
|
|||
27
src/kernel/panic.c
Normal file
27
src/kernel/panic.c
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <drivers/uart.h>
|
||||
#include <syscon/syscon.h>
|
||||
|
||||
void kpanic(const char *reason){
|
||||
kprint(reason);
|
||||
poweroff();
|
||||
}
|
||||
|
||||
void kpanic_force() {
|
||||
// 1. Immediate Output
|
||||
kprint("\n!!! FORCE PANIC !!!\n");
|
||||
|
||||
// 2. Trigger a hardware breakpoint or illegal instruction
|
||||
// This allows a debugger (GDB) to stop exactly here.
|
||||
// 'ebreak' is the standard RISC-V way to trigger a debug trap.
|
||||
__asm__ volatile("ebreak");
|
||||
|
||||
// 3. If no debugger is attached or we continue, kill the VM
|
||||
poweroff();
|
||||
|
||||
// 4. Final halt
|
||||
while(1) {
|
||||
__asm__ volatile("wfi");
|
||||
}
|
||||
}
|
||||
16
src/kernel/panic.h
Normal file
16
src/kernel/panic.h
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
#ifndef PANIC_H
|
||||
#define PANIC_H
|
||||
|
||||
void kpanic(const char *reason);
|
||||
void kpanic_force();
|
||||
|
||||
#define KASSERT(cond, msg) \
|
||||
if (!(cond)) { \
|
||||
kprint("ASSERTION FAILED: "); \
|
||||
kprint(__FILE__); \
|
||||
kprint(":"); \
|
||||
/* Note: Printing line numbers requires a custom itoa/printf */ \
|
||||
kpanic(msg); \
|
||||
}
|
||||
|
||||
#endif
|
||||
20
src/kernel/trap.c
Normal file
20
src/kernel/trap.c
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
#include <drivers/uart.h>
|
||||
#include <syscon/syscon.h>
|
||||
|
||||
void handle_trap() {
|
||||
kprint("\n!!! HARDWARE EXCEPTION DETECTED !!!\n");
|
||||
|
||||
// Read the 'mcause' register to see WHY we trapped
|
||||
unsigned long cause;
|
||||
__asm__ volatile("csrr %0, mcause" : "=r"(cause));
|
||||
|
||||
if (cause == 3) { // 3 is the code for 'breakpoint' (ebreak)
|
||||
kprint("Reason: ebreak (Breakpoint)\n");
|
||||
} else {
|
||||
kprint("Reason: Other Exception\n");
|
||||
}
|
||||
|
||||
poweroff();
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue