summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2019-07-08 23:25:39 +0300
committerSimon Glass <sjg@chromium.org>2019-07-24 22:54:08 +0300
commit1223db038a5282b400eab3e4bd2a44fa8658ff4e (patch)
treed3fba028854f13fee5f859cde76e7f02082e1d29 /tools
parent6c223fda1e624e1e382fcb029e9d60f441444d2e (diff)
downloadu-boot-1223db038a5282b400eab3e4bd2a44fa8658ff4e.tar.xz
binman: Provide the actual data address for cbfs files
At present a file with no explicit CBFS offset is placed in the next available location but there is no way to find out where it ended up. Update and rename the get_data() function to provide this information. Signed-off-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'tools')
-rw-r--r--tools/binman/cbfs_util.py31
1 files changed, 20 insertions, 11 deletions
diff --git a/tools/binman/cbfs_util.py b/tools/binman/cbfs_util.py
index 1cdbcb2339..530629a5c9 100644
--- a/tools/binman/cbfs_util.py
+++ b/tools/binman/cbfs_util.py
@@ -185,7 +185,8 @@ class CbfsFile(object):
"""Class to represent a single CBFS file
This is used to hold the information about a file, including its contents.
- Use the get_data() method to obtain the raw output for writing to CBFS.
+ Use the get_data_and_offset() method to obtain the raw output for writing to
+ CBFS.
Properties:
name: Name of file
@@ -319,12 +320,15 @@ class CbfsFile(object):
raise ValueError('Unknown file type %#x\n' % self.ftype)
return hdr_len
- def get_data(self, offset=None, pad_byte=None):
- """Obtain the contents of the file, in CBFS format
+ def get_data_and_offset(self, offset=None, pad_byte=None):
+ """Obtain the contents of the file, in CBFS format and the offset of
+ the data within the file
Returns:
- bytes representing the contents of this file, packed and aligned
- for directly inserting into the final CBFS output
+ tuple:
+ bytes representing the contents of this file, packed and aligned
+ for directly inserting into the final CBFS output
+ offset to the file data from the start of the returned data.
"""
name = _pack_string(self.name)
hdr_len = len(name) + FILE_HEADER_LEN
@@ -368,8 +372,10 @@ class CbfsFile(object):
(self.name, self.cbfs_offset, offset))
pad = tools.GetBytes(pad_byte, pad_len)
hdr_len += pad_len
- self.offset = len(content) + len(data)
- hdr = struct.pack(FILE_HEADER_FORMAT, FILE_MAGIC, self.offset,
+
+ # This is the offset of the start of the file's data,
+ size = len(content) + len(data)
+ hdr = struct.pack(FILE_HEADER_FORMAT, FILE_MAGIC, size,
self.ftype, attr_pos, hdr_len)
# Do a sanity check of the get_header_len() function, to ensure that it
@@ -381,7 +387,7 @@ class CbfsFile(object):
# happen. It probably indicates that get_header_len() is broken.
raise ValueError("Internal error: CBFS file '%s': Expected headers of %#x bytes, got %#d" %
(self.name, expected_len, actual_len))
- return hdr + name + attr + pad + content + data
+ return hdr + name + attr + pad + content + data, hdr_len
class CbfsWriter(object):
@@ -392,7 +398,7 @@ class CbfsWriter(object):
cbw = CbfsWriter(size)
cbw.add_file_raw('u-boot', tools.ReadFile('u-boot.bin'))
...
- data = cbw.get_data()
+ data, cbfs_offset = cbw.get_data_and_offset()
Attributes:
_master_name: Name of the file containing the master header
@@ -475,7 +481,7 @@ class CbfsWriter(object):
todo = align_int_down(offset - upto, self._align)
if todo:
cbf = CbfsFile.empty(todo, self._erase_byte)
- fd.write(cbf.get_data())
+ fd.write(cbf.get_data_and_offset()[0])
self._skip_to(fd, offset)
def _align_to(self, fd, align):
@@ -579,8 +585,11 @@ class CbfsWriter(object):
offset = cbf.calc_start_offset()
if offset is not None:
self._pad_to(fd, align_int_down(offset, self._align))
- fd.write(cbf.get_data(fd.tell(), self._erase_byte))
+ pos = fd.tell()
+ data, data_offset = cbf.get_data_and_offset(pos, self._erase_byte)
+ fd.write(data)
self._align_to(fd, self._align)
+ cbf.calced_cbfs_offset = pos + data_offset
if not self._hdr_at_start:
self._write_header(fd, add_fileheader=self._add_fileheader)