cbfs: Enforce media->map() result checking, improve error messages

If you try to boot a VBOOT2_VERIFY_FIRMWARE with less than 4K CBFS cache
right now, your system will try and fail to validate the FMAP signature
at (u8 *)0xFFFFFFFF and go into recovery mode. This patch avoids the
memcmp() to potentially invalid memory, and also adds an error message
to cbfs_simple_buffer_map() to make it explicit that we ran out of CBFS
cache space.

BUG=None
TEST=Booted on Veyron_Pinky with reduced CBFS cache, saw the message.

Original-Change-Id: Ic5773b4e0b36dc621513f58fc9bd29c17afbf1b7
Original-Signed-off-by: Julius Werner <jwerner@chromium.org>
Original-Reviewed-on: https://chromium-review.googlesource.com/222899
Original-Reviewed-by: Aaron Durbin <adurbin@chromium.org>

(cherry picked from commit 0ed3c0c2b63be0d32e8162faf892e41cef1f1f23)
Signed-off-by: Aaron Durbin <adurbin@chromium.org>

Change-Id: I20ccac83bff4a377caca6327d0e21032efff44c1
Reviewed-on: http://review.coreboot.org/9373
Tested-by: build bot (Jenkins)
Reviewed-by: Patrick Georgi <pgeorgi@google.com>
This commit is contained in:
Julius Werner 2014-10-10 14:11:11 -07:00 committed by Aaron Durbin
parent 424d79b029
commit 8c5e4d93db
2 changed files with 6 additions and 2 deletions

View File

@ -175,8 +175,11 @@ void *cbfs_simple_buffer_map(struct cbfs_simple_buffer *buffer,
"allocated=%zd, size=%zd, last_allocate=%zd\n", "allocated=%zd, size=%zd, last_allocate=%zd\n",
offset, count, buffer->allocated, buffer->size, offset, count, buffer->allocated, buffer->size,
buffer->last_allocate); buffer->last_allocate);
if (buffer->allocated + count > buffer->size) if (buffer->allocated + count > buffer->size) {
ERROR("simple_buffer: no room to map %zd bytes from %#zx\n",
count, offset);
return CBFS_MEDIA_INVALID_MAP_ADDRESS; return CBFS_MEDIA_INVALID_MAP_ADDRESS;
}
if (media->read(media, address, offset, count) != count) { if (media->read(media, address, offset, count) != count) {
ERROR("simple_buffer: fail to read %zd bytes from 0x%zx\n", ERROR("simple_buffer: fail to read %zd bytes from 0x%zx\n",
count, offset); count, offset);

View File

@ -51,7 +51,8 @@ const struct fmap *fmap_find(void)
media->close(media); media->close(media);
#endif #endif
if (memcmp(fmap, FMAP_SIGNATURE, sizeof(FMAP_SIGNATURE)-1)) { if (fmap == CBFS_MEDIA_INVALID_MAP_ADDRESS ||
memcmp(fmap, FMAP_SIGNATURE, sizeof(FMAP_SIGNATURE) - 1)) {
printk(BIOS_DEBUG, "No FMAP found at %p.\n", fmap); printk(BIOS_DEBUG, "No FMAP found at %p.\n", fmap);
return NULL; return NULL;
} }