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