Skip to content

Fingerprinting Drivers

A fingerprint is a canonical, diffable behavioural fingerprint of a driver: its identity, its command dialects, and its sorted pin list from a classification run. Pins are behaviour — two correct drivers can legitimately differ, which is exactly what the quirks file exists to record. What a fingerprint buys you is a baseline: a changed pin on a later run against the same driver version is a behavioural regression, something the plain pass/fail verdict alone would miss.

Using ci/fingerprint.sh

Normal use runs a 60 s classification (full matrix, including the risky tier) under Copperline and reduces the serial log to identity + dialects + sorted pins:

ci/fingerprint.sh test/a1200-scsi.toml scsi.device 0 \
    fingerprints/scsi.device-47.4-a1200-ide.txt

Extra arguments after the four positional ones go to devsoak after its defaults, so a later -r/-k/-K wins:

ci/fingerprint.sh cfg/a2091.toml scsi.device 0 \
    fingerprints/scsi.device-37.64-a2091.txt -k a2091-37-unaligned-length-hang

-k ID forces a quirk the run needs to survive (and it's recorded in the output); -r 0,1K shrinks the range for a floppy; -K runs pure driver-under-test. COPPERLINE overrides the emulator binary used.

A fingerprint is only written when the run reached a RESULT verdict; a FAIL verdict still fingerprints — the failure is part of the identity.

--from-log

Reduces an existing serial capture instead of running the emulator — for targets the --run staging can't reach, e.g. Kickstart 1.3 boot floppies:

ci/fingerprint.sh --from-log serial.log fingerprints/trackdisk.device-34.1-ks13.txt

--no-z

Drops the risky tier and single-threads (-w 1 -q 1 instead of -w 2 -q 2, no -Z), for floppy trackdisk which can't sustain the tier-3 formats or concurrent access under emulation — its tier 0–2 behaviour still fingerprints cleanly:

ci/fingerprint.sh --no-z test/a1200-floppy.toml trackdisk.device 0 \
    fingerprints/trackdisk.device-47.14-ks32.txt -r 0,220

The catalogue

fingerprints/ holds one file per (driver, version, controller). fingerprints/INDEX.md tabulates them all — driver, version, PASS/FAIL result, and identity string — and shows drift across OS versions. The worked example there is scsi.device's pins moving across Kickstart releases:

pin V37/a2091 V45/a3000 V47/ide V47/a3000
past-end-err 20 3 20
unaligned-len-err -4 -4 -4
drivetype-err -1 -3 -3 -3
bad-unit-err 50 50 50 50
flush-err 0 0 0 0

( means the test wasn't reached — V37's scsi.device predates the dialects the test needs.) V37's generic -1 errors give way to V45/V47's specific codes, and TD_GETGEOMETRY/NSD arrive at V36/V40 — visible here as pins that simply don't exist on the oldest driver.

When to commit a fingerprint

Commit a fingerprint when a driver's behaviour is expected to be stable, and let a future run diff against it. A changed pin is a behavioural regression the pass/fail verdict alone would miss — the whole point of capturing dialects and pins as data rather than only a PASS/FAIL line.