summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/arch/x86/include/arch/cbfs.h21
-rw-r--r--src/arch/x86/lib/walkcbfs.S6
-rw-r--r--src/include/cbfs_core.h14
3 files changed, 32 insertions, 9 deletions
diff --git a/src/arch/x86/include/arch/cbfs.h b/src/arch/x86/include/arch/cbfs.h
index 8a61d6e22d..964eb4edea 100644
--- a/src/arch/x86/include/arch/cbfs.h
+++ b/src/arch/x86/include/arch/cbfs.h
@@ -20,7 +20,9 @@
#ifndef __INCLUDE_ARCH_CBFS__
#define __INCLUDE_ARCH_CBFS__
-static void *walkcbfs(char *target)
+#include <cbfs_core.h>
+
+static struct cbfs_file *walkcbfs_head(char *target)
{
void *entry;
asm volatile (
@@ -30,6 +32,16 @@ static void *walkcbfs(char *target)
return entry;
}
+static void *walkcbfs(char *target)
+{
+ struct cbfs_file *head = walkcbfs_head(target);
+ if ((u32)head != 0)
+ return CBFS_SUBHEADER(head);
+
+ /* We should never reach this if 'target' exists */
+ return (void *)0;
+}
+
/* just enough to support findstage. copied because the original version doesn't easily pass through romcc */
struct cbfs_stage_restricted {
unsigned long compression;
@@ -38,7 +50,12 @@ struct cbfs_stage_restricted {
static inline unsigned long findstage(char* target)
{
- return ((struct cbfs_stage_restricted *)walkcbfs(target))->entry;
+ struct cbfs_stage_restricted *stage = walkcbfs(target);
+ if ((u32)stage != 0)
+ return stage->entry;
+
+ /* We should never reach this if 'target' exists */
+ return 0;
}
static inline void call(unsigned long addr, unsigned long bist)
diff --git a/src/arch/x86/lib/walkcbfs.S b/src/arch/x86/lib/walkcbfs.S
index 2dc9617651..60eb8b53b0 100644
--- a/src/arch/x86/lib/walkcbfs.S
+++ b/src/arch/x86/lib/walkcbfs.S
@@ -18,7 +18,7 @@
/*
* input %esi: filename
* input %esp: return address (not pointer to return address!)
- * output %eax: entry point
+ * output %eax: pointer to CBFS header
* clobbers %ebx, %ecx, %edi
*/
walkcbfs_asm:
@@ -59,9 +59,7 @@ walker:
jnz tryharder
/* we found it! */
- mov CBFS_FILE_OFFSET(%ebx), %eax
- bswap %eax
- add %ebx, %eax
+ mov %ebx, %eax
jmp *%esp
tryharder:
diff --git a/src/include/cbfs_core.h b/src/include/cbfs_core.h
index 08fe8150ed..04b5dd7f23 100644
--- a/src/include/cbfs_core.h
+++ b/src/include/cbfs_core.h
@@ -134,6 +134,15 @@ struct cbfs_file {
uint32_t offset;
} __attribute__((packed));
+#define CBFS_NAME(_c) (((char *) (_c)) + sizeof(struct cbfs_file))
+#define CBFS_SUBHEADER(_p) ( (void *) ((((uint8_t *) (_p)) + ntohl((_p)->offset))) )
+
+/*
+ * ROMCC does not understand uint64_t, so we hide future definitions as they are
+ * unlikely to be ever needed from ROMCC
+ */
+#ifndef __ROMCC__
+
/*** Component sub-headers ***/
/* Following are component sub-headers for the "standard"
@@ -177,9 +186,6 @@ struct cbfs_optionrom {
uint32_t len;
} __attribute__((packed));
-#define CBFS_NAME(_c) (((char *) (_c)) + sizeof(struct cbfs_file))
-#define CBFS_SUBHEADER(_p) ( (void *) ((((uint8_t *) (_p)) + ntohl((_p)->offset))) )
-
#define CBFS_MEDIA_INVALID_MAP_ADDRESS ((void*)(0xffffffff))
#define CBFS_DEFAULT_MEDIA ((void*)(0x0))
@@ -225,4 +231,6 @@ int cbfs_decompress(int algo, void *src, void *dst, int len);
* on failure */
const struct cbfs_header *cbfs_get_header(struct cbfs_media *media);
+#endif /* __ROMCC__ */
+
#endif