Re: [PATCH Part2 v5 03/45] x86/sev: Add the host SEV-SNP initialization support
From: Borislav Petkov <bp@alien8.de>
Date: 2021-09-24 08:58:18
Also in:
kvm, linux-crypto, linux-mm, lkml
On Fri, Aug 20, 2021 at 10:58:36AM -0500, Brijesh Singh wrote:
quoted hunk ↗ jump to hunk
@@ -542,6 +544,10 @@ #define MSR_AMD64_SYSCFG 0xc0010010 #define MSR_AMD64_SYSCFG_MEM_ENCRYPT_BIT 23 #define MSR_AMD64_SYSCFG_MEM_ENCRYPT BIT_ULL(MSR_AMD64_SYSCFG_MEM_ENCRYPT_BIT) +#define MSR_AMD64_SYSCFG_SNP_EN_BIT 24 +#define MSR_AMD64_SYSCFG_SNP_EN BIT_ULL(MSR_AMD64_SYSCFG_SNP_EN_BIT) +#define MSR_AMD64_SYSCFG_SNP_VMPL_EN_BIT 25 +#define MSR_AMD64_SYSCFG_SNP_VMPL_EN BIT_ULL(MSR_AMD64_SYSCFG_SNP_VMPL_EN_BIT)
While you're here, move all defines that belong to that MSR which we decided it is architectural after all, above the definition of MSR_AMD64_NB_CFG above.
quoted hunk ↗ jump to hunk
#define MSR_K8_INT_PENDING_MSG 0xc0010055 /* C1E active bits in int pending message */ #define K8_INTP_C1E_ACTIVE_MASK 0x18000000diff --git a/arch/x86/kernel/sev.c b/arch/x86/kernel/sev.c index ab17c93634e9..7936c8139c74 100644 --- a/arch/x86/kernel/sev.c +++ b/arch/x86/kernel/sev.c@@ -24,6 +24,8 @@ #include <linux/sev-guest.h> #include <linux/platform_device.h> #include <linux/io.h> +#include <linux/cpumask.h> +#include <linux/iommu.h> #include <asm/cpu_entry_area.h> #include <asm/stacktrace.h>@@ -40,11 +42,19 @@ #include <asm/efi.h> #include <asm/cpuid.h> #include <asm/setup.h> +#include <asm/apic.h> +#include <asm/iommu.h> #include "sev-internal.h" #define DR7_RESET_VALUE 0x400 +/* + * The first 16KB from the RMP_BASE is used by the processor for the
s/for the/for/
+ * bookkeeping, the range need to be added during the RMP entry lookup.
s/need/needs/ ... s/during the/during /
+ */ +#define RMPTABLE_CPU_BOOKKEEPING_SZ 0x4000
Too long: just call it RMP_BASE_OFFSET.
quoted hunk ↗ jump to hunk
+static bool get_rmptable_info(u64 *start, u64 *len) +{ + u64 calc_rmp_sz, rmp_sz, rmp_base, rmp_end, nr_pages; + + rdmsrl(MSR_AMD64_RMP_BASE, rmp_base); + rdmsrl(MSR_AMD64_RMP_END, rmp_end); + + if (!rmp_base || !rmp_end) { + pr_info("Memory for the RMP table has not been reserved by BIOS\n"); + return false; + } + + rmp_sz = rmp_end - rmp_base + 1; + + /* + * Calculate the amount the memory that must be reserved by the BIOS to + * address the full system RAM. The reserved memory should also cover the + * RMP table itself. + * + * See PPR Family 19h Model 01h, Revision B1 section 2.1.5.2 for more + * information on memory requirement. + */ + nr_pages = totalram_pages(); + calc_rmp_sz = (((rmp_sz >> PAGE_SHIFT) + nr_pages) << 4) + RMPTABLE_CPU_BOOKKEEPING_SZ;
use totalram_pages() directly here - nr_pages is assigned to only once.
quoted hunk ↗ jump to hunk
+ + if (calc_rmp_sz > rmp_sz) { + pr_info("Memory reserved for the RMP table does not cover full system RAM (expected 0x%llx got 0x%llx)\n", + calc_rmp_sz, rmp_sz); + return false; + } + + *start = rmp_base; + *len = rmp_sz; + + pr_info("RMP table physical address 0x%016llx - 0x%016llx\n", rmp_base, rmp_end);
"RMP table physical address range: [ ... - ... ]\n", ... ...
quoted hunk ↗ jump to hunk
+/* + * This must be called after the PCI subsystem. This is because before enabling + * the SNP feature we need to ensure that IOMMU supports the SEV-SNP feature.
"... it needs to be ensured that... "
+ * The iommu_sev_snp_support() is used for checking the feature, and it is + * available after subsys_initcall(). + */ +fs_initcall(snp_rmptable_init); -- 2.17.1
--
Regards/Gruss,
Boris.
https://people.kernel.org/tglx/notes-about-netiquette