On 23.01.2012, at 19:49, Scott Wood <scottw...@freescale.com> wrote:
> On 01/23/2012 12:41 PM, Alexander Graf wrote:
>>>> For tlb0 on e500 and derivatives, tsize is explicitly documented as
>>>> ignored. Software may rely on this.
>>> Yup, that's why there's the check for TLBnCG_AVAIL, which indicates that
>>> a TLB has dynamic page size capabilities, which TLB0 does not have.
>> Silly me, thinking "avail" meant "this TLB is available" instead of
>> looking up the actual meaning. :-P
>
> But where do we fill in the size if TLBnCFG_AVAIL is not set? If this
> is TLB0 on e500, we can't trust that the target code provided a valid
> size -- we need to force to 4K.
TLB0 has min=max=4k :)
>
>>> Where do we check whether the TLB exists at all?
>>
>> We don't. Eventually TLB access goes through:
>>
>> static inline ppcmas_tlb_t *booke206_get_tlbm(CPUState *env, const int
>> tlbn,
>> target_ulong ea, int way)
>> {
>> int r;
>> uint32_t ways = booke206_tlb_ways(env, tlbn);
>> int ways_bits = ffs(ways) - 1;
>> int tlb_bits = ffs(booke206_tlb_size(env, tlbn)) - 1;
>> int i;
>>
>> way &= ways - 1;
>> ea >>= MAS2_EPN_SHIFT;
>> ea &= (1 << (tlb_bits - ways_bits)) - 1;
>> r = (ea << ways_bits) | way;
>>
>> /* bump up to tlbn index */
>> for (i = 0; i < tlbn; i++) {
>> r += booke206_tlb_size(env, i);
>> }
>>
>> return &env->tlb.tlbm[r];
>> }
>>
>> Since unavailable TLBs have ways set to 0 and tlb_size is 0, we always
>> end up with the last TLB entry that's available.
>
> I think you end up with the first entry beyond the end of the array,
> actually.
Yikes. Yeah :(
>
>> So if you do a tlbwe on tlbn=5 on TLB2, you write to the last entry of
>> TLB1. Which actually is fine according to the spec:
>>
>> If an invalid value is specified for MAS0TLBSEL
>> MAS0ESEL or MAS2EPN, either no TLB entry is written
>> by the tlbwe, or the tlbwe is performed as if some
>> implementation-dependent, valid value were substi-
>> tuted for the invalid value, or an Illegal Instruction
>> exception occurs.
>>
>> We substitute it with a valid value :)
>
> Even if I'm reading it wrong and you do somehow end up with the last
> element of the array, how do you know it's valid to write this entry
> there? You haven't been checking that array's page size restrictions,
> or way/set geometry.
True. Maybe we should just always reserve a surplus TLB entry and have the
current code work, basically making it be a nop?
Or we could add checks everywhere...
Alex
>
> -Scott
>