Merge pull request 'Add patches for bios_extract' (#49) from nic3-14159/lbmk:master into master
Reviewed-on: https://codeberg.org/libreboot/lbmk/pulls/49fsdg20230625
commit
0729d6e600
|
@ -0,0 +1,132 @@
|
|||
From d187ceefacc4909c4a3fdb8098878cb9bcd2c198 Mon Sep 17 00:00:00 2001
|
||||
From: Nicholas Chin <nic.c3.14@gmail.com>
|
||||
Date: Fri, 5 May 2023 19:34:29 -0600
|
||||
Subject: [PATCH 1/3] dell_inspiron_1100_unpacker: Fix minor style issues
|
||||
|
||||
- Make indent width consistent
|
||||
- Use spaces around -= operator
|
||||
- Rename variable type to type_id to avoid shadowing the type method,
|
||||
though that method isn't ever used in this program
|
||||
|
||||
Signed-off-by: Nicholas Chin <nic.c3.14@gmail.com>
|
||||
Change-Id: I2d47501845591e228b6c5d61c36ca2edce91d36a
|
||||
---
|
||||
dell_inspiron_1100_unpacker.py | 84 +++++++++++++++++-----------------
|
||||
1 file changed, 42 insertions(+), 42 deletions(-)
|
||||
|
||||
diff --git a/dell_inspiron_1100_unpacker.py b/dell_inspiron_1100_unpacker.py
|
||||
index 3d5adf5..b12059b 100755
|
||||
--- a/dell_inspiron_1100_unpacker.py
|
||||
+++ b/dell_inspiron_1100_unpacker.py
|
||||
@@ -19,7 +19,7 @@ def memcpy(arr1, off1, arr2, off2, count):
|
||||
raise Exception("Trying to write out of bounds")
|
||||
off1 += 1
|
||||
off2 += 1
|
||||
- count -=1
|
||||
+ count -= 1
|
||||
|
||||
# looks like some lzss variation
|
||||
def dell_unpack(indata):
|
||||
@@ -64,58 +64,58 @@ def dell_unpack(indata):
|
||||
return dst.tostring()
|
||||
|
||||
mod_types = {
|
||||
- 0x01: "Main ROM",
|
||||
- 0x0C: "Microcode update",
|
||||
+ 0x01: "Main ROM",
|
||||
+ 0x0C: "Microcode update",
|
||||
}
|
||||
|
||||
print "Dell/Phoenix ROM BIOS PLUS unpacker"
|
||||
if len(sys.argv) < 2:
|
||||
- print "Usage: dell_unpack.py bios.bin [offset]"
|
||||
- sys.exit(1)
|
||||
+ print "Usage: dell_unpack.py bios.bin [offset]"
|
||||
+ sys.exit(1)
|
||||
fname = sys.argv[1]
|
||||
offs = 0
|
||||
f = open(fname, "rb").read()
|
||||
if len(sys.argv) > 2:
|
||||
- offs = int(sys.argv[2], 16)
|
||||
+ offs = int(sys.argv[2], 16)
|
||||
else:
|
||||
- offs = f.find("\xF0\x00Copyright 1985-\x02\x04\xF0\x0F8 Phoenix Technologies Ltd.")
|
||||
- if offs == -1:
|
||||
- print "Does not look like a Dell/Phoenix ROM BIOS PLUS"
|
||||
- sys.exit(2)
|
||||
- if f[offs-5] == '\x01':
|
||||
- hlen = 5 # 32-bit length
|
||||
- offs -= 5
|
||||
- fmt = "<BI"
|
||||
- elif f[offs-3] == '\x01':
|
||||
- hlen = 3 # 16-bit length
|
||||
- offs -= 3
|
||||
- fmt = "<BH"
|
||||
- else:
|
||||
- print "Unhandled format!"
|
||||
- sys.exit(1)
|
||||
- print "Found compressed module at %08X" % offs
|
||||
+ offs = f.find("\xF0\x00Copyright 1985-\x02\x04\xF0\x0F8 Phoenix Technologies Ltd.")
|
||||
+ if offs == -1:
|
||||
+ print "Does not look like a Dell/Phoenix ROM BIOS PLUS"
|
||||
+ sys.exit(2)
|
||||
+ if f[offs-5] == '\x01':
|
||||
+ hlen = 5 # 32-bit length
|
||||
+ offs -= 5
|
||||
+ fmt = "<BI"
|
||||
+ elif f[offs-3] == '\x01':
|
||||
+ hlen = 3 # 16-bit length
|
||||
+ offs -= 3
|
||||
+ fmt = "<BH"
|
||||
+ else:
|
||||
+ print "Unhandled format!"
|
||||
+ sys.exit(1)
|
||||
+ print "Found compressed module at %08X" % offs
|
||||
if offs > 0:
|
||||
fn = "EC.bin"
|
||||
print "%08X EC code, %08X %s" % (0, offs, fn)
|
||||
open(fn, "wb").write(f[:offs])
|
||||
while True:
|
||||
- type, leng = struct.unpack(fmt, f[offs:offs+hlen])
|
||||
- print "%08X type %02X" % (offs, type),
|
||||
- offs += hlen
|
||||
- if type == 0xFF:
|
||||
- print "<end of chain>"
|
||||
- break
|
||||
- data = f[offs:offs+leng]
|
||||
- offs += leng
|
||||
- if type != 0xC:
|
||||
- odata = dell_unpack(data)
|
||||
- else:
|
||||
- odata = data
|
||||
- print " %08X -> %08X" % (leng, len(odata)),
|
||||
- fn = "mod_%02X.bin" % type
|
||||
- print " %s" % fn,
|
||||
- if type in mod_types:
|
||||
- print "(%s)" % mod_types[type]
|
||||
- else:
|
||||
- print ""
|
||||
- open(fn, "wb").write(odata)
|
||||
+ type_id, leng = struct.unpack(fmt, f[offs:offs+hlen])
|
||||
+ print "%08X type %02X" % (offs, type_id),
|
||||
+ offs += hlen
|
||||
+ if type_id == 0xFF:
|
||||
+ print "<end of chain>"
|
||||
+ break
|
||||
+ data = f[offs:offs+leng]
|
||||
+ offs += leng
|
||||
+ if type_id != 0xC:
|
||||
+ odata = dell_unpack(data)
|
||||
+ else:
|
||||
+ odata = data
|
||||
+ print " %08X -> %08X" % (leng, len(odata)),
|
||||
+ fn = "mod_%02X.bin" % type_id
|
||||
+ print " %s" % fn,
|
||||
+ if type_id in mod_types:
|
||||
+ print "(%s)" % mod_types[type_id]
|
||||
+ else:
|
||||
+ print ""
|
||||
+ open(fn, "wb").write(odata)
|
||||
--
|
||||
2.40.1
|
||||
|
|
@ -0,0 +1,105 @@
|
|||
From 34ecbda8cc75eecb747004520c9e0bd6de3c7723 Mon Sep 17 00:00:00 2001
|
||||
From: Nicholas Chin <nic.c3.14@gmail.com>
|
||||
Date: Fri, 5 May 2023 19:35:45 -0600
|
||||
Subject: [PATCH 2/3] dell_inspiron_1100_unpacker: Convert from python 2 to 3
|
||||
|
||||
TEST: The output of the script is the same as the python 2 version when
|
||||
run against the Inspiron 1100 BIOS
|
||||
|
||||
Signed-off-by: Nicholas Chin <nic.c3.14@gmail.com>
|
||||
Change-Id: I2ab9a72bc65121b1106e9867b7d58d1eefb0eb3d
|
||||
---
|
||||
dell_inspiron_1100_unpacker.py | 34 +++++++++++++++++-----------------
|
||||
1 file changed, 17 insertions(+), 17 deletions(-)
|
||||
|
||||
diff --git a/dell_inspiron_1100_unpacker.py b/dell_inspiron_1100_unpacker.py
|
||||
index b12059b..5e43813 100755
|
||||
--- a/dell_inspiron_1100_unpacker.py
|
||||
+++ b/dell_inspiron_1100_unpacker.py
|
||||
@@ -1,4 +1,4 @@
|
||||
-#!/usr/bin/env python2
|
||||
+#!/usr/bin/env python3
|
||||
# Dell/Phoenix ROM BIOS PLUS unpacker
|
||||
# 2012-09-12 version 0.1
|
||||
# 2012-10-10 version 0.2 added support for older BIOSes with 16-bit length (Dell Inspiron 1100)
|
||||
@@ -61,16 +61,16 @@ def dell_unpack(indata):
|
||||
dstoff += count
|
||||
srcoff += count
|
||||
|
||||
- return dst.tostring()
|
||||
+ return dst
|
||||
|
||||
mod_types = {
|
||||
0x01: "Main ROM",
|
||||
0x0C: "Microcode update",
|
||||
}
|
||||
|
||||
-print "Dell/Phoenix ROM BIOS PLUS unpacker"
|
||||
+print("Dell/Phoenix ROM BIOS PLUS unpacker")
|
||||
if len(sys.argv) < 2:
|
||||
- print "Usage: dell_unpack.py bios.bin [offset]"
|
||||
+ print("Usage: dell_unpack.py bios.bin [offset]")
|
||||
sys.exit(1)
|
||||
fname = sys.argv[1]
|
||||
offs = 0
|
||||
@@ -78,32 +78,32 @@ f = open(fname, "rb").read()
|
||||
if len(sys.argv) > 2:
|
||||
offs = int(sys.argv[2], 16)
|
||||
else:
|
||||
- offs = f.find("\xF0\x00Copyright 1985-\x02\x04\xF0\x0F8 Phoenix Technologies Ltd.")
|
||||
+ offs = f.find(b"\xF0\x00Copyright 1985-\x02\x04\xF0\x0F8 Phoenix Technologies Ltd.")
|
||||
if offs == -1:
|
||||
- print "Does not look like a Dell/Phoenix ROM BIOS PLUS"
|
||||
+ print("Does not look like a Dell/Phoenix ROM BIOS PLUS")
|
||||
sys.exit(2)
|
||||
- if f[offs-5] == '\x01':
|
||||
+ if f[offs-5] == 0x01:
|
||||
hlen = 5 # 32-bit length
|
||||
offs -= 5
|
||||
fmt = "<BI"
|
||||
- elif f[offs-3] == '\x01':
|
||||
+ elif f[offs-3] == 0x01:
|
||||
hlen = 3 # 16-bit length
|
||||
offs -= 3
|
||||
fmt = "<BH"
|
||||
else:
|
||||
- print "Unhandled format!"
|
||||
+ print("Unhandled format!")
|
||||
sys.exit(1)
|
||||
- print "Found compressed module at %08X" % offs
|
||||
+ print("Found compressed module at %08X" % offs)
|
||||
if offs > 0:
|
||||
fn = "EC.bin"
|
||||
- print "%08X EC code, %08X %s" % (0, offs, fn)
|
||||
+ print("%08X EC code, %08X %s" % (0, offs, fn))
|
||||
open(fn, "wb").write(f[:offs])
|
||||
while True:
|
||||
type_id, leng = struct.unpack(fmt, f[offs:offs+hlen])
|
||||
- print "%08X type %02X" % (offs, type_id),
|
||||
+ print("%08X type %02X" % (offs, type_id), end=" ")
|
||||
offs += hlen
|
||||
if type_id == 0xFF:
|
||||
- print "<end of chain>"
|
||||
+ print("<end of chain>")
|
||||
break
|
||||
data = f[offs:offs+leng]
|
||||
offs += leng
|
||||
@@ -111,11 +111,11 @@ while True:
|
||||
odata = dell_unpack(data)
|
||||
else:
|
||||
odata = data
|
||||
- print " %08X -> %08X" % (leng, len(odata)),
|
||||
+ print(" %08X -> %08X" % (leng, len(odata)), end=" ")
|
||||
fn = "mod_%02X.bin" % type_id
|
||||
- print " %s" % fn,
|
||||
+ print(" %s" % fn, end=" ")
|
||||
if type_id in mod_types:
|
||||
- print "(%s)" % mod_types[type_id]
|
||||
+ print("(%s)" % mod_types[type_id])
|
||||
else:
|
||||
- print ""
|
||||
+ print("")
|
||||
open(fn, "wb").write(odata)
|
||||
--
|
||||
2.40.1
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
From b3868ed71a390f925eb22b926b9c735f7b84b383 Mon Sep 17 00:00:00 2001
|
||||
From: Nicholas Chin <nic.c3.14@gmail.com>
|
||||
Date: Sat, 6 May 2023 11:14:45 -0600
|
||||
Subject: [PATCH 3/3] dell_inspiron_1100_unpacker: Add module type 0x52
|
||||
|
||||
The module with type 0x52 in the Latitude E6400 BIOS is the EC firmware,
|
||||
and is not compressed. The current behavior tries to decompress this
|
||||
module leading to an index out of bounds error at runtime, so add a new
|
||||
condition to avoid decompressing it. This assumes type 0x52 is always
|
||||
used for EC firmware.
|
||||
|
||||
The current behavior also assumes all the data before the first module
|
||||
is EC firmware, which was probably true for the Inspiron 1100, but for
|
||||
the E6400 the EC firmware is in module 0x52. However, for simplicity an
|
||||
exception is not made for this behavior, so the extracted EC.bin should
|
||||
just be treated as spurious data for the E6400.
|
||||
|
||||
TEST: Inspiron 1100 BIOS is still unpacked correctly, Latitude E6400
|
||||
BIOS unpacks without runtime errors.
|
||||
|
||||
Signed-off-by: Nicholas Chin <nic.c3.14@gmail.com>
|
||||
Change-Id: I3152150b7dea4d79840c61683692c65b1311cce2
|
||||
---
|
||||
dell_inspiron_1100_unpacker.py | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/dell_inspiron_1100_unpacker.py b/dell_inspiron_1100_unpacker.py
|
||||
index 5e43813..3589550 100755
|
||||
--- a/dell_inspiron_1100_unpacker.py
|
||||
+++ b/dell_inspiron_1100_unpacker.py
|
||||
@@ -66,6 +66,7 @@ def dell_unpack(indata):
|
||||
mod_types = {
|
||||
0x01: "Main ROM",
|
||||
0x0C: "Microcode update",
|
||||
+ 0x52: "EC firmware"
|
||||
}
|
||||
|
||||
print("Dell/Phoenix ROM BIOS PLUS unpacker")
|
||||
@@ -107,7 +108,7 @@ while True:
|
||||
break
|
||||
data = f[offs:offs+leng]
|
||||
offs += leng
|
||||
- if type_id != 0xC:
|
||||
+ if type_id != 0xC and type_id != 0x52:
|
||||
odata = dell_unpack(data)
|
||||
else:
|
||||
odata = data
|
||||
--
|
||||
2.40.1
|
||||
|
Loading…
Reference in New Issue