Hello,
here you go. Sorry it took me so long to get back to you, I had to
extend my git knowledge first and do some reading of the man pages for
git-am and git-format-patch. And thanks for splitting the patch, I
should have done so myself.
Regarding the bytes/string change: Some things are simply binary data
(i.e. null padding) and there is not much which could be done
differently. If we did not care about older distributions, then using a
bytes literal (b"\0") instead of my as_bytes-replacement
(as_bytes("\0")) would be nicer, but is only available starting with
Python 2.6.
All the object dump parsing code in checkrom.py and layoutrom.py should
only deal with ASCII input. Changing this to strings would probably slim
down the patch considerably since most other changes which transform
literals to bytes are caused by reading bytes and comparing them with
these literals.
I'll take a look at this and send you a revised patch for the
string/bytes change. The first 4 patches seem fine to me.
- Johannes
On 01/12/2014 05:49 PM, Kevin O'Connor wrote:
On Sun, Jan 12, 2014 at 11:51:01AM +0100, Johannes Krampf wrote:
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)
Thanks. I broke up your patches to make them easier to discuss (see
attached). Can you provide a "Signed-off-by" for them?
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'm uncomfortable with the as_bytes/as_str change. I wonder if there
is a way to avoid all the conversions by changing all the symbols to
strings up front, or by just reading/writing the files in ascii mode
instead of binary mode.
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.
-Kevin
>From 27c5024934178bfd2dc3c5459d4858dddc9e75ea Mon Sep 17 00:00:00 2001
From: Johannes Krampf <[email protected]>
Date: Sun, 12 Jan 2014 10:54:22 -0500
Subject: [PATCH 1/5] build: Remove unneccesary semicolons from acpi_extract
scripts.
Signed-off-by: Johannes Krampf <[email protected]>
---
scripts/acpi_extract.py | 66 +++++++++++++++++++-------------------
scripts/acpi_extract_preprocess.py | 10 +++---
2 files changed, 38 insertions(+), 38 deletions(-)
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)):
--
1.8.5.3
>From f2e7d7b9005208be2541958a012a563eae90bca8 Mon Sep 17 00:00:00 2001
From: Johannes Krampf <[email protected]>
Date: Sun, 12 Jan 2014 11:14:54 -0500
Subject: [PATCH 2/5] build: Make print statements in scripts python3
compatible.
Signed-off-by: Johannes Krampf <[email protected]>
---
scripts/checkrom.py | 26 +++++++++++++-------------
scripts/checkstack.py | 12 ++++++------
scripts/checksum.py | 2 +-
scripts/layoutrom.py | 32 ++++++++++++++++----------------
scripts/readserial.py | 4 ++--
5 files changed, 38 insertions(+), 38 deletions(-)
diff --git a/scripts/checkrom.py b/scripts/checkrom.py
index aa3dd0d..e724844 100755
--- a/scripts/checkrom.py
+++ b/scripts/checkrom.py
@@ -40,11 +40,11 @@ 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
@@ -52,17 +52,17 @@ def main():
end = symbols['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
@@ -83,10 +83,10 @@ def main():
# Print statistics
runtimesize = end - symbols['code32init_end'].offset
- print "Total size: %d Fixed: %d Free: %d (used %.1f%% of %dKiB rom)" % (
+ print("Total size: %d Fixed: %d Free: %d (used %.1f%% of %dKiB rom)" % (
datasize, runtimesize, finalsize - datasize
, (datasize / float(finalsize)) * 100.0
- , finalsize / 1024)
+ , finalsize / 1024))
# Write final file
f = open(outfile, 'wb')
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..c0b325d 100755
--- a/scripts/layoutrom.py
+++ b/scripts/layoutrom.py
@@ -76,8 +76,8 @@ def fitSections(sections, fillsections):
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)" % (
+ section.name, section.align))
sys.exit(1)
fixedsections.sort()
firstfixed = fixedsections[0][0]
@@ -106,8 +106,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 +115,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 +130,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
@@ -273,12 +273,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
@@ -458,8 +458,8 @@ def markRuntime(section, sections, chain=[]):
or '.init.' in section.name or section.fileid != '32flat'):
return
if '.data.varinit.' in section.name:
- print "ERROR: %s is VARVERIFY32INIT but used from %s" % (
- section.name, chain)
+ print("ERROR: %s is VARVERIFY32INIT but used from %s" % (
+ section.name, chain))
sys.exit(1)
section.category = '32flat'
# Recursively mark all sections this section points to
diff --git a/scripts/readserial.py b/scripts/readserial.py
index d85392e..5b40fdc 100755
--- a/scripts/readserial.py
+++ b/scripts/readserial.py
@@ -156,11 +156,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:
--
1.8.5.3
>From 394ce29c644cdeb7e47bd883fd13e0b612ba526c Mon Sep 17 00:00:00 2001
From: Johannes Krampf <[email protected]>
Date: Sun, 12 Jan 2014 11:19:22 -0500
Subject: [PATCH 3/5] build: Be explicit that we want integers when dividing
for python3 compat.
Signed-off-by: Johannes Krampf <[email protected]>
---
scripts/buildrom.py | 4 ++--
scripts/checkrom.py | 2 +-
scripts/layoutrom.py | 4 ++--
3 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/scripts/buildrom.py b/scripts/buildrom.py
index f2228ab..36de14e 100755
--- a/scripts/buildrom.py
+++ b/scripts/buildrom.py
@@ -32,10 +32,10 @@ def main():
# 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] + "\0" + data[7:]
# Checksum rom
newsum = (256 - checksum(data)) & 0xff
diff --git a/scripts/checkrom.py b/scripts/checkrom.py
index e724844..30c9db2 100755
--- a/scripts/checkrom.py
+++ b/scripts/checkrom.py
@@ -86,7 +86,7 @@ def main():
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')
diff --git a/scripts/layoutrom.py b/scripts/layoutrom.py
index c0b325d..2f2b189 100755
--- a/scripts/layoutrom.py
+++ b/scripts/layoutrom.py
@@ -46,7 +46,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)
@@ -359,7 +359,7 @@ 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))
outfile = open(out16, 'wb')
--
1.8.5.3
>From 617729b2b5c1eb07d5415eb3b2b3ca0affc86155 Mon Sep 17 00:00:00 2001
From: Johannes Krampf <[email protected]>
Date: Sun, 12 Jan 2014 11:39:57 -0500
Subject: [PATCH 4/5] build: Avoid sort() on unordered classes for python3
compatibility.
Signed-off-by: Johannes Krampf <[email protected]>
---
scripts/layoutrom.py | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/scripts/layoutrom.py b/scripts/layoutrom.py
index 2f2b189..3e57787 100755
--- a/scripts/layoutrom.py
+++ b/scripts/layoutrom.py
@@ -5,6 +5,7 @@
#
# This file may be distributed under the terms of the GNU GPLv3 license.
+import operator
import sys
# LD script headers/trailers
@@ -79,7 +80,7 @@ def fitSections(sections, fillsections):
print("Error: Fixed section %s has non-zero alignment (%d)" % (
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 +95,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)
@@ -308,7 +309,7 @@ def outXRefs(sections, useseg=0, exportsyms=[], forcedelta=0):
def outRelSections(sections, startsym, useseg=0):
sections = [(section.finalloc, section) for section in sections
if section.finalloc is not None]
- sections.sort()
+ sections.sort(key=operator.itemgetter(0))
out = ""
for addr, section in sections:
loc = section.finalloc
--
1.8.5.3
>From 90464ab500e94058fd968f5089b6200bde7a9ff0 Mon Sep 17 00:00:00 2001
From: Johannes Krampf <[email protected]>
Date: Sun, 12 Jan 2014 11:38:30 -0500
Subject: [PATCH 5/5] build: Be careful with unicode and byte strings for
python3 compatibility.
Signed-off-by: Johannes Krampf <[email protected]>
---
scripts/buildrom.py | 6 +-
scripts/checkrom.py | 18 +++--
scripts/layoutrom.py | 188 +++++++++++++++++++++++-----------------------
scripts/python23compat.py | 18 +++++
scripts/readserial.py | 13 +++-
scripts/transdump.py | 5 +-
scripts/vgafixup.py | 16 ++--
7 files changed, 149 insertions(+), 115 deletions(-)
create mode 100644 scripts/python23compat.py
diff --git a/scripts/buildrom.py b/scripts/buildrom.py
index 36de14e..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,7 +28,7 @@ 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
@@ -35,7 +37,7 @@ def main():
data = data[:pcidata + 16] + chr(int(count/512)) + chr(0) + data[pcidata + 18:]
# Fill in size field; clear checksum field
- data = data[:2] + chr(int(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 30c9db2..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')
@@ -48,8 +50,8 @@ def main():
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)" % (
@@ -66,14 +68,14 @@ def main():
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,7 +84,7 @@ def main():
rawdata = checksum(rawdata, tableofs, tablesize, CSUM_FIELD_OFS)
# Print statistics
- runtimesize = end - symbols['code32init_end'].offset
+ 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
@@ -90,7 +92,7 @@ def main():
# 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/layoutrom.py b/scripts/layoutrom.py
index 3e57787..5e3e7f9 100755
--- a/scripts/layoutrom.py
+++ b/scripts/layoutrom.py
@@ -8,15 +8,17 @@
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
@@ -27,7 +29,7 @@ COMMONTRAILER = """
*(COMMON) *(.discard*) *(.eh_frame) *(.note*)
}
}
-"""
+""")
######################################################################
@@ -71,14 +73,14 @@ 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))
+ as_str(section.name), section.align))
sys.exit(1)
fixedsections.sort(key=operator.itemgetter(0))
firstfixed = fixedsections[0][0]
@@ -173,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
@@ -189,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
@@ -252,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))
@@ -290,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
@@ -302,7 +304,7 @@ 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
@@ -310,24 +312,24 @@ def outRelSections(sections, startsym, useseg=0):
sections = [(section.finalloc, section) for section in sections
if section.finalloc is not None]
sections.sort(key=operator.itemgetter(0))
- out = ""
+ 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):
@@ -351,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 ;
@@ -362,19 +364,19 @@ def writeLinkerScripts(li, out16, out32seg, out32flat):
""" % (li.zonelow_base,
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()
@@ -382,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 ;
@@ -431,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()
@@ -456,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:
+ if as_bytes('.data.varinit.') in section.name:
print("ERROR: %s is VARVERIFY32INIT but used from %s" % (
- section.name, chain))
+ 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])
@@ -470,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
@@ -486,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):
@@ -501,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
@@ -541,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]
@@ -570,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
@@ -589,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
@@ -607,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
@@ -650,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
@@ -668,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)
@@ -682,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 5b40fdc..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()
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__':
--
1.8.5.3
_______________________________________________
SeaBIOS mailing list
[email protected]
http://www.seabios.org/mailman/listinfo/seabios