[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