From: Tom Lendacky <thomas.lendacky@amd.com>
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@amd.com>
Signed-off-by: Tycho Andersen (AMD) <tycho@kernel.org>
---
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 232a385f11cb..e7fbbf1cdf8e 100644
--- a/arch/x86/virt/svm/sev.c
+++ b/arch/x86/virt/svm/sev.c
@@ -248,6 +248,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;
@@ -490,7 +516,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)))
@@ -510,19 +535,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();
/* Flush the caches to ensure that data is written before SNP is enabled. */
wbinvd_on_all_cpus();
--
2.53.0