Commit d197fdbc authored by Alexey Kardashevskiy's avatar Alexey Kardashevskiy Committed by Andreas Färber
Browse files

target-ppc: Reset SPRs on CPU reset



This resets SPR values to defaults on CPU reset. This should help
with little-endian guests reboot issues.

Signed-off-by: default avatarAlexey Kardashevskiy <aik@ozlabs.ru>
Reviewed-by: default avatarGreg Kurz <gkurz@linux.vnet.ibm.com>
Signed-off-by: default avatarAndreas Färber <afaerber@suse.de>
parent 7aaf4957
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -334,6 +334,7 @@ struct ppc_spr_t {
    void (*hea_write)(void *opaque, int spr_num, int gpr_num);
#endif
    const char *name;
    target_ulong default_value;
#ifdef CONFIG_KVM
    /* We (ab)use the fact that all the SPRs will have ids for the
     * ONE_REG interface will have KVM_REG_PPC to use 0 as meaning,
+11 −1
Original line number Diff line number Diff line
@@ -631,7 +631,7 @@ static inline void _spr_register(CPUPPCState *env, int num,
#if defined(CONFIG_KVM)
    spr->one_reg_id = one_reg_id,
#endif
    env->spr[num] = initial_value;
    env->spr[num] = spr->default_value = initial_value;
}

/* Generic PowerPC SPRs */
@@ -8381,6 +8381,7 @@ static void ppc_cpu_reset(CPUState *s)
    PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
    CPUPPCState *env = &cpu->env;
    target_ulong msr;
    int i;

    pcc->parent_reset(s);

@@ -8434,6 +8435,15 @@ static void ppc_cpu_reset(CPUState *s)
    env->dtl_size = 0;
#endif /* TARGET_PPC64 */

    for (i = 0; i < ARRAY_SIZE(env->spr_cb); i++) {
        ppc_spr_t *spr = &env->spr_cb[i];

        if (!spr->name) {
            continue;
        }
        env->spr[i] = spr->default_value;
    }

    /* Flush all TLBs */
    tlb_flush(s, 1);
}