summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/binman/README.entries136
-rw-r--r--tools/binman/control.py15
-rw-r--r--tools/binman/elf.py7
-rw-r--r--tools/binman/elf_test.py57
-rw-r--r--tools/binman/entry.py5
-rw-r--r--tools/binman/entry_test.py5
-rw-r--r--tools/binman/etype/blob.py1
-rw-r--r--tools/binman/etype/blob_dtb.py6
-rw-r--r--tools/binman/etype/cbfs.py5
-rw-r--r--tools/binman/etype/fdtmap.py13
-rw-r--r--tools/binman/etype/files.py5
-rw-r--r--tools/binman/etype/intel_descriptor.py2
-rw-r--r--tools/binman/etype/intel_fit.py32
-rw-r--r--tools/binman/etype/intel_fit_ptr.py41
-rw-r--r--tools/binman/etype/intel_fsp_m.py27
-rw-r--r--tools/binman/etype/intel_ifwi.py68
-rw-r--r--tools/binman/etype/section.py16
-rw-r--r--tools/binman/etype/u_boot_dtb_with_ucode.py5
-rw-r--r--tools/binman/etype/u_boot_spl.py2
-rw-r--r--tools/binman/etype/u_boot_tpl.py2
-rw-r--r--tools/binman/etype/x86_reset16.py29
-rw-r--r--tools/binman/etype/x86_reset16_spl.py29
-rw-r--r--tools/binman/etype/x86_reset16_tpl.py29
-rw-r--r--tools/binman/etype/x86_start16.py15
-rw-r--r--tools/binman/etype/x86_start16_spl.py19
-rw-r--r--tools/binman/etype/x86_start16_tpl.py18
-rw-r--r--tools/binman/ftest.py243
-rw-r--r--tools/binman/test/021_image_pad.dts2
-rw-r--r--tools/binman/test/024_sorted.dts2
-rw-r--r--tools/binman/test/028_pack_4gb_outside.dts2
-rw-r--r--tools/binman/test/029_x86_rom.dts (renamed from tools/binman/test/029_x86-rom.dts)2
-rw-r--r--tools/binman/test/030_x86_rom_me_no_desc.dts (renamed from tools/binman/test/030_x86-rom-me-no-desc.dts)0
-rw-r--r--tools/binman/test/031_x86_rom_me.dts (renamed from tools/binman/test/031_x86-rom-me.dts)0
-rw-r--r--tools/binman/test/032_intel_vga.dts (renamed from tools/binman/test/032_intel-vga.dts)0
-rw-r--r--tools/binman/test/033_x86_start16.dts (renamed from tools/binman/test/033_x86-start16.dts)0
-rw-r--r--tools/binman/test/042_intel_fsp.dts (renamed from tools/binman/test/042_intel-fsp.dts)0
-rw-r--r--tools/binman/test/043_intel_cmc.dts (renamed from tools/binman/test/043_intel-cmc.dts)0
-rw-r--r--tools/binman/test/046_intel_vbt.dts (renamed from tools/binman/test/046_intel-vbt.dts)0
-rw-r--r--tools/binman/test/048_x86_start16_spl.dts (renamed from tools/binman/test/048_x86-start16-spl.dts)0
-rw-r--r--tools/binman/test/053_symbols.dts2
-rw-r--r--tools/binman/test/081_x86_start16_tpl.dts (renamed from tools/binman/test/081_x86-start16-tpl.dts)0
-rw-r--r--tools/binman/test/098_4gb_and_skip_at_start_together.dts (renamed from tools/binman/test/80_4gb_and_skip_at_start_together.dts)0
-rw-r--r--tools/binman/test/111_x86_rom_ifwi.dts (renamed from tools/binman/test/111_x86-rom-ifwi.dts)2
-rw-r--r--tools/binman/test/112_x86_rom_ifwi_nodesc.dts (renamed from tools/binman/test/112_x86-rom-ifwi-nodesc.dts)2
-rw-r--r--tools/binman/test/113_x86_rom_ifwi_nodata.dts (renamed from tools/binman/test/113_x86-rom-ifwi-nodata.dts)2
-rw-r--r--tools/binman/test/144_x86_reset16.dts13
-rw-r--r--tools/binman/test/145_x86_reset16_spl.dts13
-rw-r--r--tools/binman/test/146_x86_reset16_tpl.dts13
-rw-r--r--tools/binman/test/147_intel_fit.dts20
-rw-r--r--tools/binman/test/148_intel_fit_missing.dts17
-rw-r--r--tools/binman/test/149_symbols_tpl.dts28
-rw-r--r--tools/binman/test/150_powerpc_mpc85xx_bootpg_resetvec.dts (renamed from tools/binman/test/81_powerpc_mpc85xx_bootpg_resetvec.dts)0
-rw-r--r--tools/binman/test/151_x86_rom_ifwi_section.dts33
-rw-r--r--tools/binman/test/152_intel_fsp_m.dts14
-rw-r--r--tools/binman/test/Makefile14
-rwxr-xr-xtools/binman/test/bss_databin5020 -> 0 bytes
-rwxr-xr-xtools/binman/test/u_boot_binman_symsbin4924 -> 0 bytes
-rw-r--r--tools/binman/test/u_boot_binman_syms.c1
-rw-r--r--tools/binman/test/u_boot_binman_syms.lds1
-rwxr-xr-xtools/binman/test/u_boot_binman_syms_badbin4890 -> 0 bytes
-rwxr-xr-xtools/binman/test/u_boot_binman_syms_sizebin4825 -> 0 bytes
-rwxr-xr-xtools/binman/test/u_boot_no_ucode_ptrbin4182 -> 0 bytes
-rwxr-xr-xtools/binman/test/u_boot_ucode_ptrbin4175 -> 0 bytes
-rw-r--r--tools/binman/test/u_boot_ucode_ptr.lds3
-rw-r--r--tools/patman/README8
-rw-r--r--tools/patman/commit.py3
-rw-r--r--tools/patman/cros_subprocess.py3
-rw-r--r--tools/patman/patchstream.py64
-rw-r--r--tools/patman/test.py15
-rw-r--r--tools/patman/tools.py23
70 files changed, 928 insertions, 206 deletions
diff --git a/tools/binman/README.entries b/tools/binman/README.entries
index 0f0e367d02..bce2244596 100644
--- a/tools/binman/README.entries
+++ b/tools/binman/README.entries
@@ -391,6 +391,25 @@ See README.x86 for information about x86 binary blobs.
+Entry: intel-fit: Intel Firmware Image Table (FIT)
+--------------------------------------------------
+
+This entry contains a dummy FIT as required by recent Intel CPUs. The FIT
+contains information about the firmware and microcode available in the
+image.
+
+At present binman only supports a basic FIT with no microcode.
+
+
+
+Entry: intel-fit-ptr: Intel Firmware Image Table (FIT) pointer
+--------------------------------------------------------------
+
+This entry contains a pointer to the FIT. It is required to be at address
+0xffffffc0 in the image.
+
+
+
Entry: intel-fsp: Entry containing an Intel Firmware Support Package (FSP) file
-------------------------------------------------------------------------------
@@ -408,6 +427,23 @@ See README.x86 for information about x86 binary blobs.
+Entry: intel-fsp-m: Entry containing Intel Firmware Support Package (FSP) memory init
+-------------------------------------------------------------------------------------
+
+Properties / Entry arguments:
+ - filename: Filename of file to read into entry
+
+This file contains a binary blob which is used on some devices to set up
+SDRAM. U-Boot executes this code in SPL so that it can make full use of
+memory. Documentation is typically not available in sufficient detail to
+allow U-Boot do this this itself..
+
+An example filename is 'fsp_m.bin'
+
+See README.x86 for information about x86 binary blobs.
+
+
+
Entry: intel-ifwi: Entry containing an Intel Integrated Firmware Image (IFWI) file
----------------------------------------------------------------------------------
@@ -432,6 +468,12 @@ The contents of the IFWI are specified by the subnodes of the IFWI node.
Each subnode describes an entry which is placed into the IFWFI with a given
sub-partition (and optional entry name).
+Properties for subnodes:
+ ifwi-subpart - sub-parition to put this entry into, e.g. "IBBP"
+ ifwi-entry - entry name t use, e.g. "IBBL"
+ ifwi-replace - if present, indicates that the item should be replaced
+ in the IFWI. Otherwise it is added.
+
See README.x86 for information about x86 binary blobs.
@@ -931,18 +973,67 @@ and kernel are genuine.
+Entry: x86-reset16: x86 16-bit reset code for U-Boot
+----------------------------------------------------
+
+Properties / Entry arguments:
+ - filename: Filename of u-boot-x86-reset16.bin (default
+ 'u-boot-x86-reset16.bin')
+
+x86 CPUs start up in 16-bit mode, even if they are 32-bit CPUs. This code
+must be placed at a particular address. This entry holds that code. It is
+typically placed at offset CONFIG_RESET_VEC_LOC. The code is responsible
+for jumping to the x86-start16 code, which continues execution.
+
+For 64-bit U-Boot, the 'x86_reset16_spl' entry type is used instead.
+
+
+
+Entry: x86-reset16-spl: x86 16-bit reset code for U-Boot
+--------------------------------------------------------
+
+Properties / Entry arguments:
+ - filename: Filename of u-boot-x86-reset16.bin (default
+ 'u-boot-x86-reset16.bin')
+
+x86 CPUs start up in 16-bit mode, even if they are 32-bit CPUs. This code
+must be placed at a particular address. This entry holds that code. It is
+typically placed at offset CONFIG_RESET_VEC_LOC. The code is responsible
+for jumping to the x86-start16 code, which continues execution.
+
+For 32-bit U-Boot, the 'x86_reset_spl' entry type is used instead.
+
+
+
+Entry: x86-reset16-tpl: x86 16-bit reset code for U-Boot
+--------------------------------------------------------
+
+Properties / Entry arguments:
+ - filename: Filename of u-boot-x86-reset16.bin (default
+ 'u-boot-x86-reset16.bin')
+
+x86 CPUs start up in 16-bit mode, even if they are 32-bit CPUs. This code
+must be placed at a particular address. This entry holds that code. It is
+typically placed at offset CONFIG_RESET_VEC_LOC. The code is responsible
+for jumping to the x86-start16 code, which continues execution.
+
+For 32-bit U-Boot, the 'x86_reset_tpl' entry type is used instead.
+
+
+
Entry: x86-start16: x86 16-bit start-up code for U-Boot
-------------------------------------------------------
Properties / Entry arguments:
- - filename: Filename of u-boot-x86-16bit.bin (default
- 'u-boot-x86-16bit.bin')
+ - filename: Filename of u-boot-x86-start16.bin (default
+ 'u-boot-x86-start16.bin')
x86 CPUs start up in 16-bit mode, even if they are 32-bit CPUs. This code
-must be placed at a particular address. This entry holds that code. It is
-typically placed at offset CONFIG_SYS_X86_START16. The code is responsible
-for changing to 32-bit mode and jumping to U-Boot's entry point, which
-requires 32-bit mode (for 32-bit U-Boot).
+must be placed in the top 64KB of the ROM. The reset code jumps to it. This
+entry holds that code. It is typically placed at offset
+CONFIG_SYS_X86_START16. The code is responsible for changing to 32-bit mode
+and jumping to U-Boot's entry point, which requires 32-bit mode (for 32-bit
+U-Boot).
For 64-bit U-Boot, the 'x86_start16_spl' entry type is used instead.
@@ -952,16 +1043,17 @@ Entry: x86-start16-spl: x86 16-bit start-up code for SPL
--------------------------------------------------------
Properties / Entry arguments:
- - filename: Filename of spl/u-boot-x86-16bit-spl.bin (default
- 'spl/u-boot-x86-16bit-spl.bin')
+ - filename: Filename of spl/u-boot-x86-start16-spl.bin (default
+ 'spl/u-boot-x86-start16-spl.bin')
-x86 CPUs start up in 16-bit mode, even if they are 64-bit CPUs. This code
-must be placed at a particular address. This entry holds that code. It is
-typically placed at offset CONFIG_SYS_X86_START16. The code is responsible
-for changing to 32-bit mode and starting SPL, which in turn changes to
-64-bit mode and jumps to U-Boot (for 64-bit U-Boot).
+x86 CPUs start up in 16-bit mode, even if they are 32-bit CPUs. This code
+must be placed in the top 64KB of the ROM. The reset code jumps to it. This
+entry holds that code. It is typically placed at offset
+CONFIG_SYS_X86_START16. The code is responsible for changing to 32-bit mode
+and jumping to U-Boot's entry point, which requires 32-bit mode (for 32-bit
+U-Boot).
-For 32-bit U-Boot, the 'x86_start16' entry type is used instead.
+For 32-bit U-Boot, the 'x86-start16' entry type is used instead.
@@ -969,15 +1061,17 @@ Entry: x86-start16-tpl: x86 16-bit start-up code for TPL
--------------------------------------------------------
Properties / Entry arguments:
- - filename: Filename of tpl/u-boot-x86-16bit-tpl.bin (default
- 'tpl/u-boot-x86-16bit-tpl.bin')
+ - filename: Filename of tpl/u-boot-x86-start16-tpl.bin (default
+ 'tpl/u-boot-x86-start16-tpl.bin')
-x86 CPUs start up in 16-bit mode, even if they are 64-bit CPUs. This code
-must be placed at a particular address. This entry holds that code. It is
-typically placed at offset CONFIG_SYS_X86_START16. The code is responsible
-for changing to 32-bit mode and starting TPL, which in turn jumps to SPL.
+x86 CPUs start up in 16-bit mode, even if they are 32-bit CPUs. This code
+must be placed in the top 64KB of the ROM. The reset code jumps to it. This
+entry holds that code. It is typically placed at offset
+CONFIG_SYS_X86_START16. The code is responsible for changing to 32-bit mode
+and jumping to U-Boot's entry point, which requires 32-bit mode (for 32-bit
+U-Boot).
-If TPL is not being used, the 'x86_start16_spl or 'x86_start16' entry types
+If TPL is not being used, the 'x86-start16-spl or 'x86-start16' entry types
may be used instead.
diff --git a/tools/binman/control.py b/tools/binman/control.py
index cb51bc2dd4..68ad5fc2c0 100644
--- a/tools/binman/control.py
+++ b/tools/binman/control.py
@@ -15,8 +15,6 @@ import tools
import cbfs_util
import command
import elf
-from image import Image
-import state
import tout
# List of images we plan to create
@@ -113,6 +111,9 @@ def ReadEntry(image_fname, entry_path, decomp=True):
Returns:
data extracted from the entry
"""
+ global Image
+ from image import Image
+
image = Image.FromFile(image_fname)
entry = image.FindEntryPath(entry_path)
return entry.ReadData(decomp)
@@ -436,15 +437,16 @@ def ProcessImage(image, update_fdt, write_map, get_contents=True,
for dtb_item in state.GetAllFdts():
dtb_item.Sync()
dtb_item.Flush()
+ image.WriteSymbols()
sizes_ok = image.ProcessEntryContents()
if sizes_ok:
break
image.ResetForPack()
+ tout.Info('Pack completed after %d pass(es)' % (pack_pass + 1))
if not sizes_ok:
image.Raise('Entries changed size after packing (tried %s passes)' %
passes)
- image.WriteSymbols()
image.BuildImage()
if write_map:
image.WriteMap()
@@ -459,6 +461,9 @@ def Binman(args):
Args:
args: Command line arguments Namespace object
"""
+ global Image
+ global state
+
if args.full_help:
pager = os.getenv('PAGER')
if not pager:
@@ -468,6 +473,10 @@ def Binman(args):
command.Run(pager, fname)
return 0
+ # Put these here so that we can import this module without libfdt
+ from image import Image
+ import state
+
if args.cmd in ['ls', 'extract', 'replace']:
try:
tout.Init(args.verbosity)
diff --git a/tools/binman/elf.py b/tools/binman/elf.py
index af40024cea..7bc7cf61b5 100644
--- a/tools/binman/elf.py
+++ b/tools/binman/elf.py
@@ -49,7 +49,7 @@ def GetSymbols(fname, patterns):
key: Name of symbol
value: Hex value of symbol
"""
- stdout = command.Output('objdump', '-t', fname, raise_on_error=False)
+ stdout = tools.Run('objdump', '-t', fname)
lines = stdout.splitlines()
if patterns:
re_syms = re.compile('|'.join(patterns))
@@ -72,7 +72,7 @@ def GetSymbols(fname, patterns):
parts = rest[7:].split()
section, size = parts[:2]
if len(parts) > 2:
- name = parts[2]
+ name = parts[2] if parts[2] != '.hidden' else parts[3]
syms[name] = Symbol(section, int(value, 16), int(size,16),
flags[1] == 'w')
@@ -221,6 +221,9 @@ SECTIONS
.empty : {
*(.empty)
} :empty
+ /DISCARD/ : {
+ *(.note.gnu.property)
+ }
.note : {
*(.comment)
} :note
diff --git a/tools/binman/elf_test.py b/tools/binman/elf_test.py
index 416e43baf0..c0c11cb340 100644
--- a/tools/binman/elf_test.py
+++ b/tools/binman/elf_test.py
@@ -50,20 +50,53 @@ class FakeSection:
return self.sym_value
+def BuildElfTestFiles(target_dir):
+ """Build ELF files used for testing in binman
+
+ This compiles and links the test files into the specified directory. It the
+ Makefile and source files in the binman test/ directory.
+
+ Args:
+ target_dir: Directory to put the files into
+ """
+ if not os.path.exists(target_dir):
+ os.mkdir(target_dir)
+ testdir = os.path.join(binman_dir, 'test')
+
+ # If binman is involved from the main U-Boot Makefile the -r and -R
+ # flags are set in MAKEFLAGS. This prevents this Makefile from working
+ # correctly. So drop any make flags here.
+ if 'MAKEFLAGS' in os.environ:
+ del os.environ['MAKEFLAGS']
+ tools.Run('make', '-C', target_dir, '-f',
+ os.path.join(testdir, 'Makefile'), 'SRC=%s/' % testdir)
+
+
class TestElf(unittest.TestCase):
@classmethod
- def setUpClass(self):
+ def setUpClass(cls):
+ cls._indir = tempfile.mkdtemp(prefix='elf.')
tools.SetInputDirs(['.'])
+ BuildElfTestFiles(cls._indir)
+
+ @classmethod
+ def tearDownClass(cls):
+ if cls._indir:
+ shutil.rmtree(cls._indir)
+
+ @classmethod
+ def ElfTestFile(cls, fname):
+ return os.path.join(cls._indir, fname)
def testAllSymbols(self):
"""Test that we can obtain a symbol from the ELF file"""
- fname = os.path.join(binman_dir, 'test', 'u_boot_ucode_ptr')
+ fname = self.ElfTestFile('u_boot_ucode_ptr')
syms = elf.GetSymbols(fname, [])
self.assertIn('.ucode', syms)
def testRegexSymbols(self):
"""Test that we can obtain from the ELF file by regular expression"""
- fname = os.path.join(binman_dir, 'test', 'u_boot_ucode_ptr')
+ fname = self.ElfTestFile('u_boot_ucode_ptr')
syms = elf.GetSymbols(fname, ['ucode'])
self.assertIn('.ucode', syms)
syms = elf.GetSymbols(fname, ['missing'])
@@ -84,7 +117,7 @@ class TestElf(unittest.TestCase):
"""Test a symbol which extends outside the entry area is detected"""
entry = FakeEntry(10)
section = FakeSection()
- elf_fname = os.path.join(binman_dir, 'test', 'u_boot_binman_syms')
+ elf_fname = self.ElfTestFile('u_boot_binman_syms')
with self.assertRaises(ValueError) as e:
syms = elf.LookupAndWriteSymbols(elf_fname, entry, section)
self.assertIn('entry_path has offset 4 (size 8) but the contents size '
@@ -98,7 +131,7 @@ class TestElf(unittest.TestCase):
"""
entry = FakeEntry(10)
section = FakeSection()
- elf_fname = os.path.join(binman_dir, 'test', 'u_boot_binman_syms_bad')
+ elf_fname = self.ElfTestFile('u_boot_binman_syms_bad')
self.assertEqual(elf.LookupAndWriteSymbols(elf_fname, entry, section),
None)
@@ -110,7 +143,7 @@ class TestElf(unittest.TestCase):
"""
entry = FakeEntry(10)
section = FakeSection()
- elf_fname = os.path.join(binman_dir, 'test', 'u_boot_binman_syms_size')
+ elf_fname =self.ElfTestFile('u_boot_binman_syms_size')
with self.assertRaises(ValueError) as e:
syms = elf.LookupAndWriteSymbols(elf_fname, entry, section)
self.assertIn('has size 1: only 4 and 8 are supported',
@@ -122,11 +155,11 @@ class TestElf(unittest.TestCase):
This should produce -1 values for all thress symbols, taking up the
first 16 bytes of the image.
"""
- entry = FakeEntry(20)
+ entry = FakeEntry(24)
section = FakeSection(sym_value=None)
- elf_fname = os.path.join(binman_dir, 'test', 'u_boot_binman_syms')
+ elf_fname = self.ElfTestFile('u_boot_binman_syms')
syms = elf.LookupAndWriteSymbols(elf_fname, entry, section)
- self.assertEqual(tools.GetBytes(255, 16) + tools.GetBytes(ord('a'), 4),
+ self.assertEqual(tools.GetBytes(255, 20) + tools.GetBytes(ord('a'), 4),
entry.data)
def testDebug(self):
@@ -135,7 +168,7 @@ class TestElf(unittest.TestCase):
tout.Init(tout.DEBUG)
entry = FakeEntry(20)
section = FakeSection()
- elf_fname = os.path.join(binman_dir, 'test', 'u_boot_binman_syms')
+ elf_fname = self.ElfTestFile('u_boot_binman_syms')
with test_util.capture_sys_output() as (stdout, stderr):
syms = elf.LookupAndWriteSymbols(elf_fname, entry, section)
self.assertTrue(len(stdout.getvalue()) > 0)
@@ -148,7 +181,7 @@ class TestElf(unittest.TestCase):
expected_text = b'1234'
expected_data = b'wxyz'
elf_fname = os.path.join(outdir, 'elf')
- bin_fname = os.path.join(outdir, 'elf')
+ bin_fname = os.path.join(outdir, 'bin')
# Make an Elf file and then convert it to a fkat binary file. This
# should produce the original data.
@@ -178,7 +211,7 @@ class TestElf(unittest.TestCase):
self.assertEqual(elf.ElfInfo(b'\0\0' + expected[2:],
load, entry, len(expected)),
elf.DecodeElf(data, load + 2))
- #shutil.rmtree(outdir)
+ shutil.rmtree(outdir)
if __name__ == '__main__':
diff --git a/tools/binman/entry.py b/tools/binman/entry.py
index fe8e1dd8a5..409c0dca93 100644
--- a/tools/binman/entry.py
+++ b/tools/binman/entry.py
@@ -21,7 +21,6 @@ import os
import sys
import fdt_util
-import state
import tools
from tools import ToHex, ToHexSize
import tout
@@ -71,6 +70,10 @@ class Entry(object):
orig_size: Original size value read from node
"""
def __init__(self, section, etype, node, name_prefix=''):
+ # Put this here to allow entry-docs and help to work without libfdt
+ global state
+ import state
+
self.section = section
self.etype = etype
self._node = node
diff --git a/tools/binman/entry_test.py b/tools/binman/entry_test.py
index cc1fb795da..13f5864516 100644
--- a/tools/binman/entry_test.py
+++ b/tools/binman/entry_test.py
@@ -97,6 +97,11 @@ class TestEntry(unittest.TestCase):
base = entry.Entry.Create(None, self.GetNode(), 'blob-dtb')
self.assertTrue(base.WriteChildData(base))
+ def testReadChildData(self):
+ """Test the ReadChildData() method of the base class"""
+ base = entry.Entry.Create(None, self.GetNode(), 'blob-dtb')
+ self.assertIsNone(base.ReadChildData(base))
+
if __name__ == "__main__":
unittest.main()
diff --git a/tools/binman/etype/blob.py b/tools/binman/etype/blob.py
index d15d0789e5..d34c7b51bf 100644
--- a/tools/binman/etype/blob.py
+++ b/tools/binman/etype/blob.py
@@ -7,7 +7,6 @@
from entry import Entry
import fdt_util
-import state
import tools
import tout
diff --git a/tools/binman/etype/blob_dtb.py b/tools/binman/etype/blob_dtb.py
index 5b559967d7..b2afa064c1 100644
--- a/tools/binman/etype/blob_dtb.py
+++ b/tools/binman/etype/blob_dtb.py
@@ -5,8 +5,6 @@
# Entry-type module for U-Boot device tree files
#
-import state
-
from entry import Entry
from blob import Entry_blob
@@ -18,6 +16,10 @@ class Entry_blob_dtb(Entry_blob):
'state' module.
"""
def __init__(self, section, etype, node):
+ # Put this here to allow entry-docs and help to work without libfdt
+ global state
+ import state
+
Entry_blob.__init__(self, section, etype, node)
def ObtainContents(self):
diff --git a/tools/binman/etype/cbfs.py b/tools/binman/etype/cbfs.py
index 28a9c81a8a..35b78370b2 100644
--- a/tools/binman/etype/cbfs.py
+++ b/tools/binman/etype/cbfs.py
@@ -11,7 +11,6 @@ import cbfs_util
from cbfs_util import CbfsWriter
from entry import Entry
import fdt_util
-import state
class Entry_cbfs(Entry):
"""Entry containing a Coreboot Filesystem (CBFS)
@@ -164,6 +163,10 @@ class Entry_cbfs(Entry):
both of size 1MB.
"""
def __init__(self, section, etype, node):
+ # Put this here to allow entry-docs and help to work without libfdt
+ global state
+ import state
+
Entry.__init__(self, section, etype, node)
self._cbfs_arg = fdt_util.GetString(node, 'cbfs-arch', 'x86')
self._cbfs_entries = OrderedDict()
diff --git a/tools/binman/etype/fdtmap.py b/tools/binman/etype/fdtmap.py
index b1810b9ddb..5dc08b8289 100644
--- a/tools/binman/etype/fdtmap.py
+++ b/tools/binman/etype/fdtmap.py
@@ -8,11 +8,7 @@ This handles putting an FDT into the image with just the information about the
image.
"""
-import libfdt
-
from entry import Entry
-from fdt import Fdt
-import state
import tools
import tout
@@ -80,6 +76,15 @@ class Entry_fdtmap(Entry):
added as necessary. See the binman README.
"""
def __init__(self, section, etype, node):
+ # Put these here to allow entry-docs and help to work without libfdt
+ global libfdt
+ global state
+ global Fdt
+
+ import libfdt
+ import state
+ from fdt import Fdt
+
Entry.__init__(self, section, etype, node)
def _GetFdtmap(self):
diff --git a/tools/binman/etype/files.py b/tools/binman/etype/files.py
index 0068b305f7..3473a2b1ef 100644
--- a/tools/binman/etype/files.py
+++ b/tools/binman/etype/files.py
@@ -11,7 +11,6 @@ import os
from section import Entry_section
import fdt_util
-import state
import tools
@@ -29,6 +28,10 @@ class Entry_files(Entry_section):
at run-time so you can obtain the file positions.
"""
def __init__(self, section, etype, node):
+ # Put this here to allow entry-docs and help to work without libfdt
+ global state
+ import state
+
Entry_section.__init__(self, section, etype, node)
self._pattern = fdt_util.GetString(self._node, 'pattern')
if not self._pattern:
diff --git a/tools/binman/etype/intel_descriptor.py b/tools/binman/etype/intel_descriptor.py
index fb5e889ebf..b6477931d6 100644
--- a/tools/binman/etype/intel_descriptor.py
+++ b/tools/binman/etype/intel_descriptor.py
@@ -2,7 +2,7 @@
# Copyright (c) 2016 Google, Inc
# Written by Simon Glass <sjg@chromium.org>
#
-# Entry-type module for 'u-boot'
+# Entry-type module for Intel flash descriptor
#
import struct
diff --git a/tools/binman/etype/intel_fit.py b/tools/binman/etype/intel_fit.py
new file mode 100644
index 0000000000..23606d27d0
--- /dev/null
+++ b/tools/binman/etype/intel_fit.py
@@ -0,0 +1,32 @@
+# SPDX-License-Identifier: GPL-2.0+
+# Copyright (c) 2016 Google, Inc
+# Written by Simon Glass <sjg@chromium.org>
+#
+# Entry-type module for Intel Firmware Image Table
+#
+
+import struct
+
+from blob import Entry_blob
+
+class Entry_intel_fit(Entry_blob):
+ """Intel Firmware Image Table (FIT)
+
+ This entry contains a dummy FIT as required by recent Intel CPUs. The FIT
+ contains information about the firmware and microcode available in the
+ image.
+
+ At present binman only supports a basic FIT with no microcode.
+ """
+ def __init__(self, section, etype, node):
+ Entry_blob.__init__(self, section, etype, node)
+
+ def ReadNode(self):
+ """Force 16-byte alignment as required by FIT pointer"""
+ Entry_blob.ReadNode(self)
+ self.align = 16
+
+ def ObtainContents(self):
+ data = struct.pack('<8sIHBB', '_FIT_ ', 1, 0x100, 0x80, 0x7d)
+ self.SetContents(data)
+ return True
diff --git a/tools/binman/etype/intel_fit_ptr.py b/tools/binman/etype/intel_fit_ptr.py
new file mode 100644
index 0000000000..148b206c3c
--- /dev/null
+++ b/tools/binman/etype/intel_fit_ptr.py
@@ -0,0 +1,41 @@
+# SPDX-License-Identifier: GPL-2.0+
+# Copyright (c) 2016 Google, Inc
+# Written by Simon Glass <sjg@chromium.org>
+#
+# Entry-type module for a pointer to an Intel Firmware Image Table
+#
+
+import struct
+
+from blob import Entry_blob
+
+class Entry_intel_fit_ptr(Entry_blob):
+ """Intel Firmware Image Table (FIT) pointer
+
+ This entry contains a pointer to the FIT. It is required to be at address
+ 0xffffffc0 in the image.
+ """
+ def __init__(self, section, etype, node):
+ Entry_blob.__init__(self, section, etype, node)
+ if self.HasSibling('intel-fit') is False:
+ self.Raise("'intel-fit-ptr' section must have an 'intel-fit' sibling")
+
+ def _GetContents(self):
+ fit_pos = self.GetSiblingImagePos('intel-fit')
+ return struct.pack('<II', fit_pos or 0, 0)
+
+ def ObtainContents(self):
+ self.SetContents(self._GetContents())
+ return True
+
+ def ProcessContents(self):
+ """Write an updated version of the FIT pointer to this entry
+
+ This is necessary since image_pos is not available when ObtainContents()
+ is called, since by then the entries have not been packed in the image.
+ """
+ return self.ProcessContentsUpdate(self._GetContents())
+
+ def Pack(self, offset):
+ """Special pack method to set the offset to the right place"""
+ return Entry_blob.Pack(self, 0xffffffc0)
diff --git a/tools/binman/etype/intel_fsp_m.py b/tools/binman/etype/intel_fsp_m.py
new file mode 100644
index 0000000000..2d6b2b6621
--- /dev/null
+++ b/tools/binman/etype/intel_fsp_m.py
@@ -0,0 +1,27 @@
+# SPDX-License-Identifier: GPL-2.0+
+# Copyright 2019 Google LLC
+# Written by Simon Glass <sjg@chromium.org>
+#
+# Entry-type module for Intel Firmware Support Package binary blob (T section)
+#
+
+from entry import Entry
+from blob import Entry_blob
+
+class Entry_intel_fsp_m(Entry_blob):
+ """Entry containing Intel Firmware Support Package (FSP) memory init
+
+ Properties / Entry arguments:
+ - filename: Filename of file to read into entry
+
+ This file contains a binary blob which is used on some devices to set up
+ SDRAM. U-Boot executes this code in SPL so that it can make full use of
+ memory. Documentation is typically not available in sufficient detail to
+ allow U-Boot do this this itself..
+
+ An example filename is 'fsp_m.bin'
+
+ See README.x86 for information about x86 binary blobs.
+ """
+ def __init__(self, section, etype, node):
+ Entry_blob.__init__(self, section, etype, node)
diff --git a/tools/binman/etype/intel_ifwi.py b/tools/binman/etype/intel_ifwi.py
index 9cbdf3698a..36aadc210c 100644
--- a/tools/binman/etype/intel_ifwi.py
+++ b/tools/binman/etype/intel_ifwi.py
@@ -36,30 +36,25 @@ class Entry_intel_ifwi(Entry_blob):
Each subnode describes an entry which is placed into the IFWFI with a given
sub-partition (and optional entry name).
+ Properties for subnodes:
+ ifwi-subpart - sub-parition to put this entry into, e.g. "IBBP"
+ ifwi-entry - entry name t use, e.g. "IBBL"
+ ifwi-replace - if present, indicates that the item should be replaced
+ in the IFWI. Otherwise it is added.
+
See README.x86 for information about x86 binary blobs.
"""
def __init__(self, section, etype, node):
Entry_blob.__init__(self, section, etype, node)
self._convert_fit = fdt_util.GetBool(self._node, 'convert-fit')
self._ifwi_entries = OrderedDict()
- self._ReadSubnodes()
-
- def ObtainContents(self):
- """Get the contects for the IFWI
-
- Unfortunately we cannot create anything from scratch here, as Intel has
- tools which create precursor binaries with lots of data and settings,
- and these are not incorporated into binman.
-
- The first step is to get a file in the IFWI format. This is either
- supplied directly or is extracted from a fitimage using the 'create'
- subcommand.
- After that we delete the OBBP sub-partition and add each of the files
- that we want in the IFWI file, one for each sub-entry of the IWFI node.
- """
- self._pathname = tools.GetInputFilename(self._filename)
+ def ReadNode(self):
+ self._ReadSubnodes()
+ Entry_blob.ReadNode(self)
+ def _BuildIfwi(self):
+ """Build the contents of the IFWI and write it to the 'data' property"""
# Create the IFWI file if needed
if self._convert_fit:
inname = self._pathname
@@ -69,33 +64,62 @@ class Entry_intel_ifwi(Entry_blob):
self._pathname = outname
else:
# Provide a different code path here to ensure we have test coverage
- inname = self._pathname
+ outname = self._pathname
# Delete OBBP if it is there, then add the required new items.
- tools.RunIfwiTool(inname, tools.CMD_DELETE, subpart='OBBP')
+ tools.RunIfwiTool(outname, tools.CMD_DELETE, subpart='OBBP')
for entry in self._ifwi_entries.values():
# First get the input data and put it in a file
- if not entry.ObtainContents():
- return False
data = entry.GetData()
uniq = self.GetUniqueName()
input_fname = tools.GetOutputFilename('input.%s' % uniq)
tools.WriteFile(input_fname, data)
- tools.RunIfwiTool(inname,
+ tools.RunIfwiTool(outname,
tools.CMD_REPLACE if entry._ifwi_replace else tools.CMD_ADD,
input_fname, entry._ifwi_subpart, entry._ifwi_entry_name)
self.ReadBlobContents()
return True
+ def ObtainContents(self):
+ """Get the contects for the IFWI
+
+ Unfortunately we cannot create anything from scratch here, as Intel has
+ tools which create precursor binaries with lots of data and settings,
+ and these are not incorporated into binman.
+
+ The first step is to get a file in the IFWI format. This is either
+ supplied directly or is extracted from a fitimage using the 'create'
+ subcommand.
+
+ After that we delete the OBBP sub-partition and add each of the files
+ that we want in the IFWI file, one for each sub-entry of the IWFI node.
+ """
+ self._pathname = tools.GetInputFilename(self._filename)
+ for entry in self._ifwi_entries.values():
+ if not entry.ObtainContents():
+ return False
+ return self._BuildIfwi()
+
+ def ProcessContents(self):
+ orig_data = self.data
+ self._BuildIfwi()
+ same = orig_data == self.data
+ return same
+
def _ReadSubnodes(self):
"""Read the subnodes to find out what should go in this IFWI"""
for node in self._node.subnodes:
entry = Entry.Create(self.section, node)
entry.ReadNode()
- entry._ifwi_replace = fdt_util.GetBool(node, 'replace')
+ entry._ifwi_replace = fdt_util.GetBool(node, 'ifwi-replace')
entry._ifwi_subpart = fdt_util.GetString(node, 'ifwi-subpart')
entry._ifwi_entry_name = fdt_util.GetString(node, 'ifwi-entry')
self._ifwi_entries[entry._ifwi_subpart] = entry
+
+ def WriteSymbols(self, section):
+ """Write symbol values into binary files for access at run time"""
+ for entry in self._ifwi_entries.values():
+ entry.WriteSymbols(self)
diff --git a/tools/binman/etype/section.py b/tools/binman/etype/section.py
index 8179daf562..ab0c42cee0 100644
--- a/tools/binman/etype/section.py
+++ b/tools/binman/etype/section.py
@@ -142,13 +142,19 @@ class Entry_section(Entry):
return self.GetEntryContents()
def GetData(self):
- section_data = tools.GetBytes(self._pad_byte, self.size)
+ section_data = b''
for entry in self._entries.values():
data = entry.GetData()
- base = self.pad_before + entry.offset - self._skip_at_start
- section_data = (section_data[:base] + data +
- section_data[base + len(data):])
+ base = self.pad_before + (entry.offset or 0) - self._skip_at_start
+ pad = base - len(section_data)
+ if pad > 0:
+ section_data += tools.GetBytes(self._pad_byte, pad)
+ section_data += data
+ if self.size:
+ pad = self.size - len(section_data)
+ if pad > 0:
+ section_data += tools.GetBytes(self._pad_byte, pad)
self.Detail('GetData: %d entries, total size %#x' %
(len(self._entries), len(section_data)))
return section_data
@@ -338,6 +344,8 @@ class Entry_section(Entry):
return entry.offset
elif prop_name == 'image_pos':
return entry.image_pos
+ if prop_name == 'size':
+ return entry.size
else:
raise ValueError("%s: No such property '%s'" % (msg, prop_name))
diff --git a/tools/binman/etype/u_boot_dtb_with_ucode.py b/tools/binman/etype/u_boot_dtb_with_ucode.py
index cb6c3730d7..6efd24a9b3 100644
--- a/tools/binman/etype/u_boot_dtb_with_ucode.py
+++ b/tools/binman/etype/u_boot_dtb_with_ucode.py
@@ -7,7 +7,6 @@
from entry import Entry
from blob_dtb import Entry_blob_dtb
-import state
import tools
class Entry_u_boot_dtb_with_ucode(Entry_blob_dtb):
@@ -25,6 +24,10 @@ class Entry_u_boot_dtb_with_ucode(Entry_blob_dtb):
it available to u_boot_ucode.
"""
def __init__(self, section, etype, node):
+ # Put this here to allow entry-docs and help to work without libfdt
+ global state
+ import state
+
Entry_blob_dtb.__init__(self, section, etype, node)
self.ucode_data = b''
self.collate = False
diff --git a/tools/binman/etype/u_boot_spl.py b/tools/binman/etype/u_boot_spl.py
index ab78714c8d..7fedd00021 100644
--- a/tools/binman/etype/u_boot_spl.py
+++ b/tools/binman/etype/u_boot_spl.py
@@ -40,4 +40,4 @@ class Entry_u_boot_spl(Entry_blob):
return 'spl/u-boot-spl.bin'
def WriteSymbols(self, section):
- elf.LookupAndWriteSymbols(self.elf_fname, self, section)
+ elf.LookupAndWriteSymbols(self.elf_fname, self, section.GetImage())
diff --git a/tools/binman/etype/u_boot_tpl.py b/tools/binman/etype/u_boot_tpl.py
index 4d4bb92596..1b69c4f4a7 100644
--- a/tools/binman/etype/u_boot_tpl.py
+++ b/tools/binman/etype/u_boot_tpl.py
@@ -40,4 +40,4 @@ class Entry_u_boot_tpl(Entry_blob):
return 'tpl/u-boot-tpl.bin'
def WriteSymbols(self, section):
- elf.LookupAndWriteSymbols(self.elf_fname, self, section)
+ elf.LookupAndWriteSymbols(self.elf_fname, self, section.GetImage())
diff --git a/tools/binman/etype/x86_reset16.py b/tools/binman/etype/x86_reset16.py
new file mode 100644
index 0000000000..54eb814ea3
--- /dev/null
+++ b/tools/binman/etype/x86_reset16.py
@@ -0,0 +1,29 @@
+# SPDX-License-Identifier: GPL-2.0+
+# Copyright (c) 2016 Google, Inc
+# Written by Simon Glass <sjg@chromium.org>
+#
+# Entry-type module for the 16-bit x86 reset code for U-Boot
+#
+
+from entry import Entry
+from blob import Entry_blob
+
+class Entry_x86_reset16(Entry_blob):
+ """x86 16-bit reset code for U-Boot
+
+ Properties / Entry arguments:
+ - filename: Filename of u-boot-x86-reset16.bin (default
+ 'u-boot-x86-reset16.bin')
+
+ x86 CPUs start up in 16-bit mode, even if they are 32-bit CPUs. This code
+ must be placed at a particular address. This entry holds that code. It is
+ typically placed at offset CONFIG_RESET_VEC_LOC. The code is responsible
+ for jumping to the x86-start16 code, which continues execution.
+
+ For 64-bit U-Boot, the 'x86_reset16_spl' entry type is used instead.
+ """
+ def __init__(self, section, etype, node):
+ Entry_blob.__init__(self, section, etype, node)
+
+ def GetDefaultFilename(self):
+ return 'u-boot-x86-reset16.bin'
diff --git a/tools/binman/etype/x86_reset16_spl.py b/tools/binman/etype/x86_reset16_spl.py
new file mode 100644
index 0000000000..699a0c6bcb
--- /dev/null
+++ b/tools/binman/etype/x86_reset16_spl.py
@@ -0,0 +1,29 @@
+# SPDX-License-Identifier: GPL-2.0+
+# Copyright (c) 2016 Google, Inc
+# Written by Simon Glass <sjg@chromium.org>
+#
+# Entry-type module for the 16-bit x86 reset code for U-Boot
+#
+
+from entry import Entry
+from blob import Entry_blob
+
+class Entry_x86_reset16_spl(Entry_blob):
+ """x86 16-bit reset code for U-Boot
+
+ Properties / Entry arguments:
+ - filename: Filename of u-boot-x86-reset16.bin (default
+ 'u-boot-x86-reset16.bin')
+
+ x86 CPUs start up in 16-bit mode, even if they are 32-bit CPUs. This code
+ must be placed at a particular address. This entry holds that code. It is
+ typically placed at offset CONFIG_RESET_VEC_LOC. The code is responsible
+ for jumping to the x86-start16 code, which continues execution.
+
+ For 32-bit U-Boot, the 'x86_reset_spl' entry type is used instead.
+ """
+ def __init__(self, section, etype, node):
+ Entry_blob.__init__(self, section, etype, node)
+
+ def GetDefaultFilename(self):
+ return 'spl/u-boot-x86-reset16-spl.bin'
diff --git a/tools/binman/etype/x86_reset16_tpl.py b/tools/binman/etype/x86_reset16_tpl.py
new file mode 100644
index 0000000000..4eedb8d601
--- /dev/null
+++ b/tools/binman/etype/x86_reset16_tpl.py
@@ -0,0 +1,29 @@
+# SPDX-License-Identifier: GPL-2.0+
+# Copyright (c) 2016 Google, Inc
+# Written by Simon Glass <sjg@chromium.org>
+#
+# Entry-type module for the 16-bit x86 reset code for U-Boot
+#
+
+from entry import Entry
+from blob import Entry_blob
+
+class Entry_x86_reset16_tpl(Entry_blob):
+ """x86 16-bit reset code for U-Boot
+
+ Properties / Entry arguments:
+ - filename: Filename of u-boot-x86-reset16.bin (default
+ 'u-boot-x86-reset16.bin')
+
+ x86 CPUs start up in 16-bit mode, even if they are 32-bit CPUs. This code
+ must be placed at a particular address. This entry holds that code. It is
+ typically placed at offset CONFIG_RESET_VEC_LOC. The code is responsible
+ for jumping to the x86-start16 code, which continues execution.
+
+ For 32-bit U-Boot, the 'x86_reset_tpl' entry type is used instead.
+ """
+ def __init__(self, section, etype, node):
+ Entry_blob.__init__(self, section, etype, node)
+
+ def GetDefaultFilename(self):
+ return 'tpl/u-boot-x86-reset16-tpl.bin'
diff --git a/tools/binman/etype/x86_start16.py b/tools/binman/etype/x86_start16.py
index 7d32ecd321..6736b692d5 100644
--- a/tools/binman/etype/x86_start16.py
+++ b/tools/binman/etype/x86_start16.py
@@ -12,14 +12,15 @@ class Entry_x86_start16(Entry_blob):
"""x86 16-bit start-up code for U-Boot
Properties / Entry arguments:
- - filename: Filename of u-boot-x86-16bit.bin (default
- 'u-boot-x86-16bit.bin')
+ - filename: Filename of u-boot-x86-start16.bin (default
+ 'u-boot-x86-start16.bin')
x86 CPUs start up in 16-bit mode, even if they are 32-bit CPUs. This code
- must be placed at a particular address. This entry holds that code. It is
- typically placed at offset CONFIG_SYS_X86_START16. The code is responsible
- for changing to 32-bit mode and jumping to U-Boot's entry point, which
- requires 32-bit mode (for 32-bit U-Boot).
+ must be placed in the top 64KB of the ROM. The reset code jumps to it. This
+ entry holds that code. It is typically placed at offset
+ CONFIG_SYS_X86_START16. The code is responsible for changing to 32-bit mode
+ and jumping to U-Boot's entry point, which requires 32-bit mode (for 32-bit
+ U-Boot).
For 64-bit U-Boot, the 'x86_start16_spl' entry type is used instead.
"""
@@ -27,4 +28,4 @@ class Entry_x86_start16(Entry_blob):
Entry_blob.__init__(self, section, etype, node)
def GetDefaultFilename(self):
- return 'u-boot-x86-16bit.bin'
+ return 'u-boot-x86-start16.bin'
diff --git a/tools/binman/etype/x86_start16_spl.py b/tools/binman/etype/x86_start16_spl.py
index d85909e7ae..c8c70639de 100644
--- a/tools/binman/etype/x86_start16_spl.py
+++ b/tools/binman/etype/x86_start16_spl.py
@@ -12,19 +12,20 @@ class Entry_x86_start16_spl(Entry_blob):
"""x86 16-bit start-up code for SPL
Properties / Entry arguments:
- - filename: Filename of spl/u-boot-x86-16bit-spl.bin (default
- 'spl/u-boot-x86-16bit-spl.bin')
+ - filename: Filename of spl/u-boot-x86-start16-spl.bin (default
+ 'spl/u-boot-x86-start16-spl.bin')
- x86 CPUs start up in 16-bit mode, even if they are 64-bit CPUs. This code
- must be placed at a particular address. This entry holds that code. It is
- typically placed at offset CONFIG_SYS_X86_START16. The code is responsible
- for changing to 32-bit mode and starting SPL, which in turn changes to
- 64-bit mode and jumps to U-Boot (for 64-bit U-Boot).
+ x86 CPUs start up in 16-bit mode, even if they are 32-bit CPUs. This code
+ must be placed in the top 64KB of the ROM. The reset code jumps to it. This
+ entry holds that code. It is typically placed at offset
+ CONFIG_SYS_X86_START16. The code is responsible for changing to 32-bit mode
+ and jumping to U-Boot's entry point, which requires 32-bit mode (for 32-bit
+ U-Boot).
- For 32-bit U-Boot, the 'x86_start16' entry type is used instead.
+ For 32-bit U-Boot, the 'x86-start16' entry type is used instead.
"""
def __init__(self, section, etype, node):
Entry_blob.__init__(self, section, etype, node)
def GetDefaultFilename(self):
- return 'spl/u-boot-x86-16bit-spl.bin'
+ return 'spl/u-boot-x86-start16-spl.bin'
diff --git a/tools/binman/etype/x86_start16_tpl.py b/tools/binman/etype/x86_start16_tpl.py
index 46ce169ae0..5261a8adf0 100644
--- a/tools/binman/etype/x86_start16_tpl.py
+++ b/tools/binman/etype/x86_start16_tpl.py
@@ -12,19 +12,21 @@ class Entry_x86_start16_tpl(Entry_blob):
"""x86 16-bit start-up code for TPL
Properties / Entry arguments:
- - filename: Filename of tpl/u-boot-x86-16bit-tpl.bin (default
- 'tpl/u-boot-x86-16bit-tpl.bin')
+ - filename: Filename of tpl/u-boot-x86-start16-tpl.bin (default
+ 'tpl/u-boot-x86-start16-tpl.bin')
- x86 CPUs start up in 16-bit mode, even if they are 64-bit CPUs. This code
- must be placed at a particular address. This entry holds that code. It is
- typically placed at offset CONFIG_SYS_X86_START16. The code is responsible
- for changing to 32-bit mode and starting TPL, which in turn jumps to SPL.
+ x86 CPUs start up in 16-bit mode, even if they are 32-bit CPUs. This code
+ must be placed in the top 64KB of the ROM. The reset code jumps to it. This
+ entry holds that code. It is typically placed at offset
+ CONFIG_SYS_X86_START16. The code is responsible for changing to 32-bit mode
+ and jumping to U-Boot's entry point, which requires 32-bit mode (for 32-bit
+ U-Boot).
- If TPL is not being used, the 'x86_start16_spl or 'x86_start16' entry types
+ If TPL is not being used, the 'x86-start16-spl or 'x86-start16' entry types
may be used instead.
"""
def __init__(self, section, etype, node):
Entry_blob.__init__(self, section, etype, node)
def GetDefaultFilename(self):
- return 'tpl/u-boot-x86-16bit-tpl.bin'
+ return 'tpl/u-boot-x86-start16-tpl.bin'
diff --git a/tools/binman/ftest.py b/tools/binman/ftest.py
index 0f3b70b3bb..7000de9d42 100644
--- a/tools/binman/ftest.py
+++ b/tools/binman/ftest.py
@@ -23,6 +23,7 @@ import cmdline
import command
import control
import elf
+import elf_test
import fdt
from etype import fdtmap
from etype import image_header
@@ -38,8 +39,8 @@ import tout
# Contents of test files, corresponding to different entry types
U_BOOT_DATA = b'1234'
U_BOOT_IMG_DATA = b'img'
-U_BOOT_SPL_DATA = b'56780123456789abcde'
-U_BOOT_TPL_DATA = b'tpl'
+U_BOOT_SPL_DATA = b'56780123456789abcdefghi'
+U_BOOT_TPL_DATA = b'tpl9876543210fedcbazyw'
BLOB_DATA = b'89'
ME_DATA = b'0abcd'
VGA_DATA = b'vga'
@@ -49,6 +50,9 @@ U_BOOT_TPL_DTB_DATA = b'tpldtb'
X86_START16_DATA = b'start16'
X86_START16_SPL_DATA = b'start16spl'
X86_START16_TPL_DATA = b'start16tpl'
+X86_RESET16_DATA = b'reset16'
+X86_RESET16_SPL_DATA = b'reset16spl'
+X86_RESET16_TPL_DATA = b'reset16tpl'
PPC_MPC85XX_BR_DATA = b'ppcmpc85xxbr'
U_BOOT_NODTB_DATA = b'nodtb with microcode pointer somewhere in here'
U_BOOT_SPL_NODTB_DATA = b'splnodtb with microcode pointer somewhere in here'
@@ -68,6 +72,7 @@ FILES_DATA = (b"sorry I'm late\nOh, don't bother apologising, I'm " +
b"sorry you're alive\n")
COMPRESS_DATA = b'compress xxxxxxxxxxxxxxxxxxxxxx data'
REFCODE_DATA = b'refcode'
+FSP_M_DATA = b'fsp_m'
# The expected size for the device tree in some tests
EXTRACT_DTB_SIZE = 0x3c9
@@ -94,16 +99,16 @@ class TestFunctional(unittest.TestCase):
the test/ diurectory.
"""
@classmethod
- def setUpClass(self):
+ def setUpClass(cls):
global entry
import entry
# Handle the case where argv[0] is 'python'
- self._binman_dir = os.path.dirname(os.path.realpath(sys.argv[0]))
- self._binman_pathname = os.path.join(self._binman_dir, 'binman')
+ cls._binman_dir = os.path.dirname(os.path.realpath(sys.argv[0]))
+ cls._binman_pathname = os.path.join(cls._binman_dir, 'binman')
# Create a temporary directory for input files
- self._indir = tempfile.mkdtemp(prefix='binmant.')
+ cls._indir = tempfile.mkdtemp(prefix='binmant.')
# Create some test files
TestFunctional._MakeInputFile('u-boot.bin', U_BOOT_DATA)
@@ -113,13 +118,23 @@ class TestFunctional(unittest.TestCase):
TestFunctional._MakeInputFile('blobfile', BLOB_DATA)
TestFunctional._MakeInputFile('me.bin', ME_DATA)
TestFunctional._MakeInputFile('vga.bin', VGA_DATA)
- self._ResetDtbs()
- TestFunctional._MakeInputFile('u-boot-x86-16bit.bin', X86_START16_DATA)
+ cls._ResetDtbs()
+
TestFunctional._MakeInputFile('u-boot-br.bin', PPC_MPC85XX_BR_DATA)
- TestFunctional._MakeInputFile('spl/u-boot-x86-16bit-spl.bin',
+
+ TestFunctional._MakeInputFile('u-boot-x86-start16.bin', X86_START16_DATA)
+ TestFunctional._MakeInputFile('spl/u-boot-x86-start16-spl.bin',
X86_START16_SPL_DATA)
- TestFunctional._MakeInputFile('tpl/u-boot-x86-16bit-tpl.bin',
+ TestFunctional._MakeInputFile('tpl/u-boot-x86-start16-tpl.bin',
X86_START16_TPL_DATA)
+
+ TestFunctional._MakeInputFile('u-boot-x86-reset16.bin',
+ X86_RESET16_DATA)
+ TestFunctional._MakeInputFile('spl/u-boot-x86-reset16-spl.bin',
+ X86_RESET16_SPL_DATA)
+ TestFunctional._MakeInputFile('tpl/u-boot-x86-reset16-tpl.bin',
+ X86_RESET16_TPL_DATA)
+
TestFunctional._MakeInputFile('u-boot-nodtb.bin', U_BOOT_NODTB_DATA)
TestFunctional._MakeInputFile('spl/u-boot-spl-nodtb.bin',
U_BOOT_SPL_NODTB_DATA)
@@ -133,37 +148,41 @@ class TestFunctional(unittest.TestCase):
TestFunctional._MakeInputDir('devkeys')
TestFunctional._MakeInputFile('bmpblk.bin', BMPBLK_DATA)
TestFunctional._MakeInputFile('refcode.bin', REFCODE_DATA)
+ TestFunctional._MakeInputFile('fsp_m.bin', FSP_M_DATA)
+
+ cls._elf_testdir = os.path.join(cls._indir, 'elftest')
+ elf_test.BuildElfTestFiles(cls._elf_testdir)
# ELF file with a '_dt_ucode_base_size' symbol
- with open(self.TestFile('u_boot_ucode_ptr'), 'rb') as fd:
- TestFunctional._MakeInputFile('u-boot', fd.read())
+ TestFunctional._MakeInputFile('u-boot',
+ tools.ReadFile(cls.ElfTestFile('u_boot_ucode_ptr')))
# Intel flash descriptor file
- with open(self.TestFile('descriptor.bin'), 'rb') as fd:
+ with open(cls.TestFile('descriptor.bin'), 'rb') as fd:
TestFunctional._MakeInputFile('descriptor.bin', fd.read())
- shutil.copytree(self.TestFile('files'),
- os.path.join(self._indir, 'files'))
+ shutil.copytree(cls.TestFile('files'),
+ os.path.join(cls._indir, 'files'))
TestFunctional._MakeInputFile('compress', COMPRESS_DATA)
# Travis-CI may have an old lz4
- self.have_lz4 = True
+ cls.have_lz4 = True
try:
tools.Run('lz4', '--no-frame-crc', '-c',
- os.path.join(self._indir, 'u-boot.bin'))
+ os.path.join(cls._indir, 'u-boot.bin'))
except:
- self.have_lz4 = False
+ cls.have_lz4 = False
@classmethod
- def tearDownClass(self):
+ def tearDownClass(cls):
"""Remove the temporary input directory and its contents"""
- if self.preserve_indir:
- print('Preserving input dir: %s' % self._indir)
+ if cls.preserve_indir:
+ print('Preserving input dir: %s' % cls._indir)
else:
- if self._indir:
- shutil.rmtree(self._indir)
- self._indir = None
+ if cls._indir:
+ shutil.rmtree(cls._indir)
+ cls._indir = None
@classmethod
def setup_test_args(cls, preserve_indir=False, preserve_outdirs=False,
@@ -226,7 +245,7 @@ class TestFunctional(unittest.TestCase):
return tmpdir, updated_fname
@classmethod
- def _ResetDtbs(self):
+ def _ResetDtbs(cls):
TestFunctional._MakeInputFile('u-boot.dtb', U_BOOT_DTB_DATA)
TestFunctional._MakeInputFile('spl/u-boot-spl.dtb', U_BOOT_SPL_DTB_DATA)
TestFunctional._MakeInputFile('tpl/u-boot-tpl.dtb', U_BOOT_TPL_DTB_DATA)
@@ -432,7 +451,7 @@ class TestFunctional(unittest.TestCase):
return self._DoReadFileDtb(fname, use_real_dtb)[0]
@classmethod
- def _MakeInputFile(self, fname, contents):
+ def _MakeInputFile(cls, fname, contents):
"""Create a new test input file, creating directories as needed
Args:
@@ -441,7 +460,7 @@ class TestFunctional(unittest.TestCase):
Returns:
Full pathname of file created
"""
- pathname = os.path.join(self._indir, fname)
+ pathname = os.path.join(cls._indir, fname)
dirname = os.path.dirname(pathname)
if dirname and not os.path.exists(dirname):
os.makedirs(dirname)
@@ -450,7 +469,7 @@ class TestFunctional(unittest.TestCase):
return pathname
@classmethod
- def _MakeInputDir(self, dirname):
+ def _MakeInputDir(cls, dirname):
"""Create a new test input directory, creating directories as needed
Args:
@@ -459,24 +478,38 @@ class TestFunctional(unittest.TestCase):
Returns:
Full pathname of directory created
"""
- pathname = os.path.join(self._indir, dirname)
+ pathname = os.path.join(cls._indir, dirname)
if not os.path.exists(pathname):
os.makedirs(pathname)
return pathname
@classmethod
- def _SetupSplElf(self, src_fname='bss_data'):
+ def _SetupSplElf(cls, src_fname='bss_data'):
"""Set up an ELF file with a '_dt_ucode_base_size' symbol
Args:
Filename of ELF file to use as SPL
"""
- with open(self.TestFile(src_fname), 'rb') as fd:
- TestFunctional._MakeInputFile('spl/u-boot-spl', fd.read())
+ TestFunctional._MakeInputFile('spl/u-boot-spl',
+ tools.ReadFile(cls.ElfTestFile(src_fname)))
@classmethod
- def TestFile(self, fname):
- return os.path.join(self._binman_dir, 'test', fname)
+ def _SetupTplElf(cls, src_fname='bss_data'):
+ """Set up an ELF file with a '_dt_ucode_base_size' symbol
+
+ Args:
+ Filename of ELF file to use as TPL
+ """
+ TestFunctional._MakeInputFile('tpl/u-boot-tpl',
+ tools.ReadFile(cls.ElfTestFile(src_fname)))
+
+ @classmethod
+ def TestFile(cls, fname):
+ return os.path.join(cls._binman_dir, 'test', fname)
+
+ @classmethod
+ def ElfTestFile(cls, fname):
+ return os.path.join(cls._elf_testdir, fname)
def AssertInList(self, grep_list, target):
"""Assert that at least one of a list of things is in a target
@@ -875,7 +908,7 @@ class TestFunctional(unittest.TestCase):
"""Test that the end-at-4gb and skip-at-size property can't be used
together"""
with self.assertRaises(ValueError) as e:
- self._DoTestFile('80_4gb_and_skip_at_start_together.dts')
+ self._DoTestFile('098_4gb_and_skip_at_start_together.dts')
self.assertIn("Image '/binman': Provide either 'end-at-4gb' or "
"'skip-at-start'", str(e.exception))
@@ -890,29 +923,29 @@ class TestFunctional(unittest.TestCase):
def testPackX86Rom(self):
"""Test that a basic x86 ROM can be created"""
self._SetupSplElf()
- data = self._DoReadFile('029_x86-rom.dts')
- self.assertEqual(U_BOOT_DATA + tools.GetBytes(0, 7) + U_BOOT_SPL_DATA +
+ data = self._DoReadFile('029_x86_rom.dts')
+ self.assertEqual(U_BOOT_DATA + tools.GetBytes(0, 3) + U_BOOT_SPL_DATA +
tools.GetBytes(0, 2), data)
def testPackX86RomMeNoDesc(self):
"""Test that an invalid Intel descriptor entry is detected"""
TestFunctional._MakeInputFile('descriptor.bin', b'')
with self.assertRaises(ValueError) as e:
- self._DoTestFile('031_x86-rom-me.dts')
+ self._DoTestFile('031_x86_rom_me.dts')
self.assertIn("Node '/binman/intel-descriptor': Cannot find Intel Flash Descriptor (FD) signature",
str(e.exception))
def testPackX86RomBadDesc(self):
"""Test that the Intel requires a descriptor entry"""
with self.assertRaises(ValueError) as e:
- self._DoTestFile('030_x86-rom-me-no-desc.dts')
+ self._DoTestFile('030_x86_rom_me_no_desc.dts')
self.assertIn("Node '/binman/intel-me': No offset set with "
"offset-unset: should another entry provide this correct "
"offset?", str(e.exception))
def testPackX86RomMe(self):
"""Test that an x86 ROM with an ME region can be created"""
- data = self._DoReadFile('031_x86-rom-me.dts')
+ data = self._DoReadFile('031_x86_rom_me.dts')
expected_desc = tools.ReadFile(self.TestFile('descriptor.bin'))
if data[:0x1000] != expected_desc:
self.fail('Expected descriptor binary at start of image')
@@ -920,18 +953,18 @@ class TestFunctional(unittest.TestCase):
def testPackVga(self):
"""Test that an image with a VGA binary can be created"""
- data = self._DoReadFile('032_intel-vga.dts')
+ data = self._DoReadFile('032_intel_vga.dts')
self.assertEqual(VGA_DATA, data[:len(VGA_DATA)])
def testPackStart16(self):
"""Test that an image with an x86 start16 region can be created"""
- data = self._DoReadFile('033_x86-start16.dts')
+ data = self._DoReadFile('033_x86_start16.dts')
self.assertEqual(X86_START16_DATA, data[:len(X86_START16_DATA)])
def testPackPowerpcMpc85xxBootpgResetvec(self):
"""Test that an image with powerpc-mpc85xx-bootpg-resetvec can be
created"""
- data = self._DoReadFile('81_powerpc_mpc85xx_bootpg_resetvec.dts')
+ data = self._DoReadFile('150_powerpc_mpc85xx_bootpg_resetvec.dts')
self.assertEqual(PPC_MPC85XX_BR_DATA, data[:len(PPC_MPC85XX_BR_DATA)])
def _RunMicrocodeTest(self, dts_fname, nodtb_data, ucode_second=False):
@@ -1066,8 +1099,8 @@ class TestFunctional(unittest.TestCase):
"""Test that a U-Boot binary without the microcode symbol is detected"""
# ELF file without a '_dt_ucode_base_size' symbol
try:
- with open(self.TestFile('u_boot_no_ucode_ptr'), 'rb') as fd:
- TestFunctional._MakeInputFile('u-boot', fd.read())
+ TestFunctional._MakeInputFile('u-boot',
+ tools.ReadFile(self.ElfTestFile('u_boot_no_ucode_ptr')))
with self.assertRaises(ValueError) as e:
self._RunPackUbootSingleMicrocode()
@@ -1076,8 +1109,8 @@ class TestFunctional(unittest.TestCase):
finally:
# Put the original file back
- with open(self.TestFile('u_boot_ucode_ptr'), 'rb') as fd:
- TestFunctional._MakeInputFile('u-boot', fd.read())
+ TestFunctional._MakeInputFile('u-boot',
+ tools.ReadFile(self.ElfTestFile('u_boot_ucode_ptr')))
def testMicrocodeNotInImage(self):
"""Test that microcode must be placed within the image"""
@@ -1089,8 +1122,8 @@ class TestFunctional(unittest.TestCase):
def testWithoutMicrocode(self):
"""Test that we can cope with an image without microcode (e.g. qemu)"""
- with open(self.TestFile('u_boot_no_ucode_ptr'), 'rb') as fd:
- TestFunctional._MakeInputFile('u-boot', fd.read())
+ TestFunctional._MakeInputFile('u-boot',
+ tools.ReadFile(self.ElfTestFile('u_boot_no_ucode_ptr')))
data, dtb, _, _ = self._DoReadFileDtb('044_x86_optional_ucode.dts', True)
# Now check the device tree has no microcode
@@ -1113,17 +1146,17 @@ class TestFunctional(unittest.TestCase):
def testPackFsp(self):
"""Test that an image with a FSP binary can be created"""
- data = self._DoReadFile('042_intel-fsp.dts')
+ data = self._DoReadFile('042_intel_fsp.dts')
self.assertEqual(FSP_DATA, data[:len(FSP_DATA)])
def testPackCmc(self):
"""Test that an image with a CMC binary can be created"""
- data = self._DoReadFile('043_intel-cmc.dts')
+ data = self._DoReadFile('043_intel_cmc.dts')
self.assertEqual(CMC_DATA, data[:len(CMC_DATA)])
def testPackVbt(self):
"""Test that an image with a VBT binary can be created"""
- data = self._DoReadFile('046_intel-vbt.dts')
+ data = self._DoReadFile('046_intel_vbt.dts')
self.assertEqual(VBT_DATA, data[:len(VBT_DATA)])
def testSplBssPad(self):
@@ -1144,7 +1177,7 @@ class TestFunctional(unittest.TestCase):
def testPackStart16Spl(self):
"""Test that an image with an x86 start16 SPL region can be created"""
- data = self._DoReadFile('048_x86-start16-spl.dts')
+ data = self._DoReadFile('048_x86_start16_spl.dts')
self.assertEqual(X86_START16_SPL_DATA, data[:len(X86_START16_SPL_DATA)])
def _PackUbootSplMicrocode(self, dts, ucode_second=False):
@@ -1198,17 +1231,17 @@ class TestFunctional(unittest.TestCase):
def testSymbols(self):
"""Test binman can assign symbols embedded in U-Boot"""
- elf_fname = self.TestFile('u_boot_binman_syms')
+ elf_fname = self.ElfTestFile('u_boot_binman_syms')
syms = elf.GetSymbols(elf_fname, ['binman', 'image'])
addr = elf.GetSymbolAddress(elf_fname, '__image_copy_start')
self.assertEqual(syms['_binman_u_boot_spl_prop_offset'].address, addr)
self._SetupSplElf('u_boot_binman_syms')
data = self._DoReadFile('053_symbols.dts')
- sym_values = struct.pack('<LQL', 0x24 + 0, 0x24 + 24, 0x24 + 20)
- expected = (sym_values + U_BOOT_SPL_DATA[16:] +
+ sym_values = struct.pack('<LQLL', 0, 28, 24, 4)
+ expected = (sym_values + U_BOOT_SPL_DATA[20:] +
tools.GetBytes(0xff, 1) + U_BOOT_DATA + sym_values +
- U_BOOT_SPL_DATA[16:])
+ U_BOOT_SPL_DATA[20:])
self.assertEqual(expected, data)
def testPackUnitAddress(self):
@@ -1536,10 +1569,9 @@ class TestFunctional(unittest.TestCase):
"'other'", str(e.exception))
def testTpl(self):
- """Test that an image with TPL and ots device tree can be created"""
+ """Test that an image with TPL and its device tree can be created"""
# ELF file with a '__bss_size' symbol
- with open(self.TestFile('bss_data'), 'rb') as fd:
- TestFunctional._MakeInputFile('tpl/u-boot-tpl', fd.read())
+ self._SetupTplElf()
data = self._DoReadFile('078_u_boot_tpl.dts')
self.assertEqual(U_BOOT_TPL_DATA + U_BOOT_TPL_DTB_DATA, data)
@@ -1564,7 +1596,7 @@ class TestFunctional(unittest.TestCase):
def testPackStart16Tpl(self):
"""Test that an image with an x86 start16 TPL region can be created"""
- data = self._DoReadFile('081_x86-start16-tpl.dts')
+ data = self._DoReadFile('081_x86_start16_tpl.dts')
self.assertEqual(X86_START16_TPL_DATA, data[:len(X86_START16_TPL_DATA)])
def testSelectImage(self):
@@ -1636,8 +1668,6 @@ class TestFunctional(unittest.TestCase):
# source file (e.g. test/075_fdt_update_all.dts) thus does not enter
# binman as a file called u-boot.dtb. To fix this, copy the file
# over to the expected place.
- #tools.WriteFile(os.path.join(self._indir, 'u-boot.dtb'),
- #tools.ReadFile(tools.GetOutputFilename('source.dtb')))
start = 0
for fname in ['u-boot.dtb.out', 'spl/u-boot-spl.dtb.out',
'tpl/u-boot-tpl.dtb.out']:
@@ -1793,8 +1823,7 @@ class TestFunctional(unittest.TestCase):
u-boot-tpl.dtb with the microcode removed
the microcode
"""
- with open(self.TestFile('u_boot_ucode_ptr'), 'rb') as fd:
- TestFunctional._MakeInputFile('tpl/u-boot-tpl', fd.read())
+ self._SetupTplElf('u_boot_ucode_ptr')
first, pos_and_size = self._RunMicrocodeTest('093_x86_tpl_ucode.dts',
U_BOOT_TPL_NODTB_DATA)
self.assertEqual(b'tplnodtb with microc' + pos_and_size +
@@ -1848,16 +1877,15 @@ class TestFunctional(unittest.TestCase):
def testElf(self):
"""Basic test of ELF entries"""
self._SetupSplElf()
- with open(self.TestFile('bss_data'), 'rb') as fd:
- TestFunctional._MakeInputFile('tpl/u-boot-tpl', fd.read())
- with open(self.TestFile('bss_data'), 'rb') as fd:
+ self._SetupTplElf()
+ with open(self.ElfTestFile('bss_data'), 'rb') as fd:
TestFunctional._MakeInputFile('-boot', fd.read())
data = self._DoReadFile('096_elf.dts')
def testElfStrip(self):
"""Basic test of ELF entries"""
self._SetupSplElf()
- with open(self.TestFile('bss_data'), 'rb') as fd:
+ with open(self.ElfTestFile('bss_data'), 'rb') as fd:
TestFunctional._MakeInputFile('-boot', fd.read())
data = self._DoReadFile('097_elf_strip.dts')
@@ -2008,6 +2036,7 @@ class TestFunctional(unittest.TestCase):
fname: Filename of input file to provide (fitimage.bin or ifwi.bin)
"""
self._SetupSplElf()
+ self._SetupTplElf()
# Intel Integrated Firmware Image (IFWI) file
with gzip.open(self.TestFile('%s.gz' % fname), 'rb') as fd:
@@ -2031,25 +2060,25 @@ class TestFunctional(unittest.TestCase):
subpart='IBBP', entry_name='IBBL')
tpl_data = tools.ReadFile(tpl_fname)
- self.assertEqual(tpl_data[:len(U_BOOT_TPL_DATA)], U_BOOT_TPL_DATA)
+ self.assertEqual(U_BOOT_TPL_DATA, tpl_data[:len(U_BOOT_TPL_DATA)])
def testPackX86RomIfwi(self):
"""Test that an x86 ROM with Integrated Firmware Image can be created"""
self._SetupIfwi('fitimage.bin')
- data = self._DoReadFile('111_x86-rom-ifwi.dts')
+ data = self._DoReadFile('111_x86_rom_ifwi.dts')
self._CheckIfwi(data)
def testPackX86RomIfwiNoDesc(self):
"""Test that an x86 ROM with IFWI can be created from an ifwi.bin file"""
self._SetupIfwi('ifwi.bin')
- data = self._DoReadFile('112_x86-rom-ifwi-nodesc.dts')
+ data = self._DoReadFile('112_x86_rom_ifwi_nodesc.dts')
self._CheckIfwi(data)
def testPackX86RomIfwiNoData(self):
"""Test that an x86 ROM with IFWI handles missing data"""
self._SetupIfwi('ifwi.bin')
with self.assertRaises(ValueError) as e:
- data = self._DoReadFile('113_x86-rom-ifwi-nodata.dts')
+ data = self._DoReadFile('113_x86_rom_ifwi_nodata.dts')
self.assertIn('Could not complete processing of contents',
str(e.exception))
@@ -3236,6 +3265,74 @@ class TestFunctional(unittest.TestCase):
self.assertIn('Must specify exactly one entry path to write with -f',
str(e.exception))
+ def testPackReset16(self):
+ """Test that an image with an x86 reset16 region can be created"""
+ data = self._DoReadFile('144_x86_reset16.dts')
+ self.assertEqual(X86_RESET16_DATA, data[:len(X86_RESET16_DATA)])
+
+ def testPackReset16Spl(self):
+ """Test that an image with an x86 reset16-spl region can be created"""
+ data = self._DoReadFile('145_x86_reset16_spl.dts')
+ self.assertEqual(X86_RESET16_SPL_DATA, data[:len(X86_RESET16_SPL_DATA)])
+
+ def testPackReset16Tpl(self):
+ """Test that an image with an x86 reset16-tpl region can be created"""
+ data = self._DoReadFile('146_x86_reset16_tpl.dts')
+ self.assertEqual(X86_RESET16_TPL_DATA, data[:len(X86_RESET16_TPL_DATA)])
+
+ def testPackIntelFit(self):
+ """Test that an image with an Intel FIT and pointer can be created"""
+ data = self._DoReadFile('147_intel_fit.dts')
+ self.assertEqual(U_BOOT_DATA, data[:len(U_BOOT_DATA)])
+ fit = data[16:32];
+ self.assertEqual(b'_FIT_ \x01\x00\x00\x00\x00\x01\x80}' , fit)
+ ptr = struct.unpack('<i', data[0x40:0x44])[0]
+
+ image = control.images['image']
+ entries = image.GetEntries()
+ expected_ptr = entries['intel-fit'].image_pos - (1 << 32)
+ self.assertEqual(expected_ptr, ptr)
+
+ def testPackIntelFitMissing(self):
+ """Test detection of a FIT pointer with not FIT region"""
+ with self.assertRaises(ValueError) as e:
+ self._DoReadFile('148_intel_fit_missing.dts')
+ self.assertIn("'intel-fit-ptr' section must have an 'intel-fit' sibling",
+ str(e.exception))
+
+ def testSymbolsTplSection(self):
+ """Test binman can assign symbols embedded in U-Boot TPL in a section"""
+ self._SetupSplElf('u_boot_binman_syms')
+ self._SetupTplElf('u_boot_binman_syms')
+ data = self._DoReadFile('149_symbols_tpl.dts')
+ sym_values = struct.pack('<LQLL', 4, 0x1c, 0x34, 4)
+ upto1 = 4 + len(U_BOOT_SPL_DATA)
+ expected1 = tools.GetBytes(0xff, 4) + sym_values + U_BOOT_SPL_DATA[20:]
+ self.assertEqual(expected1, data[:upto1])
+
+ upto2 = upto1 + 1 + len(U_BOOT_SPL_DATA)
+ expected2 = tools.GetBytes(0xff, 1) + sym_values + U_BOOT_SPL_DATA[20:]
+ self.assertEqual(expected2, data[upto1:upto2])
+
+ upto3 = 0x34 + len(U_BOOT_DATA)
+ expected3 = tools.GetBytes(0xff, 1) + U_BOOT_DATA
+ self.assertEqual(expected3, data[upto2:upto3])
+
+ expected4 = sym_values + U_BOOT_TPL_DATA[20:]
+ self.assertEqual(expected4, data[upto3:])
+
+ def testPackX86RomIfwiSectiom(self):
+ """Test that a section can be placed in an IFWI region"""
+ self._SetupIfwi('fitimage.bin')
+ data = self._DoReadFile('151_x86_rom_ifwi_section.dts')
+ self._CheckIfwi(data)
+
+ def testPackFspM(self):
+ """Test that an image with a FSP memory-init binary can be created"""
+ data = self._DoReadFile('152_intel_fsp_m.dts')
+ self.assertEqual(FSP_M_DATA, data[:len(FSP_M_DATA)])
+
+
if __name__ == "__main__":
unittest.main()
diff --git a/tools/binman/test/021_image_pad.dts b/tools/binman/test/021_image_pad.dts
index c6516689d9..1ff8dab296 100644
--- a/tools/binman/test/021_image_pad.dts
+++ b/tools/binman/test/021_image_pad.dts
@@ -10,7 +10,7 @@
};
u-boot {
- offset = <20>;
+ offset = <24>;
};
};
};
diff --git a/tools/binman/test/024_sorted.dts b/tools/binman/test/024_sorted.dts
index d35d39f077..b79d9adf68 100644
--- a/tools/binman/test/024_sorted.dts
+++ b/tools/binman/test/024_sorted.dts
@@ -7,7 +7,7 @@
binman {
sort-by-offset;
u-boot {
- offset = <22>;
+ offset = <26>;
};
u-boot-spl {
diff --git a/tools/binman/test/028_pack_4gb_outside.dts b/tools/binman/test/028_pack_4gb_outside.dts
index 2216abfb70..11a1f6059e 100644
--- a/tools/binman/test/028_pack_4gb_outside.dts
+++ b/tools/binman/test/028_pack_4gb_outside.dts
@@ -13,7 +13,7 @@
};
u-boot-spl {
- offset = <0xffffffeb>;
+ offset = <0xffffffe7>;
};
};
};
diff --git a/tools/binman/test/029_x86-rom.dts b/tools/binman/test/029_x86_rom.dts
index d5c69f9d4a..88aa007bba 100644
--- a/tools/binman/test/029_x86-rom.dts
+++ b/tools/binman/test/029_x86_rom.dts
@@ -13,7 +13,7 @@
};
u-boot-spl {
- offset = <0xffffffeb>;
+ offset = <0xffffffe7>;
};
};
};
diff --git a/tools/binman/test/030_x86-rom-me-no-desc.dts b/tools/binman/test/030_x86_rom_me_no_desc.dts
index 796cb87afc..796cb87afc 100644
--- a/tools/binman/test/030_x86-rom-me-no-desc.dts
+++ b/tools/binman/test/030_x86_rom_me_no_desc.dts
diff --git a/tools/binman/test/031_x86-rom-me.dts b/tools/binman/test/031_x86_rom_me.dts
index b8b0a5a74b..b8b0a5a74b 100644
--- a/tools/binman/test/031_x86-rom-me.dts
+++ b/tools/binman/test/031_x86_rom_me.dts
diff --git a/tools/binman/test/032_intel-vga.dts b/tools/binman/test/032_intel_vga.dts
index 9c532d03d3..9c532d03d3 100644
--- a/tools/binman/test/032_intel-vga.dts
+++ b/tools/binman/test/032_intel_vga.dts
diff --git a/tools/binman/test/033_x86-start16.dts b/tools/binman/test/033_x86_start16.dts
index 2e279dee9d..2e279dee9d 100644
--- a/tools/binman/test/033_x86-start16.dts
+++ b/tools/binman/test/033_x86_start16.dts
diff --git a/tools/binman/test/042_intel-fsp.dts b/tools/binman/test/042_intel_fsp.dts
index 8a7c889251..8a7c889251 100644
--- a/tools/binman/test/042_intel-fsp.dts
+++ b/tools/binman/test/042_intel_fsp.dts
diff --git a/tools/binman/test/043_intel-cmc.dts b/tools/binman/test/043_intel_cmc.dts
index 5a56c7d881..5a56c7d881 100644
--- a/tools/binman/test/043_intel-cmc.dts
+++ b/tools/binman/test/043_intel_cmc.dts
diff --git a/tools/binman/test/046_intel-vbt.dts b/tools/binman/test/046_intel_vbt.dts
index 733f5751d5..733f5751d5 100644
--- a/tools/binman/test/046_intel-vbt.dts
+++ b/tools/binman/test/046_intel_vbt.dts
diff --git a/tools/binman/test/048_x86-start16-spl.dts b/tools/binman/test/048_x86_start16_spl.dts
index e2009f15f0..e2009f15f0 100644
--- a/tools/binman/test/048_x86-start16-spl.dts
+++ b/tools/binman/test/048_x86_start16_spl.dts
diff --git a/tools/binman/test/053_symbols.dts b/tools/binman/test/053_symbols.dts
index 9f135676cb..8af575158f 100644
--- a/tools/binman/test/053_symbols.dts
+++ b/tools/binman/test/053_symbols.dts
@@ -10,7 +10,7 @@
};
u-boot {
- offset = <20>;
+ offset = <24>;
};
u-boot-spl2 {
diff --git a/tools/binman/test/081_x86-start16-tpl.dts b/tools/binman/test/081_x86_start16_tpl.dts
index 68e6bbd68f..68e6bbd68f 100644
--- a/tools/binman/test/081_x86-start16-tpl.dts
+++ b/tools/binman/test/081_x86_start16_tpl.dts
diff --git a/tools/binman/test/80_4gb_and_skip_at_start_together.dts b/tools/binman/test/098_4gb_and_skip_at_start_together.dts
index 90c467d910..90c467d910 100644
--- a/tools/binman/test/80_4gb_and_skip_at_start_together.dts
+++ b/tools/binman/test/098_4gb_and_skip_at_start_together.dts
diff --git a/tools/binman/test/111_x86-rom-ifwi.dts b/tools/binman/test/111_x86_rom_ifwi.dts
index 63b5972cc8..c0ba4f2ea4 100644
--- a/tools/binman/test/111_x86-rom-ifwi.dts
+++ b/tools/binman/test/111_x86_rom_ifwi.dts
@@ -20,7 +20,7 @@
convert-fit;
u-boot-tpl {
- replace;
+ ifwi-replace;
ifwi-subpart = "IBBP";
ifwi-entry = "IBBL";
};
diff --git a/tools/binman/test/112_x86-rom-ifwi-nodesc.dts b/tools/binman/test/112_x86_rom_ifwi_nodesc.dts
index 21ec4654ff..0874440ab5 100644
--- a/tools/binman/test/112_x86-rom-ifwi-nodesc.dts
+++ b/tools/binman/test/112_x86_rom_ifwi_nodesc.dts
@@ -19,7 +19,7 @@
filename = "ifwi.bin";
u-boot-tpl {
- replace;
+ ifwi-replace;
ifwi-subpart = "IBBP";
ifwi-entry = "IBBL";
};
diff --git a/tools/binman/test/113_x86-rom-ifwi-nodata.dts b/tools/binman/test/113_x86_rom_ifwi_nodata.dts
index 62486fd990..82a4bc8cdd 100644
--- a/tools/binman/test/113_x86-rom-ifwi-nodata.dts
+++ b/tools/binman/test/113_x86_rom_ifwi_nodata.dts
@@ -20,7 +20,7 @@
_testing {
return-unknown-contents;
- replace;
+ ifwi-replace;
ifwi-subpart = "IBBP";
ifwi-entry = "IBBL";
};
diff --git a/tools/binman/test/144_x86_reset16.dts b/tools/binman/test/144_x86_reset16.dts
new file mode 100644
index 0000000000..ba90333b27
--- /dev/null
+++ b/tools/binman/test/144_x86_reset16.dts
@@ -0,0 +1,13 @@
+/dts-v1/;
+
+/ {
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ binman {
+ size = <16>;
+
+ x86-reset16 {
+ };
+ };
+};
diff --git a/tools/binman/test/145_x86_reset16_spl.dts b/tools/binman/test/145_x86_reset16_spl.dts
new file mode 100644
index 0000000000..cc8d97a7e6
--- /dev/null
+++ b/tools/binman/test/145_x86_reset16_spl.dts
@@ -0,0 +1,13 @@
+/dts-v1/;
+
+/ {
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ binman {
+ size = <16>;
+
+ x86-reset16-spl {
+ };
+ };
+};
diff --git a/tools/binman/test/146_x86_reset16_tpl.dts b/tools/binman/test/146_x86_reset16_tpl.dts
new file mode 100644
index 0000000000..041b16f3de
--- /dev/null
+++ b/tools/binman/test/146_x86_reset16_tpl.dts
@@ -0,0 +1,13 @@
+/dts-v1/;
+
+/ {
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ binman {
+ size = <16>;
+
+ x86-reset16-tpl {
+ };
+ };
+};
diff --git a/tools/binman/test/147_intel_fit.dts b/tools/binman/test/147_intel_fit.dts
new file mode 100644
index 0000000000..01ec40e5c7
--- /dev/null
+++ b/tools/binman/test/147_intel_fit.dts
@@ -0,0 +1,20 @@
+/dts-v1/;
+
+/ {
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ binman {
+ end-at-4gb;
+ size = <0x80>;
+
+ u-boot {
+ };
+
+ intel-fit {
+ };
+
+ intel-fit-ptr {
+ };
+ };
+};
diff --git a/tools/binman/test/148_intel_fit_missing.dts b/tools/binman/test/148_intel_fit_missing.dts
new file mode 100644
index 0000000000..388c76b1ab
--- /dev/null
+++ b/tools/binman/test/148_intel_fit_missing.dts
@@ -0,0 +1,17 @@
+/dts-v1/;
+
+/ {
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ binman {
+ end-at-4gb;
+ size = <0x80>;
+
+ u-boot {
+ };
+
+ intel-fit-ptr {
+ };
+ };
+};
diff --git a/tools/binman/test/149_symbols_tpl.dts b/tools/binman/test/149_symbols_tpl.dts
new file mode 100644
index 0000000000..dfc84af5e7
--- /dev/null
+++ b/tools/binman/test/149_symbols_tpl.dts
@@ -0,0 +1,28 @@
+/dts-v1/;
+
+/ {
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ binman {
+ pad-byte = <0xff>;
+ u-boot-spl {
+ offset = <4>;
+ };
+
+ u-boot-spl2 {
+ offset = <0x1c>;
+ type = "u-boot-spl";
+ };
+
+ u-boot {
+ offset = <0x34>;
+ };
+
+ section {
+ u-boot-tpl {
+ type = "u-boot-tpl";
+ };
+ };
+ };
+};
diff --git a/tools/binman/test/81_powerpc_mpc85xx_bootpg_resetvec.dts b/tools/binman/test/150_powerpc_mpc85xx_bootpg_resetvec.dts
index 8f4b16c399..8f4b16c399 100644
--- a/tools/binman/test/81_powerpc_mpc85xx_bootpg_resetvec.dts
+++ b/tools/binman/test/150_powerpc_mpc85xx_bootpg_resetvec.dts
diff --git a/tools/binman/test/151_x86_rom_ifwi_section.dts b/tools/binman/test/151_x86_rom_ifwi_section.dts
new file mode 100644
index 0000000000..7e455c3a4b
--- /dev/null
+++ b/tools/binman/test/151_x86_rom_ifwi_section.dts
@@ -0,0 +1,33 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+/dts-v1/;
+
+/ {
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ binman {
+ sort-by-offset;
+ end-at-4gb;
+ size = <0x800000>;
+ intel-descriptor {
+ filename = "descriptor.bin";
+ };
+
+ intel-ifwi {
+ offset-unset;
+ filename = "fitimage.bin";
+ convert-fit;
+
+ section {
+ ifwi-replace;
+ ifwi-subpart = "IBBP";
+ ifwi-entry = "IBBL";
+ u-boot-tpl {
+ };
+ u-boot-dtb {
+ };
+ };
+ };
+ };
+};
diff --git a/tools/binman/test/152_intel_fsp_m.dts b/tools/binman/test/152_intel_fsp_m.dts
new file mode 100644
index 0000000000..b6010f31c2
--- /dev/null
+++ b/tools/binman/test/152_intel_fsp_m.dts
@@ -0,0 +1,14 @@
+/dts-v1/;
+
+/ {
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ binman {
+ size = <16>;
+
+ intel-fsp-m {
+ filename = "fsp_m.bin";
+ };
+ };
+};
diff --git a/tools/binman/test/Makefile b/tools/binman/test/Makefile
index e58fc80775..bdbb009874 100644
--- a/tools/binman/test/Makefile
+++ b/tools/binman/test/Makefile
@@ -1,5 +1,5 @@
#
-# Builds test programs
+# Builds test programs. This is launched from elf_test.BuildElfTestFiles()
#
# Copyright (C) 2017 Google, Inc
# Written by Simon Glass <sjg@chromium.org>
@@ -7,11 +7,13 @@
# SPDX-License-Identifier: GPL-2.0+
#
-CFLAGS := -march=i386 -m32 -nostdlib -I ../../../include
+VPATH := $(SRC)
+CFLAGS := -march=i386 -m32 -nostdlib -I $(SRC)../../../include \
+ -Wl,--no-dynamic-linker
-LDS_UCODE := -T u_boot_ucode_ptr.lds
-LDS_BINMAN := -T u_boot_binman_syms.lds
-LDS_BINMAN_BAD := -T u_boot_binman_syms_bad.lds
+LDS_UCODE := -T $(SRC)u_boot_ucode_ptr.lds
+LDS_BINMAN := -T $(SRC)u_boot_binman_syms.lds
+LDS_BINMAN_BAD := -T $(SRC)u_boot_binman_syms_bad.lds
TARGETS = u_boot_ucode_ptr u_boot_no_ucode_ptr bss_data \
u_boot_binman_syms u_boot_binman_syms.bin u_boot_binman_syms_bad \
@@ -25,7 +27,7 @@ u_boot_no_ucode_ptr: u_boot_no_ucode_ptr.c
u_boot_ucode_ptr: CFLAGS += $(LDS_UCODE)
u_boot_ucode_ptr: u_boot_ucode_ptr.c
-bss_data: CFLAGS += bss_data.lds
+bss_data: CFLAGS += $(SRC)bss_data.lds
bss_data: bss_data.c
u_boot_binman_syms.bin: u_boot_binman_syms
diff --git a/tools/binman/test/bss_data b/tools/binman/test/bss_data
deleted file mode 100755
index afa28282aa..0000000000
--- a/tools/binman/test/bss_data
+++ /dev/null
Binary files differ
diff --git a/tools/binman/test/u_boot_binman_syms b/tools/binman/test/u_boot_binman_syms
deleted file mode 100755
index 126a1a6230..0000000000
--- a/tools/binman/test/u_boot_binman_syms
+++ /dev/null
Binary files differ
diff --git a/tools/binman/test/u_boot_binman_syms.c b/tools/binman/test/u_boot_binman_syms.c
index 4898f983e3..4520b319f1 100644
--- a/tools/binman/test/u_boot_binman_syms.c
+++ b/tools/binman/test/u_boot_binman_syms.c
@@ -11,3 +11,4 @@
binman_sym_declare(unsigned long, u_boot_spl, offset);
binman_sym_declare(unsigned long long, u_boot_spl2, offset);
binman_sym_declare(unsigned long, u_boot_any, image_pos);
+binman_sym_declare(unsigned long, u_boot_any, size);
diff --git a/tools/binman/test/u_boot_binman_syms.lds b/tools/binman/test/u_boot_binman_syms.lds
index 29cf9d0e54..926df873cb 100644
--- a/tools/binman/test/u_boot_binman_syms.lds
+++ b/tools/binman/test/u_boot_binman_syms.lds
@@ -25,5 +25,6 @@ SECTIONS
KEEP(*(SORT(.binman_sym*)));
__binman_sym_end = .;
}
+ .interp : { *(.interp*) }
}
diff --git a/tools/binman/test/u_boot_binman_syms_bad b/tools/binman/test/u_boot_binman_syms_bad
deleted file mode 100755
index 8da3d9d48f..0000000000
--- a/tools/binman/test/u_boot_binman_syms_bad
+++ /dev/null
Binary files differ
diff --git a/tools/binman/test/u_boot_binman_syms_size b/tools/binman/test/u_boot_binman_syms_size
deleted file mode 100755
index d691e897c0..0000000000
--- a/tools/binman/test/u_boot_binman_syms_size
+++ /dev/null
Binary files differ
diff --git a/tools/binman/test/u_boot_no_ucode_ptr b/tools/binman/test/u_boot_no_ucode_ptr
deleted file mode 100755
index f72462f0be..0000000000
--- a/tools/binman/test/u_boot_no_ucode_ptr
+++ /dev/null
Binary files differ
diff --git a/tools/binman/test/u_boot_ucode_ptr b/tools/binman/test/u_boot_ucode_ptr
deleted file mode 100755
index dbfb184cec..0000000000
--- a/tools/binman/test/u_boot_ucode_ptr
+++ /dev/null
Binary files differ
diff --git a/tools/binman/test/u_boot_ucode_ptr.lds b/tools/binman/test/u_boot_ucode_ptr.lds
index 0cf9b762b5..cf4d1b8bbd 100644
--- a/tools/binman/test/u_boot_ucode_ptr.lds
+++ b/tools/binman/test/u_boot_ucode_ptr.lds
@@ -9,9 +9,10 @@ ENTRY(_start)
SECTIONS
{
- . = 0xfffffdf0;
+ . = 0xfffffe14;
_start = .;
.ucode : {
*(.ucode)
}
+ .interp : { *(.interp*) }
}
diff --git a/tools/patman/README b/tools/patman/README
index 7917fc8bdc..02d5829744 100644
--- a/tools/patman/README
+++ b/tools/patman/README
@@ -259,12 +259,18 @@ Series-process-log: sort, uniq
unique entries. If omitted, no change log processing is done.
Separate each tag with a comma.
+Change-Id:
+ This tag is stripped out but is used to generate the Message-Id
+ of the emails that will be sent. When you keep the Change-Id the
+ same you are asserting that this is a slightly different version
+ (but logically the same patch) as other patches that have been
+ sent out with the same Change-Id.
+
Various other tags are silently removed, like these Chrome OS and
Gerrit tags:
BUG=...
TEST=...
-Change-Id:
Review URL:
Reviewed-on:
Commit-xxxx: (except Commit-notes)
diff --git a/tools/patman/commit.py b/tools/patman/commit.py
index 2bf3a0ba5b..48d0529c53 100644
--- a/tools/patman/commit.py
+++ b/tools/patman/commit.py
@@ -21,6 +21,8 @@ class Commit:
The dict is indexed by change version (an integer)
cc_list: List of people to aliases/emails to cc on this commit
notes: List of lines in the commit (not series) notes
+ change_id: the Change-Id: tag that was stripped from this commit
+ and can be used to generate the Message-Id.
"""
def __init__(self, hash):
self.hash = hash
@@ -30,6 +32,7 @@ class Commit:
self.cc_list = []
self.signoff_set = set()
self.notes = []
+ self.change_id = None
def AddChange(self, version, info):
"""Add a new change line to the change list for a version.
diff --git a/tools/patman/cros_subprocess.py b/tools/patman/cros_subprocess.py
index 06be64cc2c..0f0d60dfb7 100644
--- a/tools/patman/cros_subprocess.py
+++ b/tools/patman/cros_subprocess.py
@@ -54,7 +54,7 @@ class Popen(subprocess.Popen):
"""
def __init__(self, args, stdin=None, stdout=PIPE_PTY, stderr=PIPE_PTY,
- shell=False, cwd=None, env=None, binary=False, **kwargs):
+ shell=False, cwd=None, env=None, **kwargs):
"""Cut-down constructor
Args:
@@ -72,7 +72,6 @@ class Popen(subprocess.Popen):
"""
stdout_pty = None
stderr_pty = None
- self.binary = binary
if stdout == PIPE_PTY:
stdout_pty = pty.openpty()
diff --git a/tools/patman/patchstream.py b/tools/patman/patchstream.py
index b6455b0fa3..ef06606297 100644
--- a/tools/patman/patchstream.py
+++ b/tools/patman/patchstream.py
@@ -2,6 +2,7 @@
# Copyright (c) 2011 The Chromium OS Authors.
#
+import datetime
import math
import os
import re
@@ -14,7 +15,7 @@ import gitutil
from series import Series
# Tags that we detect and remove
-re_remove = re.compile('^BUG=|^TEST=|^BRANCH=|^Change-Id:|^Review URL:'
+re_remove = re.compile('^BUG=|^TEST=|^BRANCH=|^Review URL:'
'|Reviewed-on:|Commit-\w*:')
# Lines which are allowed after a TEST= line
@@ -32,6 +33,9 @@ re_cover_cc = re.compile('^Cover-letter-cc: *(.*)')
# Patch series tag
re_series_tag = re.compile('^Series-([a-z-]*): *(.*)')
+# Change-Id will be used to generate the Message-Id and then be stripped
+re_change_id = re.compile('^Change-Id: *(.*)')
+
# Commit series tag
re_commit_tag = re.compile('^Commit-([a-z-]*): *(.*)')
@@ -156,6 +160,7 @@ class PatchStream:
# Handle state transition and skipping blank lines
series_tag_match = re_series_tag.match(line)
+ change_id_match = re_change_id.match(line)
commit_tag_match = re_commit_tag.match(line)
cover_match = re_cover.match(line)
cover_cc_match = re_cover_cc.match(line)
@@ -177,7 +182,7 @@ class PatchStream:
self.state = STATE_MSG_HEADER
# If a tag is detected, or a new commit starts
- if series_tag_match or commit_tag_match or \
+ if series_tag_match or commit_tag_match or change_id_match or \
cover_match or cover_cc_match or signoff_match or \
self.state == STATE_MSG_HEADER:
# but we are already in a section, this means 'END' is missing
@@ -275,6 +280,16 @@ class PatchStream:
self.AddToSeries(line, name, value)
self.skip_blank = True
+ # Detect Change-Id tags
+ elif change_id_match:
+ value = change_id_match.group(1)
+ if self.is_log:
+ if self.commit.change_id:
+ raise ValueError("%s: Two Change-Ids: '%s' vs. '%s'" %
+ (self.commit.hash, self.commit.change_id, value))
+ self.commit.change_id = value
+ self.skip_blank = True
+
# Detect Commit-xxx tags
elif commit_tag_match:
name = commit_tag_match.group(1)
@@ -345,6 +360,47 @@ class PatchStream:
self.warn.append('Found %d lines after TEST=' %
self.lines_after_test)
+ def WriteMessageId(self, outfd):
+ """Write the Message-Id into the output.
+
+ This is based on the Change-Id in the original patch, the version,
+ and the prefix.
+
+ Args:
+ outfd: Output stream file object
+ """
+ if not self.commit.change_id:
+ return
+
+ # If the count is -1 we're testing, so use a fixed time
+ if self.commit.count == -1:
+ time_now = datetime.datetime(1999, 12, 31, 23, 59, 59)
+ else:
+ time_now = datetime.datetime.now()
+
+ # In theory there is email.utils.make_msgid() which would be nice
+ # to use, but it already produces something way too long and thus
+ # will produce ugly commit lines if someone throws this into
+ # a "Link:" tag in the final commit. So (sigh) roll our own.
+
+ # Start with the time; presumably we wouldn't send the same series
+ # with the same Change-Id at the exact same second.
+ parts = [time_now.strftime("%Y%m%d%H%M%S")]
+
+ # These seem like they would be nice to include.
+ if 'prefix' in self.series:
+ parts.append(self.series['prefix'])
+ if 'version' in self.series:
+ parts.append("v%s" % self.series['version'])
+
+ parts.append(str(self.commit.count + 1))
+
+ # The Change-Id must be last, right before the @
+ parts.append(self.commit.change_id)
+
+ # Join parts together with "." and write it out.
+ outfd.write('Message-Id: <%s@changeid>\n' % '.'.join(parts))
+
def ProcessStream(self, infd, outfd):
"""Copy a stream from infd to outfd, filtering out unwanting things.
@@ -358,6 +414,9 @@ class PatchStream:
fname = None
last_fname = None
re_fname = re.compile('diff --git a/(.*) b/.*')
+
+ self.WriteMessageId(outfd)
+
while True:
line = infd.readline()
if not line:
@@ -481,6 +540,7 @@ def FixPatches(series, fnames):
for fname in fnames:
commit = series.commits[count]
commit.patch = fname
+ commit.count = count
result = FixPatch(backup_dir, fname, series, commit)
if result:
print('%d warnings for %s:' % (len(result), fname))
diff --git a/tools/patman/test.py b/tools/patman/test.py
index e1b94bd1a7..cc61c20606 100644
--- a/tools/patman/test.py
+++ b/tools/patman/test.py
@@ -12,6 +12,7 @@ import checkpatch
import gitutil
import patchstream
import series
+import commit
class TestPatch(unittest.TestCase):
@@ -48,7 +49,8 @@ Signed-off-by: Simon Glass <sjg@chromium.org>
arch/arm/cpu/armv7/tegra2/ap20.c | 57 ++----
arch/arm/cpu/armv7/tegra2/clock.c | 163 +++++++++++++++++
'''
- expected='''
+ expected='''Message-Id: <19991231235959.0.I80fe1d0c0b7dd10aa58ce5bb1d9290b6664d5413@changeid>
+
From 656c9a8c31fa65859d924cd21da920d6ba537fad Mon Sep 17 00:00:00 2001
From: Simon Glass <sjg@chromium.org>
@@ -79,7 +81,16 @@ Signed-off-by: Simon Glass <sjg@chromium.org>
expfd.write(expected)
expfd.close()
- patchstream.FixPatch(None, inname, series.Series(), None)
+ # Normally by the time we call FixPatch we've already collected
+ # metadata. Here, we haven't, but at least fake up something.
+ # Set the "count" to -1 which tells FixPatch to use a bogus/fixed
+ # time for generating the Message-Id.
+ com = commit.Commit('')
+ com.change_id = 'I80fe1d0c0b7dd10aa58ce5bb1d9290b6664d5413'
+ com.count = -1
+
+ patchstream.FixPatch(None, inname, series.Series(), com)
+
rc = os.system('diff -u %s %s' % (inname, expname))
self.assertEqual(rc, 0)
diff --git a/tools/patman/tools.py b/tools/patman/tools.py
index 0d4705db76..4a7fcdad21 100644
--- a/tools/patman/tools.py
+++ b/tools/patman/tools.py
@@ -125,7 +125,7 @@ def GetInputFilename(fname):
Returns:
The full path of the filename, within the input directory
"""
- if not indir:
+ if not indir or fname[:1] == '/':
return fname
for dirname in indir:
pathname = os.path.join(dirname, fname)
@@ -186,7 +186,7 @@ def PathHasFile(path_spec, fname):
return True
return False
-def Run(name, *args, **kwargs):
+def Run(name, *args):
"""Run a tool with some arguments
This runs a 'tool', which is a program used by binman to process files and
@@ -196,7 +196,6 @@ def Run(name, *args, **kwargs):
Args:
name: Command name to run
args: Arguments to the tool
- kwargs: Options to pass to command.run()
Returns:
CommandResult object
@@ -206,8 +205,14 @@ def Run(name, *args, **kwargs):
if tool_search_paths:
env = dict(os.environ)
env['PATH'] = ':'.join(tool_search_paths) + ':' + env['PATH']
- return command.Run(name, *args, capture=True,
- capture_stderr=True, env=env, **kwargs)
+ all_args = (name,) + args
+ result = command.RunPipe([all_args], capture=True, capture_stderr=True,
+ env=env, raise_on_error=False)
+ if result.return_code:
+ raise Exception("Error %d running '%s': %s" %
+ (result.return_code,' '.join(all_args),
+ result.stderr))
+ return result.stdout
except:
if env and not PathHasFile(env['PATH'], name):
msg = "Please install tool '%s'" % name
@@ -401,14 +406,14 @@ def Compress(indata, algo, with_header=True):
fname = GetOutputFilename('%s.comp.tmp' % algo)
WriteFile(fname, indata)
if algo == 'lz4':
- data = Run('lz4', '--no-frame-crc', '-c', fname, binary=True)
+ data = Run('lz4', '--no-frame-crc', '-c', fname)
# cbfstool uses a very old version of lzma
elif algo == 'lzma':
outfname = GetOutputFilename('%s.comp.otmp' % algo)
Run('lzma_alone', 'e', fname, outfname, '-lc1', '-lp0', '-pb0', '-d8')
data = ReadFile(outfname)
elif algo == 'gzip':
- data = Run('gzip', '-c', fname, binary=True)
+ data = Run('gzip', '-c', fname)
else:
raise ValueError("Unknown algorithm '%s'" % algo)
if with_header:
@@ -441,13 +446,13 @@ def Decompress(indata, algo, with_header=True):
with open(fname, 'wb') as fd:
fd.write(indata)
if algo == 'lz4':
- data = Run('lz4', '-dc', fname, binary=True)
+ data = Run('lz4', '-dc', fname)
elif algo == 'lzma':
outfname = GetOutputFilename('%s.decomp.otmp' % algo)
Run('lzma_alone', 'd', fname, outfname)
data = ReadFile(outfname)
elif algo == 'gzip':
- data = Run('gzip', '-cd', fname, binary=True)
+ data = Run('gzip', '-cd', fname)
else:
raise ValueError("Unknown algorithm '%s'" % algo)
return data