lkml.org 
[lkml]   [2021]   [Oct]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
SubjectRe: [PATCH v8 03/11] x86/cpufeatures: Add TDX Guest CPU feature
From
Date


On 10/6/21 8:26 AM, Borislav Petkov wrote:
> 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.

Yes. But, Joerg Roedel in his review recommended using variable
similar to sme_me_mask to avoid function call in Intel platform in
cc_platform_has().

"
This causes a function call on every Intel machine this code runs. is
there an easier to check whether TDX is enabled, like the sme_me_mask
check on AMD?
"

That's why I have introduced is_tdx_guest global variable in this
version.


>
> /*
> * 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");
> }
>

--
Sathyanarayanan Kuppuswamy
Linux Kernel Developer

\
 
 \ /
  Last update: 2021-10-06 17:44    [W:3.736 / U:0.004 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site