61 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| /*
 | |
|  * 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>
 | |
| 
 | |
| 	/*
 | |
| 	 * 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:
 | |
| 	/* 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
 | |
| 	mov	r0, 0
 | |
| 	mov	r1, 0
 | |
| 1:      st.d    r2++, r0
 | |
| 	cp      r2, r3
 | |
| 	brlo    1b
 | |
| 
 | |
| 	/*
 | |
| 	 * 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
 | |
| 
 | |
| no_tag_table:
 | |
| 	sub	r12, pc, (. - 2f)
 | |
| 	bral	panic
 | |
| 2:	.asciz	"Boot loader didn't provide correct magic number\n"
 |