diff options
| author | hachem <im@hachem.wtf> | 2026-09-25 11:31:59 +0200 |
|---|---|---|
| committer | hachem <im@hachem.wtf> | 2026-09-25 11:31:59 +0200 |
| commit | ed285c9fc665e262ed21c7bf5734acb2b7a532db (patch) | |
| tree | e51434e8069bc7219221cc1136515828d0293aca /boot/boot.zig | |
| parent | d18d1da05a4d065d54787434d6bc46f3354626a5 (diff) | |
feat: load + run native ELF binaries
Diffstat (limited to 'boot/boot.zig')
| -rw-r--r-- | boot/boot.zig | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/boot/boot.zig b/boot/boot.zig index 4e9d0b4..108afc8 100644 --- a/boot/boot.zig +++ b/boot/boot.zig @@ -8,6 +8,7 @@ const pmm = @import("pmm.zig"); const heap = @import("heap.zig"); const vmm = @import("vmm.zig"); const user = @import("user.zig"); +const elf = @import("elf.zig"); const keyboard = @import("keyboard.zig"); const bridge = @import("bridge"); @@ -48,6 +49,21 @@ export var memmap_request: limine.MemoryMapRequest linksection(".limine_requests // 4 MiB stack export var stack_size_request: limine.StackSizeRequest linksection(".limine_requests") = .{ .stack_size = 4 * 1024 * 1024 }; +// wrappers matching bridge.KernelOps (pmm/vmm return optionals; the revo-facing +// primitives use 0 as the failure sentinel). +fn kPhysToVirt(p: u64) u64 { + return pmm.physToVirt(p); +} +fn kAllocFrame() u64 { + return pmm.alloc() orelse 0; +} +fn kCreateAddrspace() u64 { + return vmm.createAddressSpace() orelse 0; +} +fn kSerialNext() i64 { + return if (serial.mirrorNext()) |c| @intCast(c) else -1; +} + // ENTRY(_start) export fn _start() callconv(.c) noreturn { serial.init(); @@ -121,16 +137,27 @@ export fn _start() callconv(.c) noreturn { serial.write("vmm test: switched back OK\r\n"); } - user.runTestProgram(); + const elf_pages = (elf.hello_elf.len + 4095) / 4096; + const elf_phys = pmm.allocContig(elf_pages) orelse @panic("no room for the embedded ELF"); + @memcpy(@as([*]u8, @ptrFromInt(pmm.physToVirt(elf_phys)))[0..elf.hello_elf.len], elf.hello_elf); + const kops: bridge.KernelOps = .{ + .phys_to_virt = &kPhysToVirt, + .alloc_frame = &kAllocFrame, + .create_addrspace = &kCreateAddrspace, + .run_process = &user.runProcess, + .serial_next = &kSerialNext, + .elf_phys = elf_phys, + .elf_size = elf.hello_elf.len, + }; - // hand the kernel heap + raw framebuffer to revo and bring up the VM + // hand the kernel heap + framebuffer + low-level ops to revo and bring up the VM const fb: ?bridge.Fb = if (framebuffer.get()) |s| .{ .ptr = s.address, .width = s.width, .height = s.height, .pitch = s.pitch, } else null; - bridge.boot(heap.allocator(), serial.write, fb); + bridge.boot(heap.allocator(), serial.write, fb, kops); // - sleep until an interrupt // - drain the keyboard |
