Coverage Report

Created: 2026-01-25 06:22

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/work/fu-fmap-struct.c
Line
Count
Source
1
/*
2
 * This file is auto-generated, do not modify!
3
 *
4
 * SPDX-License-Identifier: LGPL-2.1-or-later
5
 */
6
7
#include "config.h"
8
9
#include <glib.h>
10
11
#include "fu-fmap-struct.h"
12
#include "fu-byte-array.h"
13
#include "fu-mem-private.h"
14
#include "fu-string.h"
15
16
#ifdef G_LOG_DOMAIN
17
  #undef G_LOG_DOMAIN
18
#endif
19
0
#define G_LOG_DOMAIN "FuStruct"
20
/**
21
 * fu_struct_fmap_ref: (skip):
22
 **/
23
FuStructFmap *
24
fu_struct_fmap_ref(FuStructFmap *st)
25
0
{
26
0
    g_return_val_if_fail(st != NULL, NULL);
27
0
    st->refcount++;
28
0
    return st;
29
0
}
30
/**
31
 * fu_struct_fmap_unref: (skip):
32
 **/
33
void
34
fu_struct_fmap_unref(FuStructFmap *st)
35
15.6k
{
36
15.6k
    g_return_if_fail(st != NULL);
37
15.6k
    if (st->refcount == 0) {
38
0
        g_critical("FuStructFmap refcount already zero");
39
0
        return;
40
0
    }
41
15.6k
    if (--st->refcount > 0)
42
0
        return;
43
15.6k
    if (st->buf != NULL)
44
15.6k
        g_byte_array_unref(st->buf);
45
15.6k
    g_free(st);
46
15.6k
}
47
/**
48
 * fu_struct_fmap_new_internal: (skip):
49
 **/
50
static FuStructFmap *
51
fu_struct_fmap_new_internal(void)
52
15.6k
{
53
15.6k
    FuStructFmap *st = g_new0(FuStructFmap, 1);
54
15.6k
    st->refcount = 1;
55
15.6k
    return st;
56
15.6k
}
57
58
/* getters */
59
/**
60
 * fu_struct_fmap_get_signature: (skip):
61
 **/
62
static gchar *
63
fu_struct_fmap_get_signature(const FuStructFmap *st)
64
182
{
65
182
    g_return_val_if_fail(st != NULL, NULL);
66
182
    return fu_memstrsafe(st->buf->data, st->buf->len, 0, 8, NULL);
67
182
}
68
/**
69
 * fu_struct_fmap_get_ver_major: (skip):
70
 **/
71
guint8
72
fu_struct_fmap_get_ver_major(const FuStructFmap *st)
73
7.51k
{
74
7.51k
    g_return_val_if_fail(st != NULL, 0x0);
75
7.51k
    return st->buf->data[8];
76
7.51k
}
77
/**
78
 * fu_struct_fmap_get_ver_minor: (skip):
79
 **/
80
guint8
81
fu_struct_fmap_get_ver_minor(const FuStructFmap *st)
82
7.51k
{
83
7.51k
    g_return_val_if_fail(st != NULL, 0x0);
84
7.51k
    return st->buf->data[9];
85
7.51k
}
86
/**
87
 * fu_struct_fmap_get_base: (skip):
88
 **/
89
guint64
90
fu_struct_fmap_get_base(const FuStructFmap *st)
91
7.51k
{
92
7.51k
    g_return_val_if_fail(st != NULL, 0x0);
93
7.51k
    return fu_memread_uint64(st->buf->data + 10, G_LITTLE_ENDIAN);
94
7.51k
}
95
/**
96
 * fu_struct_fmap_get_size: (skip):
97
 **/
98
guint32
99
fu_struct_fmap_get_size(const FuStructFmap *st)
100
7.56k
{
101
7.56k
    g_return_val_if_fail(st != NULL, 0x0);
102
7.56k
    return fu_memread_uint32(st->buf->data + 18, G_LITTLE_ENDIAN);
103
7.56k
}
104
/**
105
 * fu_struct_fmap_get_name: (skip):
106
 **/
107
gchar *
108
fu_struct_fmap_get_name(const FuStructFmap *st)
109
0
{
110
0
    g_return_val_if_fail(st != NULL, NULL);
111
0
    return fu_memstrsafe(st->buf->data, st->buf->len, 22, 32, NULL);
112
0
}
113
/**
114
 * fu_struct_fmap_get_nareas: (skip):
115
 **/
116
guint16
117
fu_struct_fmap_get_nareas(const FuStructFmap *st)
118
7.45k
{
119
7.45k
    g_return_val_if_fail(st != NULL, 0x0);
120
7.45k
    return fu_memread_uint16(st->buf->data + 54, G_LITTLE_ENDIAN);
121
7.45k
}
122
123
/* setters */
124
/**
125
 * fu_struct_fmap_set_signature: (skip):
126
 **/
127
static gboolean
128
fu_struct_fmap_set_signature(FuStructFmap *st, const gchar *value, GError **error)
129
377
{
130
377
    gsize len;
131
377
    g_return_val_if_fail(st != NULL, FALSE);
132
377
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
133
377
    if (value == NULL) {
134
0
        memset(st->buf->data + 0, 0x0, 8);
135
0
        return TRUE;
136
0
    }
137
377
    len = strlen(value);
138
377
    if (len > 8) {
139
0
        g_set_error(error,
140
0
                    FWUPD_ERROR,
141
0
                    FWUPD_ERROR_INVALID_DATA,
142
0
                    "string '%s' (0x%x bytes) does not fit in FuStructFmap.signature (0x%x bytes)",
143
0
                    value, (guint) len, (guint) 8);
144
0
        return FALSE;
145
0
    }
146
377
    return fu_memcpy_safe(st->buf->data, st->buf->len, 0, (const guint8 *)value, len, 0x0, len, error);
147
377
}
148
/**
149
 * fu_struct_fmap_set_ver_major: (skip):
150
 **/
151
void
152
fu_struct_fmap_set_ver_major(FuStructFmap *st, guint8 value)
153
452
{
154
452
    g_return_if_fail(st != NULL);
155
452
    st->buf->data[8] = value;
156
452
}
157
/**
158
 * fu_struct_fmap_set_ver_minor: (skip):
159
 **/
160
void
161
fu_struct_fmap_set_ver_minor(FuStructFmap *st, guint8 value)
162
452
{
163
452
    g_return_if_fail(st != NULL);
164
452
    st->buf->data[9] = value;
165
452
}
166
/**
167
 * fu_struct_fmap_set_base: (skip):
168
 **/
169
void
170
fu_struct_fmap_set_base(FuStructFmap *st, guint64 value)
171
75
{
172
75
    g_return_if_fail(st != NULL);
173
75
    fu_memwrite_uint64(st->buf->data + 10, value, G_LITTLE_ENDIAN);
174
75
}
175
/**
176
 * fu_struct_fmap_set_size: (skip):
177
 **/
178
void
179
fu_struct_fmap_set_size(FuStructFmap *st, guint32 value)
180
75
{
181
75
    g_return_if_fail(st != NULL);
182
75
    fu_memwrite_uint32(st->buf->data + 18, value, G_LITTLE_ENDIAN);
183
75
}
184
/**
185
 * fu_struct_fmap_set_name: (skip):
186
 **/
187
gboolean
188
fu_struct_fmap_set_name(FuStructFmap *st, const gchar *value, GError **error)
189
0
{
190
0
    gsize len;
191
0
    g_return_val_if_fail(st != NULL, FALSE);
192
0
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
193
0
    if (value == NULL) {
194
0
        memset(st->buf->data + 22, 0x0, 32);
195
0
        return TRUE;
196
0
    }
197
0
    len = strlen(value);
198
0
    if (len > 32) {
199
0
        g_set_error(error,
200
0
                    FWUPD_ERROR,
201
0
                    FWUPD_ERROR_INVALID_DATA,
202
0
                    "string '%s' (0x%x bytes) does not fit in FuStructFmap.name (0x%x bytes)",
203
0
                    value, (guint) len, (guint) 32);
204
0
        return FALSE;
205
0
    }
206
0
    return fu_memcpy_safe(st->buf->data, st->buf->len, 22, (const guint8 *)value, len, 0x0, len, error);
207
0
}
208
/**
209
 * fu_struct_fmap_set_nareas: (skip):
210
 **/
211
void
212
fu_struct_fmap_set_nareas(FuStructFmap *st, guint16 value)
213
75
{
214
75
    g_return_if_fail(st != NULL);
215
75
    fu_memwrite_uint16(st->buf->data + 54, value, G_LITTLE_ENDIAN);
216
75
}
217
/**
218
 * fu_struct_fmap_new: (skip):
219
 **/
220
FuStructFmap *
221
fu_struct_fmap_new(void)
222
377
{
223
377
    FuStructFmap *st = fu_struct_fmap_new_internal();
224
377
    st->buf = g_byte_array_sized_new(56);
225
377
    fu_byte_array_set_size(st->buf, 56, 0x0);
226
377
    fu_struct_fmap_set_signature(st, "__FMAP__", NULL);
227
377
    fu_struct_fmap_set_ver_major(st, 0x1);
228
377
    fu_struct_fmap_set_ver_minor(st, 0x1);
229
377
    return st;
230
377
}
231
/**
232
 * fu_struct_fmap_to_string: (skip):
233
 **/
234
static gchar *
235
fu_struct_fmap_to_string(const FuStructFmap *st)
236
0
{
237
0
    g_autoptr(GString) str = g_string_new("FuStructFmap:\n");
238
0
    g_return_val_if_fail(st != NULL, NULL);
239
0
    {
240
0
        g_autofree gchar *tmp = fu_struct_fmap_get_signature(st);
241
0
        if (tmp != NULL)
242
0
            g_string_append_printf(str, "  signature: %s\n", tmp);
243
0
    }
244
0
    g_string_append_printf(str, "  ver_major: 0x%x\n",
245
0
                           (guint) fu_struct_fmap_get_ver_major(st));
246
0
    g_string_append_printf(str, "  ver_minor: 0x%x\n",
247
0
                           (guint) fu_struct_fmap_get_ver_minor(st));
248
0
    g_string_append_printf(str, "  base: 0x%x\n",
249
0
                           (guint) fu_struct_fmap_get_base(st));
250
0
    g_string_append_printf(str, "  size: 0x%x\n",
251
0
                           (guint) fu_struct_fmap_get_size(st));
252
0
    {
253
0
        g_autofree gchar *tmp = fu_struct_fmap_get_name(st);
254
0
        if (tmp != NULL)
255
0
            g_string_append_printf(str, "  name: %s\n", tmp);
256
0
    }
257
0
    g_string_append_printf(str, "  nareas: 0x%x\n",
258
0
                           (guint) fu_struct_fmap_get_nareas(st));
259
0
    if (str->len > 0)
260
0
        g_string_set_size(str, str->len - 1);
261
0
    return g_string_free(g_steal_pointer(&str), FALSE);
262
0
}
263
static gboolean
264
fu_struct_fmap_validate_internal(FuStructFmap *st, GError **error)
265
15.2k
{
266
15.2k
    g_return_val_if_fail(st != NULL, FALSE);
267
15.2k
    if (strncmp((const gchar *) (st->buf->data + 0), "__FMAP__", 8) != 0) {
268
182
        g_autofree gchar *str = fu_struct_fmap_get_signature(st);
269
182
        g_set_error(error,
270
182
                    FWUPD_ERROR,
271
182
                    FWUPD_ERROR_INVALID_DATA,
272
182
                    "constant FuStructFmap.signature was not valid, "
273
182
                    "expected '__FMAP__' and got '%s'",
274
182
                    str);
275
182
        return FALSE;
276
182
    }
277
15.0k
    return TRUE;
278
15.2k
}
279
/**
280
 * fu_struct_fmap_validate_stream: (skip):
281
 **/
282
gboolean
283
fu_struct_fmap_validate_stream(GInputStream *stream, gsize offset, GError **error)
284
7.74k
{
285
7.74k
    g_autoptr(FuStructFmap) st = fu_struct_fmap_new_internal();
286
7.74k
    g_return_val_if_fail(G_IS_INPUT_STREAM(stream), FALSE);
287
7.74k
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
288
7.74k
    st->buf = fu_input_stream_read_byte_array(stream, offset, 56, NULL, error);
289
7.74k
    if (st->buf == NULL) {
290
0
        g_prefix_error(error, "FuStructFmap failed read of 0x%x: ", (guint) 56);
291
0
        return FALSE;
292
0
    }
293
7.74k
    if (st->buf->len != 56) {
294
45
        g_set_error(error,
295
45
                    FWUPD_ERROR,
296
45
                    FWUPD_ERROR_INVALID_DATA,
297
45
                    "FuStructFmap requested 0x%x and got 0x%x",
298
45
                    (guint) 56,
299
45
                    (guint) st->buf->len);
300
45
        return FALSE;
301
45
    }
302
7.69k
    return fu_struct_fmap_validate_internal(st, error);
303
7.74k
}
304
static gboolean
305
fu_struct_fmap_parse_internal(FuStructFmap *st, GError **error)
306
7.51k
{
307
7.51k
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
308
0
        g_autofree gchar *str = fu_struct_fmap_to_string(st);
309
0
        g_debug("%s", str);
310
0
    }
311
7.51k
    if (!fu_struct_fmap_validate_internal(st, error))
312
0
        return FALSE;
313
7.51k
    return TRUE;
314
7.51k
}
315
/**
316
 * fu_struct_fmap_parse_stream: (skip):
317
 **/
318
FuStructFmap *
319
fu_struct_fmap_parse_stream(GInputStream *stream, gsize offset, GError **error)
320
7.51k
{
321
7.51k
    g_autoptr(FuStructFmap) st = fu_struct_fmap_new_internal();
322
7.51k
    st->buf = fu_input_stream_read_byte_array(stream, offset, 56, NULL, error);
323
7.51k
    if (st->buf == NULL) {
324
0
        g_prefix_error(error, "FuStructFmap failed read of 0x%x: ", (guint) 56);
325
0
        return NULL;
326
0
    }
327
7.51k
    if (st->buf->len != 56) {
328
0
        g_set_error(error,
329
0
                    FWUPD_ERROR,
330
0
                    FWUPD_ERROR_INVALID_DATA,
331
0
                    "FuStructFmap requested 0x%x and got 0x%x",
332
0
                    (guint) 56,
333
0
                    (guint) st->buf->len);
334
0
        return NULL;
335
0
    }
336
7.51k
    if (!fu_struct_fmap_parse_internal(st, error))
337
0
        return NULL;
338
7.51k
    return g_steal_pointer(&st);
339
7.51k
}
340
/**
341
 * fu_struct_fmap_area_ref: (skip):
342
 **/
343
FuStructFmapArea *
344
fu_struct_fmap_area_ref(FuStructFmapArea *st)
345
0
{
346
0
    g_return_val_if_fail(st != NULL, NULL);
347
0
    st->refcount++;
348
0
    return st;
349
0
}
350
/**
351
 * fu_struct_fmap_area_unref: (skip):
352
 **/
353
void
354
fu_struct_fmap_area_unref(FuStructFmapArea *st)
355
4.11M
{
356
4.11M
    g_return_if_fail(st != NULL);
357
4.11M
    if (st->refcount == 0) {
358
0
        g_critical("FuStructFmapArea refcount already zero");
359
0
        return;
360
0
    }
361
4.11M
    if (--st->refcount > 0)
362
0
        return;
363
4.11M
    if (st->buf != NULL)
364
4.11M
        g_byte_array_unref(st->buf);
365
4.11M
    g_free(st);
366
4.11M
}
367
/**
368
 * fu_struct_fmap_area_new_internal: (skip):
369
 **/
370
static FuStructFmapArea *
371
fu_struct_fmap_area_new_internal(void)
372
4.11M
{
373
4.11M
    FuStructFmapArea *st = g_new0(FuStructFmapArea, 1);
374
4.11M
    st->refcount = 1;
375
4.11M
    return st;
376
4.11M
}
377
378
/* getters */
379
/**
380
 * fu_struct_fmap_area_get_offset: (skip):
381
 **/
382
guint32
383
fu_struct_fmap_area_get_offset(const FuStructFmapArea *st)
384
44.8k
{
385
44.8k
    g_return_val_if_fail(st != NULL, 0x0);
386
44.8k
    return fu_memread_uint32(st->buf->data + 0, G_LITTLE_ENDIAN);
387
44.8k
}
388
/**
389
 * fu_struct_fmap_area_get_size: (skip):
390
 **/
391
guint32
392
fu_struct_fmap_area_get_size(const FuStructFmapArea *st)
393
4.10M
{
394
4.10M
    g_return_val_if_fail(st != NULL, 0x0);
395
4.10M
    return fu_memread_uint32(st->buf->data + 4, G_LITTLE_ENDIAN);
396
4.10M
}
397
/**
398
 * fu_struct_fmap_area_get_name: (skip):
399
 **/
400
gchar *
401
fu_struct_fmap_area_get_name(const FuStructFmapArea *st)
402
41.7k
{
403
41.7k
    g_return_val_if_fail(st != NULL, NULL);
404
41.7k
    return fu_memstrsafe(st->buf->data, st->buf->len, 8, 32, NULL);
405
41.7k
}
406
/**
407
 * fu_struct_fmap_area_get_flags: (skip):
408
 **/
409
guint16
410
fu_struct_fmap_area_get_flags(const FuStructFmapArea *st)
411
0
{
412
0
    g_return_val_if_fail(st != NULL, 0x0);
413
0
    return fu_memread_uint16(st->buf->data + 40, G_LITTLE_ENDIAN);
414
0
}
415
416
/* setters */
417
/**
418
 * fu_struct_fmap_area_set_offset: (skip):
419
 **/
420
void
421
fu_struct_fmap_area_set_offset(FuStructFmapArea *st, guint32 value)
422
33
{
423
33
    g_return_if_fail(st != NULL);
424
33
    fu_memwrite_uint32(st->buf->data + 0, value, G_LITTLE_ENDIAN);
425
33
}
426
/**
427
 * fu_struct_fmap_area_set_size: (skip):
428
 **/
429
void
430
fu_struct_fmap_area_set_size(FuStructFmapArea *st, guint32 value)
431
33
{
432
33
    g_return_if_fail(st != NULL);
433
33
    fu_memwrite_uint32(st->buf->data + 4, value, G_LITTLE_ENDIAN);
434
33
}
435
/**
436
 * fu_struct_fmap_area_set_name: (skip):
437
 **/
438
gboolean
439
fu_struct_fmap_area_set_name(FuStructFmapArea *st, const gchar *value, GError **error)
440
33
{
441
33
    gsize len;
442
33
    g_return_val_if_fail(st != NULL, FALSE);
443
33
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
444
33
    if (value == NULL) {
445
0
        memset(st->buf->data + 8, 0x0, 32);
446
0
        return TRUE;
447
0
    }
448
33
    len = strlen(value);
449
33
    if (len > 32) {
450
0
        g_set_error(error,
451
0
                    FWUPD_ERROR,
452
0
                    FWUPD_ERROR_INVALID_DATA,
453
0
                    "string '%s' (0x%x bytes) does not fit in FuStructFmapArea.name (0x%x bytes)",
454
0
                    value, (guint) len, (guint) 32);
455
0
        return FALSE;
456
0
    }
457
33
    return fu_memcpy_safe(st->buf->data, st->buf->len, 8, (const guint8 *)value, len, 0x0, len, error);
458
33
}
459
/**
460
 * fu_struct_fmap_area_set_flags: (skip):
461
 **/
462
void
463
fu_struct_fmap_area_set_flags(FuStructFmapArea *st, guint16 value)
464
0
{
465
0
    g_return_if_fail(st != NULL);
466
0
    fu_memwrite_uint16(st->buf->data + 40, value, G_LITTLE_ENDIAN);
467
0
}
468
/**
469
 * fu_struct_fmap_area_new: (skip):
470
 **/
471
FuStructFmapArea *
472
fu_struct_fmap_area_new(void)
473
33
{
474
33
    FuStructFmapArea *st = fu_struct_fmap_area_new_internal();
475
33
    st->buf = g_byte_array_sized_new(42);
476
33
    fu_byte_array_set_size(st->buf, 42, 0x0);
477
33
    return st;
478
33
}
479
/**
480
 * fu_struct_fmap_area_to_string: (skip):
481
 **/
482
static gchar *
483
fu_struct_fmap_area_to_string(const FuStructFmapArea *st)
484
0
{
485
0
    g_autoptr(GString) str = g_string_new("FuStructFmapArea:\n");
486
0
    g_return_val_if_fail(st != NULL, NULL);
487
0
    g_string_append_printf(str, "  offset: 0x%x\n",
488
0
                           (guint) fu_struct_fmap_area_get_offset(st));
489
0
    g_string_append_printf(str, "  size: 0x%x\n",
490
0
                           (guint) fu_struct_fmap_area_get_size(st));
491
0
    {
492
0
        g_autofree gchar *tmp = fu_struct_fmap_area_get_name(st);
493
0
        if (tmp != NULL)
494
0
            g_string_append_printf(str, "  name: %s\n", tmp);
495
0
    }
496
0
    g_string_append_printf(str, "  flags: 0x%x\n",
497
0
                           (guint) fu_struct_fmap_area_get_flags(st));
498
0
    if (str->len > 0)
499
0
        g_string_set_size(str, str->len - 1);
500
0
    return g_string_free(g_steal_pointer(&str), FALSE);
501
0
}
502
static gboolean
503
fu_struct_fmap_area_validate_internal(FuStructFmapArea *st, GError **error)
504
4.10M
{
505
4.10M
    g_return_val_if_fail(st != NULL, FALSE);
506
4.10M
    return TRUE;
507
4.10M
}
508
static gboolean
509
fu_struct_fmap_area_parse_internal(FuStructFmapArea *st, GError **error)
510
4.10M
{
511
4.10M
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
512
0
        g_autofree gchar *str = fu_struct_fmap_area_to_string(st);
513
0
        g_debug("%s", str);
514
0
    }
515
4.10M
    if (!fu_struct_fmap_area_validate_internal(st, error))
516
0
        return FALSE;
517
4.10M
    return TRUE;
518
4.10M
}
519
/**
520
 * fu_struct_fmap_area_parse_stream: (skip):
521
 **/
522
FuStructFmapArea *
523
fu_struct_fmap_area_parse_stream(GInputStream *stream, gsize offset, GError **error)
524
4.11M
{
525
4.11M
    g_autoptr(FuStructFmapArea) st = fu_struct_fmap_area_new_internal();
526
4.11M
    st->buf = fu_input_stream_read_byte_array(stream, offset, 42, NULL, error);
527
4.11M
    if (st->buf == NULL) {
528
584
        g_prefix_error(error, "FuStructFmapArea failed read of 0x%x: ", (guint) 42);
529
584
        return NULL;
530
584
    }
531
4.10M
    if (st->buf->len != 42) {
532
3.44k
        g_set_error(error,
533
3.44k
                    FWUPD_ERROR,
534
3.44k
                    FWUPD_ERROR_INVALID_DATA,
535
3.44k
                    "FuStructFmapArea requested 0x%x and got 0x%x",
536
3.44k
                    (guint) 42,
537
3.44k
                    (guint) st->buf->len);
538
3.44k
        return NULL;
539
3.44k
    }
540
4.10M
    if (!fu_struct_fmap_area_parse_internal(st, error))
541
0
        return NULL;
542
4.10M
    return g_steal_pointer(&st);
543
4.10M
}