Julius Werner would like Aaron Durbin to review this change.

View Change

cbfs: Hook up to new CBFS implmentation

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>
---
M src/commonlib/Makefile.inc
A src/include/cbfs_glue.h
M src/lib/cbfs.c
3 files changed, 63 insertions(+), 25 deletions(-)

git pull ssh://review.coreboot.org:29418/coreboot refs/changes/22/38422/1
diff --git a/src/commonlib/Makefile.inc b/src/commonlib/Makefile.inc
index 5bd6cf9..b2225cb 100644
--- a/src/commonlib/Makefile.inc
+++ b/src/commonlib/Makefile.inc
@@ -30,6 +30,13 @@
smm-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
bootblock-y += bsd/lz4_wrapper.c
verstage-y += bsd/lz4_wrapper.c
diff --git a/src/include/cbfs_glue.h b/src/include/cbfs_glue.h
new file mode 100644
index 0000000..10f4187
--- /dev/null
+++ b/src/include/cbfs_glue.h
@@ -0,0 +1,31 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#ifndef _CBFS_GLUE_H_
+#define _CBFS_GLUE_H_
+
+#include <commonlib/region.h>
+#include <console/console.h>
+
+#define ENABLE_HASHING 0
+
+#define ERROR(...) printk(BIOS_ERR, "CBFS ERROR: " __VA_ARGS__)
+#define LOG(...) printk(BIOS_ERR, "CBFS: " __VA_ARGS__)
+#if CONFIG(DEBUG_CBFS)
+#define DEBUG(...) printk(BIOS_SPEW, "CBFS DEBUG: " __VA_ARGS__)
+#else
+#define DEBUG(...)
+#endif
+
+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_ */
diff --git a/src/lib/cbfs.c b/src/lib/cbfs.c
index c712f76..d6fb99c 100644
--- a/src/lib/cbfs.c
+++ b/src/lib/cbfs.c
@@ -20,6 +20,7 @@
#include <stdlib.h>
#include <boot_device.h>
#include <cbfs.h>
+#include <commonlib/bsd/cbfs_private.h>
#include <commonlib/bsd/compression.h>
#include <endian.h>
#include <lib.h>
@@ -29,14 +30,6 @@
#include <security/vboot/vboot_crtm.h>
#include <security/vboot/vboot_common.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)
{
struct region_device rdev;
@@ -44,28 +37,35 @@
if (cbfs_boot_region_device(&rdev))
return -1;

- int ret = cbfs_locate(fh, &rdev, name, type);
+ union cbfs_mdata mdata;
+ size_t data_offset;
+ cb_err_t err = cbfs_lookup(&rdev, name, &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);
+ if (fmap_locate_area_as_rdev("COREBOOT", &rdev))
+ return -1;
+ err = cbfs_lookup(&rdev, name, &mdata, &data_offset, NULL);
+ }
+ if (err)
+ return -1;

- /*
- * 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);
- ret = cbfs_locate_file_in_region(fh, "COREBOOT", name, type);
+ size_t msize = be32toh(mdata.h.offset);
+ if (rdev_chain(&fh->metadata, &rdev, data_offset - msize, msize) ||
+ rdev_chain(&fh->data, &rdev, data_offset, be32toh(mdata.h.len)))
+ return -1;
+ if (type) {
+ if (!*type)
+ *type = be32toh(mdata.h.type);
+ else if (*type != be32toh(mdata.h.type))
+ return -1;
}

- if (!ret)
- if (vboot_measure_cbfs_hook(fh, name))
- return -1;
+ if (vboot_measure_cbfs_hook(fh, name))
+ return -1;

- return ret;
+ return 0;
}

void *cbfs_boot_map_with_leak(const char *name, uint32_t type, size_t *size)

To view, visit change 38422. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-Change-Id: I4d112d1239475920de2d872dac179c245275038d
Gerrit-Change-Number: 38422
Gerrit-PatchSet: 1
Gerrit-Owner: Julius Werner <jwerner@chromium.org>
Gerrit-Reviewer: Aaron Durbin <adurbin@chromium.org>
Gerrit-Reviewer: Julius Werner <jwerner@chromium.org>
Gerrit-Reviewer: Martin Roth <martinroth@google.com>
Gerrit-Reviewer: Patrick Georgi <pgeorgi@google.com>
Gerrit-MessageType: newchange