"""Call the ProcessContents() method for each entry
This is intended to adjust the contents as needed by the entry type.
+
+ Returns:
+ True if no entries needed to change their size
"""
+ sizes_ok = True
for entry in self._entries.values():
- entry.ProcessContents()
+ if not entry.ProcessContents():
+ sizes_ok = False
+ return sizes_ok
def WriteSymbols(self):
"""Write symbol values into binary files for access at run time"""
def ProcessContentsUpdate(self, data):
"""Update the contents of an entry, after the size is fixed
- This checks that the new data is the same size as the old.
+ This checks that the new data is the same size as the old. If the size
+ has changed, this triggers a re-run of the packing algorithm.
Args:
data: Data to set to the contents (bytes)
Raises:
ValueError if the new data size is not the same as the old
"""
+ size_ok = True
if len(data) != self.contents_size:
self.Raise('Cannot update entry size from %d to %d' %
(self.contents_size, len(data)))
self.SetContents(data)
+ return size_ok
def ObtainContents(self):
"""Figure out the contents of an entry.
self.image_pos = image_pos + self.offset
def ProcessContents(self):
- pass
+ """Do any post-packing updates of entry contents
+
+ This function should call ProcessContentsUpdate() to update the entry
+ contents, if necessary, returning its return value here.
+
+ Args:
+ data: Data to set to the contents (bytes)
+
+ Returns:
+ True if the new data size is OK, False if expansion is needed
+
+ Raises:
+ ValueError if the new data size is not the same as the old and
+ state.AllowEntryExpansion() is False
+ """
+ return True
def WriteSymbols(self, section):
"""Write symbol values into binary files for access at run time
def ProcessContents(self):
if self.bad_update_contents:
- # Request to update the conents with something larger, to cause a
+ # Request to update the contents with something larger, to cause a
# failure.
- self.ProcessContentsUpdate('aa')
+ return self.ProcessContentsUpdate('aa')
+ return True
def ProcessFdt(self, fdt):
"""Force reprocessing the first time"""
def ProcessContents(self):
"""Re-read the DTB contents so that we get any calculated properties"""
_, data = state.GetFdtContents(self._filename)
- self.ProcessContentsUpdate(data)
+ return self.ProcessContentsUpdate(data)
This is necessary since new data may have been written back to it during
processing, e.g. the image-pos properties.
"""
- self.ProcessContentsUpdate(self._GetFdtmap())
+ return self.ProcessContentsUpdate(self._GetFdtmap())
return True
def ProcessContents(self):
- self.ProcessContentsUpdate(self._GetFmap())
+ return self.ProcessContentsUpdate(self._GetFmap())
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.
"""
- self.ProcessContentsUpdate(self._GetHeader())
+ return self.ProcessContentsUpdate(self._GetHeader())
self._section.SetCalculatedProperties()
def ProcessContents(self):
- self._section.ProcessEntryContents()
- super(Entry_section, self).ProcessContents()
+ sizes_ok = self._section.ProcessEntryContents()
+ sizes_ok_base = super(Entry_section, self).ProcessContents()
+ return sizes_ok and sizes_ok_base
def CheckOffset(self):
self._section.CheckEntries()
# Write the microcode offset and size into the entry
offset_and_size = struct.pack('<2L', offset, size)
self.target_offset -= self.image_pos
- self.ProcessContentsUpdate(self.data[:self.target_offset] +
- offset_and_size +
- self.data[self.target_offset + 8:])
+ return self.ProcessContentsUpdate(self.data[:self.target_offset] +
+ offset_and_size +
+ self.data[self.target_offset + 8:])
"""Call the ProcessContents() method for each entry
This is intended to adjust the contents as needed by the entry type.
+
+ Returns:
+ True if the new data size is OK, False if expansion is needed
"""
- self._section.ProcessEntryContents()
+ return self._section.ProcessEntryContents()
def WriteSymbols(self):
"""Write symbol values into binary files for access at run time"""