summaryrefslogtreecommitdiff
path: root/x86-bare-metal/multiboot/kern.zig
diff options
context:
space:
mode:
authorJohannes Stoelp <johannes.stoelp@gmail.com>2025-04-24 00:21:02 +0200
committerJohannes Stoelp <johannes.stoelp@gmail.com>2025-04-24 00:21:02 +0200
commit23e0ccf7b5a0ccea545f231d35dbecc00011a9de (patch)
treefcabb2e084297bb51c2a12ee77404b891cca0df6 /x86-bare-metal/multiboot/kern.zig
parent20a854354918735c3289c5576a28fad18ca21757 (diff)
downloadzig-playground-main.tar.gz
zig-playground-main.zip
multiboot: add multiboot example kernelHEADmain
Diffstat (limited to 'x86-bare-metal/multiboot/kern.zig')
-rw-r--r--x86-bare-metal/multiboot/kern.zig47
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");
+ }
+}