X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=tools%2Fcheckrom.py;h=69d65e8d935fd5a734c72704544a7ada79516a61;hb=refs%2Fheads%2Fcoreboot;hp=032783b6098e0c4ea64bfb1db1f7481aa8da2fd5;hpb=9bcc527d2ca52d54058ac1f98ba5ddc99d053a4a;p=seabios.git diff --git a/tools/checkrom.py b/tools/checkrom.py index 032783b..69d65e8 100755 --- a/tools/checkrom.py +++ b/tools/checkrom.py @@ -6,31 +6,58 @@ # This file may be distributed under the terms of the GNU GPLv3 license. import sys +import layoutrom def main(): - # Read in symbols (that are valid) - syms = {} - for line in sys.stdin.readlines(): - try: - addr, type, sym = line.split() - syms[sym] = int(addr, 16) - except: - pass - - c16s = syms['code16_start'] - c32s = syms['_code32_code16_start'] - if c16s != c32s: - print "Error! 16bit code moved during linking (0x%x vs 0x%x)" % ( - c32s, c16s) + # Get args + objinfo, rawfile, outfile = sys.argv[1:] + + # Read in symbols + objinfofile = open(objinfo, 'rb') + symbols = layoutrom.parseObjDump(objinfofile, 'in')[1] + + # Read in raw file + f = open(rawfile, 'rb') + rawdata = f.read() + f.close() + datasize = len(rawdata) + finalsize = 64*1024 + if datasize > 64*1024: + finalsize = 128*1024 + if datasize > 128*1024: + finalsize = 256*1024 + + # 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) + + # Print statistics + runtimesize = datasize + if '_reloc_abs_start' in symbols: + 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 + , finalsize / 1024) - size16 = syms['code16_end'] - syms['code16_start'] - size32 = syms['code32_end'] - syms['code32_start'] - sizefree = syms['freespace1_end'] - syms['freespace1_start'] - print "16bit C-code size: %d" % size16 - print "32bit C-code size: %d" % size32 - print "Total C-code size: %d" % (size16+size32) - print "Free C-code space: %d" % sizefree + # Write final file + f = open(outfile, 'wb') + f.write(("\0" * (finalsize - datasize)) + rawdata) + f.close() if __name__ == '__main__': main()