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)
|
||||
{
|
||||
PowerPCCPU *cpu = ppc_env_get_cpu(env);
|
||||
|
||||
if (!env->external_htab) {
|
||||
ppc_store_sdr1(env, val);
|
||||
if (env->spr[SPR_SDR1] != val) {
|
||||
ppc_store_sdr1(env, val);
|
||||
tlb_flush(CPU(cpu), 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2036,31 +2036,26 @@ void ppc_tlb_invalidate_one(CPUPPCState *env, target_ulong addr)
|
||||
/* Special registers manipulation */
|
||||
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);
|
||||
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 (env->mmu_model & POWERPC_MMU_64) {
|
||||
target_ulong htabsize = value & SDR_64_HTABSIZE;
|
||||
if (env->mmu_model & POWERPC_MMU_64) {
|
||||
target_ulong htabsize = value & SDR_64_HTABSIZE;
|
||||
|
||||
if (htabsize > 28) {
|
||||
fprintf(stderr, "Invalid HTABSIZE 0x" TARGET_FMT_lx
|
||||
" stored in SDR1\n", htabsize);
|
||||
htabsize = 28;
|
||||
}
|
||||
env->htab_mask = (1ULL << (htabsize + 18 - 7)) - 1;
|
||||
env->htab_base = value & SDR_64_HTABORG;
|
||||
} else
|
||||
#endif /* defined(TARGET_PPC64) */
|
||||
{
|
||||
/* FIXME: Should check for valid HTABMASK values */
|
||||
env->htab_mask = ((value & SDR_32_HTABMASK) << 16) | 0xFFFF;
|
||||
env->htab_base = value & SDR_32_HTABORG;
|
||||
if (htabsize > 28) {
|
||||
fprintf(stderr, "Invalid HTABSIZE 0x" TARGET_FMT_lx
|
||||
" stored in SDR1\n", htabsize);
|
||||
htabsize = 28;
|
||||
}
|
||||
tlb_flush(CPU(cpu), 1);
|
||||
env->htab_mask = (1ULL << (htabsize + 18 - 7)) - 1;
|
||||
env->htab_base = value & SDR_64_HTABORG;
|
||||
} else
|
||||
#endif /* defined(TARGET_PPC64) */
|
||||
{
|
||||
/* FIXME: Should check for valid HTABMASK values */
|
||||
env->htab_mask = ((value & SDR_32_HTABMASK) << 16) | 0xFFFF;
|
||||
env->htab_base = value & SDR_32_HTABORG;
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user