cbfs: Add support for attributes
authorSimon Glass <sjg@chromium.org>
Mon, 15 Mar 2021 05:00:09 +0000 (18:00 +1300)
committerSimon Glass <sjg@chromium.org>
Sat, 27 Mar 2021 00:59:37 +0000 (13:59 +1300)
CBFS now supports attributes for things that cannot fit in the header as
originally conceived. Add the structures for these.

Also rename attributes_offset to something shorter, to ease code
readability.

Signed-off-by: Simon Glass <sjg@chromium.org>
fs/cbfs/cbfs.c
include/cbfs.h

index 9007aa7..abc43ad 100644 (file)
@@ -129,7 +129,7 @@ static int file_cbfs_next_file(struct cbfs_priv *priv, void *start, int size,
                new_node->name = (char *)file_header +
                                sizeof(struct cbfs_fileheader);
                new_node->name_length = name_len;
-               new_node->attributes_offset = header.attributes_offset;
+               new_node->attr_offset = header.attributes_offset;
 
                step = header.len;
                if (step % align)
index 5f296d6..d98afea 100644 (file)
@@ -68,6 +68,43 @@ struct cbfs_fileheader {
        /* offset to struct cbfs_file_attribute or 0 */
        u32 attributes_offset;
        u32 offset;
+       char filename[];
+} __packed;
+
+/*
+ * Depending on how the header was initialized, it may be backed with 0x00 or
+ * 0xff, so support both
+ */
+#define CBFS_FILE_ATTR_TAG_UNUSED 0
+#define CBFS_FILE_ATTR_TAG_UNUSED2 0xffffffff
+#define CBFS_FILE_ATTR_TAG_COMPRESSION 0x42435a4c
+#define CBFS_FILE_ATTR_TAG_HASH 0x68736148
+
+/*
+ * The common fields of extended cbfs file attributes. Attributes are expected
+ * to start with tag/len, then append their specific fields
+ */
+struct cbfs_file_attribute {
+       u32 tag;
+       /* len covers the whole structure, incl. tag and len */
+       u32 len;
+       u8 data[0];
+} __packed;
+
+struct cbfs_file_attr_compression {
+       u32 tag;
+       u32 len;
+       /* whole file compression format. 0 if no compression. */
+       u32 compression;
+       u32 decompressed_size;
+} __packed;
+
+struct cbfs_file_attr_hash {
+       u32 tag;
+       u32 len;
+       u32 hash_type;
+       /* hash_data is len - sizeof(struct) bytes */
+       u8  hash_data[];
 } __packed;
 
 struct cbfs_cachenode {
@@ -77,7 +114,7 @@ struct cbfs_cachenode {
        u32 type;
        u32 data_length;
        u32 name_length;
-       u32 attributes_offset;
+       u32 attr_offset;
 };
 
 /**