diff options
Diffstat (limited to 'mirai/crimson/render/stack.zig')
| -rw-r--r-- | mirai/crimson/render/stack.zig | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/mirai/crimson/render/stack.zig b/mirai/crimson/render/stack.zig new file mode 100644 index 0000000..a00f0c7 --- /dev/null +++ b/mirai/crimson/render/stack.zig @@ -0,0 +1,47 @@ +//! Render Stack Trace + +const serial = @import("../../drivers/serial/serial.zig"); +const types = @import("../types/types.zig"); + +const Context = types.Context; + +pub fn render(context: *const Context) void { + serial.printf("Stack Trace:\n", .{}); + + var rbp = context.rbp; + var depth: usize = 0; + const max_depth: usize = 20; + + while (rbp != 0 and depth < max_depth) { + const frame_ptr: [*]const u64 = @ptrFromInt(rbp); + + const return_address = frame_ptr[1]; + if (return_address == 0) break; + + serial.printf(" [%d] %x\n", .{ depth, return_address }); + + const next_rbp = frame_ptr[0]; + if (next_rbp <= rbp) break; + + rbp = next_rbp; + depth += 1; + } + + if (depth == 0) { + serial.printf(" (no stack frames available)\n", .{}); + } + + serial.printf("\n", .{}); +} + +pub fn render_raw_stack(rsp: u64, count: usize) void { + serial.printf("Raw Stack (from %x):\n", .{rsp}); + + const stack_ptr: [*]const u64 = @ptrFromInt(rsp); + + for (0..count) |i| { + serial.printf(" [%x]: %x\n", .{ rsp + i * 8, stack_ptr[i] }); + } + + serial.printf("\n", .{}); +} |
