/*
 * \brief   Startup code for core on ARM
 * \author  Martin Stein
 * \author  Stefan Kalkowski
 * \date    2011-10-01
 *
 * The code in this file is compliant to the general ARM instruction- and
 * register-set but the semantics are tested only on ARMv6 and ARMv7 by now.
 */

/*
 * Copyright (C) 2011-2013 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.
 */

/**
 * Do no operation for 'count' cycles
 */
.macro _nop count
	.rept \count
		mov r8, r8
	.endr
.endm

.section .text

	/* ELF entry symbol */
	.global _start
	_start:

		/* idle a little initially because 'u-boot' likes it this way */
		_nop 8

		/* zero-fill BSS segment, BSS boundaries must be aligned to 4 */
		.extern _bss_start
		.extern _bss_end
		ldr r0, =_bss_start
		ldr r1, =_bss_end
		mov r2, #0
		1:
		cmp r1, r0
		ble 2f
		str r2, [r0]
		add r0, r0, #4
		b 1b
		2:

		/* enable C++ to prepare the first kernel run */
		ldr sp, =_kernel_stack_high
		bl init_phys_kernel

		/* call kernel routine */
		.extern kernel
		_start_kernel:
		ldr sp, =_kernel_stack_high
		bl kernel

		/* catch erroneous kernel return */
		3: b 3b

	/* handle for dynamic symbol objects */
	.align 3
	.global __dso_handle
	__dso_handle: .long 0

.section .bss

	/* kernel stack */
	.align 3
	.space 64*1024
	.global _kernel_stack_high
	_kernel_stack_high:

	/* main-thread UTCB-pointer for the Genode thread-API */
	.align 3
	.global _main_utcb
	_main_utcb:  .long 0

