• Juergen Gross's avatar
    x86/pat: Fix x86_has_pat_wp() · 230ec83d
    Juergen Gross authored
    x86_has_pat_wp() is using a wrong test, as it relies on the normal
    PAT configuration used by the kernel. In case the PAT MSR has been
    setup by another entity (e.g. Xen hypervisor) it might return false
    even if the PAT configuration is allowing WP mappings. This due to the
    fact that when running as Xen PV guest the PAT MSR is setup by the
    hypervisor and cannot be changed by the guest. This results in the WP
    related entry to be at a different position when running as Xen PV
    guest compared to the bare metal or fully virtualized case.
    
    The correct way to test for WP support is:
    
    1. Get the PTE protection bits needed to select WP mode by reading
       __cachemode2pte_tbl[_PAGE_CACHE_MODE_WP] (depending on the PAT MSR
       setting this might return protection bits for a stronger mode, e.g.
       UC-)
    2. Translate those bits back into the real cache mode selected by those
       PTE bits by reading __pte2cachemode_tbl[__pte2cm_idx(prot)]
    3. Test for the cache mode to be _PAGE_CACHE_MODE_WP
    
    Fixes: f88a68fa ("x86/mm: Extend early_memremap() support with additional attrs")
    Signed-off-by: default avatarJuergen Gross <jgross@suse.com>
    Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
    Cc: <stable@vger.kernel.org> # 4.14
    Link: https://lore.kernel.org/r/20220503132207.17234-1-jgross@suse.com
    230ec83d
init.c 31.2 KB