[coreboot] r3204 - trunk/payloads/libpayload/i386
svn at coreboot.org
svn at coreboot.org
Mon Mar 31 23:02:29 CEST 2008
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 at stuffit.at>
Acked-by: Uwe Hermann <uwe at 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();
/*
More information about the coreboot
mailing list