Re: [PATCH v10 06/50] x86/sev: Add the host SEV-SNP initialization support

From: Borislav Petkov
Date: Wed Nov 08 2023 - 01:15:08 EST


On Tue, Nov 07, 2023 at 04:33:41PM -0600, Kalra, Ashish wrote:
> We will still need some method to tell the IOMMU driver if SNP
> support/feature is disabled by this function, for example, when CPU family
> and model is not supported by SNP and we jump to no_snp label.

See below.

> The reliable way for this to work is to ensure snp_rmptable_init() is called
> before IOMMU initialization and then IOMMU initialization depends on SNP
> feature flag setup by snp_rmptable_init() to enable SNP support on IOMMU or
> not.

Yes, this whole SNP initialization needs to be reworked and split this
way:

- early detection work which needs to be done once goes to
bsp_init_amd(): that's basically your early_detect_mem_encrypt() stuff
which needs to happen exactly only once and early.

- Any work like:

c->x86_phys_bits -= (cpuid_ebx(0x8000001f) >> 6) & 0x3f;

and the like which needs to happen on each AP, gets put in a function
which gets called by init_amd().

By the time IOMMU gets to init, you already know whether it should
enable SNP and check X86_FEATURE_SEV_SNP.

Finally, you call __snp_rmptable_init() which does the *per-CPU* init
work which is still pending.

Ok?

Ontop of the previous ontop patch:

---
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c
index 6cc2074fcea3..a9c95e5d6b06 100644
--- a/arch/x86/kernel/cpu/amd.c
+++ b/arch/x86/kernel/cpu/amd.c
@@ -674,8 +674,19 @@ static void early_detect_mem_encrypt(struct cpuinfo_x86 *c)
if (!(msr & MSR_K7_HWCR_SMMLOCK))
goto clear_sev;

- if (cpu_has(c, X86_FEATURE_SEV_SNP) && !early_rmptable_check())
- goto clear_snp;
+ if (cpu_has(c, X86_FEATURE_SEV_SNP)) {
+ /*
+ * RMP table entry format is not architectural and it can vary by processor
+ * and is defined by the per-processor PPR. Restrict SNP support on the known
+ * CPU model and family for which the RMP table entry format is currently
+ * defined for.
+ */
+ if (c->x86 != 0x19 || c->x86_model > 0xaf)
+ goto clear_snp;
+
+ if (!early_rmptable_check())
+ goto clear_snp;
+ }

return;

diff --git a/arch/x86/virt/svm/sev.c b/arch/x86/virt/svm/sev.c
index 9237c327ad6d..5a71df9ae4cb 100644
--- a/arch/x86/virt/svm/sev.c
+++ b/arch/x86/virt/svm/sev.c
@@ -199,14 +199,6 @@ static int __init snp_rmptable_init(void)
if (!amd_iommu_snp_en)
return 0;

- /*
- * RMP table entry format is not architectural and it can vary by processor and
- * is defined by the per-processor PPR. Restrict SNP support on the known CPU
- * model and family for which the RMP table entry format is currently defined for.
- */
- if (boot_cpu_data.x86 != 0x19 || boot_cpu_data.x86_model > 0xaf)
- goto nosnp;
-
if (__snp_rmptable_init())
goto nosnp;

--
Regards/Gruss,
Boris.

https://people.kernel.org/tglx/notes-about-netiquette