155 lines
4.6 KiB
Nim
155 lines
4.6 KiB
Nim
# core/rumpk/core/ion.nim
|
|
# Phase 35e: Expanded SysTable with Crypto + Global Channels
|
|
|
|
# CRITICAL: Only import memory module for kernel builds
|
|
# Userspace builds (with -d:is_membrane) should NOT get the 2MB pool
|
|
when not defined(is_membrane):
|
|
import ion/memory
|
|
export memory
|
|
|
|
const
|
|
PLEDGE_STDIO* = 0x0001'u64
|
|
PLEDGE_RPATH* = 0x0002'u64
|
|
PLEDGE_WPATH* = 0x0004'u64
|
|
PLEDGE_INET* = 0x0008'u64
|
|
PLEDGE_EXEC* = 0x0010'u64
|
|
PLEDGE_ALL* = 0xFFFFFFFFFFFFFFFF'u64
|
|
|
|
type
|
|
CmdType* = enum
|
|
CMD_SYS_NOOP = 0
|
|
CMD_SYS_EXIT = 1
|
|
CMD_ION_STOP = 2
|
|
CMD_ION_START = 3
|
|
CMD_GPU_MATRIX = 0x100
|
|
CMD_GPU_CLEAR = 0x101
|
|
CMD_GET_GPU_STATUS = 0x102
|
|
CMD_FS_OPEN = 0x200
|
|
CMD_FS_READ = 0x201
|
|
CMD_FS_READDIR = 0x202
|
|
CMD_FS_WRITE = 0x203
|
|
CMD_FS_MOUNT = 0x204
|
|
CMD_ION_FREE = 0x300
|
|
CMD_SYS_EXEC = 0x400
|
|
CMD_NET_TX = 0x500
|
|
CMD_NET_RX = 0x501
|
|
CMD_BLK_READ = 0x600
|
|
CMD_BLK_WRITE = 0x601
|
|
|
|
CmdPacket* = object
|
|
kind*: uint32
|
|
reserved*: uint32
|
|
arg*: uint64
|
|
id*: array[16, byte]
|
|
|
|
NetArgs* = object
|
|
buf*: uint64
|
|
len*: uint64
|
|
|
|
BlkArgs* = object
|
|
sector*: uint64
|
|
buf*: uint64
|
|
len*: uint64
|
|
|
|
FileArgs* = object
|
|
name*: uint64
|
|
data*: uint64
|
|
len*: uint64
|
|
|
|
HAL_Ring*[T] = object
|
|
head*: uint32
|
|
tail*: uint32
|
|
mask*: uint32
|
|
data*: array[256, T]
|
|
|
|
SovereignChannel*[T] = object
|
|
ring*: ptr HAL_Ring[T]
|
|
|
|
SysTable* = object
|
|
magic*: uint32 # 0x4E585553
|
|
reserved*: uint32
|
|
s_rx*: ptr HAL_Ring[IonPacket]
|
|
s_tx*: ptr HAL_Ring[IonPacket]
|
|
s_event*: ptr HAL_Ring[IonPacket]
|
|
s_cmd*: ptr HAL_Ring[CmdPacket]
|
|
s_input*: ptr HAL_Ring[IonPacket]
|
|
# Function Pointers
|
|
fn_vfs_open*: proc(path: cstring, flags: int32): int32 {.cdecl.}
|
|
fn_vfs_read*: proc(fd: int32, buf: pointer, count: uint64): int64 {.cdecl.}
|
|
fn_vfs_list*: proc(buf: pointer, max_len: uint64): int64 {.cdecl.}
|
|
fn_vfs_write*: proc(fd: int32, buf: pointer, count: uint64): int64 {.cdecl.}
|
|
fn_vfs_close*: proc(fd: int32): int32 {.cdecl.}
|
|
fn_log*: pointer
|
|
fn_pledge*: proc(promises: uint64): int32 {.cdecl.}
|
|
|
|
# Framebuffer
|
|
fb_addr*: uint64
|
|
fb_width*: uint32
|
|
fb_height*: uint32
|
|
fb_stride*: uint32
|
|
fb_bpp*: uint32
|
|
fn_yield*: proc() {.cdecl.}
|
|
|
|
# Phase 35e: Crypto
|
|
fn_siphash*: proc(key: ptr array[16, byte], data: pointer, len: uint64, out_hash: ptr array[16, byte]) {.cdecl.}
|
|
fn_ed25519_verify*: proc(sig: ptr array[64, byte], msg: pointer, len: uint64, pk: ptr array[32, byte]): bool {.cdecl.}
|
|
|
|
# Phase 36.2: Network Membrane (The Veins)
|
|
s_net_rx*: ptr HAL_Ring[IonPacket] # Kernel Producer -> User Consumer
|
|
s_net_tx*: ptr HAL_Ring[IonPacket] # User Producer -> Kernel Consumer
|
|
|
|
include invariant
|
|
|
|
# --- Sovereign Logic ---
|
|
|
|
# HAL Imports
|
|
proc hal_channel_push*(ring: uint64, pkt: IonPacket): bool {.importc, cdecl.}
|
|
proc hal_channel_pop*(ring: uint64, out_pkt: ptr IonPacket): bool {.importc, cdecl.}
|
|
proc hal_cmd_push*(ring: uint64, pkt: CmdPacket): bool {.importc, cdecl.}
|
|
proc hal_cmd_pop*(ring: uint64, out_pkt: ptr CmdPacket): bool {.importc, cdecl.}
|
|
|
|
proc send*[T](c: var SovereignChannel[T], pkt: T) =
|
|
if c.ring == nil: return
|
|
when T is IonPacket:
|
|
discard hal_channel_push(cast[uint64](c.ring), pkt)
|
|
elif T is CmdPacket:
|
|
discard hal_cmd_push(cast[uint64](c.ring), pkt)
|
|
|
|
proc recv*[T](c: var SovereignChannel[T], out_pkt: var T): bool =
|
|
if c.ring == nil: return false
|
|
when T is IonPacket:
|
|
return hal_channel_pop(cast[uint64](c.ring), addr out_pkt)
|
|
elif T is CmdPacket:
|
|
return hal_cmd_pop(cast[uint64](c.ring), addr out_pkt)
|
|
|
|
# Global Channels
|
|
var chan_input*: SovereignChannel[IonPacket]
|
|
var guest_input_hal: HAL_Ring[IonPacket]
|
|
|
|
# Phase 36.2: Network Channels
|
|
var chan_net_rx*: SovereignChannel[IonPacket]
|
|
var chan_net_tx*: SovereignChannel[IonPacket]
|
|
var net_rx_hal: HAL_Ring[IonPacket]
|
|
var net_tx_hal: HAL_Ring[IonPacket]
|
|
|
|
proc ion_init_input*() {.exportc, cdecl.} =
|
|
guest_input_hal.head = 0
|
|
guest_input_hal.tail = 0
|
|
guest_input_hal.mask = 255
|
|
chan_input.ring = addr guest_input_hal
|
|
|
|
proc ion_init_network*() {.exportc, cdecl.} =
|
|
net_rx_hal.head = 0
|
|
net_rx_hal.tail = 0
|
|
net_rx_hal.mask = 255
|
|
chan_net_rx.ring = addr net_rx_hal
|
|
|
|
net_tx_hal.head = 0
|
|
net_tx_hal.tail = 0
|
|
net_tx_hal.mask = 255
|
|
chan_net_tx.ring = addr net_tx_hal
|
|
|
|
static: doAssert(sizeof(IonPacket) == 24, "IonPacket size mismatch!")
|
|
static: doAssert(sizeof(CmdPacket) == 32, "CmdPacket size mismatch!")
|
|
static: doAssert(sizeof(SysTable) == 168, "SysTable size mismatch! (Expected 168 after Network expansion)")
|