• Ryan Roberts's avatar
    arm64/mm: Move PTE_PRESENT_INVALID to overlay PTE_NG · 55564814
    Ryan Roberts authored
    PTE_PRESENT_INVALID was previously occupying bit 59, which when a PTE is
    valid can either be IGNORED, PBHA[0] or AttrIndex[3], depending on the
    HW configuration. In practice this is currently not a problem because
    PTE_PRESENT_INVALID can only be 1 when PTE_VALID=0 and upstream Linux
    always requires the bit set to 0 for a valid pte.
    
    However, if in future Linux wants to use the field (e.g. AttrIndex[3])
    then we could end up with confusion when PTE_PRESENT_INVALID comes along
    and corrupts the field - we would ideally want to preserve it even for
    an invalid (but present) pte.
    
    The other problem with bit 59 is that it prevents the offset field of a
    swap entry within a swap pte from growing beyond 51 bits. By moving
    PTE_PRESENT_INVALID to a low bit we can lay the swap pte out so that the
    offset field could grow to 52 bits in future.
    
    So let's move PTE_PRESENT_INVALID to overlay PTE_NG (bit 11).
    
    There is no need to persist NG for a present-invalid entry; it is always
    set for user mappings and is not used by SW to derive any state from the
    pte. PTE_NS was considered instead of PTE_NG, but it is RES0 for
    non-secure SW, so there is a chance that future architecture may
    allocate the bit and we may therefore need to persist that bit for
    present-invalid ptes.
    
    These are both marginal benefits, but make things a bit tidier in my
    opinion.
    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-4-ryan.roberts@arm.comSigned-off-by: default avatarWill Deacon <will@kernel.org>
    55564814
pgtable.h 47.3 KB