• Antonio Nino Diaz's avatar
    xlat v2: Flush xlat tables after being modified · 3e318e40
    Antonio Nino Diaz authored
    During cold boot, the initial translation tables are created with data
    caches disabled, so all modifications go to memory directly. After the
    MMU is enabled and data cache is enabled, any modification to the tables
    goes to data cache, and eventually may get flushed to memory.
    
    If CPU0 modifies the tables while CPU1 is off, CPU0 will have the
    modified tables in its data cache. When CPU1 is powered on, the MMU is
    enabled, then it enables coherency, and then it enables the data cache.
    Until this is done, CPU1 isn't in coherency, and the translation tables
    it sees can be outdated if CPU0 still has some modified entries in its
    data cache.
    
    This can be a problem in some cases. For example, the warm boot code
    uses only the tables mapped during cold boot, which don't normally
    change. However, if they are modified (and a RO page is made RW, or a XN
    page is made executable) the CPU will see the old attributes and crash
    when it tries to access it.
    
    This doesn't happen in systems with HW_ASSISTED_COHERENCY or
    WARMBOOT_ENABLE_DCACHE_EARLY. In these systems, the data cache is
    enabled at the same time as the MMU. As soon as this happens, the CPU is
    in coherency.
    
    There was an attempt of a fix in psci_helpers.S, but it didn't solve the
    problem. That code has been deleted. The code was introduced in commit
    <26441030
    
    > ("Invalidate TLB entries during warm boot").
    
    Now, during a map or unmap operation, the memory associated to each
    modified table is flushed. Traversing a table will also flush it's
    memory, as there is no way to tell in the current implementation if the
    table that has been traversed has also been modified.
    
    Change-Id: I4b520bca27502f1018878061bc5fb82af740bb92
    Signed-off-by: default avatarAntonio Nino Diaz <antonio.ninodiaz@arm.com>
    3e318e40
psci_helpers.S 4.25 KB