aboutsummaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorJulius Werner <jwerner@chromium.org>2020-03-05 12:51:08 -0800
committerPatrick Georgi <pgeorgi@google.com>2020-12-02 22:13:06 +0000
commit0d9072b1a196627755164288a9f334ef844628f5 (patch)
treedfa87d029ea6372a547d448c933018f09a88b271 /src/lib
parentbaf27dbaeb1f6791ebfc416f2175507686bd88ac (diff)
cbfs: Move more stuff into cbfs_boot_lookup()
cbfs_boot_locate() is supposed to be deprecated eventually, after slowly migrating all APIs to bypass it. That means common features (like RO-fallback or measurement) need to be moved to the new cbfs_boot_lookup(). Also export the function externally. Since it is a low-level API and most code should use the higher-level loading or mapping functions instead, put it into a new <cbfs_private.h> to raise the mental barrier for using this API (this will make more sense once cbfs_boot_locate() is removed from <cbfs.h>). Signed-off-by: Julius Werner <jwerner@chromium.org> Change-Id: I4bc9b7cbc42a4211d806a3e3389abab7f589a25a Reviewed-on: https://review.coreboot.org/c/coreboot/+/39327 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/cbfs.c61
1 files changed, 34 insertions, 27 deletions
diff --git a/src/lib/cbfs.c b/src/lib/cbfs.c
index 3b7d4292d0..94dae625b2 100644
--- a/src/lib/cbfs.c
+++ b/src/lib/cbfs.c
@@ -3,8 +3,8 @@
#include <assert.h>
#include <boot_device.h>
#include <cbfs.h>
+#include <cbfs_private.h>
#include <cbmem.h>
-#include <commonlib/bsd/cbfs_private.h>
#include <commonlib/bsd/compression.h>
#include <commonlib/endian.h>
#include <console/console.h>
@@ -17,43 +17,49 @@
#include <symbols.h>
#include <timestamp.h>
-static cb_err_t cbfs_boot_lookup(const struct cbfs_boot_device *cbd,
- const char *name, union cbfs_mdata *mdata, size_t *data_offset)
+cb_err_t cbfs_boot_lookup(const char *name, bool force_ro,
+ union cbfs_mdata *mdata, struct region_device *rdev)
{
+ const struct cbfs_boot_device *cbd = cbfs_get_boot_device(force_ro);
+ if (!cbd)
+ return CB_ERR;
+
+ size_t data_offset;
cb_err_t err = CB_CBFS_CACHE_FULL;
if (!CONFIG(NO_CBFS_MCACHE) && !ENV_SMM)
err = cbfs_mcache_lookup(cbd->mcache, cbd->mcache_size,
- name, mdata, data_offset);
+ name, mdata, &data_offset);
if (err == CB_CBFS_CACHE_FULL)
- err = cbfs_lookup(&cbd->rdev, name, mdata, data_offset, NULL);
- return err;
-}
-
-int cbfs_boot_locate(struct cbfsf *fh, const char *name, uint32_t *type)
-{
- const struct cbfs_boot_device *cbd = cbfs_get_boot_device(false);
- if (!cbd)
- return -1;
+ err = cbfs_lookup(&cbd->rdev, name, mdata, &data_offset, NULL);
- size_t data_offset;
- cb_err_t err = cbfs_boot_lookup(cbd, name, &fh->mdata, &data_offset);
-
- if (CONFIG(VBOOT_ENABLE_CBFS_FALLBACK) && err == CB_CBFS_NOT_FOUND) {
+ if (CONFIG(VBOOT_ENABLE_CBFS_FALLBACK) && !force_ro &&
+ err == CB_CBFS_NOT_FOUND) {
printk(BIOS_INFO, "CBFS: Fall back to RO region for %s\n",
name);
- if (!(cbd = cbfs_get_boot_device(true)))
- return -1;
- err = cbfs_boot_lookup(cbd, name, &fh->mdata, &data_offset);
+ return cbfs_boot_lookup(name, true, mdata, rdev);
}
if (err)
+ return err;
+
+ if (rdev_chain(rdev, &cbd->rdev, data_offset, be32toh(mdata->h.len)))
+ return CB_ERR;
+
+ if (tspi_measure_cbfs_hook(rdev, name, be32toh(mdata->h.type)))
+ return CB_ERR;
+
+ return CB_SUCCESS;
+}
+
+int cbfs_boot_locate(struct cbfsf *fh, const char *name, uint32_t *type)
+{
+ if (cbfs_boot_lookup(name, false, &fh->mdata, &fh->data))
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, &cbd->rdev, data_offset,
- be32toh(fh->mdata.h.len)))
+ (uintptr_t)&fh->mdata, msize))
return -1;
+
if (type) {
if (!*type)
*type = be32toh(fh->mdata.h.type);
@@ -61,9 +67,6 @@ int cbfs_boot_locate(struct cbfsf *fh, const char *name, uint32_t *type)
return -1;
}
- if (tspi_measure_cbfs_hook(fh, name))
- return -1;
-
return 0;
}
@@ -94,9 +97,13 @@ int cbfs_locate_file_in_region(struct cbfsf *fh, const char *region_name,
return -1;
}
+ uint32_t dummy_type = 0;
+ if (!type)
+ type = &dummy_type;
+
ret = cbfs_locate(fh, &rdev, name, type);
if (!ret)
- if (tspi_measure_cbfs_hook(fh, name))
+ if (tspi_measure_cbfs_hook(&rdev, name, *type))
return -1;
return ret;
}