in tools/manifest_visualizer/manifest_visualizor.c [621:756]
int32_t visualize_pfm_fw_version_element (uint8_t *start, const char *prefix, int entry)
{
uint8_t *pointer = start;
struct pfm_firmware_version_element *version = (struct pfm_firmware_version_element*) pointer;
uint8_t *version_str;
size_t version_str_len;
pointer += (sizeof (struct pfm_firmware_version_element) - MANIFEST_MAX_STRING);
printf ("%spfm_firmware_version_element (Entry %d)\n", prefix, entry);
printf ("%s{\n", prefix);
printf ("%s\timg_count: %i\n", prefix, version->img_count);
printf ("%s\trw_count: %i\n", prefix, version->rw_count);
printf ("%s\tversion_length: %i\n", prefix, version->version_length);
printf ("%s\treserved: %i\n", prefix, version->reserved);
printf ("%s\tversion_addr: 0x%x\n", prefix, version->version_addr);
version_str = malloc ((size_t) version->version_length + 1);
if (version_str == NULL) {
printf ("Failed to allocate Version buffer.\n");
return -1;
}
memcpy (version_str, pointer, version->version_length);
version_str[version->version_length] = '\0';
printf ("%s\tVersion: %s\n", prefix, version_str);
free (version_str);
version_str_len = (((size_t) version->version_length + 3) & ~((size_t) 3));
pointer += version_str_len;
printf ("%s\tRW Regions\n", prefix);
printf ("%s\t[\n", prefix);
for (int i = 0; i < version->rw_count; ++i) {
struct pfm_fw_version_element_rw_region *rw =
(struct pfm_fw_version_element_rw_region*) pointer;
pointer += (sizeof (struct pfm_fw_version_element_rw_region) -
sizeof (struct pfm_flash_region));
struct pfm_flash_region *region = (struct pfm_flash_region*) pointer;
pointer += sizeof (struct pfm_flash_region);
printf ("%s\t\tpfm_fw_version_element_rw_region\n", prefix);
printf ("%s\t\t{\n", prefix);
printf ("%s\t\t\tflags: 0x%x\n", prefix, rw->flags);
printf ("%s\t\t\treserved_0: %i\n", prefix, rw->reserved[0]);
printf ("%s\t\t\treserved_1: %i\n", prefix, rw->reserved[1]);
printf ("%s\t\t\treserved_2: %i\n", prefix, rw->reserved[2]);
printf ("%s\t\t\tpfm_flash_region\n", prefix);
printf ("%s\t\t\t{\n", prefix);
printf ("%s\t\t\t\tstart_addr: 0x%x\n", prefix, region->start_addr);
printf ("%s\t\t\t\tend_addr: 0x%x\n", prefix, region->end_addr);
printf ("%s\t\t\t}\n", prefix);
printf ("%s\t\t}\n", prefix);
}
printf ("%s\t]\n", prefix);
printf ("%s\tImages\n", prefix);
printf ("%s\t[\n", prefix);
for (int i = 0; i < version->img_count; ++i) {
struct pfm_fw_version_element_image *img = (struct pfm_fw_version_element_image*) pointer;
int hash_len;
pointer += sizeof (struct pfm_fw_version_element_image);
printf ("%s\t\tpfm_fw_version_element_image\n", prefix);
printf ("%s\t\t{\n", prefix);
printf ("%s\t\t\thash_type: %i\n", prefix, img->hash_type);
printf ("%s\t\t\tregion_count: %i\n", prefix, img->region_count);
printf ("%s\t\t\tflags: 0x%x\n", prefix, img->flags);
printf ("%s\t\t\treserved: %i\n", prefix, img->reserved);
switch (img->hash_type) {
case MANIFEST_HASH_SHA256:
hash_len = SHA256_HASH_LENGTH;
break;
case MANIFEST_HASH_SHA384:
hash_len = SHA384_HASH_LENGTH;
break;
case MANIFEST_HASH_SHA512:
hash_len = SHA512_HASH_LENGTH;
break;
default:
printf ("Unsupported hash type selected: %i\n", img->hash_type);
return -1;
}
printf ("%s\t\t\tHash:\n", prefix);
printf ("%s\t\t\t{", prefix);
for (int j = 0; j < hash_len; ++j, ++pointer) {
if ((j % 32) == 0) {
printf ("%s\n\t\t\t\t", prefix);
}
printf ("%02x", *pointer);
}
printf ("\n");
printf ("%s\t\t\t}\n", prefix);
printf ("%s\t\t\tRegions:\n", prefix);
printf ("%s\t\t\t[\n", prefix);
for (int j = 0; j < img->region_count; ++j) {
uint32_t *address = (uint32_t*) pointer;
pointer += sizeof (uint32_t);
printf ("%s\t\t\t\tRegion %i\n", prefix, j);
printf ("%s\t\t\t\t{\n", prefix);
printf ("%s\t\t\t\t\tImage Start Address: 0x%x\n", prefix, *address);
address = (uint32_t*) pointer;
pointer += sizeof (uint32_t);
printf ("%s\t\t\t\t\tImage End Address: 0x%x\n", prefix, *address);
printf ("%s\t\t\t\t}\n", prefix);
}
printf ("\n");
printf ("%s\t\t\t]\n", prefix);
printf ("%s\t\t}\n", prefix);
}
printf ("%s\t]\n", prefix);
printf ("%s}\n", prefix);
return (pointer - start);
}