rumpk/libs/membrane/net_glue.nim

82 lines
2.2 KiB
Nim

# MARKUS MAIWALD (ARCHITECT) | VOXIS FORGE (AI)
# Rumpk Phase 36: Membrane Networking (Userland High-Speed IO)
import ion_client
# NOTE: Do NOT import ../../core/ion - it pulls in the KERNEL-ONLY 2MB memory pool!
# Local syscall to avoid recursive imports
proc syscall(nr: int, a0: uint64 = 0, a1: uint64 = 0, a2: uint64 = 0): int =
var res: int
let n = cast[uint64](nr)
let v0 = a0
let v1 = a1
let v2 = a2
{.emit: """
register unsigned long a7 __asm__("a7") = `n`;
register unsigned long a0_ __asm__("a0") = `v0`;
register unsigned long a1_ __asm__("a1") = `v1`;
register unsigned long a2_ __asm__("a2") = `v2`;
__asm__ volatile("ecall" : "+r"(a0_) : "r"(a7), "r"(a1_), "r"(a2_) : "memory");
`res` = (int)a0_;
""".}
return res
proc local_write(fd: int, buf: pointer, count: uint64): int =
return syscall(0x204, uint64(fd), cast[uint64](buf), count)
# LwIP Imports
{.passC: "-Icore/rumpk/vendor/lwip/src/include".}
{.passC: "-Icore/rumpk/libs/membrane/include".}
type
Netif* = object
Pbuf* = object
ErrT* = int32
SockState* = enum
CLOSED, LISTEN, CONNECTING, ESTABLISHED, FIN_WAIT
NexusSock* = object
fd*: int
pcb*: pointer
state*: SockState
rx_buf*: array[4096, byte]
rx_len*: int
IpAddr* = uint32
const
IPADDR_ANY* = 0'u32
# SysTable Address
const SYS_TABLE_ADDR = 0x83000000'u64
proc glue_print(s: string) =
discard local_write(1, unsafeAddr s[0], uint64(s.len))
proc membrane_init*() {.exportc, cdecl.} =
glue_print("[Membrane] Initialization...\n")
# NOTE: Userspace does NOT initialize ION pool - only kernel has the pool
ion_user_init()
glue_print("[Membrane] Network Stack Initialized\n")
proc membrane_output_ring*(ni: ptr Netif; p: ptr Pbuf): ErrT {.cdecl, exportc.} =
return 0
proc glue_connect*(sock: ptr NexusSock, ip: uint32, port: uint16): int {.exportc, cdecl.} =
return -1
proc glue_write*(sock: ptr NexusSock, buf: pointer, len: int): int {.exportc, cdecl.} =
return -1
proc glue_read*(sock: ptr NexusSock, buf: pointer, len: int): int {.exportc, cdecl.} =
return -1
proc glue_close*(sock: ptr NexusSock): int {.exportc, cdecl.} =
return 0
proc pump_membrane_stack*() {.exportc, cdecl.} =
discard