Libpayload fixes to prevent triple-faults when running in QEMU.

Let the linker figure out the correct address and just CALL the
start_main entry point.

Signed-off-by: Klaus Schnass <dev@stuffit.at>
Acked-by: Uwe Hermann <uwe@hermann-uwe.de>



git-svn-id: svn://svn.coreboot.org/coreboot/trunk@3204 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
This commit is contained in:
Klaus Schnass 2008-03-31 21:02:29 +00:00 committed by Uwe Hermann
parent ab5b3e0d98
commit 2c6b33ce3e
2 changed files with 19 additions and 28 deletions

View File

@ -50,31 +50,26 @@ _init:
/* No interrupts, please. */ /* No interrupts, please. */
cli cli
/* Get the current stack pointer. */ /* Store current stack pointer. */
movl %esp, %esi movl %esp, %esi
/* Setup new stack. */
movl _istack, %ebx movl _istack, %ebx
/* lret needs %cs in the stack, so copy it over. */ movl (%ebx), %esp
movw %cs, 4(%ebx)
/* /* Save old stack pointer. */
* Exchange the current stack pointer for the one in the initial pushl %esi
* stack (which happens to be the new stack pointer).
*/
xchgl %esi, 16(%ebx)
/* Set the new stack pointer. */ /* Let's rock. */
movl %esi, %esp call start_main
/* Return into the main entry function and go. */
lret
_leave: _leave:
movl _istack, %ebx /* Get old stack pointer. */
popl %ebx
/* Restore the stack pointer from the storage area. */ /* Restore old stack. */
movl 16(%ebx), %esp movl %esp, %ebx
/* Return to the original context. */ /* Return to the original context. */
lret lret

View File

@ -36,17 +36,12 @@
* stack we store the original stack pointer from the calling application. * stack we store the original stack pointer from the calling application.
*/ */
static void start_main(void);
extern void _leave(void); extern void _leave(void);
static struct { static struct {
uint32_t eip[2];
uint32_t raddr[2];
uint32_t esp; uint32_t esp;
} initial_stack __attribute__ ((section(".istack"))) = { } initial_stack __attribute__ ((section(".istack"))) = {
{ (uint32_t) start_main, 0 }, (uint32_t) &initial_stack,
{ (uint32_t) _leave, 0 },
(uint32_t) & initial_stack,
}; };
void *_istack = &initial_stack; void *_istack = &initial_stack;
@ -55,7 +50,7 @@ void *_istack = &initial_stack;
* This is our C entry function - set up the system * This is our C entry function - set up the system
* and jump into the payload entry point. * and jump into the payload entry point.
*/ */
static void start_main(void) void start_main(void)
{ {
extern int main(void); extern int main(void);
@ -70,9 +65,10 @@ static void start_main(void)
* user gets control goes here. * user gets control goes here.
*/ */
/* Go to the entry point. */ /*
* Go to the entry point.
/* In the future we may care about the return value. */ * In the future we may care about the return value.
*/
(void) main(); (void) main();
/* /*