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