sk_v4_grow.c's dev_rw4k computes 1 KiB block numbers as (uint32_t)devblock * 4, which wraps past 4 TiB; Artemis is capped at 256 GiB (STICK_ARTEMIS_CAP_GIB, kernel/Makefile), so it is latent -- but nothing said so where the cast is. Now a compile-time check there (the C99 negative-array pattern the tree uses): a cap past 4 TiB stops the build, and a cap not defined at all is an #error, not a skipped check. gpt.c's casts are bounded by the disk's own size, itself a 32-bit count of 1 KiB blocks, checked before each: each now says so. kernel/tests' check_cap, seen to fail first (a 4096 GiB cap built); now 3 checks, 0 failures -- 256 GiB builds, 4096 GiB and none refused. Built for amd64, aarch64, riscv64. The plan's increments 2 and 3 marked. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017RzZgrf7V7Zk2iczBXDRbm
2.8 KiB
2.8 KiB
Kernel host tests -- plan and progress (kept current, one line per increment)
Captain Bob, 2026-11-12: "Build an appropriate test harness! Love the idea." -- for the kernel's own
C code, so that a defect QEMU cannot provoke (a USB descriptor no emulated device sends, a write that
fails half-way, a stop that spins) is still tested first and seen to fail. v4 has had this since step
1 (make -C v4 test); the kernel had none.
The design (my calls, open to a ruling)
kernel/tests/, one program per kernel source under test:test_<unit>.ccompiled on the host with the kernel's own source file,-std=c99 -Wall -Wextra -Werror, and nothing else of the kernel.make -C kernel/tests testbuilds and runs them all; each printsN checks, M failuresas v4's do, and the run fails if any does.- Fakes, not mocks (
kernel/tests/fakes.[ch]): the console captured line by line (so a test reads what the kernel said), a deterministic RNG, and a RAM disk whose reads or writes fail at the 1 KiB blocks a test chooses -- the disk faults QEMU's blkdebug gives the boots, here per block and without a boot. - Code is moved only to be testable, never changed in the move. Where a unit is buried in a larger function (the xHCI configuration-descriptor walk inside the event loop), it is moved out into a function of its own in one commit, the boots and the tests unchanged, and then tested.
- Not a substitute for acceptance. The boots stay the only acceptance of the kernel; these run
beside them. Whether they become a stage of the protocol and the PR's gate (
nightly.sh kernel-tests, after test-32) is to rule -- proposed once there are enough tests to matter.
Increments
- 1. The harness (
Makefile,harness.h,fakes.[ch]) andtest_gpt.c:gpt_readandgpt_write_oneagainst a RAM disk -- a valid table; more used entries thanmax(#180); an entry out of range pastmax(#180); the first write failing and a later one failing (#168). Seen to fail againstgpt.cas it was before #168 and #180 (54311be1~1): 12 checks, 4 failures -- each of the two defects caught. Now: 0 failures. - 2. The xHCI configuration-descriptor walk moved out of the event loop (
usb_config.c,test_usb_config), then #170 and #171 tested first (10 failures against the old decision) and fixed. - 3. #176 (seeds wiped on every exit) -- the approach to rule. [x] #177 (the fatal stops halt:
sk_v4_stop.c,test_sk_v4_stop, a spin seen failing). [x] #178 (the slot array:sk_v4_slots.c,test_sk_v4_slots, 4 failures against the old allocation). [x] #182 (the cap checked at compile time:check_cap, a 4 TiB cap seen building before). - 4. #179 once #187 is ruled (the block layer's header read).
- 5. To rule: the kernel tests as a protocol stage and in the gate.