ACPI MADT advertises GITS even when disabled

Host environment

  • Operating system: Linux

  • OS/kernel version: Slackware (Linux 6.14.0)

  • Architecture: Host:x86 Guest:Arm

  • QEMU flavor: qemu-system-aarch64

  • QEMU version: 9.2.3

  • QEMU command line:

    ./qemu-system-aarch64 -cpu max -M virt,virtualization=on,secure=off,gic-version=max,its=off,iommu=smmuv3

Emulated/Virtualized environment

  • Operating system: Custom OS
  • OS/kernel version: Custom Version
  • Architecture: Arm (aarch64)

Description of problem

As per the command line given above, QEMU shall emulate a GICv4 without GIC Interrupt Translation Service (GITS).

The following happens:

  • ACPI incorrectly lists a GITS (type 0xf) structure in the MADT with GITS MMIO Base = 0x8080000
  • The OS reads that structure and interprets it to mean a GITS is present at the given MMIO address
  • Subsequent access to GITS MMIO causes a data abort (0x25) because QEMU doesn't emulate a GITS (as requested)

The bug is thus that QEMU wrongly advertises GITS as present (via the MADT) when it is in fact absent.

Steps to reproduce

  1. Disable GITS emulation by passing its=off on the QEMU command line
  2. Check if a GITS structure is listed in the ACPI MADT (must be present in ACPI MADT only if GITS is enabled and absent otherwise)

Additional information

When booting with its=on (default), everything works as expected.