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