82 lines
2.2 KiB
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
|