📄 start.s.l
字号:
01 /*02 * armboot - Startup Code for ARM920 CPU-core03 *04 * Copyright (c) 2001 Marius Gr鰃er <mag@sysgo.de>05 * Copyright (c) 2002 Alex Z黳ke <azu@sysgo.de>06 * Copyright (c) 2002 Gary Jennejohn <gj@denx.de>07 *08 * See file CREDITS for list of people who contributed to this09 * project.10 *11 * This program is free software; you can redistribute it and/or12 * modify it under the terms of the GNU General Public License as13 * published by the Free Software Foundation; either version 2 of14 * the License, or (at your option) any later version.15 *16 * This program is distributed in the hope that it will be useful,17 * but WITHOUT ANY WARRANTY; without even the implied warranty of18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the19 * GNU General Public License for more details.20 *21 * You should have received a copy of the GNU General Public License22 * along with this program; if not, write to the Free Software23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,24 * MA 02111-1307 USA25 */26 27 28 #include <config.h>29 #include <version.h>30 31 32 /*33 *************************************************************************34 *35 * Jump vector table as in table 3.1 in [1]36 *37 *************************************************************************38 */39 40 41 .globl _start42 _start: b reset43 ldr pc, _undefined_instruction44 ldr pc, _software_interrupt45 ldr pc, _prefetch_abort46 ldr pc, _data_abort47 ldr pc, _not_used48 ldr pc, _irq49 ldr pc, _fiq50 51 _undefined_instruction: .word undefined_instruction52 _software_interrupt: .word software_interrupt53 _prefetch_abort: .word prefetch_abort54 _data_abort: .word data_abort55 _not_used: .word not_used56 _irq: .word irq57 _fiq: .word fiq58 59 .balignl 16,0xdeadbeef60 61 62 /*63 *************************************************************************64 *65 * Startup Code (reset vector)66 *67 * do important init only if we don't start from memory!68 * relocate armboot to ram69 * setup stack70 * jump to second stage71 *72 *************************************************************************73 */74 75 _TEXT_BASE:76 .word TEXT_BASE77 78 .globl _armboot_start79 _armboot_start:80 .word _start81 82 /*83 * These are defined in the board-specific linker script.84 */85 .globl _bss_start86 _bss_start:87 .word __bss_start88 89 .globl _bss_end90 _bss_end:91 .word _end92 93 #ifdef CONFIG_USE_IRQ94 /* IRQ stack memory (calculated at run-time) */95 .globl IRQ_STACK_START96 IRQ_STACK_START:97 .word 0x0badc0de98 99 /* IRQ stack memory (calculated at run-time) */100 .globl FIQ_STACK_START101 FIQ_STACK_START:102 .word 0x0badc0de103 #endif104 105 106 /*107 * the actual reset code108 */109 110 reset:111 /*112 * set the cpu to SVC32 mode113 */114 mrs r0,cpsr115 bic r0,r0,#0x1f116 orr r0,r0,#0xd3117 msr cpsr,r0118 119 /* turn off the watchdog */120 #if defined(CONFIG_S3C2400)121 # define pWTCON 0x15300000122 # define INTMSK 0x14400008 /* Interupt-Controller base addresses */123 # define CLKDIVN 0x14800014 /* clock divisor register */124 #elif defined(CONFIG_S3C2410)125 # define pWTCON 0x53000000126 # define INTMSK 0x4A000008 /* Interupt-Controller base addresses */127 # define INTSUBMSK 0x4A00001C128 # define CLKDIVN 0x4C000014 /* clock divisor register */129 #endif130 131 #if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)132 ldr r0, =pWTCON133 mov r1, #0x0134 str r1, [r0]135 136 /*137 * mask all IRQs by setting all bits in the INTMR - default138 */139 mov r1, #0xffffffff140 ldr r0, =INTMSK141 str r1, [r0]142 # if defined(CONFIG_S3C2410)143 ldr r1, =0x3ff144 ldr r0, =INTSUBMSK145 str r1, [r0]146 # endif147 148 /* FCLK:HCLK:PCLK = 1:2:4 */149 /* default FCLK is 120 MHz ! */150 ldr r0, =CLKDIVN151 mov r1, #3152 str r1, [r0]153 #endif /* CONFIG_S3C2400 || CONFIG_S3C2410 */154 155 /*156 * we do sys-critical inits only at reboot,157 * not when booting from ram!158 */159 #ifndef CONFIG_SKIP_LOWLEVEL_INIT160 bl cpu_init_crit161 #endif162 163 #ifndef CONFIG_SKIP_RELOCATE_UBOOT164 relocate: /* relocate U-Boot to RAM */165 adr r0, _start /* r0 <- current position of code */166 ldr r1, _TEXT_BASE /* test if we run from flash or RAM */167 cmp r0, r1 /* don't reloc during debug */168 beq stack_setup169 170 ldr r2, _armboot_start171 ldr r3, _bss_start172 sub r2, r3, r2 /* r2 <- size of armboot */173 add r2, r0, r2 /* r2 <- source end address */174 175 copy_loop:176 ldmia r0!, {r3-r10} /* copy from source address [r0] */177 stmia r1!, {r3-r10} /* copy to target address [r1] */178 cmp r0, r2 /* until source end addreee [r2] */179 ble copy_loop180 #endif /* CONFIG_SKIP_RELOCATE_UBOOT */181 182 /* Set up the stack */183 stack_setup:184 ldr r0, _TEXT_BASE /* upper 128 KiB: relocated uboot */185 sub r0, r0, #CFG_MALLOC_LEN /* malloc area */186 sub r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo */187 #ifdef CONFIG_USE_IRQ188 sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)189 #endif190 sub sp, r0, #12 /* leave 3 words for abort-stack */191 192 clear_bss:193 ldr r0, _bss_start /* find start of bss segment */194 ldr r1, _bss_end /* stop here */195 mov r2, #0x00000000 /* clear */196 197 clbss_l:str r2, [r0] /* clear loop... */198 add r0, r0, #4199 cmp r0, r1200 ble clbss_l201 202 #if 0203 /* try doing this stuff after the relocation */204 ldr r0, =pWTCON205 mov r1, #0x0206 str r1, [r0]207 208 /*209 * mask all IRQs by setting all bits in the INTMR - default210 */211 mov r1, #0xffffffff212 ldr r0, =INTMR213 str r1, [r0]214 215 /* FCLK:HCLK:PCLK = 1:2:4 */216 /* default FCLK is 120 MHz ! */217 ldr r0, =CLKDIVN218 mov r1, #3219 str r1, [r0]220 /* END stuff after relocation */221 #endif222 223 ldr pc, _start_armboot224 225 _start_armboot: .word start_armboot226 227 228 /*229 *************************************************************************230 *231 * CPU_init_critical registers232 *233 * setup important registers234 * setup memory timing235 *236 *************************************************************************237 */238 239 240 #ifndef CONFIG_SKIP_LOWLEVEL_INIT241 cpu_init_crit:242 /*243 * flush v4 I/D caches244 */245 mov r0, #0246 mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cache */247 mcr p15, 0, r0, c8, c7, 0 /* flush v4 TLB */248 249 /*250 * disable MMU stuff and caches251 */252 mrc p15, 0, r0, c1, c0, 0253 bic r0, r0, #0x00002300 @ clear bits 13, 9:8 (--V- --RS)254 bic r0, r0, #0x00000087 @ clear bits 7, 2:0 (B--- -CAM)255 orr r0, r0, #0x00000002 @ set bit 2 (A) Align256 orr r0, r0, #0x00001000 @ set bit 12 (I) I-Cache257 mcr p15, 0, r0, c1, c0, 0258 259 /*260 * before relocating, we have to setup RAM timing261 * because memory timing is board-dependend, you will262 * find a lowlevel_init.S in your board directory.263 */264 mov ip, lr265 bl lowlevel_init266 mov lr, ip267 mov pc, lr268 #endif /* CONFIG_SKIP_LOWLEVEL_INIT */269 270 /*271 *************************************************************************272 *273 * Interrupt handling274 *275 *************************************************************************276 */277 278 @279 @ IRQ stack frame.280 @281 #define S_FRAME_SIZE 72282 283 #define S_OLD_R0 68284 #define S_PSR 64285 #define S_PC 60286 #define S_LR 56287 #define S_SP 52288 289 #define S_IP 48290 #define S_FP 44291 #define S_R10 40292 #define S_R9 36293 #define S_R8 32294 #define S_R7 28295 #define S_R6 24296 #define S_R5 20297 #define S_R4 16298 #define S_R3 12299 #define S_R2 8300 #define S_R1 4301 #define S_R0 0302 303 #define MODE_SVC 0x13304 #define I_BIT 0x80305 306 /*307 * use bad_save_user_regs for abort/prefetch/undef/swi ...308 * use irq_save_user_regs / irq_restore_user_regs for IRQ/FIQ handling309 */310 311 .macro bad_save_user_regs312 sub sp, sp, #S_FRAME_SIZE313 stmia sp, {r0 - r12} @ Calling r0-r12314 ldr r2, _armboot_start315 sub r2, r2, #(CONFIG_STACKSIZE+CFG_MALLOC_LEN)316 sub r2, r2, #(CFG_GBL_DATA_SIZE+8) @ set base 2 words into abort stack317 ldmia r2, {r2 - r3} @ get pc, cpsr318 add r0, sp, #S_FRAME_SIZE @ restore sp_SVC319 320 add r5, sp, #S_SP321 mov r1, lr322 stmia r5, {r0 - r3} @ save sp_SVC, lr_SVC, pc, cpsr323 mov r0, sp324 .endm325 326 .macro irq_save_user_regs327 sub sp, sp, #S_FRAME_SIZE328 stmia sp, {r0 - r12} @ Calling r0-r12329 add r8, sp, #S_PC330 stmdb r8, {sp, lr}^ @ Calling SP, LR331 str lr, [r8, #0] @ Save calling PC332 mrs r6, spsr333 str r6, [r8, #4] @ Save CPSR334 str r0, [r8, #8] @ Save OLD_R0335 mov r0, sp336 .endm337 338 .macro irq_restore_user_regs339 ldmia sp, {r0 - lr}^ @ Calling r0 - lr340 mov r0, r0341 ldr lr, [sp, #S_PC] @ Get PC342 add sp, sp, #S_FRAME_SIZE343 subs pc, lr, #4 @ return & move spsr_svc into cpsr344 .endm345 346 .macro get_bad_stack347 ldr r13, _armboot_start @ setup our mode stack348 sub r13, r13, #(CONFIG_STACKSIZE+CFG_MALLOC_LEN)349 sub r13, r13, #(CFG_GBL_DATA_SIZE+8) @ reserved a couple spots in abort stack350 351 str lr, [r13] @ save caller lr / spsr352 mrs lr, spsr353 str lr, [r13, #4]354 355 mov r13, #MODE_SVC @ prepare SVC-Mode356 @ msr spsr_c, r13357 msr spsr, r13358 mov lr, pc359 movs pc, lr360 .endm361 362 .macro get_irq_stack @ setup IRQ stack363 ldr sp, IRQ_STACK_START364 .endm365 366 .macro get_fiq_stack @ setup FIQ stack367 ldr sp, FIQ_STACK_START368 .endm369 370 /*371 * exception handlers372 */373 .align 5374 undefined_instruction:375 get_bad_stack376 bad_save_user_regs377 bl do_undefined_instruction378 379 .align 5380 software_interrupt:381 get_bad_stack382 bad_save_user_regs383 bl do_software_interrupt384 385 .align 5386 prefetch_abort:387 get_bad_stack388 bad_save_user_regs389 bl do_prefetch_abort390 391 .align 5392 data_abort:393 get_bad_stack394 bad_save_user_regs395 bl do_data_abort396 397 .align 5398 not_used:399 get_bad_stack400 bad_save_user_regs401 bl do_not_used402 403 #ifdef CONFIG_USE_IRQ404 405 .align 5406 irq:407 get_irq_stack408 irq_save_user_regs409 bl do_irq410 irq_restore_user_regs411 412 .align 5413 fiq:414 get_fiq_stack415 /* someone ought to write a more effiction fiq_save_user_regs */416 irq_save_user_regs417 bl do_fiq418 irq_restore_user_regs419 420 #else421 422 .align 5423 irq:424 get_bad_stack425 bad_save_user_regs426 bl do_irq427 428 .align 5429 fiq:430 get_bad_stack431 bad_save_user_regs432 bl do_fiq433 434 #endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -