{"id":287,"date":"2018-03-13T10:21:28","date_gmt":"2018-03-13T02:21:28","guid":{"rendered":"http:\/\/www.max-shu.com\/blog\/?p=287"},"modified":"2018-03-13T13:37:35","modified_gmt":"2018-03-13T05:37:35","slug":"mini6410%e6%9d%bfuboot%e7%9a%84start-s","status":"publish","type":"post","link":"http:\/\/www.max-shu.com\/blog\/?p=287","title":{"rendered":"mini6410\u677fuboot\u7684start.S"},"content":{"rendered":"<div>#include &lt;config.h&gt;<br \/>\n#include &lt;version.h&gt;<br \/>\n#ifdef CONFIG_ENABLE_MMU<br \/>\n#include &lt;asm\/proc\/domain.h&gt;<br \/>\n#endif<br \/>\n#include &lt;regs.h&gt;#ifndef CONFIG_ENABLE_MMU<br \/>\n#ifndef CFG_PHY_UBOOT_BASE<br \/>\n#define CFG_PHY_UBOOT_BASE\u00a0\u00a0\u00a0\u00a0 CFG_UBOOT_BASE \u00a0@\u52a0\u5165\u4e0d\u7528MMU\uff0c\u53c8\u6ca1\u6709\u5b9a\u4e49CFG_PHY_UBOOT_BASE\u7684\u8bdd\uff0c\u5219CFG_PHY_UBOOT_BASE\u4e3aCFG_UBOOT_BASE<br \/>\n#endif<br \/>\n#endif<\/p>\n<p>\/*<br \/>\n*************************************************************************<br \/>\n*<br \/>\n* Jump vector table as in table 3.1 in [1]<br \/>\n*<br \/>\n*************************************************************************<br \/>\n*\/<\/p>\n<p>.globl _start<br \/>\n_start: b\u00a0\u00a0\u00a0\u00a0 reset \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u4e2d\u65ad\u5411\u91cf\u8868\u5165\u53e3\uff0c\u590d\u4f4d\u4e2d\u65ad\uff1a\u590d\u4f4d\u540e\u7b2c\u4e00\u6761\u6307\u4ee4\u5c31\u4ece\u8fd9\u91cc\u5f00\u59cb\u6267\u884c\uff0c\u8fd9\u91cc\u8df3\u8f6c\u5230reset\u6807\u53f7\u5904\u6267\u884c\u3002<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 pc, _undefined_instruction \u00a0 \u00a0 \u00a0 @\u672a\u5b9a\u4e49\u6307\u4ee4\u4e2d\u65ad\u3002<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 pc, _software_interrupt \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @\u8f6f\u4ef6\u4e2d\u65ad\u3002<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 pc, _prefetch_abort \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u9884\u53d6\u6307\u4ee4\u5931\u8d25\u4e2d\u65ad\u3002<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 pc, _data_abort \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u6570\u636e\u8bbf\u95ee\u5931\u8d25\u4e2d\u65ad\u3002<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 pc, _not_used \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @\u4fdd\u7559\u4e2d\u65ad\u3002<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 pc, _irq \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @IRQ\u4e2d\u65ad\u3002<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 pc, _fiq \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @FIQ\u4e2d\u65ad\u3002<\/p>\n<p>_undefined_instruction:<br \/>\n.word undefined_instruction \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u8fd9\u4e2aWORD\u6570\u636e\u5c31\u662f\u4e00\u4e2a\u4e2a\u4e2d\u65ad\u5904\u7406\u51fd\u6570\u7684\u5730\u5740\uff0c\u4e0a\u9762\u7684ldr\u6307\u4ee4\u4f1a\u628a\u8fd9\u4e2a\u5730\u5740\u88c5\u5165pc\uff0c\u7136\u540eCPU\u5c31\u4f1a\u6267\u884c\u5404\u4e2a\u51fd\u6570\uff0c\u8fd9\u4e2a\u6587\u4ef6\u7684\u540e\u534a\u6bb5\u4f1a\u6709\u8fd9\u4e9b\u5730\u5740\u7684\u6307\u4ee4\u3002<br \/>\n_software_interrupt:<br \/>\n.word software_interrupt<br \/>\n_prefetch_abort:<br \/>\n.word prefetch_abort<br \/>\n_data_abort:<br \/>\n.word data_abort<br \/>\n_not_used:<br \/>\n.word not_used<br \/>\n_irq:<br \/>\n.word irq<br \/>\n_fiq:<br \/>\n.word fiq<br \/>\n_pad:<br \/>\n.word 0x12345678 \/* now 16*4=64 *\/ @\u586b\u5145\u4e00\u4e2a\u5b57\uff0c\u4eceb reset\u5f00\u59cb\uff0c\u4e00\u76f4\u5230\u672c\u4f4d\u7f6e\u6784\u6210\u603b\u517164\u5b57\u8282\u3002<br \/>\n.global _end_vect<br \/>\n_end_vect:<\/p>\n<p>.balignl 16,0xdeadbeef \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@16\u5b57\u8282\u5bf9\u9f50\uff0c\u5982\u679c\u524d\u9762\u4e0d\u662f16\u5b57\u8282\u7684\u6574\u6570\u500d\uff0c\u800c\u4e14\u521a\u597d\u7a7a\u51fa4\u4e2a\u5b57\u8282\u7684\u8bdd\uff0c\u5c31\u75280xdeadbeef\u586b\u5145\uff0c\u8fd9\u91cc\u4e0d\u7528\u586b\u5145\uff0c\u56e0\u4e3a\u4e0a\u9762\u662f64\u5b57\u8282\uff0c\u521a\u597d\u662f16\u5b57\u8282\u7684\u500d\u6570\u3002<br \/>\n\/*<br \/>\n*************************************************************************<br \/>\n*<br \/>\n* Startup Code (reset vector)<br \/>\n*<br \/>\n* do important init only if we don&#8217;t start from memory!<br \/>\n* setup Memory and board specific bits prior to relocation.<br \/>\n* relocate armboot to ram<br \/>\n* setup stack<br \/>\n*<br \/>\n*************************************************************************<br \/>\n*\/<\/p>\n<p>_TEXT_BASE:<br \/>\n.word\u00a0\u00a0\u00a0\u00a0 TEXT_BASE \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @\u5b9a\u4e49\u4e00\u4e2a_TEXT_BASE\u53d8\u91cf\uff0c\u5b58\u653e\u4e86TEXT_BASE\u7684\u503c\u3002\u8fd9\u4e2aTEXT_BASE\u4f1a\u5728Config.mk\u91cc\u9762\u5b9a\u4e49\uff0c\u8fd9\u91cc\u5b9a\u4e49\u62100x57e00000(MMU\u65b9\u5f0f\u5219\u4e3a0xc7e00000)<\/p>\n<p>\/*<br \/>\n* Below variable is very important because we use MMU in U-Boot.<br \/>\n* Without it, we cannot run code correctly before MMU is ON.<br \/>\n* by scsuh.<br \/>\n*\/<br \/>\n_TEXT_PHY_BASE:<br \/>\n.word\u00a0\u00a0\u00a0\u00a0 CFG_PHY_UBOOT_BASE \u00a0 @\u5b9a\u4e49\u4e00\u4e2a_TEXT_PHY_BASE\u7684\u53d8\u91cf\uff0c\u5bf9\u5e94\u7684\u503c\u662fCFG_PHY_UBOOT_BASE\uff0c\u5c31\u662f\u5730\u57400x00000044\u91cc\u9762\u5b58\u653e\u7684\u503c\u662fCFG_PHY_UBOOT_BASE<\/p>\n<\/div>\n<div>.globl _armboot_start \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0<span style=\"color: #2d4fc9;\"><b>@\u5b9a\u4e49\u4e00\u4e2a_armboot_start\u7684\u5168\u5c40\u53d8\u91cf\uff0c\u5bf9\u5e94\u7684\u503c\u662f_start\uff0c\u5c31\u662f\u5730\u57400x00000048\u91cc\u9762\u5b58\u653e\u7684\u503c\u662f_start(0x00000000)\uff0c\u53ea\u662f\u4e00\u4e2a\u6807\u53f7\uff0c\u5728c\u8bed\u8a00\u4e2d\u53ef\u4f5c\u4e3a\u6307\u9488\u6765\u5f15\u7528\u3002\u6bd4\u5982monitor_flash_len = _bss_start &#8211; _armboot_start;\u8fd9\u4e2ac\u8bed\u53e5\uff0c\u5b9e\u9645\u5c31\u662f__bss_start\u7684\u503c\u51cf\u53bb_start\u7684\u503c\u3002<\/b><\/span><\/p>\n<div><\/div>\n<p>_armboot_start:<br \/>\n.word _start<\/p>\n<p>\/*<br \/>\n* These are defined in the board-specific linker script.<br \/>\n*\/<br \/>\n.globl _bss_start<br \/>\n_bss_start:<br \/>\n.word __bss_start \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u540c\u4e0a<\/p>\n<p>.globl _bss_end<br \/>\n_bss_end:<br \/>\n.word _end \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @\u540c\u4e0a<\/p>\n<p>#ifdef CONFIG_USE_IRQ<br \/>\n\/* IRQ stack memory (calculated at run-time) *\/<br \/>\n.globl IRQ_STACK_START<br \/>\nIRQ_STACK_START:<br \/>\n.word\u00a0\u00a0\u00a0\u00a0 0x0badc0de \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u540c\u4e0a<\/p>\n<p>\/* IRQ stack memory (calculated at run-time) *\/<br \/>\n.globl FIQ_STACK_START<br \/>\nFIQ_STACK_START:<br \/>\n.word 0x0badc0de \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u540c\u4e0a<br \/>\n#endif<\/p>\n<p>\/*<br \/>\n* the actual reset code<br \/>\n*\/<\/p>\n<p>reset:<br \/>\n\/*<br \/>\n* set the cpu to SVC32 mode<br \/>\n*\/<br \/>\nmrs\u00a0\u00a0\u00a0\u00a0 r0,cpsr<br \/>\nbic\u00a0\u00a0\u00a0\u00a0 r0,r0,#0x1f<br \/>\norr\u00a0\u00a0\u00a0\u00a0 r0,r0,#0xd3<br \/>\nmsr\u00a0\u00a0\u00a0\u00a0 cpsr,r0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @\u8bbe\u7f6eCPU\u4e3a\u4fdd\u62a4\u6a21\u5f0f\u3002<\/p>\n<p>\/*<br \/>\n*************************************************************************<br \/>\n*<br \/>\n* CPU_init_critical registers<br \/>\n*<br \/>\n* setup important registers<br \/>\n* setup memory timing<br \/>\n*<br \/>\n*************************************************************************<br \/>\n*\/<br \/>\n\/*<br \/>\n* we do sys-critical inits only at reboot,<br \/>\n* not when booting from ram!<br \/>\n*\/<br \/>\ncpu_init_crit:<br \/>\n\/*<br \/>\n* flush v4 I\/D caches<br \/>\n*\/<br \/>\nmov\u00a0\u00a0\u00a0\u00a0 r0, #0<br \/>\nmcr\u00a0\u00a0\u00a0\u00a0 p15, 0, r0, c7, c7, 0\u00a0\u00a0\u00a0\u00a0 \/* flush v3\/v4 cache *\/<br \/>\nmcr\u00a0\u00a0\u00a0\u00a0 p15, 0, r0, c8, c7, 0\u00a0\u00a0\u00a0\u00a0 \/* flush v4 TLB *\/<\/p>\n<p>\/*<br \/>\n* disable MMU stuff and caches<br \/>\n*\/<br \/>\nmrc\u00a0\u00a0\u00a0\u00a0 p15, 0, r0, c1, c0, 0<br \/>\nbic\u00a0\u00a0\u00a0\u00a0 r0, r0, #0x00002300\u00a0\u00a0\u00a0\u00a0 @ clear bits 13, 9:8 (&#8211;V- &#8211;RS)<br \/>\nbic\u00a0\u00a0\u00a0\u00a0 r0, r0, #0x00000087\u00a0\u00a0\u00a0\u00a0 @ clear bits 7, 2:0 (B&#8212; -CAM)<br \/>\norr\u00a0\u00a0\u00a0\u00a0 r0, r0, #0x00000002\u00a0\u00a0\u00a0\u00a0 @ set bit 2 (A) Align<br \/>\norr\u00a0\u00a0\u00a0\u00a0 r0, r0, #0x00001000\u00a0\u00a0\u00a0\u00a0 @ set bit 12 (I) I-Cache<br \/>\nmcr\u00a0\u00a0\u00a0\u00a0 p15, 0, r0, c1, c0, 0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @\u4e0d\u7528MMU\uff0c\u4e0d\u7528cache\u3002<\/p>\n<p>\/* Peri port setup *\/<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 r0, =0x70000000<br \/>\norr\u00a0\u00a0\u00a0\u00a0 r0, r0, #0x13<br \/>\nmcr\u00a0\u00a0\u00a0\u00a0 p15,0,r0,c15,c2,4\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ 256M(0x70000000-0x7fffffff)\uff0c\u8bbe\u7f6e\u5185\u5b58\u4e3a256M\u3002<\/p>\n<p>#ifdef CONFIG_BOOT_ONENAND \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@mini6410\u4e0d\u7528ONENAND\u3002<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 r0, =0x70000000\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ onenand controller setup<br \/>\norr\u00a0\u00a0\u00a0\u00a0 r0, r0, #0x100000<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 r1, =0x4000<br \/>\norr\u00a0\u00a0\u00a0\u00a0 r1, r1, #0xe0<br \/>\nstr\u00a0\u00a0\u00a0\u00a0 r1, [r0]<\/p>\n<p>#if defined(CONFIG_S3C6410) || defined(CONFIG_S3C6430)<br \/>\norr\u00a0\u00a0\u00a0\u00a0 r0, r0, #300\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ disable watchdog<br \/>\nmov\u00a0\u00a0\u00a0\u00a0 r1, #1<br \/>\nstr\u00a0\u00a0\u00a0\u00a0 r1, [r0]<\/p>\n<p>mov\u00a0\u00a0\u00a0\u00a0 r1, #0x23000000\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ start buffer register<br \/>\norr\u00a0\u00a0\u00a0\u00a0 r1, r1, #0x30000<br \/>\norr\u00a0\u00a0\u00a0\u00a0 r1, r1, #0xc800<br \/>\n#else<br \/>\nmov\u00a0\u00a0\u00a0\u00a0 r1, =0x20000000\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ start buffer register<br \/>\norr\u00a0\u00a0\u00a0\u00a0 r1, r1, #0xc30000<br \/>\norr\u00a0\u00a0\u00a0\u00a0 r1, r1, #0xc800<br \/>\n#endif<\/p>\n<p>sub\u00a0\u00a0\u00a0\u00a0 r0, r1, #0x0400\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ start address1 register<\/p>\n<p>ldr\u00a0\u00a0\u00a0\u00a0 r2, [r1, #0x84]\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ ecc bypass<br \/>\norr\u00a0\u00a0\u00a0\u00a0 r2, r2, #0x100<br \/>\nstr\u00a0\u00a0\u00a0\u00a0 r2, [r1, #0x84]<\/p>\n<p>mov\u00a0\u00a0\u00a0\u00a0 r3, #0x0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ DFS, FBA<br \/>\nstr\u00a0\u00a0\u00a0\u00a0 r3, [r0, #0x00]<br \/>\nstr\u00a0\u00a0\u00a0\u00a0 r3, [r0, #0x04]\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ select dataram for DDP as 0<\/p>\n<p>mov\u00a0\u00a0\u00a0\u00a0 r4, #0x104\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ interrupt register<br \/>\nmov\u00a0\u00a0\u00a0\u00a0 r5, #0x0002\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ FPA, FSA<br \/>\nmov\u00a0\u00a0\u00a0\u00a0 r6, #0x0800\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ BSA<\/p>\n<p>onenand_bl1_load:<br \/>\nstr\u00a0\u00a0\u00a0\u00a0 r5, [r0, #0x1c]\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ save FPA, FSA<br \/>\norr\u00a0\u00a0\u00a0\u00a0 r6, r6, #0x02\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ BSC<br \/>\nstr\u00a0\u00a0\u00a0\u00a0 r6, [r1, #0x00]\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ save BSA, BSC<br \/>\nstr\u00a0\u00a0\u00a0\u00a0 r3, [r1, r4]\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ clear interrupt<br \/>\nstr\u00a0\u00a0\u00a0\u00a0 r3, [r1, #0x80]\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ write load command<\/p>\n<p>mov\u00a0\u00a0\u00a0\u00a0 r7, #0x100\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ need small delay<\/p>\n<p>onenand_wait_loop1:<br \/>\nsubs\u00a0\u00a0\u00a0\u00a0 r7, r7, #0x1<br \/>\nbne\u00a0\u00a0\u00a0\u00a0 onenand_wait_loop1<\/p>\n<p>add\u00a0\u00a0\u00a0\u00a0 r5, r5, #0x2\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ next FPA, FSA<br \/>\nsub\u00a0\u00a0\u00a0\u00a0 r6, r6, #0x2<br \/>\nadd\u00a0\u00a0\u00a0\u00a0 r6, r6, #0x200\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ next BSA<br \/>\ncmp\u00a0\u00a0\u00a0\u00a0 r5, #0x8<br \/>\nbne\u00a0\u00a0\u00a0\u00a0 onenand_bl1_load<br \/>\n#endif<\/p>\n<p>\/*<br \/>\n* Go setup Memory and board specific bits prior to relocation.<br \/>\n*\/<br \/>\nbl\u00a0\u00a0\u00a0\u00a0 lowlevel_init\u00a0\u00a0\u00a0\u00a0 \/* go setup pll,mux,memory *\/ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u505a\u5e95\u5c42\u4f4e\u7ea7\u522b\u521d\u59cb\u5316\uff0c\u53c2\u8003<span style=\"color: #2d4fc9;\"><b>lowlevel_init.S<\/b><\/span>\u3002<\/p>\n<p>\/* when we already run in ram, we don&#8217;t need to relocate U-Boot.<br \/>\n* and actually, memory controller must be configured before U-Boot<br \/>\n* is running in ram.<br \/>\n*\/<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 r0, =0xff000fff \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @\u56e0\u4e3auboot\u5c06\u88ab\u62f7\u8d1d\u52300x57e00000(\u6216MMU\u4e0b0xc7e00000)\u5f00\u59cb\u76842M\u7a7a\u95f4\u5185\uff0c\u800c\u4e14\u5927\u5c0f\u4e0d\u8d85\u8fc7\uff0c\u3002\u6240\u4ee5\u5982\u679c\u5728\u5185\u5b58\u6267\u884c\u5219PC\u80af\u5b9a\u57280x57e0000\u5f80\u4e0a\u7684\u5730\u5740\u7a7a\u95f4\uff0c\u5982\u679c\u5728step stone\u6267\u884c\u7684\u8bdd\uff0cPC\u80af\u5b9a\u57280x00200000\u5f80\u4e0b\u7684\u5730\u5740\u7a7a\u95f4\u3002\u800c\u4e14\u4e24\u8005\u7684\u504f\u79fb\u76f8\u540c\uff0c\u6240\u4ee5\u53ea\u6bd4\u8f83\u4e2d\u95f4\u51e0\u4f4d\u5c31\u53ef\u4ee5\u4e86\u3002<br \/>\nbic\u00a0\u00a0\u00a0\u00a0 r1, pc, r0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/* r0 &lt;- current base addr of code *\/<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 r2, _TEXT_BASE\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/* r1 &lt;- original base addr in ram *\/ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @\u8fd9\u91cc\u8f7d\u5165\u7684\u662f_TEXT_BASE\u5730\u5740\u5bf9\u5e94\u7684TEXT_BASE\u503c\uff0c\u53730x57e00000\u3002<br \/>\nbic\u00a0\u00a0\u00a0\u00a0 r2, r2, r0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/* r0 &lt;- current base addr of code *\/<br \/>\ncmp\u00a0\u00a0\u00a0\u00a0 r1, r2\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/* compare r0, r1\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 *\/<br \/>\nbeq\u00a0\u00a0\u00a0\u00a0 after_copy\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/* r0 == r1 then skip flash copy\u00a0\u00a0 *\/ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @\u5df2\u7ecf\u62f7\u8d1d\u5230\u4e86\u5185\u5b58<\/p>\n<p>#ifdef CONFIG_BOOT_NOR\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/* relocate U-Boot to RAM *\/ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@mini6410\u4e0d\u4f7f\u7528NOR\u3002<br \/>\nadr\u00a0\u00a0\u00a0\u00a0 r0, _start\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/* r0 &lt;- current position of code\u00a0\u00a0 *\/ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @\u8fd9\u4e2aadr\u662f\u76f8\u5bf9PC\u5bfb\u5740\uff0c\u7ffb\u8bd1\u4e3asub r0,PC,#xx\uff0c\u5c31\u662f_start\u7684\u5f53\u524d\u5730\u5740\uff0c\u4e5f\u8bb8\u5c31\u662f0x00000000\u3002<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 r1, _TEXT_PHY_BASE\u00a0\u00a0\u00a0\u00a0 \/* r1 &lt;- destination\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 *\/ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @r1\u91cc\u9762\u5b58\u7684\u662f\u94fe\u63a5\u65f6\u7684\u8d77\u59cb\u5730\u5740\uff0c\u53730xc7e00000\u7684\u4f4d\u7f6e\u3002<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 r2, _armboot_start<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 r3, _bss_start<br \/>\nsub\u00a0\u00a0\u00a0\u00a0 r2, r3, r2\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/* r2 &lt;- size of armboot\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 *\/ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @\u4ee3\u7801\u6bb5\u5927\u5c0f\uff0c\u5373_bss\u6bb5\u8d77\u59cb\u4f4d\u7f6e-.text\u6bb5\u7684\u8d77\u59cb\u4f4d\u7f6e\u3002<br \/>\nadd\u00a0\u00a0\u00a0\u00a0 r2, r0, r2\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/* r2 &lt;- source end address\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 *\/ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u90a3\u4e48\u5373\u5c06\u8981\u62f7\u8d1d\u7684\u5c31\u662f\u4ece_start\u5f53\u524d\u4f4d\u7f6e\u5f00\u59cb\u5230_start+\u4ee3\u7801\u6bb5\u5927\u5c0f\u7684\u4f4d\u7f6e\u3002<\/p>\n<p>nor_copy_loop:<br \/>\nldmia\u00a0\u00a0\u00a0\u00a0 r0!, {r3-r10}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/* copy from source address [r0]\u00a0\u00a0\u00a0 *\/<br \/>\nstmia\u00a0\u00a0\u00a0\u00a0 r1!, {r3-r10}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/* copy to\u00a0\u00a0 target address [r1]\u00a0\u00a0\u00a0 *\/ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u505a\u62f7\u8d1d<br \/>\ncmp\u00a0\u00a0\u00a0\u00a0 r0, r2\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/* until source end addreee [r2]\u00a0\u00a0\u00a0 *\/ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @\u62f7\u8d1d\u662f\u5426\u5b8c\u6210<br \/>\nble\u00a0\u00a0\u00a0\u00a0 nor_copy_loop<br \/>\nb\u00a0\u00a0\u00a0\u00a0 after_copy<br \/>\n#endif<\/p>\n<p>#ifdef CONFIG_BOOT_NAND<br \/>\nmov\u00a0\u00a0\u00a0\u00a0 r0, #0x1000 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u4f20\u5165\u53c2\u6570\uff0c<span style=\"color: #ff0000;\">\u4ece\u4e0b\u9762copy_from_nand\u770b\u4e0d\u51fa\u8fd9\u4e2a\u53c2\u6570\u6709\u4ec0\u4e48\u7528\uff1f<\/span><br \/>\nbl\u00a0\u00a0\u00a0\u00a0 copy_from_nand \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @\u4eceNANDFLASH\u62f7\u8d1d\u5230\u5185\u5b58\u3002<br \/>\n#endif<\/p>\n<p>#ifdef CONFIG_BOOT_MOVINAND<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 sp, _TEXT_PHY_BASE \u00a0 \u00a0 \u00a0 \u00a0@\u8bbe\u7f6e\u6808\u5730\u5740\u4e3a_TEXT_PHY_BASE\uff0c\u5373CFG_PHY_UBOOT_BASE(0x57e00000)<br \/>\nbl\u00a0\u00a0\u00a0\u00a0 movi_bl2_copy \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @\u8c03\u7528c\u51fd\u6570\u4eceSD\u5361\u62f7\u8d1d\u5230\u5185\u5b58\uff0c<b><span style=\"color: #2d4fc9;\">\u53c2\u8003Movi.c\u6587\u4ef6<\/span><\/b><br \/>\nb\u00a0\u00a0\u00a0\u00a0 after_copy \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u62f7\u8d1d\u4e4b\u540e\u6267\u884c\u7684\u4f4d\u7f6e<br \/>\n#endif<\/p>\n<p>#ifdef CONFIG_BOOT_ONENAND<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 sp, =0x50000000\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ temporary stack<\/p>\n<p>#ifdef CONFIG_S3C6400<br \/>\nmov\u00a0\u00a0\u00a0\u00a0 r1, =0x20000000\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ start buffer register<br \/>\norr\u00a0\u00a0\u00a0\u00a0 r1, r1, #0xc30000<br \/>\norr\u00a0\u00a0\u00a0\u00a0 r1, r1, #0xc800<br \/>\n#else<br \/>\nmov\u00a0\u00a0\u00a0\u00a0 r1, #0x23000000\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ start buffer register<br \/>\norr\u00a0\u00a0\u00a0\u00a0 r1, r1, #0x30000<br \/>\norr\u00a0\u00a0\u00a0\u00a0 r1, r1, #0xc800<br \/>\n#endif<\/p>\n<p>ldr\u00a0\u00a0\u00a0\u00a0 r2, [r1, #0x84]\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ ecc bypass<br \/>\norr\u00a0\u00a0\u00a0\u00a0 r2, r2, #0x100<br \/>\nstr\u00a0\u00a0\u00a0\u00a0 r2, [r1, #0x84]<\/p>\n<p>sub\u00a0\u00a0\u00a0\u00a0 r0, r1, #0x0400\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ start address1 register<\/p>\n<p>str\u00a0\u00a0\u00a0\u00a0 r3, [r0, #0x00]<br \/>\nstr\u00a0\u00a0\u00a0\u00a0 r3, [r0, #0x04]\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ select dataram for DDP as 0<\/p>\n<p>mov\u00a0\u00a0\u00a0\u00a0 r4, #0x104\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ interrupt register<\/p>\n<p>mov\u00a0\u00a0\u00a0\u00a0 r6, #0x0c00\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ fixed dataram1 sector number<br \/>\nstr\u00a0\u00a0\u00a0\u00a0 r6, [r1, #0x00]<\/p>\n<p>mov\u00a0\u00a0\u00a0\u00a0 r3, #0x0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ DFS, FBA<br \/>\nmov\u00a0\u00a0\u00a0\u00a0 r5, #0x0000\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ FPA, FSA<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 r9, =CFG_PHY_UBOOT_BASE\u00a0\u00a0\u00a0\u00a0 @ destination<\/p>\n<p>onenand_bl2_load:<br \/>\nstr\u00a0\u00a0\u00a0\u00a0 r3, [r0, #0x00]\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ save DFS, FBA<br \/>\nstr\u00a0\u00a0\u00a0\u00a0 r5, [r0, #0x1c]\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ save FPA, FSA<\/p>\n<p>mov\u00a0\u00a0\u00a0\u00a0 r7, #0x0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ clear interrupt<br \/>\nstr\u00a0\u00a0\u00a0\u00a0 r7, [r1, r4]<br \/>\nstr\u00a0\u00a0\u00a0\u00a0 r7, [r1, #0x80]\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ write load command<\/p>\n<p>mov\u00a0\u00a0\u00a0\u00a0 r8, #0x1000<br \/>\nonenand_wait_loop2:<br \/>\nsubs\u00a0\u00a0\u00a0\u00a0 r8, r8, #0x1<br \/>\nbne\u00a0\u00a0\u00a0\u00a0 onenand_wait_loop2<\/p>\n<p>onenand_wait_int:\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ wait INT and RI<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 r7, [r1, r4]<br \/>\nmov\u00a0\u00a0\u00a0\u00a0 r8, #0x8000<br \/>\norr\u00a0\u00a0\u00a0\u00a0 r8, r8, #0x80<br \/>\ntst\u00a0\u00a0\u00a0\u00a0 r7, r8<br \/>\nbeq\u00a0\u00a0\u00a0\u00a0 onenand_wait_int<\/p>\n<p>mov\u00a0\u00a0\u00a0\u00a0 r7, #0x0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ clear interrupt<br \/>\nstr\u00a0\u00a0\u00a0\u00a0 r7, [r1, r4]<\/p>\n<p>mov\u00a0\u00a0\u00a0\u00a0 r8, #0xc00\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ source address (dataram1) \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u62f7\u8d1d\u56fa\u5b9a\u4f4d\u7f6e\u7684\u56fa\u5b9a\u5927\u5c0f\u6570\u636e\u5230\u5185\u5b58\uff0c\u5185\u5b58\u5176\u5b9e\u5730\u5740\u4e3a0xc7e00000\u3002<\/p>\n<\/div>\n<div>\n<p>\u00a0\u00a0\u00a0\u00a0 mov\u00a0\u00a0\u00a0\u00a0 r10, #0x40\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ copy loop count (64 = 2048 \/ 32)<\/p>\n<p>stmia\u00a0\u00a0\u00a0\u00a0 sp, {r0-r7}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ backup<\/p>\n<p>onenand_copy_to_ram:<br \/>\nldmia\u00a0\u00a0\u00a0\u00a0 r8!, {r0-r7}<br \/>\nstmia\u00a0\u00a0\u00a0\u00a0 r9!, {r0-r7}<br \/>\nsubs\u00a0\u00a0\u00a0\u00a0 r10, r10, #0x1<br \/>\nbne\u00a0\u00a0\u00a0\u00a0 onenand_copy_to_ram<\/p>\n<p>ldmia\u00a0\u00a0\u00a0\u00a0 sp, {r0-r7}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ restore<\/p>\n<p>add\u00a0\u00a0\u00a0\u00a0 r5, r5, #0x4\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ next FPA<br \/>\ncmp\u00a0\u00a0\u00a0\u00a0 r5, #0x100\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ last FPA?<br \/>\nbne\u00a0\u00a0\u00a0\u00a0 onenand_bl2_load<\/p>\n<p>\/* next block *\/<br \/>\nmov\u00a0\u00a0\u00a0\u00a0 r5, #0x0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ reset FPA<br \/>\nadd\u00a0\u00a0\u00a0\u00a0 r3, r3, #0x1\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ next FBA<br \/>\ncmp\u00a0\u00a0\u00a0\u00a0 r3, #0x2\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ last FBA?<br \/>\nbne\u00a0\u00a0\u00a0\u00a0 onenand_bl2_load<br \/>\nb\u00a0\u00a0\u00a0\u00a0 after_copy<br \/>\n#endif<\/p>\n<p>#ifdef CONFIG_BOOT_ONENAND_IROM \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@onenand IROM<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 sp, _TEXT_PHY_BASE \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @\u8bbe\u7f6e\u6808\u6307\u9488<br \/>\nbl\u00a0\u00a0\u00a0\u00a0 onenand_bl2_copy \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @\u8c03\u7528c\u51fd\u6570\uff0c<b><span style=\"color: #2d4fc9;\">\u5b9a\u4e49\u5728Onenand_cp.c\u6587\u4ef6\u4e2d<\/span><\/b>\uff0c\u5b9e\u9645\u8c03\u7528IROM\u91cc\u9762\u7684\u62f7\u8d1d\u51fd\u6570\u6765\u5b9e\u73b0\u7684\u3002<br \/>\nb\u00a0\u00a0\u00a0\u00a0 after_copy<br \/>\n#endif<\/p>\n<p>after_copy:<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 r0, =ELFIN_GPIO_BASE \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u8bbe\u7f6eGPP13\/GPP14\u53e3\u4e3a1<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 r1, =0xC00<br \/>\nstr\u00a0\u00a0\u00a0\u00a0 r1, [r0, #GPPDAT_OFFSET]<\/p>\n<p>#ifdef CONFIG_ENABLE_MMU \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @\u8bbe\u7f6eMMU\uff0c<b><span style=\"color: #2d4fc9;\">\u53c2\u8003lowlevel_init.S\u7684mmu_table<\/span><\/b><br \/>\nenable_mmu:<br \/>\n\/* enable domain access *\/<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 r5, =0x0000ffff\u00a0\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u8bbe\u7f6edomain0\uff0ddomain7\u4e3a\u4e0d\u68c0\u67e5\u8bbf\u95ee\u63a7\u5236\uff0cdomain\u503c\u5728MMU\u63cf\u8ff0\u7b26\u91cc\u9762\u5b9a\u4e49<\/p>\n<\/div>\n<div>\n<p>\u00a0\u00a0\u00a0\u00a0 mcr\u00a0\u00a0\u00a0\u00a0 p15, 0, r5, c3, c0, 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ load domain access register<\/p>\n<p>\/* Set the TTB register *\/<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 r0, _mmu_table_base<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 r1, =CFG_PHY_UBOOT_BASE \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @TTB\u4e3a\u4e00\u7ea7\u9875\u8868\u7684\u865a\u62df\u57fa\u5730\u5740\uff0c\u53ea\u4fdd\u5b58\u9ad818\u4f4d\uff0c\u6240\u4ee5\u9875\u8868\u9700\u8981align\u523014\u4f4d\u5bbd\u3002<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 r2, =0xfff00000 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u56e0\u4e3ammu_table\u7684\u9ad812\u4f4d\u5c06\u88ab\u6620\u5c04\u5230\u865a\u62df\u5730\u5740\uff0c\u6240\u4ee5\u8fd9\u91cc\u6e05\u9664\u9ad812\u4f4d\uff0c\u5f97\u5230\u4f4e20\u4f4d\u5730\u5740\u8ddf\u865a\u62df\u57fa\u672c\u5730\u5740\u7684\u9ad812\u4f4d\u7ec4\u5408\uff0c\u5f97\u5230\u5728\u865a\u62df\u5730\u5740\u7a7a\u95f4\u91cc\u9762\u7684\u9875\u8868\u5730\u5740\u3002\u53730xc7e00000 | mmu_table\u3002<br \/>\nbic\u00a0\u00a0\u00a0\u00a0 r0, r0, r2<br \/>\norr\u00a0\u00a0\u00a0\u00a0 r1, r0, r1<br \/>\nmcr\u00a0\u00a0\u00a0\u00a0 p15, 0, r1, c2, c0, 0<\/p>\n<p>\/* Enable the MMU *\/<br \/>\nmmu_on:<br \/>\nmrc\u00a0\u00a0\u00a0\u00a0 p15, 0, r0, c1, c0, 0<br \/>\norr\u00a0\u00a0\u00a0\u00a0 r0, r0, #1\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/* Set CR_M to enable MMU *\/ @\u8bbe\u7f6eMMU\u63a7\u5236\u5bc4\u5b58\u5668M\u6bd4\u7279\u4e3a1\uff0c\u4f7f\u80fdMMU\u3002<br \/>\nmcr\u00a0\u00a0\u00a0\u00a0 p15, 0, r0, c1, c0, 0<br \/>\nnop \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u7b49\u5f85\u7a33\u5b9a\u3002<br \/>\nnop<br \/>\nnop<br \/>\nnop<br \/>\n#endif<\/p>\n<p>skip_hw_init:<br \/>\n\/* Set up the stack\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 *\/<br \/>\nstack_setup:<br \/>\n#ifdef CONFIG_MEMORY_UPPER_CODE<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 sp, =(CFG_UBOOT_BASE + CFG_UBOOT_SIZE &#8211; 0xc) \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u8bbe\u7f6e\u6808\u6307\u9488\u4e3aMMU\u65b9\u5f0f\uff1a0xc7e00000+2MB-12\u5b57\u8282\u4fdd\u7559\uff0c\u53730xc8000000-12\u5b57\u8282\u4f4d\u7f6e\u3002\u6808\u5728_TEXT_BASE\u4e0a\u9762\u3002<br \/>\n#else<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 r0, _TEXT_BASE\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/* upper 128 KiB: relocated uboot\u00a0\u00a0 *\/ \u00a0 \u00a0 @r0\u4e3a0xc7e00000\uff0c\u6808\u5728_TEXT_BASE\u4e0b\u9762\u3002<br \/>\nsub\u00a0\u00a0\u00a0\u00a0 r0, r0, #CFG_MALLOC_LEN\u00a0\u00a0\u00a0\u00a0 \/* malloc area\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 *\/ \u00a0 @\u4fdd\u75591MB\u7684malloc()\u7528<br \/>\nsub\u00a0\u00a0\u00a0\u00a0 r0, r0, #CFG_GBL_DATA_SIZE \/* bdinfo\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 *\/ \u00a0 \u00a0 \u00a0 \u00a0@\u4fdd\u7559128KB\u5168\u5c40\u6570\u636e<br \/>\n#ifdef CONFIG_USE_IRQ<br \/>\nsub\u00a0\u00a0\u00a0\u00a0 r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ) \u00a0 \u00a0 @\u4fdd\u7559IRQ\u548cFIQ\u6808<br \/>\n#endif<br \/>\nsub\u00a0\u00a0\u00a0\u00a0 sp, r0, #12\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/* leave 3 words for abort-stack\u00a0\u00a0\u00a0 *\/ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u4fdd\u755912\u4e2a\u5b57\u8282<\/p>\n<p>#endif<\/p>\n<p>clear_bss:<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 r0, _bss_start\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/* find start of bss segment\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 *\/ \u00a0 \u00a0 \u00a0 \u00a0@\u628abss\u6bb5\u7684\u503c\u5168\u90e8\u6e050\uff0c_bss_start\u548c_bss_end\u5b9a\u4e49\u5728\u4e0a\u9762\u5f00\u59cb\u4f4d\u7f6e\uff0c\u800c__bss_start\u548c__end\u5b9a\u4e49\u5728lds\u6587\u4ef6\u4e2d\u3002<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 r1, _bss_end\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/* stop here\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 *\/<br \/>\nmov \u00a0\u00a0\u00a0\u00a0 r2, #0x00000000\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/* clear\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 *\/<\/p>\n<p>clbss_l:<br \/>\nstr\u00a0\u00a0\u00a0\u00a0 r2, [r0]\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/* clear loop&#8230;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 *\/ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @\u6e05\u96f6bss\u6bb5<br \/>\nadd\u00a0\u00a0\u00a0\u00a0 r0, r0, #4<br \/>\ncmp\u00a0\u00a0\u00a0\u00a0 r0, r1<br \/>\nble\u00a0\u00a0\u00a0\u00a0 clbss_l<\/p>\n<p>ldr\u00a0\u00a0\u00a0\u00a0 pc, _start_armboot \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u628astart_armboot\u8fd9\u4e2ac\u51fd\u6570\u7684\u5730\u5740\u8f7d\u5165pc\u5bc4\u5b58\u5668\uff0c\u5b9e\u73b0\u5230c\u5165\u53e3\u7684\u8df3\u8f6c\uff1b<span style=\"color: #ff0000;\"><b>\u6ce8\u610f\uff0c\u524d\u9762\u6240\u6709\u4ee3\u7801\u90fd\u662f\u7528\u7684\u76f8\u5bf9\u5730\u5740\u8df3\u8f6c(\u5982\u679c\u7528\u5230\u4e86\u7b26\u53f7\u5730\u5740\uff0c\u9664\u4e86\u62f7\u8d1d\u5230\u5185\u5b58\u7684\u5730\u65b9\u4e4b\u5916\uff0c\u5176\u4ed6\u90fd\u662f\u5728\u505a\u52a0\u51cf\u6cd5\uff0c\u6ca1\u6709\u76f4\u63a5\u4f7f\u7528)\uff0c\u6240\u4ee5\u4ee3\u7801\u90fd\u57280x00000000\u9644\u4ef6\u6267\u884c\uff0c\u53ea\u6709\u5728\u8fd9\u91cc\u7528\u4e86\u7edd\u5bf9\u5730\u5740\u8df3\u8f6c\uff0c\u8df3\u8f6c\u5230\u4e86\u94fe\u63a5\u6240\u6307\u5b9a\u7684\u7b26\u53f7\u8868\u5730\u5740\u53730xc7exxxxx\u4f4d\u7f6e\u533a\u95f4\u53bb\u6267\u884c\u4e86\u3002<\/b><\/span><b><span style=\"color: #2d4fc9;\">start_armboot\u5b9a\u4e49\u5728Board.c\u6587\u4ef6\u4e2d\u3002<\/span><\/b><\/p>\n<p>_start_armboot:<br \/>\n.word start_armboot<\/p>\n<p>#ifdef CONFIG_ENABLE_MMU<br \/>\n_mmu_table_base:<br \/>\n.word mmu_table<br \/>\n#endif<\/p>\n<p>\/*<br \/>\n* copy U-Boot to SDRAM and jump to ram (from NAND or OneNAND)<br \/>\n* r0: size to be compared<br \/>\n* Load 1&#8217;st 2blocks to RAM because U-boot&#8217;s size is larger than 1block(128k) size<br \/>\n*\/<br \/>\n.globl copy_from_nand<br \/>\ncopy_from_nand:<br \/>\nmov\u00a0\u00a0\u00a0\u00a0 r10, lr\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/* save return address *\/ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @\u4fdd\u5b58\u8fd4\u56de\u5730\u5740<\/p>\n<p>mov\u00a0\u00a0\u00a0\u00a0 r9, r0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @\u4fdd\u5b58\u4f20\u5165\u7684\u53c2\u6570\u5230r9<br \/>\n\/* get ready to call C functions *\/<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 sp, _TEXT_PHY_BASE\u00a0\u00a0\u00a0\u00a0 \/* setup temp stack pointer *\/ \u00a0 \u00a0@\u8c03\u7528c\u51fd\u6570\u524d\u505a\u51c6\u5907\uff0c\u8bbe\u7f6e\u6808\u6307\u9488\u3002<br \/>\nsub\u00a0\u00a0\u00a0\u00a0 sp, sp, #12 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @\u7559\u51fa12\u5b57\u8282\u7a7a\u95f4\u4f5c\u4fdd\u62a4<br \/>\nmov\u00a0\u00a0\u00a0\u00a0 fp, #0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/* no previous frame, so fp=0 *\/ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @\u8bbe\u7f6e\u5e27\u6307\u9488\u4e3a0\uff0c\u53c2\u8003\u6c47\u7f16\u548cc\u7684\u76f8\u4e92\u8c03\u7528\u3002<br \/>\nmov\u00a0\u00a0\u00a0\u00a0 r9, #0x1000 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @\u4f20\u4e00\u4e2a\u7acb\u5373\u6570\u7ed9r9\uff0c<span style=\"color: #ff0000;\">\u770b\u4e0d\u51fa\u6709\u5565\u7528\uff1f\u53ea\u5728\u4e0b\u9762\u6821\u9a8c\u7684\u65f6\u5019\u7528\u4e0a\u4e86\u3002<\/span><br \/>\nbl\u00a0\u00a0\u00a0\u00a0 copy_uboot_to_ram \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u8c03\u7528c\u51fd\u6570\u4eceNAND\u62f7\u8d1d\u5230\u5185\u5b58\u3002<b><span style=\"color: #2d4fc9;\">\u53c2\u8003Nand_cp.c\u6587\u4ef6<\/span><\/b><\/p>\n<p>3:\u00a0\u00a0\u00a0\u00a0 tst \u00a0\u00a0\u00a0\u00a0 r0, #0x0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @\u5982\u679cc\u51fd\u6570\u8c03\u7528\u6210\u529f\uff0c\u5219r0\u4fdd\u5b58\u7684\u8fd4\u56de\u503c\u4e3a0.<br \/>\nbne\u00a0\u00a0\u00a0\u00a0 copy_failed \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u62f7\u8d1d\u5931\u8d25\u3002<\/p>\n<p>ldr\u00a0\u00a0\u00a0\u00a0 r0, =0x0c000000 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @\u8fd9\u91cc\u662fstepping stone\u533a\u57df\uff0cNAND\u542f\u52a8\u65f6\uff0c\u786c\u4ef6\u5148\u4eceNAND\u8bfb\u8fdb\u6765\u653e\u5230\u8fd9\u4e2a\u4f4d\u7f6e\uff0c\u7136\u540e\u6620\u5c04\u52300x00000000\u4f4d\u7f6e\u3002<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 r1, _TEXT_PHY_BASE \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u62f7\u8d1d\u5230\u5185\u5b58\u7684\u5730\u5740\uff0c0x57e00000\uff0c\u8fd9\u91cc\u662f\u521a\u624d\u4eceNAND\u62f7\u8d1d\u8fdb\u6765\u653e\u5230\u8fd9\u91cc\u7684\uff0c\u6240\u4ee5\u8fd9\u4e24\u4e2a\u533a\u57df\u90fd\u662f\u4ee3\u7801\uff0c\u5e94\u8be5\u5b8c\u5168\u4e00\u6837\u3002<br \/>\n1:\u00a0\u00a0\u00a0\u00a0 ldr\u00a0\u00a0\u00a0\u00a0 r3, [r0], #4 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u9010\u4e00\u6bd4\u8f83\u3002<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 r4, [r1], #4<br \/>\nteq\u00a0\u00a0\u00a0\u00a0 r3, r4<br \/>\nbne\u00a0\u00a0\u00a0\u00a0 compare_failed\u00a0\u00a0\u00a0\u00a0 \/* not matched *\/ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u6bd4\u8f83\u5931\u8d25<br \/>\nsubs\u00a0\u00a0\u00a0\u00a0 r9, r9, #4 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u51cf4\u5b57\u8282\u7ee7\u7eed\u4e0b\u4e00\u4e2a\u6bd4\u8f83<br \/>\nbne\u00a0\u00a0\u00a0\u00a0 1b<\/p>\n<p>4:\u00a0\u00a0\u00a0\u00a0 mov\u00a0\u00a0\u00a0\u00a0 lr, r10\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/* all is OK *\/ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @\u62f7\u8d1d\u6210\u529f\uff0c\u8fd4\u56de<br \/>\nmov\u00a0\u00a0\u00a0\u00a0 pc, lr<\/p>\n<p>copy_failed:<br \/>\nnop\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/* copy from nand failed *\/ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @\u62f7\u8d1d\u5931\u8d25\uff0c\u4e00\u76f4\u5faa\u73af<br \/>\nb\u00a0\u00a0\u00a0\u00a0 copy_failed<\/p>\n<p>compare_failed:<br \/>\nnop\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/* compare failed *\/ \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u6bd4\u8f83\u5931\u8d25\uff0c\u4e00\u76f4\u5faa\u73af<br \/>\nb\u00a0\u00a0\u00a0\u00a0 compare_failed<\/p>\n<p>\/* \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u4e0b\u9762\u7684\u51fd\u6570\u5e94\u8be5\u4e0d\u4f1a\u8fdb\u5165\u6267\u884c\u3002<br \/>\n* we assume that cache operation is done before. (eg. cleanup_before_linux())<br \/>\n* actually, we don&#8217;t need to do anything about cache if not use d-cache in U-Boot<br \/>\n* So, in this function we clean only MMU. by scsuh<br \/>\n*<br \/>\n* void\u00a0\u00a0\u00a0\u00a0 theLastJump(void *kernel, int arch_num, uint boot_params);<br \/>\n*\/<br \/>\n#ifdef CONFIG_ENABLE_MMU<br \/>\n.globl theLastJump<br \/>\ntheLastJump:<br \/>\nmov\u00a0\u00a0\u00a0\u00a0 r9, r0<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 r3, =0xfff00000<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 r4, _TEXT_PHY_BASE<br \/>\nadr\u00a0\u00a0\u00a0\u00a0 r5, phy_last_jump<br \/>\nbic\u00a0\u00a0\u00a0\u00a0 r5, r5, r3<br \/>\norr\u00a0\u00a0\u00a0\u00a0 r5, r5, r4<br \/>\nmov\u00a0\u00a0\u00a0\u00a0 pc, r5<br \/>\nphy_last_jump:<br \/>\n\/*<br \/>\n* disable MMU stuff<br \/>\n*\/<br \/>\nmrc\u00a0\u00a0\u00a0\u00a0 p15, 0, r0, c1, c0, 0<br \/>\nbic\u00a0\u00a0\u00a0\u00a0 r0, r0, #0x00002300\u00a0\u00a0\u00a0\u00a0 \/* clear bits 13, 9:8 (&#8211;V- &#8211;RS) *\/<br \/>\nbic\u00a0\u00a0\u00a0\u00a0 r0, r0, #0x00000087\u00a0\u00a0\u00a0\u00a0 \/* clear bits 7, 2:0 (B&#8212; -CAM) *\/<br \/>\norr\u00a0\u00a0\u00a0\u00a0 r0, r0, #0x00000002\u00a0\u00a0\u00a0\u00a0 \/* set bit 2 (A) Align *\/<br \/>\norr\u00a0\u00a0\u00a0\u00a0 r0, r0, #0x00001000\u00a0\u00a0\u00a0\u00a0 \/* set bit 12 (I) I-Cache *\/<br \/>\nmcr\u00a0\u00a0\u00a0\u00a0 p15, 0, r0, c1, c0, 0<\/p>\n<p>mcr\u00a0\u00a0\u00a0\u00a0 p15, 0, r0, c8, c7, 0\u00a0\u00a0\u00a0\u00a0 \/* flush v4 TLB *\/<\/p>\n<p>mov\u00a0\u00a0\u00a0\u00a0 r0, #0<br \/>\nmov\u00a0\u00a0\u00a0\u00a0 pc, r9<br \/>\n#endif<br \/>\n\/*<br \/>\n*************************************************************************<br \/>\n*<br \/>\n* Interrupt handling<br \/>\n*<br \/>\n*************************************************************************<br \/>\n*\/<br \/>\n@<br \/>\n@ IRQ stack frame.<br \/>\n@<br \/>\n#define S_FRAME_SIZE\u00a0\u00a0\u00a0\u00a0 72 \u00a0 @\u6240\u6709\u5bc4\u5b58\u5668\u52a0\u8d77\u676572\u5b57\u8282\u3002\u4e0b\u9762\u662f\u8c03\u7528c\u51fd\u6570\u524d\u7684\u6808\u7ed3\u6784\uff0c\u6700\u540e\u7528r0\u4f5c\u4e3a\u6307\u9488\u4f20\u8fd9\u4e2a\u6808\u7684\u5185\u5b58\u5730\u5740\u5230c\u51fd\u6570\u3002<\/p>\n<\/div>\n<div>#define S_OLD_R0\u00a0\u00a0\u00a0\u00a0 68<br \/>\n#define S_PSR\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 64 \u00a0@r16\u4e3aCPSR<br \/>\n#define S_PC\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 60 \u00a0 \u00a0@r15\u4e3aPC\uff0c\u6307\u4ee4\u6307\u9488\u3002<br \/>\n#define S_LR\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 56 \u00a0 \u00a0@r14\u4e3alr\uff0c\u4fdd\u5b58c\u51fd\u6570\u8fd4\u56de\u5730\u5740\u3002<br \/>\n#define S_SP\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 52 \u00a0 \u00a0@r13\u4e3a\u6808\u6307\u9488\u3002#define S_IP\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 48 \u00a0 \u00a0 @r12\u4e3aIP\uff0cc\u51fd\u6570\u5185\u90e8\u6682\u5b58\u5bc4\u5b58\u5668\u3002<br \/>\n#define S_FP\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 44 \u00a0 \u00a0@r11\u4e3aFP\uff0cc\u91cc\u9762\u7684\u5e27\u6307\u9488\uff0c\u6bcf\u4e2a\u51fd\u6570\u8fdb\u5165\u65f6\u9ed8\u8ba4\u5fc5\u987b0\u3002<br \/>\n#define S_R10\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 40<br \/>\n#define S_R9\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 36<br \/>\n#define S_R8\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 32<br \/>\n#define S_R7\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 28<br \/>\n#define S_R6\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 24<br \/>\n#define S_R5\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 20<br \/>\n#define S_R4\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 16<br \/>\n#define S_R3\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 12<br \/>\n#define S_R2\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 8<br \/>\n#define S_R1\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 4<br \/>\n#define S_R0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0<\/p>\n<p>#define MODE_SVC 0x13 \u00a0@\u4fdd\u62a4\u6a21\u5f0f<br \/>\n#define I_BIT\u00a0\u00a0\u00a0\u00a0 0x80<\/p>\n<p>\/*<br \/>\n* use bad_save_user_regs for abort\/prefetch\/undef\/swi &#8230;<br \/>\n* use irq_save_user_regs \/ irq_restore_user_regs for IRQ\/FIQ handling<br \/>\n*\/<\/p>\n<p>.macro\u00a0\u00a0\u00a0\u00a0 bad_save_user_regs \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u4fdd\u5b58\u5bc4\u5b58\u5668\u503c\uff0c\u7528\u5728abort\/prefetch\/undef\/swi\u7b49\u4e2d\u65ad\u91cc\u9762\u3002<br \/>\nsub\u00a0\u00a0\u00a0\u00a0 sp, sp, #S_FRAME_SIZE\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ carve out a frame on current user stack\uff0c\u5806\u6808\u6307\u9488sp(\u53c2\u8003\u4e0b\u9762get_bad_stack\u91cc\u9762\u7684\u4fdd\u62a4\u6a21\u5f0f\u5806\u6808)\u5f80\u4e0b\u632a72\u5b57\u8282<\/p>\n<\/div>\n<div>\n<p>\u00a0\u00a0\u00a0\u00a0 stmia\u00a0\u00a0\u00a0\u00a0 sp, {r0 &#8211; r12}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ Save user registers (now in svc mode) r0-r12\uff0c\u4ecesp\u5f80\u4e0a\u4f9d\u6b21\u4fdd\u5b58r0~r12<\/p>\n<p>ldr\u00a0\u00a0\u00a0\u00a0 r2, _armboot_start<br \/>\nsub\u00a0\u00a0\u00a0\u00a0 r2, r2, #(CFG_MALLOC_LEN)<br \/>\nsub\u00a0\u00a0\u00a0\u00a0 r2, r2, #(CFG_GBL_DATA_SIZE+8)\u00a0\u00a0\u00a0\u00a0 @ set base 2 words into abort stack<br \/>\nldmia\u00a0\u00a0\u00a0\u00a0 r2, {r2 &#8211; r3}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ get values for &#8220;aborted&#8221; pc and cpsr (into parm regs)\uff0c\u53c2\u8003\u4e0b\u9762get_bad_stack\u91cc\u9762\u7684\u4fdd\u62a4\u6a21\u5f0f\u5806\u6808\u77e5\u9053\uff0c\u8fd9\u91cc\u5b58\u653e\u4e86\u4e2d\u65ad\u524d\u7684pc\u548ccpsr\u503c\uff0c\u6240\u4ee5\u8fd9\u91ccr2=pc, r3=cpsr<br \/>\nadd\u00a0\u00a0\u00a0\u00a0 r0, sp, #S_FRAME_SIZE\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ grab pointer to old stack\uff0c\u8fd9\u91ccr0\u5c31\u662f\u51cf72\u5b57\u8282\u4e4b\u524d\u7684\u6808\u4f4d\u7f6e\u3002<\/p>\n<p>add\u00a0\u00a0\u00a0\u00a0 r5, sp, #S_SP \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@r5\u4e3asp\u52a052\u5b57\u8282\uff0c\u5c31\u662f\u521a\u624d\u5b58\u653er0\uff5er12\u7684\u4e0a\u9762\u3002<\/p>\n<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0 mov\u00a0\u00a0\u00a0\u00a0 r1, lr \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @r1\u4fdd\u5b58lr<br \/>\nstmia\u00a0\u00a0\u00a0\u00a0 r5, {r0 &#8211; r3}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ save sp_SVC, lr_SVC, pc, cpsr\uff0c\u8fd9\u91cc\u4fdd\u5b58\u7684\u5c31\u662f\u8001\u7684\u4fdd\u62a4\u6a21\u5f0f\u6808\u4f4d\u7f6e\uff0c\u4fdd\u62a4\u6a21\u5f0flr\uff0c\u4e2d\u65ad\u524d\u7684pc\uff0c\u4e2d\u65ad\u524d\u7684cpsr<br \/>\nmov\u00a0\u00a0\u00a0\u00a0 r0, sp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ save current stack into r0 (param register)\uff0cr0\u5b58\u653e\u6808\u6307\u9488(\u4f5c\u4e3ac\u51fd\u6570\u7684\u53c2\u6570\u6307\u9488\u4f20\u5165c\u51fd\u6570\u4f7f\u7528)\u3002\u73b0\u5728\u6808\u7684\u5185\u5bb9\u4ecesp\u5f80\u4e0a\u4f9d\u6b21\u662f\u4e2d\u65ad\u524dr0~r12,\u00a0\u4e2d\u65ad\u540e\u7684sp_svr,\u00a0\u4e2d\u65ad\u540e\u7684lr_svr,\u00a0\u4e2d\u65ad\u524dpc,\u00a0\u4e2d\u65ad\u524dcpsr\u3002<\/div>\n<div>\n<p>\u00a0\u00a0\u00a0\u00a0 .endm<\/p>\n<p>.macro\u00a0\u00a0\u00a0\u00a0 irq_save_user_regs \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u4fdd\u5b58IRQ\/FIQ\u4e2d\u65ad\u7684\u5bc4\u5b58\u5668\u3002<br \/>\nsub\u00a0\u00a0\u00a0\u00a0 sp, sp, #S_FRAME_SIZE \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @\u6808\u6307\u9488\u51cf\u638972\u5b57\u8282\uff0c\u7528\u6765\u4fdd\u5b58\u5bc4\u5b58\u5668\u503c<br \/>\nstmia\u00a0\u00a0\u00a0\u00a0 sp, {r0 &#8211; r12}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ Calling r0-r12 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u4fdd\u5b58r0~r12\uff0cstmia\u662f\u5148\u538b\u5165\u7b2c\u4e00\u4e2a\u5bc4\u5b58\u5668\uff0c\u518d\u5730\u5740\u52a0\uff0c\u7136\u540e\u518d\u538b\u5165\u7b2c\u4e8c\u4e2a\u5bc4\u5b58\u5668\uff0c\u5730\u5740\u518d\u52a0\u3002<br \/>\nadd\u00a0\u00a0\u00a0\u00a0 r8, sp, #S_PC\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ !!!! R8 NEEDS to be saved !!!! a reserved stack spot would be good. \u00a0@r8\u6307\u5411\u6808\u6307\u9488\u5f80\u4e0a60\u5b57\u8282\u5904<br \/>\nstmdb\u00a0\u00a0\u00a0\u00a0 r8, {sp, lr}^\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ Calling SP, LR \u00a0 \u00a0 \u00a0 \u00a0 @\u4fdd\u5b58\u7528\u6237\u6a21\u5f0f\u7684sp\uff0clr\uff0c\u5c31\u662f\u4e2d\u65ad\u524d\u7684sp\uff0clr\uff0c\u8fd8\u6709\uff0cstmdb\u662f\u5148\u5730\u5740\u51cf\uff0c\u518d\u538b\u5165\u6700\u540e\u4e00\u4e2a\u5bc4\u5b58\u5668\uff0c\u7136\u540e\u5730\u5740\u518d\u51cf\uff0c\u518d\u538b\u5165\u5012\u6570\u7b2c\u4e8c\u4e2a\u5bc4\u5b58\u5668\u3002<br \/>\nstr\u00a0\u00a0\u00a0\u00a0 lr, [r8, #0]\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ Save calling PC \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u4fdd\u5b58\u4e2d\u65ad\u524d\u7684pc<br \/>\nmrs\u00a0\u00a0\u00a0\u00a0 r6, spsr<br \/>\nstr\u00a0\u00a0\u00a0\u00a0 r6, [r8, #4]\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ Save CPSR \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @\u4fdd\u5b58spsr\uff0c\u5c31\u662f\u4e2d\u65ad\u524d\u7684cpsr<br \/>\nstr\u00a0\u00a0\u00a0\u00a0 r0, [r8, #8]\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ Save OLD_R0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u4fdd\u5b58r0<br \/>\nmov\u00a0\u00a0\u00a0\u00a0 r0, sp \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @r0\u8bbe\u7f6esp\uff0c\u8fd9\u65f6\u6808\u4ecesp\u5f80\u4e0a\u4f9d\u6b21\u662f\u4e2d\u65ad\u524dr0~r12,\u00a0\u4e2d\u65ad\u524d\u7684sp,\u00a0\u4e2d\u65ad\u524d\u7684lr,\u00a0\u4e2d\u65ad\u524dpc,\u00a0\u4e2d\u65ad\u524dcpsr,\u4e2d\u65ad\u524dr0<\/p>\n<\/div>\n<div>\n<p>\u00a0\u00a0\u00a0\u00a0 .endm<\/p>\n<p>.macro\u00a0\u00a0\u00a0\u00a0 irq_restore_user_regs<br \/>\nldmia\u00a0\u00a0\u00a0\u00a0 sp, {r0 &#8211; lr}^\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ Calling r0 &#8211; lr \u00a0 \u00a0@\u6062\u590d\u4e2d\u65ad\u524dr0~r12, \u4e2d\u65ad\u540e\u7684sp,\u4e2d\u65ad\u540e\u7684lr<\/p>\n<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0 mov\u00a0\u00a0\u00a0\u00a0 r0, r0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @\u76f8\u5f53\u4e8enop\uff0c\u5ef6\u65f6<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 lr, [sp, #S_PC]\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ Get PC \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @\u6062\u590d\u4e2d\u65ad\u524d\u7684pc\u5230lr<br \/>\nadd\u00a0\u00a0\u00a0\u00a0 sp, sp, #S_FRAME_SIZE \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u6062\u590d\u4e2d\u65ad\u524d\u7684sp<br \/>\nsubs\u00a0\u00a0\u00a0\u00a0 pc, lr, #4\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ return &amp; move spsr_svc into cpsr @\u8fd4\u56de\u4e2d\u65ad\u7684\u7a0b\u5e8f\uff0c\u5e76\u4e14\u6062\u590dspsr\u5230cpsr<br \/>\n.endm.macro get_bad_stack<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 r13, _armboot_start\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ setup our mode stack (enter in banked mode) \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @\u8bbe\u7f6e\u5230_armboot_start\u5373_start\u94fe\u63a5\u5730\u5740\u4f4d\u7f6e\uff0c\u4e5f\u5c31\u662f0xc7e00000\u3002\u53c2\u8003\u4e0a\u9762\u7684\u6808\u8bbe\u7f6e\u66f4\u597d\u7406\u89e3\u3002\u8fd9\u91cc\u4e5f\u5c31\u8bbe\u7f6e\u4e86\u4fdd\u62a4\u6a21\u5f0f\u7684\u6808sp\u5730\u5740\u3002<\/p>\n<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0 sub\u00a0\u00a0\u00a0\u00a0 r13, r13, #(CFG_MALLOC_LEN)\u00a0\u00a0\u00a0\u00a0 @ move past malloc pool \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @\u4fdd\u75591MB\u7684malloc()\u7528<br \/>\nsub\u00a0\u00a0\u00a0\u00a0 r13, r13, #(CFG_GBL_DATA_SIZE+8) @ move to reserved a couple spots for abort stack @\u4fdd\u7559128KB\u7684\u5168\u5c40\u6570\u636e\uff0c\u4fdd\u75598\u5b57\u8282\u6765\u4fdd\u5b58\u63a5\u4e0b\u6765\u7684\u4e24\u4e2a4\u5b57\u8282\u3002str\u00a0\u00a0\u00a0\u00a0 lr, [r13]\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ save caller lr in position 0 of saved stack \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @\u4fdd\u5b58lr\uff0c\u5c31\u662f\u4e2d\u65ad\u4e4b\u524d\u7684pc+4\u6216pc+8\u503c\u3002<br \/>\nmrs\u00a0\u00a0\u00a0\u00a0 lr, spsr\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ get the spsr<br \/>\nstr\u00a0\u00a0\u00a0\u00a0 lr, [r13, #4]\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ save spsr in position 1 of saved stack \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u4fdd\u5b58spsr\uff0c\u5c31\u662f\u4e2d\u65ad\u4e4b\u524d\u7684cpsr\u503c\u3002\u8fd9\u65f6\u4fdd\u62a4\u6a21\u5f0fsp\u5c31\u662fr13\u7684\u503c\u4e3a_armboot_start &#8211;\u00a0CFG_MALLOC_LEN &#8211; (CFG_GBL_DATA_SIZE+8) &#8211; 4(\u5b58\u653e\u4e2d\u65ad\u524d\u7684pc\u503c) &#8211; 4(\u5b58\u653e\u4e2d\u65ad\u524d\u7684cpsr\u503c)<\/p>\n<\/div>\n<div>mov\u00a0\u00a0\u00a0\u00a0 r13, #MODE_SVC\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ prepare SVC-Mode<br \/>\n@ msr\u00a0\u00a0\u00a0\u00a0 spsr_c, r13<br \/>\nmsr\u00a0\u00a0\u00a0\u00a0 spsr, r13\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ switch modes, make sure moves will execute \u00a0 \u00a0 \u00a0 \u00a0 @\u5148\u628aspsr\u8bbe\u7f6e\u4e3a\u7ba1\u7406\u6a21\u5f0f<br \/>\nmov\u00a0\u00a0\u00a0\u00a0 lr, pc\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ capture return pc \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @\u56e0\u4e3a\u8fd9\u6761\u6307\u4ee4\u7684PC\u503c\u662f\u6307\u5411\u5b83\u540e\u9762\u7684\u7b2c\u4e8c\u6761\u6307\u4ee4\uff08\u5c31\u662fmovs pc,lr\u7684\u4e0b\u4e00\u6761\uff09\uff0c\u6240\u4ee5pc\u5148\u4f20\u5230lr\uff0c\u518d\u4ecelr\u4f20\u5230pc\u65f6\uff0c\u521a\u597d\u8df3\u8f6c\u5230movs pc,lr\u7684\u4e0b\u4e00\u6761\u6307\u4ee4\u3002<br \/>\nmovs\u00a0\u00a0\u00a0\u00a0 pc, lr\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ jump to next instruction &amp; switch modes. \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u56e0\u4e3a\u7528\u7684\u662fmovs\u5e26S\u7684\u6307\u4ee4\uff0c\u4f1a\u81ea\u52a8\u628aspsr\u7684\u503c\u5bfc\u5165cpsr\uff0c\u4ece\u800c\u5b9e\u73b0\u5230\u7ba1\u7406\u6a21\u5f0f\u7684\u5207\u6362\u3002<br \/>\n.endm.macro get_bad_stack_swi<br \/>\nsub\u00a0\u00a0\u00a0\u00a0 r13, r13, #4\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ space on current stack for scratch reg. \u00a0 \u00a0 \u00a0 @\u8bbe\u7f6e\u6808\u6307\u9488\u4e3a\u5f53\u524d\u6808\uff0c\u5148\u51cf4\u5b57\u8282\uff0c\u4e3a\u4e86\u4fdd\u5b58\u4e0b\u9762\u7684r0<br \/>\nstr\u00a0\u00a0\u00a0\u00a0 r0, [r13]\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ save R0&#8217;s value. \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u4fdd\u5b58r0<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 r0, _armboot_start\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ get data regions start \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u4ece_armboot_start\u5f80\u4e0b\u4fdd\u7559\u6570\u636e<br \/>\nsub\u00a0\u00a0\u00a0\u00a0 r0, r0, #(CFG_MALLOC_LEN)\u00a0\u00a0\u00a0\u00a0 @ move past malloc pool<br \/>\nsub\u00a0\u00a0\u00a0\u00a0 r0, r0, #(CFG_GBL_DATA_SIZE+8)\u00a0\u00a0\u00a0\u00a0 @ move past gbl and a couple spots for abort stack @\u6700\u540e\u76848\u5b57\u8282\u7528\u6765\u4fdd\u5b58\u4e0b\u9762\u7684\u4e24\u4e2a4\u5b57\u8282\u3002<br \/>\nstr\u00a0\u00a0\u00a0\u00a0 lr, [r0]\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ save caller lr in position 0 of saved stack \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u4fdd\u5b58lr\uff0c\u5c31\u662f\u4e2d\u65ad\u4e4b\u524d\u7684pc+4\u6216pc+8\u503c\u3002<br \/>\nmrs\u00a0\u00a0\u00a0\u00a0 r0, spsr\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ get the spsr<br \/>\nstr\u00a0\u00a0\u00a0\u00a0 lr, [r0, #4]\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ save spsr in position 1 of saved stack \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u4fdd\u5b58spsr\uff0c\u5c31\u662f\u4e2d\u65ad\u4e4b\u524d\u7684cpsr\u503c\u3002<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 r0, [r13]\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ restore r0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u6062\u590d\u8fdb\u5165\u524d\u7684r0<br \/>\nadd\u00a0\u00a0\u00a0\u00a0 r13, r13, #4\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ pop stack entry \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u6062\u590d\u6808\u4f4d\u7f6e\u3002<br \/>\n.endm<\/p>\n<p>.macro get_irq_stack\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ setup IRQ stack<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 sp, IRQ_STACK_START \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u8bbe\u7f6e\u6808\u6307\u9488\uff0c\u5728\u4e0a\u9762\u5b9a\u4e49\u8fd9\u4e2a\u53d8\u91cf\uff0c\u5b9e\u9645\u8ba1\u7b97\u5728Cpu.c\u91cc\u9762\uff0c\u4e3a_armboot_start &#8211; CFG_MALLOC_LEN &#8211; CFG_GBL_DATA_SIZE &#8211; 4<br \/>\n.endm<\/p>\n<p>.macro get_fiq_stack\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ setup FIQ stack<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 sp, FIQ_STACK_START \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u8bbe\u7f6e\u6808\u6307\u9488\uff0c\u5728\u4e0a\u9762\u5b9a\u4e49\u8fd9\u4e2a\u53d8\u91cf\uff0c\u5b9e\u9645\u8ba1\u7b97\u5728Cpu.c\u91cc\u9762\uff0c\u4e3aIRQ_STACK_START &#8211; CONFIG_STACKSIZE_IRQ<br \/>\n.endm<\/p>\n<p>\/*<br \/>\n* exception handlers<br \/>\n*\/<br \/>\n.align\u00a0\u00a0\u00a0\u00a0 5 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @\u5f02\u5e38\u5904\u740632\u5b57\u8282\u5bf9\u9f50<br \/>\nundefined_instruction: \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @\u672a\u5b9a\u4e49\u6307\u4ee4 \u5f02\u5e38<br \/>\nget_bad_stack \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @\u5f97\u5230\u6808<br \/>\nbad_save_user_regs \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u4fdd\u5b58\u5bc4\u5b58\u5668\u503c\u5230\u6808\u4f5c\u4e3a\u4f20\u5165c\u5904\u7406\u51fd\u6570\u7684\u6307\u9488\u53c2\u6570\u6240\u5bf9\u5e94\u7684\u5185\u5b58\u4f4d\u7f6e\u3002<br \/>\nbl\u00a0\u00a0\u00a0\u00a0 do_undefined_instruction \u00a0 \u00a0 \u00a0 \u00a0@\u8df3\u5230c\u51fd\u6570\u6267\u884c\uff0c<b><span style=\"color: #2d4fc9;\">\u5b9a\u4e49\u5728Interrupts.c\u6587\u4ef6\u4e2d\u3002<\/span><\/b><\/p>\n<p>.align\u00a0\u00a0\u00a0\u00a0 5<br \/>\nsoftware_interrupt:<br \/>\nget_bad_stack_swi \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u5f97\u5230\u6808<br \/>\nbad_save_user_regs \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 @\u4fdd\u5b58\u5bc4\u5b58\u5668\u503c<br \/>\nbl\u00a0\u00a0\u00a0\u00a0 do_software_interrupt \u00a0 \u00a0 \u00a0 \u00a0\u00a0@\u8df3\u5230c\u51fd\u6570\u6267\u884c\uff0c<b><span style=\"color: #2d4fc9;\">\u5b9a\u4e49\u5728Interrupts.c\u6587\u4ef6\u4e2d\u3002<\/span><\/b><\/p>\n<p>.align\u00a0\u00a0\u00a0\u00a0 5<br \/>\nprefetch_abort:<br \/>\nget_bad_stack<br \/>\nbad_save_user_regs<br \/>\nbl\u00a0\u00a0\u00a0\u00a0 do_prefetch_abort \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0@\u8df3\u5230c\u51fd\u6570\u6267\u884c\uff0c<b><span style=\"color: #2d4fc9;\">\u5b9a\u4e49\u5728Interrupts.c\u6587\u4ef6\u4e2d\u3002<\/span><\/b><\/p>\n<p>.align\u00a0\u00a0\u00a0\u00a0 5<br \/>\ndata_abort:<br \/>\nget_bad_stack<br \/>\nbad_save_user_regs<br \/>\nbl\u00a0\u00a0\u00a0\u00a0 do_data_abort \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u8df3\u5230c\u51fd\u6570\u6267\u884c\uff0c<b><span style=\"color: #2d4fc9;\">\u5b9a\u4e49\u5728Interrupts.c\u6587\u4ef6\u4e2d\u3002<\/span><\/b><\/p>\n<p>.align\u00a0\u00a0\u00a0\u00a0 5<br \/>\nnot_used:<br \/>\nget_bad_stack<br \/>\nbad_save_user_regs<br \/>\nbl\u00a0\u00a0\u00a0\u00a0 do_not_used \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u8df3\u5230c\u51fd\u6570\u6267\u884c\uff0c<b><span style=\"color: #2d4fc9;\">\u5b9a\u4e49\u5728Interrupts.c\u6587\u4ef6\u4e2d\u3002<\/span><\/b><\/p>\n<p>#ifdef CONFIG_USE_IRQ<\/p>\n<p>.align\u00a0\u00a0\u00a0\u00a0 5<br \/>\nirq:<br \/>\nget_irq_stack<br \/>\nirq_save_user_regs<br \/>\nbl\u00a0\u00a0\u00a0\u00a0 do_irq \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\u00a0@\u8df3\u5230c\u51fd\u6570\u6267\u884c\uff0c<b><span style=\"color: #2d4fc9;\">\u5b9a\u4e49\u5728Interrupts.c\u6587\u4ef6\u4e2d\u3002<\/span><\/b><br \/>\nirq_restore_user_regs \u00a0 \u00a0@\u6062\u590d\u5bc4\u5b58\u5668\u503c<\/p>\n<p>.align\u00a0\u00a0\u00a0\u00a0 5<br \/>\nfiq:<br \/>\nget_fiq_stack<br \/>\n\/* someone ought to write a more effiction fiq_save_user_regs *\/<br \/>\nirq_save_user_regs<br \/>\nbl\u00a0\u00a0\u00a0\u00a0 do_fiq \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0@\u8df3\u5230c\u51fd\u6570\u6267\u884c\uff0c<b><span style=\"color: #2d4fc9;\">\u5b9a\u4e49\u5728Interrupts.c\u6587\u4ef6\u4e2d\u3002<\/span><\/b><br \/>\nirq_restore_user_regs<\/p>\n<p>#else<\/p>\n<p>.align\u00a0\u00a0\u00a0\u00a0 5<br \/>\nirq:<br \/>\nget_bad_stack<br \/>\nbad_save_user_regs<br \/>\nbl\u00a0\u00a0\u00a0\u00a0 do_irq<\/p>\n<p>.align\u00a0\u00a0\u00a0\u00a0 5<br \/>\nfiq:<br \/>\nget_bad_stack<br \/>\nbad_save_user_regs<br \/>\nbl\u00a0\u00a0\u00a0\u00a0 do_fiq<\/p>\n<p>#endif<br \/>\n.align 5<br \/>\n.global arm1136_cache_flush<br \/>\narm1136_cache_flush:<br \/>\nmcr\u00a0\u00a0\u00a0\u00a0 p15, 0, r1, c7, c5, 0\u00a0\u00a0\u00a0\u00a0 @ invalidate I cache<br \/>\nmov\u00a0\u00a0\u00a0\u00a0 pc, lr\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 @ back to caller<\/p>\n<p>#if defined(CONFIG_INTEGRATOR) &amp;&amp; defined(CONFIG_ARCH_CINTEGRATOR)<br \/>\n\/* Use the IntegratorCP function from board\/integratorcp\/platform.S *\/<br \/>\n#elif defined(CONFIG_S3C64XX)<br \/>\n\/* For future usage of S3C64XX*\/<br \/>\n#else<br \/>\n.align\u00a0\u00a0\u00a0\u00a0 5<br \/>\n.globl reset_cpu<br \/>\nreset_cpu:<br \/>\nldr\u00a0\u00a0\u00a0\u00a0 r1, rstctl\u00a0\u00a0\u00a0\u00a0 \/* get addr for global reset reg *\/<br \/>\nmov\u00a0\u00a0\u00a0\u00a0 r3, #0x2\u00a0\u00a0\u00a0\u00a0 \/* full reset pll+mpu *\/<br \/>\nstr\u00a0\u00a0\u00a0\u00a0 r3, [r1]\u00a0\u00a0\u00a0\u00a0 \/* force reset *\/<br \/>\nmov\u00a0\u00a0\u00a0\u00a0 r0, r0<br \/>\n_loop_forever:<br \/>\nb\u00a0\u00a0\u00a0\u00a0 _loop_forever<br \/>\nrstctl:<br \/>\n.word\u00a0\u00a0\u00a0\u00a0 PM_RSTCTRL_WKUP<\/p>\n<p>#endif<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>#include &lt;config.h&gt; #include &lt;version.h&gt; #i &hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[48,231,230,49],"class_list":["post-287","post","type-post","status-publish","format-standard","hentry","category-6","tag-mini6410","tag-mmu","tag-start-s","tag-uboot"],"views":1654,"_links":{"self":[{"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/287","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=287"}],"version-history":[{"count":2,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/287\/revisions"}],"predecessor-version":[{"id":289,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/287\/revisions\/289"}],"wp:attachment":[{"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=287"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=287"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=287"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}