summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/cbfs_core.c33
-rw-r--r--src/lib/cbfs_core.h7
2 files changed, 21 insertions, 19 deletions
diff --git a/src/lib/cbfs_core.c b/src/lib/cbfs_core.c
index acd434fb48..80d66ca3eb 100644
--- a/src/lib/cbfs_core.c
+++ b/src/lib/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)
*
@@ -58,6 +54,7 @@
* on failure */
const struct cbfs_header *cbfs_get_header(struct cbfs_media *media)
{
+ size_t offset;
const struct cbfs_header *header;
struct cbfs_media default_media;
@@ -68,22 +65,34 @@ 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_ROM_SIZE);
- header = media->map(media, CBFS_HEADER_ROM_ADDRESS, sizeof(*header));
+
+ /* TODO: allow negative offsets from the end of the CBFS image at media
+ * layer (like libpayload) so we can combine these two cases. */
+ if (IS_ENABLED(CONFIG_ARCH_X86)) {
+ offset = *(int32_t *)(uintptr_t)0xfffffffc;
+ header = media->map(media, offset, sizeof(*header));
+ } else {
+ int32_t rel_offset;
+ if (!media->read(media, &rel_offset, CONFIG_CBFS_SIZE -
+ sizeof(int32_t), sizeof(int32_t))) {
+ ERROR("Could not read CBFS master header offset!\n");
+ return CBFS_HEADER_INVALID_ADDRESS;
+ }
+ offset = CONFIG_CBFS_SIZE + rel_offset;
+ header = media->map(media, offset, sizeof(*header));
+ }
+ DEBUG("CBFS header offset: 0x%zx/0x%x\n", offset, CONFIG_ROM_SIZE);
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 0x%zx\n", 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: "
+ "magic %#.8x vs %#.8x.\n", offset, CBFS_HEADER_MAGIC,
ntohl(header->magic));
if (header->magic == 0xffffffff) {
ERROR("Maybe ROM is not mapped properly?\n");
diff --git a/src/lib/cbfs_core.h b/src/lib/cbfs_core.h
index 221fe5d34d..c301c337a2 100644
--- a/src/lib/cbfs_core.h
+++ b/src/lib/cbfs_core.h
@@ -42,11 +42,4 @@
# endif
#endif
-#if defined(CONFIG_CBFS_HEADER_ROM_OFFSET) && (CONFIG_CBFS_HEADER_ROM_OFFSET)
-# define CBFS_HEADER_ROM_ADDRESS (CONFIG_CBFS_HEADER_ROM_OFFSET)
-#else
-// Indirect address: only works on 32bit top-aligned systems.
-# define CBFS_HEADER_ROM_ADDRESS (*(uint32_t *)0xfffffffc)
-#endif
-
#endif /* __LIB_CBFS_CORE */