blob: d73a68c1af372875d506de522c8dbf9aa58a3c75 [file] [log] [blame]
/* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0-or-later */
#ifndef _COMMONLIB_BSD_CBFS_MDATA_H_
#define _COMMONLIB_BSD_CBFS_MDATA_H_
#include <commonlib/bsd/cbfs_serialized.h>
#include <stddef.h>
#include <stdint.h>
/*
* Helper structure to allocate space for a blob of metadata on the stack. All functions using
* a cbfs_mdata should be getting it via cbfs_walk(), and can rely on the fact that cbfs_walk()
* has already fully validated the header (range checks for `len`, `attributes_offset` and
* `offset`, and null-termination for `filename`).
* NOTE: The fields in any union cbfs_mdata or any of its substructures from cbfs_serialized.h
* should always remain in the same byte order as they are stored on flash (= big endian). To
* avoid byte-order confusion, fields should always and only be converted to host byte order at
* exactly the time they are read from one of these structures into their own separate variable.
*/
union cbfs_mdata {
struct cbfs_file h;
uint8_t raw[CBFS_METADATA_MAX_SIZE];
};
/* Finds a CBFS attribute in a metadata block. Attribute returned as-is (still big-endian).
If |size| is not 0, will check that it matches the length of the attribute (if found)...
else caller is responsible for checking the |len| field to avoid reading out-of-bounds. */
const void *cbfs_find_attr(const union cbfs_mdata *mdata, uint32_t attr_tag, size_t size_check);
/* Returns pointer to CBFS file hash structure in metadata attributes, or NULL if invalid. */
const struct vb2_hash *cbfs_file_hash(const union cbfs_mdata *mdata);
#endif /* _COMMONLIB_BSD_CBFS_MDATA_H_ */