Coverage Report

Created: 2025-11-11 06:44

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