1*f56348afSSteve Sakoman/* 2*f56348afSSteve Sakoman * armboot - Startup Code for OMAP3530/ARM Cortex CPU-core 3*f56348afSSteve Sakoman * 4*f56348afSSteve Sakoman * Copyright (c) 2004 Texas Instruments <r-woodruff2@ti.com> 5*f56348afSSteve Sakoman * 6*f56348afSSteve Sakoman * Copyright (c) 2001 Marius Gröger <mag@sysgo.de> 7*f56348afSSteve Sakoman * Copyright (c) 2002 Alex Züpke <azu@sysgo.de> 8*f56348afSSteve Sakoman * Copyright (c) 2002 Gary Jennejohn <garyj@denx.de> 9*f56348afSSteve Sakoman * Copyright (c) 2003 Richard Woodruff <r-woodruff2@ti.com> 10*f56348afSSteve Sakoman * Copyright (c) 2003 Kshitij <kshitij@ti.com> 11*f56348afSSteve Sakoman * Copyright (c) 2006-2008 Syed Mohammed Khasim <x0khasim@ti.com> 12*f56348afSSteve Sakoman * 13*f56348afSSteve Sakoman * See file CREDITS for list of people who contributed to this 14*f56348afSSteve Sakoman * project. 15*f56348afSSteve Sakoman * 16*f56348afSSteve Sakoman * This program is free software; you can redistribute it and/or 17*f56348afSSteve Sakoman * modify it under the terms of the GNU General Public License as 18*f56348afSSteve Sakoman * published by the Free Software Foundation; either version 2 of 19*f56348afSSteve Sakoman * the License, or (at your option) any later version. 20*f56348afSSteve Sakoman * 21*f56348afSSteve Sakoman * This program is distributed in the hope that it will be useful, 22*f56348afSSteve Sakoman * but WITHOUT ANY WARRANTY; without even the implied warranty of 23*f56348afSSteve Sakoman * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 24*f56348afSSteve Sakoman * GNU General Public License for more details. 25*f56348afSSteve Sakoman * 26*f56348afSSteve Sakoman * You should have received a copy of the GNU General Public License 27*f56348afSSteve Sakoman * along with this program; if not, write to the Free Software 28*f56348afSSteve Sakoman * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 29*f56348afSSteve Sakoman * MA 02111-1307 USA 30*f56348afSSteve Sakoman */ 31*f56348afSSteve Sakoman 32*f56348afSSteve Sakoman#include <config.h> 33*f56348afSSteve Sakoman#include <version.h> 34*f56348afSSteve Sakoman 35*f56348afSSteve Sakoman.globl _start 36*f56348afSSteve Sakoman_start: b reset 37*f56348afSSteve Sakoman ldr pc, _undefined_instruction 38*f56348afSSteve Sakoman ldr pc, _software_interrupt 39*f56348afSSteve Sakoman ldr pc, _prefetch_abort 40*f56348afSSteve Sakoman ldr pc, _data_abort 41*f56348afSSteve Sakoman ldr pc, _not_used 42*f56348afSSteve Sakoman ldr pc, _irq 43*f56348afSSteve Sakoman ldr pc, _fiq 44*f56348afSSteve Sakoman 45*f56348afSSteve Sakoman_undefined_instruction: .word undefined_instruction 46*f56348afSSteve Sakoman_software_interrupt: .word software_interrupt 47*f56348afSSteve Sakoman_prefetch_abort: .word prefetch_abort 48*f56348afSSteve Sakoman_data_abort: .word data_abort 49*f56348afSSteve Sakoman_not_used: .word not_used 50*f56348afSSteve Sakoman_irq: .word irq 51*f56348afSSteve Sakoman_fiq: .word fiq 52*f56348afSSteve Sakoman_pad: .word 0x12345678 /* now 16*4=64 */ 53*f56348afSSteve Sakoman.global _end_vect 54*f56348afSSteve Sakoman_end_vect: 55*f56348afSSteve Sakoman 56*f56348afSSteve Sakoman .balignl 16,0xdeadbeef 57*f56348afSSteve Sakoman/************************************************************************* 58*f56348afSSteve Sakoman * 59*f56348afSSteve Sakoman * Startup Code (reset vector) 60*f56348afSSteve Sakoman * 61*f56348afSSteve Sakoman * do important init only if we don't start from memory! 62*f56348afSSteve Sakoman * setup Memory and board specific bits prior to relocation. 63*f56348afSSteve Sakoman * relocate armboot to ram 64*f56348afSSteve Sakoman * setup stack 65*f56348afSSteve Sakoman * 66*f56348afSSteve Sakoman *************************************************************************/ 67*f56348afSSteve Sakoman 68*f56348afSSteve Sakoman_TEXT_BASE: 69*f56348afSSteve Sakoman .word TEXT_BASE 70*f56348afSSteve Sakoman 71*f56348afSSteve Sakoman.globl _armboot_start 72*f56348afSSteve Sakoman_armboot_start: 73*f56348afSSteve Sakoman .word _start 74*f56348afSSteve Sakoman 75*f56348afSSteve Sakoman/* 76*f56348afSSteve Sakoman * These are defined in the board-specific linker script. 77*f56348afSSteve Sakoman */ 78*f56348afSSteve Sakoman.globl _bss_start 79*f56348afSSteve Sakoman_bss_start: 80*f56348afSSteve Sakoman .word __bss_start 81*f56348afSSteve Sakoman 82*f56348afSSteve Sakoman.globl _bss_end 83*f56348afSSteve Sakoman_bss_end: 84*f56348afSSteve Sakoman .word _end 85*f56348afSSteve Sakoman 86*f56348afSSteve Sakoman#ifdef CONFIG_USE_IRQ 87*f56348afSSteve Sakoman/* IRQ stack memory (calculated at run-time) */ 88*f56348afSSteve Sakoman.globl IRQ_STACK_START 89*f56348afSSteve SakomanIRQ_STACK_START: 90*f56348afSSteve Sakoman .word 0x0badc0de 91*f56348afSSteve Sakoman 92*f56348afSSteve Sakoman/* IRQ stack memory (calculated at run-time) */ 93*f56348afSSteve Sakoman.globl FIQ_STACK_START 94*f56348afSSteve SakomanFIQ_STACK_START: 95*f56348afSSteve Sakoman .word 0x0badc0de 96*f56348afSSteve Sakoman#endif 97*f56348afSSteve Sakoman 98*f56348afSSteve Sakoman/* 99*f56348afSSteve Sakoman * the actual reset code 100*f56348afSSteve Sakoman */ 101*f56348afSSteve Sakoman 102*f56348afSSteve Sakomanreset: 103*f56348afSSteve Sakoman /* 104*f56348afSSteve Sakoman * set the cpu to SVC32 mode 105*f56348afSSteve Sakoman */ 106*f56348afSSteve Sakoman mrs r0, cpsr 107*f56348afSSteve Sakoman bic r0, r0, #0x1f 108*f56348afSSteve Sakoman orr r0, r0, #0xd3 109*f56348afSSteve Sakoman msr cpsr,r0 110*f56348afSSteve Sakoman 111*f56348afSSteve Sakoman#if (CONFIG_OMAP34XX) 112*f56348afSSteve Sakoman /* Copy vectors to mask ROM indirect addr */ 113*f56348afSSteve Sakoman adr r0, _start @ r0 <- current position of code 114*f56348afSSteve Sakoman add r0, r0, #4 @ skip reset vector 115*f56348afSSteve Sakoman mov r2, #64 @ r2 <- size to copy 116*f56348afSSteve Sakoman add r2, r0, r2 @ r2 <- source end address 117*f56348afSSteve Sakoman mov r1, #SRAM_OFFSET0 @ build vect addr 118*f56348afSSteve Sakoman mov r3, #SRAM_OFFSET1 119*f56348afSSteve Sakoman add r1, r1, r3 120*f56348afSSteve Sakoman mov r3, #SRAM_OFFSET2 121*f56348afSSteve Sakoman add r1, r1, r3 122*f56348afSSteve Sakomannext: 123*f56348afSSteve Sakoman ldmia r0!, {r3 - r10} @ copy from source address [r0] 124*f56348afSSteve Sakoman stmia r1!, {r3 - r10} @ copy to target address [r1] 125*f56348afSSteve Sakoman cmp r0, r2 @ until source end address [r2] 126*f56348afSSteve Sakoman bne next @ loop until equal */ 127*f56348afSSteve Sakoman#if !defined(CONFIG_SYS_NAND_BOOT) && !defined(CONFIG_SYS_ONENAND_BOOT) 128*f56348afSSteve Sakoman /* No need to copy/exec the clock code - DPLL adjust already done 129*f56348afSSteve Sakoman * in NAND/oneNAND Boot. 130*f56348afSSteve Sakoman */ 131*f56348afSSteve Sakoman bl cpy_clk_code @ put dpll adjust code behind vectors 132*f56348afSSteve Sakoman#endif /* NAND Boot */ 133*f56348afSSteve Sakoman#endif 134*f56348afSSteve Sakoman /* the mask ROM code should have PLL and others stable */ 135*f56348afSSteve Sakoman#ifndef CONFIG_SKIP_LOWLEVEL_INIT 136*f56348afSSteve Sakoman bl cpu_init_crit 137*f56348afSSteve Sakoman#endif 138*f56348afSSteve Sakoman 139*f56348afSSteve Sakoman#ifndef CONFIG_SKIP_RELOCATE_UBOOT 140*f56348afSSteve Sakomanrelocate: @ relocate U-Boot to RAM 141*f56348afSSteve Sakoman adr r0, _start @ r0 <- current position of code 142*f56348afSSteve Sakoman ldr r1, _TEXT_BASE @ test if we run from flash or RAM 143*f56348afSSteve Sakoman cmp r0, r1 @ don't reloc during debug 144*f56348afSSteve Sakoman beq stack_setup 145*f56348afSSteve Sakoman 146*f56348afSSteve Sakoman ldr r2, _armboot_start 147*f56348afSSteve Sakoman ldr r3, _bss_start 148*f56348afSSteve Sakoman sub r2, r3, r2 @ r2 <- size of armboot 149*f56348afSSteve Sakoman add r2, r0, r2 @ r2 <- source end address 150*f56348afSSteve Sakoman 151*f56348afSSteve Sakomancopy_loop: @ copy 32 bytes at a time 152*f56348afSSteve Sakoman ldmia r0!, {r3 - r10} @ copy from source address [r0] 153*f56348afSSteve Sakoman stmia r1!, {r3 - r10} @ copy to target address [r1] 154*f56348afSSteve Sakoman cmp r0, r2 @ until source end addreee [r2] 155*f56348afSSteve Sakoman ble copy_loop 156*f56348afSSteve Sakoman#endif /* CONFIG_SKIP_RELOCATE_UBOOT */ 157*f56348afSSteve Sakoman 158*f56348afSSteve Sakoman /* Set up the stack */ 159*f56348afSSteve Sakomanstack_setup: 160*f56348afSSteve Sakoman ldr r0, _TEXT_BASE @ upper 128 KiB: relocated uboot 161*f56348afSSteve Sakoman sub r0, r0, #CONFIG_SYS_MALLOC_LEN @ malloc area 162*f56348afSSteve Sakoman sub r0, r0, #CONFIG_SYS_GBL_DATA_SIZE @ bdinfo 163*f56348afSSteve Sakoman#ifdef CONFIG_USE_IRQ 164*f56348afSSteve Sakoman sub r0, r0, #(CONFIG_STACKSIZE_IRQ + CONFIG_STACKSIZE_FIQ) 165*f56348afSSteve Sakoman#endif 166*f56348afSSteve Sakoman sub sp, r0, #12 @ leave 3 words for abort-stack 167*f56348afSSteve Sakoman bic sp, sp, #7 @ 8-byte alignment for ABI compliance 168*f56348afSSteve Sakoman 169*f56348afSSteve Sakoman /* Clear BSS (if any). Is below tx (watch load addr - need space) */ 170*f56348afSSteve Sakomanclear_bss: 171*f56348afSSteve Sakoman ldr r0, _bss_start @ find start of bss segment 172*f56348afSSteve Sakoman ldr r1, _bss_end @ stop here 173*f56348afSSteve Sakoman mov r2, #0x00000000 @ clear value 174*f56348afSSteve Sakomanclbss_l: 175*f56348afSSteve Sakoman str r2, [r0] @ clear BSS location 176*f56348afSSteve Sakoman cmp r0, r1 @ are we at the end yet 177*f56348afSSteve Sakoman add r0, r0, #4 @ increment clear index pointer 178*f56348afSSteve Sakoman bne clbss_l @ keep clearing till at end 179*f56348afSSteve Sakoman 180*f56348afSSteve Sakoman ldr pc, _start_armboot @ jump to C code 181*f56348afSSteve Sakoman 182*f56348afSSteve Sakoman_start_armboot: .word start_armboot 183*f56348afSSteve Sakoman 184*f56348afSSteve Sakoman 185*f56348afSSteve Sakoman/************************************************************************* 186*f56348afSSteve Sakoman * 187*f56348afSSteve Sakoman * CPU_init_critical registers 188*f56348afSSteve Sakoman * 189*f56348afSSteve Sakoman * setup important registers 190*f56348afSSteve Sakoman * setup memory timing 191*f56348afSSteve Sakoman * 192*f56348afSSteve Sakoman *************************************************************************/ 193*f56348afSSteve Sakomancpu_init_crit: 194*f56348afSSteve Sakoman /* 195*f56348afSSteve Sakoman * Invalidate L1 I/D 196*f56348afSSteve Sakoman */ 197*f56348afSSteve Sakoman mov r0, #0 @ set up for MCR 198*f56348afSSteve Sakoman mcr p15, 0, r0, c8, c7, 0 @ invalidate TLBs 199*f56348afSSteve Sakoman mcr p15, 0, r0, c7, c5, 0 @ invalidate icache 200*f56348afSSteve Sakoman 201*f56348afSSteve Sakoman /* 202*f56348afSSteve Sakoman * disable MMU stuff and caches 203*f56348afSSteve Sakoman */ 204*f56348afSSteve Sakoman mrc p15, 0, r0, c1, c0, 0 205*f56348afSSteve Sakoman bic r0, r0, #0x00002000 @ clear bits 13 (--V-) 206*f56348afSSteve Sakoman bic r0, r0, #0x00000007 @ clear bits 2:0 (-CAM) 207*f56348afSSteve Sakoman orr r0, r0, #0x00000002 @ set bit 1 (--A-) Align 208*f56348afSSteve Sakoman orr r0, r0, #0x00000800 @ set bit 12 (Z---) BTB 209*f56348afSSteve Sakoman mcr p15, 0, r0, c1, c0, 0 210*f56348afSSteve Sakoman 211*f56348afSSteve Sakoman /* 212*f56348afSSteve Sakoman * Jump to board specific initialization... 213*f56348afSSteve Sakoman * The Mask ROM will have already initialized 214*f56348afSSteve Sakoman * basic memory. Go here to bump up clock rate and handle 215*f56348afSSteve Sakoman * wake up conditions. 216*f56348afSSteve Sakoman */ 217*f56348afSSteve Sakoman mov ip, lr @ persevere link reg across call 218*f56348afSSteve Sakoman bl lowlevel_init @ go setup pll,mux,memory 219*f56348afSSteve Sakoman mov lr, ip @ restore link 220*f56348afSSteve Sakoman mov pc, lr @ back to my caller 221*f56348afSSteve Sakoman/* 222*f56348afSSteve Sakoman ************************************************************************* 223*f56348afSSteve Sakoman * 224*f56348afSSteve Sakoman * Interrupt handling 225*f56348afSSteve Sakoman * 226*f56348afSSteve Sakoman ************************************************************************* 227*f56348afSSteve Sakoman */ 228*f56348afSSteve Sakoman@ 229*f56348afSSteve Sakoman@ IRQ stack frame. 230*f56348afSSteve Sakoman@ 231*f56348afSSteve Sakoman#define S_FRAME_SIZE 72 232*f56348afSSteve Sakoman 233*f56348afSSteve Sakoman#define S_OLD_R0 68 234*f56348afSSteve Sakoman#define S_PSR 64 235*f56348afSSteve Sakoman#define S_PC 60 236*f56348afSSteve Sakoman#define S_LR 56 237*f56348afSSteve Sakoman#define S_SP 52 238*f56348afSSteve Sakoman 239*f56348afSSteve Sakoman#define S_IP 48 240*f56348afSSteve Sakoman#define S_FP 44 241*f56348afSSteve Sakoman#define S_R10 40 242*f56348afSSteve Sakoman#define S_R9 36 243*f56348afSSteve Sakoman#define S_R8 32 244*f56348afSSteve Sakoman#define S_R7 28 245*f56348afSSteve Sakoman#define S_R6 24 246*f56348afSSteve Sakoman#define S_R5 20 247*f56348afSSteve Sakoman#define S_R4 16 248*f56348afSSteve Sakoman#define S_R3 12 249*f56348afSSteve Sakoman#define S_R2 8 250*f56348afSSteve Sakoman#define S_R1 4 251*f56348afSSteve Sakoman#define S_R0 0 252*f56348afSSteve Sakoman 253*f56348afSSteve Sakoman#define MODE_SVC 0x13 254*f56348afSSteve Sakoman#define I_BIT 0x80 255*f56348afSSteve Sakoman 256*f56348afSSteve Sakoman/* 257*f56348afSSteve Sakoman * use bad_save_user_regs for abort/prefetch/undef/swi ... 258*f56348afSSteve Sakoman * use irq_save_user_regs / irq_restore_user_regs for IRQ/FIQ handling 259*f56348afSSteve Sakoman */ 260*f56348afSSteve Sakoman 261*f56348afSSteve Sakoman .macro bad_save_user_regs 262*f56348afSSteve Sakoman sub sp, sp, #S_FRAME_SIZE @ carve out a frame on current 263*f56348afSSteve Sakoman @ user stack 264*f56348afSSteve Sakoman stmia sp, {r0 - r12} @ Save user registers (now in 265*f56348afSSteve Sakoman @ svc mode) r0-r12 266*f56348afSSteve Sakoman 267*f56348afSSteve Sakoman ldr r2, _armboot_start 268*f56348afSSteve Sakoman sub r2, r2, #(CONFIG_SYS_MALLOC_LEN) 269*f56348afSSteve Sakoman sub r2, r2, #(CONFIG_SYS_GBL_DATA_SIZE + 8) @ set base 2 words into abort 270*f56348afSSteve Sakoman @ stack 271*f56348afSSteve Sakoman ldmia r2, {r2 - r3} @ get values for "aborted" pc 272*f56348afSSteve Sakoman @ and cpsr (into parm regs) 273*f56348afSSteve Sakoman add r0, sp, #S_FRAME_SIZE @ grab pointer to old stack 274*f56348afSSteve Sakoman 275*f56348afSSteve Sakoman add r5, sp, #S_SP 276*f56348afSSteve Sakoman mov r1, lr 277*f56348afSSteve Sakoman stmia r5, {r0 - r3} @ save sp_SVC, lr_SVC, pc, cpsr 278*f56348afSSteve Sakoman mov r0, sp @ save current stack into r0 279*f56348afSSteve Sakoman @ (param register) 280*f56348afSSteve Sakoman .endm 281*f56348afSSteve Sakoman 282*f56348afSSteve Sakoman .macro irq_save_user_regs 283*f56348afSSteve Sakoman sub sp, sp, #S_FRAME_SIZE 284*f56348afSSteve Sakoman stmia sp, {r0 - r12} @ Calling r0-r12 285*f56348afSSteve Sakoman add r8, sp, #S_PC @ !! R8 NEEDS to be saved !! 286*f56348afSSteve Sakoman @ a reserved stack spot would 287*f56348afSSteve Sakoman @ be good. 288*f56348afSSteve Sakoman stmdb r8, {sp, lr}^ @ Calling SP, LR 289*f56348afSSteve Sakoman str lr, [r8, #0] @ Save calling PC 290*f56348afSSteve Sakoman mrs r6, spsr 291*f56348afSSteve Sakoman str r6, [r8, #4] @ Save CPSR 292*f56348afSSteve Sakoman str r0, [r8, #8] @ Save OLD_R0 293*f56348afSSteve Sakoman mov r0, sp 294*f56348afSSteve Sakoman .endm 295*f56348afSSteve Sakoman 296*f56348afSSteve Sakoman .macro irq_restore_user_regs 297*f56348afSSteve Sakoman ldmia sp, {r0 - lr}^ @ Calling r0 - lr 298*f56348afSSteve Sakoman mov r0, r0 299*f56348afSSteve Sakoman ldr lr, [sp, #S_PC] @ Get PC 300*f56348afSSteve Sakoman add sp, sp, #S_FRAME_SIZE 301*f56348afSSteve Sakoman subs pc, lr, #4 @ return & move spsr_svc into 302*f56348afSSteve Sakoman @ cpsr 303*f56348afSSteve Sakoman .endm 304*f56348afSSteve Sakoman 305*f56348afSSteve Sakoman .macro get_bad_stack 306*f56348afSSteve Sakoman ldr r13, _armboot_start @ setup our mode stack (enter 307*f56348afSSteve Sakoman @ in banked mode) 308*f56348afSSteve Sakoman sub r13, r13, #(CONFIG_SYS_MALLOC_LEN) @ move past malloc pool 309*f56348afSSteve Sakoman sub r13, r13, #(CONFIG_SYS_GBL_DATA_SIZE + 8) @ move to reserved a couple 310*f56348afSSteve Sakoman @ spots for abort stack 311*f56348afSSteve Sakoman 312*f56348afSSteve Sakoman str lr, [r13] @ save caller lr in position 0 313*f56348afSSteve Sakoman @ of saved stack 314*f56348afSSteve Sakoman mrs lr, spsr @ get the spsr 315*f56348afSSteve Sakoman str lr, [r13, #4] @ save spsr in position 1 of 316*f56348afSSteve Sakoman @ saved stack 317*f56348afSSteve Sakoman 318*f56348afSSteve Sakoman mov r13, #MODE_SVC @ prepare SVC-Mode 319*f56348afSSteve Sakoman @ msr spsr_c, r13 320*f56348afSSteve Sakoman msr spsr, r13 @ switch modes, make sure 321*f56348afSSteve Sakoman @ moves will execute 322*f56348afSSteve Sakoman mov lr, pc @ capture return pc 323*f56348afSSteve Sakoman movs pc, lr @ jump to next instruction & 324*f56348afSSteve Sakoman @ switch modes. 325*f56348afSSteve Sakoman .endm 326*f56348afSSteve Sakoman 327*f56348afSSteve Sakoman .macro get_bad_stack_swi 328*f56348afSSteve Sakoman sub r13, r13, #4 @ space on current stack for 329*f56348afSSteve Sakoman @ scratch reg. 330*f56348afSSteve Sakoman str r0, [r13] @ save R0's value. 331*f56348afSSteve Sakoman ldr r0, _armboot_start @ get data regions start 332*f56348afSSteve Sakoman sub r0, r0, #(CONFIG_SYS_MALLOC_LEN) @ move past malloc pool 333*f56348afSSteve Sakoman sub r0, r0, #(CONFIG_SYS_GBL_DATA_SIZE + 8) @ move past gbl and a couple 334*f56348afSSteve Sakoman @ spots for abort stack 335*f56348afSSteve Sakoman str lr, [r0] @ save caller lr in position 0 336*f56348afSSteve Sakoman @ of saved stack 337*f56348afSSteve Sakoman mrs r0, spsr @ get the spsr 338*f56348afSSteve Sakoman str lr, [r0, #4] @ save spsr in position 1 of 339*f56348afSSteve Sakoman @ saved stack 340*f56348afSSteve Sakoman ldr r0, [r13] @ restore r0 341*f56348afSSteve Sakoman add r13, r13, #4 @ pop stack entry 342*f56348afSSteve Sakoman .endm 343*f56348afSSteve Sakoman 344*f56348afSSteve Sakoman .macro get_irq_stack @ setup IRQ stack 345*f56348afSSteve Sakoman ldr sp, IRQ_STACK_START 346*f56348afSSteve Sakoman .endm 347*f56348afSSteve Sakoman 348*f56348afSSteve Sakoman .macro get_fiq_stack @ setup FIQ stack 349*f56348afSSteve Sakoman ldr sp, FIQ_STACK_START 350*f56348afSSteve Sakoman .endm 351*f56348afSSteve Sakoman 352*f56348afSSteve Sakoman/* 353*f56348afSSteve Sakoman * exception handlers 354*f56348afSSteve Sakoman */ 355*f56348afSSteve Sakoman .align 5 356*f56348afSSteve Sakomanundefined_instruction: 357*f56348afSSteve Sakoman get_bad_stack 358*f56348afSSteve Sakoman bad_save_user_regs 359*f56348afSSteve Sakoman bl do_undefined_instruction 360*f56348afSSteve Sakoman 361*f56348afSSteve Sakoman .align 5 362*f56348afSSteve Sakomansoftware_interrupt: 363*f56348afSSteve Sakoman get_bad_stack_swi 364*f56348afSSteve Sakoman bad_save_user_regs 365*f56348afSSteve Sakoman bl do_software_interrupt 366*f56348afSSteve Sakoman 367*f56348afSSteve Sakoman .align 5 368*f56348afSSteve Sakomanprefetch_abort: 369*f56348afSSteve Sakoman get_bad_stack 370*f56348afSSteve Sakoman bad_save_user_regs 371*f56348afSSteve Sakoman bl do_prefetch_abort 372*f56348afSSteve Sakoman 373*f56348afSSteve Sakoman .align 5 374*f56348afSSteve Sakomandata_abort: 375*f56348afSSteve Sakoman get_bad_stack 376*f56348afSSteve Sakoman bad_save_user_regs 377*f56348afSSteve Sakoman bl do_data_abort 378*f56348afSSteve Sakoman 379*f56348afSSteve Sakoman .align 5 380*f56348afSSteve Sakomannot_used: 381*f56348afSSteve Sakoman get_bad_stack 382*f56348afSSteve Sakoman bad_save_user_regs 383*f56348afSSteve Sakoman bl do_not_used 384*f56348afSSteve Sakoman 385*f56348afSSteve Sakoman#ifdef CONFIG_USE_IRQ 386*f56348afSSteve Sakoman 387*f56348afSSteve Sakoman .align 5 388*f56348afSSteve Sakomanirq: 389*f56348afSSteve Sakoman get_irq_stack 390*f56348afSSteve Sakoman irq_save_user_regs 391*f56348afSSteve Sakoman bl do_irq 392*f56348afSSteve Sakoman irq_restore_user_regs 393*f56348afSSteve Sakoman 394*f56348afSSteve Sakoman .align 5 395*f56348afSSteve Sakomanfiq: 396*f56348afSSteve Sakoman get_fiq_stack 397*f56348afSSteve Sakoman /* someone ought to write a more effective fiq_save_user_regs */ 398*f56348afSSteve Sakoman irq_save_user_regs 399*f56348afSSteve Sakoman bl do_fiq 400*f56348afSSteve Sakoman irq_restore_user_regs 401*f56348afSSteve Sakoman 402*f56348afSSteve Sakoman#else 403*f56348afSSteve Sakoman 404*f56348afSSteve Sakoman .align 5 405*f56348afSSteve Sakomanirq: 406*f56348afSSteve Sakoman get_bad_stack 407*f56348afSSteve Sakoman bad_save_user_regs 408*f56348afSSteve Sakoman bl do_irq 409*f56348afSSteve Sakoman 410*f56348afSSteve Sakoman .align 5 411*f56348afSSteve Sakomanfiq: 412*f56348afSSteve Sakoman get_bad_stack 413*f56348afSSteve Sakoman bad_save_user_regs 414*f56348afSSteve Sakoman bl do_fiq 415*f56348afSSteve Sakoman 416*f56348afSSteve Sakoman#endif 417