Coverage Report

Created: 2026-04-28 06:49

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