diff options
author | Johannes Stoelp <johannes.stoelp@gmail.com> | 2025-04-24 00:21:02 +0200 |
---|---|---|
committer | Johannes Stoelp <johannes.stoelp@gmail.com> | 2025-04-24 00:21:02 +0200 |
commit | 23e0ccf7b5a0ccea545f231d35dbecc00011a9de (patch) | |
tree | fcabb2e084297bb51c2a12ee77404b891cca0df6 /x86-bare-metal/multiboot/kern.zig | |
parent | 20a854354918735c3289c5576a28fad18ca21757 (diff) | |
download | zig-playground-23e0ccf7b5a0ccea545f231d35dbecc00011a9de.tar.gz zig-playground-23e0ccf7b5a0ccea545f231d35dbecc00011a9de.zip |
Diffstat (limited to 'x86-bare-metal/multiboot/kern.zig')
-rw-r--r-- | x86-bare-metal/multiboot/kern.zig | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/x86-bare-metal/multiboot/kern.zig b/x86-bare-metal/multiboot/kern.zig new file mode 100644 index 0000000..d8f9c96 --- /dev/null +++ b/x86-bare-metal/multiboot/kern.zig @@ -0,0 +1,47 @@ +const fmt = @import("std").fmt; +const dbg = @import("std").debug; + +const vga = @import("vga.zig"); +const mb = @import("mb.zig"); + +export const mbhdr align(4) linksection(".mbhdr") = mb.HEADER; + +var KERNEL_STACK: [32 * 4096]u8 align(16) = undefined; + +export fn _start() align(16) linksection(".text.boot") callconv(.naked) noreturn { + @setRuntimeSafety(false); + asm volatile ( + \\mov %%eax, %%esp + // Push paddr of multiboot info structure on ask (per abi first integer argument to the fn). + \\pushl %%ebx + \\call kmain + \\1: hlt + \\jmp 1b + : + : [top] "{eax}" (@intFromPtr(&KERNEL_STACK) + KERNEL_STACK.len), + ); +} + +export fn kmain(ebx: u32) void { + var con = vga.vga(10, 0).init; + con.puts("Booting into kmain()\n\n"); + + mb.formatBootinfo(con.writer(), mb.bootinfo(ebx)) catch {}; + + dbg.panic("{s}:{}:{s}: done...", .{ @src().file, @src().line, @src().fn_name }); +} + +// -- PANIC HANDLER ------------------------------------------------------------- + +pub const panic = dbg.FullPanic(panicHandler); + +fn panicHandler(msg: []const u8, first_trace_addr: ?usize) noreturn { + _ = first_trace_addr; + + var con = vga.vga(11, 0).init; + fmt.format(con.writer(), "\nPANIC: {s}\n", .{msg}) catch {}; + + while (true) { + asm volatile ("hlt"); + } +} |