Coverage Report

Created: 2026-10-17 07:48

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