af20fd748b
The Intel Firmware Interface Table (FIT) is a bit of an annoying outlier among CBFS files because it gets manipulated by a separate utility (ifittool) after cbfstool has already added it to the image. This will break file hashes created for CBFS verification. This is not actually a problem when booting, since coreboot never actually loads the FIT from CBFS -- instead, it's only in the image for use by platform-specific mechanisms that run before coreboot's bootblock. But having an invalid file hash in the CBFS image is confusing when you want to verify that the image is correctly built for verification. This patch adds a new CBFS file type "intel_fit" which is only used for the intel_fit (and intel_fit_ts, if applicable) file containing the FIT. cbfstool will avoid generating and verifying file hashes for this type, like it already does for the "bootblock" and "cbfs header" types. (Note that this means that any attempt to use the CBFS API to actually access this file from coreboot will result in a verification error when CBFS verification is enabled.) Signed-off-by: Julius Werner <jwerner@chromium.org> Change-Id: I1c1bb6dab0c9ccc6e78529758a42ad3194cd130c Reviewed-on: https://review.coreboot.org/c/coreboot/+/64736 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Arthur Heymans <arthur@aheymans.xyz>
81 lines
2.4 KiB
C
81 lines
2.4 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
|
|
#ifndef __CBFS_H
|
|
#define __CBFS_H
|
|
|
|
#include "common.h"
|
|
#include <commonlib/bsd/cbfs_serialized.h>
|
|
|
|
/* To make CBFS more friendly to ROM, fill -1 (0xFF) instead of zero. */
|
|
#define CBFS_CONTENT_DEFAULT_VALUE (-1)
|
|
|
|
#define CBFS_HEADPTR_ADDR_X86 0xFFFFFFFC
|
|
|
|
/* cbfstool is allowed to use this constant freely since it's not part of the
|
|
CBFS image, so make an alias for the name that's a little less aggressive. */
|
|
#define METADATA_HASH_ANCHOR_MAGIC \
|
|
DO_NOT_USE_METADATA_HASH_ANCHOR_MAGIC_DO_NOT_USE
|
|
|
|
struct typedesc_t {
|
|
uint32_t type;
|
|
const char *name;
|
|
};
|
|
|
|
static const struct typedesc_t types_cbfs_compression[] = {
|
|
{CBFS_COMPRESS_NONE, "none"},
|
|
{CBFS_COMPRESS_LZMA, "LZMA"},
|
|
{CBFS_COMPRESS_LZ4, "LZ4"},
|
|
{0, NULL},
|
|
};
|
|
|
|
static struct typedesc_t filetypes[] unused = {
|
|
{CBFS_TYPE_BOOTBLOCK, "bootblock"},
|
|
{CBFS_TYPE_CBFSHEADER, "cbfs header"},
|
|
{CBFS_TYPE_STAGE, "stage"},
|
|
{CBFS_TYPE_SELF, "simple elf"},
|
|
{CBFS_TYPE_FIT_PAYLOAD, "fit_payload"},
|
|
{CBFS_TYPE_OPTIONROM, "optionrom"},
|
|
{CBFS_TYPE_BOOTSPLASH, "bootsplash"},
|
|
{CBFS_TYPE_RAW, "raw"},
|
|
{CBFS_TYPE_VSA, "vsa"},
|
|
{CBFS_TYPE_MBI, "mbi"},
|
|
{CBFS_TYPE_MICROCODE, "microcode"},
|
|
{CBFS_TYPE_INTEL_FIT, "intel_fit"},
|
|
{CBFS_TYPE_FSP, "fsp"},
|
|
{CBFS_TYPE_MRC, "mrc"},
|
|
{CBFS_TYPE_CMOS_DEFAULT, "cmos_default"},
|
|
{CBFS_TYPE_CMOS_LAYOUT, "cmos_layout"},
|
|
{CBFS_TYPE_SPD, "spd"},
|
|
{CBFS_TYPE_MRC_CACHE, "mrc_cache"},
|
|
{CBFS_TYPE_MMA, "mma"},
|
|
{CBFS_TYPE_EFI, "efi"},
|
|
{CBFS_TYPE_STRUCT, "struct"},
|
|
{CBFS_TYPE_DELETED, "deleted"},
|
|
{CBFS_TYPE_NULL, "null"},
|
|
{0, NULL}
|
|
};
|
|
|
|
#define CBFS_SUBHEADER(_p) ((void *) ((((uint8_t *) (_p)) + be32toh((_p)->offset))))
|
|
|
|
static inline size_t cbfs_file_attr_hash_size(enum vb2_hash_algorithm algo)
|
|
{
|
|
return offsetof(struct cbfs_file_attr_hash, hash.raw) +
|
|
vb2_digest_size(algo);
|
|
}
|
|
|
|
/* cbfs_image.c */
|
|
uint32_t get_cbfs_entry_type(const char *name, uint32_t default_value);
|
|
uint32_t get_cbfs_compression(const char *name, uint32_t unknown);
|
|
|
|
/* cbfs-mkpayload.c */
|
|
void xdr_segs(struct buffer *output,
|
|
struct cbfs_payload_segment *segs, int nseg);
|
|
void xdr_get_seg(struct cbfs_payload_segment *out,
|
|
struct cbfs_payload_segment *in);
|
|
|
|
/* platform_fixups.c */
|
|
typedef int (*platform_fixup_func)(struct buffer *buffer, size_t offset);
|
|
platform_fixup_func platform_fixups_probe(struct buffer *buffer, size_t offset,
|
|
const char *region_name);
|
|
|
|
#endif
|