1
2
3
4
5
6
7
8
9
10
11
12
13#ifndef _QEMU_TPM_H
14#define _QEMU_TPM_H
15
16#include "qom/object.h"
17#include "qemu-common.h"
18#include "qapi-types.h"
19#include "qemu/option.h"
20#include "sysemu/tpm.h"
21
22#define TYPE_TPM_BACKEND "tpm-backend"
23#define TPM_BACKEND(obj) \
24 OBJECT_CHECK(TPMBackend, (obj), TYPE_TPM_BACKEND)
25#define TPM_BACKEND_GET_CLASS(obj) \
26 OBJECT_GET_CLASS(TPMBackendClass, (obj), TYPE_TPM_BACKEND)
27#define TPM_BACKEND_CLASS(klass) \
28 OBJECT_CLASS_CHECK(TPMBackendClass, (klass), TYPE_TPM_BACKEND)
29
30typedef struct TPMBackendClass TPMBackendClass;
31typedef struct TPMBackend TPMBackend;
32
33typedef struct TPMDriverOps TPMDriverOps;
34
35struct TPMBackendClass {
36 ObjectClass parent_class;
37
38 const TPMDriverOps *ops;
39
40 void (*opened)(TPMBackend *s, Error **errp);
41};
42
43struct TPMBackend {
44 Object parent;
45
46
47 bool opened;
48
49 char *id;
50 enum TpmModel fe_model;
51 char *path;
52 char *cancel_path;
53 const TPMDriverOps *ops;
54
55 QLIST_ENTRY(TPMBackend) list;
56};
57
58typedef void (TPMRecvDataCB)(TPMState *, uint8_t locty, bool selftest_done);
59
60typedef struct TPMSizedBuffer {
61 uint32_t size;
62 uint8_t *buffer;
63} TPMSizedBuffer;
64
65struct TPMDriverOps {
66 enum TpmType type;
67 const QemuOptDesc *opts;
68
69 const char *(*desc)(void);
70
71 TPMBackend *(*create)(QemuOpts *opts, const char *id);
72 void (*destroy)(TPMBackend *t);
73
74
75 int (*init)(TPMBackend *t, TPMState *s, TPMRecvDataCB *datacb);
76
77 int (*startup_tpm)(TPMBackend *t);
78
79 bool (*had_startup_error)(TPMBackend *t);
80
81 size_t (*realloc_buffer)(TPMSizedBuffer *sb);
82
83 void (*deliver_request)(TPMBackend *t);
84
85 void (*reset)(TPMBackend *t);
86
87 void (*cancel_cmd)(TPMBackend *t);
88
89 bool (*get_tpm_established_flag)(TPMBackend *t);
90
91 int (*reset_tpm_established_flag)(TPMBackend *t, uint8_t locty);
92
93 TPMVersion (*get_tpm_version)(TPMBackend *t);
94};
95
96
97
98
99
100
101
102
103enum TpmType tpm_backend_get_type(TPMBackend *s);
104
105
106
107
108
109
110
111const char *tpm_backend_get_desc(TPMBackend *s);
112
113
114
115
116
117void tpm_backend_destroy(TPMBackend *s);
118
119
120
121
122
123
124
125
126
127
128
129int tpm_backend_init(TPMBackend *s, TPMState *state,
130 TPMRecvDataCB *datacb);
131
132
133
134
135
136
137
138int tpm_backend_startup_tpm(TPMBackend *s);
139
140
141
142
143
144
145
146
147
148bool tpm_backend_had_startup_error(TPMBackend *s);
149
150
151
152
153
154
155
156
157
158size_t tpm_backend_realloc_buffer(TPMBackend *s, TPMSizedBuffer *sb);
159
160
161
162
163
164
165
166
167void tpm_backend_deliver_request(TPMBackend *s);
168
169
170
171
172
173
174
175
176void tpm_backend_reset(TPMBackend *s);
177
178
179
180
181
182
183
184
185void tpm_backend_cancel_cmd(TPMBackend *s);
186
187
188
189
190
191
192
193
194
195bool tpm_backend_get_tpm_established_flag(TPMBackend *s);
196
197
198
199
200
201
202
203
204int tpm_backend_reset_tpm_established_flag(TPMBackend *s, uint8_t locty);
205
206
207
208
209
210
211
212
213
214void tpm_backend_open(TPMBackend *s, Error **errp);
215
216
217
218
219
220
221
222
223
224TPMVersion tpm_backend_get_tpm_version(TPMBackend *s);
225
226TPMBackend *qemu_find_tpm(const char *id);
227
228const TPMDriverOps *tpm_get_backend_driver(const char *type);
229int tpm_register_model(enum TpmModel model);
230int tpm_register_driver(const TPMDriverOps *tdo);
231
232#endif
233