X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=tools%2Fbuildrom.py;h=7ed8107b2dc0838240ae52ab6d241d8449468bfa;hb=refs%2Fheads%2Fcoreboot;hp=87b61f3d4d5e24772c4b3c39b783c5e5bc64a083;hpb=e3677b12f8895c062bcd7e2a4b82963f7a62ca00;p=seabios.git diff --git a/tools/buildrom.py b/tools/buildrom.py index 87b61f3..7ed8107 100755 --- a/tools/buildrom.py +++ b/tools/buildrom.py @@ -1,89 +1,48 @@ #!/usr/bin/env python -# Script to merge a rom32.bin file into a rom16.bin file. +# Fill in checksum/size of an option rom, and pad it to proper length. # -# Copyright (C) 2008 Kevin O'Connor +# Copyright (C) 2009 Kevin O'Connor # # This file may be distributed under the terms of the GNU GPLv3 license. import sys -import struct -import os -ROM16='out/rom16.bin' -ROM32='out/rom32.bin' -OFFSETS16='out/rom16.offset.auto.h' -OFFSETS32='out/rom32.offset.auto.h' -OUT='out/bios.bin' - -def align(v, a): - return (v + a - 1) // a * a - -def scanconfig(file): - f = open(file, 'rb') - opts = {} - for l in f.readlines(): - parts = l.split() - if len(parts) != 3: - continue - if parts[0] != '#define': - continue - opts[parts[1]] = parts[2] - return opts - -def alteraddr(data, offset, ptr): - rel = struct.pack(" freespace: - print "32bit code too large (%d vs %d)" % (size32, freespace) - sys.exit(1) - spos -= 0xf0000 - if data16[spos:spos+size32] != '\0'*size32: - print "Non zero data in 16bit freespace (0x%x to 0x%x)" % ( - spos, spos+size32) - sys.exit(1) - outrom = data16[:spos] + data32 + data16[spos+size32:] + # Pad to a 512 byte boundary + data += "\0" * (alignpos(count, 512) - count) + count = len(data) - # Fixup initial jump to 32 bit code - jmppos = int(o16['OFFSET_set_entry32'], 16) - 0xf0000 - start32 = int(o32['OFFSET__start'], 16) - outrom = alteraddr(outrom, jmppos+2, start32) + # Check if a pci header is present + pcidata = ord(data[24:25]) + (ord(data[25:26]) << 8) + if pcidata != 0: + data = data[:pcidata + 16] + chr(count/512) + chr(0) + data[pcidata + 18:] - print "Writing output rom %s" % OUT - print " 16bit C-code size: %d" % spos - print " 32bit C-code size: %d" % size32 - print " Total C-code size: %d" % (spos+size32) + # Fill in size field; clear checksum field + data = data[:2] + chr(count/512) + data[3:6] + "\0" + data[7:] - # Write output rom - f = open(OUT, 'wb') - f.write(outrom) - f.close() + # Checksum rom + newsum = (256 - checksum(data)) & 0xff + data = data[:6] + chr(newsum) + data[7:] - # Build elf file with 32bit entry point - os.system( - "ld -melf_i386 -e %s -Tdata 0xf0000 -b binary %s -o %s" % ( - int(o32['OFFSET_post32'], 16), OUT, OUT+".elf")) + # Write new rom + f = open(outname, 'wb') + f.write(data) if __name__ == '__main__': main()