[coreboot] libpayload: Add an exec() and i386_do_exec() function

Jordan Crouse jordan.crouse at amd.com
Fri May 16 03:54:44 CEST 2008


On 16/05/08 02:08 +0200, Uwe Hermann wrote:
> On Tue, May 13, 2008 at 05:34:09PM -0600, jordan.crouse at amd.com wrote:
> > Add functions for libpayload to execute other payloads in memory,
> > and have those functions return cleanly.
> > 
> > Signed-off-by: Jordan Crouse <jordan.crouse at amd.com>
> > Index: libpayload/i386/Makefile.inc
> > ===================================================================
> > --- libpayload.orig/i386/Makefile.inc	2008-05-13 13:40:07.000000000 -0600
> > +++ libpayload/i386/Makefile.inc	2008-05-13 13:42:59.000000000 -0600
> > @@ -29,3 +29,4 @@
> >  
> >  TARGETS-y += i386/head.o i386/main.o i386/sysinfo.o
> >  TARGETS-y += i386/timer.o i386/coreboot.o i386/util.o
> > +TARGETS-y += i386/exec.o
> > Index: libpayload/i386/exec.S
> > ===================================================================
> > --- /dev/null	1970-01-01 00:00:00.000000000 +0000
> > +++ libpayload/i386/exec.S	2008-05-13 13:42:59.000000000 -0600
> > @@ -0,0 +1,64 @@
> > +/* calling syntax:  i386_do_exec(long addr, int argc, char **argv, int *ret) */
> > +
> > +.align 4
> > +.text
> > +
> > +.global i386_do_exec
> > +        .type i386_do_exec, at function
> > +
> > +i386_do_exec:
> > +	pushl %ebp
> > +        movl %esp, %ebp
> > +	pushl %eax
> > +
> > +	# Put the run address in %eax
> > +	movl 8(%ebp), %eax
> > +
> > +	# Save off the rest of the registers
> > +
> > +	pushl %esi
> > +	pushl %ecx
> > +	pushl %ebp
> > +
> > +	# Push the argc and argv pointers on to the stack
> > +
> > +	movl 12(%ebp), %esi
> > +	movl 16(%ebp), %ecx
> > +
> > +	pushl %esi
> > +	pushl %ecx
> > +
> > +	# Move a "magic" number on the stack - the other
> > +	# payload will use this as a clue that the argc
> > +	# and argv are sane
> > +
> > +	movl  $12345678, %ecx
> 
> This should probably be documented somewhere and/or agreed upon on the list,
> as it introduces sort an "API" of some sort? It'll be only relevant for
> "our" payloads ("well-behaved" payloads), right?

Yeah - this needs to be documented.  Most of it should be similar to how
libc behaves, but there will be differences.  The magic number was added
to avoid the possiblity that the 'argc' we pop off of the stack is a 
random and very large number.  That would suck.

> > Index: libpayload/i386/head.S
> > ===================================================================
> > --- libpayload.orig/i386/head.S	2008-05-13 13:40:07.000000000 -0600
> > +++ libpayload/i386/head.S	2008-05-13 13:42:59.000000000 -0600
> > @@ -63,13 +63,14 @@
> >  
> >  	/* Let's rock. */
> >  	call start_main
> > -	
> > +
> > +	/* %eax has the return value - pass it on unmolested */
> >  _leave:
> >  	/* Get old stack pointer. */
> >  	popl %ebx
> >  
> >  	/* Restore old stack. */
> > -	movl %esp, %ebx
> > +	movl %ebx, %esp
> 
> Is this related, or was it a bug before?

Existing bug, but clearly relevant now that we have something to return.

Jordan
-- 
Jordan Crouse
Systems Software Development Engineer 
Advanced Micro Devices, Inc.





More information about the coreboot mailing list