From: Ashish Kalra Segmented RMP has two independent states: the CPU *advertises* support via the X86_FEATURE_SEGMENTED_RMP CPUID bit, and the firmware *enables* it via MSR_AMD64_RMP_CFG[SEG_RMP_ENABLED]. A platform can advertise segmented RMP (CPUID bit set) while the firmware leaves it disabled (SEG_RMP_ENABLED clear) -- e.g. through a BIOS option to disable Segmented RMP -- in which case the system runs with a contiguous RMP. snp_probe_rmptable_info() clears X86_FEATURE_RMPOPT only when the CPU does not advertise segmented RMP, or when the segmented RMP table probe fails. It misses the advertised-but-firmware-disabled case: that path falls through to the contiguous probe with X86_FEATURE_RMPOPT still set. X86_FEATURE_RMPOPT is a CPUID bit advertised independently of whether segmented RMP is enabled, but RMPOPT requires an enabled segmented RMP. With the capability left set, RMPOPT_BASE is programmed and the RMPOPT instruction issued, both of which #GP on a contiguous RMP: unchecked MSR access error: WRMSR to 0xc0010139 ... general protection fault ... snp_enable_rmpopt Clear X86_FEATURE_RMPOPT on the common contiguous fall-through so it covers both "segmented RMP not supported" and "segmented RMP supported but disabled by firmware". Fixes: 15d974be0a3b ("x86/sev: Initialize RMPOPT configuration MSRs") Signed-off-by: Ashish Kalra Reviewed-by: Tom Lendacky --- arch/x86/virt/svm/sev.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/x86/virt/svm/sev.c b/arch/x86/virt/svm/sev.c index bd70c4d0b774..cd0412b9d251 100644 --- a/arch/x86/virt/svm/sev.c +++ b/arch/x86/virt/svm/sev.c @@ -827,10 +827,10 @@ bool snp_probe_rmptable_info(void) setup_clear_cpu_cap(X86_FEATURE_RMPOPT); return false; } - } else { - setup_clear_cpu_cap(X86_FEATURE_RMPOPT); } + setup_clear_cpu_cap(X86_FEATURE_RMPOPT); + return probe_contiguous_rmptable_info(); } -- 2.43.0