lkml.org 
[lkml]   [2024]   [Mar]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v12 02/29] [TEMP] x86/cc: Add cc_platform_set/_clear() helpers
    Date
    From: "Borislav Petkov (AMD)" <bp@alien8.de>

    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.

    Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
    Signed-off-by: Michael Roth <michael.roth@amd.com>
    ---
    arch/x86/coco/core.c | 52 +++++++++++++++++++++++++++++++++++++
    include/linux/cc_platform.h | 12 +++++++++
    2 files changed, 64 insertions(+)

    diff --git a/arch/x86/coco/core.c b/arch/x86/coco/core.c
    index d07be9d05cd0..8c3fae23d3c6 100644
    --- a/arch/x86/coco/core.c
    +++ b/arch/x86/coco/core.c
    @@ -16,6 +16,11 @@
    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) {
    @@ -89,6 +94,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;
    }
    @@ -148,3 +156,47 @@ 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;
    + }
    +}
    diff --git a/include/linux/cc_platform.h b/include/linux/cc_platform.h
    index cb0d6cd1c12f..60693a145894 100644
    --- a/include/linux/cc_platform.h
    +++ b/include/linux/cc_platform.h
    @@ -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 */

    --
    2.25.1

    \
     
     \ /
      Last update: 2024-05-27 16:17    [W:4.904 / U:1.052 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site