• Mark Rutland's avatar
    arm64: kasan: avoid TLB conflicts · c1a88e91
    Mark Rutland authored
    The page table modification performed during the KASAN init risks the
    allocation of conflicting TLB entries, as it swaps a set of valid global
    entries for another without suitable TLB maintenance.
    
    The presence of conflicting TLB entries can result in the delivery of
    synchronous TLB conflict aborts, or may result in the use of erroneous
    data being returned in response to a TLB lookup. This can affect
    explicit data accesses from software as well as translations performed
    asynchronously (e.g. as part of page table walks or speculative I-cache
    fetches), and can therefore result in a wide variety of problems.
    
    To avoid this, use cpu_replace_ttbr1 to swap the page tables. This
    ensures that when the new tables are installed there are no stale
    entries from the old tables which may conflict. As all updates are made
    to the tables while they are not active, the updates themselves are
    safe.
    
    At the same time, add the missing barrier to ensure that the tmp_pg_dir
    entries updated via memcpy are visible to the page table walkers at the
    point the tmp_pg_dir is installed. All other page table updates made as
    part of KASAN initialisation have the requisite barriers due to the use
    of the standard page table accessors.
    Signed-off-by: default avatarMark Rutland <mark.rutland@arm.com>
    Reviewed-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    Cc: Andrey Ryabinin <ryabinin.a.a@gmail.com>
    Tested-by: default avatarArd Biesheuvel <ard.biesheuvel@linaro.org>
    Reviewed-by: default avatarArd Biesheuvel <ard.biesheuvel@linaro.org>
    Tested-by: default avatarJeremy Linton <jeremy.linton@arm.com>
    Cc: Laura Abbott <labbott@fedoraproject.org>
    Cc: Will Deacon <will.deacon@arm.com>
    Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    c1a88e91
kasan_init.c 4.4 KB