aboutsummaryrefslogtreecommitdiff
path: root/src/kernel.zig
diff options
context:
space:
mode:
authorHimbeer <himbeer@disroot.org>2024-07-27 15:57:46 +0200
committerHimbeer <himbeer@disroot.org>2024-07-27 15:57:46 +0200
commitfc888ca37914ffc3aecc111f8c8fd3fc07869367 (patch)
tree289ef69a74c315e47ca4d076c57deaf1c4bf031b /src/kernel.zig
parenta19ce5386c97151312d7cf5b54f404c96ca41365 (diff)
kernel: Update general panic message to include sepc and stval CSRs
Diffstat (limited to 'src/kernel.zig')
-rw-r--r--src/kernel.zig25
1 files changed, 17 insertions, 8 deletions
diff --git a/src/kernel.zig b/src/kernel.zig
index 94d8325..ff04f89 100644
--- a/src/kernel.zig
+++ b/src/kernel.zig
@@ -39,6 +39,10 @@ const HartData = packed struct(usize) {
}
};
+inline fn halt() noreturn {
+ while (true) asm volatile ("wfi");
+}
+
pub fn panic(msg: []const u8, error_return_trace: ?*std.builtin.StackTrace, ret_addr: ?usize) noreturn {
_ = &error_return_trace;
_ = &ret_addr;
@@ -53,16 +57,21 @@ pub fn panic(msg: []const u8, error_return_trace: ?*std.builtin.StackTrace, ret_
instructions.sie.write(interrupts.Enable.none);
instructions.sip.write(interrupts.Enable.none);
- const console = Console.autoChoose() orelse while (true) asm volatile ("wfi");
+ const sepc = instructions.sepc.read();
+ const stval = instructions.stval.read();
+
+ const console = Console.autoChoose() orelse halt();
const w = console.writer();
- w.print("\r\n", .{}) catch while (true) asm volatile ("wfi");
- w.print("= !! ========== !! =\r\n", .{}) catch while (true) asm volatile ("wfi");
- w.print("!!! KERNEL PANIC !!!\r\n", .{}) catch while (true) asm volatile ("wfi");
- w.print("{s}\r\n", .{msg}) catch while (true) asm volatile ("wfi");
- w.print("= !! ========== !! =\r\n", .{}) catch while (true) asm volatile ("wfi");
+ w.print("\r\n", .{}) catch halt();
+ w.print("= !! ============================= kernel panic =========================== !! =\r\n", .{}) catch halt();
+ w.print("{s}\r\n\r\n", .{msg}) catch halt();
+ w.print("------------------------------------ csr dump ----------------------------------\r\n", .{}) catch halt();
+ w.print("sepc = 0x{x:0>16}\r\n", .{sepc}) catch halt();
+ w.print("stval = 0x{x:0>16}\r\n", .{stval}) catch halt();
+ w.print("= !! ====================================================================== !! =\r\n", .{}) catch halt();
- while (true) asm volatile ("wfi");
+ halt();
}
export fn _start() callconv(.Naked) noreturn {
@@ -121,7 +130,7 @@ fn pagedMain() noreturn {
}
fn pagedRun() !noreturn {
- const console = Console.autoChoose() orelse while (true) asm volatile ("wfi");
+ const console = Console.autoChoose() orelse halt();
const w = console.writer();
try w.print("\r\n", .{});