]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
x86/sev: Create a function to clear/zero the RMP
authorTom Lendacky <thomas.lendacky@amd.com>
Tue, 24 Mar 2026 16:12:55 +0000 (10:12 -0600)
committerBorislav Petkov (AMD) <bp@alien8.de>
Sat, 28 Mar 2026 21:10:56 +0000 (22:10 +0100)
In preparation for delayed SNP initialization and disablement on shutdown,
create a function, clear_rmp(), that clears the RMP bookkeeping area and the
RMP entries.

Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
Signed-off-by: Tycho Andersen (AMD) <tycho@kernel.org>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Link: https://patch.msgid.link/20260324161301.1353976-2-tycho@kernel.org
arch/x86/virt/svm/sev.c

index e35fac0a8a3d8d6be682cdbb5f45d4db1d89920c..0256069698235897d0710bbf2b5178a1b8f23fb3 100644 (file)
@@ -242,6 +242,32 @@ void __init snp_fixup_e820_tables(void)
        }
 }
 
+static void 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);
-       }
+       clear_rmp();
 
        /* MtrrFixDramModEn must be enabled on all the CPUs prior to enabling SNP. */
        on_each_cpu(mfd_enable, NULL, 1);