cbfs: Add support for attributes

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>
This commit is contained in:
Simon Glass 2021-03-15 18:00:09 +13:00
parent 326aae2589
commit 72ca485978
2 changed files with 39 additions and 2 deletions

View 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 + new_node->name = (char *)file_header +
sizeof(struct cbfs_fileheader); sizeof(struct cbfs_fileheader);
new_node->name_length = name_len; new_node->name_length = name_len;
new_node->attributes_offset = header.attributes_offset; new_node->attr_offset = header.attributes_offset;
step = header.len; step = header.len;
if (step % align) if (step % align)

View File

@ -68,6 +68,43 @@ struct cbfs_fileheader {
/* offset to struct cbfs_file_attribute or 0 */ /* offset to struct cbfs_file_attribute or 0 */
u32 attributes_offset; u32 attributes_offset;
u32 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; } __packed;
struct cbfs_cachenode { struct cbfs_cachenode {
@ -77,7 +114,7 @@ struct cbfs_cachenode {
u32 type; u32 type;
u32 data_length; u32 data_length;
u32 name_length; u32 name_length;
u32 attributes_offset; u32 attr_offset;
}; };
/** /**