112 lines
3.9 KiB
Diff
112 lines
3.9 KiB
Diff
From 432fbc1dacdb5de4fb3af42e21749c53cd26a855 Mon Sep 17 00:00:00 2001
|
|
From: Paolo Bonzini <pbonzini@redhat.com>
|
|
Date: Fri, 18 Jul 2025 18:03:49 +0200
|
|
Subject: [PATCH 092/115] i386/tdx: handle TDG.VP.VMCALL<GetTdVmCallInfo>
|
|
|
|
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
|
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
|
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
|
RH-Acked-by: Yash Mankad <None>
|
|
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
|
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
|
RH-Commit: [92/115] 443c167d16e725f756cab6371aad04b7c2b4f15a (bonzini/rhel-qemu-kvm)
|
|
|
|
Signed-off-by: Binbin Wu <binbin.wu@linux.intel.com>
|
|
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
(cherry picked from commit 427b8cf47a6959cd8b0db12bcf66e9009afa2c07)
|
|
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
---
|
|
target/i386/kvm/kvm.c | 12 ++++++++++++
|
|
target/i386/kvm/tdx-stub.c | 4 ++++
|
|
target/i386/kvm/tdx.c | 12 ++++++++++++
|
|
target/i386/kvm/tdx.h | 9 +++++++++
|
|
4 files changed, 37 insertions(+)
|
|
|
|
diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
|
|
index b6fddcd543..26328a1d3b 100644
|
|
--- a/target/i386/kvm/kvm.c
|
|
+++ b/target/i386/kvm/kvm.c
|
|
@@ -6039,6 +6039,18 @@ int kvm_arch_handle_exit(CPUState *cs, struct kvm_run *run)
|
|
break;
|
|
}
|
|
break;
|
|
+ case KVM_EXIT_TDX:
|
|
+ /*
|
|
+ * run->tdx is already set up for the case where userspace
|
|
+ * does not handle the TDVMCALL.
|
|
+ */
|
|
+ switch (run->tdx.nr) {
|
|
+ case TDVMCALL_GET_TD_VM_CALL_INFO:
|
|
+ tdx_handle_get_tdvmcall_info(cpu, run);
|
|
+ break;
|
|
+ }
|
|
+ ret = 0;
|
|
+ break;
|
|
default:
|
|
fprintf(stderr, "KVM: unknown exit reason %d\n", run->exit_reason);
|
|
ret = -1;
|
|
diff --git a/target/i386/kvm/tdx-stub.c b/target/i386/kvm/tdx-stub.c
|
|
index 720a4ff046..62a12a0677 100644
|
|
--- a/target/i386/kvm/tdx-stub.c
|
|
+++ b/target/i386/kvm/tdx-stub.c
|
|
@@ -18,3 +18,7 @@ int tdx_handle_report_fatal_error(X86CPU *cpu, struct kvm_run *run)
|
|
{
|
|
return -EINVAL;
|
|
}
|
|
+
|
|
+void tdx_handle_get_tdvmcall_info(X86CPU *cpu, struct kvm_run *run)
|
|
+{
|
|
+}
|
|
diff --git a/target/i386/kvm/tdx.c b/target/i386/kvm/tdx.c
|
|
index ed3a55991a..e0197b6582 100644
|
|
--- a/target/i386/kvm/tdx.c
|
|
+++ b/target/i386/kvm/tdx.c
|
|
@@ -1120,6 +1120,18 @@ int tdx_parse_tdvf(void *flash_ptr, int size)
|
|
return tdvf_parse_metadata(&tdx_guest->tdvf, flash_ptr, size);
|
|
}
|
|
|
|
+void tdx_handle_get_tdvmcall_info(X86CPU *cpu, struct kvm_run *run)
|
|
+{
|
|
+ if (run->tdx.get_tdvmcall_info.leaf != 1) {
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ run->tdx.get_tdvmcall_info.r11 = 0;
|
|
+ run->tdx.get_tdvmcall_info.r12 = 0;
|
|
+ run->tdx.get_tdvmcall_info.r13 = 0;
|
|
+ run->tdx.get_tdvmcall_info.r14 = 0;
|
|
+}
|
|
+
|
|
static void tdx_panicked_on_fatal_error(X86CPU *cpu, uint64_t error_code,
|
|
char *message, uint64_t gpa)
|
|
{
|
|
diff --git a/target/i386/kvm/tdx.h b/target/i386/kvm/tdx.h
|
|
index 8dd66e9014..0dd41d5811 100644
|
|
--- a/target/i386/kvm/tdx.h
|
|
+++ b/target/i386/kvm/tdx.h
|
|
@@ -21,6 +21,14 @@ typedef struct TdxGuestClass {
|
|
/* TDX requires bus frequency 25MHz */
|
|
#define TDX_APIC_BUS_CYCLES_NS 40
|
|
|
|
+#define TDVMCALL_GET_TD_VM_CALL_INFO 0x10000
|
|
+
|
|
+#define TDG_VP_VMCALL_SUCCESS 0x0000000000000000ULL
|
|
+#define TDG_VP_VMCALL_RETRY 0x0000000000000001ULL
|
|
+#define TDG_VP_VMCALL_INVALID_OPERAND 0x8000000000000000ULL
|
|
+#define TDG_VP_VMCALL_GPA_INUSE 0x8000000000000001ULL
|
|
+#define TDG_VP_VMCALL_ALIGN_ERROR 0x8000000000000002ULL
|
|
+
|
|
enum TdxRamType {
|
|
TDX_RAM_UNACCEPTED,
|
|
TDX_RAM_ADDED,
|
|
@@ -61,5 +69,6 @@ int tdx_pre_create_vcpu(CPUState *cpu, Error **errp);
|
|
void tdx_set_tdvf_region(MemoryRegion *tdvf_mr);
|
|
int tdx_parse_tdvf(void *flash_ptr, int size);
|
|
int tdx_handle_report_fatal_error(X86CPU *cpu, struct kvm_run *run);
|
|
+void tdx_handle_get_tdvmcall_info(X86CPU *cpu, struct kvm_run *run);
|
|
|
|
#endif /* QEMU_I386_TDX_H */
|
|
--
|
|
2.50.1
|
|
|