Coverage Report

Created: 2025-11-24 06:59

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/work/fu-smbios-struct.c
Line
Count
Source
1
/* auto-generated, do not modify */
2
#include "config.h"
3
4
#include <glib.h>
5
6
#include "fu-smbios-struct.h"
7
#include "fu-byte-array.h"
8
#include "fu-mem-private.h"
9
#include "fu-string.h"
10
11
#ifdef G_LOG_DOMAIN
12
  #undef G_LOG_DOMAIN
13
#endif
14
0
#define G_LOG_DOMAIN "FuStruct"
15
16
17
const gchar *
18
fu_smbios_chassis_kind_to_string(FuSmbiosChassisKind val)
19
0
{
20
0
    if (val == FU_SMBIOS_CHASSIS_KIND_UNSET)
21
0
        return "unset";
22
0
    if (val == FU_SMBIOS_CHASSIS_KIND_OTHER)
23
0
        return "other";
24
0
    if (val == FU_SMBIOS_CHASSIS_KIND_UNKNOWN)
25
0
        return "unknown";
26
0
    if (val == FU_SMBIOS_CHASSIS_KIND_DESKTOP)
27
0
        return "desktop";
28
0
    if (val == FU_SMBIOS_CHASSIS_KIND_LOW_PROFILE_DESKTOP)
29
0
        return "low-profile-desktop";
30
0
    if (val == FU_SMBIOS_CHASSIS_KIND_PIZZA_BOX)
31
0
        return "pizza-box";
32
0
    if (val == FU_SMBIOS_CHASSIS_KIND_MINI_TOWER)
33
0
        return "mini-tower";
34
0
    if (val == FU_SMBIOS_CHASSIS_KIND_TOWER)
35
0
        return "tower";
36
0
    if (val == FU_SMBIOS_CHASSIS_KIND_PORTABLE)
37
0
        return "portable";
38
0
    if (val == FU_SMBIOS_CHASSIS_KIND_LAPTOP)
39
0
        return "laptop";
40
0
    if (val == FU_SMBIOS_CHASSIS_KIND_NOTEBOOK)
41
0
        return "notebook";
42
0
    if (val == FU_SMBIOS_CHASSIS_KIND_HAND_HELD)
43
0
        return "hand-held";
44
0
    if (val == FU_SMBIOS_CHASSIS_KIND_DOCKING_STATION)
45
0
        return "docking-station";
46
0
    if (val == FU_SMBIOS_CHASSIS_KIND_ALL_IN_ONE)
47
0
        return "all-in-one";
48
0
    if (val == FU_SMBIOS_CHASSIS_KIND_SUB_NOTEBOOK)
49
0
        return "sub-notebook";
50
0
    if (val == FU_SMBIOS_CHASSIS_KIND_SPACE_SAVING)
51
0
        return "space-saving";
52
0
    if (val == FU_SMBIOS_CHASSIS_KIND_LUNCH_BOX)
53
0
        return "lunch-box";
54
0
    if (val == FU_SMBIOS_CHASSIS_KIND_MAIN_SERVER)
55
0
        return "main-server";
56
0
    if (val == FU_SMBIOS_CHASSIS_KIND_EXPANSION)
57
0
        return "expansion";
58
0
    if (val == FU_SMBIOS_CHASSIS_KIND_SUBCHASSIS)
59
0
        return "subchassis";
60
0
    if (val == FU_SMBIOS_CHASSIS_KIND_BUS_EXPANSION)
61
0
        return "bus-expansion";
62
0
    if (val == FU_SMBIOS_CHASSIS_KIND_PERIPHERAL)
63
0
        return "peripheral";
64
0
    if (val == FU_SMBIOS_CHASSIS_KIND_RAID)
65
0
        return "raid";
66
0
    if (val == FU_SMBIOS_CHASSIS_KIND_RACK_MOUNT)
67
0
        return "rack-mount";
68
0
    if (val == FU_SMBIOS_CHASSIS_KIND_SEALED_CASE_PC)
69
0
        return "sealed-case-pc";
70
0
    if (val == FU_SMBIOS_CHASSIS_KIND_MULTI_SYSTEM)
71
0
        return "multi-system";
72
0
    if (val == FU_SMBIOS_CHASSIS_KIND_COMPACT_PCI)
73
0
        return "compact-pci";
74
0
    if (val == FU_SMBIOS_CHASSIS_KIND_ADVANCED_TCA)
75
0
        return "advanced-tca";
76
0
    if (val == FU_SMBIOS_CHASSIS_KIND_BLADE)
77
0
        return "blade";
78
0
    if (val == FU_SMBIOS_CHASSIS_KIND_RESERVED)
79
0
        return "reserved";
80
0
    if (val == FU_SMBIOS_CHASSIS_KIND_TABLET)
81
0
        return "tablet";
82
0
    if (val == FU_SMBIOS_CHASSIS_KIND_CONVERTIBLE)
83
0
        return "convertible";
84
0
    if (val == FU_SMBIOS_CHASSIS_KIND_DETACHABLE)
85
0
        return "detachable";
86
0
    if (val == FU_SMBIOS_CHASSIS_KIND_IOT_GATEWAY)
87
0
        return "iot-gateway";
88
0
    if (val == FU_SMBIOS_CHASSIS_KIND_EMBEDDED_PC)
89
0
        return "embedded-pc";
90
0
    if (val == FU_SMBIOS_CHASSIS_KIND_MINI_PC)
91
0
        return "mini-pc";
92
0
    if (val == FU_SMBIOS_CHASSIS_KIND_STICK_PC)
93
0
        return "stick-pc";
94
0
    return NULL;
95
0
}
96
/**
97
 * fu_struct_smbios_ep32_ref: (skip):
98
 **/
99
FuStructSmbiosEp32 *
100
fu_struct_smbios_ep32_ref(FuStructSmbiosEp32 *st)
101
0
{
102
0
    g_return_val_if_fail(st != NULL, NULL);
103
0
    st->refcount++;
104
0
    return st;
105
0
}
106
/**
107
 * fu_struct_smbios_ep32_unref: (skip):
108
 **/
109
void
110
fu_struct_smbios_ep32_unref(FuStructSmbiosEp32 *st)
111
0
{
112
0
    g_return_if_fail(st != NULL);
113
0
    if (st->refcount == 0) {
114
0
        g_critical("FuStructSmbiosEp32 refcount already zero");
115
0
        return;
116
0
    }
117
0
    if (--st->refcount > 0)
118
0
        return;
119
0
    if (st->buf != NULL)
120
0
        g_byte_array_unref(st->buf);
121
0
    g_free(st);
122
0
}
123
/**
124
 * fu_struct_smbios_ep32_new_internal: (skip):
125
 **/
126
static FuStructSmbiosEp32 *
127
fu_struct_smbios_ep32_new_internal(void)
128
0
{
129
0
    FuStructSmbiosEp32 *st = g_new0(FuStructSmbiosEp32, 1);
130
0
    st->refcount = 1;
131
0
    return st;
132
0
}
133
134
/* getters */
135
/**
136
 * fu_struct_smbios_ep32_get_anchor_str: (skip):
137
 **/
138
gchar *
139
fu_struct_smbios_ep32_get_anchor_str(const FuStructSmbiosEp32 *st)
140
0
{
141
0
    g_return_val_if_fail(st != NULL, NULL);
142
0
    return fu_memstrsafe(st->buf->data, st->buf->len, 0, 4, NULL);
143
0
}
144
/**
145
 * fu_struct_smbios_ep32_get_entry_point_csum: (skip):
146
 **/
147
guint8
148
fu_struct_smbios_ep32_get_entry_point_csum(const FuStructSmbiosEp32 *st)
149
0
{
150
0
    g_return_val_if_fail(st != NULL, 0x0);
151
0
    return st->buf->data[4];
152
0
}
153
/**
154
 * fu_struct_smbios_ep32_get_entry_point_len: (skip):
155
 **/
156
guint8
157
fu_struct_smbios_ep32_get_entry_point_len(const FuStructSmbiosEp32 *st)
158
0
{
159
0
    g_return_val_if_fail(st != NULL, 0x0);
160
0
    return st->buf->data[5];
161
0
}
162
/**
163
 * fu_struct_smbios_ep32_get_smbios_major_ver: (skip):
164
 **/
165
guint8
166
fu_struct_smbios_ep32_get_smbios_major_ver(const FuStructSmbiosEp32 *st)
167
0
{
168
0
    g_return_val_if_fail(st != NULL, 0x0);
169
0
    return st->buf->data[6];
170
0
}
171
/**
172
 * fu_struct_smbios_ep32_get_smbios_minor_ver: (skip):
173
 **/
174
guint8
175
fu_struct_smbios_ep32_get_smbios_minor_ver(const FuStructSmbiosEp32 *st)
176
0
{
177
0
    g_return_val_if_fail(st != NULL, 0x0);
178
0
    return st->buf->data[7];
179
0
}
180
/**
181
 * fu_struct_smbios_ep32_get_max_structure_sz: (skip):
182
 **/
183
guint16
184
fu_struct_smbios_ep32_get_max_structure_sz(const FuStructSmbiosEp32 *st)
185
0
{
186
0
    g_return_val_if_fail(st != NULL, 0x0);
187
0
    return fu_memread_uint16(st->buf->data + 8, G_LITTLE_ENDIAN);
188
0
}
189
/**
190
 * fu_struct_smbios_ep32_get_entry_point_rev: (skip):
191
 **/
192
guint8
193
fu_struct_smbios_ep32_get_entry_point_rev(const FuStructSmbiosEp32 *st)
194
0
{
195
0
    g_return_val_if_fail(st != NULL, 0x0);
196
0
    return st->buf->data[10];
197
0
}
198
/**
199
 * fu_struct_smbios_ep32_get_intermediate_anchor_str: (skip):
200
 **/
201
gchar *
202
fu_struct_smbios_ep32_get_intermediate_anchor_str(const FuStructSmbiosEp32 *st)
203
0
{
204
0
    g_return_val_if_fail(st != NULL, NULL);
205
0
    return fu_memstrsafe(st->buf->data, st->buf->len, 16, 5, NULL);
206
0
}
207
/**
208
 * fu_struct_smbios_ep32_get_intermediate_csum: (skip):
209
 **/
210
guint8
211
fu_struct_smbios_ep32_get_intermediate_csum(const FuStructSmbiosEp32 *st)
212
0
{
213
0
    g_return_val_if_fail(st != NULL, 0x0);
214
0
    return st->buf->data[21];
215
0
}
216
/**
217
 * fu_struct_smbios_ep32_get_structure_table_len: (skip):
218
 **/
219
guint16
220
fu_struct_smbios_ep32_get_structure_table_len(const FuStructSmbiosEp32 *st)
221
0
{
222
0
    g_return_val_if_fail(st != NULL, 0x0);
223
0
    return fu_memread_uint16(st->buf->data + 22, G_LITTLE_ENDIAN);
224
0
}
225
/**
226
 * fu_struct_smbios_ep32_get_structure_table_addr: (skip):
227
 **/
228
guint32
229
fu_struct_smbios_ep32_get_structure_table_addr(const FuStructSmbiosEp32 *st)
230
0
{
231
0
    g_return_val_if_fail(st != NULL, 0x0);
232
0
    return fu_memread_uint32(st->buf->data + 24, G_LITTLE_ENDIAN);
233
0
}
234
/**
235
 * fu_struct_smbios_ep32_get_number_smbios_structs: (skip):
236
 **/
237
guint16
238
fu_struct_smbios_ep32_get_number_smbios_structs(const FuStructSmbiosEp32 *st)
239
0
{
240
0
    g_return_val_if_fail(st != NULL, 0x0);
241
0
    return fu_memread_uint16(st->buf->data + 28, G_LITTLE_ENDIAN);
242
0
}
243
/**
244
 * fu_struct_smbios_ep32_get_smbios_bcd_rev: (skip):
245
 **/
246
guint8
247
fu_struct_smbios_ep32_get_smbios_bcd_rev(const FuStructSmbiosEp32 *st)
248
0
{
249
0
    g_return_val_if_fail(st != NULL, 0x0);
250
0
    return st->buf->data[30];
251
0
}
252
253
/* setters */
254
/**
255
 * fu_struct_smbios_ep32_set_anchor_str: (skip):
256
 **/
257
gboolean
258
fu_struct_smbios_ep32_set_anchor_str(FuStructSmbiosEp32 *st, const gchar *value, GError **error)
259
0
{
260
0
    gsize len;
261
0
    g_return_val_if_fail(st != NULL, FALSE);
262
0
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
263
0
    if (value == NULL) {
264
0
        memset(st->buf->data + 0, 0x0, 4);
265
0
        return TRUE;
266
0
    }
267
0
    len = strlen(value);
268
0
    if (len > 4) {
269
0
        g_set_error(error,
270
0
                    FWUPD_ERROR,
271
0
                    FWUPD_ERROR_INVALID_DATA,
272
0
                    "string '%s' (0x%x bytes) does not fit in FuStructSmbiosEp32.anchor_str (0x%x bytes)",
273
0
                    value, (guint) len, (guint) 4);
274
0
        return FALSE;
275
0
    }
276
0
    return fu_memcpy_safe(st->buf->data, st->buf->len, 0, (const guint8 *)value, len, 0x0, len, error);
277
0
}
278
/**
279
 * fu_struct_smbios_ep32_set_entry_point_csum: (skip):
280
 **/
281
void
282
fu_struct_smbios_ep32_set_entry_point_csum(FuStructSmbiosEp32 *st, guint8 value)
283
0
{
284
0
    g_return_if_fail(st != NULL);
285
0
    st->buf->data[4] = value;
286
0
}
287
/**
288
 * fu_struct_smbios_ep32_set_entry_point_len: (skip):
289
 **/
290
void
291
fu_struct_smbios_ep32_set_entry_point_len(FuStructSmbiosEp32 *st, guint8 value)
292
0
{
293
0
    g_return_if_fail(st != NULL);
294
0
    st->buf->data[5] = value;
295
0
}
296
/**
297
 * fu_struct_smbios_ep32_set_smbios_major_ver: (skip):
298
 **/
299
void
300
fu_struct_smbios_ep32_set_smbios_major_ver(FuStructSmbiosEp32 *st, guint8 value)
301
0
{
302
0
    g_return_if_fail(st != NULL);
303
0
    st->buf->data[6] = value;
304
0
}
305
/**
306
 * fu_struct_smbios_ep32_set_smbios_minor_ver: (skip):
307
 **/
308
void
309
fu_struct_smbios_ep32_set_smbios_minor_ver(FuStructSmbiosEp32 *st, guint8 value)
310
0
{
311
0
    g_return_if_fail(st != NULL);
312
0
    st->buf->data[7] = value;
313
0
}
314
/**
315
 * fu_struct_smbios_ep32_set_max_structure_sz: (skip):
316
 **/
317
void
318
fu_struct_smbios_ep32_set_max_structure_sz(FuStructSmbiosEp32 *st, guint16 value)
319
0
{
320
0
    g_return_if_fail(st != NULL);
321
0
    fu_memwrite_uint16(st->buf->data + 8, value, G_LITTLE_ENDIAN);
322
0
}
323
/**
324
 * fu_struct_smbios_ep32_set_entry_point_rev: (skip):
325
 **/
326
void
327
fu_struct_smbios_ep32_set_entry_point_rev(FuStructSmbiosEp32 *st, guint8 value)
328
0
{
329
0
    g_return_if_fail(st != NULL);
330
0
    st->buf->data[10] = value;
331
0
}
332
/**
333
 * fu_struct_smbios_ep32_set_intermediate_anchor_str: (skip):
334
 **/
335
gboolean
336
fu_struct_smbios_ep32_set_intermediate_anchor_str(FuStructSmbiosEp32 *st, const gchar *value, GError **error)
337
0
{
338
0
    gsize len;
339
0
    g_return_val_if_fail(st != NULL, FALSE);
340
0
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
341
0
    if (value == NULL) {
342
0
        memset(st->buf->data + 16, 0x0, 5);
343
0
        return TRUE;
344
0
    }
345
0
    len = strlen(value);
346
0
    if (len > 5) {
347
0
        g_set_error(error,
348
0
                    FWUPD_ERROR,
349
0
                    FWUPD_ERROR_INVALID_DATA,
350
0
                    "string '%s' (0x%x bytes) does not fit in FuStructSmbiosEp32.intermediate_anchor_str (0x%x bytes)",
351
0
                    value, (guint) len, (guint) 5);
352
0
        return FALSE;
353
0
    }
354
0
    return fu_memcpy_safe(st->buf->data, st->buf->len, 16, (const guint8 *)value, len, 0x0, len, error);
355
0
}
356
/**
357
 * fu_struct_smbios_ep32_set_intermediate_csum: (skip):
358
 **/
359
void
360
fu_struct_smbios_ep32_set_intermediate_csum(FuStructSmbiosEp32 *st, guint8 value)
361
0
{
362
0
    g_return_if_fail(st != NULL);
363
0
    st->buf->data[21] = value;
364
0
}
365
/**
366
 * fu_struct_smbios_ep32_set_structure_table_len: (skip):
367
 **/
368
void
369
fu_struct_smbios_ep32_set_structure_table_len(FuStructSmbiosEp32 *st, guint16 value)
370
0
{
371
0
    g_return_if_fail(st != NULL);
372
0
    fu_memwrite_uint16(st->buf->data + 22, value, G_LITTLE_ENDIAN);
373
0
}
374
/**
375
 * fu_struct_smbios_ep32_set_structure_table_addr: (skip):
376
 **/
377
void
378
fu_struct_smbios_ep32_set_structure_table_addr(FuStructSmbiosEp32 *st, guint32 value)
379
0
{
380
0
    g_return_if_fail(st != NULL);
381
0
    fu_memwrite_uint32(st->buf->data + 24, value, G_LITTLE_ENDIAN);
382
0
}
383
/**
384
 * fu_struct_smbios_ep32_set_number_smbios_structs: (skip):
385
 **/
386
void
387
fu_struct_smbios_ep32_set_number_smbios_structs(FuStructSmbiosEp32 *st, guint16 value)
388
0
{
389
0
    g_return_if_fail(st != NULL);
390
0
    fu_memwrite_uint16(st->buf->data + 28, value, G_LITTLE_ENDIAN);
391
0
}
392
/**
393
 * fu_struct_smbios_ep32_set_smbios_bcd_rev: (skip):
394
 **/
395
void
396
fu_struct_smbios_ep32_set_smbios_bcd_rev(FuStructSmbiosEp32 *st, guint8 value)
397
0
{
398
0
    g_return_if_fail(st != NULL);
399
0
    st->buf->data[30] = value;
400
0
}
401
/**
402
 * fu_struct_smbios_ep32_new: (skip):
403
 **/
404
FuStructSmbiosEp32 *
405
fu_struct_smbios_ep32_new(void)
406
0
{
407
0
    FuStructSmbiosEp32 *st = fu_struct_smbios_ep32_new_internal();
408
0
    st->buf = g_byte_array_sized_new(31);
409
0
    fu_byte_array_set_size(st->buf, 31, 0x0);
410
0
    return st;
411
0
}
412
/**
413
 * fu_struct_smbios_ep32_to_string: (skip):
414
 **/
415
static gchar *
416
fu_struct_smbios_ep32_to_string(const FuStructSmbiosEp32 *st)
417
0
{
418
0
    g_autoptr(GString) str = g_string_new("FuStructSmbiosEp32:\n");
419
0
    g_return_val_if_fail(st != NULL, NULL);
420
0
    {
421
0
        g_autofree gchar *tmp = fu_struct_smbios_ep32_get_anchor_str(st);
422
0
        if (tmp != NULL)
423
0
            g_string_append_printf(str, "  anchor_str: %s\n", tmp);
424
0
    }
425
0
    g_string_append_printf(str, "  entry_point_csum: 0x%x\n",
426
0
                           (guint) fu_struct_smbios_ep32_get_entry_point_csum(st));
427
0
    g_string_append_printf(str, "  entry_point_len: 0x%x\n",
428
0
                           (guint) fu_struct_smbios_ep32_get_entry_point_len(st));
429
0
    g_string_append_printf(str, "  smbios_major_ver: 0x%x\n",
430
0
                           (guint) fu_struct_smbios_ep32_get_smbios_major_ver(st));
431
0
    g_string_append_printf(str, "  smbios_minor_ver: 0x%x\n",
432
0
                           (guint) fu_struct_smbios_ep32_get_smbios_minor_ver(st));
433
0
    g_string_append_printf(str, "  max_structure_sz: 0x%x\n",
434
0
                           (guint) fu_struct_smbios_ep32_get_max_structure_sz(st));
435
0
    g_string_append_printf(str, "  entry_point_rev: 0x%x\n",
436
0
                           (guint) fu_struct_smbios_ep32_get_entry_point_rev(st));
437
0
    {
438
0
        g_autofree gchar *tmp = fu_struct_smbios_ep32_get_intermediate_anchor_str(st);
439
0
        if (tmp != NULL)
440
0
            g_string_append_printf(str, "  intermediate_anchor_str: %s\n", tmp);
441
0
    }
442
0
    g_string_append_printf(str, "  intermediate_csum: 0x%x\n",
443
0
                           (guint) fu_struct_smbios_ep32_get_intermediate_csum(st));
444
0
    g_string_append_printf(str, "  structure_table_len: 0x%x\n",
445
0
                           (guint) fu_struct_smbios_ep32_get_structure_table_len(st));
446
0
    g_string_append_printf(str, "  structure_table_addr: 0x%x\n",
447
0
                           (guint) fu_struct_smbios_ep32_get_structure_table_addr(st));
448
0
    g_string_append_printf(str, "  number_smbios_structs: 0x%x\n",
449
0
                           (guint) fu_struct_smbios_ep32_get_number_smbios_structs(st));
450
0
    g_string_append_printf(str, "  smbios_bcd_rev: 0x%x\n",
451
0
                           (guint) fu_struct_smbios_ep32_get_smbios_bcd_rev(st));
452
0
    if (str->len > 0)
453
0
        g_string_set_size(str, str->len - 1);
454
0
    return g_string_free(g_steal_pointer(&str), FALSE);
455
0
}
456
static gboolean
457
fu_struct_smbios_ep32_validate_internal(FuStructSmbiosEp32 *st, GError **error)
458
0
{
459
0
    g_return_val_if_fail(st != NULL, FALSE);
460
0
    return TRUE;
461
0
}
462
static gboolean
463
fu_struct_smbios_ep32_parse_internal(FuStructSmbiosEp32 *st, GError **error)
464
0
{
465
0
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
466
0
        g_autofree gchar *str = fu_struct_smbios_ep32_to_string(st);
467
0
        g_debug("%s", str);
468
0
    }
469
0
    if (!fu_struct_smbios_ep32_validate_internal(st, error))
470
0
        return FALSE;
471
0
    return TRUE;
472
0
}
473
474
/**
475
 * fu_struct_smbios_ep32_parse: (skip):
476
 **/
477
FuStructSmbiosEp32 *
478
fu_struct_smbios_ep32_parse(const guint8 *buf, gsize bufsz, gsize offset, GError **error)
479
0
{
480
0
    g_autoptr(FuStructSmbiosEp32) st = fu_struct_smbios_ep32_new_internal();
481
0
    g_return_val_if_fail(buf != NULL, NULL);
482
0
    g_return_val_if_fail(error == NULL || *error == NULL, NULL);
483
0
    if (!fu_memchk_read(bufsz, offset, 31, error)) {
484
0
        g_prefix_error_literal(error, "invalid struct FuStructSmbiosEp32: ");
485
0
        return NULL;
486
0
    }
487
0
    st->buf = g_byte_array_new();
488
0
    g_byte_array_append(st->buf, buf + offset, 31);
489
0
    if (!fu_struct_smbios_ep32_parse_internal(st, error))
490
0
        return NULL;
491
0
    return g_steal_pointer(&st);
492
0
}
493
/**
494
 * fu_struct_smbios_ep64_ref: (skip):
495
 **/
496
FuStructSmbiosEp64 *
497
fu_struct_smbios_ep64_ref(FuStructSmbiosEp64 *st)
498
0
{
499
0
    g_return_val_if_fail(st != NULL, NULL);
500
0
    st->refcount++;
501
0
    return st;
502
0
}
503
/**
504
 * fu_struct_smbios_ep64_unref: (skip):
505
 **/
506
void
507
fu_struct_smbios_ep64_unref(FuStructSmbiosEp64 *st)
508
0
{
509
0
    g_return_if_fail(st != NULL);
510
0
    if (st->refcount == 0) {
511
0
        g_critical("FuStructSmbiosEp64 refcount already zero");
512
0
        return;
513
0
    }
514
0
    if (--st->refcount > 0)
515
0
        return;
516
0
    if (st->buf != NULL)
517
0
        g_byte_array_unref(st->buf);
518
0
    g_free(st);
519
0
}
520
/**
521
 * fu_struct_smbios_ep64_new_internal: (skip):
522
 **/
523
static FuStructSmbiosEp64 *
524
fu_struct_smbios_ep64_new_internal(void)
525
0
{
526
0
    FuStructSmbiosEp64 *st = g_new0(FuStructSmbiosEp64, 1);
527
0
    st->refcount = 1;
528
0
    return st;
529
0
}
530
531
/* getters */
532
/**
533
 * fu_struct_smbios_ep64_get_anchor_str: (skip):
534
 **/
535
gchar *
536
fu_struct_smbios_ep64_get_anchor_str(const FuStructSmbiosEp64 *st)
537
0
{
538
0
    g_return_val_if_fail(st != NULL, NULL);
539
0
    return fu_memstrsafe(st->buf->data, st->buf->len, 0, 5, NULL);
540
0
}
541
/**
542
 * fu_struct_smbios_ep64_get_entry_point_csum: (skip):
543
 **/
544
guint8
545
fu_struct_smbios_ep64_get_entry_point_csum(const FuStructSmbiosEp64 *st)
546
0
{
547
0
    g_return_val_if_fail(st != NULL, 0x0);
548
0
    return st->buf->data[5];
549
0
}
550
/**
551
 * fu_struct_smbios_ep64_get_entry_point_len: (skip):
552
 **/
553
guint8
554
fu_struct_smbios_ep64_get_entry_point_len(const FuStructSmbiosEp64 *st)
555
0
{
556
0
    g_return_val_if_fail(st != NULL, 0x0);
557
0
    return st->buf->data[6];
558
0
}
559
/**
560
 * fu_struct_smbios_ep64_get_smbios_major_ver: (skip):
561
 **/
562
guint8
563
fu_struct_smbios_ep64_get_smbios_major_ver(const FuStructSmbiosEp64 *st)
564
0
{
565
0
    g_return_val_if_fail(st != NULL, 0x0);
566
0
    return st->buf->data[7];
567
0
}
568
/**
569
 * fu_struct_smbios_ep64_get_smbios_minor_ver: (skip):
570
 **/
571
guint8
572
fu_struct_smbios_ep64_get_smbios_minor_ver(const FuStructSmbiosEp64 *st)
573
0
{
574
0
    g_return_val_if_fail(st != NULL, 0x0);
575
0
    return st->buf->data[8];
576
0
}
577
/**
578
 * fu_struct_smbios_ep64_get_smbios_docrev: (skip):
579
 **/
580
guint8
581
fu_struct_smbios_ep64_get_smbios_docrev(const FuStructSmbiosEp64 *st)
582
0
{
583
0
    g_return_val_if_fail(st != NULL, 0x0);
584
0
    return st->buf->data[9];
585
0
}
586
/**
587
 * fu_struct_smbios_ep64_get_entry_point_rev: (skip):
588
 **/
589
guint8
590
fu_struct_smbios_ep64_get_entry_point_rev(const FuStructSmbiosEp64 *st)
591
0
{
592
0
    g_return_val_if_fail(st != NULL, 0x0);
593
0
    return st->buf->data[10];
594
0
}
595
/**
596
 * fu_struct_smbios_ep64_get_reserved0: (skip):
597
 **/
598
guint8
599
fu_struct_smbios_ep64_get_reserved0(const FuStructSmbiosEp64 *st)
600
0
{
601
0
    g_return_val_if_fail(st != NULL, 0x0);
602
0
    return st->buf->data[11];
603
0
}
604
/**
605
 * fu_struct_smbios_ep64_get_structure_table_len: (skip):
606
 **/
607
guint32
608
fu_struct_smbios_ep64_get_structure_table_len(const FuStructSmbiosEp64 *st)
609
0
{
610
0
    g_return_val_if_fail(st != NULL, 0x0);
611
0
    return fu_memread_uint32(st->buf->data + 12, G_LITTLE_ENDIAN);
612
0
}
613
/**
614
 * fu_struct_smbios_ep64_get_structure_table_addr: (skip):
615
 **/
616
guint64
617
fu_struct_smbios_ep64_get_structure_table_addr(const FuStructSmbiosEp64 *st)
618
0
{
619
0
    g_return_val_if_fail(st != NULL, 0x0);
620
0
    return fu_memread_uint64(st->buf->data + 16, G_LITTLE_ENDIAN);
621
0
}
622
623
/* setters */
624
/**
625
 * fu_struct_smbios_ep64_set_anchor_str: (skip):
626
 **/
627
gboolean
628
fu_struct_smbios_ep64_set_anchor_str(FuStructSmbiosEp64 *st, const gchar *value, GError **error)
629
0
{
630
0
    gsize len;
631
0
    g_return_val_if_fail(st != NULL, FALSE);
632
0
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
633
0
    if (value == NULL) {
634
0
        memset(st->buf->data + 0, 0x0, 5);
635
0
        return TRUE;
636
0
    }
637
0
    len = strlen(value);
638
0
    if (len > 5) {
639
0
        g_set_error(error,
640
0
                    FWUPD_ERROR,
641
0
                    FWUPD_ERROR_INVALID_DATA,
642
0
                    "string '%s' (0x%x bytes) does not fit in FuStructSmbiosEp64.anchor_str (0x%x bytes)",
643
0
                    value, (guint) len, (guint) 5);
644
0
        return FALSE;
645
0
    }
646
0
    return fu_memcpy_safe(st->buf->data, st->buf->len, 0, (const guint8 *)value, len, 0x0, len, error);
647
0
}
648
/**
649
 * fu_struct_smbios_ep64_set_entry_point_csum: (skip):
650
 **/
651
void
652
fu_struct_smbios_ep64_set_entry_point_csum(FuStructSmbiosEp64 *st, guint8 value)
653
0
{
654
0
    g_return_if_fail(st != NULL);
655
0
    st->buf->data[5] = value;
656
0
}
657
/**
658
 * fu_struct_smbios_ep64_set_entry_point_len: (skip):
659
 **/
660
void
661
fu_struct_smbios_ep64_set_entry_point_len(FuStructSmbiosEp64 *st, guint8 value)
662
0
{
663
0
    g_return_if_fail(st != NULL);
664
0
    st->buf->data[6] = value;
665
0
}
666
/**
667
 * fu_struct_smbios_ep64_set_smbios_major_ver: (skip):
668
 **/
669
void
670
fu_struct_smbios_ep64_set_smbios_major_ver(FuStructSmbiosEp64 *st, guint8 value)
671
0
{
672
0
    g_return_if_fail(st != NULL);
673
0
    st->buf->data[7] = value;
674
0
}
675
/**
676
 * fu_struct_smbios_ep64_set_smbios_minor_ver: (skip):
677
 **/
678
void
679
fu_struct_smbios_ep64_set_smbios_minor_ver(FuStructSmbiosEp64 *st, guint8 value)
680
0
{
681
0
    g_return_if_fail(st != NULL);
682
0
    st->buf->data[8] = value;
683
0
}
684
/**
685
 * fu_struct_smbios_ep64_set_smbios_docrev: (skip):
686
 **/
687
void
688
fu_struct_smbios_ep64_set_smbios_docrev(FuStructSmbiosEp64 *st, guint8 value)
689
0
{
690
0
    g_return_if_fail(st != NULL);
691
0
    st->buf->data[9] = value;
692
0
}
693
/**
694
 * fu_struct_smbios_ep64_set_entry_point_rev: (skip):
695
 **/
696
void
697
fu_struct_smbios_ep64_set_entry_point_rev(FuStructSmbiosEp64 *st, guint8 value)
698
0
{
699
0
    g_return_if_fail(st != NULL);
700
0
    st->buf->data[10] = value;
701
0
}
702
/**
703
 * fu_struct_smbios_ep64_set_reserved0: (skip):
704
 **/
705
void
706
fu_struct_smbios_ep64_set_reserved0(FuStructSmbiosEp64 *st, guint8 value)
707
0
{
708
0
    g_return_if_fail(st != NULL);
709
0
    st->buf->data[11] = value;
710
0
}
711
/**
712
 * fu_struct_smbios_ep64_set_structure_table_len: (skip):
713
 **/
714
void
715
fu_struct_smbios_ep64_set_structure_table_len(FuStructSmbiosEp64 *st, guint32 value)
716
0
{
717
0
    g_return_if_fail(st != NULL);
718
0
    fu_memwrite_uint32(st->buf->data + 12, value, G_LITTLE_ENDIAN);
719
0
}
720
/**
721
 * fu_struct_smbios_ep64_set_structure_table_addr: (skip):
722
 **/
723
void
724
fu_struct_smbios_ep64_set_structure_table_addr(FuStructSmbiosEp64 *st, guint64 value)
725
0
{
726
0
    g_return_if_fail(st != NULL);
727
0
    fu_memwrite_uint64(st->buf->data + 16, value, G_LITTLE_ENDIAN);
728
0
}
729
/**
730
 * fu_struct_smbios_ep64_new: (skip):
731
 **/
732
FuStructSmbiosEp64 *
733
fu_struct_smbios_ep64_new(void)
734
0
{
735
0
    FuStructSmbiosEp64 *st = fu_struct_smbios_ep64_new_internal();
736
0
    st->buf = g_byte_array_sized_new(24);
737
0
    fu_byte_array_set_size(st->buf, 24, 0x0);
738
0
    return st;
739
0
}
740
/**
741
 * fu_struct_smbios_ep64_to_string: (skip):
742
 **/
743
static gchar *
744
fu_struct_smbios_ep64_to_string(const FuStructSmbiosEp64 *st)
745
0
{
746
0
    g_autoptr(GString) str = g_string_new("FuStructSmbiosEp64:\n");
747
0
    g_return_val_if_fail(st != NULL, NULL);
748
0
    {
749
0
        g_autofree gchar *tmp = fu_struct_smbios_ep64_get_anchor_str(st);
750
0
        if (tmp != NULL)
751
0
            g_string_append_printf(str, "  anchor_str: %s\n", tmp);
752
0
    }
753
0
    g_string_append_printf(str, "  entry_point_csum: 0x%x\n",
754
0
                           (guint) fu_struct_smbios_ep64_get_entry_point_csum(st));
755
0
    g_string_append_printf(str, "  entry_point_len: 0x%x\n",
756
0
                           (guint) fu_struct_smbios_ep64_get_entry_point_len(st));
757
0
    g_string_append_printf(str, "  smbios_major_ver: 0x%x\n",
758
0
                           (guint) fu_struct_smbios_ep64_get_smbios_major_ver(st));
759
0
    g_string_append_printf(str, "  smbios_minor_ver: 0x%x\n",
760
0
                           (guint) fu_struct_smbios_ep64_get_smbios_minor_ver(st));
761
0
    g_string_append_printf(str, "  smbios_docrev: 0x%x\n",
762
0
                           (guint) fu_struct_smbios_ep64_get_smbios_docrev(st));
763
0
    g_string_append_printf(str, "  entry_point_rev: 0x%x\n",
764
0
                           (guint) fu_struct_smbios_ep64_get_entry_point_rev(st));
765
0
    g_string_append_printf(str, "  reserved0: 0x%x\n",
766
0
                           (guint) fu_struct_smbios_ep64_get_reserved0(st));
767
0
    g_string_append_printf(str, "  structure_table_len: 0x%x\n",
768
0
                           (guint) fu_struct_smbios_ep64_get_structure_table_len(st));
769
0
    g_string_append_printf(str, "  structure_table_addr: 0x%x\n",
770
0
                           (guint) fu_struct_smbios_ep64_get_structure_table_addr(st));
771
0
    if (str->len > 0)
772
0
        g_string_set_size(str, str->len - 1);
773
0
    return g_string_free(g_steal_pointer(&str), FALSE);
774
0
}
775
static gboolean
776
fu_struct_smbios_ep64_validate_internal(FuStructSmbiosEp64 *st, GError **error)
777
0
{
778
0
    g_return_val_if_fail(st != NULL, FALSE);
779
0
    return TRUE;
780
0
}
781
static gboolean
782
fu_struct_smbios_ep64_parse_internal(FuStructSmbiosEp64 *st, GError **error)
783
0
{
784
0
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
785
0
        g_autofree gchar *str = fu_struct_smbios_ep64_to_string(st);
786
0
        g_debug("%s", str);
787
0
    }
788
0
    if (!fu_struct_smbios_ep64_validate_internal(st, error))
789
0
        return FALSE;
790
0
    return TRUE;
791
0
}
792
793
/**
794
 * fu_struct_smbios_ep64_parse: (skip):
795
 **/
796
FuStructSmbiosEp64 *
797
fu_struct_smbios_ep64_parse(const guint8 *buf, gsize bufsz, gsize offset, GError **error)
798
0
{
799
0
    g_autoptr(FuStructSmbiosEp64) st = fu_struct_smbios_ep64_new_internal();
800
0
    g_return_val_if_fail(buf != NULL, NULL);
801
0
    g_return_val_if_fail(error == NULL || *error == NULL, NULL);
802
0
    if (!fu_memchk_read(bufsz, offset, 24, error)) {
803
0
        g_prefix_error_literal(error, "invalid struct FuStructSmbiosEp64: ");
804
0
        return NULL;
805
0
    }
806
0
    st->buf = g_byte_array_new();
807
0
    g_byte_array_append(st->buf, buf + offset, 24);
808
0
    if (!fu_struct_smbios_ep64_parse_internal(st, error))
809
0
        return NULL;
810
0
    return g_steal_pointer(&st);
811
0
}
812
/**
813
 * fu_struct_smbios_structure_ref: (skip):
814
 **/
815
FuStructSmbiosStructure *
816
fu_struct_smbios_structure_ref(FuStructSmbiosStructure *st)
817
0
{
818
0
    g_return_val_if_fail(st != NULL, NULL);
819
0
    st->refcount++;
820
0
    return st;
821
0
}
822
/**
823
 * fu_struct_smbios_structure_unref: (skip):
824
 **/
825
void
826
fu_struct_smbios_structure_unref(FuStructSmbiosStructure *st)
827
0
{
828
0
    g_return_if_fail(st != NULL);
829
0
    if (st->refcount == 0) {
830
0
        g_critical("FuStructSmbiosStructure refcount already zero");
831
0
        return;
832
0
    }
833
0
    if (--st->refcount > 0)
834
0
        return;
835
0
    if (st->buf != NULL)
836
0
        g_byte_array_unref(st->buf);
837
0
    g_free(st);
838
0
}
839
/**
840
 * fu_struct_smbios_structure_new_internal: (skip):
841
 **/
842
static FuStructSmbiosStructure *
843
fu_struct_smbios_structure_new_internal(void)
844
0
{
845
0
    FuStructSmbiosStructure *st = g_new0(FuStructSmbiosStructure, 1);
846
0
    st->refcount = 1;
847
0
    return st;
848
0
}
849
850
/* getters */
851
/**
852
 * fu_struct_smbios_structure_get_type: (skip):
853
 **/
854
guint8
855
fu_struct_smbios_structure_get_type(const FuStructSmbiosStructure *st)
856
0
{
857
0
    g_return_val_if_fail(st != NULL, 0x0);
858
0
    return st->buf->data[0];
859
0
}
860
/**
861
 * fu_struct_smbios_structure_get_length: (skip):
862
 **/
863
guint8
864
fu_struct_smbios_structure_get_length(const FuStructSmbiosStructure *st)
865
0
{
866
0
    g_return_val_if_fail(st != NULL, 0x0);
867
0
    return st->buf->data[1];
868
0
}
869
/**
870
 * fu_struct_smbios_structure_get_handle: (skip):
871
 **/
872
guint16
873
fu_struct_smbios_structure_get_handle(const FuStructSmbiosStructure *st)
874
0
{
875
0
    g_return_val_if_fail(st != NULL, 0x0);
876
0
    return fu_memread_uint16(st->buf->data + 2, G_LITTLE_ENDIAN);
877
0
}
878
879
/* setters */
880
/**
881
 * fu_struct_smbios_structure_set_type: (skip):
882
 **/
883
void
884
fu_struct_smbios_structure_set_type(FuStructSmbiosStructure *st, guint8 value)
885
0
{
886
0
    g_return_if_fail(st != NULL);
887
0
    st->buf->data[0] = value;
888
0
}
889
/**
890
 * fu_struct_smbios_structure_set_length: (skip):
891
 **/
892
void
893
fu_struct_smbios_structure_set_length(FuStructSmbiosStructure *st, guint8 value)
894
0
{
895
0
    g_return_if_fail(st != NULL);
896
0
    st->buf->data[1] = value;
897
0
}
898
/**
899
 * fu_struct_smbios_structure_set_handle: (skip):
900
 **/
901
void
902
fu_struct_smbios_structure_set_handle(FuStructSmbiosStructure *st, guint16 value)
903
0
{
904
0
    g_return_if_fail(st != NULL);
905
0
    fu_memwrite_uint16(st->buf->data + 2, value, G_LITTLE_ENDIAN);
906
0
}
907
/**
908
 * fu_struct_smbios_structure_new: (skip):
909
 **/
910
FuStructSmbiosStructure *
911
fu_struct_smbios_structure_new(void)
912
0
{
913
0
    FuStructSmbiosStructure *st = fu_struct_smbios_structure_new_internal();
914
0
    st->buf = g_byte_array_sized_new(4);
915
0
    fu_byte_array_set_size(st->buf, 4, 0x0);
916
0
    return st;
917
0
}
918
/**
919
 * fu_struct_smbios_structure_to_string: (skip):
920
 **/
921
static gchar *
922
fu_struct_smbios_structure_to_string(const FuStructSmbiosStructure *st)
923
0
{
924
0
    g_autoptr(GString) str = g_string_new("FuStructSmbiosStructure:\n");
925
0
    g_return_val_if_fail(st != NULL, NULL);
926
0
    g_string_append_printf(str, "  type: 0x%x\n",
927
0
                           (guint) fu_struct_smbios_structure_get_type(st));
928
0
    g_string_append_printf(str, "  length: 0x%x\n",
929
0
                           (guint) fu_struct_smbios_structure_get_length(st));
930
0
    g_string_append_printf(str, "  handle: 0x%x\n",
931
0
                           (guint) fu_struct_smbios_structure_get_handle(st));
932
0
    if (str->len > 0)
933
0
        g_string_set_size(str, str->len - 1);
934
0
    return g_string_free(g_steal_pointer(&str), FALSE);
935
0
}
936
static gboolean
937
fu_struct_smbios_structure_validate_internal(FuStructSmbiosStructure *st, GError **error)
938
0
{
939
0
    g_return_val_if_fail(st != NULL, FALSE);
940
0
    return TRUE;
941
0
}
942
static gboolean
943
fu_struct_smbios_structure_parse_internal(FuStructSmbiosStructure *st, GError **error)
944
0
{
945
0
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
946
0
        g_autofree gchar *str = fu_struct_smbios_structure_to_string(st);
947
0
        g_debug("%s", str);
948
0
    }
949
0
    if (!fu_struct_smbios_structure_validate_internal(st, error))
950
0
        return FALSE;
951
0
    return TRUE;
952
0
}
953
954
/**
955
 * fu_struct_smbios_structure_parse: (skip):
956
 **/
957
FuStructSmbiosStructure *
958
fu_struct_smbios_structure_parse(const guint8 *buf, gsize bufsz, gsize offset, GError **error)
959
0
{
960
0
    g_autoptr(FuStructSmbiosStructure) st = fu_struct_smbios_structure_new_internal();
961
0
    g_return_val_if_fail(buf != NULL, NULL);
962
0
    g_return_val_if_fail(error == NULL || *error == NULL, NULL);
963
0
    if (!fu_memchk_read(bufsz, offset, 4, error)) {
964
0
        g_prefix_error_literal(error, "invalid struct FuStructSmbiosStructure: ");
965
0
        return NULL;
966
0
    }
967
0
    st->buf = g_byte_array_new();
968
0
    g_byte_array_append(st->buf, buf + offset, 4);
969
0
    if (!fu_struct_smbios_structure_parse_internal(st, error))
970
0
        return NULL;
971
0
    return g_steal_pointer(&st);
972
0
}