Coverage Report

Created: 2026-02-26 06:27

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