binman: Update Entry.ReadEntry() to work through classes
authorSimon Glass <sjg@chromium.org>
Sat, 20 Jul 2019 18:24:04 +0000 (12:24 -0600)
committerSimon Glass <sjg@chromium.org>
Mon, 29 Jul 2019 15:38:06 +0000 (09:38 -0600)
At present we simply extract the data directly from entries using the
image_pos information. This happens to work on current entry types, but
cannot work if the entry type encodes the data in some way. Update the
ReadData() method to provide the data by calling a new ReadChildData()
method in the parent. This allows the entry_Section class, or possibly
any other container class, to return the correct data in all cases.

Signed-off-by: Simon Glass <sjg@chromium.org>
tools/binman/entry.py
tools/binman/etype/blob.py
tools/binman/etype/cbfs.py
tools/binman/etype/section.py

index 90192c11b7788db1ee97d912d24e23eb66606b74..8416214fc93fab4f9bf500591c1539f7b8c2b4fe 100644 (file)
@@ -714,11 +714,8 @@ features to produce new behaviours.
         """
         # Use True here so that we get an uncompressed section to work from,
         # although compressed sections are currently not supported
-        data = self.section.ReadData(True)
-        tout.Info('%s: Reading data from offset %#x-%#x, size %#x (avail %#x)' %
-                  (self.GetPath(), self.offset, self.offset + self.size,
-                   self.size, len(data)))
-        return data[self.offset:self.offset + self.size]
+        data = self.section.ReadChildData(self, decomp)
+        return data
 
     def LoadData(self, decomp=True):
         data = self.ReadData(decomp)
index 00cad33718cac69d3dd775f96001004211316b9b..d15d0789e5292b6d437ac9da4eb058eebe03f299 100644 (file)
@@ -67,15 +67,3 @@ class Entry_blob(Entry):
 
     def GetDefaultFilename(self):
         return self._filename
-
-    def ReadData(self, decomp=True):
-        indata = Entry.ReadData(self, decomp)
-        if decomp:
-            data = tools.Decompress(indata, self.compress)
-            if self.uncomp_size:
-                tout.Info("%s: Decompressing data size %#x with algo '%s' to data size %#x" %
-                          (self.GetPath(), len(indata), self.compress,
-                           len(data)))
-        else:
-            data = indata
-        return data
index d73c706c444649259a42d0a81ee22e0fef9e37ba..2bcdf2fd433f4da2ab61b7489cc183deae34759b 100644 (file)
@@ -262,3 +262,15 @@ class Entry_cbfs(Entry):
 
     def GetEntries(self):
         return self._cbfs_entries
+
+    def ReadData(self, decomp=True):
+        data = Entry.ReadData(self, True)
+        return data
+
+    def ReadChildData(self, child, decomp=True):
+        if not self.reader:
+            data = Entry.ReadData(self, True)
+            self.reader = cbfs_util.CbfsReader(data)
+        reader = self.reader
+        cfile = reader.files.get(child.name)
+        return cfile.data if decomp else cfile.orig_data
index 3ce013d5029a8a68553ea2bb55524633b388092c..855e291bc43f0409978a37804babbf3ef206af6b 100644 (file)
@@ -17,6 +17,7 @@ import sys
 from entry import Entry
 import fdt_util
 import tools
+import tout
 
 
 class Entry_section(Entry):
@@ -488,3 +489,34 @@ class Entry_section(Entry):
                 they appear in the device tree
         """
         return self._sort
+
+    def ReadData(self, decomp=True):
+        tout.Info("ReadData path='%s'" % self.GetPath())
+        parent_data = self.section.ReadData(True)
+        tout.Info('%s: Reading data from offset %#x-%#x, size %#x' %
+                  (self.GetPath(), self.offset, self.offset + self.size,
+                   self.size))
+        data = parent_data[self.offset:self.offset + self.size]
+        return data
+
+    def ReadChildData(self, child, decomp=True):
+        """Read the data for a particular child entry
+
+        Args:
+            child: Child entry to read data for
+            decomp: True to return uncompressed data, False to leave the data
+                compressed if it is compressed
+
+        Returns:
+            Data contents of entry
+        """
+        parent_data = self.ReadData(True)
+        data = parent_data[child.offset:child.offset + child.size]
+        if decomp:
+            indata = data
+            data = tools.Decompress(indata, child.compress)
+            if child.uncomp_size:
+                tout.Info("%s: Decompressing data size %#x with algo '%s' to data size %#x" %
+                            (child.GetPath(), len(indata), child.compress,
+                            len(data)))
+        return data