Coverage Report

Created: 2025-07-01 07:09

/work/fu-oprom-struct.c
Line
Count
Source (jump to first uncovered line)
1
/* auto-generated, do not modify */
2
#include "config.h"
3
4
#include "fu-oprom-struct.h"
5
#include "fu-byte-array.h"
6
#include "fu-mem-private.h"
7
#include "fu-string.h"
8
9
#ifdef G_LOG_DOMAIN
10
  #undef G_LOG_DOMAIN
11
#endif
12
0
#define G_LOG_DOMAIN "FuStruct"
13
14
static const gchar *
15
fu_oprom_machine_type_to_string(FuOpromMachineType val)
16
0
{
17
0
    if (val == FU_OPROM_MACHINE_TYPE_X64)
18
0
        return "x64";
19
0
    return NULL;
20
0
}
21
22
static const gchar *
23
fu_oprom_subsystem_to_string(FuOpromSubsystem val)
24
0
{
25
0
    if (val == FU_OPROM_SUBSYSTEM_EFI_BOOT_SRV_DRV)
26
0
        return "efi-boot-srv-drv";
27
0
    return NULL;
28
0
}
29
30
static const gchar *
31
fu_oprom_compression_type_to_string(FuOpromCompressionType val)
32
0
{
33
0
    if (val == FU_OPROM_COMPRESSION_TYPE_NONE)
34
0
        return "none";
35
0
    return NULL;
36
0
}
37
/* getters */
38
/**
39
 * fu_struct_oprom_get_signature: (skip):
40
 **/
41
static guint16
42
fu_struct_oprom_get_signature(const FuStructOprom *st)
43
10.7M
{
44
10.7M
    g_return_val_if_fail(st != NULL, 0x0);
45
10.7M
    return fu_memread_uint16(st->data + 0, G_LITTLE_ENDIAN);
46
10.7M
}
47
/**
48
 * fu_struct_oprom_get_image_size: (skip):
49
 **/
50
guint16
51
fu_struct_oprom_get_image_size(const FuStructOprom *st)
52
0
{
53
0
    g_return_val_if_fail(st != NULL, 0x0);
54
0
    return fu_memread_uint16(st->data + 2, G_LITTLE_ENDIAN);
55
0
}
56
/**
57
 * fu_struct_oprom_get_init_func_entry_point: (skip):
58
 **/
59
guint32
60
fu_struct_oprom_get_init_func_entry_point(const FuStructOprom *st)
61
0
{
62
0
    g_return_val_if_fail(st != NULL, 0x0);
63
0
    return fu_memread_uint32(st->data + 4, G_LITTLE_ENDIAN);
64
0
}
65
/**
66
 * fu_struct_oprom_get_subsystem: (skip):
67
 **/
68
FuOpromSubsystem
69
fu_struct_oprom_get_subsystem(const FuStructOprom *st)
70
938
{
71
938
    g_return_val_if_fail(st != NULL, 0x0);
72
938
    return fu_memread_uint16(st->data + 8, G_LITTLE_ENDIAN);
73
938
}
74
/**
75
 * fu_struct_oprom_get_machine_type: (skip):
76
 **/
77
FuOpromMachineType
78
fu_struct_oprom_get_machine_type(const FuStructOprom *st)
79
938
{
80
938
    g_return_val_if_fail(st != NULL, 0x0);
81
938
    return fu_memread_uint16(st->data + 10, G_LITTLE_ENDIAN);
82
938
}
83
/**
84
 * fu_struct_oprom_get_compression_type: (skip):
85
 **/
86
FuOpromCompressionType
87
fu_struct_oprom_get_compression_type(const FuStructOprom *st)
88
938
{
89
938
    g_return_val_if_fail(st != NULL, 0x0);
90
938
    return fu_memread_uint16(st->data + 12, G_LITTLE_ENDIAN);
91
938
}
92
/**
93
 * fu_struct_oprom_get_efi_image_offset: (skip):
94
 **/
95
guint16
96
fu_struct_oprom_get_efi_image_offset(const FuStructOprom *st)
97
0
{
98
0
    g_return_val_if_fail(st != NULL, 0x0);
99
0
    return fu_memread_uint16(st->data + 22, G_LITTLE_ENDIAN);
100
0
}
101
/**
102
 * fu_struct_oprom_get_pci_header_offset: (skip):
103
 **/
104
guint16
105
fu_struct_oprom_get_pci_header_offset(const FuStructOprom *st)
106
938
{
107
938
    g_return_val_if_fail(st != NULL, 0x0);
108
938
    return fu_memread_uint16(st->data + 24, G_LITTLE_ENDIAN);
109
938
}
110
/**
111
 * fu_struct_oprom_get_expansion_header_offset: (skip):
112
 **/
113
guint16
114
fu_struct_oprom_get_expansion_header_offset(const FuStructOprom *st)
115
803
{
116
803
    g_return_val_if_fail(st != NULL, 0x0);
117
803
    return fu_memread_uint16(st->data + 26, G_LITTLE_ENDIAN);
118
803
}
119
120
/* setters */
121
/**
122
 * fu_struct_oprom_set_signature: (skip):
123
 **/
124
static void
125
fu_struct_oprom_set_signature(FuStructOprom *st, guint16 value)
126
778
{
127
778
    g_return_if_fail(st != NULL);
128
778
    fu_memwrite_uint16(st->data + 0, value, G_LITTLE_ENDIAN);
129
778
}
130
/**
131
 * fu_struct_oprom_set_image_size: (skip):
132
 **/
133
void
134
fu_struct_oprom_set_image_size(FuStructOprom *st, guint16 value)
135
778
{
136
778
    g_return_if_fail(st != NULL);
137
778
    fu_memwrite_uint16(st->data + 2, value, G_LITTLE_ENDIAN);
138
778
}
139
/**
140
 * fu_struct_oprom_set_init_func_entry_point: (skip):
141
 **/
142
void
143
fu_struct_oprom_set_init_func_entry_point(FuStructOprom *st, guint32 value)
144
0
{
145
0
    g_return_if_fail(st != NULL);
146
0
    fu_memwrite_uint32(st->data + 4, value, G_LITTLE_ENDIAN);
147
0
}
148
/**
149
 * fu_struct_oprom_set_subsystem: (skip):
150
 **/
151
void
152
fu_struct_oprom_set_subsystem(FuStructOprom *st, FuOpromSubsystem value)
153
778
{
154
778
    g_return_if_fail(st != NULL);
155
778
    fu_memwrite_uint16(st->data + 8, value, G_LITTLE_ENDIAN);
156
778
}
157
/**
158
 * fu_struct_oprom_set_machine_type: (skip):
159
 **/
160
void
161
fu_struct_oprom_set_machine_type(FuStructOprom *st, FuOpromMachineType value)
162
778
{
163
778
    g_return_if_fail(st != NULL);
164
778
    fu_memwrite_uint16(st->data + 10, value, G_LITTLE_ENDIAN);
165
778
}
166
/**
167
 * fu_struct_oprom_set_compression_type: (skip):
168
 **/
169
void
170
fu_struct_oprom_set_compression_type(FuStructOprom *st, FuOpromCompressionType value)
171
778
{
172
778
    g_return_if_fail(st != NULL);
173
778
    fu_memwrite_uint16(st->data + 12, value, G_LITTLE_ENDIAN);
174
778
}
175
/**
176
 * fu_struct_oprom_set_efi_image_offset: (skip):
177
 **/
178
void
179
fu_struct_oprom_set_efi_image_offset(FuStructOprom *st, guint16 value)
180
0
{
181
0
    g_return_if_fail(st != NULL);
182
0
    fu_memwrite_uint16(st->data + 22, value, G_LITTLE_ENDIAN);
183
0
}
184
/**
185
 * fu_struct_oprom_set_pci_header_offset: (skip):
186
 **/
187
void
188
fu_struct_oprom_set_pci_header_offset(FuStructOprom *st, guint16 value)
189
778
{
190
778
    g_return_if_fail(st != NULL);
191
778
    fu_memwrite_uint16(st->data + 24, value, G_LITTLE_ENDIAN);
192
778
}
193
/**
194
 * fu_struct_oprom_set_expansion_header_offset: (skip):
195
 **/
196
void
197
fu_struct_oprom_set_expansion_header_offset(FuStructOprom *st, guint16 value)
198
8
{
199
8
    g_return_if_fail(st != NULL);
200
8
    fu_memwrite_uint16(st->data + 26, value, G_LITTLE_ENDIAN);
201
8
}
202
/**
203
 * fu_struct_oprom_new: (skip):
204
 **/
205
FuStructOprom *
206
fu_struct_oprom_new(void)
207
778
{
208
778
    FuStructOprom *st = g_byte_array_sized_new(28);
209
778
    fu_byte_array_set_size(st, 28, 0x0);
210
778
    fu_struct_oprom_set_signature(st, 0xAA55);
211
778
    fu_struct_oprom_set_pci_header_offset(st, 28);
212
778
    return st;
213
778
}
214
/**
215
 * fu_struct_oprom_to_string: (skip):
216
 **/
217
static gchar *
218
fu_struct_oprom_to_string(const FuStructOprom *st)
219
0
{
220
0
    g_autoptr(GString) str = g_string_new("FuStructOprom:\n");
221
0
    g_return_val_if_fail(st != NULL, NULL);
222
0
    g_string_append_printf(str, "  image_size: 0x%x\n",
223
0
                           (guint) fu_struct_oprom_get_image_size(st));
224
0
    g_string_append_printf(str, "  init_func_entry_point: 0x%x\n",
225
0
                           (guint) fu_struct_oprom_get_init_func_entry_point(st));
226
0
    {
227
0
        const gchar *tmp = fu_oprom_subsystem_to_string(fu_struct_oprom_get_subsystem(st));
228
0
        if (tmp != NULL) {
229
0
            g_string_append_printf(str, "  subsystem: 0x%x [%s]\n", (guint) fu_struct_oprom_get_subsystem(st), tmp);
230
0
        } else {
231
0
            g_string_append_printf(str, "  subsystem: 0x%x\n", (guint) fu_struct_oprom_get_subsystem(st));
232
0
        }
233
0
    }
234
0
    {
235
0
        const gchar *tmp = fu_oprom_machine_type_to_string(fu_struct_oprom_get_machine_type(st));
236
0
        if (tmp != NULL) {
237
0
            g_string_append_printf(str, "  machine_type: 0x%x [%s]\n", (guint) fu_struct_oprom_get_machine_type(st), tmp);
238
0
        } else {
239
0
            g_string_append_printf(str, "  machine_type: 0x%x\n", (guint) fu_struct_oprom_get_machine_type(st));
240
0
        }
241
0
    }
242
0
    {
243
0
        const gchar *tmp = fu_oprom_compression_type_to_string(fu_struct_oprom_get_compression_type(st));
244
0
        if (tmp != NULL) {
245
0
            g_string_append_printf(str, "  compression_type: 0x%x [%s]\n", (guint) fu_struct_oprom_get_compression_type(st), tmp);
246
0
        } else {
247
0
            g_string_append_printf(str, "  compression_type: 0x%x\n", (guint) fu_struct_oprom_get_compression_type(st));
248
0
        }
249
0
    }
250
0
    g_string_append_printf(str, "  efi_image_offset: 0x%x\n",
251
0
                           (guint) fu_struct_oprom_get_efi_image_offset(st));
252
0
    g_string_append_printf(str, "  pci_header_offset: 0x%x\n",
253
0
                           (guint) fu_struct_oprom_get_pci_header_offset(st));
254
0
    g_string_append_printf(str, "  expansion_header_offset: 0x%x\n",
255
0
                           (guint) fu_struct_oprom_get_expansion_header_offset(st));
256
0
    if (str->len > 0)
257
0
        g_string_set_size(str, str->len - 1);
258
0
    return g_string_free(g_steal_pointer(&str), FALSE);
259
0
}
260
static gboolean
261
fu_struct_oprom_validate_internal(FuStructOprom *st, GError **error)
262
10.7M
{
263
10.7M
    g_return_val_if_fail(st != NULL, FALSE);
264
10.7M
    if (fu_struct_oprom_get_signature(st) != 0xAA55) {
265
10.7M
        g_set_error_literal(error,
266
10.7M
                            FWUPD_ERROR,
267
10.7M
                            FWUPD_ERROR_INVALID_DATA,
268
10.7M
                            "constant FuStructOprom.signature was not valid");
269
10.7M
        return FALSE;
270
10.7M
    }
271
1.87k
    return TRUE;
272
10.7M
}
273
/**
274
 * fu_struct_oprom_validate_stream: (skip):
275
 **/
276
gboolean
277
fu_struct_oprom_validate_stream(GInputStream *stream, gsize offset, GError **error)
278
10.7M
{
279
10.7M
    g_autoptr(GByteArray) st = NULL;
280
10.7M
    g_return_val_if_fail(G_IS_INPUT_STREAM(stream), FALSE);
281
10.7M
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
282
10.7M
    st = fu_input_stream_read_byte_array(stream, offset, 28, NULL, error);
283
10.7M
    if (st == NULL) {
284
0
        g_prefix_error(error, "FuStructOprom failed read of 0x%x: ", (guint) 28);
285
0
        return FALSE;
286
0
    }
287
10.7M
    if (st->len != 28) {
288
2.27k
        g_set_error(error,
289
2.27k
                    FWUPD_ERROR,
290
2.27k
                    FWUPD_ERROR_INVALID_DATA,
291
2.27k
                    "FuStructOprom requested 0x%x and got 0x%x",
292
2.27k
                    (guint) 28,
293
2.27k
                    (guint) st->len);
294
2.27k
        return FALSE;
295
2.27k
    }
296
10.7M
    return fu_struct_oprom_validate_internal(st, error);
297
10.7M
}
298
static gboolean
299
fu_struct_oprom_parse_internal(FuStructOprom *st, GError **error)
300
938
{
301
938
    if (!fu_struct_oprom_validate_internal(st, error))
302
0
        return FALSE;
303
938
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
304
0
        g_autofree gchar *str = fu_struct_oprom_to_string(st);
305
0
        g_debug("%s", str);
306
0
    }
307
938
    return TRUE;
308
938
}
309
/**
310
 * fu_struct_oprom_parse_stream: (skip):
311
 **/
312
FuStructOprom *
313
fu_struct_oprom_parse_stream(GInputStream *stream, gsize offset, GError **error)
314
938
{
315
938
    g_autoptr(GByteArray) st = NULL;
316
938
    st = fu_input_stream_read_byte_array(stream, offset, 28, NULL, error);
317
938
    if (st == NULL) {
318
0
        g_prefix_error(error, "FuStructOprom failed read of 0x%x: ", (guint) 28);
319
0
        return NULL;
320
0
    }
321
938
    if (st->len != 28) {
322
0
        g_set_error(error,
323
0
                    FWUPD_ERROR,
324
0
                    FWUPD_ERROR_INVALID_DATA,
325
0
                    "FuStructOprom requested 0x%x and got 0x%x",
326
0
                    (guint) 28,
327
0
                    (guint) st->len);
328
0
        return NULL;
329
0
    }
330
938
    if (!fu_struct_oprom_parse_internal(st, error))
331
0
        return NULL;
332
938
    return g_steal_pointer(&st);
333
938
}
334
/* getters */
335
/**
336
 * fu_struct_oprom_pci_get_signature: (skip):
337
 **/
338
static guint32
339
fu_struct_oprom_pci_get_signature(const FuStructOpromPci *st)
340
870
{
341
870
    g_return_val_if_fail(st != NULL, 0x0);
342
870
    return fu_memread_uint32(st->data + 0, G_LITTLE_ENDIAN);
343
870
}
344
/**
345
 * fu_struct_oprom_pci_get_vendor_id: (skip):
346
 **/
347
guint16
348
fu_struct_oprom_pci_get_vendor_id(const FuStructOpromPci *st)
349
804
{
350
804
    g_return_val_if_fail(st != NULL, 0x0);
351
804
    return fu_memread_uint16(st->data + 4, G_LITTLE_ENDIAN);
352
804
}
353
/**
354
 * fu_struct_oprom_pci_get_device_id: (skip):
355
 **/
356
guint16
357
fu_struct_oprom_pci_get_device_id(const FuStructOpromPci *st)
358
804
{
359
804
    g_return_val_if_fail(st != NULL, 0x0);
360
804
    return fu_memread_uint16(st->data + 6, G_LITTLE_ENDIAN);
361
804
}
362
/**
363
 * fu_struct_oprom_pci_get_device_list_pointer: (skip):
364
 **/
365
guint16
366
fu_struct_oprom_pci_get_device_list_pointer(const FuStructOpromPci *st)
367
0
{
368
0
    g_return_val_if_fail(st != NULL, 0x0);
369
0
    return fu_memread_uint16(st->data + 8, G_LITTLE_ENDIAN);
370
0
}
371
/**
372
 * fu_struct_oprom_pci_get_structure_length: (skip):
373
 **/
374
guint16
375
fu_struct_oprom_pci_get_structure_length(const FuStructOpromPci *st)
376
0
{
377
0
    g_return_val_if_fail(st != NULL, 0x0);
378
0
    return fu_memread_uint16(st->data + 10, G_LITTLE_ENDIAN);
379
0
}
380
/**
381
 * fu_struct_oprom_pci_get_structure_revision: (skip):
382
 **/
383
guint8
384
fu_struct_oprom_pci_get_structure_revision(const FuStructOpromPci *st)
385
0
{
386
0
    g_return_val_if_fail(st != NULL, 0x0);
387
0
    return st->data[12];
388
0
}
389
/**
390
 * fu_struct_oprom_pci_get_class_code: (skip):
391
 **/
392
guint32
393
fu_struct_oprom_pci_get_class_code(const FuStructOpromPci *st)
394
0
{
395
0
    g_return_val_if_fail(st != NULL, 0x0);
396
0
    return fu_memread_uint24(st->data + 13, G_LITTLE_ENDIAN);
397
0
}
398
/**
399
 * fu_struct_oprom_pci_get_image_length: (skip):
400
 **/
401
guint16
402
fu_struct_oprom_pci_get_image_length(const FuStructOpromPci *st)
403
804
{
404
804
    g_return_val_if_fail(st != NULL, 0x0);
405
804
    return fu_memread_uint16(st->data + 16, G_LITTLE_ENDIAN);
406
804
}
407
/**
408
 * fu_struct_oprom_pci_get_image_revision: (skip):
409
 **/
410
guint16
411
fu_struct_oprom_pci_get_image_revision(const FuStructOpromPci *st)
412
0
{
413
0
    g_return_val_if_fail(st != NULL, 0x0);
414
0
    return fu_memread_uint16(st->data + 18, G_LITTLE_ENDIAN);
415
0
}
416
/**
417
 * fu_struct_oprom_pci_get_code_type: (skip):
418
 **/
419
guint8
420
fu_struct_oprom_pci_get_code_type(const FuStructOpromPci *st)
421
803
{
422
803
    g_return_val_if_fail(st != NULL, 0x0);
423
803
    return st->data[20];
424
803
}
425
/**
426
 * fu_struct_oprom_pci_get_indicator: (skip):
427
 **/
428
guint8
429
fu_struct_oprom_pci_get_indicator(const FuStructOpromPci *st)
430
0
{
431
0
    g_return_val_if_fail(st != NULL, 0x0);
432
0
    return st->data[21];
433
0
}
434
/**
435
 * fu_struct_oprom_pci_get_max_runtime_image_length: (skip):
436
 **/
437
guint16
438
fu_struct_oprom_pci_get_max_runtime_image_length(const FuStructOpromPci *st)
439
0
{
440
0
    g_return_val_if_fail(st != NULL, 0x0);
441
0
    return fu_memread_uint16(st->data + 22, G_LITTLE_ENDIAN);
442
0
}
443
/**
444
 * fu_struct_oprom_pci_get_conf_util_code_header_pointer: (skip):
445
 **/
446
guint16
447
fu_struct_oprom_pci_get_conf_util_code_header_pointer(const FuStructOpromPci *st)
448
0
{
449
0
    g_return_val_if_fail(st != NULL, 0x0);
450
0
    return fu_memread_uint16(st->data + 24, G_LITTLE_ENDIAN);
451
0
}
452
/**
453
 * fu_struct_oprom_pci_get_dmtf_clp_entry_point_pointer: (skip):
454
 **/
455
guint16
456
fu_struct_oprom_pci_get_dmtf_clp_entry_point_pointer(const FuStructOpromPci *st)
457
0
{
458
0
    g_return_val_if_fail(st != NULL, 0x0);
459
0
    return fu_memread_uint16(st->data + 26, G_LITTLE_ENDIAN);
460
0
}
461
462
/* setters */
463
/**
464
 * fu_struct_oprom_pci_set_signature: (skip):
465
 **/
466
static void
467
fu_struct_oprom_pci_set_signature(FuStructOpromPci *st, guint32 value)
468
778
{
469
778
    g_return_if_fail(st != NULL);
470
778
    fu_memwrite_uint32(st->data + 0, value, G_LITTLE_ENDIAN);
471
778
}
472
/**
473
 * fu_struct_oprom_pci_set_vendor_id: (skip):
474
 **/
475
void
476
fu_struct_oprom_pci_set_vendor_id(FuStructOpromPci *st, guint16 value)
477
778
{
478
778
    g_return_if_fail(st != NULL);
479
778
    fu_memwrite_uint16(st->data + 4, value, G_LITTLE_ENDIAN);
480
778
}
481
/**
482
 * fu_struct_oprom_pci_set_device_id: (skip):
483
 **/
484
void
485
fu_struct_oprom_pci_set_device_id(FuStructOpromPci *st, guint16 value)
486
778
{
487
778
    g_return_if_fail(st != NULL);
488
778
    fu_memwrite_uint16(st->data + 6, value, G_LITTLE_ENDIAN);
489
778
}
490
/**
491
 * fu_struct_oprom_pci_set_device_list_pointer: (skip):
492
 **/
493
void
494
fu_struct_oprom_pci_set_device_list_pointer(FuStructOpromPci *st, guint16 value)
495
0
{
496
0
    g_return_if_fail(st != NULL);
497
0
    fu_memwrite_uint16(st->data + 8, value, G_LITTLE_ENDIAN);
498
0
}
499
/**
500
 * fu_struct_oprom_pci_set_structure_length: (skip):
501
 **/
502
void
503
fu_struct_oprom_pci_set_structure_length(FuStructOpromPci *st, guint16 value)
504
0
{
505
0
    g_return_if_fail(st != NULL);
506
0
    fu_memwrite_uint16(st->data + 10, value, G_LITTLE_ENDIAN);
507
0
}
508
/**
509
 * fu_struct_oprom_pci_set_structure_revision: (skip):
510
 **/
511
void
512
fu_struct_oprom_pci_set_structure_revision(FuStructOpromPci *st, guint8 value)
513
0
{
514
0
    g_return_if_fail(st != NULL);
515
0
    st->data[12] = value;
516
0
}
517
/**
518
 * fu_struct_oprom_pci_set_class_code: (skip):
519
 **/
520
void
521
fu_struct_oprom_pci_set_class_code(FuStructOpromPci *st, guint32 value)
522
0
{
523
0
    g_return_if_fail(st != NULL);
524
0
    fu_memwrite_uint24(st->data + 13, value, G_LITTLE_ENDIAN);
525
0
}
526
/**
527
 * fu_struct_oprom_pci_set_image_length: (skip):
528
 **/
529
void
530
fu_struct_oprom_pci_set_image_length(FuStructOpromPci *st, guint16 value)
531
778
{
532
778
    g_return_if_fail(st != NULL);
533
778
    fu_memwrite_uint16(st->data + 16, value, G_LITTLE_ENDIAN);
534
778
}
535
/**
536
 * fu_struct_oprom_pci_set_image_revision: (skip):
537
 **/
538
void
539
fu_struct_oprom_pci_set_image_revision(FuStructOpromPci *st, guint16 value)
540
0
{
541
0
    g_return_if_fail(st != NULL);
542
0
    fu_memwrite_uint16(st->data + 18, value, G_LITTLE_ENDIAN);
543
0
}
544
/**
545
 * fu_struct_oprom_pci_set_code_type: (skip):
546
 **/
547
void
548
fu_struct_oprom_pci_set_code_type(FuStructOpromPci *st, guint8 value)
549
778
{
550
778
    g_return_if_fail(st != NULL);
551
778
    st->data[20] = value;
552
778
}
553
/**
554
 * fu_struct_oprom_pci_set_indicator: (skip):
555
 **/
556
void
557
fu_struct_oprom_pci_set_indicator(FuStructOpromPci *st, guint8 value)
558
778
{
559
778
    g_return_if_fail(st != NULL);
560
778
    st->data[21] = value;
561
778
}
562
/**
563
 * fu_struct_oprom_pci_set_max_runtime_image_length: (skip):
564
 **/
565
void
566
fu_struct_oprom_pci_set_max_runtime_image_length(FuStructOpromPci *st, guint16 value)
567
0
{
568
0
    g_return_if_fail(st != NULL);
569
0
    fu_memwrite_uint16(st->data + 22, value, G_LITTLE_ENDIAN);
570
0
}
571
/**
572
 * fu_struct_oprom_pci_set_conf_util_code_header_pointer: (skip):
573
 **/
574
void
575
fu_struct_oprom_pci_set_conf_util_code_header_pointer(FuStructOpromPci *st, guint16 value)
576
0
{
577
0
    g_return_if_fail(st != NULL);
578
0
    fu_memwrite_uint16(st->data + 24, value, G_LITTLE_ENDIAN);
579
0
}
580
/**
581
 * fu_struct_oprom_pci_set_dmtf_clp_entry_point_pointer: (skip):
582
 **/
583
void
584
fu_struct_oprom_pci_set_dmtf_clp_entry_point_pointer(FuStructOpromPci *st, guint16 value)
585
0
{
586
0
    g_return_if_fail(st != NULL);
587
0
    fu_memwrite_uint16(st->data + 26, value, G_LITTLE_ENDIAN);
588
0
}
589
/**
590
 * fu_struct_oprom_pci_new: (skip):
591
 **/
592
FuStructOpromPci *
593
fu_struct_oprom_pci_new(void)
594
778
{
595
778
    FuStructOpromPci *st = g_byte_array_sized_new(28);
596
778
    fu_byte_array_set_size(st, 28, 0x0);
597
778
    fu_struct_oprom_pci_set_signature(st, 0x52494350);
598
778
    return st;
599
778
}
600
/**
601
 * fu_struct_oprom_pci_to_string: (skip):
602
 **/
603
static gchar *
604
fu_struct_oprom_pci_to_string(const FuStructOpromPci *st)
605
0
{
606
0
    g_autoptr(GString) str = g_string_new("FuStructOpromPci:\n");
607
0
    g_return_val_if_fail(st != NULL, NULL);
608
0
    g_string_append_printf(str, "  vendor_id: 0x%x\n",
609
0
                           (guint) fu_struct_oprom_pci_get_vendor_id(st));
610
0
    g_string_append_printf(str, "  device_id: 0x%x\n",
611
0
                           (guint) fu_struct_oprom_pci_get_device_id(st));
612
0
    g_string_append_printf(str, "  device_list_pointer: 0x%x\n",
613
0
                           (guint) fu_struct_oprom_pci_get_device_list_pointer(st));
614
0
    g_string_append_printf(str, "  structure_length: 0x%x\n",
615
0
                           (guint) fu_struct_oprom_pci_get_structure_length(st));
616
0
    g_string_append_printf(str, "  structure_revision: 0x%x\n",
617
0
                           (guint) fu_struct_oprom_pci_get_structure_revision(st));
618
0
    g_string_append_printf(str, "  class_code: 0x%x\n",
619
0
                           (guint) fu_struct_oprom_pci_get_class_code(st));
620
0
    g_string_append_printf(str, "  image_length: 0x%x\n",
621
0
                           (guint) fu_struct_oprom_pci_get_image_length(st));
622
0
    g_string_append_printf(str, "  image_revision: 0x%x\n",
623
0
                           (guint) fu_struct_oprom_pci_get_image_revision(st));
624
0
    g_string_append_printf(str, "  code_type: 0x%x\n",
625
0
                           (guint) fu_struct_oprom_pci_get_code_type(st));
626
0
    g_string_append_printf(str, "  indicator: 0x%x\n",
627
0
                           (guint) fu_struct_oprom_pci_get_indicator(st));
628
0
    g_string_append_printf(str, "  max_runtime_image_length: 0x%x\n",
629
0
                           (guint) fu_struct_oprom_pci_get_max_runtime_image_length(st));
630
0
    g_string_append_printf(str, "  conf_util_code_header_pointer: 0x%x\n",
631
0
                           (guint) fu_struct_oprom_pci_get_conf_util_code_header_pointer(st));
632
0
    g_string_append_printf(str, "  dmtf_clp_entry_point_pointer: 0x%x\n",
633
0
                           (guint) fu_struct_oprom_pci_get_dmtf_clp_entry_point_pointer(st));
634
0
    if (str->len > 0)
635
0
        g_string_set_size(str, str->len - 1);
636
0
    return g_string_free(g_steal_pointer(&str), FALSE);
637
0
}
638
static gboolean
639
fu_struct_oprom_pci_validate_internal(FuStructOpromPci *st, GError **error)
640
870
{
641
870
    g_return_val_if_fail(st != NULL, FALSE);
642
870
    if (fu_struct_oprom_pci_get_signature(st) != 0x52494350) {
643
66
        g_set_error_literal(error,
644
66
                            FWUPD_ERROR,
645
66
                            FWUPD_ERROR_INVALID_DATA,
646
66
                            "constant FuStructOpromPci.signature was not valid");
647
66
        return FALSE;
648
66
    }
649
804
    return TRUE;
650
870
}
651
static gboolean
652
fu_struct_oprom_pci_parse_internal(FuStructOpromPci *st, GError **error)
653
870
{
654
870
    if (!fu_struct_oprom_pci_validate_internal(st, error))
655
66
        return FALSE;
656
804
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
657
0
        g_autofree gchar *str = fu_struct_oprom_pci_to_string(st);
658
0
        g_debug("%s", str);
659
0
    }
660
804
    return TRUE;
661
870
}
662
/**
663
 * fu_struct_oprom_pci_parse_stream: (skip):
664
 **/
665
FuStructOpromPci *
666
fu_struct_oprom_pci_parse_stream(GInputStream *stream, gsize offset, GError **error)
667
924
{
668
924
    g_autoptr(GByteArray) st = NULL;
669
924
    st = fu_input_stream_read_byte_array(stream, offset, 28, NULL, error);
670
924
    if (st == NULL) {
671
39
        g_prefix_error(error, "FuStructOpromPci failed read of 0x%x: ", (guint) 28);
672
39
        return NULL;
673
39
    }
674
885
    if (st->len != 28) {
675
15
        g_set_error(error,
676
15
                    FWUPD_ERROR,
677
15
                    FWUPD_ERROR_INVALID_DATA,
678
15
                    "FuStructOpromPci requested 0x%x and got 0x%x",
679
15
                    (guint) 28,
680
15
                    (guint) st->len);
681
15
        return NULL;
682
15
    }
683
870
    if (!fu_struct_oprom_pci_parse_internal(st, error))
684
66
        return NULL;
685
804
    return g_steal_pointer(&st);
686
870
}