1 /*
2  * Copyright (c) 2023, Arm Limited and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #include "cmd_print_image_dir.h"
8 
9 #include <cstdint>
10 #include <cstdio>
11 #include <cstdlib>
12 #include <vector>
13 
14 #include "common/uuid/uuid.h"
15 #include "print_uuid.h"
16 #include "protocols/service/fwu/fwu_proto.h"
17 
cmd_print_image_dir(fwu_app & app)18 void cmd_print_image_dir(fwu_app &app)
19 {
20 	std::vector<uint8_t> fetched_object;
21 	struct uuid_octets object_uuid;
22 
23 	uuid_guid_octets_from_canonical(&object_uuid, FWU_DIRECTORY_CANONICAL_UUID);
24 
25 	int status = app.read_object(object_uuid, fetched_object);
26 
27 	if (status) {
28 		printf("Error: failed to read image directory\n");
29 		return;
30 	}
31 
32 	if (fetched_object.size() < offsetof(fwu_image_directory, img_info_entry)) {
33 		printf("Error: invalid image directory size\n");
34 		return;
35 	}
36 
37 	const struct fwu_image_directory *img_dir =
38 		(const struct fwu_image_directory *)fetched_object.data();
39 
40 	printf("\nimage_directory (size %zu bytes) :\n", fetched_object.size());
41 	printf("\tdirectory_version : %d\n", img_dir->directory_version);
42 	printf("\tnum_images : %d\n", img_dir->num_images);
43 	printf("\tcorrect_boot : %d\n", img_dir->correct_boot);
44 
45 	for (unsigned int i = 0; i < img_dir->num_images; i++) {
46 		printf("\timg_info_entry[%u]:\n", i);
47 		printf("\t\timg_type_uuid : %s\n",
48 		       print_uuid(img_dir->img_info_entry[i].img_type_uuid).c_str());
49 		printf("\t\tclient_permissions : 0x%x\n",
50 		       img_dir->img_info_entry[i].client_permissions);
51 		printf("\t\timg_max_size : %d\n", img_dir->img_info_entry[i].img_max_size);
52 		printf("\t\tlowest_accepted_version : %d\n",
53 		       img_dir->img_info_entry[i].lowest_accepted_version);
54 		printf("\t\timg_version : %d\n", img_dir->img_info_entry[i].img_version);
55 		printf("\t\taccepted : %d\n", img_dir->img_info_entry[i].accepted);
56 	}
57 }
58