If KVM is too old to support XIVE native exploitation mode, we might end up using the emulated XIVE after CAS. This is sub-optimal if KVM in-kernel XICS is available, which is the case most of the time.
Also, an old KVM may not allow to destroy and re-create the KVM XICS, which is precisely what "dual" does during machine reset. This causes QEMU to try to switch to emulated XICS and to crash because RTAS call de-registration isn't handled correctly. We could possibly fix that, but again we would still end up with an emulated XICS or XIVE. "dual" is definitely not a good choice with older KVMs. Internally force XICS when we detect this. Signed-off-by: Greg Kurz <gr...@kaod.org> --- hw/ppc/spapr_irq.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/hw/ppc/spapr_irq.c b/hw/ppc/spapr_irq.c index 3156daf09381..d788bd662a7a 100644 --- a/hw/ppc/spapr_irq.c +++ b/hw/ppc/spapr_irq.c @@ -18,6 +18,7 @@ #include "hw/ppc/xics_spapr.h" #include "cpu-models.h" #include "sysemu/kvm.h" +#include "kvm_ppc.h" #include "trace.h" @@ -668,6 +669,15 @@ static void spapr_irq_check(SpaprMachineState *spapr, Error **errp) return; } } + + /* + * KVM may be too old to support XIVE, in which case we'd rather try + * to use the in-kernel XICS instead of the emulated XIVE. + */ + if (kvm_enabled() && !kvmppc_has_cap_xive() && + spapr->irq == &spapr_irq_dual) { + spapr->irq = &spapr_irq_xics; + } } /*