blob: 8ff60e25d86df55a1f210687220fc234c607f0ee [file] [log] [blame]
Kevin O'Connor32da6a62009-05-14 19:01:39 -04001#!/usr/bin/env python
2# Fill in checksum/size of an option rom, and pad it to proper length.
3#
4# Copyright (C) 2009 Kevin O'Connor <kevin@koconnor.net>
5#
6# This file may be distributed under the terms of the GNU GPLv3 license.
7
8import sys
9
Johannes Krampf19f789b2014-01-19 16:03:49 +010010from python23compat import as_bytes
11
Kevin O'Connor32da6a62009-05-14 19:01:39 -040012def alignpos(pos, alignbytes):
13 mask = alignbytes - 1
14 return (pos + mask) & ~mask
15
16def checksum(data):
17 ords = map(ord, data)
18 return sum(ords)
19
20def main():
21 inname = sys.argv[1]
22 outname = sys.argv[2]
23
24 # Read data in
25 f = open(inname, 'rb')
26 data = f.read()
Kevin O'Connorf31bff12013-05-20 21:39:56 -040027 f.close()
Kevin O'Connor32da6a62009-05-14 19:01:39 -040028 count = len(data)
29
30 # Pad to a 512 byte boundary
Johannes Krampf19f789b2014-01-19 16:03:49 +010031 data += as_bytes("\0") * (alignpos(count, 512) - count)
Kevin O'Connor32da6a62009-05-14 19:01:39 -040032 count = len(data)
33
Julian Pidancet65cfaa22011-12-19 05:07:57 +000034 # Check if a pci header is present
35 pcidata = ord(data[24:25]) + (ord(data[25:26]) << 8)
36 if pcidata != 0:
Johannes Krampf9d7d0442014-01-12 11:19:22 -050037 data = data[:pcidata + 16] + chr(int(count/512)) + chr(0) + data[pcidata + 18:]
Julian Pidancet65cfaa22011-12-19 05:07:57 +000038
Kevin O'Connor32da6a62009-05-14 19:01:39 -040039 # Fill in size field; clear checksum field
Johannes Krampf19f789b2014-01-19 16:03:49 +010040 data = data[:2] + chr(int(count/512)) + data[3:6] + as_bytes("\0") + data[7:]
Kevin O'Connor32da6a62009-05-14 19:01:39 -040041
42 # Checksum rom
43 newsum = (256 - checksum(data)) & 0xff
44 data = data[:6] + chr(newsum) + data[7:]
45
46 # Write new rom
47 f = open(outname, 'wb')
48 f.write(data)
Kevin O'Connorf31bff12013-05-20 21:39:56 -040049 f.close()
Kevin O'Connor32da6a62009-05-14 19:01:39 -040050
51if __name__ == '__main__':
52 main()