Pull in recent TDX updates, which are not backwards compatible.

It's just to make this series runnable. It will be updated by script

        scripts/update-linux-headers.sh

once TDX support is upstreamed in linux kernel

Signed-off-by: Xiaoyao Li <xiaoyao...@intel.com>
---
 linux-headers/asm-x86/kvm.h | 90 +++++++++++++++++++++++++++++++++++++
 linux-headers/linux/kvm.h   | 87 +++++++++++++++++++++++++++++++++++
 2 files changed, 177 insertions(+)

diff --git a/linux-headers/asm-x86/kvm.h b/linux-headers/asm-x86/kvm.h
index 003fb745347c..4c3deb0e2a75 100644
--- a/linux-headers/asm-x86/kvm.h
+++ b/linux-headers/asm-x86/kvm.h
@@ -562,5 +562,95 @@ struct kvm_pmu_event_filter {
 
 #define KVM_X86_DEFAULT_VM     0
 #define KVM_X86_SW_PROTECTED_VM        1
+#define KVM_X86_TDX_VM         2
+#define KVM_X86_SNP_VM         3
+
+/* Trust Domain eXtension sub-ioctl() commands. */
+enum kvm_tdx_cmd_id {
+       KVM_TDX_CAPABILITIES = 0,
+       KVM_TDX_INIT_VM,
+       KVM_TDX_INIT_VCPU,
+       KVM_TDX_INIT_MEM_REGION,
+       KVM_TDX_FINALIZE_VM,
+
+       KVM_TDX_CMD_NR_MAX,
+};
+
+struct kvm_tdx_cmd {
+       /* enum kvm_tdx_cmd_id */
+       __u32 id;
+       /* flags for sub-commend. If sub-command doesn't use this, set zero. */
+       __u32 flags;
+       /*
+        * data for each sub-command. An immediate or a pointer to the actual
+        * data in process virtual address.  If sub-command doesn't use it,
+        * set zero.
+        */
+       __u64 data;
+       /*
+        * Auxiliary error code.  The sub-command may return TDX SEAMCALL
+        * status code in addition to -Exxx.
+        * Defined for consistency with struct kvm_sev_cmd.
+        */
+       __u64 error;
+};
+
+struct kvm_tdx_cpuid_config {
+       __u32 leaf;
+       __u32 sub_leaf;
+       __u32 eax;
+       __u32 ebx;
+       __u32 ecx;
+       __u32 edx;
+};
+
+struct kvm_tdx_capabilities {
+       __u64 attrs_fixed0;
+       __u64 attrs_fixed1;
+       __u64 xfam_fixed0;
+       __u64 xfam_fixed1;
+#define TDX_CAP_GPAW_48        (1 << 0)
+#define TDX_CAP_GPAW_52        (1 << 1)
+       __u32 supported_gpaw;
+       __u32 padding;
+       __u64 reserved[251];
+
+       __u32 nr_cpuid_configs;
+       struct kvm_tdx_cpuid_config cpuid_configs[];
+};
+
+struct kvm_tdx_init_vm {
+       __u64 attributes;
+       __u64 mrconfigid[6];    /* sha384 digest */
+       __u64 mrowner[6];       /* sha384 digest */
+       __u64 mrownerconfig[6]; /* sha348 digest */
+       /*
+        * For future extensibility to make sizeof(struct kvm_tdx_init_vm) = 
8KB.
+        * This should be enough given sizeof(TD_PARAMS) = 1024.
+        * 8KB was chosen given because
+        * sizeof(struct kvm_cpuid_entry2) * KVM_MAX_CPUID_ENTRIES(=256) = 8KB.
+        */
+       __u64 reserved[1004];
+
+       /*
+        * Call KVM_TDX_INIT_VM before vcpu creation, thus before
+        * KVM_SET_CPUID2.
+        * This configuration supersedes KVM_SET_CPUID2s for VCPUs because the
+        * TDX module directly virtualizes those CPUIDs without VMM.  The user
+        * space VMM, e.g. qemu, should make KVM_SET_CPUID2 consistent with
+        * those values.  If it doesn't, KVM may have wrong idea of vCPUIDs of
+        * the guest, and KVM may wrongly emulate CPUIDs or MSRs that the TDX
+        * module doesn't virtualize.
+        */
+       struct kvm_cpuid2 cpuid;
+};
+
+#define KVM_TDX_MEASURE_MEMORY_REGION  (1UL << 0)
+
+struct kvm_tdx_init_mem_region {
+       __u64 source_addr;
+       __u64 gpa;
+       __u64 nr_pages;
+};
 
 #endif /* _ASM_X86_KVM_H */
diff --git a/linux-headers/linux/kvm.h b/linux-headers/linux/kvm.h
index 278bed78f98e..280f1730fc27 100644
--- a/linux-headers/linux/kvm.h
+++ b/linux-headers/linux/kvm.h
@@ -237,6 +237,90 @@ struct kvm_xen_exit {
        } u;
 };
 
+struct kvm_tdx_exit {
+#define KVM_EXIT_TDX_VMCALL    1
+       __u32 type;
+       __u32 pad;
+
+       union {
+               struct kvm_tdx_vmcall {
+                       /*
+                        * RAX(bit 0), RCX(bit 1) and RSP(bit 4) are reserved.
+                        * RAX(bit 0): TDG.VP.VMCALL status code.
+                        * RCX(bit 1): bitmap for used registers.
+                        * RSP(bit 4): the caller stack.
+                        */
+#define TDX_VMCALL_REG_MASK_RBX        BIT_ULL(2)
+#define TDX_VMCALL_REG_MASK_RDX        BIT_ULL(3)
+#define TDX_VMCALL_REG_MASK_RSI        BIT_ULL(6)
+#define TDX_VMCALL_REG_MASK_RDI        BIT_ULL(7)
+#define TDX_VMCALL_REG_MASK_R8 BIT_ULL(8)
+#define TDX_VMCALL_REG_MASK_R9 BIT_ULL(9)
+#define TDX_VMCALL_REG_MASK_R10        BIT_ULL(10)
+#define TDX_VMCALL_REG_MASK_R11        BIT_ULL(11)
+#define TDX_VMCALL_REG_MASK_R12        BIT_ULL(12)
+#define TDX_VMCALL_REG_MASK_R13        BIT_ULL(13)
+#define TDX_VMCALL_REG_MASK_R14        BIT_ULL(14)
+#define TDX_VMCALL_REG_MASK_R15        BIT_ULL(15)
+                       union {
+                               __u64 in_rcx;
+                               __u64 reg_mask;
+                       };
+
+                       /*
+                        * Guest-Host-Communication Interface for TDX spec
+                        * defines the ABI for TDG.VP.VMCALL.
+                        */
+                       /* Input parameters: guest -> VMM */
+                       union {
+                               __u64 in_r10;
+                               __u64 type;
+                       };
+                       union {
+                               __u64 in_r11;
+                               __u64 subfunction;
+                       };
+                       /*
+                        * Subfunction specific.
+                        * Registers are used in this order to pass input
+                        * arguments.  r12=arg0, r13=arg1, etc.
+                        */
+                       __u64 in_r12;
+                       __u64 in_r13;
+                       __u64 in_r14;
+                       __u64 in_r15;
+                       __u64 in_rbx;
+                       __u64 in_rdi;
+                       __u64 in_rsi;
+                       __u64 in_r8;
+                       __u64 in_r9;
+                       __u64 in_rdx;
+
+                       /* Output parameters: VMM -> guest */
+                       union {
+                               __u64 out_r10;
+                               __u64 status_code;
+                       };
+                       /*
+                        * Subfunction specific.
+                        * Registers are used in this order to output return
+                        * values.  r11=ret0, r12=ret1, etc.
+                        */
+                       __u64 out_r11;
+                       __u64 out_r12;
+                       __u64 out_r13;
+                       __u64 out_r14;
+                       __u64 out_r15;
+                       __u64 out_rbx;
+                       __u64 out_rdi;
+                       __u64 out_rsi;
+                       __u64 out_r8;
+                       __u64 out_r9;
+                       __u64 out_rdx;
+               } vmcall;
+       } u;
+};
+
 #define KVM_S390_GET_SKEYS_NONE   1
 #define KVM_S390_SKEYS_MAX        1048576
 
@@ -279,6 +363,7 @@ struct kvm_xen_exit {
 #define KVM_EXIT_RISCV_CSR        36
 #define KVM_EXIT_NOTIFY           37
 #define KVM_EXIT_MEMORY_FAULT     38
+#define KVM_EXIT_TDX              39
 
 /* For KVM_EXIT_INTERNAL_ERROR */
 /* Emulate instruction failed. */
@@ -528,6 +613,8 @@ struct kvm_run {
                        __u64 gpa;
                        __u64 size;
                } memory;
+               /* KVM_EXIT_TDX_VMCALL */
+               struct kvm_tdx_exit tdx;
                /* Fix the size of the union. */
                char padding[256];
        };
-- 
2.34.1


Reply via email to