xref: /qemu/target/i386/kvm/tdx.h (revision 98721058d6d50ef218e0c26e4f67c8ef96965859)
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
3 #ifndef QEMU_I386_TDX_H
4 #define QEMU_I386_TDX_H
5 
6 #ifndef CONFIG_USER_ONLY
7 #include CONFIG_DEVICES /* CONFIG_TDX */
8 #endif
9 
10 #include "confidential-guest.h"
11 #include "cpu.h"
12 #include "hw/i386/tdvf.h"
13 
14 #define TYPE_TDX_GUEST "tdx-guest"
15 #define TDX_GUEST(obj)  OBJECT_CHECK(TdxGuest, (obj), TYPE_TDX_GUEST)
16 
17 typedef struct TdxGuestClass {
18     X86ConfidentialGuestClass parent_class;
19 } TdxGuestClass;
20 
21 /* TDX requires bus frequency 25MHz */
22 #define TDX_APIC_BUS_CYCLES_NS 40
23 
24 enum TdxRamType {
25     TDX_RAM_UNACCEPTED,
26     TDX_RAM_ADDED,
27 };
28 
29 typedef struct TdxRamEntry {
30     uint64_t address;
31     uint64_t length;
32     enum TdxRamType type;
33 } TdxRamEntry;
34 
35 typedef struct TdxGuest {
36     X86ConfidentialGuest parent_obj;
37 
38     QemuMutex lock;
39 
40     bool initialized;
41     uint64_t attributes;    /* TD attributes */
42     uint64_t xfam;
43     char *mrconfigid;       /* base64 encoded sha348 digest */
44     char *mrowner;          /* base64 encoded sha348 digest */
45     char *mrownerconfig;    /* base64 encoded sha348 digest */
46 
47     MemoryRegion *tdvf_mr;
48     TdxFirmware tdvf;
49 
50     uint32_t nr_ram_entries;
51     TdxRamEntry *ram_entries;
52 } TdxGuest;
53 
54 #ifdef CONFIG_TDX
55 bool is_tdx_vm(void);
56 #else
57 #define is_tdx_vm() 0
58 #endif /* CONFIG_TDX */
59 
60 int tdx_pre_create_vcpu(CPUState *cpu, Error **errp);
61 void tdx_set_tdvf_region(MemoryRegion *tdvf_mr);
62 int tdx_parse_tdvf(void *flash_ptr, int size);
63 int tdx_handle_report_fatal_error(X86CPU *cpu, struct kvm_run *run);
64 
65 #endif /* QEMU_I386_TDX_H */
66