diff options
author | Himbeer <himbeer@disroot.org> | 2024-07-27 15:57:46 +0200 |
---|---|---|
committer | Himbeer <himbeer@disroot.org> | 2024-07-27 15:57:46 +0200 |
commit | fc888ca37914ffc3aecc111f8c8fd3fc07869367 (patch) | |
tree | 289ef69a74c315e47ca4d076c57deaf1c4bf031b /src/kernel.zig | |
parent | a19ce5386c97151312d7cf5b54f404c96ca41365 (diff) |
kernel: Update general panic message to include sepc and stval CSRs
Diffstat (limited to 'src/kernel.zig')
-rw-r--r-- | src/kernel.zig | 25 |
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", .{}); |