Coverage Report

Created: 2025-12-14 06:56

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