xref: /openbmc/u-boot/arch/arm/cpu/arm926ejs/start.S (revision 84ad6884)
1*84ad6884SPeter Tyser/*
2*84ad6884SPeter Tyser *  armboot - Startup Code for ARM926EJS CPU-core
3*84ad6884SPeter Tyser *
4*84ad6884SPeter Tyser *  Copyright (c) 2003  Texas Instruments
5*84ad6884SPeter Tyser *
6*84ad6884SPeter Tyser *  ----- Adapted for OMAP1610 OMAP730 from ARM925t code ------
7*84ad6884SPeter Tyser *
8*84ad6884SPeter Tyser *  Copyright (c) 2001	Marius Gr�ger <mag@sysgo.de>
9*84ad6884SPeter Tyser *  Copyright (c) 2002	Alex Z�pke <azu@sysgo.de>
10*84ad6884SPeter Tyser *  Copyright (c) 2002	Gary Jennejohn <garyj@denx.de>
11*84ad6884SPeter Tyser *  Copyright (c) 2003	Richard Woodruff <r-woodruff2@ti.com>
12*84ad6884SPeter Tyser *  Copyright (c) 2003	Kshitij <kshitij@ti.com>
13*84ad6884SPeter Tyser *
14*84ad6884SPeter Tyser * See file CREDITS for list of people who contributed to this
15*84ad6884SPeter Tyser * project.
16*84ad6884SPeter Tyser *
17*84ad6884SPeter Tyser * This program is free software; you can redistribute it and/or
18*84ad6884SPeter Tyser * modify it under the terms of the GNU General Public License as
19*84ad6884SPeter Tyser * published by the Free Software Foundation; either version 2 of
20*84ad6884SPeter Tyser * the License, or (at your option) any later version.
21*84ad6884SPeter Tyser *
22*84ad6884SPeter Tyser * This program is distributed in the hope that it will be useful,
23*84ad6884SPeter Tyser * but WITHOUT ANY WARRANTY; without even the implied warranty of
24*84ad6884SPeter Tyser * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
25*84ad6884SPeter Tyser * GNU General Public License for more details.
26*84ad6884SPeter Tyser *
27*84ad6884SPeter Tyser * You should have received a copy of the GNU General Public License
28*84ad6884SPeter Tyser * along with this program; if not, write to the Free Software
29*84ad6884SPeter Tyser * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
30*84ad6884SPeter Tyser * MA 02111-1307 USA
31*84ad6884SPeter Tyser */
32*84ad6884SPeter Tyser
33*84ad6884SPeter Tyser
34*84ad6884SPeter Tyser#include <config.h>
35*84ad6884SPeter Tyser#include <common.h>
36*84ad6884SPeter Tyser#include <version.h>
37*84ad6884SPeter Tyser
38*84ad6884SPeter Tyser#if defined(CONFIG_OMAP1610)
39*84ad6884SPeter Tyser#include <./configs/omap1510.h>
40*84ad6884SPeter Tyser#elif defined(CONFIG_OMAP730)
41*84ad6884SPeter Tyser#include <./configs/omap730.h>
42*84ad6884SPeter Tyser#endif
43*84ad6884SPeter Tyser
44*84ad6884SPeter Tyser/*
45*84ad6884SPeter Tyser *************************************************************************
46*84ad6884SPeter Tyser *
47*84ad6884SPeter Tyser * Jump vector table as in table 3.1 in [1]
48*84ad6884SPeter Tyser *
49*84ad6884SPeter Tyser *************************************************************************
50*84ad6884SPeter Tyser */
51*84ad6884SPeter Tyser
52*84ad6884SPeter Tyser
53*84ad6884SPeter Tyser.globl _start
54*84ad6884SPeter Tyser_start:
55*84ad6884SPeter Tyser	b	reset
56*84ad6884SPeter Tyser#ifdef CONFIG_PRELOADER
57*84ad6884SPeter Tyser/* No exception handlers in preloader */
58*84ad6884SPeter Tyser	ldr	pc, _hang
59*84ad6884SPeter Tyser	ldr	pc, _hang
60*84ad6884SPeter Tyser	ldr	pc, _hang
61*84ad6884SPeter Tyser	ldr	pc, _hang
62*84ad6884SPeter Tyser	ldr	pc, _hang
63*84ad6884SPeter Tyser	ldr	pc, _hang
64*84ad6884SPeter Tyser	ldr	pc, _hang
65*84ad6884SPeter Tyser
66*84ad6884SPeter Tyser_hang:
67*84ad6884SPeter Tyser	.word	do_hang
68*84ad6884SPeter Tyser/* pad to 64 byte boundary */
69*84ad6884SPeter Tyser	.word	0x12345678
70*84ad6884SPeter Tyser	.word	0x12345678
71*84ad6884SPeter Tyser	.word	0x12345678
72*84ad6884SPeter Tyser	.word	0x12345678
73*84ad6884SPeter Tyser	.word	0x12345678
74*84ad6884SPeter Tyser	.word	0x12345678
75*84ad6884SPeter Tyser	.word	0x12345678
76*84ad6884SPeter Tyser#else
77*84ad6884SPeter Tyser	ldr	pc, _undefined_instruction
78*84ad6884SPeter Tyser	ldr	pc, _software_interrupt
79*84ad6884SPeter Tyser	ldr	pc, _prefetch_abort
80*84ad6884SPeter Tyser	ldr	pc, _data_abort
81*84ad6884SPeter Tyser	ldr	pc, _not_used
82*84ad6884SPeter Tyser	ldr	pc, _irq
83*84ad6884SPeter Tyser	ldr	pc, _fiq
84*84ad6884SPeter Tyser
85*84ad6884SPeter Tyser_undefined_instruction:
86*84ad6884SPeter Tyser	.word undefined_instruction
87*84ad6884SPeter Tyser_software_interrupt:
88*84ad6884SPeter Tyser	.word software_interrupt
89*84ad6884SPeter Tyser_prefetch_abort:
90*84ad6884SPeter Tyser	.word prefetch_abort
91*84ad6884SPeter Tyser_data_abort:
92*84ad6884SPeter Tyser	.word data_abort
93*84ad6884SPeter Tyser_not_used:
94*84ad6884SPeter Tyser	.word not_used
95*84ad6884SPeter Tyser_irq:
96*84ad6884SPeter Tyser	.word irq
97*84ad6884SPeter Tyser_fiq:
98*84ad6884SPeter Tyser	.word fiq
99*84ad6884SPeter Tyser
100*84ad6884SPeter Tyser#endif	/* CONFIG_PRELOADER */
101*84ad6884SPeter Tyser	.balignl 16,0xdeadbeef
102*84ad6884SPeter Tyser
103*84ad6884SPeter Tyser
104*84ad6884SPeter Tyser/*
105*84ad6884SPeter Tyser *************************************************************************
106*84ad6884SPeter Tyser *
107*84ad6884SPeter Tyser * Startup Code (reset vector)
108*84ad6884SPeter Tyser *
109*84ad6884SPeter Tyser * do important init only if we don't start from memory!
110*84ad6884SPeter Tyser * setup Memory and board specific bits prior to relocation.
111*84ad6884SPeter Tyser * relocate armboot to ram
112*84ad6884SPeter Tyser * setup stack
113*84ad6884SPeter Tyser *
114*84ad6884SPeter Tyser *************************************************************************
115*84ad6884SPeter Tyser */
116*84ad6884SPeter Tyser
117*84ad6884SPeter Tyser_TEXT_BASE:
118*84ad6884SPeter Tyser	.word	TEXT_BASE
119*84ad6884SPeter Tyser
120*84ad6884SPeter Tyser.globl _armboot_start
121*84ad6884SPeter Tyser_armboot_start:
122*84ad6884SPeter Tyser	.word _start
123*84ad6884SPeter Tyser
124*84ad6884SPeter Tyser/*
125*84ad6884SPeter Tyser * These are defined in the board-specific linker script.
126*84ad6884SPeter Tyser */
127*84ad6884SPeter Tyser.globl _bss_start
128*84ad6884SPeter Tyser_bss_start:
129*84ad6884SPeter Tyser	.word __bss_start
130*84ad6884SPeter Tyser
131*84ad6884SPeter Tyser.globl _bss_end
132*84ad6884SPeter Tyser_bss_end:
133*84ad6884SPeter Tyser	.word _end
134*84ad6884SPeter Tyser
135*84ad6884SPeter Tyser#ifdef CONFIG_USE_IRQ
136*84ad6884SPeter Tyser/* IRQ stack memory (calculated at run-time) */
137*84ad6884SPeter Tyser.globl IRQ_STACK_START
138*84ad6884SPeter TyserIRQ_STACK_START:
139*84ad6884SPeter Tyser	.word	0x0badc0de
140*84ad6884SPeter Tyser
141*84ad6884SPeter Tyser/* IRQ stack memory (calculated at run-time) */
142*84ad6884SPeter Tyser.globl FIQ_STACK_START
143*84ad6884SPeter TyserFIQ_STACK_START:
144*84ad6884SPeter Tyser	.word 0x0badc0de
145*84ad6884SPeter Tyser#endif
146*84ad6884SPeter Tyser
147*84ad6884SPeter Tyser
148*84ad6884SPeter Tyser/*
149*84ad6884SPeter Tyser * the actual reset code
150*84ad6884SPeter Tyser */
151*84ad6884SPeter Tyser
152*84ad6884SPeter Tyserreset:
153*84ad6884SPeter Tyser	/*
154*84ad6884SPeter Tyser	 * set the cpu to SVC32 mode
155*84ad6884SPeter Tyser	 */
156*84ad6884SPeter Tyser	mrs	r0,cpsr
157*84ad6884SPeter Tyser	bic	r0,r0,#0x1f
158*84ad6884SPeter Tyser	orr	r0,r0,#0xd3
159*84ad6884SPeter Tyser	msr	cpsr,r0
160*84ad6884SPeter Tyser
161*84ad6884SPeter Tyser	/*
162*84ad6884SPeter Tyser	 * we do sys-critical inits only at reboot,
163*84ad6884SPeter Tyser	 * not when booting from ram!
164*84ad6884SPeter Tyser	 */
165*84ad6884SPeter Tyser#ifndef CONFIG_SKIP_LOWLEVEL_INIT
166*84ad6884SPeter Tyser	bl	cpu_init_crit
167*84ad6884SPeter Tyser#endif
168*84ad6884SPeter Tyser
169*84ad6884SPeter Tyser#ifndef CONFIG_SKIP_RELOCATE_UBOOT
170*84ad6884SPeter Tyserrelocate:				/* relocate U-Boot to RAM	    */
171*84ad6884SPeter Tyser	adr	r0, _start		/* r0 <- current position of code   */
172*84ad6884SPeter Tyser	ldr	r1, _TEXT_BASE		/* test if we run from flash or RAM */
173*84ad6884SPeter Tyser	cmp     r0, r1                  /* don't reloc during debug         */
174*84ad6884SPeter Tyser	beq     stack_setup
175*84ad6884SPeter Tyser	ldr	r2, _armboot_start
176*84ad6884SPeter Tyser	ldr	r3, _bss_start
177*84ad6884SPeter Tyser	sub	r2, r3, r2		/* r2 <- size of armboot            */
178*84ad6884SPeter Tyser	add	r2, r0, r2		/* r2 <- source end address         */
179*84ad6884SPeter Tyser
180*84ad6884SPeter Tysercopy_loop:
181*84ad6884SPeter Tyser	ldmia	r0!, {r3-r10}		/* copy from source address [r0]    */
182*84ad6884SPeter Tyser	stmia	r1!, {r3-r10}		/* copy to   target address [r1]    */
183*84ad6884SPeter Tyser	cmp	r0, r2			/* until source end addreee [r2]    */
184*84ad6884SPeter Tyser	ble	copy_loop
185*84ad6884SPeter Tyser#endif	/* CONFIG_SKIP_RELOCATE_UBOOT */
186*84ad6884SPeter Tyser
187*84ad6884SPeter Tyser	/* Set up the stack						    */
188*84ad6884SPeter Tyserstack_setup:
189*84ad6884SPeter Tyser	ldr	r0, _TEXT_BASE		/* upper 128 KiB: relocated uboot   */
190*84ad6884SPeter Tyser	sub	sp, r0, #128		/* leave 32 words for abort-stack   */
191*84ad6884SPeter Tyser#ifndef CONFIG_PRELOADER
192*84ad6884SPeter Tyser	sub	r0, r0, #CONFIG_SYS_MALLOC_LEN	/* malloc area                      */
193*84ad6884SPeter Tyser	sub	r0, r0, #CONFIG_SYS_GBL_DATA_SIZE /* bdinfo                        */
194*84ad6884SPeter Tyser#ifdef CONFIG_USE_IRQ
195*84ad6884SPeter Tyser	sub	r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
196*84ad6884SPeter Tyser#endif
197*84ad6884SPeter Tyser#endif /* CONFIG_PRELOADER */
198*84ad6884SPeter Tyser	sub	sp, r0, #12		/* leave 3 words for abort-stack    */
199*84ad6884SPeter Tyser	bic	sp, r0, #7		/* 8-byte align stack for ABI compliance */
200*84ad6884SPeter Tyser
201*84ad6884SPeter Tyserclear_bss:
202*84ad6884SPeter Tyser	ldr	r0, _bss_start		/* find start of bss segment        */
203*84ad6884SPeter Tyser	ldr	r1, _bss_end		/* stop here                        */
204*84ad6884SPeter Tyser	mov	r2, #0x00000000		/* clear                            */
205*84ad6884SPeter Tyser
206*84ad6884SPeter Tyser#ifndef CONFIG_PRELOADER
207*84ad6884SPeter Tyserclbss_l:str	r2, [r0]		/* clear loop...                    */
208*84ad6884SPeter Tyser	add	r0, r0, #4
209*84ad6884SPeter Tyser	cmp	r0, r1
210*84ad6884SPeter Tyser	ble	clbss_l
211*84ad6884SPeter Tyser
212*84ad6884SPeter Tyser	bl coloured_LED_init
213*84ad6884SPeter Tyser	bl red_LED_on
214*84ad6884SPeter Tyser#endif /* CONFIG_PRELOADER */
215*84ad6884SPeter Tyser
216*84ad6884SPeter Tyser	ldr	pc, _start_armboot
217*84ad6884SPeter Tyser
218*84ad6884SPeter Tyser_start_armboot:
219*84ad6884SPeter Tyser#ifdef CONFIG_NAND_SPL
220*84ad6884SPeter Tyser	.word nand_boot
221*84ad6884SPeter Tyser#else
222*84ad6884SPeter Tyser	.word start_armboot
223*84ad6884SPeter Tyser#endif /* CONFIG_NAND_SPL */
224*84ad6884SPeter Tyser
225*84ad6884SPeter Tyser
226*84ad6884SPeter Tyser/*
227*84ad6884SPeter Tyser *************************************************************************
228*84ad6884SPeter Tyser *
229*84ad6884SPeter Tyser * CPU_init_critical registers
230*84ad6884SPeter Tyser *
231*84ad6884SPeter Tyser * setup important registers
232*84ad6884SPeter Tyser * setup memory timing
233*84ad6884SPeter Tyser *
234*84ad6884SPeter Tyser *************************************************************************
235*84ad6884SPeter Tyser */
236*84ad6884SPeter Tyser#ifndef CONFIG_SKIP_LOWLEVEL_INIT
237*84ad6884SPeter Tysercpu_init_crit:
238*84ad6884SPeter Tyser	/*
239*84ad6884SPeter Tyser	 * flush v4 I/D caches
240*84ad6884SPeter Tyser	 */
241*84ad6884SPeter Tyser	mov	r0, #0
242*84ad6884SPeter Tyser	mcr	p15, 0, r0, c7, c7, 0	/* flush v3/v4 cache */
243*84ad6884SPeter Tyser	mcr	p15, 0, r0, c8, c7, 0	/* flush v4 TLB */
244*84ad6884SPeter Tyser
245*84ad6884SPeter Tyser	/*
246*84ad6884SPeter Tyser	 * disable MMU stuff and caches
247*84ad6884SPeter Tyser	 */
248*84ad6884SPeter Tyser	mrc	p15, 0, r0, c1, c0, 0
249*84ad6884SPeter Tyser	bic	r0, r0, #0x00002300	/* clear bits 13, 9:8 (--V- --RS) */
250*84ad6884SPeter Tyser	bic	r0, r0, #0x00000087	/* clear bits 7, 2:0 (B--- -CAM) */
251*84ad6884SPeter Tyser	orr	r0, r0, #0x00000002	/* set bit 2 (A) Align */
252*84ad6884SPeter Tyser	orr	r0, r0, #0x00001000	/* set bit 12 (I) I-Cache */
253*84ad6884SPeter Tyser	mcr	p15, 0, r0, c1, c0, 0
254*84ad6884SPeter Tyser
255*84ad6884SPeter Tyser	/*
256*84ad6884SPeter Tyser	 * Go setup Memory and board specific bits prior to relocation.
257*84ad6884SPeter Tyser	 */
258*84ad6884SPeter Tyser	mov	ip, lr		/* perserve link reg across call */
259*84ad6884SPeter Tyser	bl	lowlevel_init	/* go setup pll,mux,memory */
260*84ad6884SPeter Tyser	mov	lr, ip		/* restore link */
261*84ad6884SPeter Tyser	mov	pc, lr		/* back to my caller */
262*84ad6884SPeter Tyser#endif /* CONFIG_SKIP_LOWLEVEL_INIT */
263*84ad6884SPeter Tyser
264*84ad6884SPeter Tyser#ifndef CONFIG_PRELOADER
265*84ad6884SPeter Tyser/*
266*84ad6884SPeter Tyser *************************************************************************
267*84ad6884SPeter Tyser *
268*84ad6884SPeter Tyser * Interrupt handling
269*84ad6884SPeter Tyser *
270*84ad6884SPeter Tyser *************************************************************************
271*84ad6884SPeter Tyser */
272*84ad6884SPeter Tyser
273*84ad6884SPeter Tyser@
274*84ad6884SPeter Tyser@ IRQ stack frame.
275*84ad6884SPeter Tyser@
276*84ad6884SPeter Tyser#define S_FRAME_SIZE	72
277*84ad6884SPeter Tyser
278*84ad6884SPeter Tyser#define S_OLD_R0	68
279*84ad6884SPeter Tyser#define S_PSR		64
280*84ad6884SPeter Tyser#define S_PC		60
281*84ad6884SPeter Tyser#define S_LR		56
282*84ad6884SPeter Tyser#define S_SP		52
283*84ad6884SPeter Tyser
284*84ad6884SPeter Tyser#define S_IP		48
285*84ad6884SPeter Tyser#define S_FP		44
286*84ad6884SPeter Tyser#define S_R10		40
287*84ad6884SPeter Tyser#define S_R9		36
288*84ad6884SPeter Tyser#define S_R8		32
289*84ad6884SPeter Tyser#define S_R7		28
290*84ad6884SPeter Tyser#define S_R6		24
291*84ad6884SPeter Tyser#define S_R5		20
292*84ad6884SPeter Tyser#define S_R4		16
293*84ad6884SPeter Tyser#define S_R3		12
294*84ad6884SPeter Tyser#define S_R2		8
295*84ad6884SPeter Tyser#define S_R1		4
296*84ad6884SPeter Tyser#define S_R0		0
297*84ad6884SPeter Tyser
298*84ad6884SPeter Tyser#define MODE_SVC 0x13
299*84ad6884SPeter Tyser#define I_BIT	 0x80
300*84ad6884SPeter Tyser
301*84ad6884SPeter Tyser/*
302*84ad6884SPeter Tyser * use bad_save_user_regs for abort/prefetch/undef/swi ...
303*84ad6884SPeter Tyser * use irq_save_user_regs / irq_restore_user_regs for IRQ/FIQ handling
304*84ad6884SPeter Tyser */
305*84ad6884SPeter Tyser
306*84ad6884SPeter Tyser	.macro	bad_save_user_regs
307*84ad6884SPeter Tyser	@ carve out a frame on current user stack
308*84ad6884SPeter Tyser	sub	sp, sp, #S_FRAME_SIZE
309*84ad6884SPeter Tyser	stmia	sp, {r0 - r12}	@ Save user registers (now in svc mode) r0-r12
310*84ad6884SPeter Tyser
311*84ad6884SPeter Tyser	ldr	r2, _armboot_start
312*84ad6884SPeter Tyser	sub	r2, r2, #(CONFIG_STACKSIZE+CONFIG_SYS_MALLOC_LEN)
313*84ad6884SPeter Tyser	sub	r2, r2, #(CONFIG_SYS_GBL_DATA_SIZE+8)  @ set base 2 words into abort stack
314*84ad6884SPeter Tyser	@ get values for "aborted" pc and cpsr (into parm regs)
315*84ad6884SPeter Tyser	ldmia	r2, {r2 - r3}
316*84ad6884SPeter Tyser	add	r0, sp, #S_FRAME_SIZE		@ grab pointer to old stack
317*84ad6884SPeter Tyser	add	r5, sp, #S_SP
318*84ad6884SPeter Tyser	mov	r1, lr
319*84ad6884SPeter Tyser	stmia	r5, {r0 - r3}	@ save sp_SVC, lr_SVC, pc, cpsr
320*84ad6884SPeter Tyser	mov	r0, sp		@ save current stack into r0 (param register)
321*84ad6884SPeter Tyser	.endm
322*84ad6884SPeter Tyser
323*84ad6884SPeter Tyser	.macro	irq_save_user_regs
324*84ad6884SPeter Tyser	sub	sp, sp, #S_FRAME_SIZE
325*84ad6884SPeter Tyser	stmia	sp, {r0 - r12}			@ Calling r0-r12
326*84ad6884SPeter Tyser	@ !!!! R8 NEEDS to be saved !!!! a reserved stack spot would be good.
327*84ad6884SPeter Tyser	add	r8, sp, #S_PC
328*84ad6884SPeter Tyser	stmdb	r8, {sp, lr}^		@ Calling SP, LR
329*84ad6884SPeter Tyser	str	lr, [r8, #0]		@ Save calling PC
330*84ad6884SPeter Tyser	mrs	r6, spsr
331*84ad6884SPeter Tyser	str	r6, [r8, #4]		@ Save CPSR
332*84ad6884SPeter Tyser	str	r0, [r8, #8]		@ Save OLD_R0
333*84ad6884SPeter Tyser	mov	r0, sp
334*84ad6884SPeter Tyser	.endm
335*84ad6884SPeter Tyser
336*84ad6884SPeter Tyser	.macro	irq_restore_user_regs
337*84ad6884SPeter Tyser	ldmia	sp, {r0 - lr}^			@ Calling r0 - lr
338*84ad6884SPeter Tyser	mov	r0, r0
339*84ad6884SPeter Tyser	ldr	lr, [sp, #S_PC]			@ Get PC
340*84ad6884SPeter Tyser	add	sp, sp, #S_FRAME_SIZE
341*84ad6884SPeter Tyser	subs	pc, lr, #4		@ return & move spsr_svc into cpsr
342*84ad6884SPeter Tyser	.endm
343*84ad6884SPeter Tyser
344*84ad6884SPeter Tyser	.macro get_bad_stack
345*84ad6884SPeter Tyser	ldr	r13, _armboot_start		@ setup our mode stack
346*84ad6884SPeter Tyser	sub	r13, r13, #(CONFIG_STACKSIZE+CONFIG_SYS_MALLOC_LEN)
347*84ad6884SPeter Tyser	sub	r13, r13, #(CONFIG_SYS_GBL_DATA_SIZE+8) @ reserved a couple spots in abort stack
348*84ad6884SPeter Tyser
349*84ad6884SPeter Tyser	str	lr, [r13]	@ save caller lr in position 0 of saved stack
350*84ad6884SPeter Tyser	mrs	lr, spsr	@ get the spsr
351*84ad6884SPeter Tyser	str	lr, [r13, #4]	@ save spsr in position 1 of saved stack
352*84ad6884SPeter Tyser	mov	r13, #MODE_SVC	@ prepare SVC-Mode
353*84ad6884SPeter Tyser	@ msr	spsr_c, r13
354*84ad6884SPeter Tyser	msr	spsr, r13	@ switch modes, make sure moves will execute
355*84ad6884SPeter Tyser	mov	lr, pc		@ capture return pc
356*84ad6884SPeter Tyser	movs	pc, lr		@ jump to next instruction & switch modes.
357*84ad6884SPeter Tyser	.endm
358*84ad6884SPeter Tyser
359*84ad6884SPeter Tyser	.macro get_irq_stack			@ setup IRQ stack
360*84ad6884SPeter Tyser	ldr	sp, IRQ_STACK_START
361*84ad6884SPeter Tyser	.endm
362*84ad6884SPeter Tyser
363*84ad6884SPeter Tyser	.macro get_fiq_stack			@ setup FIQ stack
364*84ad6884SPeter Tyser	ldr	sp, FIQ_STACK_START
365*84ad6884SPeter Tyser	.endm
366*84ad6884SPeter Tyser#endif	/* CONFIG_PRELOADER */
367*84ad6884SPeter Tyser
368*84ad6884SPeter Tyser/*
369*84ad6884SPeter Tyser * exception handlers
370*84ad6884SPeter Tyser */
371*84ad6884SPeter Tyser#ifdef CONFIG_PRELOADER
372*84ad6884SPeter Tyser	.align	5
373*84ad6884SPeter Tyserdo_hang:
374*84ad6884SPeter Tyser	ldr	sp, _TEXT_BASE			/* switch to abort stack */
375*84ad6884SPeter Tyser1:
376*84ad6884SPeter Tyser	bl	1b				/* hang and never return */
377*84ad6884SPeter Tyser#else	/* !CONFIG_PRELOADER */
378*84ad6884SPeter Tyser	.align  5
379*84ad6884SPeter Tyserundefined_instruction:
380*84ad6884SPeter Tyser	get_bad_stack
381*84ad6884SPeter Tyser	bad_save_user_regs
382*84ad6884SPeter Tyser	bl	do_undefined_instruction
383*84ad6884SPeter Tyser
384*84ad6884SPeter Tyser	.align	5
385*84ad6884SPeter Tysersoftware_interrupt:
386*84ad6884SPeter Tyser	get_bad_stack
387*84ad6884SPeter Tyser	bad_save_user_regs
388*84ad6884SPeter Tyser	bl	do_software_interrupt
389*84ad6884SPeter Tyser
390*84ad6884SPeter Tyser	.align	5
391*84ad6884SPeter Tyserprefetch_abort:
392*84ad6884SPeter Tyser	get_bad_stack
393*84ad6884SPeter Tyser	bad_save_user_regs
394*84ad6884SPeter Tyser	bl	do_prefetch_abort
395*84ad6884SPeter Tyser
396*84ad6884SPeter Tyser	.align	5
397*84ad6884SPeter Tyserdata_abort:
398*84ad6884SPeter Tyser	get_bad_stack
399*84ad6884SPeter Tyser	bad_save_user_regs
400*84ad6884SPeter Tyser	bl	do_data_abort
401*84ad6884SPeter Tyser
402*84ad6884SPeter Tyser	.align	5
403*84ad6884SPeter Tysernot_used:
404*84ad6884SPeter Tyser	get_bad_stack
405*84ad6884SPeter Tyser	bad_save_user_regs
406*84ad6884SPeter Tyser	bl	do_not_used
407*84ad6884SPeter Tyser
408*84ad6884SPeter Tyser#ifdef CONFIG_USE_IRQ
409*84ad6884SPeter Tyser
410*84ad6884SPeter Tyser	.align	5
411*84ad6884SPeter Tyserirq:
412*84ad6884SPeter Tyser	get_irq_stack
413*84ad6884SPeter Tyser	irq_save_user_regs
414*84ad6884SPeter Tyser	bl	do_irq
415*84ad6884SPeter Tyser	irq_restore_user_regs
416*84ad6884SPeter Tyser
417*84ad6884SPeter Tyser	.align	5
418*84ad6884SPeter Tyserfiq:
419*84ad6884SPeter Tyser	get_fiq_stack
420*84ad6884SPeter Tyser	/* someone ought to write a more effiction fiq_save_user_regs */
421*84ad6884SPeter Tyser	irq_save_user_regs
422*84ad6884SPeter Tyser	bl	do_fiq
423*84ad6884SPeter Tyser	irq_restore_user_regs
424*84ad6884SPeter Tyser
425*84ad6884SPeter Tyser#else
426*84ad6884SPeter Tyser
427*84ad6884SPeter Tyser	.align	5
428*84ad6884SPeter Tyserirq:
429*84ad6884SPeter Tyser	get_bad_stack
430*84ad6884SPeter Tyser	bad_save_user_regs
431*84ad6884SPeter Tyser	bl	do_irq
432*84ad6884SPeter Tyser
433*84ad6884SPeter Tyser	.align	5
434*84ad6884SPeter Tyserfiq:
435*84ad6884SPeter Tyser	get_bad_stack
436*84ad6884SPeter Tyser	bad_save_user_regs
437*84ad6884SPeter Tyser	bl	do_fiq
438*84ad6884SPeter Tyser
439*84ad6884SPeter Tyser#endif
440*84ad6884SPeter Tyser#endif	/* CONFIG_PRELOADER */
441