1756e12e7SXiaoyao Li /* 2756e12e7SXiaoyao Li * QEMU TDX support 3756e12e7SXiaoyao Li * 4756e12e7SXiaoyao Li * Copyright (c) 2025 Intel Corporation 5756e12e7SXiaoyao Li * 6756e12e7SXiaoyao Li * Author: 7756e12e7SXiaoyao Li * Xiaoyao Li <xiaoyao.li@intel.com> 8756e12e7SXiaoyao Li * 9756e12e7SXiaoyao Li * SPDX-License-Identifier: GPL-2.0-or-later 10756e12e7SXiaoyao Li */ 11756e12e7SXiaoyao Li 12756e12e7SXiaoyao Li #include "qemu/osdep.h" 13756e12e7SXiaoyao Li #include "qom/object_interfaces.h" 14756e12e7SXiaoyao Li 15*631a2ac5SXiaoyao Li #include "hw/i386/x86.h" 16b455880eSXiaoyao Li #include "kvm_i386.h" 17756e12e7SXiaoyao Li #include "tdx.h" 18756e12e7SXiaoyao Li 19*631a2ac5SXiaoyao Li static int tdx_kvm_init(ConfidentialGuestSupport *cgs, Error **errp) 20*631a2ac5SXiaoyao Li { 21*631a2ac5SXiaoyao Li kvm_mark_guest_state_protected(); 22*631a2ac5SXiaoyao Li 23*631a2ac5SXiaoyao Li return 0; 24*631a2ac5SXiaoyao Li } 25*631a2ac5SXiaoyao Li 26b455880eSXiaoyao Li static int tdx_kvm_type(X86ConfidentialGuest *cg) 27b455880eSXiaoyao Li { 28b455880eSXiaoyao Li /* Do the object check */ 29b455880eSXiaoyao Li TDX_GUEST(cg); 30b455880eSXiaoyao Li 31b455880eSXiaoyao Li return KVM_X86_TDX_VM; 32b455880eSXiaoyao Li } 33b455880eSXiaoyao Li 34756e12e7SXiaoyao Li /* tdx guest */ 35756e12e7SXiaoyao Li OBJECT_DEFINE_TYPE_WITH_INTERFACES(TdxGuest, 36756e12e7SXiaoyao Li tdx_guest, 37756e12e7SXiaoyao Li TDX_GUEST, 38756e12e7SXiaoyao Li X86_CONFIDENTIAL_GUEST, 39756e12e7SXiaoyao Li { TYPE_USER_CREATABLE }, 40756e12e7SXiaoyao Li { NULL }) 41756e12e7SXiaoyao Li 42756e12e7SXiaoyao Li static void tdx_guest_init(Object *obj) 43756e12e7SXiaoyao Li { 44756e12e7SXiaoyao Li ConfidentialGuestSupport *cgs = CONFIDENTIAL_GUEST_SUPPORT(obj); 45756e12e7SXiaoyao Li TdxGuest *tdx = TDX_GUEST(obj); 46756e12e7SXiaoyao Li 47756e12e7SXiaoyao Li cgs->require_guest_memfd = true; 48756e12e7SXiaoyao Li tdx->attributes = 0; 49756e12e7SXiaoyao Li 50756e12e7SXiaoyao Li object_property_add_uint64_ptr(obj, "attributes", &tdx->attributes, 51756e12e7SXiaoyao Li OBJ_PROP_FLAG_READWRITE); 52756e12e7SXiaoyao Li } 53756e12e7SXiaoyao Li 54756e12e7SXiaoyao Li static void tdx_guest_finalize(Object *obj) 55756e12e7SXiaoyao Li { 56756e12e7SXiaoyao Li } 57756e12e7SXiaoyao Li 58756e12e7SXiaoyao Li static void tdx_guest_class_init(ObjectClass *oc, const void *data) 59756e12e7SXiaoyao Li { 60*631a2ac5SXiaoyao Li ConfidentialGuestSupportClass *klass = CONFIDENTIAL_GUEST_SUPPORT_CLASS(oc); 61b455880eSXiaoyao Li X86ConfidentialGuestClass *x86_klass = X86_CONFIDENTIAL_GUEST_CLASS(oc); 62b455880eSXiaoyao Li 63*631a2ac5SXiaoyao Li klass->kvm_init = tdx_kvm_init; 64b455880eSXiaoyao Li x86_klass->kvm_type = tdx_kvm_type; 65756e12e7SXiaoyao Li } 66