summaryrefslogtreecommitdiffstats
path: root/kernel/arch/avr32/boot/u-boot/head.S
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/arch/avr32/boot/u-boot/head.S')
-rw-r--r--kernel/arch/avr32/boot/u-boot/head.S83
1 files changed, 83 insertions, 0 deletions
diff --git a/kernel/arch/avr32/boot/u-boot/head.S b/kernel/arch/avr32/boot/u-boot/head.S
new file mode 100644
index 000000000..2ffc298f0
--- /dev/null
+++ b/kernel/arch/avr32/boot/u-boot/head.S
@@ -0,0 +1,83 @@
+/*
+ * Startup code for use with the u-boot bootloader.
+ *
+ * Copyright (C) 2004-2006 Atmel Corporation
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * 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
+ * have just been flushed. We get two parameters from u-boot:
+ *
+ * r12 contains a magic number (ATAG_MAGIC)
+ * r11 points to a tag table providing information about
+ * the system.
+ */
+ .section .init.text,"ax"
+ .global _start
+_start:
+ /* Initialize .bss */
+ lddpc r2, bss_start_addr
+ lddpc r3, end_addr
+ mov r0, 0
+ mov r1, 0
+1: st.d r2++, r0
+ 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...
+ */
+ lddpc r0, tag_table_addr
+ st.w r0[0], r11
+
+ /* Jump to loader-independent setup code */
+ rjmp kernel_entry
+
+ .align 2
+magic_number:
+ .long ATAG_MAGIC
+tag_table_addr:
+ .long bootloader_tags
+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)
+ /* 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"