aboutsummaryrefslogtreecommitdiff
path: root/mirai/crimson/render/stack.zig
diff options
context:
space:
mode:
Diffstat (limited to 'mirai/crimson/render/stack.zig')
-rw-r--r--mirai/crimson/render/stack.zig47
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", .{});
+}