[PATCH v2 04/10] x86/snp: Create a function to clear/zero the RMP

From: Tycho Andersen

Date: Mon Mar 09 2026 - 14:10:13 EST


From: Tom Lendacky <thomas.lendacky@xxxxxxx>

In prep for delayed SNP initialization and disablement on shutdown, create
a function, snp_clear_rmp(), that clears the RMP bookkeeping area and the
RMP entries.

Signed-off-by: Tom Lendacky <thomas.lendacky@xxxxxxx>
Signed-off-by: Tycho Andersen (AMD) <tycho@xxxxxxxxxx>
---
arch/x86/virt/svm/sev.c | 41 +++++++++++++++++++++++++++--------------
1 file changed, 27 insertions(+), 14 deletions(-)

diff --git a/arch/x86/virt/svm/sev.c b/arch/x86/virt/svm/sev.c
index e35fac0a8a3d..f41b92e40014 100644
--- a/arch/x86/virt/svm/sev.c
+++ b/arch/x86/virt/svm/sev.c
@@ -242,6 +242,32 @@ void __init snp_fixup_e820_tables(void)
}
}

+static void snp_clear_rmp(void)
+{
+ unsigned int i;
+ u64 val;
+
+ if (!cc_platform_has(CC_ATTR_HOST_SEV_SNP))
+ return;
+
+ /* Clearing the RMP while SNP is enabled will cause an exception */
+ rdmsrq(MSR_AMD64_SYSCFG, val);
+ if (WARN_ON_ONCE(val & MSR_AMD64_SYSCFG_SNP_EN))
+ return;
+
+ memset(rmp_bookkeeping, 0, RMPTABLE_CPU_BOOKKEEPING_SZ);
+
+ for (i = 0; i < rst_max_index; i++) {
+ struct rmp_segment_desc *desc;
+
+ desc = rmp_segment_table[i];
+ if (!desc)
+ continue;
+
+ memset(desc->rmp_entry, 0, desc->size);
+ }
+}
+
static bool __init alloc_rmp_segment_desc(u64 segment_pa, u64 segment_size, u64 pa)
{
u64 rst_index, rmp_segment_size_max;
@@ -484,7 +510,6 @@ static bool __init setup_rmptable(void)
*/
int __init snp_rmptable_init(void)
{
- unsigned int i;
u64 val;

if (WARN_ON_ONCE(!cc_platform_has(CC_ATTR_HOST_SEV_SNP)))
@@ -504,19 +529,7 @@ int __init snp_rmptable_init(void)
if (val & MSR_AMD64_SYSCFG_SNP_EN)
goto skip_enable;

- /* Zero out the RMP bookkeeping area */
- memset(rmp_bookkeeping, 0, RMPTABLE_CPU_BOOKKEEPING_SZ);
-
- /* Zero out the RMP entries */
- for (i = 0; i < rst_max_index; i++) {
- struct rmp_segment_desc *desc;
-
- desc = rmp_segment_table[i];
- if (!desc)
- continue;
-
- memset(desc->rmp_entry, 0, desc->size);
- }
+ snp_clear_rmp();

/* MtrrFixDramModEn must be enabled on all the CPUs prior to enabling SNP. */
on_each_cpu(mfd_enable, NULL, 1);
--
2.53.0