Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions Sources/Application/Application.swift
Original file line number Diff line number Diff line change
Expand Up @@ -1599,6 +1599,18 @@ struct Application {
uartPutDec(UInt64(kernel_genet32_zero()))
uartPuts("\n")

// Runtime V137: SYS rbuf/tbuf flush pulse. UART token only.
// No boot event emit. No DMA / unpark. No EL0 enter after GENET.
uartPuts("runtime v137: GENET SYS flush\n")
let genet33_ok_boot = kernel_genet33_selftest()
uartPuts("genet33 ok=")
uartPutDec(UInt64(genet33_ok_boot))
uartPuts(" version=137 rflush=")
uartPutDec(UInt64(kernel_genet33_rflush()))
uartPuts(" tflush=")
uartPutDec(UInt64(kernel_genet33_tflush()))
uartPuts("\n")

kernel_event_emit(KERNEL_EVENT_KIND_SELFTEST, 22, UInt(kernel_pool_selftest()), UInt(kernel_pool_count()))
kernel_event_emit(KERNEL_EVENT_KIND_SELFTEST, 23, UInt(heap_fragmentation_selftest()), UInt(kernel_pool_pressure_selftest()))
kernel_event_emit(KERNEL_EVENT_KIND_SELFTEST, 24, UInt(kernel_driver_registry_selftest()), UInt(kernel_driver_count()))
Expand Down
15 changes: 14 additions & 1 deletion Sources/Application/UARTShell.swift
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ func uartPutShellBufferSlice(_ start: UInt32, _ len: UInt32) {
}

let SHELL_COMMAND_LIST =
"commands=help,protocol,status,heap,queues,tasks,tasks2,kobjects,drivers,drivercheck,mailboxes,sendtest,supervisor,health,handlecheck,capcheck,events,runtime,agent,certificate,sched,sched2,sched3,sched4,sched5,sched6,sched7,sched8,sched9,sched10,sched11,sched12,cores,locks,runqueues,diag,irqs,timers,memcheck,faults,retained,retained-clear,memmap,mmu,pools,poolcheck,heapfrag,poolstats,frames,heapcheck,framecheck,stress,frameprobe,bootcert,canceltest,taskcheck,channeltest,bootcheck,soak,heap-invalid-free-test,heap-double-free-test,panic-test,fault-test,reboot,vmm,asplit,el0,syscall,uaccess,usermode,process,loader,multiprocess,sdhci,card,block,fat32,mailbox,framebuf,console,pcie,vl805,xhci,genet,genet2,genet3,genet4,gpio,genet5,genet6,genet7,genet8,genet9,genet10,genet11,genet12,i2c,pwm,i2c2,spi2,stimer,sdload,sdls,sdfile,sdovl,sdovf,sdiss,gpio2,stimer2,pwm2,gpio3,stimer3,mboxt,mboxc,wdog2,mboxv,rng,dma2,sdwr,sdmk,sdrd,sdst,sdscr,sdss,sdbus,sdmb,sdsw,sdmw,sdbc,sdfi,sdfb,sdfm,sdrm,genet13,genet14,genet15,genet16,genet17,genet18,genet19,genet20,genet21,genet22,genet23,genet24,genet25,genet26,genet27,genet28,genet29,genet30,genet31,genet32"
"commands=help,protocol,status,heap,queues,tasks,tasks2,kobjects,drivers,drivercheck,mailboxes,sendtest,supervisor,health,handlecheck,capcheck,events,runtime,agent,certificate,sched,sched2,sched3,sched4,sched5,sched6,sched7,sched8,sched9,sched10,sched11,sched12,cores,locks,runqueues,diag,irqs,timers,memcheck,faults,retained,retained-clear,memmap,mmu,pools,poolcheck,heapfrag,poolstats,frames,heapcheck,framecheck,stress,frameprobe,bootcert,canceltest,taskcheck,channeltest,bootcheck,soak,heap-invalid-free-test,heap-double-free-test,panic-test,fault-test,reboot,vmm,asplit,el0,syscall,uaccess,usermode,process,loader,multiprocess,sdhci,card,block,fat32,mailbox,framebuf,console,pcie,vl805,xhci,genet,genet2,genet3,genet4,gpio,genet5,genet6,genet7,genet8,genet9,genet10,genet11,genet12,i2c,pwm,i2c2,spi2,stimer,sdload,sdls,sdfile,sdovl,sdovf,sdiss,gpio2,stimer2,pwm2,gpio3,stimer3,mboxt,mboxc,wdog2,mboxv,rng,dma2,sdwr,sdmk,sdrd,sdst,sdscr,sdss,sdbus,sdmb,sdsw,sdmw,sdbc,sdfi,sdfb,sdfm,sdrm,genet13,genet14,genet15,genet16,genet17,genet18,genet19,genet20,genet21,genet22,genet23,genet24,genet25,genet26,genet27,genet28,genet29,genet30,genet31,genet32,genet33"

func printShellReady() {
uartPuts("shell ready \(SHELL_COMMAND_LIST)\n")
Expand Down Expand Up @@ -3053,6 +3053,17 @@ func printGenet32() {
uartPuts("\n")
}

func printGenet33() {
_ = kernel_genet33_selftest()
uartPuts("genet33 ok=")
uartPutDec(UInt64(kernel_genet33_ok()))
uartPuts(" version=137 rflush=")
uartPutDec(UInt64(kernel_genet33_rflush()))
uartPuts(" tflush=")
uartPutDec(UInt64(kernel_genet33_tflush()))
uartPuts("\n")
}

func printPoolName(_ pool: UInt32) {
var i: UInt32 = 0
let n = kernel_pool_name_len(pool)
Expand Down Expand Up @@ -4065,6 +4076,8 @@ func dispatchShellCommand(_ commandStart: UInt32, _ commandLen: UInt32, _ reques
printGenet31()
} else if shellBufferSliceEquals(commandStart, commandLen, "genet32") {
printGenet32()
} else if shellBufferSliceEquals(commandStart, commandLen, "genet33") {
printGenet33()
} else if shellBufferSliceEquals(commandStart, commandLen, "pools") {
printPools()
} else if shellBufferSliceEquals(commandStart, commandLen, "poolcheck") {
Expand Down
6 changes: 6 additions & 0 deletions Sources/Support/include/Support.h
Original file line number Diff line number Diff line change
Expand Up @@ -1573,6 +1573,12 @@ int kernel_genet32_ok(void);
unsigned int kernel_genet32_rst(void);
unsigned int kernel_genet32_zero(void);

// V137: SYS rbuf/tbuf flush pulse. No DMA. No EL0.
int kernel_genet33_selftest(void);
int kernel_genet33_ok(void);
unsigned int kernel_genet33_rflush(void);
unsigned int kernel_genet33_tflush(void);

// V80: BSC1 + SPI0 register probe. Read-only. No boot event emit.
int kernel_i2c_selftest(void);
int kernel_i2c_ok(void);
Expand Down
59 changes: 59 additions & 0 deletions Sources/Support/kernel_genet.c
Original file line number Diff line number Diff line change
Expand Up @@ -4989,3 +4989,62 @@ int kernel_genet32_selftest(void) {
int kernel_genet32_ok(void) { return genet32_ok_val; }
unsigned int kernel_genet32_rst(void) { return genet32_rst_val; }
unsigned int kernel_genet32_zero(void) { return genet32_zero_val; }

// V137: SYS rbuf/tbuf flush pulse (Linux SYS_RBUF_FLUSH_CTRL /
// SYS_TBUF_FLUSH_CTRL). Require readable leftover, pulse bit 0,
// then leftover restored with flush bit clear. No DMA. No EL0.
// UART token only.
#define SYS_RBUF_FLUSH_CTRL 0x08U
#define SYS_TBUF_FLUSH_CTRL 0x0CU
#define SYS_FLUSH_BIT 0x1U

int kernel_genet33_selftest(void);

static int genet33_probed;
static int genet33_ok_val;
static unsigned int genet33_rflush_val;
static unsigned int genet33_tflush_val;

int kernel_genet33_selftest(void) {
uint32_t r0, t0, got;

if (genet33_probed) return genet33_ok_val;
genet33_probed = 1;
genet33_ok_val = 0;
genet33_rflush_val = 0;
genet33_tflush_val = 0;

if (!kernel_genet32_selftest()) return 0;

r0 = G32(SYS_RBUF_FLUSH_CTRL);
t0 = G32(SYS_TBUF_FLUSH_CTRL);
if (r0 == 0xDEADDEADU || r0 == 0xFFFFFFFFU) return 0;
if (t0 == 0xDEADDEADU || t0 == 0xFFFFFFFFU) return 0;

genet_wr32(SYS_RBUF_FLUSH_CTRL, r0 | SYS_FLUSH_BIT);
genet_udelay(10);
genet_wr32(SYS_RBUF_FLUSH_CTRL, r0 & ~SYS_FLUSH_BIT);
genet_udelay(10);
got = G32(SYS_RBUF_FLUSH_CTRL);
if (got == 0xDEADDEADU || got == 0xFFFFFFFFU) return 0;
if ((got & SYS_FLUSH_BIT) != 0U) return 0;
if (got != (r0 & ~SYS_FLUSH_BIT)) return 0;
genet33_rflush_val = 1;

genet_wr32(SYS_TBUF_FLUSH_CTRL, t0 | SYS_FLUSH_BIT);
genet_udelay(10);
genet_wr32(SYS_TBUF_FLUSH_CTRL, t0 & ~SYS_FLUSH_BIT);
genet_udelay(10);
got = G32(SYS_TBUF_FLUSH_CTRL);
if (got == 0xDEADDEADU || got == 0xFFFFFFFFU) return 0;
if ((got & SYS_FLUSH_BIT) != 0U) return 0;
if (got != (t0 & ~SYS_FLUSH_BIT)) return 0;
genet33_tflush_val = 1;

genet33_ok_val = 1;
return 1;
}

int kernel_genet33_ok(void) { return genet33_ok_val; }
unsigned int kernel_genet33_rflush(void) { return genet33_rflush_val; }
unsigned int kernel_genet33_tflush(void) { return genet33_tflush_val; }
1 change: 1 addition & 0 deletions docs/ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@ Turn the static identity-map MMU into a real virtual-memory system and run code
- [x] V134 TBUF EEE after GENET (`genet30 ok=1 version=134 eee=`). Fail-closed `TBUF_ENERGY_CTRL` bit-0 clear/set + leftover restore; no DMA; no EL0. Not an RBUF/UMAC poke or TX csum / 64B-descriptor clone.
- [x] V135 HFB filter-0 enable after GENET (`genet31 ok=1 version=135 hfb=`). Fail-closed `HFB_FLT_ENABLE` bit-0 clear/set + leftover restore; does not set `RBUF_HFB_EN`; no DMA; no EL0. Not an RBUF/TBUF/UMAC poke or TX csum / 64B-descriptor clone.
- [x] V136 UMAC TX MIB reset after GENET (`genet32 ok=1 version=136 rst=1 zero=1`). Fail-closed leftover `tx.pok`/`tx.bytes` non-zero, `UMAC_MIB_CTRL` `UMAC_MIB_RESET_TX` pulse, counters == 0; no DMA; no EL0. Not an RBUF/TBUF/HFB-enable writeback or TX csum / 64B-descriptor clone.
- [x] V137 SYS RBUF/TBUF flush after GENET (`genet33 ok=1 version=137 rflush=1 tflush=1`). Fail-closed `SYS_RBUF_FLUSH_CTRL` + `SYS_TBUF_FLUSH_CTRL` bit-0 pulse + leftover restore; no DMA; no EL0. Not a UMAC/RBUF/TBUF/HFB/MIB enable writeback or TX csum / 64B-descriptor clone.
- Minimal TCP/IP: ARP, IPv4, ICMP (ping), UDP, then TCP.
- A tiny socket API exposed as syscalls. (EL0 `sys_socket` after genet12 I-aborts `esr=0xbf000002` and watchdog-resets; deferred.)
- *First proof:* the kernel answers an ICMP ping from the host over its OWN driver
Expand Down
4 changes: 4 additions & 0 deletions scripts/netboot/net-iterate.sh
Original file line number Diff line number Diff line change
Expand Up @@ -487,6 +487,8 @@ PY
&& printf '%s' "$serial_delta" | grep -qa "genet31 ok=1 version=135 hfb=" \
&& printf '%s' "$serial_delta" | grep -qa "runtime v136: GENET UMAC MIB reset" \
&& printf '%s' "$serial_delta" | grep -qa "genet32 ok=1 version=136 rst=" \
&& printf '%s' "$serial_delta" | grep -qa "runtime v137: GENET SYS flush" \
&& printf '%s' "$serial_delta" | grep -qa "genet33 ok=1 version=137 rflush=" \
&& printf '%s' "$serial_delta" | grep -qa "vmmcheck ok=1" \
&& printf '%s' "$serial_delta" | grep -qa "asplit ok=1 version=46" \
&& printf '%s' "$serial_delta" | grep -qa "el0 ok=1 version=47" \
Expand Down Expand Up @@ -802,6 +804,8 @@ PY
probe_shell "genet31" "^genet31 ok=1 version=135 hfb="
# V136: UMAC TX MIB reset. No DMA. No EL0.
probe_shell "genet32" "^genet32 ok=1 version=136 rst="
# V137: SYS rbuf/tbuf flush pulse. No DMA. No EL0.
probe_shell "genet33" "^genet33 ok=1 version=137 rflush="
# probe shell: req-status
probe_shell "req id=25 cmd=status" "^resp id=25 ok=1 cmd=status end"
# probe shell: canceltest
Expand Down
2 changes: 2 additions & 0 deletions scripts/netboot/netboot-doctor.sh
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,8 @@ while [ "$SECONDS" -lt "$deadline" ]; do
&& printf '%s' "$serial_delta" | grep -q "genet31 ok=1 version=135 hfb=" \
&& printf '%s' "$serial_delta" | grep -q "runtime v136: GENET UMAC MIB reset" \
&& printf '%s' "$serial_delta" | grep -q "genet32 ok=1 version=136 rst=" \
&& printf '%s' "$serial_delta" | grep -q "runtime v137: GENET SYS flush" \
&& printf '%s' "$serial_delta" | grep -q "genet33 ok=1 version=137 rflush=" \
&& printf '%s' "$serial_delta" | grep -q "vmmcheck ok=1" \
&& printf '%s' "$serial_delta" | grep -q "asplit ok=1 version=46" \
&& printf '%s' "$serial_delta" | grep -q "el0 ok=1 version=47" \
Expand Down
86 changes: 86 additions & 0 deletions tests/test_runtime_genet_v137_contract.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
"""EPIC F V137: GENET SYS RBUF/TBUF flush. No EL0."""

import pathlib


ROOT = pathlib.Path(__file__).resolve().parents[1]


def read_repo(path: str) -> str:
return (ROOT / path).read_text()


def _selftest_body(genet: str, name: str) -> str:
key = f"int {name}(void) {{"
chunk = genet.split(key, 1)[1]
nxt = chunk.find("\nint kernel_genet")
return chunk if nxt < 0 else chunk[:nxt]


def test_genet33_sys_rbuf_tbuf_flush_without_el0() -> None:
genet = read_repo("Sources/Support/kernel_genet.c")
support = read_repo("Sources/Support/include/Support.h")
app = read_repo("Sources/Application/Application.swift")
shell = read_repo("Sources/Application/UARTShell.swift")
iterate = read_repo("scripts/netboot/net-iterate.sh")
scheduler = read_repo("Sources/Support/kernel_scheduler.c")
roadmap = read_repo("docs/ROADMAP.md")

assert "kernel_genet33_selftest" in genet
g33 = genet.split("kernel_genet33_selftest", 1)[1]
body33 = _selftest_body(genet, "kernel_genet33_selftest")
assert "SYS_RBUF_FLUSH_CTRL" in genet
assert "SYS_TBUF_FLUSH_CTRL" in genet
assert "SYS_RBUF_FLUSH_CTRL" in body33
assert "SYS_TBUF_FLUSH_CTRL" in body33
assert "kernel_genet32_selftest" in body33
assert "CMD_LCL_LOOP_EN" not in genet
assert "UMAC_MIB_CTRL" not in body33
assert "UMAC_MIB_RESET_TX" not in body33
assert "UMAC_MIB_RESET_RX" not in body33
assert "HFB_FLT_ENABLE" not in body33
assert "HFB_FLT0_EN" not in body33
assert "RBUF_HFB_EN" not in body33
assert "TBUF_ENERGY_CTRL" not in body33
assert "TBUF_EEE_EN" not in body33
assert "RBUF_CHK_CTRL" not in body33
assert "RBUF_RXCHK_EN" not in body33
assert "UMAC_MDF_CTRL" not in body33
assert "UMAC_MAX_FRAME_LEN" not in body33
assert "DMA_TX_DO_CSUM" not in body33
assert "RBUF_64B_EN" not in body33
assert "MII_BMSR" not in body33
assert "BMSR_LSTATUS" not in body33
assert "MII_BMCR" not in body33
assert "kernel_genet13_selftest" not in body33
assert "kernel_genet21_selftest" not in body33
assert "genet10_unpark" not in body33
assert "genet10_park" not in body33
assert "GIC" not in g33
assert "kernel_enter_el0_and_wait" not in g33
assert "kernel_event_emit" not in g33
assert "watchdog_reset_now" not in g33
assert "M-SEARCH" not in g33
assert "HTTP/1.0" not in g33
assert "200000" not in genet
assert "static unsigned long alloc_dma" not in genet
assert "int kernel_genet33_selftest(void);" in support
assert 'uartPuts("runtime v137: GENET SYS flush\\n")' in app
assert 'uartPuts("genet33 ok=")' in app
assert "kernel_event_emit(KERNEL_EVENT_KIND_SELFTEST, 137" not in app
assert "func printGenet33()" in shell
assert 'shellBufferSliceEquals(commandStart, commandLen, "genet33")' in shell
assert ",genet32,genet33" in shell
assert 'grep -qa "genet33 ok=1 version=137 rflush="' in iterate
assert 'probe_shell "genet33" "^genet33 ok=1 version=137 rflush="' in iterate
assert "V137 SYS RBUF/TBUF flush" in roadmap
assert "CONFIG.TXT" not in g33
assert "AETHER.TMP" not in g33
assert "ping -c 2" in iterate
assert "SOCK_STREAM" in iterate
assert "sched12" in iterate
assert "kernel_genet33_selftest" not in scheduler
after = app.split("kernel_genet12_selftest", 1)[1]
assert "kernel_enter_el0_and_wait" not in after
assert "kernel_socket_selftest" not in after
assert "kernel_genet33_selftest" in after