hw/i386/x86: Fix PIC interrupt handling if APIC is globally disabled
commitc2e6d7d8e7fc270a90c61944ef36574b1549ddcf
authorBernhard Beschow <shentey@gmail.com>
Sat, 6 Jan 2024 13:25:45 +0000 (6 14:25 +0100)
committerMichael S. Tsirkin <mst@redhat.com>
Wed, 14 Feb 2024 11:09:32 +0000 (14 06:09 -0500)
treee55ab08a42f1b4df45b5561742419d3578be175b
parentf22f3a92eb728497dcd0f43e31b9148992db99bd
hw/i386/x86: Fix PIC interrupt handling if APIC is globally disabled

QEMU populates the apic_state attribute of x86 CPUs if supported by real
hardware or if SMP is active. When handling interrupts, it just checks whether
apic_state is populated to route the interrupt to the PIC or to the APIC.
However, chapter 10.4.3 of [1] requires that:

  When IA32_APIC_BASE[11] is 0, the processor is functionally equivalent to an
  IA-32 processor without an on-chip APIC.

This means that when apic_state is populated, QEMU needs to check for the
MSR_IA32_APICBASE_ENABLE flag in addition. Implement this which fixes some
real-world BIOSes.

[1] Intel 64 and IA-32 Architectures Software Developer's Manual, Vol. 3A:
    System Programming Guide, Part 1

Signed-off-by: Bernhard Beschow <shentey@gmail.com>
Message-Id: <20240106132546.21248-3-shentey@gmail.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
hw/i386/x86.c
hw/intc/apic_common.c
include/hw/i386/apic.h