/*
 * \brief   Startup code for Genode applications
 * \author  Christian Helmuth
 * \date    2006-07-06
 */

/*
 * Copyright (C) 2006-2012 Genode Labs GmbH
 *
 * This file is part of the Genode OS framework, which is distributed
 * under the terms of the GNU General Public License version 2.
 */

/*--- .text (program code) -------------------------*/
	.text

	.globl _start
_start:

	movl %esp, __initial_sp
	/*
	 * environ = &argv[argc + 1]
	 * in Genode argc is always 1
	 */
	popl %eax /* argc */
	popl %eax /* argv[0] */
	popl %eax /* NULL */
	movl %esp, lx_environ

	/* XXX Switch to our own stack.  */
	movl $_stack_high,%esp

	/* Clear the base pointer so that stack backtraces will work.  */
	xorl %ebp,%ebp

	/* Jump into init C code */
	call _main

	/* We should never get here since _main does not return */
1:	int  $3
	jmp  2f
	.ascii "_main() returned."
2:	jmp  1b


/*--------------------------------------------------*/
	.data
	.globl	__dso_handle
__dso_handle:
	.long	0

	.globl	__initial_sp
__initial_sp:
	.long	0

/*--- .eh_frame (exception frames) -----------------*/
/*
	.section .eh_frame,"aw"
	.globl	__EH_FRAME_BEGIN__
__EH_FRAME_BEGIN__:
*/

/*--- .bss (non-initialized data) ------------------*/
	.bss
	.p2align 4
	.globl	_stack_low
_stack_low:
	.space	64*1024
	.globl	_stack_high
_stack_high:
