const std = @import("std"); // --- Protocol Definitions (Match core/ion.nim) --- pub const CmdPacket = extern struct { kind: u32, _pad: u32, // Explicit Padding for 8-byte alignment arg: u64, id: u128, // SipHash Provenance (16 bytes) }; // Compile-time validation: 32 bytes comptime { if (@sizeOf(CmdPacket) != 32) { @compileError("CmdPacket size mismatch! Expected 32, got " ++ @as([]const u8, &[_]u8{@sizeOf(CmdPacket)})); } } pub const FsReadArgs = extern struct { fd: u64, buffer: u64, len: u64, }; pub const IonPacket = extern struct { data: u64, // ptr phys: u64, len: u16, id: u16, }; // Generic Lock-Free Ring Buffer (Single Producer / Single Consumer safe) pub fn RingBuffer(comptime T: type) type { return extern struct { head: u32, tail: u32, mask: u32, data: [256]T, pub fn push(self: *volatile @This(), item: T) bool { const head = self.head; const tail = self.tail; const mask = self.mask; // Check full if (((head + 1) & mask) == (tail & mask)) { return false; } // Write data self.data[head & mask] = item; // Commit asm volatile ("fence" ::: .{ .memory = true }); self.head = (head + 1) & mask; return true; } }; } // System Table Layout (Located at 0x83000000) pub const SysTable = extern struct { magic: u32, s_rx: *RingBuffer(IonPacket), s_tx: *RingBuffer(IonPacket), s_event: *RingBuffer(IonPacket), s_cmd: *RingBuffer(CmdPacket), s_input: *RingBuffer(IonPacket), // Hypercalls fn_vfs_open: u64, // pointer fn_vfs_read: u64, // pointer fn_vfs_list: u64, // pointer fn_log: u64, // pointer (ptr, len) -> void }; const SYSTABLE_ADDR: usize = 0x83000000; // --- API --- extern fn console_write(ptr: [*]const u8, len: usize) void; pub fn sys_cmd_push(pkt: CmdPacket) bool { const sys = @as(*const volatile SysTable, @ptrFromInt(SYSTABLE_ADDR)); // Debug: Check magic if (sys.magic != 0x4E585553) { const msg = "[DEBUG] SysTable magic check FAILED!\n"; console_write(msg.ptr, msg.len); return false; } const msg2 = "[DEBUG] Pushing to command ring...\n"; console_write(msg2.ptr, msg2.len); // Push to Command Ring const result = sys.s_cmd.push(pkt); if (result) { const msg3 = "[DEBUG] Command ring push SUCCESS\n"; console_write(msg3.ptr, msg3.len); } else { const msg4 = "[DEBUG] Command ring push FAILED (ring full?)\n"; console_write(msg4.ptr, msg4.len); } return result; } pub fn sys_input_pop(out_pkt: *IonPacket) bool { const sys = @as(*const volatile SysTable, @ptrFromInt(SYSTABLE_ADDR)); if (sys.magic != 0x4E585553) return false; const ring = sys.s_input; const head = @atomicLoad(u32, &ring.head, .acquire); const tail = @atomicLoad(u32, &ring.tail, .monotonic); if (head == tail) return false; out_pkt.* = ring.data[tail & ring.mask]; @atomicStore(u32, &ring.tail, tail + 1, .release); return true; }