Coverage Report

Created: 2025-08-03 06:57

/work/fu-uf2-struct.c
Line
Count
Source (jump to first uncovered line)
1
/* auto-generated, do not modify */
2
#include "config.h"
3
4
#include "fu-uf2-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
/* getters */
14
/**
15
 * fu_struct_uf2_get_magic0: (skip):
16
 **/
17
static guint32
18
fu_struct_uf2_get_magic0(const FuStructUf2 *st)
19
1.30k
{
20
1.30k
    g_return_val_if_fail(st != NULL, 0x0);
21
1.30k
    return fu_memread_uint32(st->data + 0, G_LITTLE_ENDIAN);
22
1.30k
}
23
/**
24
 * fu_struct_uf2_get_magic1: (skip):
25
 **/
26
static guint32
27
fu_struct_uf2_get_magic1(const FuStructUf2 *st)
28
1.20k
{
29
1.20k
    g_return_val_if_fail(st != NULL, 0x0);
30
1.20k
    return fu_memread_uint32(st->data + 4, G_LITTLE_ENDIAN);
31
1.20k
}
32
/**
33
 * fu_struct_uf2_get_flags: (skip):
34
 **/
35
guint32
36
fu_struct_uf2_get_flags(const FuStructUf2 *st)
37
1.00k
{
38
1.00k
    g_return_val_if_fail(st != NULL, 0x0);
39
1.00k
    return fu_memread_uint32(st->data + 8, G_LITTLE_ENDIAN);
40
1.00k
}
41
/**
42
 * fu_struct_uf2_get_target_addr: (skip):
43
 **/
44
guint32
45
fu_struct_uf2_get_target_addr(const FuStructUf2 *st)
46
428
{
47
428
    g_return_val_if_fail(st != NULL, 0x0);
48
428
    return fu_memread_uint32(st->data + 12, G_LITTLE_ENDIAN);
49
428
}
50
/**
51
 * fu_struct_uf2_get_payload_size: (skip):
52
 **/
53
guint32
54
fu_struct_uf2_get_payload_size(const FuStructUf2 *st)
55
1.00k
{
56
1.00k
    g_return_val_if_fail(st != NULL, 0x0);
57
1.00k
    return fu_memread_uint32(st->data + 16, G_LITTLE_ENDIAN);
58
1.00k
}
59
/**
60
 * fu_struct_uf2_get_block_no: (skip):
61
 **/
62
guint32
63
fu_struct_uf2_get_block_no(const FuStructUf2 *st)
64
1.01k
{
65
1.01k
    g_return_val_if_fail(st != NULL, 0x0);
66
1.01k
    return fu_memread_uint32(st->data + 20, G_LITTLE_ENDIAN);
67
1.01k
}
68
/**
69
 * fu_struct_uf2_get_num_blocks: (skip):
70
 **/
71
guint32
72
fu_struct_uf2_get_num_blocks(const FuStructUf2 *st)
73
937
{
74
937
    g_return_val_if_fail(st != NULL, 0x0);
75
937
    return fu_memread_uint32(st->data + 24, G_LITTLE_ENDIAN);
76
937
}
77
/**
78
 * fu_struct_uf2_get_family_id: (skip):
79
 **/
80
guint32
81
fu_struct_uf2_get_family_id(const FuStructUf2 *st)
82
1.03k
{
83
1.03k
    g_return_val_if_fail(st != NULL, 0x0);
84
1.03k
    return fu_memread_uint32(st->data + 28, G_LITTLE_ENDIAN);
85
1.03k
}
86
/**
87
 * fu_struct_uf2_get_data: (skip):
88
 **/
89
const guint8 *
90
fu_struct_uf2_get_data(const FuStructUf2 *st, gsize *bufsz)
91
934
{
92
934
    g_return_val_if_fail(st != NULL, NULL);
93
934
    if (bufsz != NULL)
94
0
        *bufsz = 476;
95
934
    return st->data + 32;
96
934
}
97
/**
98
 * fu_struct_uf2_get_magic_end: (skip):
99
 **/
100
static guint32
101
fu_struct_uf2_get_magic_end(const FuStructUf2 *st)
102
1.19k
{
103
1.19k
    g_return_val_if_fail(st != NULL, 0x0);
104
1.19k
    return fu_memread_uint32(st->data + 508, G_LITTLE_ENDIAN);
105
1.19k
}
106
107
/* setters */
108
/**
109
 * fu_struct_uf2_set_magic0: (skip):
110
 **/
111
static void
112
fu_struct_uf2_set_magic0(FuStructUf2 *st, guint32 value)
113
851
{
114
851
    g_return_if_fail(st != NULL);
115
851
    fu_memwrite_uint32(st->data + 0, value, G_LITTLE_ENDIAN);
116
851
}
117
/**
118
 * fu_struct_uf2_set_magic1: (skip):
119
 **/
120
static void
121
fu_struct_uf2_set_magic1(FuStructUf2 *st, guint32 value)
122
851
{
123
851
    g_return_if_fail(st != NULL);
124
851
    fu_memwrite_uint32(st->data + 4, value, G_LITTLE_ENDIAN);
125
851
}
126
/**
127
 * fu_struct_uf2_set_flags: (skip):
128
 **/
129
void
130
fu_struct_uf2_set_flags(FuStructUf2 *st, guint32 value)
131
851
{
132
851
    g_return_if_fail(st != NULL);
133
851
    fu_memwrite_uint32(st->data + 8, value, G_LITTLE_ENDIAN);
134
851
}
135
/**
136
 * fu_struct_uf2_set_target_addr: (skip):
137
 **/
138
void
139
fu_struct_uf2_set_target_addr(FuStructUf2 *st, guint32 value)
140
851
{
141
851
    g_return_if_fail(st != NULL);
142
851
    fu_memwrite_uint32(st->data + 12, value, G_LITTLE_ENDIAN);
143
851
}
144
/**
145
 * fu_struct_uf2_set_payload_size: (skip):
146
 **/
147
void
148
fu_struct_uf2_set_payload_size(FuStructUf2 *st, guint32 value)
149
851
{
150
851
    g_return_if_fail(st != NULL);
151
851
    fu_memwrite_uint32(st->data + 16, value, G_LITTLE_ENDIAN);
152
851
}
153
/**
154
 * fu_struct_uf2_set_block_no: (skip):
155
 **/
156
void
157
fu_struct_uf2_set_block_no(FuStructUf2 *st, guint32 value)
158
851
{
159
851
    g_return_if_fail(st != NULL);
160
851
    fu_memwrite_uint32(st->data + 20, value, G_LITTLE_ENDIAN);
161
851
}
162
/**
163
 * fu_struct_uf2_set_num_blocks: (skip):
164
 **/
165
void
166
fu_struct_uf2_set_num_blocks(FuStructUf2 *st, guint32 value)
167
851
{
168
851
    g_return_if_fail(st != NULL);
169
851
    fu_memwrite_uint32(st->data + 24, value, G_LITTLE_ENDIAN);
170
851
}
171
/**
172
 * fu_struct_uf2_set_family_id: (skip):
173
 **/
174
void
175
fu_struct_uf2_set_family_id(FuStructUf2 *st, guint32 value)
176
851
{
177
851
    g_return_if_fail(st != NULL);
178
851
    fu_memwrite_uint32(st->data + 28, value, G_LITTLE_ENDIAN);
179
851
}
180
/**
181
 * fu_struct_uf2_set_data: (skip):
182
 **/
183
gboolean
184
fu_struct_uf2_set_data(FuStructUf2 *st, const guint8 *buf, gsize bufsz, GError **error)
185
851
{
186
851
    g_return_val_if_fail(st != NULL, FALSE);
187
851
    g_return_val_if_fail(buf != NULL, FALSE);
188
851
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
189
851
    return fu_memcpy_safe(st->data, st->len, 32, buf, bufsz, 0x0, bufsz, error);
190
851
}
191
/**
192
 * fu_struct_uf2_set_magic_end: (skip):
193
 **/
194
static void
195
fu_struct_uf2_set_magic_end(FuStructUf2 *st, guint32 value)
196
851
{
197
851
    g_return_if_fail(st != NULL);
198
851
    fu_memwrite_uint32(st->data + 508, value, G_LITTLE_ENDIAN);
199
851
}
200
/**
201
 * fu_struct_uf2_new: (skip):
202
 **/
203
FuStructUf2 *
204
fu_struct_uf2_new(void)
205
851
{
206
851
    FuStructUf2 *st = g_byte_array_sized_new(512);
207
851
    fu_byte_array_set_size(st, 512, 0x0);
208
851
    fu_struct_uf2_set_magic0(st, 0x0A324655);
209
851
    fu_struct_uf2_set_magic1(st, 0x9E5D5157);
210
851
    fu_struct_uf2_set_magic_end(st, 0x0AB16F30);
211
851
    return st;
212
851
}
213
/**
214
 * fu_struct_uf2_to_string: (skip):
215
 **/
216
static gchar *
217
fu_struct_uf2_to_string(const FuStructUf2 *st)
218
0
{
219
0
    g_autoptr(GString) str = g_string_new("FuStructUf2:\n");
220
0
    g_return_val_if_fail(st != NULL, NULL);
221
0
    g_string_append_printf(str, "  flags: 0x%x\n",
222
0
                           (guint) fu_struct_uf2_get_flags(st));
223
0
    g_string_append_printf(str, "  target_addr: 0x%x\n",
224
0
                           (guint) fu_struct_uf2_get_target_addr(st));
225
0
    g_string_append_printf(str, "  payload_size: 0x%x\n",
226
0
                           (guint) fu_struct_uf2_get_payload_size(st));
227
0
    g_string_append_printf(str, "  block_no: 0x%x\n",
228
0
                           (guint) fu_struct_uf2_get_block_no(st));
229
0
    g_string_append_printf(str, "  num_blocks: 0x%x\n",
230
0
                           (guint) fu_struct_uf2_get_num_blocks(st));
231
0
    g_string_append_printf(str, "  family_id: 0x%x\n",
232
0
                           (guint) fu_struct_uf2_get_family_id(st));
233
0
    {
234
0
        gsize bufsz = 0;
235
0
        const guint8 *buf = fu_struct_uf2_get_data(st, &bufsz);
236
0
        g_autoptr(GString) tmp = g_string_new(NULL);
237
0
        for (gsize i = 0; i < bufsz; i++)
238
0
            g_string_append_printf(tmp, "%02X", buf[i]);
239
0
        g_string_append_printf(str, "  data: 0x%s\n", tmp->str);
240
0
    }
241
0
    if (str->len > 0)
242
0
        g_string_set_size(str, str->len - 1);
243
0
    return g_string_free(g_steal_pointer(&str), FALSE);
244
0
}
245
static gboolean
246
fu_struct_uf2_validate_internal(FuStructUf2 *st, GError **error)
247
1.23k
{
248
1.23k
    g_return_val_if_fail(st != NULL, FALSE);
249
1.23k
    if (fu_struct_uf2_get_magic0(st) != 0x0A324655) {
250
77
        g_set_error(error,
251
77
                    FWUPD_ERROR,
252
77
                    FWUPD_ERROR_INVALID_DATA,
253
77
                    "constant FuStructUf2.magic0 was not valid, "
254
77
                    "expected 0x%x and got 0x%x",
255
77
                    (guint) 0x0A324655,
256
77
                    (guint) fu_struct_uf2_get_magic0(st));
257
77
        return FALSE;
258
77
    }
259
1.15k
    if (fu_struct_uf2_get_magic1(st) != 0x9E5D5157) {
260
52
        g_set_error(error,
261
52
                    FWUPD_ERROR,
262
52
                    FWUPD_ERROR_INVALID_DATA,
263
52
                    "constant FuStructUf2.magic1 was not valid, "
264
52
                    "expected 0x%x and got 0x%x",
265
52
                    (guint) 0x9E5D5157,
266
52
                    (guint) fu_struct_uf2_get_magic1(st));
267
52
        return FALSE;
268
52
    }
269
1.10k
    if (fu_struct_uf2_get_magic_end(st) != 0x0AB16F30) {
270
93
        g_set_error(error,
271
93
                    FWUPD_ERROR,
272
93
                    FWUPD_ERROR_INVALID_DATA,
273
93
                    "constant FuStructUf2.magic_end was not valid, "
274
93
                    "expected 0x%x and got 0x%x",
275
93
                    (guint) 0x0AB16F30,
276
93
                    (guint) fu_struct_uf2_get_magic_end(st));
277
93
        return FALSE;
278
93
    }
279
1.00k
    return TRUE;
280
1.10k
}
281
static gboolean
282
fu_struct_uf2_parse_internal(FuStructUf2 *st, GError **error)
283
1.23k
{
284
1.23k
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
285
0
        g_autofree gchar *str = fu_struct_uf2_to_string(st);
286
0
        g_debug("%s", str);
287
0
    }
288
1.23k
    if (!fu_struct_uf2_validate_internal(st, error))
289
222
        return FALSE;
290
1.00k
    return TRUE;
291
1.23k
}
292
293
/**
294
 * fu_struct_uf2_parse: (skip):
295
 **/
296
FuStructUf2 *
297
fu_struct_uf2_parse(const guint8 *buf, gsize bufsz, gsize offset, GError **error)
298
1.27k
{
299
1.27k
    g_autoptr(GByteArray) st = g_byte_array_new();
300
1.27k
    g_return_val_if_fail(buf != NULL, NULL);
301
1.27k
    g_return_val_if_fail(error == NULL || *error == NULL, NULL);
302
1.27k
    if (!fu_memchk_read(bufsz, offset, 512, error)) {
303
41
        g_prefix_error(error, "invalid struct FuStructUf2: ");
304
41
        return NULL;
305
41
    }
306
1.23k
    g_byte_array_append(st, buf + offset, 512);
307
1.23k
    if (!fu_struct_uf2_parse_internal(st, error))
308
222
        return NULL;
309
1.00k
    return g_steal_pointer(&st);
310
1.23k
}