On Fri, Mar 22, 2024 at 03:06:35PM +0800, Yuan Yao <yuan.yao@xxxxxxxxxxxxxxx> wrote: > On Mon, Feb 26, 2024 at 12:25:29AM -0800, isaku.yamahata@xxxxxxxxx wrote: > > From: Isaku Yamahata <isaku.yamahata@xxxxxxxxx> > > > > Define architectural definitions for KVM to issue the TDX SEAMCALLs. > > > > Structures and values that are architecturally defined in the TDX module > > specifications the chapter of ABI Reference. > > > > Co-developed-by: Sean Christopherson <sean.j.christopherson@xxxxxxxxx> > > Signed-off-by: Sean Christopherson <sean.j.christopherson@xxxxxxxxx> > > Signed-off-by: Isaku Yamahata <isaku.yamahata@xxxxxxxxx> > > Reviewed-by: Paolo Bonzini <pbonzini@xxxxxxxxxx> > > Reviewed-by: Xiaoyao Li <xiaoyao.li@xxxxxxxxx> > > --- > > v19: > > - drop tdvmcall constants by Xiaoyao > > > > v18: > > - Add metadata field id > > > > Signed-off-by: Isaku Yamahata <isaku.yamahata@xxxxxxxxx> > > --- > > arch/x86/kvm/vmx/tdx_arch.h | 265 ++++++++++++++++++++++++++++++++++++ > > 1 file changed, 265 insertions(+) > > create mode 100644 arch/x86/kvm/vmx/tdx_arch.h > > > > diff --git a/arch/x86/kvm/vmx/tdx_arch.h b/arch/x86/kvm/vmx/tdx_arch.h > > new file mode 100644 > > index 000000000000..e2c1a6f429d7 > > --- /dev/null > > +++ b/arch/x86/kvm/vmx/tdx_arch.h > > @@ -0,0 +1,265 @@ > > +/* SPDX-License-Identifier: GPL-2.0 */ > > +/* architectural constants/data definitions for TDX SEAMCALLs */ > > + > > +#ifndef __KVM_X86_TDX_ARCH_H > > +#define __KVM_X86_TDX_ARCH_H > > + > > +#include <linux/types.h> > > + > > +/* > > + * TDX SEAMCALL API function leaves > > + */ > > +#define TDH_VP_ENTER 0 > > +#define TDH_MNG_ADDCX 1 > > +#define TDH_MEM_PAGE_ADD 2 > > +#define TDH_MEM_SEPT_ADD 3 > > +#define TDH_VP_ADDCX 4 > > +#define TDH_MEM_PAGE_RELOCATE 5 > > +#define TDH_MEM_PAGE_AUG 6 > > +#define TDH_MEM_RANGE_BLOCK 7 > > +#define TDH_MNG_KEY_CONFIG 8 > > +#define TDH_MNG_CREATE 9 > > +#define TDH_VP_CREATE 10 > > +#define TDH_MNG_RD 11 > > +#define TDH_MR_EXTEND 16 > > +#define TDH_MR_FINALIZE 17 > > +#define TDH_VP_FLUSH 18 > > +#define TDH_MNG_VPFLUSHDONE 19 > > +#define TDH_MNG_KEY_FREEID 20 > > +#define TDH_MNG_INIT 21 > > +#define TDH_VP_INIT 22 > > +#define TDH_MEM_SEPT_RD 25 > > +#define TDH_VP_RD 26 > > +#define TDH_MNG_KEY_RECLAIMID 27 > > +#define TDH_PHYMEM_PAGE_RECLAIM 28 > > +#define TDH_MEM_PAGE_REMOVE 29 > > +#define TDH_MEM_SEPT_REMOVE 30 > > +#define TDH_SYS_RD 34 > > +#define TDH_MEM_TRACK 38 > > +#define TDH_MEM_RANGE_UNBLOCK 39 > > +#define TDH_PHYMEM_CACHE_WB 40 > > +#define TDH_PHYMEM_PAGE_WBINVD 41 > > +#define TDH_VP_WR 43 > > +#define TDH_SYS_LP_SHUTDOWN 44 > > + > > +/* TDX control structure (TDR/TDCS/TDVPS) field access codes */ > > +#define TDX_NON_ARCH BIT_ULL(63) > > +#define TDX_CLASS_SHIFT 56 > > +#define TDX_FIELD_MASK GENMASK_ULL(31, 0) > > + > > +#define __BUILD_TDX_FIELD(non_arch, class, field) \ > > + (((non_arch) ? TDX_NON_ARCH : 0) | \ > > + ((u64)(class) << TDX_CLASS_SHIFT) | \ > > + ((u64)(field) & TDX_FIELD_MASK)) > > + > > +#define BUILD_TDX_FIELD(class, field) \ > > + __BUILD_TDX_FIELD(false, (class), (field)) > > + > > +#define BUILD_TDX_FIELD_NON_ARCH(class, field) \ > > + __BUILD_TDX_FIELD(true, (class), (field)) > > + > > + > > +/* Class code for TD */ > > +#define TD_CLASS_EXECUTION_CONTROLS 17ULL > > + > > +/* Class code for TDVPS */ > > +#define TDVPS_CLASS_VMCS 0ULL > > +#define TDVPS_CLASS_GUEST_GPR 16ULL > > +#define TDVPS_CLASS_OTHER_GUEST 17ULL > > +#define TDVPS_CLASS_MANAGEMENT 32ULL > > + > > +enum tdx_tdcs_execution_control { > > + TD_TDCS_EXEC_TSC_OFFSET = 10, > > +}; > > + > > +/* @field is any of enum tdx_tdcs_execution_control */ > > +#define TDCS_EXEC(field) BUILD_TDX_FIELD(TD_CLASS_EXECUTION_CONTROLS, (field)) > > + > > +/* @field is the VMCS field encoding */ > > +#define TDVPS_VMCS(field) BUILD_TDX_FIELD(TDVPS_CLASS_VMCS, (field)) > > + > > +enum tdx_vcpu_guest_other_state { > > + TD_VCPU_STATE_DETAILS_NON_ARCH = 0x100, > > +}; > > + > > +union tdx_vcpu_state_details { > > + struct { > > + u64 vmxip : 1; > > + u64 reserved : 63; > > + }; > > + u64 full; > > +}; > > + > > +/* @field is any of enum tdx_guest_other_state */ > > +#define TDVPS_STATE(field) BUILD_TDX_FIELD(TDVPS_CLASS_OTHER_GUEST, (field)) > > +#define TDVPS_STATE_NON_ARCH(field) BUILD_TDX_FIELD_NON_ARCH(TDVPS_CLASS_OTHER_GUEST, (field)) > > + > > +/* Management class fields */ > > +enum tdx_vcpu_guest_management { > > + TD_VCPU_PEND_NMI = 11, > > +}; > > + > > +/* @field is any of enum tdx_vcpu_guest_management */ > > +#define TDVPS_MANAGEMENT(field) BUILD_TDX_FIELD(TDVPS_CLASS_MANAGEMENT, (field)) > > + > > +#define TDX_EXTENDMR_CHUNKSIZE 256 > > + > > +struct tdx_cpuid_value { > > + u32 eax; > > + u32 ebx; > > + u32 ecx; > > + u32 edx; > > +} __packed; > > + > > +#define TDX_TD_ATTRIBUTE_DEBUG BIT_ULL(0) > > This series doesn't really touch off-TD things, so you can remove this. Yes. I'll clean up to delete unused ones including this. -- Isaku Yamahata <isaku.yamahata@xxxxxxxxx>