Port-arm archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: Cache aliasing on >32k VIPT caches




On Aug 25, 2008, at 5:54 AM, Imre Deak wrote:

Hi all,

according to the ARMv6 TRM:

1. If multiple Virtual Addresses are mapped onto the same physical address then for all mappings, bits [13:12] of the Virtual Addresses must be equal and the same as bits [13:12] of the physical address. Imposing this requirement on the virtual
   addresses is sometimes called page coloring.
The same physical address can be mapped by TLB entries of different page sizes,
   including page sizes over 4KB.

This is used when mapping large pages and sections by mem(4). I recently added
support to do that.

2. Alternatively, if all mappings to a physical address are of a page size equal to 4KB, then the restriction that bits[13:12] of the Virtual Address must equal bits[13:12] of the physical address is not necessary. Bits [13:12] of all Virtual
   Address aliases must still be equal.



So based on the above at the least we should adhere to 2., I'm guessing that right now there isn't any case where we need 1. The current pmap code only considers bit 12 to distinguish between colors, does this need to be corrected? As far as I understand only bit 12 is significant for picking the cache index and thus color, which would make the current code correct, but then again the TRM might just know
better..

                                    __BIT(9 + CPU_CT_xSIZE_SIZE(isize)
                                          - CPU_CT_xSIZE_ASSOC(isize))
                                    - PAGE_SIZE;

The code as it exists is correct.

For 16KB/32KB/64KB, CPU_CT_xSIZE_SIZE(isize) is 0b101 (5) / 0b110 (6) / 0b111 (6).
CPU_CT_xSIZE_ASSOC(size) is always 0b010 (2).

So the __BIT() expression is __BIT(12), __BIT(13), __BIT(14), respectively.

Which gives a mask of 0, PAGE_SIZE, 3*PAGE_SIZE respectively.

For both 16KB and 64KB we use the right value, so why doesn't 32KB use
3*PAGE_SIZE as well?  It has to do with cache organization...

Each cache line is 32 bytes and we have 4 ways, so that gives us 128 sets for 16KB. Note that 16KB doesn't need page coloring so it must be able map each
address to its unique (set, way).

Now 64KB needs 512 sets or 4x128 sets. The page color is used to determine which of the four 128-entry sets to place the cache entry. That's why it
needs to be matched.

But 32KB only has 256 or 2x128 sets. So there are only two possibilities for the page color. So while we could use 4 page colors, there is no reason since the upper bit will be ignored. That will just result in additional cache
flushing to no real effect.





Home | Main Index | Thread Index | Old Index