• Ryan Roberts's avatar
    arm64/mm: Remove PTE_PROT_NONE bit · f0f5863a
    Ryan Roberts authored
    
    
    Currently the PTE_PRESENT_INVALID and PTE_PROT_NONE functionality
    explicitly occupy 2 bits in the PTE when PTE_VALID/PMD_SECT_VALID is
    clear. This has 2 significant consequences:
    
      - PTE_PROT_NONE consumes a precious SW PTE bit that could be used for
        other things.
      - The swap pte layout must reserve those same 2 bits and ensure they
        are both always zero for a swap pte. It would be nice to reclaim at
        least one of those bits.
    
    But PTE_PRESENT_INVALID, which since the previous patch, applies
    uniformly to page/block descriptors at any level when PTE_VALID is
    clear, can already give us most of what PTE_PROT_NONE requires: If it is
    set, then the pte is still considered present; pte_present() returns
    true and all the fields in the pte follow the HW interpretation (e.g. SW
    can safely call pte_pfn(), etc). But crucially, the HW treats the pte as
    invalid and will fault if it hits.
    
    So let's remove PTE_PROT_NONE entirely and instead represent PROT_NONE
    as a present but invalid pte (PTE_VALID=0, PTE_PRESENT_INVALID=1) with
    PTE_USER=0 and PTE_UXN=1. This is a unique combination that is not used
    anywhere else.
    
    The net result is a clearer, simpler, more generic encoding scheme that
    applies uniformly to all levels. Additionally we free up a PTE SW bit
    and a swap pte bit (bit 58 in both cases).
    Reviewed-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    Signed-off-by: default avatarRyan Roberts <ryan.roberts@arm.com>
    Link: https://lore.kernel.org/r/20240503144604.151095-3-ryan.roberts@arm.com
    
    Signed-off-by: default avatarWill Deacon <will@kernel.org>
    f0f5863a
pgtable.h 47.3 KB