mirror of https://github.com/xemu-project/xemu.git
target-ppc: move sdr1 value change detection logic to helper_store_sdr1()
Otherwise when cpu_post_load calls ppc_store_sdr1() when restoring a VM snapshot the value is deemed unchanged and so the internal env->htab* variables aren't set correctly. Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
6cb577dde5
commit
2828c4cd92
|
@ -77,8 +77,13 @@ void helper_msr_facility_check(CPUPPCState *env, uint32_t bit,
|
||||||
|
|
||||||
void helper_store_sdr1(CPUPPCState *env, target_ulong val)
|
void helper_store_sdr1(CPUPPCState *env, target_ulong val)
|
||||||
{
|
{
|
||||||
|
PowerPCCPU *cpu = ppc_env_get_cpu(env);
|
||||||
|
|
||||||
if (!env->external_htab) {
|
if (!env->external_htab) {
|
||||||
|
if (env->spr[SPR_SDR1] != val) {
|
||||||
ppc_store_sdr1(env, val);
|
ppc_store_sdr1(env, val);
|
||||||
|
tlb_flush(CPU(cpu), 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2036,11 +2036,8 @@ void ppc_tlb_invalidate_one(CPUPPCState *env, target_ulong addr)
|
||||||
/* Special registers manipulation */
|
/* Special registers manipulation */
|
||||||
void ppc_store_sdr1(CPUPPCState *env, target_ulong value)
|
void ppc_store_sdr1(CPUPPCState *env, target_ulong value)
|
||||||
{
|
{
|
||||||
PowerPCCPU *cpu = ppc_env_get_cpu(env);
|
|
||||||
|
|
||||||
qemu_log_mask(CPU_LOG_MMU, "%s: " TARGET_FMT_lx "\n", __func__, value);
|
qemu_log_mask(CPU_LOG_MMU, "%s: " TARGET_FMT_lx "\n", __func__, value);
|
||||||
assert(!env->external_htab);
|
assert(!env->external_htab);
|
||||||
if (env->spr[SPR_SDR1] != value) {
|
|
||||||
env->spr[SPR_SDR1] = value;
|
env->spr[SPR_SDR1] = value;
|
||||||
#if defined(TARGET_PPC64)
|
#if defined(TARGET_PPC64)
|
||||||
if (env->mmu_model & POWERPC_MMU_64) {
|
if (env->mmu_model & POWERPC_MMU_64) {
|
||||||
|
@ -2060,8 +2057,6 @@ void ppc_store_sdr1(CPUPPCState *env, target_ulong value)
|
||||||
env->htab_mask = ((value & SDR_32_HTABMASK) << 16) | 0xFFFF;
|
env->htab_mask = ((value & SDR_32_HTABMASK) << 16) | 0xFFFF;
|
||||||
env->htab_base = value & SDR_32_HTABORG;
|
env->htab_base = value & SDR_32_HTABORG;
|
||||||
}
|
}
|
||||||
tlb_flush(CPU(cpu), 1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Segment registers load and store */
|
/* Segment registers load and store */
|
||||||
|
|
Loading…
Reference in New Issue