summaryrefslogtreecommitdiffstats
path: root/src/lib/fmap.c
diff options
context:
space:
mode:
authorJulius Werner <jwerner@chromium.org>2023-11-02 16:20:17 -0700
committerJulius Werner <jwerner@chromium.org>2023-11-07 22:30:12 +0000
commitca71588620b9f4a3c37d10f133febe5d2026921f (patch)
tree152de9db0e81fad76b059250838bd1b40a1b200f /src/lib/fmap.c
parent682cb3b56419a242b54605cc734b99ffdcab8213 (diff)
downloadcoreboot-ca71588620b9f4a3c37d10f133febe5d2026921f.tar.gz
coreboot-ca71588620b9f4a3c37d10f133febe5d2026921f.tar.bz2
coreboot-ca71588620b9f4a3c37d10f133febe5d2026921f.zip
fmap: Eliminate some impossible code paths
When the FMAP cache is enabled, it cannot fail in pre-RAM stages unless flash I/O in general doesn't work. Therefore, it is unnecessary and a waste of binary size to also link a fallback path for this case. Similarly, once the cache is written to CAR/SRAM/CBMEM there should be no way for it to become magically corrupted between boot stages. Many other parts of coreboot blindly assume that persistent memory stays valid between stages so there is no reason why this code should link in extra fallback paths in case it doesn't. This saves a little over 200 bytes per affected (uncompressed) stage on aarch64. Change-Id: I7b8251dd6b34fe4f63865ebc44b9a8a103f32a57 Signed-off-by: Julius Werner <jwerner@chromium.org> Reviewed-on: https://review.coreboot.org/c/coreboot/+/78904 Reviewed-by: Yu-Ping Wu <yupingso@google.com> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'src/lib/fmap.c')
-rw-r--r--src/lib/fmap.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/src/lib/fmap.c b/src/lib/fmap.c
index 8d7b6a8f7182..77817d1e6027 100644
--- a/src/lib/fmap.c
+++ b/src/lib/fmap.c
@@ -31,8 +31,11 @@ uint64_t get_fmap_flash_offset(void)
static int verify_fmap(const struct fmap *fmap)
{
- if (memcmp(fmap->signature, FMAP_SIGNATURE, sizeof(fmap->signature)))
+ if (memcmp(fmap->signature, FMAP_SIGNATURE, sizeof(fmap->signature))) {
+ if (ENV_INITIAL_STAGE)
+ printk(BIOS_ERR, "Invalid FMAP at %#x\n", FMAP_OFFSET);
return -1;
+ }
static bool done = false;
if (!CONFIG(CBFS_VERIFICATION) || !ENV_INITIAL_STAGE || done)
@@ -82,9 +85,8 @@ static void setup_preram_cache(struct region_device *cache_rdev)
if (!verify_fmap(fmap))
goto register_cache;
- printk(BIOS_ERR, "FMAP cache corrupted?!\n");
- if (CONFIG(TOCTOU_SAFETY))
- die("TOCTOU safety relies on FMAP cache");
+ /* This shouldn't happen, so no point providing a fallback path here. */
+ die("FMAP cache corrupted?!\n");
}
/* In case we fail below, make sure the cache is invalid. */
@@ -118,6 +120,10 @@ static int find_fmap_directory(struct region_device *fmrd)
if (region_device_sz(&fmap_cache))
return rdev_chain_full(fmrd, &fmap_cache);
+ /* Cache setup in pre-RAM stages can't fail, unless flash I/O in general failed. */
+ if (!CONFIG(NO_FMAP_CACHE) && ENV_ROMSTAGE_OR_BEFORE)
+ return -1;
+
boot_device_init();
boot = boot_device_ro();
@@ -130,8 +136,6 @@ static int find_fmap_directory(struct region_device *fmrd)
return -1;
if (verify_fmap(fmap)) {
- printk(BIOS_ERR, "FMAP missing or corrupted at offset 0x%zx!\n",
- offset);
rdev_munmap(boot, fmap);
return -1;
}