x86/cc: Add cc_platform_set/_clear() helpers
authorBorislav Petkov (AMD) <bp@alien8.de>
Wed, 27 Mar 2024 15:43:16 +0000 (16:43 +0100)
committerBorislav Petkov (AMD) <bp@alien8.de>
Thu, 4 Apr 2024 08:40:27 +0000 (10:40 +0200)
Add functionality to set and/or clear different attributes of the
machine as a confidential computing platform. Add the first one too:
whether the machine is running as a host for SEV-SNP guests.

Fixes: 216d106c7ff7 ("x86/sev: Add SEV-SNP host initialization support")
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Reviewed-by: Tom Lendacky <thomas.lendacky@amd.com>
Tested-by: Srikanth Aithal <sraithal@amd.com>
Link: https://lore.kernel.org/r/20240327154317.29909-5-bp@alien8.de
arch/x86/coco/core.c
include/linux/cc_platform.h

index ddd4efdc79d66875bb8b17387aaea883c3b621cc..b31ef2424d194b96d07b601d4eeac4b23d637d27 100644 (file)
 enum cc_vendor cc_vendor __ro_after_init = CC_VENDOR_NONE;
 u64 cc_mask __ro_after_init;
 
+static struct cc_attr_flags {
+       __u64 host_sev_snp      : 1,
+             __resv            : 63;
+} cc_flags;
+
 static bool noinstr intel_cc_platform_has(enum cc_attr attr)
 {
        switch (attr) {
@@ -93,6 +98,9 @@ static bool noinstr amd_cc_platform_has(enum cc_attr attr)
        case CC_ATTR_GUEST_SEV_SNP:
                return sev_status & MSR_AMD64_SEV_SNP_ENABLED;
 
+       case CC_ATTR_HOST_SEV_SNP:
+               return cc_flags.host_sev_snp;
+
        default:
                return false;
        }
@@ -153,6 +161,50 @@ u64 cc_mkdec(u64 val)
 }
 EXPORT_SYMBOL_GPL(cc_mkdec);
 
+static void amd_cc_platform_clear(enum cc_attr attr)
+{
+       switch (attr) {
+       case CC_ATTR_HOST_SEV_SNP:
+               cc_flags.host_sev_snp = 0;
+               break;
+       default:
+               break;
+       }
+}
+
+void cc_platform_clear(enum cc_attr attr)
+{
+       switch (cc_vendor) {
+       case CC_VENDOR_AMD:
+               amd_cc_platform_clear(attr);
+               break;
+       default:
+               break;
+       }
+}
+
+static void amd_cc_platform_set(enum cc_attr attr)
+{
+       switch (attr) {
+       case CC_ATTR_HOST_SEV_SNP:
+               cc_flags.host_sev_snp = 1;
+               break;
+       default:
+               break;
+       }
+}
+
+void cc_platform_set(enum cc_attr attr)
+{
+       switch (cc_vendor) {
+       case CC_VENDOR_AMD:
+               amd_cc_platform_set(attr);
+               break;
+       default:
+               break;
+       }
+}
+
 __init void cc_random_init(void)
 {
        /*
index cb0d6cd1c12f24e1dd8681b5f9f0302675bec7d5..60693a1458946223f791aae517210cb67ba13050 100644 (file)
@@ -90,6 +90,14 @@ enum cc_attr {
         * Examples include TDX Guest.
         */
        CC_ATTR_HOTPLUG_DISABLED,
+
+       /**
+        * @CC_ATTR_HOST_SEV_SNP: AMD SNP enabled on the host.
+        *
+        * The host kernel is running with the necessary features
+        * enabled to run SEV-SNP guests.
+        */
+       CC_ATTR_HOST_SEV_SNP,
 };
 
 #ifdef CONFIG_ARCH_HAS_CC_PLATFORM
@@ -107,10 +115,14 @@ enum cc_attr {
  * * FALSE - Specified Confidential Computing attribute is not active
  */
 bool cc_platform_has(enum cc_attr attr);
+void cc_platform_set(enum cc_attr attr);
+void cc_platform_clear(enum cc_attr attr);
 
 #else  /* !CONFIG_ARCH_HAS_CC_PLATFORM */
 
 static inline bool cc_platform_has(enum cc_attr attr) { return false; }
+static inline void cc_platform_set(enum cc_attr attr) { }
+static inline void cc_platform_clear(enum cc_attr attr) { }
 
 #endif /* CONFIG_ARCH_HAS_CC_PLATFORM */