x86/cc: Add cc_platform_set/_clear() helpers
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: 216d106c7f
("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
This commit is contained in:
parent
54f5f47b60
commit
bc6f707fc0
@ -20,6 +20,11 @@
|
|||||||
enum cc_vendor cc_vendor __ro_after_init = CC_VENDOR_NONE;
|
enum cc_vendor cc_vendor __ro_after_init = CC_VENDOR_NONE;
|
||||||
u64 cc_mask __ro_after_init;
|
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)
|
static bool noinstr intel_cc_platform_has(enum cc_attr attr)
|
||||||
{
|
{
|
||||||
switch (attr) {
|
switch (attr) {
|
||||||
@ -93,6 +98,9 @@ static bool noinstr amd_cc_platform_has(enum cc_attr attr)
|
|||||||
case CC_ATTR_GUEST_SEV_SNP:
|
case CC_ATTR_GUEST_SEV_SNP:
|
||||||
return sev_status & MSR_AMD64_SEV_SNP_ENABLED;
|
return sev_status & MSR_AMD64_SEV_SNP_ENABLED;
|
||||||
|
|
||||||
|
case CC_ATTR_HOST_SEV_SNP:
|
||||||
|
return cc_flags.host_sev_snp;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -153,6 +161,50 @@ u64 cc_mkdec(u64 val)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(cc_mkdec);
|
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)
|
__init void cc_random_init(void)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
@ -90,6 +90,14 @@ enum cc_attr {
|
|||||||
* Examples include TDX Guest.
|
* Examples include TDX Guest.
|
||||||
*/
|
*/
|
||||||
CC_ATTR_HOTPLUG_DISABLED,
|
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
|
#ifdef CONFIG_ARCH_HAS_CC_PLATFORM
|
||||||
@ -107,10 +115,14 @@ enum cc_attr {
|
|||||||
* * FALSE - Specified Confidential Computing attribute is not active
|
* * FALSE - Specified Confidential Computing attribute is not active
|
||||||
*/
|
*/
|
||||||
bool cc_platform_has(enum cc_attr attr);
|
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 */
|
#else /* !CONFIG_ARCH_HAS_CC_PLATFORM */
|
||||||
|
|
||||||
static inline bool cc_platform_has(enum cc_attr attr) { return false; }
|
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 */
|
#endif /* CONFIG_ARCH_HAS_CC_PLATFORM */
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user