x86: provide stage_exit() like arm

The arm architectures have a stage_exit() function
which takes a void * pointer as an entry point. Provide
the same API for x86. This can make the booting paths
less architecture-specific.

Change-Id: I4ecfbf32f38f2e3817381b63e1f97e92654c5f97
Signed-off-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-on: http://review.coreboot.org/5086
Tested-by: build bot (Jenkins)
Reviewed-by: Patrick Georgi <patrick@georgi-clan.de>
This commit is contained in:
Aaron Durbin 2014-01-30 15:48:29 -06:00 committed by Aaron Durbin
parent efc5841ab4
commit e9aaa71fb1
3 changed files with 11 additions and 9 deletions

View File

@ -24,4 +24,12 @@
void asmlinkage copy_and_run(void); void asmlinkage copy_and_run(void);
void jmp_to_elf_entry(void *entry, unsigned long buffer, unsigned long size); void jmp_to_elf_entry(void *entry, unsigned long buffer, unsigned long size);
static inline void stage_exit(void *entry)
{
__asm__ volatile (
"jmp *%%edi\n"
:: "D"(entry)
);
}
#endif #endif

View File

@ -34,10 +34,7 @@ static void cbfs_and_run_core(const char *filename)
timestamp_add_now(TS_END_COPYRAM); timestamp_add_now(TS_END_COPYRAM);
print_debug("Jumping to image.\n"); print_debug("Jumping to image.\n");
__asm__ volatile ( stage_exit(dst);
"jmp *%%edi\n"
:: "D"(dst)
);
} }
void asmlinkage copy_and_run(void) void asmlinkage copy_and_run(void)

View File

@ -17,6 +17,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
#include <arch/stages.h>
#include <stdint.h> #include <stdint.h>
#include <stddef.h> #include <stddef.h>
#include <cbfs.h> #include <cbfs.h>
@ -180,11 +181,7 @@ static void vboot_load_ramstage(struct vboot_handoff *vboot_handoff,
timestamp_add_now(TS_END_COPYRAM); timestamp_add_now(TS_END_COPYRAM);
__asm__ volatile ( stage_exit(rmod_load.entry);
"movl $0, %%ebp\n"
"jmp *%%edi\n"
:: "D"(rmod_load.entry)
);
} }
void vboot_verify_firmware(struct romstage_handoff *handoff) void vboot_verify_firmware(struct romstage_handoff *handoff)