xref: /openbmc/qemu/target/i386/kvm/tdx.h (revision b92b39af4219df4250f121f64d215506909c7404)
1756e12e7SXiaoyao Li /* SPDX-License-Identifier: GPL-2.0-or-later */
2756e12e7SXiaoyao Li 
3756e12e7SXiaoyao Li #ifndef QEMU_I386_TDX_H
4756e12e7SXiaoyao Li #define QEMU_I386_TDX_H
5756e12e7SXiaoyao Li 
61619d0e4SXiaoyao Li #ifndef CONFIG_USER_ONLY
71619d0e4SXiaoyao Li #include CONFIG_DEVICES /* CONFIG_TDX */
81619d0e4SXiaoyao Li #endif
91619d0e4SXiaoyao Li 
10756e12e7SXiaoyao Li #include "confidential-guest.h"
1198dbfd68SXiaoyao Li #include "cpu.h"
12cb5d65a8SXiaoyao Li #include "hw/i386/tdvf.h"
13756e12e7SXiaoyao Li 
1440da501dSIsaku Yamahata #include "tdx-quote-generator.h"
1540da501dSIsaku Yamahata 
16756e12e7SXiaoyao Li #define TYPE_TDX_GUEST "tdx-guest"
17756e12e7SXiaoyao Li #define TDX_GUEST(obj)  OBJECT_CHECK(TdxGuest, (obj), TYPE_TDX_GUEST)
18756e12e7SXiaoyao Li 
19756e12e7SXiaoyao Li typedef struct TdxGuestClass {
20756e12e7SXiaoyao Li     X86ConfidentialGuestClass parent_class;
21756e12e7SXiaoyao Li } TdxGuestClass;
22756e12e7SXiaoyao Li 
23d529a2acSXiaoyao Li /* TDX requires bus frequency 25MHz */
24d529a2acSXiaoyao Li #define TDX_APIC_BUS_CYCLES_NS 40
25d529a2acSXiaoyao Li 
26427b8cf4SBinbin Wu #define TDVMCALL_GET_TD_VM_CALL_INFO    0x10000
2740da501dSIsaku Yamahata #define TDVMCALL_GET_QUOTE		 0x10002
28*efa742b2SXiaoyao Li #define TDVMCALL_SETUP_EVENT_NOTIFY_INTERRUPT   0x10004
29427b8cf4SBinbin Wu 
30427b8cf4SBinbin Wu #define TDG_VP_VMCALL_SUCCESS           0x0000000000000000ULL
31427b8cf4SBinbin Wu #define TDG_VP_VMCALL_RETRY             0x0000000000000001ULL
32427b8cf4SBinbin Wu #define TDG_VP_VMCALL_INVALID_OPERAND   0x8000000000000000ULL
33427b8cf4SBinbin Wu #define TDG_VP_VMCALL_GPA_INUSE         0x8000000000000001ULL
34427b8cf4SBinbin Wu #define TDG_VP_VMCALL_ALIGN_ERROR       0x8000000000000002ULL
35427b8cf4SBinbin Wu 
36*efa742b2SXiaoyao Li #define TDG_VP_VMCALL_SUBFUNC_SET_EVENT_NOTIFY_INTERRUPT BIT_ULL(1)
37*efa742b2SXiaoyao Li 
38f18672e4SXiaoyao Li enum TdxRamType {
39f18672e4SXiaoyao Li     TDX_RAM_UNACCEPTED,
40f18672e4SXiaoyao Li     TDX_RAM_ADDED,
41f18672e4SXiaoyao Li };
42f18672e4SXiaoyao Li 
43f18672e4SXiaoyao Li typedef struct TdxRamEntry {
44f18672e4SXiaoyao Li     uint64_t address;
45f18672e4SXiaoyao Li     uint64_t length;
46f18672e4SXiaoyao Li     enum TdxRamType type;
47f18672e4SXiaoyao Li } TdxRamEntry;
48f18672e4SXiaoyao Li 
49756e12e7SXiaoyao Li typedef struct TdxGuest {
50756e12e7SXiaoyao Li     X86ConfidentialGuest parent_obj;
51756e12e7SXiaoyao Li 
52f15898b0SXiaoyao Li     QemuMutex lock;
53f15898b0SXiaoyao Li 
54f15898b0SXiaoyao Li     bool initialized;
55756e12e7SXiaoyao Li     uint64_t attributes;    /* TD attributes */
56f15898b0SXiaoyao Li     uint64_t xfam;
57a38da9f4SXiaoyao Li     char *mrconfigid;       /* base64 encoded sha384 digest */
58a38da9f4SXiaoyao Li     char *mrowner;          /* base64 encoded sha384 digest */
59a38da9f4SXiaoyao Li     char *mrownerconfig;    /* base64 encoded sha384 digest */
600dd5fe5eSChao Peng 
610dd5fe5eSChao Peng     MemoryRegion *tdvf_mr;
62cb5d65a8SXiaoyao Li     TdxFirmware tdvf;
63f18672e4SXiaoyao Li 
64f18672e4SXiaoyao Li     uint32_t nr_ram_entries;
65f18672e4SXiaoyao Li     TdxRamEntry *ram_entries;
6640da501dSIsaku Yamahata 
6740da501dSIsaku Yamahata     /* GetQuote */
6840da501dSIsaku Yamahata     SocketAddress *qg_sock_addr;
6940da501dSIsaku Yamahata     int num;
70*efa742b2SXiaoyao Li 
71*efa742b2SXiaoyao Li     uint32_t event_notify_vector;
72*efa742b2SXiaoyao Li     uint32_t event_notify_apicid;
73756e12e7SXiaoyao Li } TdxGuest;
74756e12e7SXiaoyao Li 
751619d0e4SXiaoyao Li #ifdef CONFIG_TDX
761619d0e4SXiaoyao Li bool is_tdx_vm(void);
771619d0e4SXiaoyao Li #else
781619d0e4SXiaoyao Li #define is_tdx_vm() 0
791619d0e4SXiaoyao Li #endif /* CONFIG_TDX */
801619d0e4SXiaoyao Li 
81f15898b0SXiaoyao Li int tdx_pre_create_vcpu(CPUState *cpu, Error **errp);
820dd5fe5eSChao Peng void tdx_set_tdvf_region(MemoryRegion *tdvf_mr);
83cb5d65a8SXiaoyao Li int tdx_parse_tdvf(void *flash_ptr, int size);
8498dbfd68SXiaoyao Li int tdx_handle_report_fatal_error(X86CPU *cpu, struct kvm_run *run);
8540da501dSIsaku Yamahata void tdx_handle_get_quote(X86CPU *cpu, struct kvm_run *run);
86427b8cf4SBinbin Wu void tdx_handle_get_tdvmcall_info(X86CPU *cpu, struct kvm_run *run);
87*efa742b2SXiaoyao Li void tdx_handle_setup_event_notify_interrupt(X86CPU *cpu, struct kvm_run *run);
88f15898b0SXiaoyao Li 
89756e12e7SXiaoyao Li #endif /* QEMU_I386_TDX_H */
90