linux-coco.lists.linux.dev archive mirror
 help / color / mirror / Atom feed
* [PATCH] x86/virt/tdx: accurately distinguishes TDX module loading situations
@ 2024-06-22 17:50 Jun Miao
  2024-06-24 11:26 ` Kirill A. Shutemov
  2024-07-19  1:31 ` Huang, Kai
  0 siblings, 2 replies; 4+ messages in thread
From: Jun Miao @ 2024-06-22 17:50 UTC (permalink / raw)
  To: kirill.shutemov, dave.hansen; +Cc: linux-coco, Jun Miao

The first SEAMCALL is important to response the state of TDX Module/BIOS.

In actual incorrect BIOS setup or deployment, the sysinit_ret will be
-EOPNOTSUPP. But the message "module not loaded" isn`t enough to describe
the accurate loading situation when module loaded but SEAMCALL failed
for some BIOS wrong setting. So add the error return operation code number.

Signed-off-by: Jun Miao <jun.miao@intel.com>
---
 arch/x86/virt/vmx/tdx/tdx.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c
index 4e2b2e2ac9f9..787dfaf44036 100644
--- a/arch/x86/virt/vmx/tdx/tdx.c
+++ b/arch/x86/virt/vmx/tdx/tdx.c
@@ -122,10 +122,14 @@ static int try_init_module_global(void)
 	/*
 	 * The first SEAMCALL also detects the TDX module, thus
 	 * it can fail due to the TDX module is not loaded.
-	 * Dump message to let the user know.
+	 * Dump more detailed message to let the user know.
 	 */
 	if (sysinit_ret == -ENODEV)
 		pr_err("module not loaded\n");
+	else if (sysinit_ret)
+		pr_warn("module loaded error ret=%d\n",sysinit_ret);
+	else
+		pr_info("module loaded\n");
 
 	sysinit_done = true;
 out:
-- 
2.32.0


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] x86/virt/tdx: accurately distinguishes TDX module loading situations
  2024-06-22 17:50 [PATCH] x86/virt/tdx: accurately distinguishes TDX module loading situations Jun Miao
@ 2024-06-24 11:26 ` Kirill A. Shutemov
  2024-06-28 17:17   ` Jun Miao
  2024-07-19  1:31 ` Huang, Kai
  1 sibling, 1 reply; 4+ messages in thread
From: Kirill A. Shutemov @ 2024-06-24 11:26 UTC (permalink / raw)
  To: Jun Miao; +Cc: dave.hansen, linux-coco

On Sun, Jun 23, 2024 at 01:50:37AM +0800, Jun Miao wrote:
> The first SEAMCALL is important to response the state of TDX Module/BIOS.
> 
> In actual incorrect BIOS setup or deployment, the sysinit_ret will be
> -EOPNOTSUPP. But the message "module not loaded" isn`t enough to describe
> the accurate loading situation when module loaded but SEAMCALL failed
> for some BIOS wrong setting. So add the error return operation code number.

Do you want to actually check for EOPNOTSUPP and print a
user-understandable message for it?

> Signed-off-by: Jun Miao <jun.miao@intel.com>
> ---
>  arch/x86/virt/vmx/tdx/tdx.c | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c
> index 4e2b2e2ac9f9..787dfaf44036 100644
> --- a/arch/x86/virt/vmx/tdx/tdx.c
> +++ b/arch/x86/virt/vmx/tdx/tdx.c
> @@ -122,10 +122,14 @@ static int try_init_module_global(void)
>  	/*
>  	 * The first SEAMCALL also detects the TDX module, thus
>  	 * it can fail due to the TDX module is not loaded.
> -	 * Dump message to let the user know.
> +	 * Dump more detailed message to let the user know.
>  	 */
>  	if (sysinit_ret == -ENODEV)
>  		pr_err("module not loaded\n");
> +	else if (sysinit_ret)
> +		pr_warn("module loaded error ret=%d\n",sysinit_ret);

s/loaded/load/

> +	else
> +		pr_info("module loaded\n");
>  
>  	sysinit_done = true;
>  out:
> -- 
> 2.32.0
> 

-- 
  Kiryl Shutse
  mau / Kirill A. Shutemov

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] x86/virt/tdx: accurately distinguishes TDX module loading situations
  2024-06-24 11:26 ` Kirill A. Shutemov
@ 2024-06-28 17:17   ` Jun Miao
  0 siblings, 0 replies; 4+ messages in thread
From: Jun Miao @ 2024-06-28 17:17 UTC (permalink / raw)
  To: Kirill A. Shutemov; +Cc: dave.hansen, linux-coco, Miao, Jun


On 6/24/24 19:26, Kirill A. Shutemov wrote:
> On Sun, Jun 23, 2024 at 01:50:37AM +0800, Jun Miao wrote:
>> The first SEAMCALL is important to response the state of TDX Module/BIOS.
>>
>> In actual incorrect BIOS setup or deployment, the sysinit_ret will be
>> -EOPNOTSUPP. But the message "module not loaded" isn`t enough to describe
>> the accurate loading situation when module loaded but SEAMCALL failed
>> for some BIOS wrong setting. So add the error return operation code number.
> Do you want to actually check for EOPNOTSUPP and print a
> user-understandable message for it?

It`s like this: I am a customer service support engineer, I awlays 
deploy TDX on site such as ByteDance/meituan
TDX is not simple but full stack.If boot up a TD guest, the follwing 
three requirements must be met:
     - The IFWI includes the correct seamldr and module in the BIOS, as 
the same time have the ability to load the TDX module.
     - Setting the TDX series of options, such as TME/SGX in the bios.
     - At last, loading the kernel, check if it can be boot with below 
demsg(when loaded successfully)

dmesg | grep - i tdx
[0.303913] virt/tdx: BIOS enabled: private KeyID range [64, 128)
[0.303916] virt/tdx: Disable Kexec. Turn off TDX in the BIOS to use KEXEC.
[0.303918] virt/tdx: Disable ACPI S3. Turn off TDX in the BIOS to use 
ACPI S3.
[4.846924] usb usb1: Manufacturer: Linux 6.6.0-tdx.1.0.v1 xhci-hcd
[4.847748] usb usb2: Manufacturer: Linux 6.6.0-tdx.1.0.v1 xhci-hcd
[6.577811] BOOT_IMAGE=(hd0,gpt2)/vmlinuz-6.6.0-tdx.1.0.v1
[17.723174] virt/tdx: 1575964 KB? allocated for PAMT
[17.723185] virt/tdx: module initialized

But this time,? It took a lot of effort to find the SEAMLDR.bin loading 
failed, since enable the bios debug need OEM cooperation
Got the bios log below as:

[TdxDxe]: [TDX_LATE-HANDLE_SEAMLDR] LoadTdxSeamldr BEGIN FATAL ERROR - 
RaiseTpl withOldTpl(0x1F) > NewTpl(0x10) ASSERT 
[DxeCore]e:\w\r\MdeModulePkg\Core\Dxe\Event\Tpl.c(66): ((BOOLEAN)(0==1))

[TdxDxe]: [TDX_LATE-HANDLE_SEAMLDR LoadTdxSeamldr END (Load Error)

But In the kernel, there is too little log message to find the error 
like this(loading failed):
dmesg | grep - i tdx
[0.303913] virt/tdx: BIOS enabled: private KeyID range [64, 
128)[0.303916] virt/tdx: Disable Kexec. Turn off TDX in the BIOS to use 
KEXEC.
[0.303918] virt/tdx: Disable ACPI S3. Turn off TDX in the BIOS to use 
ACPI S3.

I add the printk in the kernel and find the sysinit_ret = -19 = -EOPNOTSUPP
 From the current logic,? no ¡°module not loaded¡± always meaning module 
loaded.? But in fact, sysinit_ret is -EOPNOTSUPP(-19).
I will believe the module block at next seamcall: TDH_SYS_LP_INIT, which 
is misleading.

 >    if (sysinit_ret == -ENODEV)
 >    pr_err("module not loaded\n");
... ...
 >    ret = seamcall_prerr(TDH_SYS_LP_INIT,&args);?? ?

However I also use the old bkc kernel, there is a useful message to find 
such issues.¡± SEAMRR is not enabled by BIOS¡± to remind me where the 
problem lies.
In order to more accurately find the problems, add some printing 
reminders here will help the On site deployment engineer like me. ?

The story is a bit long. Thank you again for reading it over. Looking 
forward to your suggestions.

---
Jun Miao


>
>> Signed-off-by: Jun Miao <jun.miao@intel.com>
>> ---
>>   arch/x86/virt/vmx/tdx/tdx.c | 6 +++++-
>>   1 file changed, 5 insertions(+), 1 deletion(-)
>>
>> diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c
>> index 4e2b2e2ac9f9..787dfaf44036 100644
>> --- a/arch/x86/virt/vmx/tdx/tdx.c
>> +++ b/arch/x86/virt/vmx/tdx/tdx.c
>> @@ -122,10 +122,14 @@ static int try_init_module_global(void)
>>   	/*
>>   	 * The first SEAMCALL also detects the TDX module, thus
>>   	 * it can fail due to the TDX module is not loaded.
>> -	 * Dump message to let the user know.
>> +	 * Dump more detailed message to let the user know.
>>   	 */
>>   	if (sysinit_ret == -ENODEV)
>>   		pr_err("module not loaded\n");
>> +	else if (sysinit_ret)
>> +		pr_warn("module loaded error ret=%d\n",sysinit_ret);
> s/loaded/load/
>
>> +	else
>> +		pr_info("module loaded\n");
>>   
>>   	sysinit_done = true;
>>   out:
>> -- 
>> 2.32.0
>>

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] x86/virt/tdx: accurately distinguishes TDX module loading situations
  2024-06-22 17:50 [PATCH] x86/virt/tdx: accurately distinguishes TDX module loading situations Jun Miao
  2024-06-24 11:26 ` Kirill A. Shutemov
@ 2024-07-19  1:31 ` Huang, Kai
  1 sibling, 0 replies; 4+ messages in thread
From: Huang, Kai @ 2024-07-19  1:31 UTC (permalink / raw)
  To: kirill.shutemov@linux.intel.com, Miao, Jun,
	dave.hansen@linux.intel.com
  Cc: linux-coco@lists.linux.dev

On Sun, 2024-06-23 at 01:50 +0800, Jun Miao wrote:
> The first SEAMCALL is important to response the state of TDX Module/BIOS.
> 
> In actual incorrect BIOS setup or deployment, the sysinit_ret will be
> -EOPNOTSUPP. But the message "module not loaded" isn`t enough to describe
> the accurate loading situation when module loaded but SEAMCALL failed
> for some BIOS wrong setting. So add the error return operation code number.

(firstly, please CC me in the future, and please also CC x86 maintainers,
x86@kernel.org, and linux-kernel@vger.kernel.org). 

So this is the case where TDX is detected as enabled by the kernel (TDX KeyID
reports valid info), but TDX actually isn't enabled by the BIOS.

This seems BIOS bug to me.  The BIOS should never report valid TDX KeyID if TDX
isn't enabled.  I guess it happens on development machines, but I am not sure
whether the production machine would fix this.

Anyway ...

> 
> Signed-off-by: Jun Miao <jun.miao@intel.com>
> ---
>  arch/x86/virt/vmx/tdx/tdx.c | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c
> index 4e2b2e2ac9f9..787dfaf44036 100644
> --- a/arch/x86/virt/vmx/tdx/tdx.c
> +++ b/arch/x86/virt/vmx/tdx/tdx.c
> @@ -122,10 +122,14 @@ static int try_init_module_global(void)
>  	/*
>  	 * The first SEAMCALL also detects the TDX module, thus
>  	 * it can fail due to the TDX module is not loaded.
> -	 * Dump message to let the user know.
> +	 * Dump more detailed message to let the user know.
>  	 */
>  	if (sysinit_ret == -ENODEV)
>  		pr_err("module not loaded\n");
> +	else if (sysinit_ret)
> +		pr_warn("module loaded error ret=%d\n",sysinit_ret);
> +	else
> +		pr_info("module loaded\n");
>  
>  	sysinit_done = true;
>  out:

... printing the error code won't help user a lot since it is not obvious to the
user.  I think we can do something below.

Hi Dave/Kirill,

Any comments?

diff --git a/arch/x86/virt/vmx/tdx/tdx.c b/arch/x86/virt/vmx/tdx/tdx.c
index 49a1c6890b55..a8c273cfe17e 100644
--- a/arch/x86/virt/vmx/tdx/tdx.c
+++ b/arch/x86/virt/vmx/tdx/tdx.c
@@ -119,13 +119,35 @@ static int try_init_module_global(void)
        args.rcx = 0;
        sysinit_ret = seamcall_prerr(TDH_SYS_INIT, &args);
 
-       /*
-        * The first SEAMCALL also detects the TDX module, thus
-        * it can fail due to the TDX module is not loaded.
-        * Dump message to let the user know.
-        */
-       if (sysinit_ret == -ENODEV)
+       switch (sysinit_ret) {
+       case -ENODEV:
+               /*
+                * The first SEAMCALL also detects the TDX module,
+                * thus it can fail due to the TDX module is not
+                * loaded.  Dump message to let the user know.
+                */
                pr_err("module not loaded\n");
+               break;
+       case -EOPNOTSUPP:
+               /*
+                * Some TDX-capable development machines may report
+                * valid TDX KeyID when TDX is actually not enabled
+                * by the BIOS (e.g., due to BIOS misconfiguration).
+                * Let the user know.
+                */
+               pr_err("[BIOS bug]: TDX isn't enabled.\n");
+               break;
+       case -EACCES:
+               /*
+                * -EACCES happens when this is called when CPU is
+                * not in post-VMXON state.  It's kernel issue, so
+                * don't dump error message.
+                */
+               break;
+       default:
+               /* Actual SEAMCALL failure, message already printed */
+               break;
+       }
 
        sysinit_done = true;
 out:



^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2024-07-19  1:31 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-06-22 17:50 [PATCH] x86/virt/tdx: accurately distinguishes TDX module loading situations Jun Miao
2024-06-24 11:26 ` Kirill A. Shutemov
2024-06-28 17:17   ` Jun Miao
2024-07-19  1:31 ` Huang, Kai

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).