exfat: the on-disk layout (S4 step 1)

The pure, host-testable byte layer of the second engine: the Main Boot
Sector (VBR) and the six 32-byte directory-entry types — Allocation
Bitmap, Up-case Table, Volume Label, File, Stream Extension, File Name —
as align(1) extern structs, plus the three exFAT checksums (boot region,
up-case table, directory-entry set), the name hash, and the packed
timestamp <-> Unix-epoch conversion.

geometryOf accepts only "EXFAT   " + 0xAA55 + an all-zero MustBeZero
region; that last guard is the mutual exclusion with FAT — a FAT prober
reads a zero bytes-per-sector there and rejects the volume, and this one
rejects a FAT boot sector for want of the exFAT name. Wire-format widths
are named consts (spec facts, no bare literals) so the bounds gate stays
green; the layout is pinned by @offsetOf/@sizeOf tests.

Wired into the host-test aggregate directly for now; it moves into the
exfat package's own test step when that lands (step 4). 7/7 host tests,
bounds green.
This commit is contained in:
Daniel Samson
2026-08-10 02:46:23 +01:00
parent 0b25cd2c94
commit 56bd2e7678
2 changed files with 450 additions and 0 deletions
+3
View File
@@ -422,6 +422,9 @@ pub fn build(b: *std.Build) void {
"system/boot-handoff.zig",
"system/abi.zig",
"system/initial-ramdisk.zig", // v2 path-named entries: find/basename/magic
// The exFAT engine's pure on-disk layer (S4), std-only, before its package
// exists — moves into the `exfat` package's own test step once that lands.
"system/services/exfat/on-disk.zig",
}) |root| {
const mod_tests = b.addTest(.{
.root_module = b.createModule(.{