Author: uwe Date: 2008-03-31 23:02:29 +0200 (Mon, 31 Mar 2008) New Revision: 3204
Modified: trunk/payloads/libpayload/i386/head.S trunk/payloads/libpayload/i386/main.c Log: 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
Modified: trunk/payloads/libpayload/i386/head.S =================================================================== --- trunk/payloads/libpayload/i386/head.S 2008-03-31 20:30:18 UTC (rev 3203) +++ trunk/payloads/libpayload/i386/head.S 2008-03-31 21:02:29 UTC (rev 3204) @@ -50,31 +50,26 @@ /* No interrupts, please. */ cli
- /* Get the current stack pointer. */ + /* Store current stack pointer. */ movl %esp, %esi
+ /* Setup new stack. */ movl _istack, %ebx
- /* lret needs %cs in the stack, so copy it over. */ - movw %cs, 4(%ebx) + movl (%ebx), %esp
- /* - * Exchange the current stack pointer for the one in the initial - * stack (which happens to be the new stack pointer). - */ - xchgl %esi, 16(%ebx) + /* Save old stack pointer. */ + pushl %esi
- /* Set the new stack pointer. */ - movl %esi, %esp - - /* Return into the main entry function and go. */ - lret - + /* Let's rock. */ + call start_main + _leave: - movl _istack, %ebx + /* Get old stack pointer. */ + popl %ebx
- /* Restore the stack pointer from the storage area. */ - movl 16(%ebx), %esp + /* Restore old stack. */ + movl %esp, %ebx
/* Return to the original context. */ lret
Modified: trunk/payloads/libpayload/i386/main.c =================================================================== --- trunk/payloads/libpayload/i386/main.c 2008-03-31 20:30:18 UTC (rev 3203) +++ trunk/payloads/libpayload/i386/main.c 2008-03-31 21:02:29 UTC (rev 3204) @@ -36,17 +36,12 @@ * stack we store the original stack pointer from the calling application. */
-static void start_main(void); extern void _leave(void);
static struct { - uint32_t eip[2]; - uint32_t raddr[2]; uint32_t esp; -} initial_stack __attribute__ ((section(".istack"))) = { - { (uint32_t) start_main, 0 }, - { (uint32_t) _leave, 0 }, - (uint32_t) & initial_stack, +} initial_stack __attribute__ ((section(".istack"))) = { + (uint32_t) &initial_stack, };
void *_istack = &initial_stack; @@ -55,7 +50,7 @@ * This is our C entry function - set up the system * and jump into the payload entry point. */ -static void start_main(void) +void start_main(void) { extern int main(void);
@@ -70,9 +65,10 @@ * user gets control goes here. */
- /* Go to the entry point. */ - - /* In the future we may care about the return value. */ + /* + * Go to the entry point. + * In the future we may care about the return value. + */ (void) main();
/*