Simplify build by manually resolving external symbols in layoutrom.py.
[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     start = syms['code32flat_start']
33     end = syms['code32flat_end']
34     expend = layoutrom.BUILD_BIOS_ADDR + layoutrom.BUILD_BIOS_SIZE
35     if end != expend:
36         print "Error!  Code does not end at 0x%x (got 0x%x)" % (
37             expend, end)
38         sys.exit(1)
39     if datasize > finalsize:
40         print "Error!  Code is too big (0x%x vs 0x%x)" % (
41             datasize, finalsize)
42         sys.exit(1)
43     expdatasize = end - start
44     if datasize != expdatasize:
45         print "Error!  Unknown extra data (0x%x vs 0x%x)" % (
46             datasize, expdatasize)
47         sys.exit(1)
48
49     # Print statistics
50     print "Total size: %d  Free space: %d  Percent used: %.1f%% (%dKiB rom)" % (
51         datasize, finalsize - datasize
52         , (datasize / 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()