On Mon, Oct 04, 2021 at 07:51:57PM -0700, Kuppuswamy Sathyanarayanan wrote:
diff --git a/arch/x86/kernel/tdx.c b/arch/x86/kernel/tdx.c
new file mode 100644
index 000000000000..ad3ff5925153
--- /dev/null
+++ b/arch/x86/kernel/tdx.c
@@ -0,0 +1,40 @@
+// SPDX-License-Identifier: GPL-2.0
+/* Copyright (C) 2020 Intel Corporation */
+
+#undef pr_fmt
+#define pr_fmt(fmt) "tdx: " fmt
+
+#include <asm/tdx.h>
+
+/*
+ * Allocate it in the data region to avoid zeroing it during
+ * BSS initialization. It is mainly used in cc_platform_has()
+ * call during early boot call.
+ */
+u64 __section(".data") is_tdx_guest = 0;
+
+static void __init is_tdx_guest_init(void)
+{
+ u32 eax, sig[3];
+
+ if (cpuid_eax(0) < TDX_CPUID_LEAF_ID) {
+ is_tdx_guest = 0;
+ return;
+ }
+
+ cpuid_count(TDX_CPUID_LEAF_ID, 0, &eax, &sig[0], &sig[2], &sig[1]);
+
+ is_tdx_guest = !memcmp("IntelTDX ", sig, 12);
+}
+
+void __init tdx_early_init(void)
+{
+ is_tdx_guest_init();
+
+ if (!is_tdx_guest)
+ return;
+
+ setup_force_cpu_cap(X86_FEATURE_TDX_GUEST);
+
+ pr_info("Guest initialized\n");
+}
--
What I meant was this (untested of course).
is_tdx_guest() is the accessor external code queries and you cache the
detected value in tdx_guest so that the one after the first one is
cheap.
/*
* Allocate it in the data region to avoid zeroing it during
* BSS initialization. It is mainly used in cc_platform_has()
* call during early boot call.
*
* States whether the kernel is running as a TDX guest.
*/
static int tdx_guest __ro_after_init = -1;
bool is_tdx_guest(void)
{
u32 eax, sig[3];
if (tdx_guest >= 0)
return tdx_guest;
if (cpuid_eax(0) < TDX_CPUID_LEAF_ID) {
tdx_guest = 0;
return false;
}
cpuid_count(TDX_CPUID_LEAF_ID, 0, &eax, &sig[0], &sig[2], &sig[1]);
tdx_guest = !memcmp("IntelTDX ", sig, 12);
return tdx_guest;
}
void __init tdx_early_init(void)
{
if (!is_tdx_guest())
return;
setup_force_cpu_cap(X86_FEATURE_TDX_GUEST);
pr_info("Guest initialized\n");
}