Coverage Report

Created: 2025-07-01 07:09

/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.46k
{
20
1.46k
    g_return_val_if_fail(st != NULL, 0x0);
21
1.46k
    return fu_memread_uint32(st->data + 0, G_LITTLE_ENDIAN);
22
1.46k
}
23
/**
24
 * fu_struct_uf2_get_magic1: (skip):
25
 **/
26
static guint32
27
fu_struct_uf2_get_magic1(const FuStructUf2 *st)
28
1.36k
{
29
1.36k
    g_return_val_if_fail(st != NULL, 0x0);
30
1.36k
    return fu_memread_uint32(st->data + 4, G_LITTLE_ENDIAN);
31
1.36k
}
32
/**
33
 * fu_struct_uf2_get_flags: (skip):
34
 **/
35
guint32
36
fu_struct_uf2_get_flags(const FuStructUf2 *st)
37
1.21k
{
38
1.21k
    g_return_val_if_fail(st != NULL, 0x0);
39
1.21k
    return fu_memread_uint32(st->data + 8, G_LITTLE_ENDIAN);
40
1.21k
}
41
/**
42
 * fu_struct_uf2_get_target_addr: (skip):
43
 **/
44
guint32
45
fu_struct_uf2_get_target_addr(const FuStructUf2 *st)
46
534
{
47
534
    g_return_val_if_fail(st != NULL, 0x0);
48
534
    return fu_memread_uint32(st->data + 12, G_LITTLE_ENDIAN);
49
534
}
50
/**
51
 * fu_struct_uf2_get_payload_size: (skip):
52
 **/
53
guint32
54
fu_struct_uf2_get_payload_size(const FuStructUf2 *st)
55
1.21k
{
56
1.21k
    g_return_val_if_fail(st != NULL, 0x0);
57
1.21k
    return fu_memread_uint32(st->data + 16, G_LITTLE_ENDIAN);
58
1.21k
}
59
/**
60
 * fu_struct_uf2_get_block_no: (skip):
61
 **/
62
guint32
63
fu_struct_uf2_get_block_no(const FuStructUf2 *st)
64
1.24k
{
65
1.24k
    g_return_val_if_fail(st != NULL, 0x0);
66
1.24k
    return fu_memread_uint32(st->data + 20, G_LITTLE_ENDIAN);
67
1.24k
}
68
/**
69
 * fu_struct_uf2_get_num_blocks: (skip):
70
 **/
71
guint32
72
fu_struct_uf2_get_num_blocks(const FuStructUf2 *st)
73
1.11k
{
74
1.11k
    g_return_val_if_fail(st != NULL, 0x0);
75
1.11k
    return fu_memread_uint32(st->data + 24, G_LITTLE_ENDIAN);
76
1.11k
}
77
/**
78
 * fu_struct_uf2_get_family_id: (skip):
79
 **/
80
guint32
81
fu_struct_uf2_get_family_id(const FuStructUf2 *st)
82
1.08k
{
83
1.08k
    g_return_val_if_fail(st != NULL, 0x0);
84
1.08k
    return fu_memread_uint32(st->data + 28, G_LITTLE_ENDIAN);
85
1.08k
}
86
/**
87
 * fu_struct_uf2_get_data: (skip):
88
 **/
89
const guint8 *
90
fu_struct_uf2_get_data(const FuStructUf2 *st, gsize *bufsz)
91
1.11k
{
92
1.11k
    g_return_val_if_fail(st != NULL, NULL);
93
1.11k
    if (bufsz != NULL)
94
0
        *bufsz = 476;
95
1.11k
    return st->data + 32;
96
1.11k
}
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.31k
{
103
1.31k
    g_return_val_if_fail(st != NULL, 0x0);
104
1.31k
    return fu_memread_uint32(st->data + 508, G_LITTLE_ENDIAN);
105
1.31k
}
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
864
{
114
864
    g_return_if_fail(st != NULL);
115
864
    fu_memwrite_uint32(st->data + 0, value, G_LITTLE_ENDIAN);
116
864
}
117
/**
118
 * fu_struct_uf2_set_magic1: (skip):
119
 **/
120
static void
121
fu_struct_uf2_set_magic1(FuStructUf2 *st, guint32 value)
122
864
{
123
864
    g_return_if_fail(st != NULL);
124
864
    fu_memwrite_uint32(st->data + 4, value, G_LITTLE_ENDIAN);
125
864
}
126
/**
127
 * fu_struct_uf2_set_flags: (skip):
128
 **/
129
void
130
fu_struct_uf2_set_flags(FuStructUf2 *st, guint32 value)
131
864
{
132
864
    g_return_if_fail(st != NULL);
133
864
    fu_memwrite_uint32(st->data + 8, value, G_LITTLE_ENDIAN);
134
864
}
135
/**
136
 * fu_struct_uf2_set_target_addr: (skip):
137
 **/
138
void
139
fu_struct_uf2_set_target_addr(FuStructUf2 *st, guint32 value)
140
864
{
141
864
    g_return_if_fail(st != NULL);
142
864
    fu_memwrite_uint32(st->data + 12, value, G_LITTLE_ENDIAN);
143
864
}
144
/**
145
 * fu_struct_uf2_set_payload_size: (skip):
146
 **/
147
void
148
fu_struct_uf2_set_payload_size(FuStructUf2 *st, guint32 value)
149
864
{
150
864
    g_return_if_fail(st != NULL);
151
864
    fu_memwrite_uint32(st->data + 16, value, G_LITTLE_ENDIAN);
152
864
}
153
/**
154
 * fu_struct_uf2_set_block_no: (skip):
155
 **/
156
void
157
fu_struct_uf2_set_block_no(FuStructUf2 *st, guint32 value)
158
864
{
159
864
    g_return_if_fail(st != NULL);
160
864
    fu_memwrite_uint32(st->data + 20, value, G_LITTLE_ENDIAN);
161
864
}
162
/**
163
 * fu_struct_uf2_set_num_blocks: (skip):
164
 **/
165
void
166
fu_struct_uf2_set_num_blocks(FuStructUf2 *st, guint32 value)
167
864
{
168
864
    g_return_if_fail(st != NULL);
169
864
    fu_memwrite_uint32(st->data + 24, value, G_LITTLE_ENDIAN);
170
864
}
171
/**
172
 * fu_struct_uf2_set_family_id: (skip):
173
 **/
174
void
175
fu_struct_uf2_set_family_id(FuStructUf2 *st, guint32 value)
176
864
{
177
864
    g_return_if_fail(st != NULL);
178
864
    fu_memwrite_uint32(st->data + 28, value, G_LITTLE_ENDIAN);
179
864
}
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
864
{
186
864
    g_return_val_if_fail(st != NULL, FALSE);
187
864
    g_return_val_if_fail(buf != NULL, FALSE);
188
864
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
189
864
    return fu_memcpy_safe(st->data, st->len, 32, buf, bufsz, 0x0, bufsz, error);
190
864
}
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
864
{
197
864
    g_return_if_fail(st != NULL);
198
864
    fu_memwrite_uint32(st->data + 508, value, G_LITTLE_ENDIAN);
199
864
}
200
/**
201
 * fu_struct_uf2_new: (skip):
202
 **/
203
FuStructUf2 *
204
fu_struct_uf2_new(void)
205
864
{
206
864
    FuStructUf2 *st = g_byte_array_sized_new(512);
207
864
    fu_byte_array_set_size(st, 512, 0x0);
208
864
    fu_struct_uf2_set_magic0(st, 0x0A324655);
209
864
    fu_struct_uf2_set_magic1(st, 0x9E5D5157);
210
864
    fu_struct_uf2_set_magic_end(st, 0x0AB16F30);
211
864
    return st;
212
864
}
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.46k
{
248
1.46k
    g_return_val_if_fail(st != NULL, FALSE);
249
1.46k
    if (fu_struct_uf2_get_magic0(st) != 0x0A324655) {
250
96
        g_set_error_literal(error,
251
96
                            FWUPD_ERROR,
252
96
                            FWUPD_ERROR_INVALID_DATA,
253
96
                            "constant FuStructUf2.magic0 was not valid");
254
96
        return FALSE;
255
96
    }
256
1.36k
    if (fu_struct_uf2_get_magic1(st) != 0x9E5D5157) {
257
59
        g_set_error_literal(error,
258
59
                            FWUPD_ERROR,
259
59
                            FWUPD_ERROR_INVALID_DATA,
260
59
                            "constant FuStructUf2.magic1 was not valid");
261
59
        return FALSE;
262
59
    }
263
1.31k
    if (fu_struct_uf2_get_magic_end(st) != 0x0AB16F30) {
264
93
        g_set_error_literal(error,
265
93
                            FWUPD_ERROR,
266
93
                            FWUPD_ERROR_INVALID_DATA,
267
93
                            "constant FuStructUf2.magic_end was not valid");
268
93
        return FALSE;
269
93
    }
270
1.21k
    return TRUE;
271
1.31k
}
272
static gboolean
273
fu_struct_uf2_parse_internal(FuStructUf2 *st, GError **error)
274
1.46k
{
275
1.46k
    if (!fu_struct_uf2_validate_internal(st, error))
276
248
        return FALSE;
277
1.21k
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
278
0
        g_autofree gchar *str = fu_struct_uf2_to_string(st);
279
0
        g_debug("%s", str);
280
0
    }
281
1.21k
    return TRUE;
282
1.46k
}
283
284
/**
285
 * fu_struct_uf2_parse: (skip):
286
 **/
287
FuStructUf2 *
288
fu_struct_uf2_parse(const guint8 *buf, gsize bufsz, gsize offset, GError **error)
289
1.51k
{
290
1.51k
    g_autoptr(GByteArray) st = g_byte_array_new();
291
1.51k
    g_return_val_if_fail(buf != NULL, NULL);
292
1.51k
    g_return_val_if_fail(error == NULL || *error == NULL, NULL);
293
1.51k
    if (!fu_memchk_read(bufsz, offset, 512, error)) {
294
47
        g_prefix_error(error, "invalid struct FuStructUf2: ");
295
47
        return NULL;
296
47
    }
297
1.46k
    g_byte_array_append(st, buf + offset, 512);
298
1.46k
    if (!fu_struct_uf2_parse_internal(st, error))
299
248
        return NULL;
300
1.21k
    return g_steal_pointer(&st);
301
1.46k
}