• Juergen Gross's avatar
    x86/xen: Set MTRR state when running as Xen PV initial domain · a153f254
    Juergen Gross authored
    When running as Xen PV initial domain (aka dom0), MTRRs are disabled
    by the hypervisor, but the system should nevertheless use correct
    cache memory types. This has always kind of worked, as disabled MTRRs
    resulted in disabled PAT, too, so that the kernel avoided code paths
    resulting in inconsistencies. This bypassed all of the sanity checks
    the kernel is doing with enabled MTRRs in order to avoid memory
    mappings with conflicting memory types.
    
    This has been changed recently, leading to PAT being accepted to be
    enabled, while MTRRs stayed disabled. The result is that
    mtrr_type_lookup() no longer is accepting all memory type requests,
    but started to return WB even if UC- was requested. This led to
    driver failures during initialization of some devices.
    
    In reality MTRRs are still in effect, but they are under complete
    control of the Xen hypervisor. It is possible, however, to retrieve
    the MTRR settings from the hypervisor.
    
    In order to fix those problems, overwrite the MTRR state via
    mtrr_overwrite_state() with the MTRR data from the hypervisor, if the
    system is running as a Xen dom0.
    
    Fixes: 72cbc8f0 ("x86/PAT: Have pat_enabled() properly reflect state when running on Xen")
    Signed-off-by: default avatarJuergen Gross <jgross@suse.com>
    Signed-off-by: default avatarBorislav Petkov (AMD) <bp@alien8.de>
    Reviewed-by: default avatarBoris Ostrovsky <boris.ostrovsky@oracle.com>
    Tested-by: default avatarMichael Kelley <mikelley@microsoft.com>
    Link: https://lore.kernel.org/r/20230502120931.20719-6-jgross@suse.comSigned-off-by: default avatarBorislav Petkov (AMD) <bp@alien8.de>
    a153f254
enlighten_pv.c 36.8 KB