DF-2409 / panic.txt
Fatal trap 9: general protection fault while in kernel mode
Stopped at tpm20_discard_buffer+0x3d: movq $0,(%rcx)
Sequence (production code, /dev/tpm0 made by production tpm20_init):
sysctl kern.dfhwgo=t20_setup -> tpm20_init() -> /dev/tpm0 (0600)
open("/dev/tpm0"), write(fd, 32 bytes), close()
-> production tpm20_write: transmit ok -> callout_reset(
&sc->discard_buffer_callout, 500ms, tpm20_discard_buffer, sc)
sysctl t20_snapshot -> rig saves sc bytes
sysctl t20_release_canary -> PRODUCTION tpm20_release(sc)
(frees sc->buf, lockuninit, cv_destroy, destroy_dev; NEVER
drains discard_buffer_callout) + kfree(sc) + immediate
same-size kmalloc resurrect at the same address with the
saved bytes and sc->buf = 0x4141414141414141
~500 ms after the write: the stale callout fires into the freed
chunk -> tpm20_discard_buffer runs -> memset(sc->buf = canary) ->
non-canonical store -> #GP at the memset instruction.
Root cause: tpm20.c:199-213 tpm20_release has no
callout_stop/callout_drain(&sc->discard_buffer_callout) (the harvest
callout IS drained under #ifdef TPM_HARVEST); tpm20_write arms it at
tpm20.c:144-146.