Coverage Report

Created: 2026-03-11 07:30

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-private.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
18.7k
{
37
18.7k
    g_return_if_fail(st != NULL);
38
18.7k
    if (st->refcount == 0) {
39
0
        g_critical("FuStructFmap refcount already zero");
40
0
        return;
41
0
    }
42
18.7k
    if (--st->refcount > 0)
43
0
        return;
44
18.7k
    if (st->buf != NULL)
45
18.7k
        g_byte_array_unref(st->buf);
46
18.7k
    g_free(st);
47
18.7k
}
48
/**
49
 * fu_struct_fmap_new_internal: (skip):
50
 **/
51
static FuStructFmap *
52
fu_struct_fmap_new_internal(void)
53
18.7k
{
54
18.7k
    FuStructFmap *st = g_new0(FuStructFmap, 1);
55
18.7k
    st->refcount = 1;
56
18.7k
    return st;
57
18.7k
}
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
165
{
66
165
    g_return_val_if_fail(st != NULL, NULL);
67
165
    return fu_memstrsafe(st->buf->data, st->buf->len, 0, 8, NULL);
68
165
}
69
/**
70
 * fu_struct_fmap_get_ver_major: (skip):
71
 **/
72
guint8
73
fu_struct_fmap_get_ver_major(const FuStructFmap *st)
74
8.95k
{
75
8.95k
    g_return_val_if_fail(st != NULL, 0x0);
76
8.95k
    return st->buf->data[8];
77
8.95k
}
78
/**
79
 * fu_struct_fmap_get_ver_minor: (skip):
80
 **/
81
guint8
82
fu_struct_fmap_get_ver_minor(const FuStructFmap *st)
83
8.95k
{
84
8.95k
    g_return_val_if_fail(st != NULL, 0x0);
85
8.95k
    return st->buf->data[9];
86
8.95k
}
87
/**
88
 * fu_struct_fmap_get_base: (skip):
89
 **/
90
guint64
91
fu_struct_fmap_get_base(const FuStructFmap *st)
92
8.95k
{
93
8.95k
    g_return_val_if_fail(st != NULL, 0x0);
94
8.95k
    return fu_memread_uint64(st->buf->data + 10, G_LITTLE_ENDIAN);
95
8.95k
}
96
/**
97
 * fu_struct_fmap_get_size: (skip):
98
 **/
99
guint32
100
fu_struct_fmap_get_size(const FuStructFmap *st)
101
9.01k
{
102
9.01k
    g_return_val_if_fail(st != NULL, 0x0);
103
9.01k
    return fu_memread_uint32(st->buf->data + 18, G_LITTLE_ENDIAN);
104
9.01k
}
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
8.89k
{
120
8.89k
    g_return_val_if_fail(st != NULL, 0x0);
121
8.89k
    return fu_memread_uint16(st->buf->data + 54, G_LITTLE_ENDIAN);
122
8.89k
}
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
668
{
131
668
    gsize len;
132
668
    g_return_val_if_fail(st != NULL, FALSE);
133
668
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
134
668
    if (value == NULL) {
135
0
        memset(st->buf->data + 0, 0x0, 8);
136
0
        return TRUE;
137
0
    }
138
668
    len = strlen(value);
139
668
    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
668
    return fu_memcpy_safe(st->buf->data, st->buf->len, 0, (const guint8 *)value, len, 0x0, len, error);
148
668
}
149
/**
150
 * fu_struct_fmap_set_ver_major: (skip):
151
 **/
152
void
153
fu_struct_fmap_set_ver_major(FuStructFmap *st, guint8 value)
154
786
{
155
786
    g_return_if_fail(st != NULL);
156
786
    st->buf->data[8] = value;
157
786
}
158
/**
159
 * fu_struct_fmap_set_ver_minor: (skip):
160
 **/
161
void
162
fu_struct_fmap_set_ver_minor(FuStructFmap *st, guint8 value)
163
786
{
164
786
    g_return_if_fail(st != NULL);
165
786
    st->buf->data[9] = value;
166
786
}
167
/**
168
 * fu_struct_fmap_set_base: (skip):
169
 **/
170
void
171
fu_struct_fmap_set_base(FuStructFmap *st, guint64 value)
172
118
{
173
118
    g_return_if_fail(st != NULL);
174
118
    fu_memwrite_uint64(st->buf->data + 10, value, G_LITTLE_ENDIAN);
175
118
}
176
/**
177
 * fu_struct_fmap_set_size: (skip):
178
 **/
179
void
180
fu_struct_fmap_set_size(FuStructFmap *st, guint32 value)
181
118
{
182
118
    g_return_if_fail(st != NULL);
183
118
    fu_memwrite_uint32(st->buf->data + 18, value, G_LITTLE_ENDIAN);
184
118
}
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
118
{
215
118
    g_return_if_fail(st != NULL);
216
118
    fu_memwrite_uint16(st->buf->data + 54, value, G_LITTLE_ENDIAN);
217
118
}
218
/**
219
 * fu_struct_fmap_new: (skip):
220
 **/
221
FuStructFmap *
222
fu_struct_fmap_new(void)
223
668
{
224
668
    FuStructFmap *st = fu_struct_fmap_new_internal();
225
668
    st->buf = g_byte_array_sized_new(56);
226
668
    fu_byte_array_set_size(st->buf, 56, 0x0);
227
668
    fu_struct_fmap_set_signature(st, "__FMAP__", NULL);
228
668
    fu_struct_fmap_set_ver_major(st, 0x1);
229
668
    fu_struct_fmap_set_ver_minor(st, 0x1);
230
668
    return st;
231
668
}
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
18.0k
{
267
18.0k
    g_return_val_if_fail(st != NULL, FALSE);
268
18.0k
    if (strncmp((const gchar *) (st->buf->data + 0), "__FMAP__", 8) != 0) {
269
165
        g_autofree gchar *str = fu_struct_fmap_get_signature(st);
270
165
        g_set_error(error,
271
165
                    FWUPD_ERROR,
272
165
                    FWUPD_ERROR_INVALID_DATA,
273
165
                    "constant FuStructFmap.signature was not valid, "
274
165
                    "expected '__FMAP__' and got '%s'",
275
165
                    str);
276
165
        return FALSE;
277
165
    }
278
17.9k
    return TRUE;
279
18.0k
}
280
/**
281
 * fu_struct_fmap_validate_stream: (skip):
282
 **/
283
gboolean
284
fu_struct_fmap_validate_stream(GInputStream *stream, gsize offset, GError **error)
285
9.16k
{
286
9.16k
    g_autoptr(FuStructFmap) st = fu_struct_fmap_new_internal();
287
9.16k
    g_return_val_if_fail(G_IS_INPUT_STREAM(stream), FALSE);
288
9.16k
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
289
9.16k
    st->buf = fu_input_stream_read_byte_array(stream, offset, 56, NULL, error);
290
9.16k
    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
9.16k
    if (st->buf->len != 56) {
295
46
        g_set_error(error,
296
46
                    FWUPD_ERROR,
297
46
                    FWUPD_ERROR_INVALID_DATA,
298
46
                    "FuStructFmap requested 0x%x and got 0x%x",
299
46
                    (guint) 56,
300
46
                    (guint) st->buf->len);
301
46
        return FALSE;
302
46
    }
303
9.11k
    return fu_struct_fmap_validate_internal(st, error);
304
9.16k
}
305
static gboolean
306
fu_struct_fmap_parse_internal(FuStructFmap *st, GError **error)
307
8.95k
{
308
8.95k
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
309
0
        g_autofree gchar *str = fu_struct_fmap_to_string(st);
310
0
        g_debug("%s", str);
311
0
    }
312
8.95k
    if (!fu_struct_fmap_validate_internal(st, error))
313
0
        return FALSE;
314
8.95k
    return TRUE;
315
8.95k
}
316
/**
317
 * fu_struct_fmap_parse_stream: (skip):
318
 **/
319
FuStructFmap *
320
fu_struct_fmap_parse_stream(GInputStream *stream, gsize offset, GError **error)
321
8.95k
{
322
8.95k
    g_autoptr(FuStructFmap) st = fu_struct_fmap_new_internal();
323
8.95k
    st->buf = fu_input_stream_read_byte_array(stream, offset, 56, NULL, error);
324
8.95k
    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
8.95k
    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
8.95k
    if (!fu_struct_fmap_parse_internal(st, error))
338
0
        return NULL;
339
8.95k
    return g_steal_pointer(&st);
340
8.95k
}
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
6.09M
{
357
6.09M
    g_return_if_fail(st != NULL);
358
6.09M
    if (st->refcount == 0) {
359
0
        g_critical("FuStructFmapArea refcount already zero");
360
0
        return;
361
0
    }
362
6.09M
    if (--st->refcount > 0)
363
0
        return;
364
6.09M
    if (st->buf != NULL)
365
6.09M
        g_byte_array_unref(st->buf);
366
6.09M
    g_free(st);
367
6.09M
}
368
/**
369
 * fu_struct_fmap_area_new_internal: (skip):
370
 **/
371
static FuStructFmapArea *
372
fu_struct_fmap_area_new_internal(void)
373
6.09M
{
374
6.09M
    FuStructFmapArea *st = g_new0(FuStructFmapArea, 1);
375
6.09M
    st->refcount = 1;
376
6.09M
    return st;
377
6.09M
}
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
64.5k
{
386
64.5k
    g_return_val_if_fail(st != NULL, 0x0);
387
64.5k
    return fu_memread_uint32(st->buf->data + 0, G_LITTLE_ENDIAN);
388
64.5k
}
389
/**
390
 * fu_struct_fmap_area_get_size: (skip):
391
 **/
392
guint32
393
fu_struct_fmap_area_get_size(const FuStructFmapArea *st)
394
6.09M
{
395
6.09M
    g_return_val_if_fail(st != NULL, 0x0);
396
6.09M
    return fu_memread_uint32(st->buf->data + 4, G_LITTLE_ENDIAN);
397
6.09M
}
398
/**
399
 * fu_struct_fmap_area_get_name: (skip):
400
 **/
401
gchar *
402
fu_struct_fmap_area_get_name(const FuStructFmapArea *st)
403
58.3k
{
404
58.3k
    g_return_val_if_fail(st != NULL, NULL);
405
58.3k
    return fu_memstrsafe(st->buf->data, st->buf->len, 8, 32, NULL);
406
58.3k
}
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
199
{
424
199
    g_return_if_fail(st != NULL);
425
199
    fu_memwrite_uint32(st->buf->data + 0, value, G_LITTLE_ENDIAN);
426
199
}
427
/**
428
 * fu_struct_fmap_area_set_size: (skip):
429
 **/
430
void
431
fu_struct_fmap_area_set_size(FuStructFmapArea *st, guint32 value)
432
199
{
433
199
    g_return_if_fail(st != NULL);
434
199
    fu_memwrite_uint32(st->buf->data + 4, value, G_LITTLE_ENDIAN);
435
199
}
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
199
{
442
199
    gsize len;
443
199
    g_return_val_if_fail(st != NULL, FALSE);
444
199
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
445
199
    if (value == NULL) {
446
0
        memset(st->buf->data + 8, 0x0, 32);
447
0
        return TRUE;
448
0
    }
449
199
    len = strlen(value);
450
199
    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
199
    return fu_memcpy_safe(st->buf->data, st->buf->len, 8, (const guint8 *)value, len, 0x0, len, error);
459
199
}
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
199
{
475
199
    FuStructFmapArea *st = fu_struct_fmap_area_new_internal();
476
199
    st->buf = g_byte_array_sized_new(42);
477
199
    fu_byte_array_set_size(st->buf, 42, 0x0);
478
199
    return st;
479
199
}
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_validate_internal(FuStructFmapArea *st, GError **error)
505
6.09M
{
506
6.09M
    g_return_val_if_fail(st != NULL, FALSE);
507
6.09M
    return TRUE;
508
6.09M
}
509
static gboolean
510
fu_struct_fmap_area_parse_internal(FuStructFmapArea *st, GError **error)
511
6.09M
{
512
6.09M
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
513
0
        g_autofree gchar *str = fu_struct_fmap_area_to_string(st);
514
0
        g_debug("%s", str);
515
0
    }
516
6.09M
    if (!fu_struct_fmap_area_validate_internal(st, error))
517
0
        return FALSE;
518
6.09M
    return TRUE;
519
6.09M
}
520
/**
521
 * fu_struct_fmap_area_parse_stream: (skip):
522
 **/
523
FuStructFmapArea *
524
fu_struct_fmap_area_parse_stream(GInputStream *stream, gsize offset, GError **error)
525
6.09M
{
526
6.09M
    g_autoptr(FuStructFmapArea) st = fu_struct_fmap_area_new_internal();
527
6.09M
    st->buf = fu_input_stream_read_byte_array(stream, offset, 42, NULL, error);
528
6.09M
    if (st->buf == NULL) {
529
390
        g_prefix_error(error, "FuStructFmapArea failed read of 0x%x: ", (guint) 42);
530
390
        return NULL;
531
390
    }
532
6.09M
    if (st->buf->len != 42) {
533
1.66k
        g_set_error(error,
534
1.66k
                    FWUPD_ERROR,
535
1.66k
                    FWUPD_ERROR_INVALID_DATA,
536
1.66k
                    "FuStructFmapArea requested 0x%x and got 0x%x",
537
1.66k
                    (guint) 42,
538
1.66k
                    (guint) st->buf->len);
539
1.66k
        return NULL;
540
1.66k
    }
541
6.09M
    if (!fu_struct_fmap_area_parse_internal(st, error))
542
0
        return NULL;
543
6.09M
    return g_steal_pointer(&st);
544
6.09M
}