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 @@ -1587,6 +1587,18 @@ struct Application {
uartPutDec(UInt64(kernel_genet31_restore()))
uartPuts("\n")

// Runtime V136: UMAC TX MIB reset. UART token only.
// No boot event emit. No DMA / unpark. No EL0 enter after GENET.
uartPuts("runtime v136: GENET UMAC MIB reset\n")
let genet32_ok_boot = kernel_genet32_selftest()
uartPuts("genet32 ok=")
uartPutDec(UInt64(genet32_ok_boot))
uartPuts(" version=136 rst=")
uartPutDec(UInt64(kernel_genet32_rst()))
uartPuts(" zero=")
uartPutDec(UInt64(kernel_genet32_zero()))
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"
"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"

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

func printGenet32() {
_ = kernel_genet32_selftest()
uartPuts("genet32 ok=")
uartPutDec(UInt64(kernel_genet32_ok()))
uartPuts(" version=136 rst=")
uartPutDec(UInt64(kernel_genet32_rst()))
uartPuts(" zero=")
uartPutDec(UInt64(kernel_genet32_zero()))
uartPuts("\n")
}

func printPoolName(_ pool: UInt32) {
var i: UInt32 = 0
let n = kernel_pool_name_len(pool)
Expand Down Expand Up @@ -4052,6 +4063,8 @@ func dispatchShellCommand(_ commandStart: UInt32, _ commandLen: UInt32, _ reques
printGenet30()
} else if shellBufferSliceEquals(commandStart, commandLen, "genet31") {
printGenet31()
} else if shellBufferSliceEquals(commandStart, commandLen, "genet32") {
printGenet32()
} 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 @@ -1567,6 +1567,12 @@ int kernel_genet31_ok(void);
unsigned int kernel_genet31_hfb(void);
unsigned int kernel_genet31_restore(void);

// V136: UMAC_MIB_CTRL TX reset + zeroed counters. No DMA. No EL0.
int kernel_genet32_selftest(void);
int kernel_genet32_ok(void);
unsigned int kernel_genet32_rst(void);
unsigned int kernel_genet32_zero(void);

// V80: BSC1 + SPI0 register probe. Read-only. No boot event emit.
int kernel_i2c_selftest(void);
int kernel_i2c_ok(void);
Expand Down
57 changes: 57 additions & 0 deletions Sources/Support/kernel_genet.c
Original file line number Diff line number Diff line change
Expand Up @@ -4932,3 +4932,60 @@ int kernel_genet31_selftest(void) {
int kernel_genet31_ok(void) { return genet31_ok_val; }
unsigned int kernel_genet31_hfb(void) { return genet31_hfb_val; }
unsigned int kernel_genet31_restore(void) { return genet31_restore_val; }

// V136: UMAC TX MIB reset. Pulse UMAC_MIB_CTRL UMAC_MIB_RESET_TX
// (Linux bcmgenet_mib_init), require leftover tx.pok/tx.bytes
// non-zero (non-vacuous), then counters == 0 after reset+clear.
// Unused MIB control — not an RBUF/TBUF/HFB enable writeback,
// not TX csum / 64B status blocks. No DMA. No EL0. UART token only.
#define UMAC_MIB_CTRL (UMAC_OFF + 0x580U)
#define UMAC_MIB_RESET_TX 0x4U

int kernel_genet32_selftest(void);

static int genet32_probed;
static int genet32_ok_val;
static unsigned int genet32_rst_val;
static unsigned int genet32_zero_val;

int kernel_genet32_selftest(void) {
uint32_t pok0;
uint32_t bytes0;
uint32_t pok1;
uint32_t bytes1;
uint32_t saved;

if (genet32_probed) return genet32_ok_val;
genet32_probed = 1;
genet32_ok_val = 0;
genet32_rst_val = 0;
genet32_zero_val = 0;

if (!kernel_genet_selftest()) return 0;

pok0 = G32(UMAC_MIB_TX_POK);
bytes0 = G32(UMAC_MIB_TX_BYTES);
if (pok0 == 0xDEADDEADU || pok0 == 0xFFFFFFFFU) return 0;
if (bytes0 == 0xDEADDEADU || bytes0 == 0xFFFFFFFFU) return 0;
// Non-vacuity: leftover TX MIB must show prior work (V125+).
if (pok0 == 0U && bytes0 == 0U) return 0;

saved = G32(UMAC_MIB_CTRL);
if (saved == 0xDEADDEADU || saved == 0xFFFFFFFFU) return 0;

genet_wr32(UMAC_MIB_CTRL, saved | UMAC_MIB_RESET_TX);
genet_wr32(UMAC_MIB_CTRL, saved & ~UMAC_MIB_RESET_TX);
if (G32(UMAC_MIB_CTRL) != (saved & ~UMAC_MIB_RESET_TX)) return 0;
genet32_rst_val = 1;

pok1 = G32(UMAC_MIB_TX_POK);
bytes1 = G32(UMAC_MIB_TX_BYTES);
if (pok1 != 0U || bytes1 != 0U) return 0;
genet32_zero_val = 1;
genet32_ok_val = 1;
return 1;
}

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; }
1 change: 1 addition & 0 deletions docs/ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,7 @@ Turn the static identity-map MMU into a real virtual-memory system and run code
- [x] V133 RBUF RXCHK after GENET (`genet29 ok=1 version=133 rxchk=`). Fail-closed `RBUF_CHK_CTRL` bit-0 clear/set + leftover restore; no DMA; no EL0. Not a UMAC poke or TX csum / 64B-descriptor clone.
- [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.
- 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 @@ -485,6 +485,8 @@ PY
&& printf '%s' "$serial_delta" | grep -qa "genet30 ok=1 version=134 eee=" \
&& printf '%s' "$serial_delta" | grep -qa "runtime v135: GENET HFB enable" \
&& 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 "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 @@ -798,6 +800,8 @@ PY
probe_shell "genet30" "^genet30 ok=1 version=134 eee="
# V135: HFB enable program+readback. No DMA. No EL0.
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="
# 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 @@ -345,6 +345,8 @@ while [ "$SECONDS" -lt "$deadline" ]; do
&& printf '%s' "$serial_delta" | grep -q "genet30 ok=1 version=134 eee=" \
&& printf '%s' "$serial_delta" | grep -q "runtime v135: GENET HFB enable" \
&& 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 "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
85 changes: 85 additions & 0 deletions tests/test_runtime_genet_v136_contract.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
"""EPIC F V136: GENET UMAC TX MIB reset. 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_genet32_umac_mib_reset_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_genet32_selftest" in genet
g32 = genet.split("kernel_genet32_selftest", 1)[1]
body32 = _selftest_body(genet, "kernel_genet32_selftest")
assert "UMAC_MIB_CTRL" in genet
assert "UMAC_MIB_RESET_TX" in genet
assert "UMAC_MIB_CTRL" in body32
assert "UMAC_MIB_RESET_TX" in body32
assert "UMAC_MIB_TX_POK" in body32
assert "UMAC_MIB_TX_BYTES" in body32
assert "kernel_genet_selftest" in body32
assert "HFB_FLT_ENABLE" not in body32
assert "HFB_FLT0_EN" not in body32
assert "RBUF_HFB_EN" not in body32
assert "TBUF_ENERGY_CTRL" not in body32
assert "TBUF_EEE_EN" not in body32
assert "RBUF_CHK_CTRL" not in body32
assert "RBUF_RXCHK_EN" not in body32
assert "UMAC_MDF_CTRL" not in body32
assert "UMAC_MAX_FRAME_LEN" not in body32
assert "CMD_PROMISC" not in body32
assert "DMA_TX_DO_CSUM" not in body32
assert "RBUF_64B_EN" not in body32
assert "MII_BMSR" not in body32
assert "BMSR_LSTATUS" not in body32
assert "MII_BMCR" not in body32
assert "kernel_genet13_selftest" not in body32
assert "kernel_genet21_selftest" not in body32
assert "genet10_unpark" not in body32
assert "genet10_park" not in body32
assert "GIC" not in g32
assert "kernel_enter_el0_and_wait" not in g32
assert "kernel_event_emit" not in g32
assert "watchdog_reset_now" not in g32
assert "M-SEARCH" not in g32
assert "HTTP/1.0" not in g32
assert "200000" not in genet
assert "static unsigned long alloc_dma" not in genet
assert "int kernel_genet32_selftest(void);" in support
assert 'uartPuts("runtime v136: GENET UMAC MIB reset\\n")' in app
assert 'uartPuts("genet32 ok=")' in app
assert "kernel_event_emit(KERNEL_EVENT_KIND_SELFTEST, 136" not in app
assert "func printGenet32()" in shell
assert 'shellBufferSliceEquals(commandStart, commandLen, "genet32")' in shell
assert ",genet31,genet32" in shell
assert 'grep -qa "genet32 ok=1 version=136 rst="' in iterate
assert 'probe_shell "genet32" "^genet32 ok=1 version=136 rst="' in iterate
assert "V136 UMAC TX MIB reset" in roadmap
assert "CONFIG.TXT" not in g32
assert "AETHER.TMP" not in g32
assert "ping -c 2" in iterate
assert "SOCK_STREAM" in iterate
assert "sched12" in iterate
assert "kernel_genet32_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_genet32_selftest" in after