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:
parent
ab5b3e0d98
commit
2c6b33ce3e
|
@ -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
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue