blob: db210bc87cdb0519320ed1374963a11ffd1db5d9 [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
8#include <assert.h>
9#include <string.h>
10#include <protocols/service/fwu/packed-c/fwu_proto.h>
11#include <service/fwu/fw_store/fw_store.h>
12#include "fw_directory.h"
13#include "img_dir_serializer.h"
14
15int img_dir_serializer_serialize(
16 const struct fw_directory *fw_dir,
17 const struct fw_store *fw_store,
18 uint8_t *buf,
19 size_t buf_size,
20 size_t *data_len)
21{
22 size_t serialized_len = img_dir_serializer_get_len(fw_dir);
23
24 *data_len = 0;
25
26 if (buf_size < serialized_len)
27 return FWU_STATUS_OUT_OF_BOUNDS;
28
29 struct ts_fwu_image_directory *output = (struct ts_fwu_image_directory *)buf;
30
31 /* Clear the output buffer */
32 memset(buf, 0, serialized_len);
33
34 /* Serialize boot info */
35 const struct boot_info *boot_info = fw_directory_get_boot_info(fw_dir);
36
37 assert(boot_info);
38
39 output->directory_version = 2;
40 output->img_info_offset = offsetof(struct ts_fwu_image_directory, img_info_entry);
41 output->num_images = fw_directory_num_images(fw_dir);
42 output->correct_boot = (boot_info->active_index == boot_info->boot_index);
43 output->img_info_size = sizeof(struct ts_fwu_image_info_entry);
44 output->reserved = 0;
45
46 /* Serialize image info for each image */
47 for (size_t image_index = 0; image_index < output->num_images; image_index++) {
48
49 const struct image_info *image_info =
50 fw_directory_get_image_info(fw_dir, image_index);
51
52 assert(image_info);
53
54 memcpy(output->img_info_entry[image_index].img_type_uuid,
55 image_info->img_type_uuid.octets,
56 OSF_UUID_OCTET_LEN);
57
58 output->img_info_entry[image_index].client_permissions =
59 image_info->permissions;
60 output->img_info_entry[image_index].img_max_size =
61 image_info->max_size;
62 output->img_info_entry[image_index].lowest_accepted_version =
63 image_info->lowest_accepted_version;
64 output->img_info_entry[image_index].img_version =
65 image_info->active_version;
66 output->img_info_entry[image_index].accepted =
67 (uint32_t)fw_store_is_accepted(fw_store, image_info);
68 }
69
70 *data_len = serialized_len;
71
72 return FWU_STATUS_SUCCESS;
73}
74
75size_t img_dir_serializer_get_len(
76 const struct fw_directory *fw_dir)
77{
78 return
79 offsetof(struct ts_fwu_image_directory, img_info_entry) +
80 sizeof(struct ts_fwu_image_info_entry) * fw_directory_num_images(fw_dir);
81}