• M
    arm64: drop unnecessary cache+tlb maintenance · a3bba370
    Mark Rutland 提交于
    In paging_init, we call flush_cache_all, but this is backed by Set/Way
    operations which may not achieve anything in the presence of cache line
    migration and/or system caches. If the caches are already in an
    inconsistent state at this point, there is nothing we can do (short of
    flushing the entire physical address space by VA) to empty architected
    and system caches. As such, flush_cache_all only serves to mask other
    potential bugs. Hence, this patch removes the boot-time call to
    flush_cache_all.
    
    Immediately after the cache maintenance we flush the TLBs, but this is
    also unnecessary. Before enabling the MMU, the TLBs are invalidated, and
    thus are initially clean. When changing the contents of active tables
    (e.g. in fixup_executable() for DEBUG_RODATA) we perform the required
    TLB maintenance following the update, and therefore no additional
    maintenance is required to ensure the new table entries are in effect.
    Since activating the MMU we will not have modified system register
    fields permitted to be cached in a TLB, and therefore do not need
    maintenance for any cached system register fields. Hence, the TLB flush
    is unnecessary.
    
    Shortly after the unnecessary TLB flush, we update TTBR0 to point to an
    empty zero page rather than the idmap, and flush the TLBs. This
    maintenance is necessary to remove the global idmap entries from the
    TLBs (as they would conflict with userspace mappings), and is retained.
    Signed-off-by: NMark Rutland <mark.rutland@arm.com>
    Acked-by: NMarc Zyngier <marc.zyngier@arm.com>
    Acked-by: NSteve Capper <steve.capper@linaro.org>
    Cc: Will Deacon <will.deacon@arm.com>
    Signed-off-by: NCatalin Marinas <catalin.marinas@arm.com>
    a3bba370
mmu.c 15.4 KB