Hello SeaBIOS developers,
I've created a new patch which allows me to build SeaBIOS successfully
with both Python 2 and Python 3. (Tested with qemu)
Aside from print statements/functions, str/bytes and integer division
for Python 2/3 compatibility, I also did some small changes (removing
semicolons) to the acpi_* files to reduce the noise from pylint output.
I was careful not to break the code, but I could not test the readserial
script lacking the necessary hardware and would appreciate if someone
else could give it a try.
All of my changes should work with Python 2.4 and newer (version in RHEL
5, the oldest supported version). If you require compatibility with
older Python versions, please tell me and I will revise the patch.
- Johannes
P.S. Please CC me in answers as I'm not subscribed to the list.
diff --git a/scripts/acpi_extract.py b/scripts/acpi_extract.py
index 8975b31..60bbac3 100755
--- a/scripts/acpi_extract.py
+++ b/scripts/acpi_extract.py
@@ -38,9 +38,9 @@
#
# ACPI_EXTRACT is not allowed anywhere else in code, except in comments.
-import re;
-import sys;
-import fileinput;
+import re
+import sys
+import fileinput
aml = []
asl = []
@@ -55,7 +55,7 @@ class asl_line:
def die(diag):
sys.stderr.write("Error: %s; %s\n" % (diag, debug))
sys.exit(1)
-
+
#Store an ASL command, matching AML offset, and input line (for debugging)
def add_asl(lineno, line):
l = asl_line()
@@ -67,28 +67,28 @@ def add_asl(lineno, line):
#Store an AML byte sequence
#Verify that offset output by iasl matches # of bytes so far
def add_aml(offset, line):
- o = int(offset, 16);
+ o = int(offset, 16)
# Sanity check: offset must match size of code so far
if (o != len(aml)):
die("Offset 0x%x != 0x%x" % (o, len(aml)))
# Strip any trailing dots and ASCII dump after "
- line = re.sub(r'\s*\.*\s*".*$',"", line)
+ line = re.sub(r'\s*\.*\s*".*$', "", line)
# Strip traling whitespace
- line = re.sub(r'\s+$',"", line)
+ line = re.sub(r'\s+$', "", line)
# Strip leading whitespace
- line = re.sub(r'^\s+',"", line)
+ line = re.sub(r'^\s+', "", line)
# Split on whitespace
code = re.split(r'\s+', line)
for c in code:
# Require a legal hex number, two digits
if (not(re.search(r'^[0-9A-Fa-f][0-9A-Fa-f]$', c))):
- die("Unexpected octet %s" % c);
- aml.append(int(c, 16));
+ die("Unexpected octet %s" % c)
+ aml.append(int(c, 16))
# Process aml bytecode array, decoding AML
def aml_pkglen_bytes(offset):
# PkgLength can be multibyte. Bits 8-7 give the # of extra bytes.
- pkglenbytes = aml[offset] >> 6;
+ pkglenbytes = aml[offset] >> 6
return pkglenbytes + 1
def aml_pkglen(offset):
@@ -113,23 +113,23 @@ def aml_method_string(offset):
#0x14 MethodOp PkgLength NameString MethodFlags TermList
if (aml[offset] != 0x14):
die( "Method offset 0x%x: expected 0x14 actual 0x%x" %
- (offset, aml[offset]));
- offset += 1;
+ (offset, aml[offset]))
+ offset += 1
pkglenbytes = aml_pkglen_bytes(offset)
- offset += pkglenbytes;
- return offset;
+ offset += pkglenbytes
+ return offset
# Given name offset, find its NameString offset
def aml_name_string(offset):
#0x08 NameOp NameString DataRef
if (aml[offset] != 0x08):
die( "Name offset 0x%x: expected 0x08 actual 0x%x" %
- (offset, aml[offset]));
+ (offset, aml[offset]))
offset += 1
# Block Name Modifier. Skip it.
if (aml[offset] == 0x5c or aml[offset] == 0x5e):
offset += 1
- return offset;
+ return offset
# Given data offset, find 8 byte buffer offset
def aml_data_buffer8(offset):
@@ -145,24 +145,24 @@ def aml_data_dword_const(offset):
#0x08 NameOp NameString DataRef
if (aml[offset] != 0x0C):
die( "Name offset 0x%x: expected 0x0C actual 0x%x" %
- (offset, aml[offset]));
- return offset + 1;
+ (offset, aml[offset]))
+ return offset + 1
# Given data offset, find word const offset
def aml_data_word_const(offset):
#0x08 NameOp NameString DataRef
if (aml[offset] != 0x0B):
die( "Name offset 0x%x: expected 0x0B actual 0x%x" %
- (offset, aml[offset]));
- return offset + 1;
+ (offset, aml[offset]))
+ return offset + 1
# Given data offset, find byte const offset
def aml_data_byte_const(offset):
#0x08 NameOp NameString DataRef
if (aml[offset] != 0x0A):
die( "Name offset 0x%x: expected 0x0A actual 0x%x" %
- (offset, aml[offset]));
- return offset + 1;
+ (offset, aml[offset]))
+ return offset + 1
# Find name'd buffer8
def aml_name_buffer8(offset):
@@ -184,7 +184,7 @@ def aml_device_start(offset):
#0x5B 0x82 DeviceOp PkgLength NameString
if ((aml[offset] != 0x5B) or (aml[offset + 1] != 0x82)):
die( "Name offset 0x%x: expected 0x5B 0x82 actual 0x%x 0x%x" %
- (offset, aml[offset], aml[offset + 1]));
+ (offset, aml[offset], aml[offset + 1]))
return offset
def aml_device_string(offset):
@@ -206,7 +206,7 @@ def aml_processor_start(offset):
#0x5B 0x83 ProcessorOp PkgLength NameString ProcID
if ((aml[offset] != 0x5B) or (aml[offset + 1] != 0x83)):
die( "Name offset 0x%x: expected 0x5B 0x83 actual 0x%x 0x%x" %
- (offset, aml[offset], aml[offset + 1]));
+ (offset, aml[offset], aml[offset + 1]))
return offset
def aml_processor_string(offset):
@@ -229,14 +229,14 @@ def aml_package_start(offset):
# 0x12 PkgLength NumElements PackageElementList
if (aml[offset] != 0x12):
die( "Name offset 0x%x: expected 0x12 actual 0x%x" %
- (offset, aml[offset]));
+ (offset, aml[offset]))
offset += 1
return offset + aml_pkglen_bytes(offset) + 1
lineno = 0
for line in fileinput.input():
# Strip trailing newline
- line = line.rstrip();
+ line = line.rstrip()
# line number and debug string to output in case of errors
lineno = lineno + 1
debug = "input line %d: %s" % (lineno, line)
@@ -244,7 +244,7 @@ for line in fileinput.input():
pasl = re.compile('^\s+([0-9]+)(:\s\s|\.\.\.\.)\s*')
m = pasl.search(line)
if (m):
- add_asl(lineno, pasl.sub("", line));
+ add_asl(lineno, pasl.sub("", line))
# AML listing: offset in hex, then ...., then code
paml = re.compile('^([0-9A-Fa-f]+)(:\s\s|\.\.\.\.)\s*')
m = paml.search(line)
@@ -267,7 +267,7 @@ for i in range(len(asl)):
# Ignore any non-words for the purpose of this test.
m = re.search(r'\w+', l)
if (m):
- prev_aml_offset = asl[i].aml_offset
+ prev_aml_offset = asl[i].aml_offset
continue
if (a > 1):
@@ -337,11 +337,11 @@ debug = "at end of file"
def get_value_type(maxvalue):
#Use type large enough to fit the table
if (maxvalue >= 0x10000):
- return "int"
+ return "int"
elif (maxvalue >= 0x100):
- return "short"
+ return "short"
else:
- return "char"
+ return "char"
# Pretty print output
for array in output.keys():
@@ -351,4 +351,4 @@ for array in output.keys():
odata.append("0x%x" % value)
sys.stdout.write("static unsigned %s %s[] = {\n" % (otype, array))
sys.stdout.write(",\n".join(odata))
- sys.stdout.write('\n};\n');
+ sys.stdout.write('\n};\n')
diff --git a/scripts/acpi_extract_preprocess.py b/scripts/acpi_extract_preprocess.py
index 4ae364e..6ef7df0 100755
--- a/scripts/acpi_extract_preprocess.py
+++ b/scripts/acpi_extract_preprocess.py
@@ -8,9 +8,9 @@
# We also put each directive on a new line, the machinery
# in tools/acpi_extract.py requires this.
-import re;
-import sys;
-import fileinput;
+import re
+import sys
+import fileinput
def die(diag):
sys.stderr.write("Error: %s\n" % (diag))
@@ -22,7 +22,7 @@ psplit = re.compile(r''' (
ACPI_EXTRACT_\w+ # directive
\s+ # some whitespace
\w+ # array name
- )''', re.VERBOSE);
+ )''', re.VERBOSE)
lineno = 0
for line in fileinput.input():
@@ -30,7 +30,7 @@ for line in fileinput.input():
lineno = lineno + 1
debug = "input line %d: %s" % (lineno, line.rstrip())
- s = psplit.split(line);
+ s = psplit.split(line)
# The way split works, each odd item is the matching ACPI_EXTRACT directive.
# Put each in a comment, and on a line by itself.
for i in range(len(s)):
diff --git a/scripts/buildrom.py b/scripts/buildrom.py
index f2228ab..8e56d33 100755
--- a/scripts/buildrom.py
+++ b/scripts/buildrom.py
@@ -7,6 +7,8 @@
import sys
+from python23compat import as_bytes
+
def alignpos(pos, alignbytes):
mask = alignbytes - 1
return (pos + mask) & ~mask
@@ -26,16 +28,16 @@ def main():
count = len(data)
# Pad to a 512 byte boundary
- data += "\0" * (alignpos(count, 512) - count)
+ data += as_bytes("\0" * (alignpos(count, 512) - count))
count = len(data)
# 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:]
+ data = data[:pcidata + 16] + chr(int(count/512)) + chr(0) + data[pcidata + 18:]
# Fill in size field; clear checksum field
- data = data[:2] + chr(count/512) + data[3:6] + "\0" + data[7:]
+ data = data[:2] + chr(int(count/512)) + data[3:6] + as_bytes("\0") + data[7:]
# Checksum rom
newsum = (256 - checksum(data)) & 0xff
diff --git a/scripts/checkrom.py b/scripts/checkrom.py
index aa3dd0d..0a164f0 100755
--- a/scripts/checkrom.py
+++ b/scripts/checkrom.py
@@ -8,6 +8,8 @@
import sys
import layoutrom
+from python23compat import as_bytes
+
def subst(data, offset, new):
return data[:offset] + new + data[offset + len(new):]
@@ -25,7 +27,7 @@ def main():
# Read in symbols
objinfofile = open(objinfo, 'rb')
- symbols = layoutrom.parseObjDump(objinfofile, 'in')[1]
+ symbols = layoutrom.parseObjDump(objinfofile, as_bytes('in'))[1]
# Read in raw file
f = open(rawfile, 'rb')
@@ -40,40 +42,40 @@ def main():
if datasize > 128*1024:
finalsize = 256*1024
if datasize > finalsize:
- print "Error! ROM doesn't fit (%d > %d)" % (datasize, finalsize)
- print " You have to either increate the size (CONFIG_ROM_SIZE)"
- print " or turn off some features (such as hardware support not"
- print " needed) to make it fit. Trying a more recent gcc version"
- print " might work too."
+ print("Error! ROM doesn't fit (%d > %d)" % (datasize, finalsize))
+ print(" You have to either increate the size (CONFIG_ROM_SIZE)")
+ print(" or turn off some features (such as hardware support not")
+ print(" needed) to make it fit. Trying a more recent gcc version")
+ print(" might work too.")
sys.exit(1)
# Sanity checks
- start = symbols['code32flat_start'].offset
- end = symbols['code32flat_end'].offset
+ start = symbols[as_bytes('code32flat_start')].offset
+ end = symbols[as_bytes('code32flat_end')].offset
expend = layoutrom.BUILD_BIOS_ADDR + layoutrom.BUILD_BIOS_SIZE
if end != expend:
- print "Error! Code does not end at 0x%x (got 0x%x)" % (
- expend, end)
+ print("Error! Code does not end at 0x%x (got 0x%x)" % (
+ expend, end))
sys.exit(1)
if datasize > finalsize:
- print "Error! Code is too big (0x%x vs 0x%x)" % (
- datasize, finalsize)
+ print("Error! Code is too big (0x%x vs 0x%x)" % (
+ datasize, finalsize))
sys.exit(1)
expdatasize = end - start
if datasize != expdatasize:
- print "Error! Unknown extra data (0x%x vs 0x%x)" % (
- datasize, expdatasize)
+ print("Error! Unknown extra data (0x%x vs 0x%x)" % (
+ datasize, expdatasize))
sys.exit(1)
# Fix up CSM Compatibility16 table
- if 'csm_compat_table' in symbols and 'entry_csm' in symbols:
+ if as_bytes('csm_compat_table') in symbols and as_bytes('entry_csm') in symbols:
# Field offsets within EFI_COMPATIBILITY16_TABLE
ENTRY_FIELD_OFS = 14 # Compatibility16CallOffset (UINT16)
SIZE_FIELD_OFS = 5 # TableLength (UINT8)
CSUM_FIELD_OFS = 4 # TableChecksum (UINT8)
- tableofs = symbols['csm_compat_table'].offset - symbols['code32flat_start'].offset
- entry_addr = symbols['entry_csm'].offset - layoutrom.BUILD_BIOS_ADDR
+ tableofs = symbols[as_bytes('csm_compat_table')].offset - symbols[as_bytes('code32flat_start')].offset
+ entry_addr = symbols[as_bytes('entry_csm')].offset - layoutrom.BUILD_BIOS_ADDR
byte1 = chr(entry_addr & 0xff)
byte2 = chr(entry_addr >> 8)
rawdata = subst(rawdata, tableofs+ENTRY_FIELD_OFS, byte1+byte2)
@@ -82,15 +84,15 @@ def main():
rawdata = checksum(rawdata, tableofs, tablesize, CSUM_FIELD_OFS)
# Print statistics
- runtimesize = end - symbols['code32init_end'].offset
- print "Total size: %d Fixed: %d Free: %d (used %.1f%% of %dKiB rom)" % (
+ runtimesize = end - symbols[as_bytes('code32init_end')].offset
+ print("Total size: %d Fixed: %d Free: %d (used %.1f%% of %dKiB rom)" % (
datasize, runtimesize, finalsize - datasize
, (datasize / float(finalsize)) * 100.0
- , finalsize / 1024)
+ , int(finalsize / 1024)))
# Write final file
f = open(outfile, 'wb')
- f.write(("\0" * (finalsize - datasize)) + rawdata)
+ f.write(as_bytes(("\0" * (finalsize - datasize))) + rawdata)
f.close()
if __name__ == '__main__':
diff --git a/scripts/checkstack.py b/scripts/checkstack.py
index 23b7c8e..62fef36 100755
--- a/scripts/checkstack.py
+++ b/scripts/checkstack.py
@@ -182,12 +182,12 @@ def calc():
elif insn.startswith('calll'):
noteCall(cur, subfuncs, insnaddr, calladdr, stackusage + 4)
else:
- print "unknown call", ref
+ print("unknown call", ref)
noteCall(cur, subfuncs, insnaddr, calladdr, stackusage)
# Reset stack usage to preamble usage
stackusage = cur[1]
- #print "other", repr(line)
+ #print("other", repr(line))
# Calculate maxstackusage
for funcaddr, info in funcs.items():
@@ -199,7 +199,7 @@ def calc():
funcaddrs = orderfuncs(funcs.keys(), funcs.copy())
# Show all functions
- print OUTPUTDESC
+ print(OUTPUTDESC)
for funcaddr in funcaddrs:
name, basicusage, maxusage, yieldusage, maxyieldusage, count, calls = \
funcs[funcaddr]
@@ -208,15 +208,15 @@ def calc():
yieldstr = ""
if maxyieldusage is not None:
yieldstr = ",%d" % maxyieldusage
- print "\n%s[%d,%d%s]:" % (name, basicusage, maxusage, yieldstr)
+ print("\n%s[%d,%d%s]:" % (name, basicusage, maxusage, yieldstr))
for insnaddr, calladdr, stackusage in calls:
callinfo = funcs.get(calladdr, ("<unknown>", 0, 0, 0, None))
yieldstr = ""
if callinfo[4] is not None:
yieldstr = ",%d" % (stackusage + callinfo[4])
- print " %04s:%-40s [%d+%d,%d%s]" % (
+ print(" %04s:%-40s [%d+%d,%d%s]" % (
insnaddr, callinfo[0], stackusage, callinfo[1]
- , stackusage+callinfo[2], yieldstr)
+ , stackusage+callinfo[2], yieldstr))
def main():
calc()
diff --git a/scripts/checksum.py b/scripts/checksum.py
index 8c7665d..773fa7a 100755
--- a/scripts/checksum.py
+++ b/scripts/checksum.py
@@ -10,7 +10,7 @@ import sys
def main():
data = sys.stdin.read()
ords = map(ord, data)
- print "sum=%x\n" % sum(ords)
+ print("sum=%x\n" % sum(ords))
if __name__ == '__main__':
main()
diff --git a/scripts/layoutrom.py b/scripts/layoutrom.py
index 24cd7a4..5e3e7f9 100755
--- a/scripts/layoutrom.py
+++ b/scripts/layoutrom.py
@@ -5,17 +5,20 @@
#
# This file may be distributed under the terms of the GNU GPLv3 license.
+import operator
import sys
+from python23compat import as_bytes, as_str
+
# LD script headers/trailers
-COMMONHEADER = """
+COMMONHEADER = as_bytes("""
/* DO NOT EDIT! This is an autogenerated file. See tools/layoutrom.py. */
OUTPUT_FORMAT("elf32-i386")
OUTPUT_ARCH("i386")
SECTIONS
{
-"""
-COMMONTRAILER = """
+""")
+COMMONTRAILER = as_bytes("""
/* Discard regular data sections to force a link error if
* code attempts to access data not marked with VAR16 (or other
@@ -26,7 +29,7 @@ COMMONTRAILER = """
*(COMMON) *(.discard*) *(.eh_frame) *(.note*)
}
}
-"""
+""")
######################################################################
@@ -46,7 +49,7 @@ def setSectionsStart(sections, endaddr, minalign=1, segoffset=0):
if section.align > minalign:
minalign = section.align
totspace = alignpos(totspace, section.align) + section.size
- startaddr = (endaddr - totspace) / minalign * minalign
+ startaddr = int((endaddr - totspace) / minalign) * minalign
curaddr = startaddr
for section in sections:
curaddr = alignpos(curaddr, section.align)
@@ -70,16 +73,16 @@ def fitSections(sections, fillsections):
# fixedsections = [(addr, section), ...]
fixedsections = []
for section in sections:
- if section.name.startswith('.fixedaddr.'):
+ if section.name.startswith(as_bytes('.fixedaddr.')):
addr = int(section.name[11:], 16)
section.finalloc = addr + BUILD_BIOS_ADDR
section.finalsegloc = addr
fixedsections.append((addr, section))
if section.align != 1:
- print "Error: Fixed section %s has non-zero alignment (%d)" % (
- section.name, section.align)
+ print("Error: Fixed section %s has non-zero alignment (%d)" % (
+ as_str(section.name), section.align))
sys.exit(1)
- fixedsections.sort()
+ fixedsections.sort(key=operator.itemgetter(0))
firstfixed = fixedsections[0][0]
# Find freespace in fixed address area
@@ -94,7 +97,7 @@ def fitSections(sections, fillsections):
nextaddr = fixedsections[i+1][0]
avail = nextaddr - addr - section.size
fixedAddr.append((avail, section))
- fixedAddr.sort()
+ fixedAddr.sort(key=operator.itemgetter(0))
# Attempt to fit other sections into fixed area
canrelocate = [(section.size, section.align, section.name, section)
@@ -106,8 +109,8 @@ def fitSections(sections, fillsections):
addpos = fixedsection.finalsegloc + fixedsection.size
totalused += fixedsection.size
nextfixedaddr = addpos + freespace
-# print "Filling section %x uses %d, next=%x, available=%d" % (
-# fixedsection.finalloc, fixedsection.size, nextfixedaddr, freespace)
+# print("Filling section %x uses %d, next=%x, available=%d" % (
+# fixedsection.finalloc, fixedsection.size, nextfixedaddr, freespace))
while 1:
canfit = None
for fitsection in canrelocate:
@@ -115,8 +118,8 @@ def fitSections(sections, fillsections):
# Can't fit and nothing else will fit.
break
fitnextaddr = alignpos(addpos, fitsection.align) + fitsection.size
-# print "Test %s - %x vs %x" % (
-# fitsection.name, fitnextaddr, nextfixedaddr)
+# print("Test %s - %x vs %x" % (
+# fitsection.name, fitnextaddr, nextfixedaddr))
if fitnextaddr > nextfixedaddr:
# This item can't fit.
continue
@@ -130,9 +133,9 @@ def fitSections(sections, fillsections):
fitsection.finalsegloc = addpos
addpos = fitnextaddr
totalused += fitsection.size
-# print " Adding %s (size %d align %d) pos=%x avail=%d" % (
+# print(" Adding %s (size %d align %d) pos=%x avail=%d" % (
# fitsection[2], fitsection[0], fitsection[1]
-# , fitnextaddr, nextfixedaddr - fitnextaddr)
+# , fitnextaddr, nextfixedaddr - fitnextaddr))
# Report stats
total = BUILD_BIOS_SIZE-firstfixed
@@ -172,14 +175,14 @@ def doLayout(sections, config, genreloc):
li = LayoutInfo()
li.genreloc = genreloc
# Determine 16bit positions
- li.sections16 = getSectionsCategory(sections, '16')
- textsections = getSectionsPrefix(li.sections16, '.text.')
+ li.sections16 = getSectionsCategory(sections, as_bytes('16'))
+ textsections = getSectionsPrefix(li.sections16, as_bytes('.text.'))
rodatasections = (
- getSectionsPrefix(li.sections16, '.rodata.str1.1')
- + getSectionsPrefix(li.sections16, '.rodata.__func__.')
- + getSectionsPrefix(li.sections16, '.rodata.__PRETTY_FUNCTION__.'))
- datasections = getSectionsPrefix(li.sections16, '.data16.')
- fixedsections = getSectionsPrefix(li.sections16, '.fixedaddr.')
+ getSectionsPrefix(li.sections16, as_bytes('.rodata.str1.1'))
+ + getSectionsPrefix(li.sections16, as_bytes('.rodata.__func__.'))
+ + getSectionsPrefix(li.sections16, as_bytes('.rodata.__PRETTY_FUNCTION__.')))
+ datasections = getSectionsPrefix(li.sections16, as_bytes('.data16.'))
+ fixedsections = getSectionsPrefix(li.sections16, as_bytes('.fixedaddr.'))
firstfixed = fitSections(fixedsections, textsections)
remsections = [s for s in textsections+rodatasections+datasections
@@ -188,42 +191,42 @@ def doLayout(sections, config, genreloc):
remsections, firstfixed, segoffset=BUILD_BIOS_ADDR)
# Determine 32seg positions
- li.sections32seg = getSectionsCategory(sections, '32seg')
- textsections = getSectionsPrefix(li.sections32seg, '.text.')
+ li.sections32seg = getSectionsCategory(sections, as_bytes('32seg'))
+ textsections = getSectionsPrefix(li.sections32seg, as_bytes('.text.'))
rodatasections = (
- getSectionsPrefix(li.sections32seg, '.rodata.str1.1')
- + getSectionsPrefix(li.sections32seg, '.rodata.__func__.')
- + getSectionsPrefix(li.sections32seg, '.rodata.__PRETTY_FUNCTION__.'))
- datasections = getSectionsPrefix(li.sections32seg, '.data32seg.')
+ getSectionsPrefix(li.sections32seg, as_bytes('.rodata.str1.1'))
+ + getSectionsPrefix(li.sections32seg, as_bytes('.rodata.__func__.'))
+ + getSectionsPrefix(li.sections32seg, as_bytes('.rodata.__PRETTY_FUNCTION__.')))
+ datasections = getSectionsPrefix(li.sections32seg, as_bytes('.data32seg.'))
li.sec32seg_start, li.sec32seg_align = setSectionsStart(
textsections + rodatasections + datasections, li.sec16_start
, segoffset=BUILD_BIOS_ADDR)
# Determine "fseg memory" data positions
- li.sections32fseg = getSectionsCategory(sections, '32fseg')
+ li.sections32fseg = getSectionsCategory(sections, as_bytes('32fseg'))
li.sec32fseg_start, li.sec32fseg_align = setSectionsStart(
li.sections32fseg, li.sec32seg_start, 16
, segoffset=BUILD_BIOS_ADDR)
# Determine 32flat runtime positions
- li.sections32flat = getSectionsCategory(sections, '32flat')
- textsections = getSectionsPrefix(li.sections32flat, '.text.')
- rodatasections = getSectionsPrefix(li.sections32flat, '.rodata')
- datasections = getSectionsPrefix(li.sections32flat, '.data.')
- bsssections = getSectionsPrefix(li.sections32flat, '.bss.')
+ li.sections32flat = getSectionsCategory(sections, as_bytes('32flat'))
+ textsections = getSectionsPrefix(li.sections32flat, as_bytes('.text.'))
+ rodatasections = getSectionsPrefix(li.sections32flat, as_bytes('.rodata'))
+ datasections = getSectionsPrefix(li.sections32flat, as_bytes('.data.'))
+ bsssections = getSectionsPrefix(li.sections32flat, as_bytes('.bss.'))
li.sec32flat_start, li.sec32flat_align = setSectionsStart(
textsections + rodatasections + datasections + bsssections
, li.sec32fseg_start, 16)
# Determine 32flat init positions
- li.sections32init = getSectionsCategory(sections, '32init')
- init32_textsections = getSectionsPrefix(li.sections32init, '.text.')
- init32_rodatasections = getSectionsPrefix(li.sections32init, '.rodata')
- init32_datasections = getSectionsPrefix(li.sections32init, '.data.')
- init32_bsssections = getSectionsPrefix(li.sections32init, '.bss.')
+ li.sections32init = getSectionsCategory(sections, as_bytes('32init'))
+ init32_textsections = getSectionsPrefix(li.sections32init, as_bytes('.text.'))
+ init32_rodatasections = getSectionsPrefix(li.sections32init, as_bytes('.rodata'))
+ init32_datasections = getSectionsPrefix(li.sections32init, as_bytes('.data.'))
+ init32_bsssections = getSectionsPrefix(li.sections32init, as_bytes('.bss.'))
li.sec32init_start, li.sec32init_align = setSectionsStart(
init32_textsections + init32_rodatasections
@@ -251,9 +254,9 @@ def doLayout(sections, config, genreloc):
li.final_readonly_start = min(BUILD_BIOS_ADDR, li.sec32init_start)
# Determine "low memory" data positions
- li.sections32low = getSectionsCategory(sections, '32low')
+ li.sections32low = getSectionsCategory(sections, as_bytes('32low'))
sec32low_end = li.sec32init_start
- if config.get('CONFIG_MALLOC_UPPERMEMORY'):
+ if config.get(as_bytes('CONFIG_MALLOC_UPPERMEMORY')):
final_sec32low_end = li.final_readonly_start
zonelow_base = final_sec32low_end - 64*1024
li.zonelow_base = max(BUILD_ROM_START, alignpos(zonelow_base, 2*1024))
@@ -273,12 +276,12 @@ def doLayout(sections, config, genreloc):
size32flat = li.sec32fseg_start - li.sec32flat_start
size32init = li.sec32flat_start - li.sec32init_start
sizelow = sec32low_end - li.sec32low_start
- print "16bit size: %d" % size16
- print "32bit segmented size: %d" % size32seg
- print "32bit flat size: %d" % size32flat
- print "32bit flat init size: %d" % size32init
- print "Lowmem size: %d" % sizelow
- print "f-segment var size: %d" % size32fseg
+ print("16bit size: %d" % size16)
+ print("32bit segmented size: %d" % size32seg)
+ print("32bit flat size: %d" % size32flat)
+ print("32bit flat init size: %d" % size32init)
+ print("Lowmem size: %d" % sizelow)
+ print("f-segment var size: %d" % size32fseg)
return li
@@ -289,7 +292,7 @@ def doLayout(sections, config, genreloc):
# Write LD script includes for the given cross references
def outXRefs(sections, useseg=0, exportsyms=[], forcedelta=0):
xrefs = dict([(symbol.name, symbol) for symbol in exportsyms])
- out = ""
+ out = as_bytes("")
for section in sections:
for reloc in section.relocs:
symbol = reloc.symbol
@@ -301,32 +304,32 @@ def outXRefs(sections, useseg=0, exportsyms=[], forcedelta=0):
loc = symbol.section.finalloc
if useseg:
loc = symbol.section.finalsegloc
- out += "%s = 0x%x ;\n" % (symbolname, loc + forcedelta + symbol.offset)
+ out += as_bytes("%s = 0x%x ;\n" % (as_str(symbolname), loc + forcedelta + symbol.offset))
return out
# Write LD script includes for the given sections using relative offsets
def outRelSections(sections, startsym, useseg=0):
sections = [(section.finalloc, section) for section in sections
if section.finalloc is not None]
- sections.sort()
- out = ""
+ sections.sort(key=operator.itemgetter(0))
+ out = as_bytes("")
for addr, section in sections:
loc = section.finalloc
if useseg:
loc = section.finalsegloc
- out += ". = ( 0x%x - %s ) ;\n" % (loc, startsym)
- if section.name == '.rodata.str1.1':
- out += "_rodata = . ;\n"
- out += "*(%s)\n" % (section.name,)
+ out += as_bytes(". = ( 0x%x - %s ) ;\n" % (loc, as_str(startsym)))
+ if section.name == as_bytes('.rodata.str1.1'):
+ out += as_bytes("_rodata = . ;\n")
+ out += as_bytes("*(%s)\n" % (as_str(section.name),))
return out
# Build linker script output for a list of relocations.
def strRelocs(outname, outrel, relocs):
relocs.sort()
- return (" %s_start = ABSOLUTE(.) ;\n" % (outname,)
- + "".join(["LONG(0x%x - %s)\n" % (pos, outrel)
+ return (as_bytes(" %s_start = ABSOLUTE(.) ;\n" % (as_str(outname),)
+ + "".join(["LONG(0x%x - %s)\n" % (pos, as_str(outrel))
for pos in relocs])
- + " %s_end = ABSOLUTE(.) ;\n" % (outname,))
+ + " %s_end = ABSOLUTE(.) ;\n" % (as_str(outname),)))
# Find all relocations in the given sections with the given attributes
def getRelocs(sections, type=None, category=None, notcategory=None):
@@ -350,7 +353,7 @@ def getSectionsStart(sections, defaddr=0):
# Output the linker scripts for all required sections.
def writeLinkerScripts(li, out16, out32seg, out32flat):
# Write 16bit linker script
- out = outXRefs(li.sections16, useseg=1) + """
+ out = outXRefs(li.sections16, useseg=1) + as_bytes("""
zonelow_base = 0x%x ;
_zonelow_seg = 0x%x ;
@@ -359,21 +362,21 @@ def writeLinkerScripts(li, out16, out32seg, out32flat):
%s
}
""" % (li.zonelow_base,
- li.zonelow_base / 16,
+ int(li.zonelow_base / 16),
li.sec16_start - BUILD_BIOS_ADDR,
- outRelSections(li.sections16, 'code16_start', useseg=1))
+ as_str(outRelSections(li.sections16, as_bytes('code16_start'), useseg=1))))
outfile = open(out16, 'wb')
outfile.write(COMMONHEADER + out + COMMONTRAILER)
outfile.close()
# Write 32seg linker script
- out = outXRefs(li.sections32seg, useseg=1) + """
+ out = outXRefs(li.sections32seg, useseg=1) + as_bytes("""
code32seg_start = 0x%x ;
.text32seg code32seg_start : {
%s
}
""" % (li.sec32seg_start - BUILD_BIOS_ADDR,
- outRelSections(li.sections32seg, 'code32seg_start', useseg=1))
+ as_str(outRelSections(li.sections32seg, as_bytes('code32seg_start'), useseg=1))))
outfile = open(out32seg, 'wb')
outfile.write(COMMONHEADER + out + COMMONTRAILER)
outfile.close()
@@ -381,24 +384,24 @@ def writeLinkerScripts(li, out16, out32seg, out32flat):
# Write 32flat linker script
sections32all = (li.sections32flat + li.sections32init + li.sections32fseg)
sec32all_start = li.sec32low_start
- relocstr = ""
+ relocstr = as_bytes("")
if li.genreloc:
# Generate relocations
absrelocs = getRelocs(
- li.sections32init, type='R_386_32', category='32init')
+ li.sections32init, type=as_bytes('R_386_32'), category=as_bytes('32init'))
relrelocs = getRelocs(
- li.sections32init, type='R_386_PC32', notcategory='32init')
+ li.sections32init, type=as_bytes('R_386_PC32'), notcategory=as_bytes('32init'))
initrelocs = getRelocs(
li.sections32flat + li.sections32low + li.sections16
- + li.sections32seg + li.sections32fseg, category='32init')
- relocstr = (strRelocs("_reloc_abs", "code32init_start", absrelocs)
- + strRelocs("_reloc_rel", "code32init_start", relrelocs)
- + strRelocs("_reloc_init", "code32flat_start", initrelocs))
+ + li.sections32seg + li.sections32fseg, category=as_bytes('32init'))
+ relocstr = (strRelocs(as_bytes("_reloc_abs"), as_bytes("code32init_start"), absrelocs)
+ + strRelocs(as_bytes("_reloc_rel"), as_bytes("code32init_start"), relrelocs)
+ + strRelocs(as_bytes("_reloc_init"), as_bytes("code32flat_start"), initrelocs))
numrelocs = len(absrelocs + relrelocs + initrelocs)
sec32all_start -= numrelocs * 4
out = outXRefs(li.sections32low, exportsyms=li.varlowsyms
, forcedelta=li.final_sec32low_start-li.sec32low_start)
- out += outXRefs(sections32all, exportsyms=li.exportsyms) + """
+ out += outXRefs(sections32all, exportsyms=li.exportsyms) + as_bytes("""
_reloc_min_align = 0x%x ;
zonefseg_start = 0x%x ;
zonefseg_end = 0x%x ;
@@ -430,20 +433,20 @@ def writeLinkerScripts(li, out16, out32seg, out32flat):
li.final_sec32low_start,
li.final_readonly_start,
sec32all_start,
- relocstr,
- outRelSections(li.sections32low, 'code32flat_start'),
- outRelSections(li.sections32init, 'code32flat_start'),
- outRelSections(li.sections32flat, 'code32flat_start'),
- outRelSections(li.sections32fseg, 'code32flat_start'),
+ as_str(relocstr),
+ as_str(outRelSections(li.sections32low, as_bytes('code32flat_start'))),
+ as_str(outRelSections(li.sections32init, as_bytes('code32flat_start'))),
+ as_str(outRelSections(li.sections32flat, as_bytes('code32flat_start'))),
+ as_str(outRelSections(li.sections32fseg, as_bytes('code32flat_start'))),
li.sec32seg_start,
- li.sec16_start)
- out = COMMONHEADER + out + COMMONTRAILER + """
+ li.sec16_start))
+ out = COMMONHEADER + out + COMMONTRAILER + as_bytes("""
ENTRY(entry_elf)
PHDRS
{
text PT_LOAD AT ( code32flat_start ) ;
}
-"""
+""")
outfile = open(out32flat, 'wb')
outfile.write(out)
outfile.close()
@@ -455,13 +458,13 @@ PHDRS
def markRuntime(section, sections, chain=[]):
if (section is None or not section.keep or section.category is not None
- or '.init.' in section.name or section.fileid != '32flat'):
+ or as_bytes('.init.') in section.name or section.fileid != as_bytes('32flat')):
return
- if '.data.varinit.' in section.name:
- print "ERROR: %s is VARVERIFY32INIT but used from %s" % (
- section.name, chain)
+ if as_bytes('.data.varinit.') in section.name:
+ print("ERROR: %s is VARVERIFY32INIT but used from %s" % (
+ as_str(section.name), chain))
sys.exit(1)
- section.category = '32flat'
+ section.category = as_bytes('32flat')
# Recursively mark all sections this section points to
for reloc in section.relocs:
markRuntime(reloc.symbol.section, sections, chain + [section.name])
@@ -469,14 +472,14 @@ def markRuntime(section, sections, chain=[]):
def findInit(sections):
# Recursively find and mark all "runtime" sections.
for section in sections:
- if ('.data.varlow.' in section.name or '.data.varfseg.' in section.name
- or '.runtime.' in section.name or '.export.' in section.name):
+ if (as_bytes('.data.varlow.') in section.name or as_bytes('.data.varfseg.') in section.name
+ or as_bytes('.runtime.') in section.name or as_bytes('.export.') in section.name):
markRuntime(section, sections)
for section in sections:
if section.category is not None:
continue
- if section.fileid == '32flat':
- section.category = '32init'
+ if section.fileid == as_bytes('32flat'):
+ section.category = as_bytes('32init')
else:
section.category = section.fileid
@@ -485,7 +488,7 @@ def findInit(sections):
# Section garbage collection
######################################################################
-CFUNCPREFIX = [('_cfunc16_', 0), ('_cfunc32seg_', 1), ('_cfunc32flat_', 2)]
+CFUNCPREFIX = [(as_bytes('_cfunc16_'), 0), (as_bytes('_cfunc32seg_'), 1), (as_bytes('_cfunc32flat_'), 2)]
# Find and keep the section associated with a symbol (if available).
def keepsymbol(reloc, infos, pos, isxref):
@@ -500,10 +503,10 @@ def keepsymbol(reloc, infos, pos, isxref):
break
symbol = infos[pos][1].get(symbolname)
if (symbol is None or symbol.section is None
- or symbol.section.name.startswith('.discard.')):
+ or symbol.section.name.startswith(as_bytes('.discard.'))):
return -1
- isdestcfunc = (symbol.section.name.startswith('.text.')
- and not symbol.section.name.startswith('.text.asm.'))
+ isdestcfunc = (symbol.section.name.startswith(as_bytes('.text.'))
+ and not symbol.section.name.startswith(as_bytes('.text.asm.')))
if ((mustbecfunc and not isdestcfunc)
or (not mustbecfunc and isdestcfunc and isxref)):
return -1
@@ -540,7 +543,7 @@ def gc(info16, info32seg, info32flat):
infos = (info16, info32seg, info32flat)
# Start by keeping sections that are globally visible.
for section in info16[0]:
- if section.name.startswith('.fixedaddr.') or '.export.' in section.name:
+ if section.name.startswith(as_bytes('.fixedaddr.')) or as_bytes('.export.') in section.name:
keepsection(section, infos)
return [section for section in info16[0]+info32seg[0]+info32flat[0]
if section.keep]
@@ -569,15 +572,15 @@ def parseObjDump(file, fileid):
state = None
for line in file.readlines():
line = line.rstrip()
- if line == 'Sections:':
+ if line == as_bytes('Sections:'):
state = 'section'
continue
- if line == 'SYMBOL TABLE:':
+ if line == as_bytes('SYMBOL TABLE:'):
state = 'symbol'
continue
- if line.startswith('RELOCATION RECORDS FOR ['):
+ if line.startswith(as_bytes('RELOCATION RECORDS FOR [')):
sectionname = line[24:-2]
- if sectionname.startswith('.debug_'):
+ if sectionname.startswith(as_bytes('.debug_')):
# Skip debugging sections (to reduce parsing time)
state = None
continue
@@ -588,7 +591,7 @@ def parseObjDump(file, fileid):
if state == 'section':
try:
idx, name, size, vma, lma, fileoff, align = line.split()
- if align[:3] != '2**':
+ if align[:3] != as_bytes('2**'):
continue
section = Section()
section.name = name
@@ -606,7 +609,7 @@ def parseObjDump(file, fileid):
parts = line[17:].split()
if len(parts) == 3:
sectionname, size, name = parts
- elif len(parts) == 4 and parts[2] == '.hidden':
+ elif len(parts) == 4 and parts[2] == as_bytes('.hidden'):
sectionname, size, hidden, name = parts
else:
continue
@@ -649,10 +652,10 @@ def scanconfig(file):
parts = l.split()
if len(parts) != 3:
continue
- if parts[0] != '#define':
+ if parts[0] != as_bytes('#define'):
continue
value = parts[2]
- if value.isdigit() or (value.startswith('0x') and value[2:].isdigit()):
+ if value.isdigit() or (value.startswith(as_bytes('0x')) and value[2:].isdigit()):
value = int(value, 0)
opts[parts[1]] = value
return opts
@@ -667,9 +670,9 @@ def main():
infile32flat = open(in32flat, 'rb')
# infoX = (sections, symbols)
- info16 = parseObjDump(infile16, '16')
- info32seg = parseObjDump(infile32seg, '32seg')
- info32flat = parseObjDump(infile32flat, '32flat')
+ info16 = parseObjDump(infile16, as_bytes('16'))
+ info32seg = parseObjDump(infile32seg, as_bytes('32seg'))
+ info32flat = parseObjDump(infile32flat, as_bytes('32flat'))
# Read kconfig config file
config = scanconfig(cfgfile)
@@ -681,24 +684,24 @@ def main():
findInit(sections)
# Note "low memory" and "fseg memory" parts
- for section in getSectionsPrefix(sections, '.data.varlow.'):
- section.category = '32low'
- for section in getSectionsPrefix(sections, '.data.varfseg.'):
- section.category = '32fseg'
+ for section in getSectionsPrefix(sections, as_bytes('.data.varlow.')):
+ section.category = as_bytes('32low')
+ for section in getSectionsPrefix(sections, as_bytes('.data.varfseg.')):
+ section.category = as_bytes('32fseg')
# Determine the final memory locations of each kept section.
- genreloc = '_reloc_abs_start' in info32flat[1]
+ genreloc = as_bytes('_reloc_abs_start') in info32flat[1]
li = doLayout(sections, config, genreloc)
# Exported symbols
li.exportsyms = [symbol for symbol in info16[1].values()
if (symbol.section is not None
- and '.export.' in symbol.section.name
+ and as_bytes('.export.') in symbol.section.name
and symbol.name != symbol.section.name)]
li.varlowsyms = [symbol for symbol in info32flat[1].values()
if (symbol.section is not None
and symbol.section.finalloc is not None
- and '.data.varlow.' in symbol.section.name
+ and as_bytes('.data.varlow.') in symbol.section.name
and symbol.name != symbol.section.name)]
# Write out linker script files.
diff --git a/scripts/python23compat.py b/scripts/python23compat.py
new file mode 100644
index 0000000..6169072
--- /dev/null
+++ b/scripts/python23compat.py
@@ -0,0 +1,18 @@
+# Helper code for compatibility of the code with both Python 2 and Python 3
+#
+# Copyright (C) 2014 Johannes Krampf <[email protected]>
+#
+# This file may be distributed under the terms of the GNU GPLv3 license.
+
+import sys
+
+if (sys.version_info > (3, 0)):
+ def as_bytes(str):
+ return bytes(str, "ASCII")
+ def as_str(bytes):
+ return str(bytes, "ASCII")
+else:
+ def as_bytes(str):
+ return str
+ def as_str(bytes):
+ return bytes
diff --git a/scripts/readserial.py b/scripts/readserial.py
index d85392e..4f29648 100755
--- a/scripts/readserial.py
+++ b/scripts/readserial.py
@@ -13,6 +13,8 @@ import time
import select
import optparse
+from python23compat import as_bytes
+
# Reset time counter after this much idle time.
RESTARTINTERVAL = 60
# Number of bits in a transmitted byte - 8N1 is 1 start bit + 8 data
@@ -25,7 +27,7 @@ def calibrateserialwrite(outfile, byteadjust):
data = data * 80
while 1:
st = time.time()
- outfile.write(data)
+ outfile.write(as_bytes(data))
outfile.flush()
et = time.time()
sys.stdout.write(
@@ -85,11 +87,11 @@ def readserial(infile, logfile, byteadjust):
msg = "\n\n======= %s (adjust=%.1fus)\n" % (
time.asctime(time.localtime(datatime)), byteadjust * 1000000)
sys.stdout.write(msg)
- logfile.write(msg)
+ logfile.write(as_bytes(msg))
lasttime = datatime
# Translate unprintable chars; add timestamps
- out = ""
+ out = as_bytes("")
for c in d:
if isnewline:
delta = datatime - starttime - (charcount * byteadjust)
@@ -113,7 +115,10 @@ def readserial(infile, logfile, byteadjust):
continue
out += c
- sys.stdout.write(out)
+ if (sys.version_info > (3, 0)):
+ sys.stdout.buffer.write(out)
+ else:
+ sys.stdout.write(out)
sys.stdout.flush()
logfile.write(out)
logfile.flush()
@@ -156,11 +161,11 @@ def main():
try:
import serial
except ImportError:
- print """
+ print("""
Unable to find pyserial package ( http://pyserial.sourceforge.net/ ).
On Linux machines try: yum install pyserial
Or: apt-get install python-serial
-"""
+""")
sys.exit(1)
ser = serial.Serial(serialport, baud, timeout=0)
else:
diff --git a/scripts/transdump.py b/scripts/transdump.py
index 4caaeb7..665f04a 100755
--- a/scripts/transdump.py
+++ b/scripts/transdump.py
@@ -44,7 +44,10 @@ def main():
filehdl = open(filename, 'r')
mem = parseMem(filehdl)
for i in mem:
- sys.stdout.write(struct.pack("<I", i))
+ if (sys.version_info > (3, 0)):
+ sys.stdout.buffer.write(struct.pack("<I", i))
+ else:
+ sys.stdout.write(struct.pack("<I", i))
if __name__ == '__main__':
main()
diff --git a/scripts/vgafixup.py b/scripts/vgafixup.py
index 2493f35..726f7bf 100644
--- a/scripts/vgafixup.py
+++ b/scripts/vgafixup.py
@@ -18,23 +18,25 @@
import sys
+from python23compat import as_bytes
+
def main():
infilename, outfilename = sys.argv[1:]
infile = open(infilename, 'rb')
out = []
for line in infile:
sline = line.strip()
- if sline == 'ret':
- out.append('retw $2\n')
- elif sline == 'leave':
- out.append('movl %ebp, %esp ; popl %ebp\n')
- elif sline.startswith('call'):
- out.append('pushw %ax ; callw' + sline[4:] + '\n')
+ if sline == as_bytes('ret'):
+ out.append(as_bytes('retw $2\n'))
+ elif sline == as_bytes('leave'):
+ out.append(as_bytes('movl %ebp, %esp ; popl %ebp\n'))
+ elif sline.startswith(as_bytes('call')):
+ out.append(as_bytes('pushw %ax ; callw') + sline[4:] + as_bytes('\n'))
else:
out.append(line)
infile.close()
outfile = open(outfilename, 'wb')
- outfile.write(''.join(out))
+ outfile.write(as_bytes('').join(out))
outfile.close()
if __name__ == '__main__':
_______________________________________________
SeaBIOS mailing list
[email protected]
http://www.seabios.org/mailman/listinfo/seabios