#
# Copyright (c) 2014-2016 The Linux Foundation. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 and
# only version 2 as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#

import sys
import struct

def create_header(base, size, img_type):
    """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
    @arg img_type: integer, specifies the image type
    @returns: string, the MBN header
    """

    header = [
        img_type,    # 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, img_type, infname, outfname):
    """Prepends the image with the MBN header.

    @arg base_addr: integer, specifies the image load address in RAM
    @arg img_type: integer, specifies the image type
    @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, img_type)
    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("mkheader: %s\n" % msg)

    print "Usage: mkheader.py <base-addr> <img_type> <input-file> <output-file>"

    if msg != None:
        exit(1)

def main():
    """Main entry function"""

    if len(sys.argv) != 5:
        usage("incorrect no. of arguments")

    try:
        base_addr = int(sys.argv[1], 0)
        img_type = int(sys.argv[2], 0)
        infname = sys.argv[3]
        outfname = sys.argv[4]
    except ValueError as e:
        sys.stderr.write("mkheader: invalid base address '%s'\n" % sys.argv[1])
        exit(1)

    try:
        mkheader(base_addr, img_type,  infname, outfname)
    except IOError as e:
        sys.stderr.write("mkheader: %s\n" % e)
        exit(1)
    except ValueError as e:
        sys.stderr.write("mkheader: %s\n" % e)
        exit(1)

if __name__ == "__main__":
    main()

