summaryrefslogtreecommitdiff
path: root/payloads/libpayload
diff options
context:
space:
mode:
Diffstat (limited to 'payloads/libpayload')
-rw-r--r--payloads/libpayload/include/cbfs_core.h7
-rw-r--r--payloads/libpayload/libcbfs/cbfs.c13
-rw-r--r--payloads/libpayload/libcbfs/cbfs_core.c27
3 files changed, 18 insertions, 29 deletions
diff --git a/payloads/libpayload/include/cbfs_core.h b/payloads/libpayload/include/cbfs_core.h
index 42f2dc849f..4599524664 100644
--- a/payloads/libpayload/include/cbfs_core.h
+++ b/payloads/libpayload/include/cbfs_core.h
@@ -85,10 +85,9 @@
#define CBFS_HEADER_INVALID_ADDRESS ((void*)(0xffffffff))
-/** this is the master cbfs header - it needs to be located somewhere available
- to bootblock (to load romstage). Where it actually lives is up to coreboot.
- On x86, a pointer to this header will live at 0xFFFFFFFC.
- For other platforms, you need to define CONFIG_LP_CBFS_HEADER_ROM_OFFSET */
+/* this is the master cbfs header - it must be located somewhere available
+ * to bootblock (to load romstage). The last 4 bytes in the image contain its
+ * relative offset from the end of the image (as a 32-bit signed integer). */
struct cbfs_header {
uint32_t magic;
diff --git a/payloads/libpayload/libcbfs/cbfs.c b/payloads/libpayload/libcbfs/cbfs.c
index 5ab7ffa04a..b2b9d61608 100644
--- a/payloads/libpayload/libcbfs/cbfs.c
+++ b/payloads/libpayload/libcbfs/cbfs.c
@@ -62,19 +62,6 @@
# endif
#endif
-#if defined(CONFIG_LP_CBFS_HEADER_ROM_OFFSET) && (CONFIG_LP_CBFS_HEADER_ROM_OFFSET)
-# define CBFS_HEADER_ROM_ADDRESS (CONFIG_LP_CBFS_HEADER_ROM_OFFSET)
-#else
-/* ugly hack: this assumes that "media" exists
- in the scope where the macro is used. */
-static uint32_t fetch_x86_header(struct cbfs_media *media)
-{
- uint32_t *header_ptr = media->map(media, 0xfffffffc, 4);
- return *header_ptr;
-}
-# define CBFS_HEADER_ROM_ADDRESS fetch_x86_header(media)
-#endif
-
#include "cbfs_core.c"
#ifndef __SMM__
diff --git a/payloads/libpayload/libcbfs/cbfs_core.c b/payloads/libpayload/libcbfs/cbfs_core.c
index fb15744fe0..eb07e2d292 100644
--- a/payloads/libpayload/libcbfs/cbfs_core.c
+++ b/payloads/libpayload/libcbfs/cbfs_core.c
@@ -34,10 +34,6 @@
* CBFS_CORE_WITH_LZMA (must be #define)
* if defined, ulzma() must exist for decompression of data streams
*
- * CBFS_HEADER_ROM_ADDRESS
- * ROM address (offset) of CBFS header. Underlying CBFS media may interpret
- * it in other way so we call this "address".
- *
* ERROR(x...)
* print an error message x (in printf format)
*
@@ -56,6 +52,7 @@
* on failure */
const struct cbfs_header *cbfs_get_header(struct cbfs_media *media)
{
+ int32_t rel_offset;
const struct cbfs_header *header;
struct cbfs_media default_media;
@@ -66,22 +63,28 @@ const struct cbfs_header *cbfs_get_header(struct cbfs_media *media)
return CBFS_HEADER_INVALID_ADDRESS;
}
}
-
media->open(media);
- DEBUG("CBFS_HEADER_ROM_ADDRESS: 0x%x/0x%x\n", CBFS_HEADER_ROM_ADDRESS,
- CONFIG_LP_ROM_SIZE);
- header = media->map(media, CBFS_HEADER_ROM_ADDRESS, sizeof(*header));
+
+ if (!media->read(media, &rel_offset, (size_t)(0 - sizeof(int32_t)),
+ sizeof(int32_t))) {
+ ERROR("Could not read CBFS master header offset!\n");
+ return CBFS_HEADER_INVALID_ADDRESS;
+ }
+ header = media->map(media, (size_t)rel_offset, sizeof(*header));
+ DEBUG("CBFS header at %#zx (-%#zx from end of image).\n",
+ (size_t)rel_offset, (size_t)-rel_offset);
media->close(media);
if (header == CBFS_MEDIA_INVALID_MAP_ADDRESS) {
- ERROR("Failed to load CBFS header from 0x%x\n",
- CBFS_HEADER_ROM_ADDRESS);
+ ERROR("Failed to load CBFS header from %#zx(-%#zx)\n",
+ (size_t)rel_offset, (size_t)-rel_offset);
return CBFS_HEADER_INVALID_ADDRESS;
}
if (CBFS_HEADER_MAGIC != ntohl(header->magic)) {
- ERROR("Could not find valid CBFS master header at %x: "
- "%x vs %x.\n", CBFS_HEADER_ROM_ADDRESS, CBFS_HEADER_MAGIC,
+ ERROR("Could not find valid CBFS master header at %#zx(-%#zx): "
+ "magic %#.8x vs %#.8x.\n", (size_t)rel_offset,
+ (size_t)-rel_offset, CBFS_HEADER_MAGIC,
ntohl(header->magic));
if (header->magic == 0xffffffff) {
ERROR("Maybe ROM is not mapped properly?\n");