diff --git a/core/ion.nim b/core/ion.nim index 927aca2..233ff24 100644 --- a/core/ion.nim +++ b/core/ion.nim @@ -21,6 +21,7 @@ type CmdPacket* = object kind*: uint32 + reserved*: uint32 # Explicit Padding arg*: uint64 # Upgraded to u64 for Pointers id*: array[16, byte] # u128 for SipHash Provenance @@ -54,6 +55,9 @@ type include invariant +# Compile-time validation: CmdPacket must match Zig extern struct (32 bytes) +static: doAssert(sizeof(CmdPacket) == 32, "CmdPacket size mismatch!") + const SYSTABLE_BASE* = 0x83000000'u64 # HAL Imports (Hardened ABI - Handle Based) diff --git a/core/kernel.nim b/core/kernel.nim index a1f6aed..cfa11e1 100644 --- a/core/kernel.nim +++ b/core/kernel.nim @@ -188,6 +188,19 @@ proc ion_fiber_entry() {.cdecl.} = # 1. Drain Command Channel -> Push to HW var cmd: CmdPacket while chan_cmd.recv(cmd): + kprintln("[ION DEBUG] Command received!") + kprint("[ION DEBUG] cmd.kind = 0x") + kprint_hex(uint64(cmd.kind)) + kprintln("") + + # Dump Raw Packet (4 x 64-bit) + let ptr64 = cast[ptr array[4, uint64]](addr cmd) + kprint("[ION DEBUG] RAW64: ") + kprint_hex(ptr64[0]); kprint(" ") + kprint_hex(ptr64[1]); kprint(" ") + kprint_hex(ptr64[2]); kprint(" ") + kprint_hex(ptr64[3]); kprintln("") + # Cortex Logic: Dispatch Commands case cmd.kind: of uint32(CmdType.CMD_GPU_MATRIX): diff --git a/hal/channel.zig b/hal/channel.zig index ac1ee76..69b43ae 100644 --- a/hal/channel.zig +++ b/hal/channel.zig @@ -13,9 +13,11 @@ pub const IonPacket = extern struct { pub const CmdPacket = extern struct { kind: u32, - arg: u32, - id: [16]u8, // SipHash Provenance + _pad: u32, // Explicit Padding for 8-byte alignment + arg: u64, + id: u128, // SipHash Provenance (16 bytes) }; +// Size: 32 bytes (matches libs/membrane/ion.zig and core/ion.nim) pub fn Ring(comptime T: type) type { return extern struct { diff --git a/libs/membrane/ion.zig b/libs/membrane/ion.zig index 812c40b..2d6ebad 100644 --- a/libs/membrane/ion.zig +++ b/libs/membrane/ion.zig @@ -4,10 +4,18 @@ const std = @import("std"); pub const CmdPacket = extern struct { kind: u32, + _pad: u32, // Explicit Padding for 8-byte alignment arg: u64, - id: [16]u8, // SipHash Provenance (Matches Nim array[16, byte]) + 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, @@ -69,14 +77,33 @@ 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)); - // Safety check magic (0x4E585553 = "NXUS") - if (sys.magic != 0x4E585553) return false; + // 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 - return sys.s_cmd.push(pkt); + 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 { diff --git a/libs/membrane/libc_shim.zig b/libs/membrane/libc_shim.zig index b981438..78f37cb 100644 --- a/libs/membrane/libc_shim.zig +++ b/libs/membrane/libc_shim.zig @@ -160,7 +160,7 @@ const ion = @import("ion.zig"); // Sovereign Syscall: Push to CMD Ring export fn nexus_syscall(cmd_id: u32, arg: u64) c_int { // Construct Packet - var pkt = ion.CmdPacket{ .kind = cmd_id, .arg = arg, .id = [_]u8{0} ** 16 }; + var pkt = ion.CmdPacket{ .kind = cmd_id, ._pad = 0, .arg = arg, .id = 0 }; // Compute Provenance (SipHash) const key = "\xde\xad\xbe\xef\xca\xfe\xba\xbe\x00\x01\x02\x03\x04\x05\x06\x07"; @@ -170,7 +170,7 @@ export fn nexus_syscall(cmd_id: u32, arg: u64) c_int { hasher.update(std.mem.asBytes(&pkt.arg)); const hash_int = hasher.finalInt(); - pkt.id = std.mem.toBytes(hash_int); + pkt.id = hash_int; // Push to High-Priority CMD Ring if (!ion.sys_cmd_push(pkt)) {