From 94334f720507f713f210b652607445ef04543107 Mon Sep 17 00:00:00 2001 From: Kbz-8 Date: Sat, 20 Jul 2024 17:20:38 +0000 Subject: [PATCH 1/3] adding basic stack trace --- .gdb_history | 37 ++++++++++++++++++++++++++++++++ build.zig | 7 +++--- linker.ld | 15 +++++++++++++ sources/drivers/index.zig | 4 ++-- sources/drivers/vga/vga.zig | 1 + sources/kernel/arch/x86/boot.zig | 1 + sources/kernel/kmain.zig | 1 + sources/kernel/panic.zig | 2 ++ sources/kernel/stack_trace.zig | 27 +++++++++++++++++++++++ sources/libk/io/out.zig | 28 ++++++++++++++++++------ 10 files changed, 111 insertions(+), 12 deletions(-) create mode 100644 .gdb_history create mode 100644 sources/kernel/stack_trace.zig diff --git a/.gdb_history b/.gdb_history new file mode 100644 index 0000000..1804f8d --- /dev/null +++ b/.gdb_history @@ -0,0 +1,37 @@ +target remote :1234 +clear +c +q +target remote :1234 +b stack_trace.stackTrace +b stk.stackTrace +b stk.stk.stackTrace +b stack_trace.stackTrace +b stack_trace.stack_trace.stackTrace +b panic.kpanic +q +q +target remote :1234 +b stk.stackTrace +b stack_trace.stackTrace +q +target remote :1234 +b stk.stackTrace +b stack_trace.stackTrace +c +n +n +n +n +n +n +q +target remote :1234 +b stack_trace.stackTrace +c +n +n +n +n +n +q diff --git a/build.zig b/build.zig index a6ea3c3..b3d8217 100644 --- a/build.zig +++ b/build.zig @@ -5,16 +5,15 @@ pub fn build(b: *std.Build) void const kernel = b.addExecutable(.{ .name = "kernel.elf", .root_source_file = .{ .src_path = .{ .owner = b, .sub_path = "sources/kernel/kmain.zig" } }, - .target = b.resolveTargetQuery(.{ + .target = b.resolveTargetQuery(.{ .cpu_arch = .x86, - .abi = .none, + .abi = .gnu, .os_tag = .freestanding, }), .optimize = .Debug, - .strip = true, + //.strip = true, .code_model = .kernel, .pic = false, - .error_tracing = false, }); kernel.setLinkerScriptPath(.{ .src_path = .{ .owner = b, .sub_path = "linker.ld" } }); diff --git a/linker.ld b/linker.ld index 4e9e314..dba4aff 100644 --- a/linker.ld +++ b/linker.ld @@ -13,6 +13,21 @@ SECTIONS .rodata : ALIGN(4K) { *(.rodata) + __debug_info_start = .; + KEEP(*(.debug_info)) + __debug_info_end = .; + __debug_abbrev_start = .; + KEEP(*(.debug_abbrev)) + __debug_abbrev_end = .; + __debug_str_start = .; + KEEP(*(.debug_str)) + __debug_str_end = .; + __debug_line_start = .; + KEEP(*(.debug_line)) + __debug_line_end = .; + __debug_ranges_start = .; + KEEP(*(.debug_ranges)) + __debug_ranges_end = .; } .data : ALIGN(4K) diff --git a/sources/drivers/index.zig b/sources/drivers/index.zig index f661412..458dd60 100644 --- a/sources/drivers/index.zig +++ b/sources/drivers/index.zig @@ -19,6 +19,6 @@ pub fn initDrivers() void pub fn shutdownDrivers() void { @setCold(true); - kernel.logs.klog("[Drivers Manager] unloading drivers..."); - kernel.logs.klog("[Drivers Manager] unloaded all drivers"); + kernel.logs.klogln("[Drivers Manager] unloading drivers..."); + kernel.logs.klogln("[Drivers Manager] unloaded all drivers"); } diff --git a/sources/drivers/vga/vga.zig b/sources/drivers/vga/vga.zig index 97ae35c..fed98d5 100644 --- a/sources/drivers/vga/vga.zig +++ b/sources/drivers/vga/vga.zig @@ -153,6 +153,7 @@ pub fn init(title : []const u8, title_color : u8, navbar_color : u8, triggered_c updateCursor(); updateNavbar(); kernel.logs.klogln("[VGA Driver] loaded"); + kernel.stk.stackTrace(42); } fn putEntry(c: u8, color: u8, x: usize, y: usize) void diff --git a/sources/kernel/arch/x86/boot.zig b/sources/kernel/arch/x86/boot.zig index 1abbff0..ef0b0ba 100644 --- a/sources/kernel/arch/x86/boot.zig +++ b/sources/kernel/arch/x86/boot.zig @@ -27,6 +27,7 @@ export fn _start() align(16) linksection(".text.boot") callconv(.Naked) noreturn asm volatile ( \\ movl %[stk], %esp + \\ xor %ebp, %ebp \\ call kmain : : [stk] "{ecx}" (@intFromPtr(&kernel_stack) + @sizeOf(@TypeOf(kernel_stack))), diff --git a/sources/kernel/kmain.zig b/sources/kernel/kmain.zig index 18798b7..9aa33ed 100644 --- a/sources/kernel/kmain.zig +++ b/sources/kernel/kmain.zig @@ -18,6 +18,7 @@ const libk = @import("libk"); pub const logs = @import("log.zig"); pub const kpanic = @import("panic.zig").kpanic; +pub const stk = @import("stack_trace.zig"); pub const arch = if(!is_test) switch(builtin.cpu.arch) { diff --git a/sources/kernel/panic.zig b/sources/kernel/panic.zig index 86e8ff7..4c699a9 100644 --- a/sources/kernel/panic.zig +++ b/sources/kernel/panic.zig @@ -1,6 +1,7 @@ const vga = @import("drivers").vga; const arch = @import("kmain.zig").arch; const logs = @import("log.zig"); +const stk = @import("stack_trace.zig"); pub fn kpanic(message: []const u8) noreturn { @@ -8,6 +9,7 @@ pub fn kpanic(message: []const u8) noreturn vga.setColor(vga.Color.WHITE, vga.Color.RED); vga.clear(vga.Color.RED); vga.putString(logs.getLogBuffer()); + stk.stackTrace(42); vga.putString("\nkernel panic : "); vga.putString(message); vga.putString("\n[cannot recover, freezing the system]"); diff --git a/sources/kernel/stack_trace.zig b/sources/kernel/stack_trace.zig new file mode 100644 index 0000000..e3b6c31 --- /dev/null +++ b/sources/kernel/stack_trace.zig @@ -0,0 +1,27 @@ +const libk = @import("libk"); + +const StackFrame = packed struct +{ + esp: ?*StackFrame, + eip: u32 +}; + +pub fn stackTrace(max_frame_stack: usize) void +{ + var stk: ?*StackFrame = null; + asm volatile + ( + \\ movl %ebp, %eax + : [stk] "={eax}" (stk) + : + : "memory" + ); + libk.io.kputs("================= Stack Trace ================= \n"); + var frame: usize = 0; + while(stk.?.esp != null and frame < max_frame_stack) : (frame += 1) + { + libk.io.kprintf("fn 0x{} {}()\n", .{ stk.?.eip, "??" }); + stk = stk.?.esp; + } + libk.io.kputs("=============== End Stack Trace =============== \n"); +} diff --git a/sources/libk/io/out.zig b/sources/libk/io/out.zig index f78f33b..6dec52e 100644 --- a/sources/libk/io/out.zig +++ b/sources/libk/io/out.zig @@ -9,6 +9,7 @@ pub fn kputs(message: []const u8) void const ArgTypes = enum { Int, + Bool, Float, Char, String, @@ -41,7 +42,7 @@ pub fn kprintf(comptime fmt: []const u8, args: anytype) void if(args[arg_idx] > 0 and args[arg_idx] < 256) vga.putChar(args[arg_idx]) else - putNb(args[arg_idx]); + kputNb(args[arg_idx]); } else if(@typeInfo(@TypeOf(args[arg_idx])) == .Array and @typeInfo(@TypeOf(args[arg_idx])).Array.child == u8) kputs(args[arg_idx]) @@ -59,15 +60,29 @@ pub fn kprintf(comptime fmt: []const u8, args: anytype) void else switch(@TypeOf(args[arg_idx])) { i8, u8, => vga.putChar(args[arg_idx]), - i16, u16, i32, u32, i64, u64, isize, usize => putNb(args[arg_idx]), + i16, u16, i32, u32, i64, u64, isize, usize => kputNb(args[arg_idx]), f16, f32, f64, comptime_float => {}, + bool => + { + if(args[arg_idx]) + kputs("true") + else + kputs("false"); + }, else => @compileError("could not manage auto detected type : " ++ @typeName(@TypeOf(args[arg_idx])) ++ "; please add type identifier between brackets"), } } switch(arg_type) { + .Bool => + { + if(args[arg_idx]) + kputs("true") + else + kputs("false"); + }, .Char => vga.putChar(args[arg_idx]), - .Int => putNb(args[arg_idx]), + .Int => kputNb(args[arg_idx]), .Float => {}, .String => kputs(args[arg_idx]), .Pointer => { kputs("0x"); kputs(string.toStringBase(@intFromPtr(args[arg_idx]), 16)); }, @@ -84,6 +99,7 @@ pub fn kprintf(comptime fmt: []const u8, args: anytype) void { switch(c) { + 'b' => arg_type = .Bool, 'c' => arg_type = .Char, 'i' => arg_type = .Int, 'f' => arg_type = .Float, @@ -105,7 +121,7 @@ pub fn kprintf(comptime fmt: []const u8, args: anytype) void } } -pub fn putNb(nbr: i64) void +pub fn kputNb(nbr: i64) void { if(nbr <= -2147483648) vga.putString("-2147483648") @@ -114,11 +130,11 @@ pub fn putNb(nbr: i64) void else if(nbr < 0) { vga.putChar('-'); - putNb(-nbr); + kputNb(-nbr); } else if(nbr >= 10) { - putNb(@divFloor(nbr, 10)); + kputNb(@divFloor(nbr, 10)); vga.putChar(@intCast(@mod(nbr, 10) + @as(u8, 48))); } else From 792159862547b0016fe23926e908048931025a37 Mon Sep 17 00:00:00 2001 From: Kbz-8 Date: Sat, 20 Jul 2024 17:21:33 +0000 Subject: [PATCH 2/3] removing garbage filke --- .gdb_history | 37 ------------------------------------- .gitignore | 1 + sources/drivers/vga/vga.zig | 1 - 3 files changed, 1 insertion(+), 38 deletions(-) delete mode 100644 .gdb_history diff --git a/.gdb_history b/.gdb_history deleted file mode 100644 index 1804f8d..0000000 --- a/.gdb_history +++ /dev/null @@ -1,37 +0,0 @@ -target remote :1234 -clear -c -q -target remote :1234 -b stack_trace.stackTrace -b stk.stackTrace -b stk.stk.stackTrace -b stack_trace.stackTrace -b stack_trace.stack_trace.stackTrace -b panic.kpanic -q -q -target remote :1234 -b stk.stackTrace -b stack_trace.stackTrace -q -target remote :1234 -b stk.stackTrace -b stack_trace.stackTrace -c -n -n -n -n -n -n -q -target remote :1234 -b stack_trace.stackTrace -c -n -n -n -n -n -q diff --git a/.gitignore b/.gitignore index dab3a6c..d5d57c3 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ Build/ *.a *.exe zig-out/ +.gdb_* diff --git a/sources/drivers/vga/vga.zig b/sources/drivers/vga/vga.zig index fed98d5..97ae35c 100644 --- a/sources/drivers/vga/vga.zig +++ b/sources/drivers/vga/vga.zig @@ -153,7 +153,6 @@ pub fn init(title : []const u8, title_color : u8, navbar_color : u8, triggered_c updateCursor(); updateNavbar(); kernel.logs.klogln("[VGA Driver] loaded"); - kernel.stk.stackTrace(42); } fn putEntry(c: u8, color: u8, x: usize, y: usize) void From 687e8ec101083b7d65f993abe2dddabb4d24024a Mon Sep 17 00:00:00 2001 From: Kbz-8 Date: Sat, 20 Jul 2024 18:18:35 +0000 Subject: [PATCH 3/3] adding debug symbols option --- Makefile | 5 ++++- build.zig | 6 ++++-- linker.ld | 15 --------------- sources/drivers/vga/vga.zig | 1 + 4 files changed, 9 insertions(+), 18 deletions(-) diff --git a/Makefile b/Makefile index 39934d2..c5c6ea6 100644 --- a/Makefile +++ b/Makefile @@ -1,11 +1,14 @@ all : @zig build +debug: + @zig build -Ddebug=true + run : fclean @zig build run run-debug : fclean - @zig build run-debug + @zig build run-debug -Ddebug=true clean: diff --git a/build.zig b/build.zig index b3d8217..aa4db96 100644 --- a/build.zig +++ b/build.zig @@ -2,16 +2,18 @@ const std = @import("std"); pub fn build(b: *std.Build) void { + const debug_symbols = b.option(bool, "debug", "Add debug symbols") orelse false; + const kernel = b.addExecutable(.{ .name = "kernel.elf", .root_source_file = .{ .src_path = .{ .owner = b, .sub_path = "sources/kernel/kmain.zig" } }, .target = b.resolveTargetQuery(.{ .cpu_arch = .x86, - .abi = .gnu, + .abi = .none, .os_tag = .freestanding, }), .optimize = .Debug, - //.strip = true, + .strip = !debug_symbols, .code_model = .kernel, .pic = false, }); diff --git a/linker.ld b/linker.ld index dba4aff..4e9e314 100644 --- a/linker.ld +++ b/linker.ld @@ -13,21 +13,6 @@ SECTIONS .rodata : ALIGN(4K) { *(.rodata) - __debug_info_start = .; - KEEP(*(.debug_info)) - __debug_info_end = .; - __debug_abbrev_start = .; - KEEP(*(.debug_abbrev)) - __debug_abbrev_end = .; - __debug_str_start = .; - KEEP(*(.debug_str)) - __debug_str_end = .; - __debug_line_start = .; - KEEP(*(.debug_line)) - __debug_line_end = .; - __debug_ranges_start = .; - KEEP(*(.debug_ranges)) - __debug_ranges_end = .; } .data : ALIGN(4K) diff --git a/sources/drivers/vga/vga.zig b/sources/drivers/vga/vga.zig index 97ae35c..fed98d5 100644 --- a/sources/drivers/vga/vga.zig +++ b/sources/drivers/vga/vga.zig @@ -153,6 +153,7 @@ pub fn init(title : []const u8, title_color : u8, navbar_color : u8, triggered_c updateCursor(); updateNavbar(); kernel.logs.klogln("[VGA Driver] loaded"); + kernel.stk.stackTrace(42); } fn putEntry(c: u8, color: u8, x: usize, y: usize) void