cbfs: Hook up to new CBFS implementation
This patch hooks coreboot up to the new commonlib/bsd CBFS implementation. This is intended as the "minimum viable patch" that makes the new implementation useable with the smallest amount of changes -- that is why some of this may look a bit roundabout (returning the whole metadata for a file but then just using that to fill out the rdevs of the existing struct cbfsf). Future changes will migrate the higher level CBFS APIs one-by-one to use the new implementation directly (rather than translated into the results of the old one), at which point this will become more efficient. Change-Id: I4d112d1239475920de2d872dac179c245275038d Signed-off-by: Julius Werner <jwerner@chromium.org> Reviewed-on: https://review.coreboot.org/c/coreboot/+/38422 Reviewed-by: Aaron Durbin <adurbin@chromium.org> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
committed by
Philipp Deppenwiese
parent
0655f78041
commit
1cd013bec5
@@ -30,6 +30,13 @@ ramstage-y += cbfs.c
|
|||||||
smm-y += cbfs.c
|
smm-y += cbfs.c
|
||||||
postcar-y += cbfs.c
|
postcar-y += cbfs.c
|
||||||
|
|
||||||
|
bootblock-y += bsd/cbfs_private.c
|
||||||
|
verstage-y += bsd/cbfs_private.c
|
||||||
|
romstage-y += bsd/cbfs_private.c
|
||||||
|
postcar-y += bsd/cbfs_private.c
|
||||||
|
ramstage-y += bsd/cbfs_private.c
|
||||||
|
smm-y += bsd/cbfs_private.c
|
||||||
|
|
||||||
decompressor-y += bsd/lz4_wrapper.c
|
decompressor-y += bsd/lz4_wrapper.c
|
||||||
bootblock-y += bsd/lz4_wrapper.c
|
bootblock-y += bsd/lz4_wrapper.c
|
||||||
verstage-y += bsd/lz4_wrapper.c
|
verstage-y += bsd/lz4_wrapper.c
|
||||||
|
@@ -7,21 +7,6 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <vb2_sha.h>
|
#include <vb2_sha.h>
|
||||||
|
|
||||||
#if !defined(LOG)
|
|
||||||
#define LOG(x...) printk(BIOS_INFO, "CBFS: " x)
|
|
||||||
#endif
|
|
||||||
#if defined(CONFIG)
|
|
||||||
|
|
||||||
#if CONFIG(DEBUG_CBFS)
|
|
||||||
#define DEBUG(x...) printk(BIOS_SPEW, "CBFS: " x)
|
|
||||||
#else
|
|
||||||
#define DEBUG(x...)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#elif !defined(DEBUG)
|
|
||||||
#define DEBUG(x...)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static size_t cbfs_next_offset(const struct region_device *cbfs,
|
static size_t cbfs_next_offset(const struct region_device *cbfs,
|
||||||
const struct cbfsf *f)
|
const struct cbfsf *f)
|
||||||
{
|
{
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
#ifndef _COMMONLIB_CBFS_H_
|
#ifndef _COMMONLIB_CBFS_H_
|
||||||
#define _COMMONLIB_CBFS_H_
|
#define _COMMONLIB_CBFS_H_
|
||||||
|
|
||||||
#include <commonlib/bsd/cbfs_serialized.h>
|
#include <commonlib/bsd/cbfs_private.h>
|
||||||
#include <commonlib/region.h>
|
#include <commonlib/region.h>
|
||||||
#include <vb2_api.h>
|
#include <vb2_api.h>
|
||||||
|
|
||||||
@@ -11,6 +11,7 @@
|
|||||||
struct cbfsf {
|
struct cbfsf {
|
||||||
struct region_device metadata;
|
struct region_device metadata;
|
||||||
struct region_device data;
|
struct region_device data;
|
||||||
|
union cbfs_mdata mdata;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Locate file by name and optional type. Returns 0 on success else < 0 on
|
/* Locate file by name and optional type. Returns 0 on success else < 0 on
|
||||||
|
30
src/include/cbfs_glue.h
Normal file
30
src/include/cbfs_glue.h
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||||
|
|
||||||
|
#ifndef _CBFS_GLUE_H_
|
||||||
|
#define _CBFS_GLUE_H_
|
||||||
|
|
||||||
|
#include <commonlib/region.h>
|
||||||
|
#include <console/console.h>
|
||||||
|
|
||||||
|
#define CBFS_ENABLE_HASHING 0
|
||||||
|
|
||||||
|
#define ERROR(...) printk(BIOS_ERR, "CBFS ERROR: " __VA_ARGS__)
|
||||||
|
#define LOG(...) printk(BIOS_ERR, "CBFS: " __VA_ARGS__)
|
||||||
|
#define DEBUG(...) do { \
|
||||||
|
if (CONFIG(DEBUG_CBFS)) \
|
||||||
|
printk(BIOS_SPEW, "CBFS DEBUG: " __VA_ARGS__); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
typedef const struct region_device *cbfs_dev_t;
|
||||||
|
|
||||||
|
static inline ssize_t cbfs_dev_read(cbfs_dev_t dev, void *buffer, size_t offset, size_t size)
|
||||||
|
{
|
||||||
|
return rdev_readat(dev, buffer, offset, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline size_t cbfs_dev_size(cbfs_dev_t dev)
|
||||||
|
{
|
||||||
|
return region_device_sz(dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* _CBFS_GLUE_H_ */
|
@@ -3,6 +3,7 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <boot_device.h>
|
#include <boot_device.h>
|
||||||
#include <cbfs.h>
|
#include <cbfs.h>
|
||||||
|
#include <commonlib/bsd/cbfs_private.h>
|
||||||
#include <commonlib/bsd/compression.h>
|
#include <commonlib/bsd/compression.h>
|
||||||
#include <commonlib/endian.h>
|
#include <commonlib/endian.h>
|
||||||
#include <console/console.h>
|
#include <console/console.h>
|
||||||
@@ -15,14 +16,6 @@
|
|||||||
#include <symbols.h>
|
#include <symbols.h>
|
||||||
#include <timestamp.h>
|
#include <timestamp.h>
|
||||||
|
|
||||||
#define ERROR(x...) printk(BIOS_ERR, "CBFS: " x)
|
|
||||||
#define LOG(x...) printk(BIOS_INFO, "CBFS: " x)
|
|
||||||
#if CONFIG(DEBUG_CBFS)
|
|
||||||
#define DEBUG(x...) printk(BIOS_SPEW, "CBFS: " x)
|
|
||||||
#else
|
|
||||||
#define DEBUG(x...)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int cbfs_boot_locate(struct cbfsf *fh, const char *name, uint32_t *type)
|
int cbfs_boot_locate(struct cbfsf *fh, const char *name, uint32_t *type)
|
||||||
{
|
{
|
||||||
struct region_device rdev;
|
struct region_device rdev;
|
||||||
@@ -30,31 +23,35 @@ int cbfs_boot_locate(struct cbfsf *fh, const char *name, uint32_t *type)
|
|||||||
if (cbfs_boot_region_device(&rdev))
|
if (cbfs_boot_region_device(&rdev))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
int ret = cbfs_locate(fh, &rdev, name, type);
|
size_t data_offset;
|
||||||
|
cb_err_t err = cbfs_lookup(&rdev, name, &fh->mdata, &data_offset, NULL);
|
||||||
|
|
||||||
if (CONFIG(VBOOT_ENABLE_CBFS_FALLBACK) && ret) {
|
if (CONFIG(VBOOT_ENABLE_CBFS_FALLBACK) && err == CB_CBFS_NOT_FOUND) {
|
||||||
|
printk(BIOS_INFO, "CBFS: Fall back to RO region for %s\n",
|
||||||
/*
|
name);
|
||||||
* When VBOOT_ENABLE_CBFS_FALLBACK is enabled and a file is not available in the
|
|
||||||
* active RW region, the RO (COREBOOT) region will be used to locate the file.
|
|
||||||
*
|
|
||||||
* This functionality makes it possible to avoid duplicate files in the RO
|
|
||||||
* and RW partitions while maintaining updateability.
|
|
||||||
*
|
|
||||||
* Files can be added to the RO_REGION_ONLY config option to use this feature.
|
|
||||||
*/
|
|
||||||
printk(BIOS_DEBUG, "Fall back to RO region for %s\n", name);
|
|
||||||
if (fmap_locate_area_as_rdev("COREBOOT", &rdev))
|
if (fmap_locate_area_as_rdev("COREBOOT", &rdev))
|
||||||
ERROR("RO region not found\n");
|
return -1;
|
||||||
else
|
err = cbfs_lookup(&rdev, name, &fh->mdata, &data_offset, NULL);
|
||||||
ret = cbfs_locate(fh, &rdev, name, type);
|
}
|
||||||
|
if (err)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
size_t msize = be32toh(fh->mdata.h.offset);
|
||||||
|
if (rdev_chain(&fh->metadata, &addrspace_32bit.rdev,
|
||||||
|
(uintptr_t)&fh->mdata, msize) ||
|
||||||
|
rdev_chain(&fh->data, &rdev, data_offset, be32toh(fh->mdata.h.len)))
|
||||||
|
return -1;
|
||||||
|
if (type) {
|
||||||
|
if (!*type)
|
||||||
|
*type = be32toh(fh->mdata.h.type);
|
||||||
|
else if (*type != be32toh(fh->mdata.h.type))
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ret)
|
if (tspi_measure_cbfs_hook(fh, name))
|
||||||
if (tspi_measure_cbfs_hook(fh, name))
|
return -1;
|
||||||
return -1;
|
|
||||||
|
|
||||||
return ret;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *cbfs_boot_map_with_leak(const char *name, uint32_t type, size_t *size)
|
void *cbfs_boot_map_with_leak(const char *name, uint32_t type, size_t *size)
|
||||||
|
Reference in New Issue
Block a user