1
2
3
4
5
6
7
8
9
10
11
12
13#ifndef TPM_BACKEND_H
14#define TPM_BACKEND_H
15
16#include "qom/object.h"
17#include "qemu-common.h"
18#include "qemu/option.h"
19#include "sysemu/tpm.h"
20#include "qapi/error.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 TPMBackendCmd {
34 uint8_t locty;
35 const uint8_t *in;
36 uint32_t in_len;
37 uint8_t *out;
38 uint32_t out_len;
39 bool selftest_done;
40} TPMBackendCmd;
41
42struct TPMBackend {
43 Object parent;
44
45
46 TPMIf *tpmif;
47 bool opened;
48 bool had_startup_error;
49 TPMBackendCmd *cmd;
50
51
52 char *id;
53
54 QLIST_ENTRY(TPMBackend) list;
55};
56
57struct TPMBackendClass {
58 ObjectClass parent_class;
59
60 enum TpmType type;
61 const QemuOptDesc *opts;
62
63 const char *desc;
64
65 TPMBackend *(*create)(QemuOpts *opts);
66
67
68 int (*startup_tpm)(TPMBackend *t, size_t buffersize);
69
70
71 void (*reset)(TPMBackend *t);
72
73 void (*cancel_cmd)(TPMBackend *t);
74
75
76 bool (*get_tpm_established_flag)(TPMBackend *t);
77
78
79 int (*reset_tpm_established_flag)(TPMBackend *t, uint8_t locty);
80
81 TPMVersion (*get_tpm_version)(TPMBackend *t);
82
83 size_t (*get_buffer_size)(TPMBackend *t);
84
85 TpmTypeOptions *(*get_tpm_options)(TPMBackend *t);
86
87 void (*handle_request)(TPMBackend *s, TPMBackendCmd *cmd, Error **errp);
88};
89
90
91
92
93
94
95
96enum TpmType tpm_backend_get_type(TPMBackend *s);
97
98
99
100
101
102
103
104
105
106
107
108
109int tpm_backend_init(TPMBackend *s, TPMIf *tpmif, Error **errp);
110
111
112
113
114
115
116
117
118
119int tpm_backend_startup_tpm(TPMBackend *s, size_t buffersize);
120
121
122
123
124
125
126
127
128
129bool tpm_backend_had_startup_error(TPMBackend *s);
130
131
132
133
134
135
136
137
138
139void tpm_backend_deliver_request(TPMBackend *s, TPMBackendCmd *cmd);
140
141
142
143
144
145
146
147
148void tpm_backend_reset(TPMBackend *s);
149
150
151
152
153
154
155
156
157void tpm_backend_cancel_cmd(TPMBackend *s);
158
159
160
161
162
163
164
165
166
167bool tpm_backend_get_tpm_established_flag(TPMBackend *s);
168
169
170
171
172
173
174
175
176int tpm_backend_reset_tpm_established_flag(TPMBackend *s, uint8_t locty);
177
178
179
180
181
182
183
184
185
186TPMVersion tpm_backend_get_tpm_version(TPMBackend *s);
187
188
189
190
191
192
193
194
195
196size_t tpm_backend_get_buffer_size(TPMBackend *s);
197
198
199
200
201
202
203
204
205void tpm_backend_finish_sync(TPMBackend *s);
206
207
208
209
210
211
212
213
214
215TPMInfo *tpm_backend_query_tpm(TPMBackend *s);
216
217TPMBackend *qemu_find_tpm_be(const char *id);
218
219#endif
220