binman: Tidy up the vblock entry
authorSimon Glass <sjg@chromium.org>
Fri, 14 Sep 2018 10:57:11 +0000 (04:57 -0600)
committerSimon Glass <sjg@chromium.org>
Fri, 28 Sep 2018 17:09:01 +0000 (11:09 -0600)
At present if there are two vblock entries an image their contents are
written to the same file in the output directory. This prevents checking
the contents of each separately.

Fix this by adding part of the entry path to the filename, and add some
missing comments.

Signed-off-by: Simon Glass <sjg@chromium.org>
tools/binman/README.entries
tools/binman/entry.py
tools/binman/entry_test.py
tools/binman/etype/vblock.py
tools/binman/ftest.py

index 31bc725d5774ad47e4147aeaf285fa8ebd61524f..5cb52a92ff9e8110e3938a370db91ad2e7fdeb74 100644 (file)
@@ -546,6 +546,11 @@ Properties / Entry arguments:
     - kernelkey: Name of the kernel key to use (inside keydir)
     - preamble-flags: Value of the vboot preamble flags (typically 0)
 
+Output files:
+    - input.<unique_name> - input file passed to futility
+    - vblock.<unique_name> - output file generated by futility (which is
+        used as the entry contents)
+
 Chromium OS signs the read-write firmware and kernel, writing the signature
 in this block. This allows U-Boot to verify that the next firmware stage
 and kernel are genuine.
index 77cfab9c5de0419d09c26aec272c2cb2252012a2..e671a2ea09441a3e10928638739b0f17148abec8 100644 (file)
@@ -456,3 +456,21 @@ features to produce new behaviours.
         if missing:
             raise ValueError('Documentation is missing for modules: %s' %
                              ', '.join(missing))
+
+    def GetUniqueName(self):
+        """Get a unique name for a node
+
+        Returns:
+            String containing a unique name for a node, consisting of the name
+            of all ancestors (starting from within the 'binman' node) separated
+            by a dot ('.'). This can be useful for generating unique filesnames
+            in the output directory.
+        """
+        name = self.name
+        node = self._node
+        while node.parent:
+            node = node.parent
+            if node.name == 'binman':
+                break
+            name = '%s.%s' % (node.name, name)
+        return name
index 6fa735ed5967641ef247cd06c3c46acb0b9da6eb..4100bcc3d3212f29eb23c20aee6cb83b08a623f6 100644 (file)
@@ -54,6 +54,17 @@ class TestEntry(unittest.TestCase):
         self.assertIn("Unknown entry type 'invalid-name' in node "
                       "'invalid-path'", str(e.exception))
 
+    def testUniqueName(self):
+        """Test Entry.GetUniqueName"""
+        import entry
+        Node = collections.namedtuple('Node', ['name', 'parent'])
+        base_node = Node('root', None)
+        base_entry = entry.Entry(None, None, base_node, read_node=False)
+        self.assertEqual('root', base_entry.GetUniqueName())
+        sub_node = Node('subnode', base_node)
+        sub_entry = entry.Entry(None, None, sub_node, read_node=False)
+        self.assertEqual('root.subnode', sub_entry.GetUniqueName())
+
 
 if __name__ == "__main__":
     unittest.main()
index 595af5456d14035ab693fbb17fc377c4026faded..c4d970ed160f31d69a19e4bf8e833ed6abd3d086 100644 (file)
@@ -25,6 +25,11 @@ class Entry_vblock(Entry):
         - kernelkey: Name of the kernel key to use (inside keydir)
         - preamble-flags: Value of the vboot preamble flags (typically 0)
 
+    Output files:
+        - input.<unique_name> - input file passed to futility
+        - vblock.<unique_name> - output file generated by futility (which is
+            used as the entry contents)
+
     Chromium OS signs the read-write firmware and kernel, writing the signature
     in this block. This allows U-Boot to verify that the next firmware stage
     and kernel are genuine.
@@ -53,8 +58,9 @@ class Entry_vblock(Entry):
                 return False
             input_data += data
 
-        output_fname = tools.GetOutputFilename('vblock.%s' % self.name)
-        input_fname = tools.GetOutputFilename('input.%s' % self.name)
+        uniq = self.GetUniqueName()
+        output_fname = tools.GetOutputFilename('vblock.%s' % uniq)
+        input_fname = tools.GetOutputFilename('input.%s' % uniq)
         tools.WriteFile(input_fname, input_data)
         prefix = self.keydir + '/'
         args = [
@@ -69,6 +75,5 @@ class Entry_vblock(Entry):
         ]
         #out.Notice("Sign '%s' into %s" % (', '.join(self.value), self.label))
         stdout = tools.Run('futility', *args)
-        #out.Debug(stdout)
         self.SetContents(tools.ReadFile(output_fname))
         return True
index 3f4f5f3a43ab68790298a260ee47fe43cddcc92f..c4065551e798135d51f9313501788a459397b99d 100644 (file)
@@ -1316,7 +1316,7 @@ class TestFunctional(unittest.TestCase):
         """Fake calls to the futility utility"""
         if pipe_list[0][0] == 'futility':
             fname = pipe_list[0][3]
-            with open(fname, 'w') as fd:
+            with open(fname, 'wb') as fd:
                 fd.write(VBLOCK_DATA)
             return command.CommandResult()