is the symbol to lookup (relative to elf-base-sym) and <offset> is an offset
to add to that value.
+preserve:
+ Indicates that this entry should be preserved by any firmware updates. This
+ flag should be checked by the updater when it is deciding which entries to
+ update. This flag is normally attached to sections but can be attached to
+ a single entry in a section if the updater supports it. Not that binman
+ itself has no control over the updater's behaviour, so this is just a
+ signal. It is not enforced by binman.
+
Examples of the above options can be found in the tests. See the
tools/binman/test directory.
from the FMAP by using the offset information. This convention does not
seem to be documented, but is used in Chromium OS.
+To mark an area as preserved, use the normal 'preserved' flag in the entry.
+This will result in the corresponding FMAP area having the
+FMAP_AREA_PRESERVE flag. This flag does not automatically propagate down to
+child entries.
+
CBFS entries appear as a single entry, i.e. the sub-entries are ignored.
appear in the map
optional (bool): True if this entry contains an optional external blob
overlap (bool): True if this entry overlaps with others
+ preserve (bool): True if this entry should be preserved when updating
+ firmware. This means that it will not be changed by the update.
+ This is just a signal: enforcement of this is up to the updater.
+ This flag does not automatically propagate down to child entries.
"""
fake_dir = None
self.overlap = False
self.elf_base_sym = None
self.offset_from_elf = None
+ self.preserve = False
@staticmethod
def FindEntryClass(etype, expanded):
self.offset_from_elf = fdt_util.GetPhandleNameOffset(self._node,
'offset-from-elf')
+ self.preserve = fdt_util.GetBool(self._node, 'preserve')
+
def GetDefaultFilename(self):
return None
from the FMAP by using the offset information. This convention does not
seem to be documented, but is used in Chromium OS.
+ To mark an area as preserved, use the normal 'preserved' flag in the entry.
+ This will result in the corresponding FMAP area having the
+ FMAP_AREA_PRESERVE flag. This flag does not automatically propagate down to
+ child entries.
+
CBFS entries appear as a single entry, i.e. the sub-entries are ignored.
"""
def __init__(self, section, etype, node):
entries = entry.GetEntries()
tout.debug("fmap: Add entry '%s' type '%s' (%s subentries)" %
(entry.GetPath(), entry.etype, to_hex_size(entries)))
+
+ # Collect any flag (separate lines to ensure code coverage)
+ flags = 0
+ if entry.preserve:
+ flags = fmap_util.FMAP_AREA_PRESERVE
+
if entries and entry.etype != 'cbfs':
# Create an area for the section, which encompasses all entries
# within it
# Drop @ symbols in name
name = entry.name.replace('@', '')
areas.append(
- fmap_util.FmapArea(pos, entry.size or 0, name, 0))
+ fmap_util.FmapArea(pos, entry.size or 0, name, flags))
for subentry in entries.values():
_AddEntries(areas, subentry)
else:
if pos is not None:
pos -= entry.section.GetRootSkipAtStart()
areas.append(fmap_util.FmapArea(pos or 0, entry.size or 0,
- entry.name, 0))
+ entry.name, flags))
entries = self.GetImage().GetEntries()
areas = []
'flags',
)
+# Flags supported by areas (bits 2:0 are unused so not included here)
+FMAP_AREA_PRESERVE = 1 << 3 # Preserved by any firmware updates
+
# These are the two data structures supported by flashrom, a header (which
# appears once at the start) and an area (which is repeated until the end of
# the list of areas)
self.assertEqual(b'SECTION0', fentry.name)
self.assertEqual(0, fentry.offset)
self.assertEqual(16, fentry.size)
- self.assertEqual(0, fentry.flags)
+ self.assertEqual(fmap_util.FMAP_AREA_PRESERVE, fentry.flags)
fentry = next(fiter)
self.assertEqual(b'RO_U_BOOT', fentry.name)
name-prefix = "ro-";
size = <0x10>;
pad-byte = <0x21>;
+ preserve;
u-boot {
};