[coreboot] v3 qemu and gcc-4.3.0

Jordan Crouse jordan.crouse at amd.com
Sat Mar 22 16:11:11 CET 2008


On 22/03/08 04:47 +0100, Devils-Hawk wrote:
> > You are probably crashing on the lret at the bottom of the
> > entry function in i386/head.S.  If you set up gdb, you should be able
> > to stop execution right before the lret (if you set a breakpoint at the
> > ElF entrypoint, the offending instruction is only 7 or 8 instructions past
> > the entry).  I would like to know what is on the stack at this point (
> > dump the two dwords at %esp).  I'm guessing that the stack is wrong, and
> > thats causing the triple fault.
> >
> > Jordan
> Yes, it did crash exactly at the lret of the _entry function. After trying to 
> understand some of the funkiness in head.S i came up with following patch 
> which did fix the problem but i should probably still look whats going wrong 
> with the original code. Its get getting quite late around here so I'll just 
> post what i have and get some sleep first. ;)
> 
> 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>

I appreciate your efforts, but since the previous code worked fine on
hardware and SimNow (and most versions of qemu, for that matter), we're
ignoring a flaw in Qemu that should be investigated.  I would hate to
cover something up that would come back to bite us later.

That said, the code below is good, with the changes below:

> Index: i386/head.S
> ===================================================================
> --- i386/head.S	(revision 3185)
> +++ i386/head.S	(working copy)
> @@ -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

Get rid of this.

> -	/* lret needs %cs in the stack, so copy it over. */
> -	movw %cs, 4(%ebx)
> +	movl (%ebx), %esp

If we go with this method, then we don't need the initial stack
structure at all - replace this with

	movl _stack, %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
	
	wrong direction - it should be
	movl %ebx, %esp

>  	/* Return to the original context. */
> 	lret

With the changes, this should be just a ret

> Index: i386/main.c
> ===================================================================
> --- i386/main.c	(revision 3185)
> +++ i386/main.c	(working copy)
> @@ -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;

Get rid of all this.

> @@ -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);
>  

And finally, remove the istack segment from the linker script.

Thanks,
Jordan





More information about the coreboot mailing list