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 + +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