Visible to Intel only — GUID: suc1423079635713
Ixiasoft
Visible to Intel only — GUID: suc1423079635713
Ixiasoft
1.2.1.8. 754322: Faulty MMU Translations Following ASID Switch
Description
A μTLB entry might be corrupted following an ASID switch, possibly corrupting subsequent MMU translations.
This erratum requires execution of an explicit memory access that might be speculative. This type of memory access misses in the TLB and causes a translation walk. This erratum occurs when the translation table walk starts before the ASID switch code sequence, but completes after the ASID switch code sequence.
In this case, a new entry is allocated in the μTLB for the TLB entry of this translation table walk, but corresponds to the old ASID. Because the μTLB does not record the ASID value, the new MMU translation that should happen with the new ASID following the ASID switch, might hit this stale μTLB entry and become corrupted.
There is no security risk because the security state of the access is held in the μTLB and cannot be corrupted.
Impact
This erratum might cause MMU translation corruption.
Workaround
The workaround for this erratum is to add a DSB in the ASID switch code sequence. The Arm* architecture only mandates an ISB before and after the ASID switch. Adding a DSB before the ASID switch ensures that the translation table walk completes before the ASID change, so that no stale entry can be allocated in the μTLB.
Modify the examples in the Arm* Architecture Reference Manual for synchronizing the change in the ASID and TTBR as follows:
- The sequence:
Becomes:Change ASID to 0 ISB Change Translation Table Base Register ISB Change ASID to new value
DSB Change ASID to 0 ISB Change Translation Table Base Register ISB DSB Change ASID to new value
- This sequence:
Becomes:Change Translation Table Base Register to the global-only mappings ISB Change ASID to new value ISB Change Translation Table Base Register to new value
Change Translation Table Base Register to the global-only mappings ISB DSB Change ASID to new value ISB Change Translation Table Base Register to new value
- This sequence:
Becomes:Set TTBCR.PD0 = 1 ISB Change ASID to new value Change Translation Table Base Register to new value ISB Set TTBCR.PD0 = 0
Set TTBCR.PD0 = 1 ISB DSB Change ASID to new value Change Translation Table Base Register to new value ISB Set TTBCR.PD0 = 0