ppc: booke206: use MAV=2.0 TSIZE definition, fix 4G pages

This definition is backward compatible with MAV=1.0 as long as
the guest does not set reserved bits in MAS1/MAS4.

Also, fix the shift in booke206_tlb_to_page_size -- it's the base
that should be able to hold a 4G page size, not the shift count.

Signed-off-by: Scott Wood <scottwood@freescale.com>
Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
Scott Wood 2011-08-18 10:38:40 +00:00 committed by Alexander Graf
parent bebabbc7aa
commit 2bd9543cd3
3 changed files with 6 additions and 5 deletions

View File

@ -174,7 +174,7 @@ out:
/* Create -kernel TLB entries for BookE, linearly spanning 256MB. */ /* Create -kernel TLB entries for BookE, linearly spanning 256MB. */
static inline target_phys_addr_t booke206_page_size_to_tlb(uint64_t size) static inline target_phys_addr_t booke206_page_size_to_tlb(uint64_t size)
{ {
return (ffs(size >> 10) - 1) >> 1; return ffs(size >> 10) - 1;
} }
static void mmubooke_create_initial_mapping(CPUState *env, static void mmubooke_create_initial_mapping(CPUState *env,

View File

@ -667,8 +667,8 @@ enum {
#define MAS0_ATSEL_TLB 0 #define MAS0_ATSEL_TLB 0
#define MAS0_ATSEL_LRAT MAS0_ATSEL #define MAS0_ATSEL_LRAT MAS0_ATSEL
#define MAS1_TSIZE_SHIFT 8 #define MAS1_TSIZE_SHIFT 7
#define MAS1_TSIZE_MASK (0xf << MAS1_TSIZE_SHIFT) #define MAS1_TSIZE_MASK (0x1f << MAS1_TSIZE_SHIFT)
#define MAS1_TS_SHIFT 12 #define MAS1_TS_SHIFT 12
#define MAS1_TS (1 << MAS1_TS_SHIFT) #define MAS1_TS (1 << MAS1_TS_SHIFT)

View File

@ -1293,7 +1293,7 @@ target_phys_addr_t booke206_tlb_to_page_size(CPUState *env, ppcmas_tlb_t *tlb)
{ {
uint32_t tlbncfg; uint32_t tlbncfg;
int tlbn = booke206_tlbm_to_tlbn(env, tlb); int tlbn = booke206_tlbm_to_tlbn(env, tlb);
target_phys_addr_t tlbm_size; int tlbm_size;
tlbncfg = env->spr[SPR_BOOKE_TLB0CFG + tlbn]; tlbncfg = env->spr[SPR_BOOKE_TLB0CFG + tlbn];
@ -1301,9 +1301,10 @@ target_phys_addr_t booke206_tlb_to_page_size(CPUState *env, ppcmas_tlb_t *tlb)
tlbm_size = (tlb->mas1 & MAS1_TSIZE_MASK) >> MAS1_TSIZE_SHIFT; tlbm_size = (tlb->mas1 & MAS1_TSIZE_MASK) >> MAS1_TSIZE_SHIFT;
} else { } else {
tlbm_size = (tlbncfg & TLBnCFG_MINSIZE) >> TLBnCFG_MINSIZE_SHIFT; tlbm_size = (tlbncfg & TLBnCFG_MINSIZE) >> TLBnCFG_MINSIZE_SHIFT;
tlbm_size <<= 1;
} }
return (1 << (tlbm_size << 1)) << 10; return 1024ULL << tlbm_size;
} }
/* TLB check function for MAS based SoftTLBs */ /* TLB check function for MAS based SoftTLBs */