blob: d1f44afd5318e3df04e8b7c208d5b8a3a8fed45f [file] [log] [blame]
Julian Halle35efa52022-10-31 16:34:58 +00001/*
2 * Copyright (c) 2022-2023, Arm Limited. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
Julian Halle35efa52022-10-31 16:34:58 +00008#include "img_dir_serializer.h"
9
Gyorgy Szing3c446242023-03-31 01:53:15 +020010#include <assert.h>
11#include <string.h>
12
13#include "fw_directory.h"
14#include "protocols/service/fwu/packed-c/fwu_proto.h"
15#include "service/fwu/fw_store/fw_store.h"
16
17int img_dir_serializer_serialize(const struct fw_directory *fw_dir, const struct fw_store *fw_store,
18 uint8_t *buf, size_t buf_size, size_t *data_len)
Julian Halle35efa52022-10-31 16:34:58 +000019{
20 size_t serialized_len = img_dir_serializer_get_len(fw_dir);
21
22 *data_len = 0;
23
24 if (buf_size < serialized_len)
25 return FWU_STATUS_OUT_OF_BOUNDS;
26
27 struct ts_fwu_image_directory *output = (struct ts_fwu_image_directory *)buf;
28
29 /* Clear the output buffer */
30 memset(buf, 0, serialized_len);
31
32 /* Serialize boot info */
33 const struct boot_info *boot_info = fw_directory_get_boot_info(fw_dir);
34
35 assert(boot_info);
36
37 output->directory_version = 2;
38 output->img_info_offset = offsetof(struct ts_fwu_image_directory, img_info_entry);
39 output->num_images = fw_directory_num_images(fw_dir);
40 output->correct_boot = (boot_info->active_index == boot_info->boot_index);
41 output->img_info_size = sizeof(struct ts_fwu_image_info_entry);
42 output->reserved = 0;
43
44 /* Serialize image info for each image */
45 for (size_t image_index = 0; image_index < output->num_images; image_index++) {
Julian Halle35efa52022-10-31 16:34:58 +000046 const struct image_info *image_info =
47 fw_directory_get_image_info(fw_dir, image_index);
48
49 assert(image_info);
50
51 memcpy(output->img_info_entry[image_index].img_type_uuid,
Gyorgy Szing3c446242023-03-31 01:53:15 +020052 image_info->img_type_uuid.octets, OSF_UUID_OCTET_LEN);
Julian Halle35efa52022-10-31 16:34:58 +000053
Gyorgy Szing3c446242023-03-31 01:53:15 +020054 output->img_info_entry[image_index].client_permissions = image_info->permissions;
55 output->img_info_entry[image_index].img_max_size = image_info->max_size;
Julian Halle35efa52022-10-31 16:34:58 +000056 output->img_info_entry[image_index].lowest_accepted_version =
57 image_info->lowest_accepted_version;
Gyorgy Szing3c446242023-03-31 01:53:15 +020058 output->img_info_entry[image_index].img_version = image_info->active_version;
Julian Halle35efa52022-10-31 16:34:58 +000059 output->img_info_entry[image_index].accepted =
60 (uint32_t)fw_store_is_accepted(fw_store, image_info);
61 }
62
63 *data_len = serialized_len;
64
65 return FWU_STATUS_SUCCESS;
66}
67
Gyorgy Szing3c446242023-03-31 01:53:15 +020068size_t img_dir_serializer_get_len(const struct fw_directory *fw_dir)
Julian Halle35efa52022-10-31 16:34:58 +000069{
Gyorgy Szing3c446242023-03-31 01:53:15 +020070 return offsetof(struct ts_fwu_image_directory, img_info_entry) +
71 sizeof(struct ts_fwu_image_info_entry) * fw_directory_num_images(fw_dir);
Julian Halle35efa52022-10-31 16:34:58 +000072}