|
@@ -1511,4 +1511,68 @@ int fdt_del_node(void *fdt, int nodeoffset);
|
|
|
|
|
|
const char *fdt_strerror(int errval);
|
|
|
|
|
|
+struct fdt_region {
|
|
|
+ int offset;
|
|
|
+ int size;
|
|
|
+};
|
|
|
+
|
|
|
+/**
|
|
|
+ * fdt_find_regions() - find regions in device tree
|
|
|
+ *
|
|
|
+ * Given a list of nodes to include and properties to exclude, find
|
|
|
+ * the regions of the device tree which describe those included parts.
|
|
|
+ *
|
|
|
+ * The intent is to get a list of regions which will be invariant provided
|
|
|
+ * those parts are invariant. For example, if you request a list of regions
|
|
|
+ * for all nodes but exclude the property "data", then you will get the
|
|
|
+ * same region contents regardless of any change to "data" properties.
|
|
|
+ *
|
|
|
+ * This function can be used to produce a byte-stream to send to a hashing
|
|
|
+ * function to verify that critical parts of the FDT have not changed.
|
|
|
+ *
|
|
|
+ * Nodes which are given in 'inc' are included in the region list, as
|
|
|
+ * are the names of the immediate subnodes nodes (but not the properties
|
|
|
+ * or subnodes of those subnodes).
|
|
|
+ *
|
|
|
+ * For eaxample "/" means to include the root node, all root properties
|
|
|
+ * and the FDT_BEGIN_NODE and FDT_END_NODE of all subnodes of /. The latter
|
|
|
+ * ensures that we capture the names of the subnodes. In a hashing situation
|
|
|
+ * it prevents the root node from changing at all Any change to non-excluded
|
|
|
+ * properties, names of subnodes or number of subnodes would be detected.
|
|
|
+ *
|
|
|
+ * When used with FITs this provides the ability to hash and sign parts of
|
|
|
+ * the FIT based on different configurations in the FIT. Then it is
|
|
|
+ * impossible to change anything about that configuration (include images
|
|
|
+ * attached to the configuration), but it may be possible to add new
|
|
|
+ * configurations, new images or new signatures within the existing
|
|
|
+ * framework.
|
|
|
+ *
|
|
|
+ * Adding new properties to a device tree may result in the string table
|
|
|
+ * being extended (if the new property names are different from those
|
|
|
+ * already added). This function can optionally include a region for
|
|
|
+ * the string table so that this can be part of the hash too.
|
|
|
+ *
|
|
|
+ * The device tree header is not included in the list.
|
|
|
+ *
|
|
|
+ * @fdt: Device tree to check
|
|
|
+ * @inc: List of node paths to included
|
|
|
+ * @inc_count: Number of node paths in list
|
|
|
+ * @exc_prop: List of properties names to exclude
|
|
|
+ * @exc_prop_count: Number of properties in exclude list
|
|
|
+ * @region: Returns list of regions
|
|
|
+ * @max_region: Maximum length of region list
|
|
|
+ * @path: Pointer to a temporary string for the function to use for
|
|
|
+ * building path names
|
|
|
+ * @path_len: Length of path, must be large enough to hold the longest
|
|
|
+ * path in the tree
|
|
|
+ * @add_string_tab: 1 to add a region for the string table
|
|
|
+ * @return number of regions in list. If this is >max_regions then the
|
|
|
+ * region array was exhausted. You should increase max_regions and try
|
|
|
+ * the call again.
|
|
|
+ */
|
|
|
+int fdt_find_regions(const void *fdt, char * const inc[], int inc_count,
|
|
|
+ char * const exc_prop[], int exc_prop_count,
|
|
|
+ struct fdt_region region[], int max_regions,
|
|
|
+ char *path, int path_len, int add_string_tab);
|
|
|
+
|
|
|
#endif /* _LIBFDT_H */
|