#!/usr/bin/env python
# Script to check a bios image and report info on it.
#
# Copyright (C) 2008  Kevin O'Connor <kevin@koconnor.net>
#
# This file may be distributed under the terms of the GNU GPLv3 license.

import sys, struct
import layoutrom, buildrom

def subst(data, offset, new):
    return data[:offset] + new + data[offset + len(new):]

def checksum(data, start, size, csum):
    sumbyte = buildrom.checksum(data[start:start+size])
    return subst(data, start+csum, sumbyte)

def main():
    # Get args
    objinfo, finalsize, rawfile, outfile = sys.argv[1:]

    # Read in symbols
    objinfofile = open(objinfo, 'r')
    symbols = layoutrom.parseObjDump(objinfofile, 'in')[1]

    # Read in raw file
    f = open(rawfile, 'rb')
    rawdata = f.read()
    f.close()
    datasize = len(rawdata)
    finalsize = int(finalsize) * 1024
    if finalsize == 0:
        finalsize = 64*1024
        if datasize > 64*1024:
            finalsize = 128*1024
            if datasize > 128*1024:
                finalsize = 256*1024
    if datasize > finalsize:
        print("Error!  ROM doesn't fit (%d > %d)" % (datasize, finalsize))
        print("   You have to either increase the size (CONFIG_ROM_SIZE)")
        print("   or turn off some features (such as hardware support not")
        print("   needed) to make it fit.  Trying a more recent gcc version")
        print("   might work too.")
        sys.exit(1)

    # Sanity checks
    start = symbols['code32flat_start'].offset
    end = symbols['code32flat_end'].offset
    expend = layoutrom.BUILD_BIOS_ADDR + layoutrom.BUILD_BIOS_SIZE
    if end != expend:
        print("Error!  Code does not end at 0x%x (got 0x%x)" % (
            expend, end))
        sys.exit(1)
    if datasize > finalsize:
        print("Error!  Code is too big (0x%x vs 0x%x)" % (
            datasize, finalsize))
        sys.exit(1)
    expdatasize = end - start
    if datasize != expdatasize:
        print("Error!  Unknown extra data (0x%x vs 0x%x)" % (
            datasize, expdatasize))
        sys.exit(1)

    # Fix up CSM Compatibility16 table
    if 'csm_compat_table' in symbols and 'entry_csm' in symbols:
        # Field offsets within EFI_COMPATIBILITY16_TABLE
        ENTRY_FIELD_OFS = 14 # Compatibility16CallOffset (UINT16)
        SIZE_FIELD_OFS = 5   # TableLength (UINT8)
        CSUM_FIELD_OFS = 4   # TableChecksum (UINT8)

        tableofs = symbols['csm_compat_table'].offset - symbols['code32flat_start'].offset
        entry_addr = symbols['entry_csm'].offset - layoutrom.BUILD_BIOS_ADDR
        entry_addr = struct.pack('<H', entry_addr)
        rawdata = subst(rawdata, tableofs+ENTRY_FIELD_OFS, entry_addr)

        tsfield = tableofs+SIZE_FIELD_OFS
        tablesize = ord(rawdata[tsfield:tsfield+1])
        rawdata = checksum(rawdata, tableofs, tablesize, CSUM_FIELD_OFS)

    # Print statistics
    runtimesize = end - symbols['code32init_end'].offset
    print("Total size: %d  Fixed: %d  Free: %d (used %.1f%% of %dKiB rom)" % (
        datasize, runtimesize, finalsize - datasize
        , (datasize / float(finalsize)) * 100.0
        , int(finalsize / 1024)))

    # Write final file
    f = open(outfile, 'wb')
    f.write((b"\0" * (finalsize - datasize)) + rawdata)
    f.close()

if __name__ == '__main__':
    main()
