From cbe823ce6e1ed019c54ce9f3d02064f628f0201c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Gr=C3=A9goire?= Date: Sun, 4 Oct 2026 11:11:25 -0400 Subject: [PATCH] loader: pass more things to the kernel --- src/arch/amd64/root.zig | 1 + src/kern/amd64/init.zig | 1 + src/loader/amd64/impl.zig | 1 + src/loader/limine/impl.zig | 14 +++++++++++++- 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/arch/amd64/root.zig b/src/arch/amd64/root.zig index 29d9283..34bee02 100644 --- a/src/arch/amd64/root.zig +++ b/src/arch/amd64/root.zig @@ -748,4 +748,5 @@ pub const IdtEntry = extern struct { pub const BootInfo = struct { cpu_features: CpuFeatures, + hypervisor_info: ?hypervisor.Info, }; diff --git a/src/kern/amd64/init.zig b/src/kern/amd64/init.zig index f96a723..5504d97 100644 --- a/src/kern/amd64/init.zig +++ b/src/kern/amd64/init.zig @@ -109,6 +109,7 @@ extern var __percpu_start: u8; pub fn early_init() linksection(r.init) void { amd64.cpu_features = r.boot_info.arch_info.cpu_features; + amd64.hypervisor.info = r.boot_info.arch_info.hypervisor_info; early_cpu_init(); impl.cpu_offsets = &initial_offsets; diff --git a/src/loader/amd64/impl.zig b/src/loader/amd64/impl.zig index 144584f..10ad370 100644 --- a/src/loader/amd64/impl.zig +++ b/src/loader/amd64/impl.zig @@ -114,4 +114,5 @@ pub fn debug_write(c: u8) void { pub fn init() void { amd64.detect_cpu_features(); r.loader_info.arch_info.cpu_features = amd64.cpu_features; + r.loader_info.arch_info.hypervisor_info = amd64.hypervisor.info; } diff --git a/src/loader/limine/impl.zig b/src/loader/limine/impl.zig index 32648ce..e9f5f47 100644 --- a/src/loader/limine/impl.zig +++ b/src/loader/limine/impl.zig @@ -62,6 +62,8 @@ pub fn get_image_layout() r.ImageLayout { }; } +var cmdline: [256]u8 = undefined; + export fn loader_entry() callconv(.c) void { var kernel: ?*anyopaque = null; var module_start: usize = 0; @@ -148,7 +150,17 @@ export fn loader_entry() callconv(.c) void { } if (cmdline_request.response) |resp| { - r.loader_info.cmdline = std.mem.span(resp.cmdline); + if (resp.cmdline) |c| { + const span = std.mem.span(c); + if (span.len > cmdline.len) { + r.loader_info.cmdline = "TOOLONG"; + } else { + std.mem.copyForwards(u8, &cmdline, span); + r.loader_info.cmdline = cmdline[0..span.len]; + } + } else { + r.loader_info.cmdline = &.{}; + } } r.main(kernel.?);