Add support for 32bit PCI BIOS entry.
[seabios.git] / tools / checkrom.py
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 <kevin@koconnor.net>
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['text16_end'] + 0xf0000
33     f16e = syms['final_text16_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     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)
47
48     # Print statistics
49     sizefree = syms['freespace_end'] - syms['freespace_start']
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
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()