[PATCH v4 1/2] x86/sev: Clear RMPOPT when segmented RMP is disabled by firmware
From: Ashish Kalra
Date: Wed Oct 28 2026 - 16:30:08 EST
From: Ashish Kalra <ashish.kalra@xxxxxxx>
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 <ashish.kalra@xxxxxxx>
Reviewed-by: Tom Lendacky <thomas.lendacky@xxxxxxx>
---
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