diff options
Diffstat (limited to 'arch/avr32/boot')
| -rw-r--r-- | arch/avr32/boot/u-boot/head.S | 35 | 
1 files changed, 29 insertions, 6 deletions
diff --git a/arch/avr32/boot/u-boot/head.S b/arch/avr32/boot/u-boot/head.S index 4488fa27fe9..2ffc298f061 100644 --- a/arch/avr32/boot/u-boot/head.S +++ b/arch/avr32/boot/u-boot/head.S @@ -8,6 +8,8 @@   * published by the Free Software Foundation.   */  #include <asm/setup.h> +#include <asm/thread_info.h> +#include <asm/sysreg.h>  	/*  	 * The kernel is loaded where we want it to be and all caches @@ -20,11 +22,6 @@  	.section .init.text,"ax"  	.global _start  _start: -	/* Check if the boot loader actually provided a tag table */ -	lddpc	r0, magic_number -	cp.w	r12, r0 -	brne	no_tag_table -  	/* Initialize .bss */  	lddpc	r2, bss_start_addr  	lddpc   r3, end_addr @@ -34,6 +31,25 @@ _start:  	cp      r2, r3  	brlo    1b +	/* Initialize status register */ +	lddpc	r0, init_sr +	mtsr	SYSREG_SR, r0 + +	/* Set initial stack pointer */ +	lddpc	sp, stack_addr +	sub	sp, -THREAD_SIZE + +#ifdef CONFIG_FRAME_POINTER +	/* Mark last stack frame */ +	mov	lr, 0 +	mov	r7, 0 +#endif + +	/* Check if the boot loader actually provided a tag table */ +	lddpc	r0, magic_number +	cp.w	r12, r0 +	brne	no_tag_table +  	/*  	 * Save the tag table address for later use. This must be done  	 * _after_ .bss has been initialized... @@ -53,8 +69,15 @@ bss_start_addr:  	.long   __bss_start  end_addr:  	.long   _end +init_sr: +	.long	0x007f0000	/* Supervisor mode, everything masked */ +stack_addr: +	.long	init_thread_union +panic_addr: +	.long	panic  no_tag_table:  	sub	r12, pc, (. - 2f) -	bral	panic +	/* branch to panic() which can be far away with that construct */ +	lddpc	pc, panic_addr  2:	.asciz	"Boot loader didn't provide correct magic number\n"  | 
