Commit 66d5c492 authored by David Gibson's avatar David Gibson
Browse files

pseries: Reset CPU compatibility mode



Currently, the CPU compatibility mode is set when the cpu is initialized,
then again when the guest negotiates features.  This means if a guest
negotiates a compatibility mode, then reboots, that compatibility mode
will be retained across the reset.

Usually that will get overridden when features are negotiated on the next
boot, but it's still not really correct.  This patch moves the initial set
up of the compatibility mode from cpu init to reset time.  The mode *is*
retained if the reboot was caused by the feature negotiation (it might
be important in that case, though it's unlikely).

Signed-off-by: default avatarDavid Gibson <david@gibson.dropbear.id.au>
Reviewed-by: default avatarAlexey Kardashevskiy <aik@ozlabs.ru>
Reviewed-by: default avatarMichael Roth <mdroth@linux.vnet.ibm.com>
Tested-by: default avatarAndrea Bolognani <abologna@redhat.com>
parent 7843c0d6
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -1346,6 +1346,8 @@ static void ppc_spapr_reset(void)
    if (!spapr->cas_reboot) {
        spapr_ovec_cleanup(spapr->ov5_cas);
        spapr->ov5_cas = spapr_ovec_new();

        ppc_set_compat_all(spapr->max_compat_pvr, &error_fatal);
    }

    fdt = spapr_build_fdt(spapr, rtas_addr, spapr->rtas_size);
+0 −10
Original line number Diff line number Diff line
@@ -118,16 +118,6 @@ static void spapr_cpu_init(sPAPRMachineState *spapr, PowerPCCPU *cpu,
    /* Enable PAPR mode in TCG or KVM */
    cpu_ppc_set_papr(cpu, PPC_VIRTUAL_HYPERVISOR(spapr));

    if (spapr->max_compat_pvr) {
        Error *local_err = NULL;

        ppc_set_compat(cpu, spapr->max_compat_pvr, &local_err);
        if (local_err) {
            error_propagate(errp, local_err);
            return;
        }
    }

    qemu_register_reset(spapr_cpu_reset, cpu);
    spapr_cpu_reset(cpu);
}