Coverage Report

Created: 2025-07-01 07:09

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