When the platform and the guest agree on using the XIVE exploitation mode for interrupts, the "interrupt-controller" node needs to reflect the change and the device tree needs an update.
Reseting the guest after the CAS negotiation makes this change possible, as the device tree is built at reset time. We use the 'ov5_cas' field to check which interrupt model was negotiated before reset and populate the tree accordingly. Signed-off-by: Cédric Le Goater <c...@kaod.org> --- hw/ppc/spapr.c | 6 +++++- hw/ppc/spapr_hcall.c | 6 ++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 3e3ff1fbc988..be467ab61ad0 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -1073,7 +1073,11 @@ static void *spapr_build_fdt(sPAPRMachineState *spapr, _FDT(fdt_setprop_cell(fdt, 0, "#size-cells", 2)); /* /interrupt controller */ - spapr_dt_xics(xics_max_server_number(), fdt, PHANDLE_XICP); + if (!spapr_ovec_test(spapr->ov5_cas, OV5_XIVE_EXPLOIT)) { + spapr_dt_xics(xics_max_server_number(), fdt, PHANDLE_XICP); + } else { + /* populate device tree for XIVE */ ; + } ret = spapr_populate_memory(spapr, fdt); if (ret < 0) { diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c index 92f1e21358b8..ba00b8d3fdd6 100644 --- a/hw/ppc/spapr_hcall.c +++ b/hw/ppc/spapr_hcall.c @@ -1613,6 +1613,12 @@ static target_ulong h_client_architecture_support(PowerPCCPU *cpu, (spapr_h_cas_compose_response(spapr, args[1], args[2], ov5_updates) != 0); } + + /* We need to rebuild the device tree for XIVE, generate a reset */ + if (!spapr->cas_reboot) { + spapr->cas_reboot = spapr_ovec_test(ov5_updates, OV5_XIVE_EXPLOIT); + } + spapr_ovec_cleanup(ov5_updates); if (spapr->cas_reboot) { -- 2.13.5