⬢ DragonFlyBSD Kernel Audit
DF-5431 / env.txt
← back to finding ↓ download raw
# Shared environment for DF-5430..DF-5433 (acpi_madt.c pass-2 verification)

Host rig:
  QEMU emulator version 7.2.22 (Debian 1:7.2.0+dfsg-7+deb12u18), KVM
  dfbsd-qemu/vm.sh lifecycle; -enable-kvm -m 4096 -smp 6, serial -> boot.log
  QEMU monitor at dfbsd-qemu/boot-mon.sock (physical memory dumps via `xp`)

Guest kernel builds used (both stock X86_64_GENERIC, INVARIANTS enabled —
sys/config/X86_64_GENERIC:56):
  A: DragonFly 6.5-DEVELOPMENT #0: Thu Jul  2 06:02:54 UTC 2026
     root@dfbsd:/usr/obj/usr/src/sys/X86_64_GENERIC   ("with-src" snapshot)
  B: DragonFly v6.5.0.1712.g89e6a-DEVELOPMENT #1: Mon Jun 29 14:18:01 UTC 2026
     root@ephemeral-5c2002c44b6c:/usr/obj/usr/src/sys/X86_64_GENERIC
                                                ("clean-install" snapshot)

Injection vector (all findings):
  /boot/loader.conf:  hint.acpi.0.rsdp=0x40000000
    -> sdt_probe() kenv path, sys/platform/pc64/acpica/acpi_sdt.c:71
       (NO signature / checksum validation on the hinted RSDP)
  QEMU:  -device loader,file=<blob>,addr=0x40000000,force-raw=on
  blob:  RSDP(rev0)->RSDT(1 entry)->MADT, see gen_madt.py
  NOTE:  QEMU -acpitable does NOT work: it appends after built-in tables and
         sdt_search_xsdt() takes the FIRST signature match (acpi_sdt.c:211-221),
         so the built-in MADT shadows the injected one. The kenv-hint +
         loader-device rig replaces the whole ACPI root instead.

Baseline (unmodified) guest: 6 vCPUs, madt_lapic_probe: lapic_count=6,
"ACPI CPUS = 6", real MADT from BOCHS RSDP @0xF59A0.

Rig artifacts (present in ALL injected boots incl. healthy control, AFTER
the stages under test): `fadt_probe: can't locate FADT` and a late DDB stop
in AcpiTbLoadNamespace (minimal injected RSDT lacks FADT/DSDT). All four
findings manifest strictly earlier (SI_BOOT2_PRESMP / IOAPIC / START_APS).

Scenario kernels:
  control      -> DF pack ../DF-5430 (rig validation): full MADT->SMP path OK
  bsp_omit     -> run.log (kernel A), run.2.log (kernel B)
  ioapic_overlap -> run.log (kernel B)
  fake_ioapic  -> run.log (kernel B), run.3.log (kernel A = fix baseline)
  dup_cpu      -> run.log (kernel B)