mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-06-23 15:11:42 +00:00
binman: Support locating an image header
Add support for locating an image header in an image. Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
e1925fa520
commit
2d26003df7
2 changed files with 50 additions and 0 deletions
|
@ -15,6 +15,29 @@ from entry import Entry
|
||||||
import fdt_util
|
import fdt_util
|
||||||
|
|
||||||
IMAGE_HEADER_MAGIC = b'BinM'
|
IMAGE_HEADER_MAGIC = b'BinM'
|
||||||
|
IMAGE_HEADER_LEN = 8
|
||||||
|
|
||||||
|
def LocateHeaderOffset(data):
|
||||||
|
"""Search an image for an image header
|
||||||
|
|
||||||
|
Args:
|
||||||
|
data: Data to search
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Offset of image header in the image, or None if not found
|
||||||
|
"""
|
||||||
|
hdr_pos = data.find(IMAGE_HEADER_MAGIC)
|
||||||
|
if hdr_pos != -1:
|
||||||
|
size = len(data)
|
||||||
|
hdr = data[hdr_pos:hdr_pos + IMAGE_HEADER_LEN]
|
||||||
|
if len(hdr) == IMAGE_HEADER_LEN:
|
||||||
|
offset = struct.unpack('<I', hdr[4:])[0]
|
||||||
|
if hdr_pos == len(data) - IMAGE_HEADER_LEN:
|
||||||
|
pos = size + offset - (1 << 32)
|
||||||
|
else:
|
||||||
|
pos = offset
|
||||||
|
return pos
|
||||||
|
return None
|
||||||
|
|
||||||
class Entry_image_header(Entry):
|
class Entry_image_header(Entry):
|
||||||
"""An entry which contains a pointer to the FDT map
|
"""An entry which contains a pointer to the FDT map
|
||||||
|
|
|
@ -25,6 +25,7 @@ import control
|
||||||
import elf
|
import elf
|
||||||
import fdt
|
import fdt
|
||||||
from etype import fdtmap
|
from etype import fdtmap
|
||||||
|
from etype import image_header
|
||||||
import fdt_util
|
import fdt_util
|
||||||
import fmap_util
|
import fmap_util
|
||||||
import test_util
|
import test_util
|
||||||
|
@ -2282,6 +2283,32 @@ class TestFunctional(unittest.TestCase):
|
||||||
data = self._DoReadFile('005_simple.dts')
|
data = self._DoReadFile('005_simple.dts')
|
||||||
self.assertEqual(None, fdtmap.LocateFdtmap(data))
|
self.assertEqual(None, fdtmap.LocateFdtmap(data))
|
||||||
|
|
||||||
|
def testFindImageHeader(self):
|
||||||
|
"""Test locating a image header"""
|
||||||
|
self._CheckLz4()
|
||||||
|
data = self._DoReadFileDtb('128_decode_image.dts', use_real_dtb=True,
|
||||||
|
update_dtb=True)[0]
|
||||||
|
image = control.images['image']
|
||||||
|
entries = image.GetEntries()
|
||||||
|
entry = entries['fdtmap']
|
||||||
|
# The header should point to the FDT map
|
||||||
|
self.assertEqual(entry.image_pos, image_header.LocateHeaderOffset(data))
|
||||||
|
|
||||||
|
def testFindImageHeaderStart(self):
|
||||||
|
"""Test locating a image header located at the start of an image"""
|
||||||
|
data = self._DoReadFileDtb('117_fdtmap_hdr_start.dts',
|
||||||
|
use_real_dtb=True, update_dtb=True)[0]
|
||||||
|
image = control.images['image']
|
||||||
|
entries = image.GetEntries()
|
||||||
|
entry = entries['fdtmap']
|
||||||
|
# The header should point to the FDT map
|
||||||
|
self.assertEqual(entry.image_pos, image_header.LocateHeaderOffset(data))
|
||||||
|
|
||||||
|
def testFindImageHeaderMissing(self):
|
||||||
|
"""Test failing to locate an image header"""
|
||||||
|
data = self._DoReadFile('005_simple.dts')
|
||||||
|
self.assertEqual(None, image_header.LocateHeaderOffset(data))
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue