Ejemplo n.º 1
0
 def _ReadSubnodes(self):
     """Read the subnodes to find out what should go in this IFWI"""
     for node in self._node.subnodes:
         entry = Entry.Create(self.section, node)
         entry.ReadNode()
         entry._ifwi_replace = fdt_util.GetBool(node, 'ifwi-replace')
         entry._ifwi_subpart = fdt_util.GetString(node, 'ifwi-subpart')
         entry._ifwi_entry_name = fdt_util.GetString(node, 'ifwi-entry')
         self._ifwi_entries[entry._ifwi_subpart] = entry
Ejemplo n.º 2
0
 def _ReadEntries(self):
     for node in self._node.subnodes:
         if node.name.startswith('hash') or node.name.startswith(
                 'signature'):
             continue
         entry = Entry.Create(self, node)
         entry.ReadNode()
         entry.SetPrefix(self._name_prefix)
         self._entries[node.name] = entry
Ejemplo n.º 3
0
 def ReadEntries(self):
     for node in self._node.subnodes:
         if node.name.startswith('hash') or node.name.startswith('signature'):
             continue
         entry = Entry.Create(self, node,
                              expanded=self.GetImage().use_expanded,
                              missing_etype=self.GetImage().missing_etype)
         entry.ReadNode()
         entry.SetPrefix(self._name_prefix)
         self._entries[node.name] = entry
Ejemplo n.º 4
0
 def ReadEntries(self):
     """Read the subnodes to find out what should go in this CBFS"""
     for node in self._node.subnodes:
         entry = Entry.Create(self, node)
         entry.ReadNode()
         entry._cbfs_name = fdt_util.GetString(node, 'cbfs-name', entry.name)
         entry._type = fdt_util.GetString(node, 'cbfs-type')
         compress = fdt_util.GetString(node, 'cbfs-compress', 'none')
         entry._cbfs_offset = fdt_util.GetInt(node, 'cbfs-offset')
         entry._cbfs_compress = cbfs_util.find_compress(compress)
         if entry._cbfs_compress is None:
             self.Raise("Invalid compression in '%s': '%s'" %
                        (node.name, compress))
         self._entries[entry._cbfs_name] = entry
Ejemplo n.º 5
0
        def _AddNode(base_node, depth, node):
            """Add a node to the FIT

            Args:
                base_node: Base Node of the FIT (with 'description' property)
                depth: Current node depth (0 is the base 'fit' node)
                node: Current node to process

            There are two cases to deal with:
                - hash and signature nodes which become part of the FIT
                - binman entries which are used to define the 'data' for each
                  image
            """
            for pname, prop in node.props.items():
                if not pname.startswith('fit,'):
                    _process_prop(pname, prop)

            rel_path = node.path[len(base_node.path):]
            in_images = rel_path.startswith('/images')
            has_images = depth == 2 and in_images
            if has_images:
                # This node is a FIT subimage node (e.g. "/images/kernel")
                # containing content nodes. We collect the subimage nodes and
                # section entries for them here to merge the content subnodes
                # together and put the merged contents in the subimage node's
                # 'data' property later.
                entry = Entry.Create(self.section, node, etype='section')
                entry.ReadNode()
                # The hash subnodes here are for mkimage, not binman.
                entry.SetUpdateHash(False)
                self._entries[rel_path] = entry

            for subnode in node.subnodes:
                if has_images and not (subnode.name.startswith('hash') or
                                       subnode.name.startswith('signature')):
                    # This subnode is a content node not meant to appear in
                    # the FIT (e.g. "/images/kernel/u-boot"), so don't call
                    # fsw.add_node() or _AddNode() for it.
                    pass
                elif self.GetImage().generate and subnode.name.startswith('@'):
                    _scan_node(subnode, depth, in_images)
                else:
                    with fsw.add_node(subnode.name):
                        _AddNode(base_node, depth + 1, subnode)
Ejemplo n.º 6
0
    def ReadEntries(self):
        """Read the subnodes to find out what should go in this FIP"""
        for node in self._node.subnodes:
            fip_type = None
            etype = None
            if node.name in FIP_TYPES:
                fip_type = node.name
                etype = 'blob-ext'

            entry = Entry.Create(self, node, etype)
            entry._fip_uuid = fdt_util.GetBytes(node, 'fip-uuid', UUID_LEN)
            if not fip_type and not entry._fip_uuid:
                fip_type = fdt_util.GetString(node, 'fip-type')
                if not fip_type:
                    self.Raise(
                        "Must provide a fip-type (node name '%s' is not a known FIP type)"
                        % node.name)

            entry._fip_type = fip_type
            entry._fip_flags = fdt_util.GetInt64(node, 'fip-flags', 0)
            entry.ReadNode()
            entry._fip_name = node.name
            self._entries[entry._fip_name] = entry
Ejemplo n.º 7
0
        def _AddNode(base_node, depth, node):
            """Add a node to the FIT

            Args:
                base_node: Base Node of the FIT (with 'description' property)
                depth: Current node depth (0 is the base node)
                node: Current node to process

            There are two cases to deal with:
                - hash and signature nodes which become part of the FIT
                - binman entries which are used to define the 'data' for each
                  image
            """
            for pname, prop in node.props.items():
                if not pname.startswith('fit,'):
                    if pname == 'default':
                        val = prop.value
                        # Handle the 'default' property
                        if val.startswith('@'):
                            if not self._fdts:
                                continue
                            if not self._fit_default_dt:
                                self.Raise(
                                    "Generated 'default' node requires default-dt entry argument"
                                )
                            if self._fit_default_dt not in self._fdts:
                                self.Raise(
                                    "default-dt entry argument '%s' not found in fdt list: %s"
                                    % (self._fit_default_dt, ', '.join(
                                        self._fdts)))
                            seq = self._fdts.index(self._fit_default_dt)
                            val = val[1:].replace('DEFAULT-SEQ', str(seq + 1))
                            fsw.property_string(pname, val)
                            continue
                    fsw.property(pname, prop.bytes)

            rel_path = node.path[len(base_node.path):]
            in_images = rel_path.startswith('/images')
            has_images = depth == 2 and in_images
            if has_images:
                # This node is a FIT subimage node (e.g. "/images/kernel")
                # containing content nodes. We collect the subimage nodes and
                # section entries for them here to merge the content subnodes
                # together and put the merged contents in the subimage node's
                # 'data' property later.
                entry = Entry.Create(self.section, node, etype='section')
                entry.ReadNode()
                self._fit_sections[rel_path] = entry

            for subnode in node.subnodes:
                if has_images and not (subnode.name.startswith('hash') or
                                       subnode.name.startswith('signature')):
                    # This subnode is a content node not meant to appear in
                    # the FIT (e.g. "/images/kernel/u-boot"), so don't call
                    # fsw.add_node() or _AddNode() for it.
                    pass
                elif subnode.name.startswith('@'):
                    if self._fdts:
                        # Generate notes for each FDT
                        for seq, fdt_fname in enumerate(self._fdts):
                            node_name = subnode.name[1:].replace(
                                'SEQ', str(seq + 1))
                            fname = tools.GetInputFilename(fdt_fname + '.dtb')
                            with fsw.add_node(node_name):
                                for pname, prop in subnode.props.items():
                                    val = prop.bytes.replace(
                                        b'NAME', tools.ToBytes(fdt_fname))
                                    val = val.replace(
                                        b'SEQ', tools.ToBytes(str(seq + 1)))
                                    fsw.property(pname, val)

                                    # Add data for 'fdt' nodes (but not 'config')
                                    if depth == 1 and in_images:
                                        fsw.property('data',
                                                     tools.ReadFile(fname))
                    else:
                        if self._fdts is None:
                            if self._fit_list_prop:
                                self.Raise(
                                    "Generator node requires '%s' entry argument"
                                    % self._fit_list_prop.value)
                            else:
                                self.Raise(
                                    "Generator node requires 'fit,fdt-list' property"
                                )
                else:
                    with fsw.add_node(subnode.name):
                        _AddNode(base_node, depth + 1, subnode)
Ejemplo n.º 8
0
 def ReadEntries(self):
     """Read the subnodes to find out what should go in this image"""
     for node in self._node.subnodes:
         entry = Entry.Create(self, node)
         entry.ReadNode()
         self._mkimage_entries[entry.name] = entry