armv7: create init.S for early ARMv7 init
The old start.S file did a lot of work and had AP-specific #ifndef's. The new init.S will eventually contain only bare minimum generic ARM code for use by the bootblock. Processor-specific stuff and things that take place later in the boot process should go elsewhere. Change-Id: I7db0a77ee4bbad1ddecb193ea125d8941a50532b Signed-off-by: David Hendricks <dhendrix@chromium.org> Reviewed-on: http://review.coreboot.org/2083 Tested-by: build bot (Jenkins) Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
This commit is contained in:
		
				
					committed by
					
						 Ronald G. Minnich
						Ronald G. Minnich
					
				
			
			
				
	
			
			
			
						parent
						
							1e0e55615f
						
					
				
				
					commit
					8583ac390a
				
			| @@ -142,9 +142,7 @@ endif | |||||||
| CFLAGS += -D__KERNEL__ | CFLAGS += -D__KERNEL__ | ||||||
| CFLAGS += -D__LINUX_ARM_ARCH__=7 | CFLAGS += -D__LINUX_ARM_ARCH__=7 | ||||||
|  |  | ||||||
| # FIXME(dhendrix): trying to split start.S apart... | crt0s = $(src)/arch/armv7/init/init.S | ||||||
| crt0s = $(src)/arch/armv7/start.S |  | ||||||
| #crt0s = $(src)/arch/armv7/romstage.S |  | ||||||
| ldscripts = | ldscripts = | ||||||
| ldscripts += $(src)/arch/armv7/romstage.ld | ldscripts += $(src)/arch/armv7/romstage.ld | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										94
									
								
								src/arch/armv7/init/init.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								src/arch/armv7/init/init.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,94 @@ | |||||||
|  | /* | ||||||
|  |  * Early initialization code for ARMv7 architecture. | ||||||
|  |  * | ||||||
|  |  * This file is based off of the OMAP3530/ARM Cortex start.S file from Das | ||||||
|  |  * U-Boot, which itself got the file from armboot. | ||||||
|  |  * | ||||||
|  |  * Copyright (c) 2004	Texas Instruments <r-woodruff2@ti.com> | ||||||
|  |  * Copyright (c) 2001	Marius Gröger <mag@sysgo.de> | ||||||
|  |  * Copyright (c) 2002	Alex Züpke <azu@sysgo.de> | ||||||
|  |  * Copyright (c) 2002	Gary Jennejohn <garyj@denx.de> | ||||||
|  |  * Copyright (c) 2003	Richard Woodruff <r-woodruff2@ti.com> | ||||||
|  |  * Copyright (c) 2003	Kshitij <kshitij@ti.com> | ||||||
|  |  * Copyright (c) 2006-2008 Syed Mohammed Khasim <x0khasim@ti.com> | ||||||
|  |  * Copyright (c) 2013   The Chromium OS Authors | ||||||
|  |  * | ||||||
|  |  * This program is free software; you can redistribute it and/or | ||||||
|  |  * modify it under the terms of the GNU General Public License as | ||||||
|  |  * published by the Free Software Foundation; either version 2 of | ||||||
|  |  * the License, or (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * This program is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the | ||||||
|  |  * GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU General Public License | ||||||
|  |  * along with this program; if not, write to the Free Software | ||||||
|  |  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, | ||||||
|  |  * MA 02111-1307 USA | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #define __ASSEMBLY__ | ||||||
|  | #include <system.h> | ||||||
|  |  | ||||||
|  | .globl _start | ||||||
|  | _start: b	reset | ||||||
|  | 	ldr	pc, _undefined_instruction | ||||||
|  | 	ldr	pc, _software_interrupt | ||||||
|  | 	ldr	pc, _prefetch_abort | ||||||
|  | 	ldr	pc, _data_abort | ||||||
|  | 	ldr	pc, _not_used | ||||||
|  | 	ldr	pc, _irq | ||||||
|  | 	ldr	pc, _fiq | ||||||
|  | _undefined_instruction: .word _undefined_instruction | ||||||
|  | _software_interrupt:	.word _software_interrupt | ||||||
|  | _prefetch_abort:	.word _prefetch_abort | ||||||
|  | _data_abort:		.word _data_abort | ||||||
|  | _not_used:		.word _not_used | ||||||
|  | _irq:			.word _irq | ||||||
|  | _fiq:			.word _fiq | ||||||
|  | _pad:			.word 0x12345678 /* now 16*4=64 */ | ||||||
|  |  | ||||||
|  | 	.balignl 16,0xdeadbeef | ||||||
|  |  | ||||||
|  | reset: | ||||||
|  | 	/* | ||||||
|  | 	 * set the cpu to SVC32 mode | ||||||
|  | 	 */ | ||||||
|  | 	mrs	r0, cpsr | ||||||
|  | 	bic	r0, r0, #0x1f | ||||||
|  | 	orr	r0, r0, #0xd3 | ||||||
|  | 	msr	cpsr,r0 | ||||||
|  |  | ||||||
|  | 	/* | ||||||
|  | 	 * From Cortex-A Series Programmer's Guide: | ||||||
|  | 	 * Only CPU 0 performs initialization. Other CPUs go into WFI | ||||||
|  | 	 * to do this, first work out which CPU this is | ||||||
|  | 	 * this code typically is run before any other initialization step | ||||||
|  | 	 */ | ||||||
|  | 	mrc p15, 0, r1, c0, c0, 5	@ Read Multiprocessor Affinity Register | ||||||
|  | 	and r1, r1, #0x3 @ Extract CPU ID bits | ||||||
|  | 	cmp r1, #0 | ||||||
|  | 	bne wait_for_interrupt		@ If this is not core0, wait | ||||||
|  |  | ||||||
|  | 	/* Set V=0 in CP15 SCTRL register - for VBAR to point to vector */ | ||||||
|  | 	mrc	p15, 0, r0, c1, c0, 0	@ Read CP15 SCTRL Register | ||||||
|  | 	bic	r0, #CR_V		@ V = 0 | ||||||
|  | 	mcr	p15, 0, r0, c1, c0, 0	@ Write CP15 SCTRL Register | ||||||
|  |  | ||||||
|  | 	/* Set vector address in CP15 VBAR register */ | ||||||
|  | 	ldr	r0, =_start | ||||||
|  | 	mcr	p15, 0, r0, c12, c0, 0	@Set VBAR | ||||||
|  |  | ||||||
|  | /* Set stackpointer in internal RAM to call board_init_f */ | ||||||
|  | call_board_init_f: | ||||||
|  | 	ldr	sp, =(CONFIG_SYS_INIT_SP_ADDR) | ||||||
|  | 	mov	sp, r0 | ||||||
|  | 	bic	sp, sp, #7 /* 8-byte alignment for ABI compliance */ | ||||||
|  | 	ldr	r0,=0x00000000 | ||||||
|  | 	bl	board_init_f | ||||||
|  |  | ||||||
|  | wait_for_interrupt: | ||||||
|  | 	wfi | ||||||
|  | 	mov	pc, lr			@ back to my caller | ||||||
		Reference in New Issue
	
	Block a user