1/* 2 * Startup code for use with the u-boot bootloader. 3 * 4 * Copyright (C) 2004-2006 Atmel Corporation 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 2 as 8 * published by the Free Software Foundation. 9 */ 10#include <asm/setup.h> 11#include <asm/thread_info.h> 12#include <asm/sysreg.h> 13 14 /* 15 * The kernel is loaded where we want it to be and all caches 16 * have just been flushed. We get two parameters from u-boot: 17 * 18 * r12 contains a magic number (ATAG_MAGIC) 19 * r11 points to a tag table providing information about 20 * the system. 21 */ 22 .section .init.text,"ax" 23 .global _start 24_start: 25 /* Initialize .bss */ 26 lddpc r2, bss_start_addr 27 lddpc r3, end_addr 28 mov r0, 0 29 mov r1, 0 301: st.d r2++, r0 31 cp r2, r3 32 brlo 1b 33 34 /* Initialize status register */ 35 lddpc r0, init_sr 36 mtsr SYSREG_SR, r0 37 38 /* Set initial stack pointer */ 39 lddpc sp, stack_addr 40 sub sp, -THREAD_SIZE 41 42#ifdef CONFIG_FRAME_POINTER 43 /* Mark last stack frame */ 44 mov lr, 0 45 mov r7, 0 46#endif 47 48 /* Check if the boot loader actually provided a tag table */ 49 lddpc r0, magic_number 50 cp.w r12, r0 51 brne no_tag_table 52 53 /* 54 * Save the tag table address for later use. This must be done 55 * _after_ .bss has been initialized... 56 */ 57 lddpc r0, tag_table_addr 58 st.w r0[0], r11 59 60 /* Jump to loader-independent setup code */ 61 rjmp kernel_entry 62 63 .align 2 64magic_number: 65 .long ATAG_MAGIC 66tag_table_addr: 67 .long bootloader_tags 68bss_start_addr: 69 .long __bss_start 70end_addr: 71 .long _end 72init_sr: 73 .long 0x007f0000 /* Supervisor mode, everything masked */ 74stack_addr: 75 .long init_thread_union 76panic_addr: 77 .long panic 78 79no_tag_table: 80 sub r12, pc, (. - 2f) 81 /* branch to panic() which can be far away with that construct */ 82 lddpc pc, panic_addr 832: .asciz "Boot loader didn't provide correct magic number\n" 84