• Catalin Marinas's avatar
    arm64: Improve detection of user/non-user mappings in set_pte(_at) · f46fdb8a
    Catalin Marinas authored
    commit ec663d96 upstream.
    
    Commit cab15ce6 ("arm64: Introduce execute-only page access
    permissions") allowed a valid user PTE to have the PTE_USER bit clear.
    As a consequence, the pte_valid_not_user() macro in set_pte() was
    replaced with pte_valid_global() under the assumption that only user
    pages have the nG bit set. EFI mappings, however, also have the nG bit
    set and set_pte() wrongly ignores issuing the DSB+ISB.
    
    This patch reinstates the pte_valid_not_user() macro and adds the
    PTE_UXN bit check since all kernel mappings have this bit set. For
    clarity, pte_exec() is renamed to pte_user_exec() as it only checks for
    the absence of PTE_UXN. Consequently, the user executable check in
    set_pte_at() drops the pte_ng() test since pte_user_exec() is
    sufficient.
    
    Fixes: cab15ce6 ("arm64: Introduce execute-only page access permissions")
    Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    f46fdb8a
pgtable.h 21.3 KB