diff options
Diffstat (limited to 'chip/ish/util/pack_ec.py')
-rwxr-xr-x | chip/ish/util/pack_ec.py | 70 |
1 files changed, 59 insertions, 11 deletions
diff --git a/chip/ish/util/pack_ec.py b/chip/ish/util/pack_ec.py index 7cb659d86b..71a63dd42f 100755 --- a/chip/ish/util/pack_ec.py +++ b/chip/ish/util/pack_ec.py @@ -1,4 +1,5 @@ -#!/usr/bin/env python +#!/usr/bin/env python2 +# -*- coding: utf-8 -*-" # Copyright 2019 The Chromium OS Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be @@ -9,6 +10,14 @@ # https://chrome-internal.googlesource.com/chromeos/intel-ish/+/refs/heads/upstream/master/modules/api/ish_api/include/loader_common.h#211, # and b/124788278#comment10 +"""Script to pack EC binary with manifest header. + +Package ecos main FW binary (kernel) and AON task binary into final EC binary +image with a manifest header, ISH shim loader will parse this header and load +each binaries into right memory location. +""" + +from __future__ import print_function import argparse import struct @@ -18,12 +27,22 @@ PAGE_SIZE = 0x1000 def parseargs(): parser = argparse.ArgumentParser() - parser.add_argument("-i", "--input", - help="EC binary to pack, usually ec.bin or ec.RO.flat.") + parser.add_argument("-k", "--kernel", + help="EC kernel binary to pack, \ + usually ec.RW.bin or ec.RW.flat.", + required=True) + parser.add_argument("--kernel-size", type=int, + help="Size of EC kernel image", + required=True) + parser.add_argument("-a", "--aon", + help="EC aontask binary to pack, \ + usually ish_aontask.bin.", + required=False) + parser.add_argument("--aon-size", type=int, + help="Size of EC aontask image", + required=False) parser.add_argument("-o", "--output", help="Output flash binary file") - parser.add_argument("--image_size", type=int, - help="Size of a single image") return parser.parse_args() @@ -38,24 +57,53 @@ def gen_manifest(ext_id, comp_app_name, code_offset, module_size): # 4 bytes of code offset (little endian) struct.pack_into('<I', m, 96, code_offset) # 2 bytes of module in page size increments (little endian) - struct.pack_into('<H', m, 100, module_size / PAGE_SIZE) + struct.pack_into('<H', m, 100, module_size) return m +def roundup_page(size): + """Returns roundup-ed page size from size of bytes""" + return int(size / PAGE_SIZE) + (size % PAGE_SIZE > 0) + def main(): args = parseargs() + print(" Packing EC image file for ISH") with open(args.output, 'wb') as f: + print(" kernel binary size: %i" % args.kernel_size) + kern_rdup_pg_size = roundup_page(args.kernel_size) # Add manifest for main ISH binary - f.write(gen_manifest('ISHM', 'ISH_KERN', HEADER_SIZE, args.image_size)) + f.write(gen_manifest('ISHM', 'ISH_KERN', HEADER_SIZE, kern_rdup_pg_size)) + + if args.aon is not None: + print(" AON binary size: %i" % args.aon_size) + aon_rdup_pg_size = roundup_page(args.aon_size) + # Add manifest for aontask binary + f.write(gen_manifest('ISHM', 'AON_TASK', + (HEADER_SIZE + kern_rdup_pg_size * PAGE_SIZE - + MANIFEST_ENTRY_SIZE), aon_rdup_pg_size)) + # Add manifest that signals end of manifests f.write(gen_manifest('ISHE', '', 0, 0)) + # Pad the remaining HEADER with 0s - f.write('\x00' * (HEADER_SIZE - (MANIFEST_ENTRY_SIZE * 2))) + if args.aon is not None: + f.write('\x00' * (HEADER_SIZE - (MANIFEST_ENTRY_SIZE * 3))) + else: + f.write('\x00' * (HEADER_SIZE - (MANIFEST_ENTRY_SIZE * 2))) - # Append original image - with open(args.input, 'rb') as in_file: + # Append original kernel image + with open(args.kernel, 'rb') as in_file: f.write(in_file.read()) + # Filling padings due to size round up as pages + f.write('\x00' * (kern_rdup_pg_size * PAGE_SIZE - args.kernel_size)) + + if args.aon is not None: + # Append original aon image + with open(args.aon, 'rb') as in_file: + f.write(in_file.read()) + # Filling padings due to size round up as pages + f.write('\x00' * (aon_rdup_pg_size * PAGE_SIZE - args.aon_size)) if __name__ == '__main__': - main()
\ No newline at end of file + main() |