hachem.wtf
aboutsummaryrefslogtreecommitdiff
path: root/boot/boot.zig
diff options
context:
space:
mode:
Diffstat (limited to 'boot/boot.zig')
-rw-r--r--boot/boot.zig37
1 files changed, 27 insertions, 10 deletions
diff --git a/boot/boot.zig b/boot/boot.zig
index 28fb8c1..5a3c429 100644
--- a/boot/boot.zig
+++ b/boot/boot.zig
@@ -101,10 +101,6 @@ fn kProcCount() u64 {
return sched.procCount();
}
-// block device, revo builds the filesystem on top of these
-fn kDiskPresent() u64 {
- return if (ata.present()) 1 else 0;
-}
fn kDiskSectors() u64 {
return ata.sectorCount();
}
@@ -117,6 +113,29 @@ fn kDiskWrite(lba: u64, phys: u64) u64 {
return if (ata.write(@truncate(lba), buf)) 1 else 0;
}
+// the embedded programs, copied to frames at boot so revo can load them by name
+const Prog = struct { name: []const u8, phys: u64, size: u64 };
+var g_progs: [elf.programs.len]Prog = undefined;
+
+fn loadPrograms() void {
+ for (elf.programs, 0..) |p, i| {
+ const pages = (p.bytes.len + 4095) / 4096;
+ const phys = pmm.allocContig(pages) orelse @panic("no room for an embedded program");
+ @memcpy(@as([*]u8, @ptrFromInt(pmm.physToVirt(phys)))[0..p.bytes.len], p.bytes);
+ g_progs[i] = .{ .name = p.name, .phys = phys, .size = p.bytes.len };
+ }
+}
+
+fn kProgCount() u64 {
+ return g_progs.len;
+}
+fn kProgPhys(i: u64) u64 {
+ return g_progs[i].phys;
+}
+fn kProgName(i: u64) []const u8 {
+ return g_progs[i].name;
+}
+
// entry(_start)
export fn _start() callconv(.c) noreturn {
serial.init();
@@ -143,9 +162,7 @@ export fn _start() callconv(.c) noreturn {
vmmSelfTest();
ata.init();
- 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);
+ loadPrograms();
// the event loop below is scheduler task 0 (the kernel), running in the
// current cr3. user tasks spawned by `run` get time fucked against it
sched.init(vmm.activePml4());
@@ -166,9 +183,9 @@ export fn _start() callconv(.c) noreturn {
.mem_total = &kMemTotal,
.uptime = &kUptime,
.proc_count = &kProcCount,
- .elf_phys = elf_phys,
- .elf_size = elf.hello_elf.len,
- .disk_present = &kDiskPresent,
+ .prog_count = &kProgCount,
+ .prog_phys = &kProgPhys,
+ .prog_name = &kProgName,
.disk_sectors = &kDiskSectors,
.disk_read = &kDiskRead,
.disk_write = &kDiskWrite,