Coverage Report

Created: 2025-07-01 07:09

/work/fu-wac-struct.c
Line
Count
Source (jump to first uncovered line)
1
/* auto-generated, do not modify */
2
#include "config.h"
3
4
#include "fu-wac-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
14
const gchar *
15
fu_wac_report_id_to_string(FuWacReportId val)
16
0
{
17
0
    if (val == FU_WAC_REPORT_ID_FW_DESCRIPTOR)
18
0
        return "fw-descriptor";
19
0
    if (val == FU_WAC_REPORT_ID_SWITCH_TO_FLASH_LOADER)
20
0
        return "switch-to-flash-loader";
21
0
    if (val == FU_WAC_REPORT_ID_QUIT_AND_RESET)
22
0
        return "quit-and-reset";
23
0
    if (val == FU_WAC_REPORT_ID_READ_BLOCK_DATA)
24
0
        return "read-block-data";
25
0
    if (val == FU_WAC_REPORT_ID_WRITE_BLOCK)
26
0
        return "write-block";
27
0
    if (val == FU_WAC_REPORT_ID_ERASE_BLOCK)
28
0
        return "erase-block";
29
0
    if (val == FU_WAC_REPORT_ID_SET_READ_ADDRESS)
30
0
        return "set-read-address";
31
0
    if (val == FU_WAC_REPORT_ID_GET_STATUS)
32
0
        return "get-status";
33
0
    if (val == FU_WAC_REPORT_ID_UPDATE_RESET)
34
0
        return "update-reset";
35
0
    if (val == FU_WAC_REPORT_ID_WRITE_WORD)
36
0
        return "write-word";
37
0
    if (val == FU_WAC_REPORT_ID_GET_PARAMETERS)
38
0
        return "get-parameters";
39
0
    if (val == FU_WAC_REPORT_ID_GET_FLASH_DESCRIPTOR)
40
0
        return "get-flash-descriptor";
41
0
    if (val == FU_WAC_REPORT_ID_GET_CHECKSUMS)
42
0
        return "get-checksums";
43
0
    if (val == FU_WAC_REPORT_ID_SET_CHECKSUM_FOR_BLOCK)
44
0
        return "set-checksum-for-block";
45
0
    if (val == FU_WAC_REPORT_ID_CALCULATE_CHECKSUM_FOR_BLOCK)
46
0
        return "calculate-checksum-for-block";
47
0
    if (val == FU_WAC_REPORT_ID_WRITE_CHECKSUM_TABLE)
48
0
        return "write-checksum-table";
49
0
    if (val == FU_WAC_REPORT_ID_GET_CURRENT_FIRMWARE_IDX)
50
0
        return "get-current-firmware-idx";
51
0
    if (val == FU_WAC_REPORT_ID_MODULE)
52
0
        return "module";
53
0
    return NULL;
54
0
}
55
56
const gchar *
57
fu_wac_module_fw_type_to_string(FuWacModuleFwType val)
58
0
{
59
0
    if (val == FU_WAC_MODULE_FW_TYPE_TOUCH)
60
0
        return "touch";
61
0
    if (val == FU_WAC_MODULE_FW_TYPE_BLUETOOTH)
62
0
        return "bluetooth";
63
0
    if (val == FU_WAC_MODULE_FW_TYPE_EMR_CORRECTION)
64
0
        return "emr-correction";
65
0
    if (val == FU_WAC_MODULE_FW_TYPE_BLUETOOTH_HID)
66
0
        return "bluetooth-hid";
67
0
    if (val == FU_WAC_MODULE_FW_TYPE_SCALER)
68
0
        return "scaler";
69
0
    if (val == FU_WAC_MODULE_FW_TYPE_BLUETOOTH_ID6)
70
0
        return "bluetooth-id6";
71
0
    if (val == FU_WAC_MODULE_FW_TYPE_TOUCH_ID7)
72
0
        return "touch-id7";
73
0
    if (val == FU_WAC_MODULE_FW_TYPE_BLUETOOTH_ID9)
74
0
        return "bluetooth-id9";
75
0
    if (val == FU_WAC_MODULE_FW_TYPE_SUB_CPU)
76
0
        return "sub-cpu";
77
0
    if (val == FU_WAC_MODULE_FW_TYPE_MAIN)
78
0
        return "main";
79
0
    return NULL;
80
0
}
81
82
const gchar *
83
fu_wac_module_command_to_string(FuWacModuleCommand val)
84
0
{
85
0
    if (val == FU_WAC_MODULE_COMMAND_START)
86
0
        return "start";
87
0
    if (val == FU_WAC_MODULE_COMMAND_DATA)
88
0
        return "data";
89
0
    if (val == FU_WAC_MODULE_COMMAND_END)
90
0
        return "end";
91
0
    return NULL;
92
0
}
93
94
const gchar *
95
fu_wac_module_status_to_string(FuWacModuleStatus val)
96
0
{
97
0
    if (val == FU_WAC_MODULE_STATUS_OK)
98
0
        return "ok";
99
0
    if (val == FU_WAC_MODULE_STATUS_BUSY)
100
0
        return "busy";
101
0
    if (val == FU_WAC_MODULE_STATUS_ERR_CRC)
102
0
        return "err-crc";
103
0
    if (val == FU_WAC_MODULE_STATUS_ERR_CMD)
104
0
        return "err-cmd";
105
0
    if (val == FU_WAC_MODULE_STATUS_ERR_HW_ACCESS_FAIL)
106
0
        return "err-hw-access-fail";
107
0
    if (val == FU_WAC_MODULE_STATUS_ERR_FLASH_NO_SUPPORT)
108
0
        return "err-flash-no-support";
109
0
    if (val == FU_WAC_MODULE_STATUS_ERR_MODE_WRONG)
110
0
        return "err-mode-wrong";
111
0
    if (val == FU_WAC_MODULE_STATUS_ERR_MPU_NO_SUPPORT)
112
0
        return "err-mpu-no-support";
113
0
    if (val == FU_WAC_MODULE_STATUS_ERR_VERSION_NO_SUPPORT)
114
0
        return "err-version-no-support";
115
0
    if (val == FU_WAC_MODULE_STATUS_ERR_ERASE)
116
0
        return "err-erase";
117
0
    if (val == FU_WAC_MODULE_STATUS_ERR_WRITE)
118
0
        return "err-write";
119
0
    if (val == FU_WAC_MODULE_STATUS_ERR_EXIT)
120
0
        return "err-exit";
121
0
    if (val == FU_WAC_MODULE_STATUS_ERR)
122
0
        return "err";
123
0
    if (val == FU_WAC_MODULE_STATUS_ERR_INVALID_OP)
124
0
        return "err-invalid-op";
125
0
    if (val == FU_WAC_MODULE_STATUS_ERR_WRONG_IMAGE)
126
0
        return "err-wrong-image";
127
0
    return NULL;
128
0
}
129
130
gchar *
131
fu_wac_device_status_to_string(FuWacDeviceStatus val)
132
0
{
133
0
    const gchar *data[6] = {0};
134
0
    guint idx = 0;
135
0
    if (val == FU_WAC_DEVICE_STATUS_UNKNOWN)
136
0
        return g_strdup("unknown");
137
0
    if (val & FU_WAC_DEVICE_STATUS_WRITING)
138
0
        data[idx++] = "writing";
139
0
    if (val & FU_WAC_DEVICE_STATUS_ERASING)
140
0
        data[idx++] = "erasing";
141
0
    if (val & FU_WAC_DEVICE_STATUS_ERROR_WRITE)
142
0
        data[idx++] = "error-write";
143
0
    if (val & FU_WAC_DEVICE_STATUS_ERROR_ERASE)
144
0
        data[idx++] = "error-erase";
145
0
    if (val & FU_WAC_DEVICE_STATUS_WRITE_PROTECTED)
146
0
        data[idx++] = "write-protected";
147
0
    return g_strjoinv(",", (gchar **)data);
148
0
}
149
/* getters */
150
151
/* setters */
152
static gboolean
153
fu_struct_wac_firmware_hdr_validate_internal(FuStructWacFirmwareHdr *st, GError **error)
154
11.0M
{
155
11.0M
    g_return_val_if_fail(st != NULL, FALSE);
156
11.0M
    if (strncmp((const gchar *) (st->data + 0), "WACOM", 5) != 0) {
157
11.0M
        g_set_error_literal(error,
158
11.0M
                            FWUPD_ERROR,
159
11.0M
                            FWUPD_ERROR_INVALID_DATA,
160
11.0M
                            "constant FuStructWacFirmwareHdr.magic was not valid");
161
11.0M
        return FALSE;
162
11.0M
    }
163
2.11k
    return TRUE;
164
11.0M
}
165
/**
166
 * fu_struct_wac_firmware_hdr_validate_stream: (skip):
167
 **/
168
gboolean
169
fu_struct_wac_firmware_hdr_validate_stream(GInputStream *stream, gsize offset, GError **error)
170
11.0M
{
171
11.0M
    g_autoptr(GByteArray) st = NULL;
172
11.0M
    g_return_val_if_fail(G_IS_INPUT_STREAM(stream), FALSE);
173
11.0M
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
174
11.0M
    st = fu_input_stream_read_byte_array(stream, offset, 5, NULL, error);
175
11.0M
    if (st == NULL) {
176
0
        g_prefix_error(error, "FuStructWacFirmwareHdr failed read of 0x%x: ", (guint) 5);
177
0
        return FALSE;
178
0
    }
179
11.0M
    if (st->len != 5) {
180
515
        g_set_error(error,
181
515
                    FWUPD_ERROR,
182
515
                    FWUPD_ERROR_INVALID_DATA,
183
515
                    "FuStructWacFirmwareHdr requested 0x%x and got 0x%x",
184
515
                    (guint) 5,
185
515
                    (guint) st->len);
186
515
        return FALSE;
187
515
    }
188
11.0M
    return fu_struct_wac_firmware_hdr_validate_internal(st, error);
189
11.0M
}
190
/* getters */
191
/**
192
 * fu_struct_wta_block_header_get_block_start: (skip):
193
 **/
194
guint32
195
fu_struct_wta_block_header_get_block_start(const FuStructWtaBlockHeader *st)
196
0
{
197
0
    g_return_val_if_fail(st != NULL, 0x0);
198
0
    return fu_memread_uint32(st->data + 0, G_LITTLE_ENDIAN);
199
0
}
200
/**
201
 * fu_struct_wta_block_header_get_block_size: (skip):
202
 **/
203
guint32
204
fu_struct_wta_block_header_get_block_size(const FuStructWtaBlockHeader *st)
205
0
{
206
0
    g_return_val_if_fail(st != NULL, 0x0);
207
0
    return fu_memread_uint32(st->data + 4, G_LITTLE_ENDIAN);
208
0
}
209
210
/* setters */
211
/**
212
 * fu_struct_wta_block_header_to_string: (skip):
213
 **/
214
static gchar *
215
fu_struct_wta_block_header_to_string(const FuStructWtaBlockHeader *st)
216
0
{
217
0
    g_autoptr(GString) str = g_string_new("FuStructWtaBlockHeader:\n");
218
0
    g_return_val_if_fail(st != NULL, NULL);
219
0
    g_string_append_printf(str, "  block_start: 0x%x\n",
220
0
                           (guint) fu_struct_wta_block_header_get_block_start(st));
221
0
    g_string_append_printf(str, "  block_size: 0x%x\n",
222
0
                           (guint) fu_struct_wta_block_header_get_block_size(st));
223
0
    if (str->len > 0)
224
0
        g_string_set_size(str, str->len - 1);
225
0
    return g_string_free(g_steal_pointer(&str), FALSE);
226
0
}
227
static gboolean
228
fu_struct_wta_block_header_validate_internal(FuStructWtaBlockHeader *st, GError **error)
229
0
{
230
0
    g_return_val_if_fail(st != NULL, FALSE);
231
0
    return TRUE;
232
0
}
233
static gboolean
234
fu_struct_wta_block_header_parse_internal(FuStructWtaBlockHeader *st, GError **error)
235
0
{
236
0
    if (!fu_struct_wta_block_header_validate_internal(st, error))
237
0
        return FALSE;
238
0
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
239
0
        g_autofree gchar *str = fu_struct_wta_block_header_to_string(st);
240
0
        g_debug("%s", str);
241
0
    }
242
0
    return TRUE;
243
0
}
244
245
/**
246
 * fu_struct_wta_block_header_parse: (skip):
247
 **/
248
FuStructWtaBlockHeader *
249
fu_struct_wta_block_header_parse(const guint8 *buf, gsize bufsz, gsize offset, GError **error)
250
0
{
251
0
    g_autoptr(GByteArray) st = g_byte_array_new();
252
0
    g_return_val_if_fail(buf != NULL, NULL);
253
0
    g_return_val_if_fail(error == NULL || *error == NULL, NULL);
254
0
    if (!fu_memchk_read(bufsz, offset, 8, error)) {
255
0
        g_prefix_error(error, "invalid struct FuStructWtaBlockHeader: ");
256
0
        return NULL;
257
0
    }
258
0
    g_byte_array_append(st, buf + offset, 8);
259
0
    if (!fu_struct_wta_block_header_parse_internal(st, error))
260
0
        return NULL;
261
0
    return g_steal_pointer(&st);
262
0
}
263
/* getters */
264
/**
265
 * fu_struct_id9_unknown_cmd_get_unknown1: (skip):
266
 **/
267
static guint16
268
fu_struct_id9_unknown_cmd_get_unknown1(const FuStructId9UnknownCmd *st)
269
0
{
270
0
    g_return_val_if_fail(st != NULL, 0x0);
271
0
    return fu_memread_uint16(st->data + 0, G_BIG_ENDIAN);
272
0
}
273
/**
274
 * fu_struct_id9_unknown_cmd_get_unknown2: (skip):
275
 **/
276
static guint32
277
fu_struct_id9_unknown_cmd_get_unknown2(const FuStructId9UnknownCmd *st)
278
0
{
279
0
    g_return_val_if_fail(st != NULL, 0x0);
280
0
    return fu_memread_uint32(st->data + 2, G_BIG_ENDIAN);
281
0
}
282
283
/* setters */
284
/**
285
 * fu_struct_id9_unknown_cmd_set_unknown1: (skip):
286
 **/
287
static void
288
fu_struct_id9_unknown_cmd_set_unknown1(FuStructId9UnknownCmd *st, guint16 value)
289
0
{
290
0
    g_return_if_fail(st != NULL);
291
0
    fu_memwrite_uint16(st->data + 0, value, G_BIG_ENDIAN);
292
0
}
293
/**
294
 * fu_struct_id9_unknown_cmd_set_unknown2: (skip):
295
 **/
296
static void
297
fu_struct_id9_unknown_cmd_set_unknown2(FuStructId9UnknownCmd *st, guint32 value)
298
0
{
299
0
    g_return_if_fail(st != NULL);
300
0
    fu_memwrite_uint32(st->data + 2, value, G_BIG_ENDIAN);
301
0
}
302
/**
303
 * fu_struct_id9_unknown_cmd_set_size: (skip):
304
 **/
305
void
306
fu_struct_id9_unknown_cmd_set_size(FuStructId9UnknownCmd *st, guint16 value)
307
0
{
308
0
    g_return_if_fail(st != NULL);
309
0
    fu_memwrite_uint16(st->data + 6, value, G_BIG_ENDIAN);
310
0
}
311
/**
312
 * fu_struct_id9_unknown_cmd_new: (skip):
313
 **/
314
FuStructId9UnknownCmd *
315
fu_struct_id9_unknown_cmd_new(void)
316
0
{
317
0
    FuStructId9UnknownCmd *st = g_byte_array_sized_new(8);
318
0
    fu_byte_array_set_size(st, 8, 0x0);
319
0
    fu_struct_id9_unknown_cmd_set_unknown1(st, 0x7050);
320
0
    fu_struct_id9_unknown_cmd_set_unknown2(st, 0);
321
0
    return st;
322
0
}
323
static gboolean
324
fu_struct_id9_unknown_cmd_validate_internal(FuStructId9UnknownCmd *st, GError **error)
325
0
{
326
0
    g_return_val_if_fail(st != NULL, FALSE);
327
0
    if (fu_struct_id9_unknown_cmd_get_unknown1(st) != 0x7050) {
328
0
        g_set_error_literal(error,
329
0
                            FWUPD_ERROR,
330
0
                            FWUPD_ERROR_INVALID_DATA,
331
0
                            "constant FuStructId9UnknownCmd.unknown1 was not valid");
332
0
        return FALSE;
333
0
    }
334
0
    if (fu_struct_id9_unknown_cmd_get_unknown2(st) != 0) {
335
0
        g_set_error_literal(error,
336
0
                            FWUPD_ERROR,
337
0
                            FWUPD_ERROR_INVALID_DATA,
338
0
                            "constant FuStructId9UnknownCmd.unknown2 was not valid");
339
0
        return FALSE;
340
0
    }
341
0
    return TRUE;
342
0
}
343
/* getters */
344
/**
345
 * fu_struct_id9_spi_cmd_get_command: (skip):
346
 **/
347
static guint8
348
fu_struct_id9_spi_cmd_get_command(const FuStructId9SpiCmd *st)
349
0
{
350
0
    g_return_val_if_fail(st != NULL, 0x0);
351
0
    return st->data[0];
352
0
}
353
/**
354
 * fu_struct_id9_spi_cmd_get_start_addr: (skip):
355
 **/
356
static guint32
357
fu_struct_id9_spi_cmd_get_start_addr(const FuStructId9SpiCmd *st)
358
0
{
359
0
    g_return_val_if_fail(st != NULL, 0x0);
360
0
    return fu_memread_uint32(st->data + 1, G_BIG_ENDIAN);
361
0
}
362
363
/* setters */
364
/**
365
 * fu_struct_id9_spi_cmd_set_command: (skip):
366
 **/
367
static void
368
fu_struct_id9_spi_cmd_set_command(FuStructId9SpiCmd *st, guint8 value)
369
0
{
370
0
    g_return_if_fail(st != NULL);
371
0
    st->data[0] = value;
372
0
}
373
/**
374
 * fu_struct_id9_spi_cmd_set_start_addr: (skip):
375
 **/
376
static void
377
fu_struct_id9_spi_cmd_set_start_addr(FuStructId9SpiCmd *st, guint32 value)
378
0
{
379
0
    g_return_if_fail(st != NULL);
380
0
    fu_memwrite_uint32(st->data + 1, value, G_BIG_ENDIAN);
381
0
}
382
/**
383
 * fu_struct_id9_spi_cmd_set_size: (skip):
384
 **/
385
void
386
fu_struct_id9_spi_cmd_set_size(FuStructId9SpiCmd *st, guint16 value)
387
0
{
388
0
    g_return_if_fail(st != NULL);
389
0
    fu_memwrite_uint16(st->data + 5, value, G_BIG_ENDIAN);
390
0
}
391
/**
392
 * fu_struct_id9_spi_cmd_set_data: (skip):
393
 **/
394
gboolean
395
fu_struct_id9_spi_cmd_set_data(FuStructId9SpiCmd *st, const FuStructId9UnknownCmd *st_donor, GError **error)
396
0
{
397
0
    g_return_val_if_fail(st != NULL, FALSE);
398
0
    g_return_val_if_fail(st_donor != NULL, FALSE);
399
0
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
400
401
0
    if (st_donor->len > FU_STRUCT_ID9_UNKNOWN_CMD_SIZE) {
402
0
        g_set_error(error,
403
0
                    FWUPD_ERROR,
404
0
                    FWUPD_ERROR_INVALID_DATA,
405
0
                    "donor 'FuStructId9UnknownCmd' (0x%x bytes) does not fit in "
406
0
                    "FuStructId9SpiCmd.data (0x%x bytes)",
407
0
                    (guint) st_donor->len,
408
0
                    (guint) FU_STRUCT_ID9_UNKNOWN_CMD_SIZE);
409
0
        return FALSE;
410
0
    }
411
0
    memcpy(st->data + FU_STRUCT_ID9_SPI_CMD_OFFSET_DATA, st_donor->data, st_donor->len);
412
0
    return TRUE;
413
0
}
414
/**
415
 * fu_struct_id9_spi_cmd_new: (skip):
416
 **/
417
FuStructId9SpiCmd *
418
fu_struct_id9_spi_cmd_new(void)
419
0
{
420
0
    FuStructId9SpiCmd *st = g_byte_array_sized_new(15);
421
0
    fu_byte_array_set_size(st, 15, 0x0);
422
0
    {
423
0
        g_autoptr(GByteArray) st_donor = fu_struct_id9_unknown_cmd_new();
424
0
        memcpy(st->data + 0x7, st_donor->data, st_donor->len); /* nocheck:blocked */
425
0
    }
426
0
    fu_struct_id9_spi_cmd_set_command(st, 0x91);
427
0
    fu_struct_id9_spi_cmd_set_start_addr(st, 0);
428
0
    return st;
429
0
}
430
static gboolean
431
fu_struct_id9_spi_cmd_validate_internal(FuStructId9SpiCmd *st, GError **error)
432
0
{
433
0
    g_return_val_if_fail(st != NULL, FALSE);
434
0
    if (fu_struct_id9_spi_cmd_get_command(st) != 0x91) {
435
0
        g_set_error_literal(error,
436
0
                            FWUPD_ERROR,
437
0
                            FWUPD_ERROR_INVALID_DATA,
438
0
                            "constant FuStructId9SpiCmd.command was not valid");
439
0
        return FALSE;
440
0
    }
441
0
    if (fu_struct_id9_spi_cmd_get_start_addr(st) != 0) {
442
0
        g_set_error_literal(error,
443
0
                            FWUPD_ERROR,
444
0
                            FWUPD_ERROR_INVALID_DATA,
445
0
                            "constant FuStructId9SpiCmd.start_addr was not valid");
446
0
        return FALSE;
447
0
    }
448
0
    {
449
0
        GByteArray st_tmp = {
450
0
            .data = (guint8*) st->data + 0x7,
451
0
            .len = 8,
452
0
        };
453
0
        if (!fu_struct_id9_unknown_cmd_validate_internal(&st_tmp, error))
454
0
            return FALSE;
455
0
    }
456
0
    return TRUE;
457
0
}
458
/* getters */
459
460
/* setters */
461
/**
462
 * fu_struct_id9_loader_cmd_set_command: (skip):
463
 **/
464
void
465
fu_struct_id9_loader_cmd_set_command(FuStructId9LoaderCmd *st, guint8 value)
466
0
{
467
0
    g_return_if_fail(st != NULL);
468
0
    st->data[0] = value;
469
0
}
470
/**
471
 * fu_struct_id9_loader_cmd_set_size: (skip):
472
 **/
473
void
474
fu_struct_id9_loader_cmd_set_size(FuStructId9LoaderCmd *st, guint16 value)
475
0
{
476
0
    g_return_if_fail(st != NULL);
477
0
    fu_memwrite_uint16(st->data + 1, value, G_BIG_ENDIAN);
478
0
}
479
/**
480
 * fu_struct_id9_loader_cmd_set_crc: (skip):
481
 **/
482
void
483
fu_struct_id9_loader_cmd_set_crc(FuStructId9LoaderCmd *st, guint32 value)
484
0
{
485
0
    g_return_if_fail(st != NULL);
486
0
    fu_memwrite_uint32(st->data + 3, value, G_BIG_ENDIAN);
487
0
}
488
/**
489
 * fu_struct_id9_loader_cmd_set_data: (skip):
490
 **/
491
gboolean
492
fu_struct_id9_loader_cmd_set_data(FuStructId9LoaderCmd *st, const FuStructId9SpiCmd *st_donor, GError **error)
493
0
{
494
0
    g_return_val_if_fail(st != NULL, FALSE);
495
0
    g_return_val_if_fail(st_donor != NULL, FALSE);
496
0
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
497
498
0
    if (st_donor->len > FU_STRUCT_ID9_SPI_CMD_SIZE) {
499
0
        g_set_error(error,
500
0
                    FWUPD_ERROR,
501
0
                    FWUPD_ERROR_INVALID_DATA,
502
0
                    "donor 'FuStructId9SpiCmd' (0x%x bytes) does not fit in "
503
0
                    "FuStructId9LoaderCmd.data (0x%x bytes)",
504
0
                    (guint) st_donor->len,
505
0
                    (guint) FU_STRUCT_ID9_SPI_CMD_SIZE);
506
0
        return FALSE;
507
0
    }
508
0
    memcpy(st->data + FU_STRUCT_ID9_LOADER_CMD_OFFSET_DATA, st_donor->data, st_donor->len);
509
0
    return TRUE;
510
0
}
511
/**
512
 * fu_struct_id9_loader_cmd_new: (skip):
513
 **/
514
FuStructId9LoaderCmd *
515
fu_struct_id9_loader_cmd_new(void)
516
0
{
517
0
    FuStructId9LoaderCmd *st = g_byte_array_sized_new(22);
518
0
    fu_byte_array_set_size(st, 22, 0x0);
519
0
    {
520
0
        g_autoptr(GByteArray) st_donor = fu_struct_id9_spi_cmd_new();
521
0
        memcpy(st->data + 0x7, st_donor->data, st_donor->len); /* nocheck:blocked */
522
0
    }
523
0
    return st;
524
0
}
525
static gboolean
526
fu_struct_id9_loader_cmd_validate_internal(FuStructId9LoaderCmd *st, GError **error)
527
0
{
528
0
    g_return_val_if_fail(st != NULL, FALSE);
529
0
    {
530
0
        GByteArray st_tmp = {
531
0
            .data = (guint8*) st->data + 0x7,
532
0
            .len = 15,
533
0
        };
534
0
        if (!fu_struct_id9_spi_cmd_validate_internal(&st_tmp, error))
535
0
            return FALSE;
536
0
    }
537
0
    return TRUE;
538
0
}
539
/**
540
 * fu_struct_id9_loader_cmd_validate: (skip):
541
 **/
542
gboolean
543
fu_struct_id9_loader_cmd_validate(const guint8 *buf, gsize bufsz, gsize offset, GError **error)
544
0
{
545
0
    GByteArray st = {.data = (guint8 *) buf + offset, .len = bufsz - offset, };
546
0
    g_return_val_if_fail(buf != NULL, FALSE);
547
0
    g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
548
0
    if (!fu_memchk_read(bufsz, offset, 22, error)) {
549
0
        g_prefix_error(error, "invalid struct FuStructId9LoaderCmd: ");
550
0
        return FALSE;
551
0
    }
552
0
    if (!fu_struct_id9_loader_cmd_validate_internal(&st, error))
553
0
        return FALSE;
554
0
    return TRUE;
555
0
}
556
/* getters */
557
/**
558
 * fu_struct_module_desc_get_bootloader_version: (skip):
559
 **/
560
guint16
561
fu_struct_module_desc_get_bootloader_version(const FuStructModuleDesc *st)
562
0
{
563
0
    g_return_val_if_fail(st != NULL, 0x0);
564
0
    return fu_memread_uint16(st->data + 1, G_BIG_ENDIAN);
565
0
}
566
/**
567
 * fu_struct_module_desc_get_number_modules: (skip):
568
 **/
569
guint8
570
fu_struct_module_desc_get_number_modules(const FuStructModuleDesc *st)
571
0
{
572
0
    g_return_val_if_fail(st != NULL, 0x0);
573
0
    return st->data[3];
574
0
}
575
576
/* setters */
577
/**
578
 * fu_struct_module_desc_to_string: (skip):
579
 **/
580
static gchar *
581
fu_struct_module_desc_to_string(const FuStructModuleDesc *st)
582
0
{
583
0
    g_autoptr(GString) str = g_string_new("FuStructModuleDesc:\n");
584
0
    g_return_val_if_fail(st != NULL, NULL);
585
0
    g_string_append_printf(str, "  bootloader_version: 0x%x\n",
586
0
                           (guint) fu_struct_module_desc_get_bootloader_version(st));
587
0
    g_string_append_printf(str, "  number_modules: 0x%x\n",
588
0
                           (guint) fu_struct_module_desc_get_number_modules(st));
589
0
    if (str->len > 0)
590
0
        g_string_set_size(str, str->len - 1);
591
0
    return g_string_free(g_steal_pointer(&str), FALSE);
592
0
}
593
static gboolean
594
fu_struct_module_desc_validate_internal(FuStructModuleDesc *st, GError **error)
595
0
{
596
0
    g_return_val_if_fail(st != NULL, FALSE);
597
0
    return TRUE;
598
0
}
599
static gboolean
600
fu_struct_module_desc_parse_internal(FuStructModuleDesc *st, GError **error)
601
0
{
602
0
    if (!fu_struct_module_desc_validate_internal(st, error))
603
0
        return FALSE;
604
0
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
605
0
        g_autofree gchar *str = fu_struct_module_desc_to_string(st);
606
0
        g_debug("%s", str);
607
0
    }
608
0
    return TRUE;
609
0
}
610
611
/**
612
 * fu_struct_module_desc_parse: (skip):
613
 **/
614
FuStructModuleDesc *
615
fu_struct_module_desc_parse(const guint8 *buf, gsize bufsz, gsize offset, GError **error)
616
0
{
617
0
    g_autoptr(GByteArray) st = g_byte_array_new();
618
0
    g_return_val_if_fail(buf != NULL, NULL);
619
0
    g_return_val_if_fail(error == NULL || *error == NULL, NULL);
620
0
    if (!fu_memchk_read(bufsz, offset, 4, error)) {
621
0
        g_prefix_error(error, "invalid struct FuStructModuleDesc: ");
622
0
        return NULL;
623
0
    }
624
0
    g_byte_array_append(st, buf + offset, 4);
625
0
    if (!fu_struct_module_desc_parse_internal(st, error))
626
0
        return NULL;
627
0
    return g_steal_pointer(&st);
628
0
}
629
/* getters */
630
/**
631
 * fu_struct_module_item_get_kind: (skip):
632
 **/
633
FuWacModuleFwType
634
fu_struct_module_item_get_kind(const FuStructModuleItem *st)
635
0
{
636
0
    g_return_val_if_fail(st != NULL, 0x0);
637
0
    return st->data[0];
638
0
}
639
/**
640
 * fu_struct_module_item_get_version: (skip):
641
 **/
642
guint16
643
fu_struct_module_item_get_version(const FuStructModuleItem *st)
644
0
{
645
0
    g_return_val_if_fail(st != NULL, 0x0);
646
0
    return fu_memread_uint16(st->data + 1, G_BIG_ENDIAN);
647
0
}
648
/**
649
 * fu_struct_module_item_get_version2: (skip):
650
 **/
651
guint8
652
fu_struct_module_item_get_version2(const FuStructModuleItem *st)
653
0
{
654
0
    g_return_val_if_fail(st != NULL, 0x0);
655
0
    return st->data[3];
656
0
}
657
658
/* setters */
659
/**
660
 * fu_struct_module_item_to_string: (skip):
661
 **/
662
static gchar *
663
fu_struct_module_item_to_string(const FuStructModuleItem *st)
664
0
{
665
0
    g_autoptr(GString) str = g_string_new("FuStructModuleItem:\n");
666
0
    g_return_val_if_fail(st != NULL, NULL);
667
0
    {
668
0
        const gchar *tmp = fu_wac_module_fw_type_to_string(fu_struct_module_item_get_kind(st));
669
0
        if (tmp != NULL) {
670
0
            g_string_append_printf(str, "  kind: 0x%x [%s]\n", (guint) fu_struct_module_item_get_kind(st), tmp);
671
0
        } else {
672
0
            g_string_append_printf(str, "  kind: 0x%x\n", (guint) fu_struct_module_item_get_kind(st));
673
0
        }
674
0
    }
675
0
    g_string_append_printf(str, "  version: 0x%x\n",
676
0
                           (guint) fu_struct_module_item_get_version(st));
677
0
    g_string_append_printf(str, "  version2: 0x%x\n",
678
0
                           (guint) fu_struct_module_item_get_version2(st));
679
0
    if (str->len > 0)
680
0
        g_string_set_size(str, str->len - 1);
681
0
    return g_string_free(g_steal_pointer(&str), FALSE);
682
0
}
683
static gboolean
684
fu_struct_module_item_validate_internal(FuStructModuleItem *st, GError **error)
685
0
{
686
0
    g_return_val_if_fail(st != NULL, FALSE);
687
0
    return TRUE;
688
0
}
689
static gboolean
690
fu_struct_module_item_parse_internal(FuStructModuleItem *st, GError **error)
691
0
{
692
0
    if (!fu_struct_module_item_validate_internal(st, error))
693
0
        return FALSE;
694
0
    if (g_getenv("FWUPD_VERBOSE") != NULL) {
695
0
        g_autofree gchar *str = fu_struct_module_item_to_string(st);
696
0
        g_debug("%s", str);
697
0
    }
698
0
    return TRUE;
699
0
}
700
701
/**
702
 * fu_struct_module_item_parse: (skip):
703
 **/
704
FuStructModuleItem *
705
fu_struct_module_item_parse(const guint8 *buf, gsize bufsz, gsize offset, GError **error)
706
0
{
707
0
    g_autoptr(GByteArray) st = g_byte_array_new();
708
0
    g_return_val_if_fail(buf != NULL, NULL);
709
0
    g_return_val_if_fail(error == NULL || *error == NULL, NULL);
710
0
    if (!fu_memchk_read(bufsz, offset, 4, error)) {
711
0
        g_prefix_error(error, "invalid struct FuStructModuleItem: ");
712
0
        return NULL;
713
0
    }
714
0
    g_byte_array_append(st, buf + offset, 4);
715
0
    if (!fu_struct_module_item_parse_internal(st, error))
716
0
        return NULL;
717
0
    return g_steal_pointer(&st);
718
0
}