Incorrect MAS1_TSIZE_SHIFT in ppce500_spin.c causes incorrectly sized TLB.
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
QEMU |
Fix Released
|
Undecided
|
Unassigned |
Bug Description
When e500 PPC is booted multi-core, the non-boot cores are started via
the spin table. ppce500_
mmubooke_
the created TLB entry is only 256KB.
The root cause is that the function computing the size of the TLB
entry, namely booke206_
by latter PPC cores, specifically n to the power of FOUR * 1KB. The
result is then used by mmubooke_
MAS1_TSIZE_SHIFT, but MAS1_TSIZE_SHIFT is defined assuming TLB entries
are n to the power of TWO * 1KB. I.e., a difference of shift=7 or
shift=8.
Simply changing MAS1_TSIZE_SHIFT from 7 to 8 is not appropriate since
the macro is used elsewhere.
Removing the ">>1" from:
> static inline hwaddr booke206_
> {
> return ctz32(size >> 10) >> 1;
and adding an appropriate comment is what I used as a work around:
> static inline hwaddr booke206_
> {
> // resulting size is based on MAS1_TSIZE_SHIFT=7 TLB size.
> return ctz32(size >> 10);
Patch accepted.
Commit title is:
Eliminate redundant and incorrect function booke206_ page_size_ to_tlb