⬢ DragonFlyBSD Kernel Audit
DF-5616 / panic.txt
← back to finding ↓ download raw
panic.txt — harness v1 incident (NOT a finding of this audit)
=============================================================

After kldload of icuintro v1 (which called lwkt_setcpu_self(globaldata_find(0))
from the kldload process thread to "pin to CPU0"), the guest completed all
harness phases successfully and then panicked on the NEXT syscall of the
migrated thread:

  D0..P6 all printed correctly (P4 skipped in v1: MachIntrABI != ICU)
  panic with 1 spinlocks held
  panic: assertion "lp->lwp_qcpu == dd->cpuid" failed in dfly_acquire_curproc at /usr/src/sys/kern/usched_dfly.c:453
  cpuid = 0
  Trace beginning at frame 0xfffff801187bf8d8
  dfly_acquire_curproc() at dfly_acquire_curproc+0x979 0xffffffff8066ea09
  dfly_acquire_curproc() at dfly_acquire_curproc+0x979 0xffffffff8066ea09
  syscall2() at syscall2+0x288 0xffffffff80bd6b78
  Debugger("panic")
  CPU0 stopping CPUs: 0x0000003e
  Stopped at Debugger+0x7c: movb $0,0xbdaf09(%rip)
  db>

Root cause: HARNESS bug. lwkt_setcpu_self() is an internal LWKT primitive;
calling it from an arbitrary userspace process thread migrates the thread
behind usched_dfly's back and violates its lwp_qcpu bookkeeping, tripping the
scheduler's own sanity assertion on the following syscall. It is reachable
only from root-loaded kernel code (no unprivileged path), so it is not a
security finding of the kernel under audit; v2 of the harness removed the
pinning and ran clean (run.log) on a freshly reset guest.

Also visible in the v1 serial capture (before the panic) — first live
confirmation run of D0-D2/P2/P3/P5/P6, values identical to run.log:
  D0: ncpu=6 mycpuid=0 MachIntrABI.type=2 (MACHINTR_ICU=1)
  D1: icu_imen(shadow)=fffb hw_imr=fffb coherent=YES
  D2: ELCR=0c00
  P3: (uint8_t)~(1 << -1) = 0xff
  P2: irq0 mask-cycle ... persist=YES
  P5: ICU2 ICW cycle, ELCR_HI 0c -> 0c (persists across ICW)
  P6: alive, ticks delta=200 ... coherent=YES