summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2019-07-20 12:24:04 -0600
committerSimon Glass <sjg@chromium.org>2019-07-29 09:38:06 -0600
commita9cd39ef751efdd05a3a5ccae13e28d8a993292d (patch)
treef40b538b4be83f3c0a8a8ad6b829c7a55ee40f7e
parent17a7421ff417f21d0e3e151c992d7188ded3c0d3 (diff)
binman: Update Entry.ReadEntry() to work through classes
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>
-rw-r--r--tools/binman/entry.py7
-rw-r--r--tools/binman/etype/blob.py12
-rw-r--r--tools/binman/etype/cbfs.py12
-rw-r--r--tools/binman/etype/section.py32
4 files changed, 46 insertions, 17 deletions
diff --git a/tools/binman/entry.py b/tools/binman/entry.py
index 90192c11b7..8416214fc9 100644
--- a/tools/binman/entry.py
+++ b/tools/binman/entry.py
@@ -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)
diff --git a/tools/binman/etype/blob.py b/tools/binman/etype/blob.py
index 00cad33718..d15d0789e5 100644
--- a/tools/binman/etype/blob.py
+++ b/tools/binman/etype/blob.py
@@ -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
diff --git a/tools/binman/etype/cbfs.py b/tools/binman/etype/cbfs.py
index d73c706c44..2bcdf2fd43 100644
--- a/tools/binman/etype/cbfs.py
+++ b/tools/binman/etype/cbfs.py
@@ -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
diff --git a/tools/binman/etype/section.py b/tools/binman/etype/section.py
index 3ce013d502..855e291bc4 100644
--- a/tools/binman/etype/section.py
+++ b/tools/binman/etype/section.py
@@ -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