|
|
1.1 ! root 1: #!/usr/bin/env python ! 2: # Script to check a bios image and report info on it. ! 3: # ! 4: # Copyright (C) 2008 Kevin O'Connor <[email protected]> ! 5: # ! 6: # This file may be distributed under the terms of the GNU GPLv3 license. ! 7: ! 8: import sys ! 9: import layoutrom ! 10: ! 11: def main(): ! 12: # Get args ! 13: objinfo, rawfile, outfile = sys.argv[1:] ! 14: ! 15: # Read in symbols ! 16: objinfofile = open(objinfo, 'rb') ! 17: symbols = layoutrom.parseObjDump(objinfofile)[1] ! 18: syms = {} ! 19: for name, (addr, section) in symbols.items(): ! 20: syms[name] = addr ! 21: ! 22: # Read in raw file ! 23: f = open(rawfile, 'rb') ! 24: rawdata = f.read() ! 25: f.close() ! 26: datasize = len(rawdata) ! 27: finalsize = 64*1024 ! 28: if datasize > 64*1024: ! 29: finalsize = 128*1024 ! 30: ! 31: # Sanity checks ! 32: c16e = syms['code16_end'] + 0xf0000 ! 33: f16e = syms['final_code16_end'] ! 34: if c16e != f16e: ! 35: print "Error! 16bit code moved during linking (0x%x vs 0x%x)" % ( ! 36: c16e, f16e) ! 37: sys.exit(1) ! 38: if datasize > finalsize: ! 39: print "Error! Code is too big (0x%x vs 0x%x)" % ( ! 40: datasize, finalsize) ! 41: sys.exit(1) ! 42: ! 43: # Print statistics ! 44: sizefree = syms['freespace_end'] - syms['freespace_start'] ! 45: size16 = syms['code16_end'] - syms['code16_start'] ! 46: size32 = syms['code32_end'] - syms['code32_start'] ! 47: totalc = size16+size32 ! 48: print "16bit size: %d" % size16 ! 49: print "32bit size: %d" % size32 ! 50: print "Total size: %d Free space: %d Percent used: %.1f%% (%dKiB rom)" % ( ! 51: totalc, sizefree + finalsize - datasize ! 52: , (totalc / float(finalsize)) * 100.0 ! 53: , finalsize / 1024) ! 54: ! 55: # Write final file ! 56: f = open(outfile, 'wb') ! 57: f.write(("\0" * (finalsize - datasize)) + rawdata) ! 58: f.close() ! 59: ! 60: if __name__ == '__main__': ! 61: main()
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.