@@ -51,6 +51,7 @@
#include "migration/blocker.h"
#include "exec/memattrs.h"
#include "trace.h"
+#include "tdx.h"
//#define DEBUG_KVM
@@ -2184,6 +2185,12 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
return ret;
}
+ ret = tdx_kvm_init(ms->cgs, &local_err);
+ if (ret < 0) {
+ error_report_err(local_err);
+ return ret;
+ }
+
if (!kvm_check_extension(s, KVM_CAP_IRQ_ROUTING)) {
error_report("kvm: KVM_CAP_IRQ_ROUTING not supported by KVM");
return -ENOTSUP;
@@ -56,6 +56,26 @@ static void __tdx_ioctl(int ioctl_no, const char *ioctl_name,
#define tdx_ioctl(ioctl_no, metadata, data) \
__tdx_ioctl(ioctl_no, stringify(ioctl_no), metadata, data)
+static void tdx_finalize_vm(Notifier *notifier, void *unused)
+{
+ tdx_ioctl(KVM_TDX_FINALIZE_VM, 0, NULL);
+}
+
+static Notifier tdx_machine_done_late_notify = {
+ .notify = tdx_finalize_vm,
+};
+
+int tdx_kvm_init(ConfidentialGuestSupport *cgs, Error **errp)
+{
+ TdxGuest *tdx = (TdxGuest *)object_dynamic_cast(OBJECT(cgs),
+ TYPE_TDX_GUEST);
+ if (tdx) {
+ qemu_add_machine_init_done_late_notifier(
+ &tdx_machine_done_late_notify);
+ }
+ return 0;
+}
+
void tdx_pre_create_vcpu(CPUState *cpu)
{
struct {
@@ -2,6 +2,7 @@
#define QEMU_I386_TDX_H
#include "qom/object.h"
+#include "qapi/error.h"
#include "exec/confidential-guest-support.h"
#define TYPE_TDX_GUEST "tdx-guest"
@@ -21,4 +22,6 @@ typedef struct TdxGuest {
bool debug;
} TdxGuest;
+int tdx_kvm_init(ConfidentialGuestSupport *cgs, Error **errp);
+
#endif