1// Copyright (C) 2019, Linaro Ltd 2// 3// SPDX-License-Identifier: Apache-2.0 4// 5// Licensed under the Apache License, Version 2.0 (the "License"); you may 6// not use this file except in compliance with the License. 7// You may obtain a copy of the License at 8// 9// http://www.apache.org/licenses/LICENSE-2.0 10// 11// Unless required by applicable law or agreed to in writing, software 12// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 13// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14// See the License for the specific language governing permissions and 15// limitations under the License. 16 17// This file is a Binary Template file for the 010 Editor 18// (http://www.sweetscape.com/010editor/) to allow it to show the 19// structure of an MCUboot image. 20 21LittleEndian(); 22 23struct ENTRY { 24 uint32 id; 25 uint32 offset; 26 uint32 size; 27 uint32 pad; 28}; 29 30// The simulator writes the partition table at the beginning of the 31// image, so that we can tell where the partitions are. If you are 32// trying to view an image captured from a device, you can either 33// construct a synthetic partition table in the file, or change code 34// described below to hardcode one. 35struct PTABLE { 36 uchar pheader[8]; 37 if (ptable.pheader != "mcuboot\0") { 38 // NOTE: Put code here to hard code a partition table, and 39 // continue. 40 Warning("Invalid magic on ptable header"); 41 return -1; 42 } else { 43 uint32 count; 44 struct ENTRY entries[count]; 45 } 46}; 47 48struct PTABLE ptable; 49 50struct IMAGE_VERSION { 51 uchar major; 52 uchar minor; 53 uint16 revision; 54 uint32 build_num; 55}; 56 57struct IHDR { 58 uint32 magic <format=hex>; 59 uint32 load_addr <format=hex>; 60 uint16 hdr_size <format=hex>; 61 uint16 protect_size <format=hex>; 62 uint32 img_size <format=hex>; 63 uint32 flags; 64 struct IMAGE_VERSION ver; 65 uint32 _pad1; 66}; 67 68struct TLV_HDR { 69 uint16 magic; 70 uint16 tlv_tot; 71}; 72 73struct TLV { 74 uchar type <format=hex>; 75 uchar pad; 76 uint16 len; 77 78 switch (type) { 79 case 0x01: // keyhash 80 uchar keyhash[len]; 81 break; 82 case 0x40: // dependency 83 if (len != 12) { 84 Warning("Invalid dependency size"); 85 return -1; 86 } 87 uchar image_id; 88 uchar pad1; 89 uint16 pad2; 90 struct IMAGE_VERSION version; 91 break; 92 default: 93 // Other, just consume the data. 94 uchar data[len]; 95 } 96}; 97 98local int i; 99local int epos; 100 101for (i = 0; i < ptable.count; i++) { 102 FSeek(ptable.entries[i].offset); 103 switch (ptable.entries[i].id) { 104 case 1: 105 case 2: 106 case 4: 107 case 5: 108 struct IMAGE { 109 struct IHDR ihdr; 110 111 if (ihdr.magic == 0x96f3b83d) { 112 uchar payload[ihdr.img_size]; 113 114 epos = FTell(); 115 struct TLV_HDR tlv_hdr; 116 117 if (tlv_hdr.magic == 0x6907) { 118 epos += tlv_hdr.tlv_tot; 119 while (FTell() < epos) { 120 struct TLV tlv; 121 } 122 } 123 } 124 // uchar block[ptable.entries[i].size]; 125 } image; 126 break; 127 case 3: 128 struct SCRATCH { 129 uchar data[ptable.entries[i].size]; 130 } scratch; 131 break; 132 default: 133 break; 134 } 135} 136