定位到\s3c-u-boot-1.1.6\cpu\s3c64xx\start.s,打开该文件

  1. /*
  2. * armboot - Startup Code for S3C6400/ARM1176 CPU-core
  3. *
  4. * Copyright (c) Samsung Electronics
  5. *
  6. *
  7. * See file CREDITS for list of people who contributed to this
  8. * project.
  9. *
  10. * This program is free software; you can redistribute it and/or
  11. * modify it under the terms of the GNU General Public License as
  12. * published by the Free Software Foundation; either version 2 of
  13. * the License, or (at your option) any later version.
  14. *
  15. * This program is distributed in the hope that it will be useful,
  16. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. * GNU General Public License for more details.
  19. *
  20. * You should have received a copy of the GNU General Public License
  21. * along with this program; if not, write to the Free Software
  22. * Foundation, Inc., Temple Place, Suite , Boston,
  23. * MA - USA
  24. *
  25. * -- - Restructured codes by jsgood (jsgood.yang@samsung.com)
  26. * -- - Added MoviNAND and OneNAND boot codes by jsgood (jsgood.yang@samsung.com)
  27. * Base codes by scsuh (sc.suh)
  28. */
  29.  
  30. #include <config.h>
  31. #include <version.h>
  32. #ifdef CONFIG_ENABLE_MMU
  33. #include <asm/proc/domain.h>
  34. #endif
  35. #include <regs.h>
  36.  
  37. #ifndef CONFIG_ENABLE_MMU
  38. #ifndef CFG_PHY_UBOOT_BASE
  39. #define CFG_PHY_UBOOT_BASE CFG_UBOOT_BASE
  40. #endif
  41. #endif
  42. 以上代码主要检查CONFIG_ENABLE_MMU,已在/include/configs/smdk6410.h中定义
  43. /*
  44. *************************************************************************
  45. *
  46. * Jump vector table as in table . in []
  47. *
  48. *************************************************************************
  49. */
  50.  
  51. .globl _start
  52. _start: b reset
  53. ldr pc, _undefined_instruction
  54. ldr pc, _software_interrupt
  55. ldr pc, _prefetch_abort
  56. ldr pc, _data_abort
  57. ldr pc, _not_used
  58. ldr pc, _irq
  59. ldr pc, _fiq
  60. //以上代码中的.globl相当于c语言中的extenal,而_start相对于C语言中使用goto语句时的调转标签,b是arm汇编中的不带返回的调转指令。最后的ldr命令,是Load Register的缩写,主要用于从存储器将一个32位的字数据送到目的寄存器中,最常用的用法是:
    ldr pc,标号1
    ...
    标号1
    .word 标号2
    ...
    标号2
    ... (具体执行的代码)
    即,将地址为标号1的内容放入到pc,而地址为标号1中的内容正好又是标号2,所以去执行标号后的代码。

  61. _undefined_instruction:
  62. .word undefined_instruction
  63. _software_interrupt:
  64. .word software_interrupt
  65. _prefetch_abort:
  66. .word prefetch_abort
  67. _data_abort:
  68. .word data_abort
  69. _not_used:
  70. .word not_used
  71. _irq:
  72. .word irq
  73. _fiq:
  74. .word fiq
  75. _pad:
  76. .word 0x12345678 /* now *= */
  77. .global _end_vect
  78. _end_vect:
  79.  
  80. .balignl ,0xdeadbeef
    以上代码是接上面的代码,其中.word代码为其分别一个word=32bit=4Byte的地址空间;balignl表示字节对齐,即在此表示,接下来的代码,都要16字节对齐,不足之处,用0xdeadbeef填充。
  81. /*
  82. *************************************************************************
  83. *
  84. * Startup Code (reset vector)
  85. *
  86. * do important init only if we don't start from memory!
  87. * setup Memory and board specific bits prior to relocation.
  88. * relocate armboot to ram
  89. * setup stack
  90. *
  91. *************************************************************************
  92. */
  93.  
  94. _TEXT_BASE:
  95. .word TEXT_BASE
  96. 该值的具体地址在s3c-u-boot-1.1.6/board/samsung/smdk6410/config.mk
  97. /*
  98. * Below variable is very important because we use MMU in U-Boot.
  99. * Without it, we cannot run code correctly before MMU is ON.
  100. * by scsuh.
  101. */
  102. _TEXT_PHY_BASE:
  103. .word CFG_PHY_UBOOT_BASE
  104.  
  105. .globl _armboot_start
  106. _armboot_start:
  107. .word _start
  108. CFG_PHY_UBOOT_BASE定义内存地址
    /*
  109. * These are defined in the board-specific linker script.
  110. */
  111. .globl _bss_start
  112. _bss_start:
  113. .word __bss_start
  114.  
  115. .globl _bss_end
  116. _bss_end:
  117. .word _end
  118. 如注释所示,该地址的值在s3c-u-boot/board/samsung/smdk6410/u-boot.lds中定义
  119. #ifdef CONFIG_USE_IRQ
  120. /* IRQ stack memory (calculated at run-time) */
  121. .globl IRQ_STACK_START
  122. IRQ_STACK_START:
  123. .word 0x0badc0de
  124.  
  125. /* IRQ stack memory (calculated at run-time) */
  126. .globl FIQ_STACK_START
  127. FIQ_STACK_START:
  128. .word 0x0badc0de
  129. #endif
  130. 如注释所示,该地址的值中运行时计算得到
  131. /*
  132. * the actual reset code
  133. */
  134.  
  135. reset:
  136. /*
  137. * set the cpu to SVC32 mode
  138. */
  139. mrs r0,cpsr
  140. bic r0,r0,#0x1f
  141. orr r0,r0,#0xd3
  142. msr cpsr,r0
  143. cpsrCurrent Program Status Register的缩写,表示当前程序状态寄存器,与此对应的是SPSR.程序状态寄存器的格式为:
  144.  
  145. 31 30 29 28 27-- 8 7 6 5 4 3 2 1 0
    N Z C V Reserved I F T M4 M3 M2 M1 M0
    其中:
    mrsMove From Status Register的缩写,用于将程序状态寄存器的内容传送到通用寄存器中;
    bicBit Clear的缩写,用于清除操作数1的某些位,并把结果放置到目的寄存器中;
    orrLogical OR的缩写,用于将两个操作数进行逻辑与,并把结果放到目的寄存器中;
    msrMove To Status Register的缩写,将操作数的内容传送到程序状态寄存器中。
    另外:
    0x1f=00011111
    0xdf=11011111
  146. /*
  147. *************************************************************************
  148. *
  149. * CPU_init_critical registers
  150. *
  151. * setup important registers
  152. * setup memory timing
  153. *
  154. *************************************************************************
  155. */
  156. /*
  157. * we do sys-critical inits only at reboot,
  158. * not when booting from ram!
  159. */
  160. cpu_init_crit:
  161. /*
  162. * flush v4 I/D caches
  163. */
  164. mov r0, #0
  165. mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cache */
  166. mcr p15, 0, r0, c8, c7, 0 /* flush v4 TLB */
  167.  
  168. /*
  169. * disable MMU stuff and caches
  170. */
  171. mrc p15, 0, r0, c1, c0, 0
  172. bic r0, r0, #0x00002300 @ clear bits 13, 9:8 (--V- --RS)
  173. bic r0, r0, #0x00000087 @ clear bits 7, 2:0 (B--- -CAM)
  174. orr r0, r0, #0x00000002 @ set bit 2 (A) Align
  175. orr r0, r0, #0x00001000 @ set bit 12 (I) I-Cache
  176. mcr p15, 0, r0, c1, c0, 0
  177.  
  178. /* Peri port setup */
  179. ldr r0, =0x70000000
  180. orr r0, r0, #0x13
  181. mcr p15,0,r0,c15,c2,4 @ 256M(0x70000000-0x7fffffff)
  182. 以上代码,通过寄存器P15来设置,主要参考arm1176数据手册(它是6410),
  183. #ifdef CONFIG_BOOT_ONENAND
  184. ldr r0, =0x70000000 @ onenand controller setup
  185. orr r0, r0, #0x100000
  186. ldr r1, =0x4000
  187. orr r1, r1, #0xe0
  188. str r1, [r0]
  189.  
  190. #if defined(CONFIG_S3C6410) || defined(CONFIG_S3C6430)
  191. orr r0, r0, #300 @ disable watchdog
  192. mov r1, #1
  193. str r1, [r0]
  194.  
  195. mov r1, #0x23000000 @ start buffer register
  196. orr r1, r1, #0x30000
  197. orr r1, r1, #0xc800
  198. #else
  199. mov r1, =0x20000000 @ start buffer register
  200. orr r1, r1, #0xc30000
  201. orr r1, r1, #0xc800
  202. #endif
  203.  
  204. sub r0, r1, #0x0400 @ start address1 register
  205.  
  206. ldr r2, [r1, #0x84] @ ecc bypass
  207. orr r2, r2, #0x100
  208. str r2, [r1, #0x84]
  209.  
  210. mov r3, #0x0 @ DFS, FBA
  211. str r3, [r0, #0x00]
  212. str r3, [r0, #0x04] @ select dataram for DDP as 0
  213.  
  214. mov r4, #0x104 @ interrupt register
  215. mov r5, #0x0002 @ FPA, FSA
  216. mov r6, #0x0800 @ BSA
  217.  
  218. onenand_bl1_load:
  219. str r5, [r0, #0x1c] @ save FPA, FSA
  220. orr r6, r6, #0x02 @ BSC
  221. str r6, [r1, #0x00] @ save BSA, BSC
  222. str r3, [r1, r4] @ clear interrupt
  223. str r3, [r1, #0x80] @ write load command
  224.  
  225. mov r7, #0x100 @ need small delay
  226.  
  227. onenand_wait_loop1:
  228. subs r7, r7, #0x1
  229. bne onenand_wait_loop1
  230.  
  231. add r5, r5, #0x2 @ next FPA, FSA
  232. sub r6, r6, #0x2
  233. add r6, r6, #0x200 @ next BSA
  234. cmp r5, #0x8
  235. bne onenand_bl1_load
  236. #endif
  237. 以上是通过onenand启动方式代码
  238. /*
  239. * Go setup Memory and board specific bits prior to relocation.
  240. */
  241. bl lowlevel_init /* go setup pll,mux,memory */
  242. 以上通过调用的函数,进行板纺初始化
  243. /* when we already run in ram, we don't need to relocate U-Boot.
  244. * and actually, memory controller must be configured before U-Boot
  245. * is running in ram.
  246. */
  247. ldr r0, =0xff000fff
  248. bic r1, pc, r0 /* r0 <- current base addr of code */
  249. ldr r2, _TEXT_BASE /* r1 <- original base addr in ram */
  250. bic r2, r2, r0 /* r0 <- current base addr of code */
  251. cmp r1, r2 /* compare r0, r1 */
  252. beq after_copy /* r0 == r1 then skip flash copy */
  253. 以上是
  254. #ifdef CONFIG_BOOT_NOR /* relocate U-Boot to RAM */
  255. adr r0, _start /* r0 <- current position of code */
  256. ldr r1, _TEXT_PHY_BASE /* r1 <- destination */
  257. ldr r2, _armboot_start
  258. ldr r3, _bss_start
  259. sub r2, r3, r2 /* r2 <- size of armboot */
  260. add r2, r0, r2 /* r2 <- source end address */
  261.  
  262. nor_copy_loop:
  263. ldmia r0!, {r3-r10} /* copy from source address [r0] */
  264. stmia r1!, {r3-r10} /* copy to target address [r1] */
  265. cmp r0, r2 /* until source end addreee [r2] */
  266. ble nor_copy_loop
  267. b after_copy
  268. #endif
  269. 以上是使用nor nand方式启动代码
  270. #ifdef CONFIG_BOOT_NAND
  271. mov r0, #0x1000
  272. bl copy_from_nand
  273. #endif
  274. 以上是通过调用,使用nand 方式启动代码
  275. #ifdef CONFIG_BOOT_MOVINAND
  276. ldr sp, _TEXT_PHY_BASE
  277. bl movi_bl2_copy
  278. b after_copy
  279. #endif
  280. 以上是通过sd卡方式启动代码
  281. #ifdef CONFIG_BOOT_ONENAND
  282. ldr sp, =0x50000000 @ temporary stack
  283.  
  284. #ifdef CONFIG_S3C6400
  285. mov r1, =0x20000000 @ start buffer register
  286. orr r1, r1, #0xc30000
  287. orr r1, r1, #0xc800
  288. #else
  289. mov r1, #0x23000000 @ start buffer register
  290. orr r1, r1, #0x30000
  291. orr r1, r1, #0xc800
  292. #endif
  293.  
  294. ldr r2, [r1, #0x84] @ ecc bypass
  295. orr r2, r2, #0x100
  296. str r2, [r1, #0x84]
  297.  
  298. sub r0, r1, #0x0400 @ start address1 register
  299.  
  300. str r3, [r0, #0x00]
  301. str r3, [r0, #0x04] @ select dataram for DDP as
  302.  
  303. mov r4, #0x104 @ interrupt register
  304.  
  305. mov r6, #0x0c00 @ fixed dataram1 sector number
  306. str r6, [r1, #0x00]
  307.  
  308. mov r3, #0x0 @ DFS, FBA
  309. mov r5, #0x0000 @ FPA, FSA
  310. ldr r9, =CFG_PHY_UBOOT_BASE @ destination
  311.  
  312. onenand_bl2_load:
  313. str r3, [r0, #0x00] @ save DFS, FBA
  314. str r5, [r0, #0x1c] @ save FPA, FSA
  315.  
  316. mov r7, #0x0 @ clear interrupt
  317. str r7, [r1, r4]
  318. str r7, [r1, #0x80] @ write load command
  319.  
  320. mov r8, #0x1000
  321. onenand_wait_loop2:
  322. subs r8, r8, #0x1
  323. bne onenand_wait_loop2
  324.  
  325. onenand_wait_int: @ wait INT and RI
  326. ldr r7, [r1, r4]
  327. mov r8, #0x8000
  328. orr r8, r8, #0x80
  329. tst r7, r8
  330. beq onenand_wait_int
  331.  
  332. mov r7, #0x0 @ clear interrupt
  333. str r7, [r1, r4]
  334.  
  335. mov r8, #0xc00 @ source address (dataram1)
  336. mov r10, #0x40 @ copy loop count ( = / )
  337.  
  338. stmia sp, {r0-r7} @ backup
  339.  
  340. onenand_copy_to_ram:
  341. ldmia r8!, {r0-r7}
  342. stmia r9!, {r0-r7}
  343. subs r10, r10, #0x1
  344. bne onenand_copy_to_ram
  345.  
  346. ldmia sp, {r0-r7} @ restore
  347.  
  348. add r5, r5, #0x4 @ next FPA
  349. cmp r5, #0x100 @ last FPA?
  350. bne onenand_bl2_load
  351.  
  352. /* next block */
  353. mov r5, #0x0 @ reset FPA
  354. add r3, r3, #0x1 @ next FBA
  355. cmp r3, #0x2 @ last FBA?
  356. bne onenand_bl2_load
  357. b after_copy
  358. #endif
  359.  
  360. #ifdef CONFIG_BOOT_ONENAND_IROM
  361. ldr sp, _TEXT_PHY_BASE
  362. bl onenand_bl2_copy
  363. b after_copy
  364. #endif
  365. 以上是启动代码
  366. after_copy:
  367. #ifdef CONFIG_ENABLE_MMU
  368. enable_mmu:
  369. /* enable domain access */
  370. ldr r5, =0x0000ffff
  371. mcr p15, , r5, c3, c0, @ load domain access register
  372.  
  373. /* Set the TTB register */
  374. ldr r0, _mmu_table_base
  375. ldr r1, =CFG_PHY_UBOOT_BASE
  376. ldr r2, =0xfff00000
  377. bic r0, r0, r2
  378. orr r1, r0, r1
  379. mcr p15, , r1, c2, c0,
  380.  
  381. /* Enable the MMU */
  382. mmu_on:
  383. mrc p15, , r0, c1, c0,
  384. orr r0, r0, # /* Set CR_M to enable MMU */
  385. mcr p15, , r0, c1, c0,
  386. nop
  387. nop
  388. nop
  389. nop
  390. #endif
  391.  
  392. skip_hw_init:
  393. /* Set up the stack */
  394. stack_setup:
  395. #ifdef CONFIG_MEMORY_UPPER_CODE
  396. ldr sp, =(CFG_UBOOT_BASE + CFG_UBOOT_SIZE - 0xc)
  397. #else
  398. ldr r0, _TEXT_BASE /* upper KiB: relocated uboot */
  399. sub r0, r0, #CFG_MALLOC_LEN /* malloc area */
  400. sub r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo */
  401. #ifdef CONFIG_USE_IRQ
  402. sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
  403. #endif
  404. sub sp, r0, # /* leave words for abort-stack */
  405.  
  406. #endif
  407.  
  408. clear_bss:
  409. ldr r0, _bss_start /* find start of bss segment */
  410. ldr r1, _bss_end /* stop here */
  411. mov r2, #0x00000000 /* clear */
  412.  
  413. clbss_l:
  414. str r2, [r0] /* clear loop... */
  415. add r0, r0, #
  416. cmp r0, r1
  417. ble clbss_l
  418.  
  419. ldr pc, _start_armboot
  420.  
  421. _start_armboot:
  422. .word start_armboot
  423.  
  424. #ifdef CONFIG_ENABLE_MMU
  425. _mmu_table_base:
  426. .word mmu_table
  427. #endif
  428.  
  429. /*
  430. * copy U-Boot to SDRAM and jump to ram (from NAND or OneNAND)
  431. * r0: size to be compared
  432. * Load 'st 2blocks to RAM because U-boot's size is larger than 1block(128k) size
  433. */
  434. .globl copy_from_nand
  435. copy_from_nand:
  436. mov r10, lr /* save return address */
  437.  
  438. mov r9, r0
  439. /* get ready to call C functions */
  440. ldr sp, _TEXT_PHY_BASE /* setup temp stack pointer */
  441. sub sp, sp, #
  442. mov fp, # /* no previous frame, so fp= */
  443. mov r9, #0x1000
  444. bl copy_uboot_to_ram
  445.  
  446. : tst r0, #0x0
  447. bne copy_failed
  448.  
  449. ldr r0, =0x0c000000
  450. ldr r1, _TEXT_PHY_BASE
  451. : ldr r3, [r0], #
  452. ldr r4, [r1], #
  453. teq r3, r4
  454. bne compare_failed /* not matched */
  455. subs r9, r9, #
  456. bne 1b
  457.  
  458. : mov lr, r10 /* all is OK */
  459. mov pc, lr
  460.  
  461. copy_failed:
  462. nop /* copy from nand failed */
  463. b copy_failed
  464.  
  465. compare_failed:
  466. nop /* compare failed */
  467. b compare_failed
  468.  
  469. /*
  470. * we assume that cache operation is done before. (eg. cleanup_before_linux())
  471. * actually, we don't need to do anything about cache if not use d-cache in U-Boot
  472. * So, in this function we clean only MMU. by scsuh
  473. *
  474. * void theLastJump(void *kernel, int arch_num, uint boot_params);
  475. */
  476. #ifdef CONFIG_ENABLE_MMU
  477. .globl theLastJump
  478. theLastJump:
  479. mov r9, r0
  480. ldr r3, =0xfff00000
  481. ldr r4, _TEXT_PHY_BASE
  482. adr r5, phy_last_jump
  483. bic r5, r5, r3
  484. orr r5, r5, r4
  485. mov pc, r5
  486. phy_last_jump:
  487. /*
  488. * disable MMU stuff
  489. */
  490. mrc p15, 0, r0, c1, c0, 0
  491. bic r0, r0, #0x00002300 /* clear bits 13, 9:8 (--V- --RS) */
  492. bic r0, r0, #0x00000087 /* clear bits 7, 2:0 (B--- -CAM) */
  493. orr r0, r0, #0x00000002 /* set bit 2 (A) Align */
  494. orr r0, r0, #0x00001000 /* set bit 12 (I) I-Cache */
  495. mcr p15, 0, r0, c1, c0, 0
  496.  
  497. mcr p15, 0, r0, c8, c7, 0 /* flush v4 TLB */
  498.  
  499. mov r0, #0
  500. mov pc, r9
  501. #endif
  502. /*
  503. *************************************************************************
  504. *
  505. * Interrupt handling
  506. *
  507. *************************************************************************
  508. */
  509. @
  510. @ IRQ stack frame.
  511. @
  512. #define S_FRAME_SIZE 72
  513.  
  514. #define S_OLD_R0 68
  515. #define S_PSR 64
  516. #define S_PC 60
  517. #define S_LR 56
  518. #define S_SP 52
  519.  
  520. #define S_IP 48
  521. #define S_FP 44
  522. #define S_R10 40
  523. #define S_R9 36
  524. #define S_R8 32
  525. #define S_R7 28
  526. #define S_R6 24
  527. #define S_R5 20
  528. #define S_R4 16
  529. #define S_R3 12
  530. #define S_R2 8
  531. #define S_R1 4
  532. #define S_R0 0
  533.  
  534. #define MODE_SVC 0x13
  535. #define I_BIT 0x80
  536.  
  537. /*
  538. * use bad_save_user_regs for abort/prefetch/undef/swi ...
  539. * use irq_save_user_regs / irq_restore_user_regs for IRQ/FIQ handling
  540. */
  541.  
  542. .macro bad_save_user_regs
  543. sub sp, sp, #S_FRAME_SIZE @ carve out a frame on current user stack
  544. stmia sp, {r0 - r12} @ Save user registers (now in svc mode) r0-r12
  545.  
  546. ldr r2, _armboot_start
  547. sub r2, r2, #(CFG_MALLOC_LEN)
  548. sub r2, r2, #(CFG_GBL_DATA_SIZE+8) @ set base 2 words into abort stack
  549. ldmia r2, {r2 - r3} @ get values for "aborted" pc and cpsr (into parm regs)
  550. add r0, sp, #S_FRAME_SIZE @ grab pointer to old stack
  551.  
  552. add r5, sp, #S_SP
  553. mov r1, lr
  554. stmia r5, {r0 - r3} @ save sp_SVC, lr_SVC, pc, cpsr
  555. mov r0, sp @ save current stack into r0 (param register)
  556. .endm
  557.  
  558. .macro irq_save_user_regs
  559. sub sp, sp, #S_FRAME_SIZE
  560. stmia sp, {r0 - r12} @ Calling r0-r12
  561. add r8, sp, #S_PC @ !!!! R8 NEEDS to be saved !!!! a reserved stack spot would be good.
  562. stmdb r8, {sp, lr}^ @ Calling SP, LR
  563. str lr, [r8, #0] @ Save calling PC
  564. mrs r6, spsr
  565. str r6, [r8, #4] @ Save CPSR
  566. str r0, [r8, #8] @ Save OLD_R0
  567. mov r0, sp
  568. .endm
  569.  
  570. .macro irq_restore_user_regs
  571. ldmia sp, {r0 - lr}^ @ Calling r0 - lr
  572. mov r0, r0
  573. ldr lr, [sp, #S_PC] @ Get PC
  574. add sp, sp, #S_FRAME_SIZE
  575. subs pc, lr, #4 @ return & move spsr_svc into cpsr
  576. .endm
  577.  
  578. .macro get_bad_stack
  579. ldr r13, _armboot_start @ setup our mode stack (enter in banked mode)
  580. sub r13, r13, #(CFG_MALLOC_LEN) @ move past malloc pool
  581. sub r13, r13, #(CFG_GBL_DATA_SIZE+8) @ move to reserved a couple spots for abort stack
  582.  
  583. str lr, [r13] @ save caller lr in position 0 of saved stack
  584. mrs lr, spsr @ get the spsr
  585. str lr, [r13, #4] @ save spsr in position 1 of saved stack
  586.  
  587. mov r13, #MODE_SVC @ prepare SVC-Mode
  588. @ msr spsr_c, r13
  589. msr spsr, r13 @ switch modes, make sure moves will execute
  590. mov lr, pc @ capture return pc
  591. movs pc, lr @ jump to next instruction & switch modes.
  592. .endm
  593.  
  594. .macro get_bad_stack_swi
  595. sub r13, r13, #4 @ space on current stack for scratch reg.
  596. str r0, [r13] @ save R0's value.
  597. ldr r0, _armboot_start @ get data regions start
  598. sub r0, r0, #(CFG_MALLOC_LEN) @ move past malloc pool
  599. sub r0, r0, #(CFG_GBL_DATA_SIZE+) @ move past gbl and a couple spots for abort stack
  600. str lr, [r0] @ save caller lr in position of saved stack
  601. mrs r0, spsr @ get the spsr
  602. str lr, [r0, #] @ save spsr in position of saved stack
  603. ldr r0, [r13] @ restore r0
  604. add r13, r13, # @ pop stack entry
  605. .endm
  606.  
  607. .macro get_irq_stack @ setup IRQ stack
  608. ldr sp, IRQ_STACK_START
  609. .endm
  610.  
  611. .macro get_fiq_stack @ setup FIQ stack
  612. ldr sp, FIQ_STACK_START
  613. .endm
  614.  
  615. /*
  616. * exception handlers
  617. */
  618. .align
  619. undefined_instruction:
  620. get_bad_stack
  621. bad_save_user_regs
  622. bl do_undefined_instruction
  623.  
  624. .align
  625. software_interrupt:
  626. get_bad_stack_swi
  627. bad_save_user_regs
  628. bl do_software_interrupt
  629.  
  630. .align
  631. prefetch_abort:
  632. get_bad_stack
  633. bad_save_user_regs
  634. bl do_prefetch_abort
  635.  
  636. .align
  637. data_abort:
  638. get_bad_stack
  639. bad_save_user_regs
  640. bl do_data_abort
  641.  
  642. .align
  643. not_used:
  644. get_bad_stack
  645. bad_save_user_regs
  646. bl do_not_used
  647.  
  648. #ifdef CONFIG_USE_IRQ
  649.  
  650. .align
  651. irq:
  652. get_irq_stack
  653. irq_save_user_regs
  654. bl do_irq
  655. irq_restore_user_regs
  656.  
  657. .align
  658. fiq:
  659. get_fiq_stack
  660. /* someone ought to write a more effiction fiq_save_user_regs */
  661. irq_save_user_regs
  662. bl do_fiq
  663. irq_restore_user_regs
  664.  
  665. #else
  666.  
  667. .align
  668. irq:
  669. get_bad_stack
  670. bad_save_user_regs
  671. bl do_irq
  672.  
  673. .align
  674. fiq:
  675. get_bad_stack
  676. bad_save_user_regs
  677. bl do_fiq
  678.  
  679. #endif
  680. .align
  681. .global arm1136_cache_flush
  682. arm1136_cache_flush:
  683. mcr p15, , r1, c7, c5, @ invalidate I cache
  684. mov pc, lr @ back to caller
  685.  
  686. #if defined(CONFIG_INTEGRATOR) && defined(CONFIG_ARCH_CINTEGRATOR)
  687. /* Use the IntegratorCP function from board/integratorcp/platform.S */
  688. #elif defined(CONFIG_S3C64XX)
  689. /* For future usage of S3C64XX*/
  690. #else
  691. .align
  692. .globl reset_cpu
  693. reset_cpu:
  694. ldr r1, rstctl /* get addr for global reset reg */
  695. mov r3, #0x2 /* full reset pll+mpu */
  696. str r3, [r1] /* force reset */
  697. mov r0, r0
  698. _loop_forever:
  699. b _loop_forever
  700. rstctl:
  701. .word PM_RSTCTRL_WKUP
  702.  
  703. #endif

s3c-u-boot-1.1.6源码分析之一start.s的更多相关文章

  1. Spring Boot 揭秘与实战 源码分析 - 工作原理剖析

    文章目录 1. EnableAutoConfiguration 帮助我们做了什么 2. 配置参数类 – FreeMarkerProperties 3. 自动配置类 – FreeMarkerAutoCo ...

  2. Spring Boot 揭秘与实战 源码分析 - 开箱即用,内藏玄机

    文章目录 1. 开箱即用,内藏玄机 2. 总结 3. 源代码 Spring Boot提供了很多”开箱即用“的依赖模块,那么,Spring Boot 如何巧妙的做到开箱即用,自动配置的呢? 开箱即用,内 ...

  3. Spring boot加载REACTIVE源码分析

    一,加载REACTIVE相关自动配置 spring boot通过判断含org.springframework.web.reactive.DispatcherHandler字节文件就确定程序类型是REA ...

  4. 涨姿势:Spring Boot 2.x 启动全过程源码分析

    目录 SpringApplication 实例 run 方法运行过程 总结 上篇<Spring Boot 2.x 启动全过程源码分析(一)入口类剖析>我们分析了 Spring Boot 入 ...

  5. Spring Boot 2.x 启动全过程源码分析

    Spring Boot 2.x 启动全过程源码分析 SpringApplication 实例 run 方法运行过程 上面分析了 SpringApplication 实例对象构造方法初始化过程,下面继续 ...

  6. Spring Boot 2.0系列文章(五):Spring Boot 2.0 项目源码结构预览

    关注我 转载请务必注明原创地址为:http://www.54tianzhisheng.cn/2018/04/15/springboot2_code/ 项目结构 结构分析: Spring-boot-pr ...

  7. Spring boot 源码分析(前言)

    开坑达人 & 断更达人的我又回来了 翻译的坑还没填完,这次再开个新坑= = 嗯,spring boot的源码分析 本坑不打算教你怎么用spring boot = = 也不打算跟你讲这玩意多方便 ...

  8. Spring Boot 2.x 启动全过程源码分析(上)入口类剖析

    Spring Boot 的应用教程我们已经分享过很多了,今天来通过源码来分析下它的启动过程,探究下 Spring Boot 为什么这么简便的奥秘. 本篇基于 Spring Boot 2.0.3 版本进 ...

  9. spring boot 2.0 源码分析(一)

    在学习spring boot 2.0源码之前,我们先利用spring initializr快速地创建一个基本的简单的示例: 1.先从创建示例中的main函数开始读起: package com.exam ...

  10. Spring Boot REST(二)源码分析

    Spring Boot REST(二)源码分析 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) SpringBoot RE ...

随机推荐

  1. Java SE ---算术运算符

    算术运算符:(加)+,(减)-,(乘)*,(除)/,(求余)%,自增自减 一,算数运算符:当有若干个变量参与运算时,结果类型取决于这些变量中表示范围最大的那个变量类型.如果参加运算的变量中有整型int ...

  2. jQuery之父:每天都写点代码

    去年秋天,我的“兼职编程项目”遇到了一些问题:要不是从 Khan Academy 的项目里挪出时间来的话,我根本没办法将不理想的进度弥补上. 这些项目遇到了一些严重的问题.之前的工作我主要是在周末,有 ...

  3. Android(java)学习笔记76:多线程-定时器概述和使用

    定时器: 定时器是一个应用十分广泛的线程工具,可用于调度多个定时任务以后台线程的方式执行. 在Java中,可以通过Timer和TimerTask类来实现定义调度的功能 Timer public Tim ...

  4. javascript 通过面向对象编写圆形数字时钟

    效果如图所示,代码如下 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  5. iOS-实现验证码倒计时功能(1)

    验证码倒计时按钮的应用是非常普遍的,该Blog就和你一起来写一个IDCountDownButton来实现验证码倒计时的效果.你可以想使用普通的UIButton类型按钮一样,只需要设置其倒计时时长(若未 ...

  6. java调用.net asmx服务

    有时候,在java下开发会调用一下.net下写的服务,看网上有各种方法,但总是不成功,总结下自己测试过能调用成功的方式: 1. 原始方式http-soap public static String p ...

  7. Hive中自定义函数

    Hive的自定义的函数的步骤: 1°.自定义UDF extends org.apache.hadoop.hive.ql.exec.UDF 2°.需要实现evaluate函数,evaluate函数支持重 ...

  8. codevs4373 窗口==poj2823 Sliding Window

    Sliding Window Time Limit: 12000MS   Memory Limit: 65536K Total Submissions: 53676   Accepted: 15399 ...

  9. img与父元素的间隙解决

    近来在做H5页面时,突然发现一个问题,使用一个div包裹一个img,在手机预览时,发现图片与div之间有间隙. 当时第一反应就是,是不是间距没有设置为0,于是预览了下代码: .active img { ...

  10. bootstrap的滚动监听

    <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8& ...