mirror of
https://xff.cz/git/u-boot/
synced 2025-11-01 19:05:51 +01:00
binman: Support updating the dtb in an ELF file
WIth EFI we must embed the devicetree in an ELF image so that it is loaded as part of the executable file. We want it to include the binman definition in there also, which in some cases cannot be created until the ELF (u-boot) is built. Add an option to binman to support writing the updated dtb to the ELF file u-boot.out This is useful with the EFI app, which is always packaged as an ELF file. Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
@@ -309,7 +309,7 @@ class TestFunctional(unittest.TestCase):
|
||||
entry_args=None, images=None, use_real_dtb=False,
|
||||
use_expanded=False, verbosity=None, allow_missing=False,
|
||||
extra_indirs=None, threads=None,
|
||||
test_section_timeout=False):
|
||||
test_section_timeout=False, update_fdt_in_elf=None):
|
||||
"""Run binman with a given test file
|
||||
|
||||
Args:
|
||||
@@ -336,6 +336,7 @@ class TestFunctional(unittest.TestCase):
|
||||
single-threaded)
|
||||
test_section_timeout: True to force the first time to timeout, as
|
||||
used in testThreadTimeout()
|
||||
update_fdt_in_elf: Value to pass with --update-fdt-in-elf=xxx
|
||||
|
||||
Returns:
|
||||
int return code, 0 on success
|
||||
@@ -368,6 +369,8 @@ class TestFunctional(unittest.TestCase):
|
||||
args.append('-a%s=%s' % (arg, value))
|
||||
if allow_missing:
|
||||
args.append('-M')
|
||||
if update_fdt_in_elf:
|
||||
args += ['--update-fdt-in-elf', update_fdt_in_elf]
|
||||
if images:
|
||||
for image in images:
|
||||
args += ['-i', image]
|
||||
@@ -4580,6 +4583,84 @@ class TestFunctional(unittest.TestCase):
|
||||
self.assertIn('read:', stdout.getvalue())
|
||||
self.assertIn('compress:', stdout.getvalue())
|
||||
|
||||
def testUpdateFdtInElf(self):
|
||||
"""Test that we can update the devicetree in an ELF file"""
|
||||
infile = elf_fname = self.ElfTestFile('u_boot_binman_embed')
|
||||
outfile = os.path.join(self._indir, 'u-boot.out')
|
||||
begin_sym = 'dtb_embed_begin'
|
||||
end_sym = 'dtb_embed_end'
|
||||
retcode = self._DoTestFile(
|
||||
'060_fdt_update.dts', update_dtb=True,
|
||||
update_fdt_in_elf=','.join([infile,outfile,begin_sym,end_sym]))
|
||||
self.assertEqual(0, retcode)
|
||||
|
||||
# Check that the output file does in fact contact a dtb with the binman
|
||||
# definition in the correct place
|
||||
syms = elf.GetSymbolFileOffset(infile,
|
||||
['dtb_embed_begin', 'dtb_embed_end'])
|
||||
data = tools.ReadFile(outfile)
|
||||
dtb_data = data[syms['dtb_embed_begin'].offset:
|
||||
syms['dtb_embed_end'].offset]
|
||||
|
||||
dtb = fdt.Fdt.FromData(dtb_data)
|
||||
dtb.Scan()
|
||||
props = self._GetPropTree(dtb, BASE_DTB_PROPS + REPACK_DTB_PROPS)
|
||||
self.assertEqual({
|
||||
'image-pos': 0,
|
||||
'offset': 0,
|
||||
'_testing:offset': 32,
|
||||
'_testing:size': 2,
|
||||
'_testing:image-pos': 32,
|
||||
'section@0/u-boot:offset': 0,
|
||||
'section@0/u-boot:size': len(U_BOOT_DATA),
|
||||
'section@0/u-boot:image-pos': 0,
|
||||
'section@0:offset': 0,
|
||||
'section@0:size': 16,
|
||||
'section@0:image-pos': 0,
|
||||
|
||||
'section@1/u-boot:offset': 0,
|
||||
'section@1/u-boot:size': len(U_BOOT_DATA),
|
||||
'section@1/u-boot:image-pos': 16,
|
||||
'section@1:offset': 16,
|
||||
'section@1:size': 16,
|
||||
'section@1:image-pos': 16,
|
||||
'size': 40
|
||||
}, props)
|
||||
|
||||
def testUpdateFdtInElfInvalid(self):
|
||||
"""Test that invalid args are detected with --update-fdt-in-elf"""
|
||||
with self.assertRaises(ValueError) as e:
|
||||
self._DoTestFile('060_fdt_update.dts', update_fdt_in_elf='fred')
|
||||
self.assertIn("Invalid args ['fred'] to --update-fdt-in-elf",
|
||||
str(e.exception))
|
||||
|
||||
def testUpdateFdtInElfNoSyms(self):
|
||||
"""Test that missing symbols are detected with --update-fdt-in-elf"""
|
||||
infile = elf_fname = self.ElfTestFile('u_boot_binman_embed')
|
||||
outfile = ''
|
||||
begin_sym = 'wrong_begin'
|
||||
end_sym = 'wrong_end'
|
||||
with self.assertRaises(ValueError) as e:
|
||||
self._DoTestFile(
|
||||
'060_fdt_update.dts',
|
||||
update_fdt_in_elf=','.join([infile,outfile,begin_sym,end_sym]))
|
||||
self.assertIn("Expected two symbols 'wrong_begin' and 'wrong_end': got 0:",
|
||||
str(e.exception))
|
||||
|
||||
def testUpdateFdtInElfTooSmall(self):
|
||||
"""Test that an over-large dtb is detected with --update-fdt-in-elf"""
|
||||
infile = elf_fname = self.ElfTestFile('u_boot_binman_embed_sm')
|
||||
outfile = os.path.join(self._indir, 'u-boot.out')
|
||||
begin_sym = 'dtb_embed_begin'
|
||||
end_sym = 'dtb_embed_end'
|
||||
with self.assertRaises(ValueError) as e:
|
||||
self._DoTestFile(
|
||||
'060_fdt_update.dts', update_dtb=True,
|
||||
update_fdt_in_elf=','.join([infile,outfile,begin_sym,end_sym]))
|
||||
self.assertRegex(
|
||||
str(e.exception),
|
||||
"Not enough space in '.*u_boot_binman_embed_sm' for data length.*")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
Reference in New Issue
Block a user