diff options
Diffstat (limited to 'target/ppc')
-rw-r--r-- | target/ppc/mmu-hash64.h | 2 | ||||
-rw-r--r-- | target/ppc/mmu_helper.c | 6 |
2 files changed, 7 insertions, 1 deletions
diff --git a/target/ppc/mmu-hash64.h b/target/ppc/mmu-hash64.h index 9c74823f92..54f1e37655 100644 --- a/target/ppc/mmu-hash64.h +++ b/target/ppc/mmu-hash64.h @@ -56,7 +56,7 @@ void ppc_hash64_update_rmls(CPUPPCState *env); * Hash page table definitions */ -#define SDR_64_HTABORG 0xFFFFFFFFFFFC0000ULL +#define SDR_64_HTABORG 0x0FFFFFFFFFFC0000ULL #define SDR_64_HTABSIZE 0x000000000000001FULL #define HPTES_PER_GROUP 8 diff --git a/target/ppc/mmu_helper.c b/target/ppc/mmu_helper.c index 3bc80303e9..a1af3d6bf2 100644 --- a/target/ppc/mmu_helper.c +++ b/target/ppc/mmu_helper.c @@ -2007,8 +2007,14 @@ void ppc_store_sdr1(CPUPPCState *env, target_ulong value) assert(!cpu->vhyp); #if defined(TARGET_PPC64) if (env->mmu_model & POWERPC_MMU_64) { + target_ulong sdr_mask = SDR_64_HTABORG | SDR_64_HTABSIZE; target_ulong htabsize = value & SDR_64_HTABSIZE; + if (value & ~sdr_mask) { + error_report("Invalid bits 0x"TARGET_FMT_lx" set in SDR1", + value & ~sdr_mask); + value &= sdr_mask; + } if (htabsize > 28) { error_report("Invalid HTABSIZE 0x" TARGET_FMT_lx" stored in SDR1", htabsize); |