From: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
Today there are two separate locations where TDX error codes are defined:
arch/x86/include/asm/tdx.h
arch/x86/kvm/vmx/tdx.h
They have some overlap that is already defined similarly. Reduce the
duplication and prepare to introduce some helpers for these error codes in
the central place by unifying them. Join them at:
asm/shared/tdx_errno.h
...and update the headers that contained the duplicated definitions to
include the new unified header.
Opportunistically massage some comments. Also, adjust
_BITUL()->_BITULL() to address 32 bit build errors after the move.
Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
[enhance log]
Signed-off-by: Rick Edgecombe <rick.p.edgecombe@intel.com>
---
v3:
- Split from "x86/tdx: Consolidate TDX error handling" (Dave, Kai)
- Write log (Rick)
- Fix 32 bit build error
---
arch/x86/include/asm/shared/tdx.h | 1 +
.../vmx => include/asm/shared}/tdx_errno.h | 27 ++++++++++++++-----
arch/x86/include/asm/tdx.h | 20 --------------
arch/x86/kvm/vmx/tdx.h | 1 -
4 files changed, 22 insertions(+), 27 deletions(-)
rename arch/x86/{kvm/vmx => include/asm/shared}/tdx_errno.h (66%)
diff --git a/arch/x86/include/asm/shared/tdx.h b/arch/x86/include/asm/shared/tdx.h
index 8bc074c8d7c6..6a1646fc2b2f 100644
--- a/arch/x86/include/asm/shared/tdx.h
+++ b/arch/x86/include/asm/shared/tdx.h
@@ -4,6 +4,7 @@
#include <linux/bits.h>
#include <linux/types.h>
+#include <asm/shared/tdx_errno.h>
#define TDX_HYPERCALL_STANDARD 0
diff --git a/arch/x86/kvm/vmx/tdx_errno.h b/arch/x86/include/asm/shared/tdx_errno.h
similarity index 66%
rename from arch/x86/kvm/vmx/tdx_errno.h
rename to arch/x86/include/asm/shared/tdx_errno.h
index 6ff4672c4181..f98924fe5198 100644
--- a/arch/x86/kvm/vmx/tdx_errno.h
+++ b/arch/x86/include/asm/shared/tdx_errno.h
@@ -1,14 +1,14 @@
/* SPDX-License-Identifier: GPL-2.0 */
-/* architectural status code for SEAMCALL */
-
-#ifndef __KVM_X86_TDX_ERRNO_H
-#define __KVM_X86_TDX_ERRNO_H
+#ifndef _X86_SHARED_TDX_ERRNO_H
+#define _X86_SHARED_TDX_ERRNO_H
+/* Upper 32 bit of the TDX error code encodes the status */
#define TDX_SEAMCALL_STATUS_MASK 0xFFFFFFFF00000000ULL
/*
- * TDX SEAMCALL Status Codes (returned in RAX)
+ * TDX SEAMCALL Status Codes
*/
+#define TDX_SUCCESS 0ULL
#define TDX_NON_RECOVERABLE_VCPU 0x4000000100000000ULL
#define TDX_NON_RECOVERABLE_TD 0x4000000200000000ULL
#define TDX_NON_RECOVERABLE_TD_NON_ACCESSIBLE 0x6000000500000000ULL
@@ -17,6 +17,7 @@
#define TDX_OPERAND_INVALID 0xC000010000000000ULL
#define TDX_OPERAND_BUSY 0x8000020000000000ULL
#define TDX_PREVIOUS_TLB_EPOCH_BUSY 0x8000020100000000ULL
+#define TDX_RND_NO_ENTROPY 0x8000020300000000ULL
#define TDX_PAGE_METADATA_INCORRECT 0xC000030000000000ULL
#define TDX_VCPU_NOT_ASSOCIATED 0x8000070200000000ULL
#define TDX_KEY_GENERATION_FAILED 0x8000080000000000ULL
@@ -28,6 +29,20 @@
#define TDX_EPT_ENTRY_STATE_INCORRECT 0xC0000B0D00000000ULL
#define TDX_METADATA_FIELD_NOT_READABLE 0xC0000C0200000000ULL
+/*
+ * SW-defined error codes.
+ *
+ * Bits 47:40 == 0xFF indicate Reserved status code class that never used by
+ * TDX module.
+ */
+#define TDX_ERROR _BITULL(63)
+#define TDX_NON_RECOVERABLE _BITULL(62)
+#define TDX_SW_ERROR (TDX_ERROR | GENMASK_ULL(47, 40))
+#define TDX_SEAMCALL_VMFAILINVALID (TDX_SW_ERROR | _ULL(0xFFFF0000))
+
+#define TDX_SEAMCALL_GP (TDX_SW_ERROR | X86_TRAP_GP)
+#define TDX_SEAMCALL_UD (TDX_SW_ERROR | X86_TRAP_UD)
+
/*
* TDX module operand ID, appears in 31:0 part of error code as
* detail information
@@ -37,4 +52,4 @@
#define TDX_OPERAND_ID_SEPT 0x92
#define TDX_OPERAND_ID_TD_EPOCH 0xa9
-#endif /* __KVM_X86_TDX_ERRNO_H */
+#endif /* _X86_SHARED_TDX_ERRNO_H */
diff --git a/arch/x86/include/asm/tdx.h b/arch/x86/include/asm/tdx.h
index 7ddef3a69866..0e795e7c0b22 100644
--- a/arch/x86/include/asm/tdx.h
+++ b/arch/x86/include/asm/tdx.h
@@ -12,26 +12,6 @@
#include <asm/trapnr.h>
#include <asm/shared/tdx.h>
-/*
- * SW-defined error codes.
- *
- * Bits 47:40 == 0xFF indicate Reserved status code class that never used by
- * TDX module.
- */
-#define TDX_ERROR _BITUL(63)
-#define TDX_NON_RECOVERABLE _BITUL(62)
-#define TDX_SW_ERROR (TDX_ERROR | GENMASK_ULL(47, 40))
-#define TDX_SEAMCALL_VMFAILINVALID (TDX_SW_ERROR | _UL(0xFFFF0000))
-
-#define TDX_SEAMCALL_GP (TDX_SW_ERROR | X86_TRAP_GP)
-#define TDX_SEAMCALL_UD (TDX_SW_ERROR | X86_TRAP_UD)
-
-/*
- * TDX module SEAMCALL leaf function error codes
- */
-#define TDX_SUCCESS 0ULL
-#define TDX_RND_NO_ENTROPY 0x8000020300000000ULL
-
#ifndef __ASSEMBLER__
#include <uapi/asm/mce.h>
diff --git a/arch/x86/kvm/vmx/tdx.h b/arch/x86/kvm/vmx/tdx.h
index ca39a9391db1..f4e609a745ee 100644
--- a/arch/x86/kvm/vmx/tdx.h
+++ b/arch/x86/kvm/vmx/tdx.h
@@ -3,7 +3,6 @@
#define __KVM_X86_VMX_TDX_H
#include "tdx_arch.h"
-#include "tdx_errno.h"
#ifdef CONFIG_KVM_INTEL_TDX
#include "common.h"
--
2.51.0
On 9/19/2025 7:22 AM, Rick Edgecombe wrote: > From: "Kirill A. Shutemov"<kirill.shutemov@linux.intel.com> > > Today there are two separate locations where TDX error codes are defined: > arch/x86/include/asm/tdx.h > arch/x86/kvm/vmx/tdx.h it's "arch/x86/kvm/vmx/tdx_errno.h" actually. > They have some overlap that is already defined similarly. Reduce the > duplication and prepare to introduce some helpers for these error codes in > the central place by unifying them. Join them at: > asm/shared/tdx_errno.h > ...and update the headers that contained the duplicated definitions to > include the new unified header. > > Opportunistically massage some comments. Also, adjust > _BITUL()->_BITULL() to address 32 bit build errors after the move.
On Fri, 2025-09-26 at 12:52 +0800, Xiaoyao Li wrote: > it's "arch/x86/kvm/vmx/tdx_errno.h" actually. Doh! yes.
On 9/19/2025 7:22 AM, Rick Edgecombe wrote: [...] > +/* > + * SW-defined error codes. > + * > + * Bits 47:40 == 0xFF indicate Reserved status code class that never used by > + * TDX module. > + */ > +#define TDX_ERROR _BITULL(63) > +#define TDX_NON_RECOVERABLE _BITULL(62) TDX_ERROR and TDX_NON_RECOVERABLE are defined in TDX spec as the classes of TDX Interface Functions Completion Status. For clarity, is it better to move the two before the "SW-defined error codes" comment? > +#define TDX_SW_ERROR (TDX_ERROR | GENMASK_ULL(47, 40)) > +#define TDX_SEAMCALL_VMFAILINVALID (TDX_SW_ERROR | _ULL(0xFFFF0000)) > + > +#define TDX_SEAMCALL_GP (TDX_SW_ERROR | X86_TRAP_GP) > +#define TDX_SEAMCALL_UD (TDX_SW_ERROR | X86_TRAP_UD) > + > /* > * TDX module operand ID, appears in 31:0 part of error code as > * detail information > @@ -37,4 +52,4 @@ > #define TDX_OPERAND_ID_SEPT 0x92 > #define TDX_OPERAND_ID_TD_EPOCH 0xa9 > > -#endif /* __KVM_X86_TDX_ERRNO_H */ > +#endif /* _X86_SHARED_TDX_ERRNO_H */ > diff --git a/arch/x86/include/asm/tdx.h b/arch/x86/include/asm/tdx.h > index 7ddef3a69866..0e795e7c0b22 100644 > --- a/arch/x86/include/asm/tdx.h > +++ b/arch/x86/include/asm/tdx.h > @@ -12,26 +12,6 @@ > #include <asm/trapnr.h> > #include <asm/shared/tdx.h> > > -/* > - * SW-defined error codes. > - * > - * Bits 47:40 == 0xFF indicate Reserved status code class that never used by > - * TDX module. > - */ > -#define TDX_ERROR _BITUL(63) > -#define TDX_NON_RECOVERABLE _BITUL(62) > -#define TDX_SW_ERROR (TDX_ERROR | GENMASK_ULL(47, 40)) > -#define TDX_SEAMCALL_VMFAILINVALID (TDX_SW_ERROR | _UL(0xFFFF0000)) > - > -#define TDX_SEAMCALL_GP (TDX_SW_ERROR | X86_TRAP_GP) > -#define TDX_SEAMCALL_UD (TDX_SW_ERROR | X86_TRAP_UD) > - > -/* > - * TDX module SEAMCALL leaf function error codes > - */ > -#define TDX_SUCCESS 0ULL > -#define TDX_RND_NO_ENTROPY 0x8000020300000000ULL > - > #ifndef __ASSEMBLER__ > > #include <uapi/asm/mce.h> > diff --git a/arch/x86/kvm/vmx/tdx.h b/arch/x86/kvm/vmx/tdx.h > index ca39a9391db1..f4e609a745ee 100644 > --- a/arch/x86/kvm/vmx/tdx.h > +++ b/arch/x86/kvm/vmx/tdx.h > @@ -3,7 +3,6 @@ > #define __KVM_X86_VMX_TDX_H > > #include "tdx_arch.h" > -#include "tdx_errno.h" > > #ifdef CONFIG_KVM_INTEL_TDX > #include "common.h"
On Tue, 2025-09-23 at 13:49 +0800, Binbin Wu wrote: > > +/* > > + * SW-defined error codes. > > + * > > + * Bits 47:40 == 0xFF indicate Reserved status code class that never used > > by > > + * TDX module. > > + */ > > +#define TDX_ERROR _BITULL(63) > > +#define TDX_NON_RECOVERABLE _BITULL(62) > > TDX_ERROR and TDX_NON_RECOVERABLE are defined in TDX spec as the classes of > TDX > Interface Functions Completion Status. > > For clarity, is it better to move the two before the "SW-defined error codes" > comment? This hunk is a direct copy, any reason to change it in this patch?
On 9/26/2025 7:09 AM, Edgecombe, Rick P wrote: > On Tue, 2025-09-23 at 13:49 +0800, Binbin Wu wrote: >>> +/* >>> + * SW-defined error codes. >>> + * >>> + * Bits 47:40 == 0xFF indicate Reserved status code class that never used >>> by >>> + * TDX module. >>> + */ >>> +#define TDX_ERROR _BITULL(63) >>> +#define TDX_NON_RECOVERABLE _BITULL(62) >> TDX_ERROR and TDX_NON_RECOVERABLE are defined in TDX spec as the classes of >> TDX >> Interface Functions Completion Status. >> >> For clarity, is it better to move the two before the "SW-defined error codes" >> comment? > This hunk is a direct copy, any reason to change it in this patch? yeah, it can be done separately.
On Thu, 2025-09-18 at 16:22 -0700, Rick Edgecombe wrote: > From: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> > > Today there are two separate locations where TDX error codes are defined: > arch/x86/include/asm/tdx.h > arch/x86/kvm/vmx/tdx.h > > They have some overlap that is already defined similarly. Reduce the > duplication and prepare to introduce some helpers for these error codes in > the central place by unifying them. Join them at: > asm/shared/tdx_errno.h > ...and update the headers that contained the duplicated definitions to > include the new unified header. The existing asm/shared/tdx.h is used for sharing TDX code between the early compressed code and the normal kernel code after that, i.e., it's not for sharing between TDX guest and host. Any reason to put the new tdx_errno.h under asm/shared/ ?
On Fri, 2025-09-19 at 01:29 +0000, Huang, Kai wrote: > The existing asm/shared/tdx.h is used for sharing TDX code between the > early compressed code and the normal kernel code after that, i.e., it's > not for sharing between TDX guest and host. > > Any reason to put the new tdx_errno.h under asm/shared/ ? Well this series doesn't address this, but the compressed code could use IS_TDX_SUCCESS(), etc. I assume the purpose was to put it in a place where all callers could use them. If you think that is good reasoning too, then I think it's worth mentioning in the log.
On Thu, 2025-09-25 at 23:23 +0000, Edgecombe, Rick P wrote: > On Fri, 2025-09-19 at 01:29 +0000, Huang, Kai wrote: > > The existing asm/shared/tdx.h is used for sharing TDX code between the > > early compressed code and the normal kernel code after that, i.e., it's > > not for sharing between TDX guest and host. > > > > Any reason to put the new tdx_errno.h under asm/shared/ ? > > Well this series doesn't address this, but the compressed code could use > IS_TDX_SUCCESS(), etc. I assume the purpose was to put it in a place where all > callers could use them. Sure. > > If you think that is good reasoning too, then I think it's worth mentioning in > the log. I am fine either way. Since (as you said) compressed code isn't changed to use IS_TDX_xx() in this series, it's hard to see the reason (from the code change) why you put it under asm/shared/ w/o explaining it in the changelog.
© 2016 - 2025 Red Hat, Inc.