Hi Philippe,
On 5/16/2025 8:08 PM, Philippe Mathieu-Daudé wrote: > Hi, > > On 16/5/25 12:05, Sairaj Kodilkar wrote: >> From: Vasant Hegde <vasant.he...@amd.com> >> >> If vCPUs > 255 then x86 common code (x86_cpus_init()) call >> kvm_enable_x2apic(). >> But if vCPUs <= 255 then the common code won't calls kvm_enable_x2apic(). >> >> This is because commit 8c6619f3e692 ("hw/i386/amd_iommu: Simplify non-KVM >> checks on XTSup feature") removed the call to kvm_enable_x2apic when xtsup >> is "on", which break things when guest is booted with x2apic mode and >> there are <= 255 vCPUs. >> >> Fix this by adding back kvm_enable_x2apic() call when xtsup=on. >> >> Fixes: 8c6619f3e692 ("hw/i386/amd_iommu: Simplify non-KVM checks on XTSup >> feature") >> Reported-by: Alejandro Jimenez <alejandro.j.jime...@oracle.com> >> Tested-by: Tested-by: Alejandro Jimenez <alejandro.j.jime...@oracle.com> >> Cc: Philippe Mathieu-Daudé <phi...@linaro.org> >> Cc: Joao Martins <joao.m.mart...@oracle.com> >> Signed-off-by: Vasant Hegde <vasant.he...@amd.com> >> Signed-off-by: Sairaj Kodilkar <sarun...@amd.com> >> --- >> hw/i386/amd_iommu.c | 8 ++++++++ >> 1 file changed, 8 insertions(+) >> >> diff --git a/hw/i386/amd_iommu.c b/hw/i386/amd_iommu.c >> index df8ba5d39ada..af85706b8a0d 100644 >> --- a/hw/i386/amd_iommu.c >> +++ b/hw/i386/amd_iommu.c >> @@ -1649,6 +1649,14 @@ static void amdvi_sysbus_realize(DeviceState *dev, >> Error **errp) >> exit(EXIT_FAILURE); >> } >> + if (s->xtsup) { > > I suppose we need: > > if (s->xtsup && kvm_enabled()) { > > otherwise that will trigger back the problem I tried to fix. > Did you try building QEMU with KVM disabled? My understanding is if KVM is disabled then kvm_irqchip_is_split() will return false and we exit on below condition check. Yes. I had tried `configure --disable-kvm` and it was built fine. -Vasant > >> + if (kvm_irqchip_is_split() && !kvm_enable_x2apic()) { >> + error_report("AMD IOMMU xtsup=on requires x2APIC support on " >> + "the KVM side"); >> + exit(EXIT_FAILURE); >> + } >> + } >> + >> pci_setup_iommu(bus, &amdvi_iommu_ops, s); >> amdvi_init(s); >> } >