// Copyright (C) 2019, Linaro Ltd // // SPDX-License-Identifier: Apache-2.0 // // Licensed under the Apache License, Version 2.0 (the "License"); you may // not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // This file is a Binary Template file for the 010 Editor // (http://www.sweetscape.com/010editor/) to allow it to show the // structure of an MCUboot image. LittleEndian(); struct ENTRY { uint32 id; uint32 offset; uint32 size; uint32 pad; }; // The simulator writes the partition table at the beginning of the // image, so that we can tell where the partitions are. If you are // trying to view an image captured from a device, you can either // construct a synthetic partition table in the file, or change code // described below to hardcode one. struct PTABLE { uchar pheader[8]; if (ptable.pheader != "mcuboot\0") { // NOTE: Put code here to hard code a partition table, and // continue. Warning("Invalid magic on ptable header"); return -1; } else { uint32 count; struct ENTRY entries[count]; } }; struct PTABLE ptable; struct IMAGE_VERSION { uchar major; uchar minor; uint16 revision; uint32 build_num; }; struct IHDR { uint32 magic ; uint32 load_addr ; uint16 hdr_size ; uint16 protect_size ; uint32 img_size ; uint32 flags; struct IMAGE_VERSION ver; uint32 _pad1; }; struct TLV_HDR { uint16 magic; uint16 tlv_tot; }; struct TLV { uchar type ; uchar pad; uint16 len; switch (type) { case 0x01: // keyhash uchar keyhash[len]; break; case 0x40: // dependency if (len != 12) { Warning("Invalid dependency size"); return -1; } uchar image_id; uchar pad1; uint16 pad2; struct IMAGE_VERSION version; break; default: // Other, just consume the data. uchar data[len]; } }; local int i; local int epos; for (i = 0; i < ptable.count; i++) { FSeek(ptable.entries[i].offset); switch (ptable.entries[i].id) { case 1: case 2: case 4: case 5: struct IMAGE { struct IHDR ihdr; if (ihdr.magic == 0x96f3b83d) { uchar payload[ihdr.img_size]; epos = FTell(); struct TLV_HDR tlv_hdr; if (tlv_hdr.magic == 0x6907) { epos += tlv_hdr.tlv_tot; while (FTell() < epos) { struct TLV tlv; } } } // uchar block[ptable.entries[i].size]; } image; break; case 3: struct SCRATCH { uchar data[ptable.entries[i].size]; } scratch; break; default: break; } }