• Will Deacon's avatar
    KVM: arm64: Fix masks in stage2_pte_cacheable() · e2fc6a9f
    Will Deacon authored
    stage2_pte_cacheable() tries to figure out whether the mapping installed
    in its 'pte' parameter is cacheable or not. Unfortunately, it fails
    miserably because it extracts the memory attributes from the entry using
    FIELD_GET(), which returns the attributes shifted down to bit 0, but then
    compares this with the unshifted value generated by the PAGE_S2_MEMATTR()
    macro.
    
    A direct consequence of this bug is that cache maintenance is silently
    skipped, which in turn causes 32-bit guests to crash early on when their
    set/way maintenance is trapped but not emulated correctly.
    
    Fix the broken masks by avoiding the use of FIELD_GET() altogether.
    
    Fixes: 6d9d2115 ("KVM: arm64: Add support for stage-2 map()/unmap() in generic page-table")
    Reported-by: default avatarMarc Zyngier <maz@kernel.org>
    Signed-off-by: default avatarWill Deacon <will@kernel.org>
    Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
    Cc: Quentin Perret <qperret@google.com>
    Link: https://lore.kernel.org/r/20201029144716.30476-1-will@kernel.org
    e2fc6a9f
pgtable.c 21.3 KB