KVM: TDX: Add TDX "architectural" error codes
authorSean Christopherson <sean.j.christopherson@intel.com>
Wed, 30 Oct 2024 19:00:26 +0000 (12:00 -0700)
committerPaolo Bonzini <pbonzini@redhat.com>
Fri, 14 Mar 2025 18:20:50 +0000 (14:20 -0400)
Add error codes for the TDX SEAMCALLs both for TDX VMM side for TDH
SEAMCALL and TDX guest side for TDG.VP.VMCALL.  KVM issues the TDX
SEAMCALLs and checks its error code.  KVM handles hypercall from the TDX
guest and may return an error.  So error code for the TDX guest is also
needed.

TDX SEAMCALL uses bits 31:0 to return more information, so these error
codes will only exactly match RAX[63:32].  Error codes for TDG.VP.VMCALL is
defined by TDX Guest-Host-Communication interface spec.

Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>
Signed-off-by: Isaku Yamahata <isaku.yamahata@intel.com>
Signed-off-by: Rick Edgecombe <rick.p.edgecombe@intel.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: Yuan Yao <yuan.yao@intel.com>
Reviewed-by: Xiaoyao Li <xiaoyao.li@intel.com>
Message-ID: <20241030190039.77971-14-rick.p.edgecombe@intel.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/include/asm/shared/tdx.h
arch/x86/kvm/vmx/tdx.h
arch/x86/kvm/vmx/tdx_errno.h [new file with mode: 0644]

index fcbbef484a78e52c762bb2f55bbce7a80b02a55d..4aedab1f2a1aa0c8dfe22eaca205c961d595383d 100644 (file)
 #define TDVMCALL_GET_QUOTE             0x10002
 #define TDVMCALL_REPORT_FATAL_ERROR    0x10003
 
-#define TDVMCALL_STATUS_RETRY          1
+/*
+ * TDG.VP.VMCALL Status Codes (returned in R10)
+ */
+#define TDVMCALL_STATUS_SUCCESS                0x0000000000000000ULL
+#define TDVMCALL_STATUS_RETRY          0x0000000000000001ULL
+#define TDVMCALL_STATUS_INVALID_OPERAND        0x8000000000000000ULL
 
 /*
  * Bitmasks of exposed registers (with VMM).
index cf050c78ad65f7b8a125669bba1b620a77dc9352..f1e861cbee3bafa789ed2bc411b94064101889c1 100644 (file)
@@ -3,6 +3,7 @@
 #define __KVM_X86_VMX_TDX_H
 
 #include "tdx_arch.h"
+#include "tdx_errno.h"
 
 #ifdef CONFIG_KVM_INTEL_TDX
 int tdx_bringup(void);
diff --git a/arch/x86/kvm/vmx/tdx_errno.h b/arch/x86/kvm/vmx/tdx_errno.h
new file mode 100644 (file)
index 0000000..dc3fa2a
--- /dev/null
@@ -0,0 +1,36 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/* architectural status code for SEAMCALL */
+
+#ifndef __KVM_X86_TDX_ERRNO_H
+#define __KVM_X86_TDX_ERRNO_H
+
+#define TDX_SEAMCALL_STATUS_MASK               0xFFFFFFFF00000000ULL
+
+/*
+ * TDX SEAMCALL Status Codes (returned in RAX)
+ */
+#define TDX_NON_RECOVERABLE_VCPU               0x4000000100000000ULL
+#define TDX_INTERRUPTED_RESUMABLE              0x8000000300000000ULL
+#define TDX_OPERAND_INVALID                    0xC000010000000000ULL
+#define TDX_OPERAND_BUSY                       0x8000020000000000ULL
+#define TDX_PREVIOUS_TLB_EPOCH_BUSY            0x8000020100000000ULL
+#define TDX_PAGE_METADATA_INCORRECT            0xC000030000000000ULL
+#define TDX_VCPU_NOT_ASSOCIATED                        0x8000070200000000ULL
+#define TDX_KEY_GENERATION_FAILED              0x8000080000000000ULL
+#define TDX_KEY_STATE_INCORRECT                        0xC000081100000000ULL
+#define TDX_KEY_CONFIGURED                     0x0000081500000000ULL
+#define TDX_NO_HKID_READY_TO_WBCACHE           0x0000082100000000ULL
+#define TDX_FLUSHVP_NOT_DONE                   0x8000082400000000ULL
+#define TDX_EPT_WALK_FAILED                    0xC0000B0000000000ULL
+#define TDX_EPT_ENTRY_STATE_INCORRECT          0xC0000B0D00000000ULL
+
+/*
+ * TDX module operand ID, appears in 31:0 part of error code as
+ * detail information
+ */
+#define TDX_OPERAND_ID_RCX                     0x01
+#define TDX_OPERAND_ID_TDR                     0x80
+#define TDX_OPERAND_ID_SEPT                    0x92
+#define TDX_OPERAND_ID_TD_EPOCH                        0xa9
+
+#endif /* __KVM_X86_TDX_ERRNO_H */