wires

summary refs log tree commit diff
diff options
context:
space:
mode:
authorwires <wires@noreply.wires.systems>2025-10-09 20:52:54 -0400
committerwires <wires@noreply.wires.systems>2025-10-09 20:52:54 -0400
commita778e63f8174a2e416aa7d15883c983830428cc0 (patch)
tree2bc3b3b18b266c7b7d53baecc3ba982271dc02bd
parentslight build.zig change (diff)
downloadzosimos-a778e63f8174a2e416aa7d15883c983830428cc0.tar.gz
start working on devicetree
-rw-r--r--src/DtParser.zig73
-rw-r--r--src/main.zig16
2 files changed, 87 insertions, 2 deletions
diff --git a/src/DtParser.zig b/src/DtParser.zig
new file mode 100644
index 0000000..5ff3dfb
--- /dev/null
+++ b/src/DtParser.zig
@@ -0,0 +1,73 @@
+const std = @import("std");
+const bigToNative = std.mem.bigToNative;
+
+const Self = @This();
+
+const Header = struct {
+    magic: u32,
+    total_size: u32,
+    off_dt_struct: u32,
+    off_dt_strings: u32,
+    off_mem_rsvmap: u32,
+    version: u32,
+    last_comp_version: u32,
+    boot_cpuid_phys: u32,
+    size_dt_strings: u32,
+    size_dt_struct: u32,
+};
+
+base: [*]const u8,
+
+pub fn new(base: [*]const u8) Self {
+    return .{ .base = base };
+}
+
+fn getHeaderField(self: Self, comptime field_name: []const u8) u32 {
+    const ptr: *const u32 = @ptrCast(
+        @alignCast(self.base + @offsetOf(Header, field_name)),
+    );
+    return bigToNative(u32, ptr.*);
+}
+
+pub fn magic(self: Self) u32 {
+    return self.getHeaderField("magic");
+}
+
+pub fn totalSize(self: Self) u32 {
+    return self.getHeaderField("total_size");
+}
+
+pub fn version(self: Self) u32 {
+    return self.getHeaderField("version");
+}
+
+pub const ReserveEntry = struct {
+    address: u64,
+    size: u64,
+};
+
+const MemRsvmapIter = struct {
+    cur: [*]const u64,
+
+    pub fn next(self: *@This()) ?ReserveEntry {
+        const address = bigToNative(u64, self.cur[0]);
+        const size = bigToNative(u64, self.cur[1]);
+
+        if (address == 0 and size == 0) {
+            return null;
+        } else {
+            self.cur += 2;
+            return .{
+                .address = address,
+                .size = size,
+            };
+        }
+    }
+};
+
+pub fn memRsvmap(self: Self) MemRsvmapIter {
+    const offset = self.getHeaderField("off_mem_rsvmap");
+    return .{
+        .cur = @ptrCast(@alignCast(self.base + offset)),
+    };
+}
diff --git a/src/main.zig b/src/main.zig
index 89130f5..3b013e8 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -1,8 +1,20 @@
 const mini_uart = @import("mini_uart.zig");
+const DtParser = @import("DtParser.zig");
 
-export fn main(dt_addr: u32) void {
+export fn main(dt_base: [*]u8) void {
     mini_uart.enable();
-    mini_uart.print("meow\n0x{x}\n", .{dt_addr});
+
+    const dt = DtParser.new(dt_base);
+
+    var mem_rsvmap = dt.memRsvmap();
+
+    while (mem_rsvmap.next()) |rsv_entry| {
+        mini_uart.print("addr: 0x{x} size: 0x{x}\n", .{
+            rsv_entry.address,
+            rsv_entry.size,
+        });
+    }
+    mini_uart.print("0x{x}\n", .{dt.magic()});
 
     while (true) {}
 }