xref: /qemu/target/i386/kvm/tdx.c (revision 631a2ac5a4beab740b342367550562cd659b4c4a)
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