|
|
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
1.1.1.2 ! root 32: c16e = syms['text16_end'] + 0xf0000
! 33: f16e = syms['final_text16_end']
1.1 root 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)
1.1.1.2 ! root 42: actualdatasize = f16e - syms['code32flat_start']
! 43: if datasize != actualdatasize:
! 44: print "Error! Unknown extra data (0x%x vs 0x%x)" % (
! 45: datasize, actualdatasize)
! 46: sys.exit(1)
1.1 root 47:
48: # Print statistics
49: sizefree = syms['freespace_end'] - syms['freespace_start']
1.1.1.2 ! root 50: size16 = syms['text16_end'] - syms['data16_start']
! 51: size32seg = syms['code32seg_end'] - syms['code32seg_start']
! 52: size32flat = syms['code32flat_end'] - syms['code32flat_start']
! 53: totalc = size16+size32seg+size32flat
! 54: print "16bit size: %d" % size16
! 55: print "32bit segmented size: %d" % size32seg
! 56: print "32bit flat size: %d" % size32flat
1.1 root 57: print "Total size: %d Free space: %d Percent used: %.1f%% (%dKiB rom)" % (
58: totalc, sizefree + finalsize - datasize
59: , (totalc / float(finalsize)) * 100.0
60: , finalsize / 1024)
61:
62: # Write final file
63: f = open(outfile, 'wb')
64: f.write(("\0" * (finalsize - datasize)) + rawdata)
65: f.close()
66:
67: if __name__ == '__main__':
68: main()
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.