summaryrefslogtreecommitdiff
path: root/util/ipqheader
diff options
context:
space:
mode:
Diffstat (limited to 'util/ipqheader')
-rwxr-xr-xutil/ipqheader/ipqheader.py130
1 files changed, 130 insertions, 0 deletions
diff --git a/util/ipqheader/ipqheader.py b/util/ipqheader/ipqheader.py
new file mode 100755
index 0000000000..eb1a316ae3
--- /dev/null
+++ b/util/ipqheader/ipqheader.py
@@ -0,0 +1,130 @@
+#!/usr/bin/python
+#
+# Copyright (c) 2013 The Linux Foundation. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright notice,
+# this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright notice,
+# this list of conditions and the following disclaimer in the documentation
+# and/or other materials provided with the distribution.
+#
+# 3. Neither the name of the copyright holder nor the names of its
+# contributors may be used to endorse or promote products derived from this
+# software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+
+import os
+import struct
+import sys
+
+PROG_NAME = os.path.basename(sys.argv[0])
+
+def create_header(base, size):
+ """Returns a packed MBN header image with the specified base and size.
+
+ @arg base: integer, specifies the image load address in RAM
+ @arg size: integer, specifies the size of the image
+ @returns: string, the MBN header
+ """
+
+ # SBLs require size to be 4 bytes aligned.
+ size = (size + 3) & 0xfffffffc
+
+ # We currently do not support appending certificates. Signing GPL
+ # code might violate the GPL. So U-Boot will never be signed. So
+ # this is not required for U-Boot.
+
+ header = [
+ 0x5, # Type: APPSBL
+ 0x3, # Version: 3
+ 0x0, # Image source pointer
+ base, # Image destination pointer
+ size, # Code Size + Cert Size + Signature Size
+ size, # Code Size
+ base + size, # Destination + Code Size
+ 0x0, # Signature Size
+ base + size, # Destination + Code Size + Signature Size
+ 0x0, # Cert Size
+ ]
+
+ header_packed = struct.pack('<10I', *header)
+ return header_packed
+
+def mkheader(base_addr, infname, outfname):
+ """Prepends the image with the MBN header.
+
+ @arg base_addr: integer, specifies the image load address in RAM
+ @arg infname: string, image filename
+ @arg outfname: string, output image with header prepended
+ @raises IOError: if reading/writing input/output file fails
+ """
+ with open(infname, "rb") as infp:
+ image = infp.read()
+ insize = len(image)
+
+ if base_addr > 0xFFFFFFFF:
+ raise ValueError("invalid base address")
+
+ if base_addr + insize > 0xFFFFFFFF:
+ raise ValueError("invalid destination range")
+
+ header = create_header(base_addr, insize)
+ with open(outfname, "wb") as outfp:
+ outfp.write(header)
+ outfp.write(image)
+
+def usage(msg=None):
+ """Print command usage.
+
+ @arg msg: string, error message if any (default: None)
+ """
+ if msg != None:
+ sys.stderr.write("%s: %s\n" % (PROG_NAME, msg))
+
+ print "Usage: %s <base-addr> <input-file> <output-file>" % PROG_NAME
+
+ if msg != None:
+ exit(1)
+
+def main():
+ """Main entry function"""
+
+ if len(sys.argv) != 4:
+ usage("incorrect number of arguments")
+
+ try:
+ base_addr = int(sys.argv[1], 0)
+ infname = sys.argv[2]
+ outfname = sys.argv[3]
+ except ValueError as e:
+ sys.stderr.write("mkheader: invalid base address '%s'\n" % sys.argv[1])
+ exit(1)
+
+ try:
+ mkheader(base_addr, infname, outfname)
+ except IOError as e:
+ sys.stderr.write("%s: %s\n" % (PROG_NAME, e))
+ exit(1)
+ except ValueError as e:
+ sys.stderr.write("%s: %s\n" % (PROG_NAME, e))
+ exit(1)
+
+if __name__ == "__main__":
+ main()
+