UBOOT詳細(xì)解讀_第1頁
UBOOT詳細(xì)解讀_第2頁
UBOOT詳細(xì)解讀_第3頁
UBOOT詳細(xì)解讀_第4頁
UBOOT詳細(xì)解讀_第5頁
已閱讀5頁,還剩22頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、大多數(shù)bootloader 都分為stagel和stage2兩部分,u-boot也不例外。依賴于 CPU體系結(jié)構(gòu)的代碼(如設(shè)備初始化代碼等)通常都放在 stage1 且可以用匯編語言來實(shí)現(xiàn),而 stage2 則通常用C語言來實(shí)現(xiàn),這樣可以實(shí)現(xiàn)復(fù)雜的功能,而且有更好的可讀性和移植性。1 、 Stage1 代碼結(jié)構(gòu)u-boot 的 stage1 代碼通常放在文件中,他用匯編語言寫成,其主要代碼部分如下:(1 )定義入口。由于一個(gè)可執(zhí)行的 Image 必須有一個(gè)入口點(diǎn),并且只能有一個(gè)全局入口, 通常這個(gè)入口放在 RO(MFlash )的 0x0 地址, 因此, 必須通知編譯器以使其知道這個(gè)入口, 該

2、工作可通過修改連接器腳本來完成。(2)設(shè)置異常向量( Exception Vector )。(3)設(shè)置CPU的速度、時(shí)鐘頻率及終端控制寄存器。( 4 )初始化內(nèi)存控制器。(5 )將ROM中的程序復(fù)制到 RAM中。( 6 )初始化堆棧。(7)轉(zhuǎn)到RAM中執(zhí)行,該工作可使用指令I(lǐng)dr pc來完成。2、Stage2 C 語言代碼部分lib_arm/中的start arm boot是C語言開始的函數(shù)也是整個(gè)啟動(dòng)代碼中C語言的主函數(shù),同時(shí)還是整個(gè) u-boot ( armboot )的主函數(shù),該函數(shù)只要完成如下操作:(1)調(diào)用一系列的初始化函數(shù)。( 2)初始化 Flash 設(shè)備。( 3)初始化系統(tǒng)內(nèi)存分

3、配函數(shù)。(4)如果目標(biāo)系統(tǒng)擁有 NAN蠻備,則初始化 NAN蠻備。( 5)如果目標(biāo)系統(tǒng)有顯示設(shè)備,則初始化該類設(shè)備。(6) 初始化相關(guān)網(wǎng)絡(luò)設(shè)備,填寫IP、MAC地址等。(7) 進(jìn)去命令循環(huán)(即整個(gè)boot 的工作循環(huán)) ,接受用戶從串口輸入的命令,然后進(jìn)行相 應(yīng)的工作。3、U-Boot 的啟動(dòng)順序 ( 示例,其他 u-boot 版本類似 ) cpu/arm920t/文件包含處理#include 由頂層的 mkconfig 生成, 其中只包含了一個(gè)文件: configs/.h#include #include /* Jump vector table as in table in 1*/注:AR

4、M微處理器支持字節(jié)(8位)、半字(16位)、字(32位)3種數(shù)據(jù)類型向量跳轉(zhuǎn)表,每條占四個(gè)字節(jié)(一個(gè)字),地址范圍為 0x0000 00000x0000 0020AR體系結(jié)構(gòu)規(guī)定在上電復(fù)位后的起始位置,必須有8條連續(xù)的跳專指令,通過硬件實(shí)現(xiàn)。他們就是異常向量表。ARM在上電復(fù)位后, 巷從0x00000000開始啟動(dòng)的,其實(shí)如果 bootloader 存在,在執(zhí)行下面第一條指令后,就無條件跳轉(zhuǎn)到start_code ,下面一部分并沒 執(zhí)行。設(shè)置異常向量表的作用是識(shí)別bootloader。以后系統(tǒng)每當(dāng)有異常出現(xiàn),貝U CPU會(huì)根據(jù)異常號(hào),從內(nèi)存的0x00000000 處開始查表 做相應(yīng)的處理/*;

5、當(dāng)一個(gè)異常出現(xiàn)以后,ARM會(huì)自動(dòng)執(zhí)行以下幾個(gè)步驟:;1.把下一條指令的地址放到連接寄存器LR(通常是R14).-保存位置;2.將相應(yīng)的 CPSR當(dāng)前程序狀態(tài)寄存器)復(fù)制到SPSR備份的程序狀態(tài)寄存器 )中-保存CPSR3根據(jù)異常類型,強(qiáng)制設(shè)置CPSR的運(yùn)行模式位;4.強(qiáng)制PC(程序計(jì)數(shù)器)從相關(guān)異常向量地址取出下一條指令執(zhí)行,從而跳轉(zhuǎn)到相應(yīng)的異常處理程序中*/.globl _start /* 系統(tǒng)復(fù)位位置 , 整個(gè)程序入口 */_start是GNU匯編器的默認(rèn)入口標(biāo)簽,.globl將_start 聲明為外部程序可訪問的標(biāo)簽,.globl是GNU匚編的保留關(guān)鍵字,前面加點(diǎn)是GNU匚編的語法_st

6、art: b start_code 0x00ARMt電后執(zhí)行的第一條指令,也即復(fù)位向量,跳轉(zhuǎn)到 start_codereset用b,就是因?yàn)閞eset在MMU建立前后都有可能發(fā)生鎭他的異常只有在 MMU建立之后才會(huì)發(fā)生ldr pc, _un defi ned_in structi on /*未定義指令異常 ,0x04*/ldr pc, _prefetch_abort /* 內(nèi)存操作異常 ,0x0c*/ldr pc, _data_abort /* 數(shù)據(jù)異常 ,0x10*/ldr pc, _not_used /* 未適用 ,0x14*/ldr pc, _irq /*慢速中斷異常 ,0x18*/ld

7、r pc, _fiq /*快速中斷異常 ,0x1c*/寸于ARM數(shù)據(jù)從內(nèi)存到 CPU之間的移動(dòng)只能通過 L/S指令,如:ldr rO,Ox為把Ox內(nèi)存中 的數(shù)據(jù)寫到rO中,還有一個(gè)就是ldr偽指令,女如: ldr rO,=Ox為把Ox地址寫到rO中,mov 只能完成寄存器間數(shù)據(jù)的移動(dòng),而且立即數(shù)長(zhǎng)度限制在 8 位_undefined_instruction: .word undefined_instruction_software_interrupt: .word software_interrupt_prefetch_abort: .word prefetch_abort_data_abor

8、t: .word data_abort_not_used: .word not_used_irq: .word irq_fiq: .word fiq.word為GNU ARMC編特有的偽操作,為分配一段字內(nèi)存單元(分配的單元為字對(duì)齊的),可以使用.word把標(biāo)志符作為常量使用。如_fiq:.word fiq即把fiq存入內(nèi)存變量_fiq中, 也即是把 fiq 放到地址 _fiq 中。.balignl 16,Oxdeadbeef.balig nl 是.balig n的變體 .align 偽操作用于表示對(duì)齊方式:通過添加填充字節(jié)使當(dāng)前位置滿足一定的對(duì)齊方式。 .balign 的作用同 .align

9、 。 .align alignment ,fill ,max 其中: alignment 用于指定對(duì)齊方式,可能的取值為 2 的次冪,缺省為4。fill是填充內(nèi)容,缺省用 0填充。max是填充字節(jié)矽最大值,如果填充字節(jié)數(shù)超過 max, 就不進(jìn)行對(duì)齊 , 例如: .align 4 /* 指定對(duì)齊方式為字對(duì)齊 */參考好野人的窩,于關(guān) u-boot 中的 .balignl 16,0xdeadbeef的理解】/* Startup Code (called from the ARM reset exception vector)* do important init only if we dont s

10、tart from memory!* relocate armboot to ram* setup stack* jump to second stage*保存變量的數(shù)據(jù)區(qū),保存一些全局變量,用于BOOT程序從FLASH拷貝到RAM或者其它的使用。還有一些變量的長(zhǎng)度是通過連接腳本里得到, 實(shí)際上由編譯器算出來的_TEXT_BASE:因?yàn)?linux 開始地址是 Ox,我這里是 64M SDRAM所以 TEXT_BASE = 0x33F80000?.word TEXT_BASE /*uboot 映像在 SDRAM中 的重定位地址 */TEXT_BAS在開發(fā)板相關(guān)的目錄中的文檔中定義,他定C了代碼

11、在運(yùn)行時(shí)所在的地址,那么_TEXT_BAS沖保存了這個(gè)地t (這個(gè)TEXT_BAS怎么來的還不清楚).globl _armboot_start_armboot_start:.word _start 用 _start 來初始化 _armboot_start 。(為什么要這么定義一下還不明白)/* * These are defined in the board-specific linker script.*/下面這些是定義在開發(fā)板目錄鏈接腳本中的.globl _bss_start_bss_start:.word _bss_start標(biāo)號(hào)所在的地_bss_start 定義在和開發(fā)板相關(guān)的中, _

12、bss_start 保存的是 _bss_start 址。.globl _bss_end_bss_end:.word _end同上,這樣賦值是因?yàn)榇a所在地址非編譯時(shí)的地址,直接取得該標(biāo)號(hào)對(duì)應(yīng)地址。中斷的堆棧設(shè)置#ifdef CONFIG_USE_IRQ/* IRQ stack memory (calculated at run-time) */.globl IRQ_STACK_STARTIRQ_STACK_START: .word 0x0badc0de/* IRQ stack memory (calculated at run-time) */ .globl FIQ_STACK_STARTFI

13、Q_STACK_START:.word 0x0badc0de#endif/* the actual start code*/復(fù)位后執(zhí)行程序薛正的初始化從這里開始了。其實(shí)在CPU上電以后就是跳到這里執(zhí)行的reset:/* set the cpu to SVC32 mode*/更改處理器模式為管理模式對(duì)狀態(tài)寄存器的修改要按照:讀出- 修改- 寫回的順序來執(zhí)行31 30 29 28 - 7 6 - 4 3 2 1 0 N Z C V I F M4 M3 M2 M1 M0 0 0 0 0 0 User26 模式 0 0 0 0 1 FIQ26 模式 0 0 0 1 0 IRQ26 模式 0 0 0 1

14、 1 SVC26 模式1 0 0 0 0 User 模式1 0 0 0 1 FIQ模式1 0 0 1 0 IRQ 模式1 0 0 1 1 SVC 模式1 0 1 1 1 ABT 模式1 1 0 1 1 UND 模式1 1 1 1 1 SYS 模式mrs r0,cpsr將 cpsr 的值讀到 r0 中bic r0,r0,#0x1f清除 M0M4orr r0,r0,#0xd3禁止 IRQ,FIQ 中斷,并將處理器置于管理模式msr cpsr,r0以下是點(diǎn)燈了,這里應(yīng)該會(huì)牽涉到硬件設(shè)置,移植的時(shí)候應(yīng)該可以不要bl coloured_LED_initbl red_LED_on針對(duì)AT91RM920Q進(jìn)

15、行特殊處理#if defined(CONFIG_AT91RM9200DK) | defined(CONFIG_AT91RM9200EK)/* * relocate exception table*/ ldr r0, =_startldr r1, =0x0mov r2, #16copyex:subs r2, r2, #1sub帶上了 s用來更改進(jìn)位標(biāo)志,對(duì)于sub來說,若發(fā)生借位則C標(biāo)志置0,沒有則為1,這跟 adds 指令相反!要注意。ldr r3, r0, #4str r3, r1, #4bne copyex#endif酚對(duì)S3C2400和S3C2410進(jìn)行特殊處理CONFIG_S3C240

16、0CONFIG_S3C241等定義在include/configs/下不同開發(fā)板的頭文件中#if defined(CONFIG_S3C2400) | defined(CONFIG_S3C2410)/* turn off the watchdog */關(guān)閉看門狗定時(shí)器的自動(dòng)復(fù)位功能并屏蔽所有中斷,上電后看門狗為開,中斷為關(guān)# if defined(CONFIG_S3C2400)# define pWTCON 0x# define INTMSK 0x /* Interupt-Controller base addresses */# define CLKDIVN 0x /* clock divis

17、or register */#else s3c2410 的配置# define pWTCON 0xpWTCO定義為看門狗控制寄存器的地址(S3C2410和S3C2440相同)# define INTMSK 0x4A000008 /* Interupt-Controller base addresses */INTMS定義為主中斷屏蔽寄存器的地址(S3C2410和s3c2440相同)# define INTSUBMSK 0x4A00001CINTSUBMS定義為副中斷屏蔽寄存器的地址(S3C2410和s3c2440相同)# define CLKDIVN 0x4C000014 /* CloCk d

18、iviSor regiSter */CLKDIV定義為時(shí)鐘分頻控制寄存器的地址(S3C2410和s3c2440相同)# endif至此寄存器地址設(shè)置完畢ldr r0, =pWTCONmov r1, #0x0Str r1, r0寸于S3C2440和S3C2410的WTCO寄存器的0控制允許或禁止看門狗定時(shí)器的復(fù)位輸出功 能,設(shè)置為“ 0”禁止復(fù)位功能。/* maSk all IRQS by Setting all bitS in the INTMR - default*/mov r1, #0xffffffffldr r0, =INTMSKStr r1, r0# if defined(CONFIG

19、_S3C2410)ldr r1, =0x3ff 2410 好像應(yīng)該為 7ff 才寸(不理解 uboot 為何是這個(gè)數(shù)字)ldr r0, =INTSUBMSKstr r1, r0 # endif寸于S3C2410的INTMSK寄存器的32位和INTSUBMS寄存器的低11位每一位對(duì)應(yīng)一個(gè)中斷,相應(yīng)位置“1”為不響應(yīng)相應(yīng)的中斷。 對(duì)于S3C2440的INTSUBMSI有 15位可用,所以應(yīng)該為0x7fff 了。/* FCLI:HCLI:PCLI = 1:2:4 */* default FCLI is 120 MHz ! */ldr r0, =CLIDIVNmov r1, #3str r1, r0寸

20、鐘分頻設(shè)置,F(xiàn)CLK為核心提供時(shí)鐘,HCLK為AHB( ARM920T內(nèi)存妙制器,中斷控制器,LCD控制器,DMA和主USB模塊)提供時(shí)鐘,PCLI為APB (看門狗、IIS、I2C、PWM MMCADC UART GPIO RTC SPI)提供時(shí)鐘。分頻數(shù)一般選擇 1: 4: 8,所以 HDIVN=2,PDIVN=1,CLKDIVN=5這里僅僅是配置了分頻寄存器,3納出CLKDIVN的值跟分頻的關(guān)系:0x0 = 1:1:1 , 0x1 = 1:1:2 , 0x2 = 1:2:2 , 0x3 = 1:2:4, 0x4 = 1:4:4, 0x5 = 1:4:8,0x6 = 1:3:3,0x7 =

21、 1:3:6S3C2440勺輸出時(shí)鐘計(jì)算式為:Mpll=(2*m*Fi n)/(p*2S)S3C2410 的輸出時(shí)鐘計(jì)算式為:Mpll=(m*Fi n)/(p*2As)m=M(the value for divider M)+8;p=P(the value for divider P)+2M,P,S 的選擇根據(jù) datasheet 中 PLL VALUE SELECTION TABLE表格進(jìn)行,我的開發(fā)板晶振為,所以輸出頻率選為:的話 M=0x6e,P=3,S=1s3c2440增加了攝像頭,其FCLK、HCLK PCLK的分頻數(shù)還受到CAMDIVN9(默認(rèn)為0),CAMDIVN8 (默認(rèn)為 0

22、)的影響#endif /* CONFIG_S3C2400 | CONFIG_S3C2410 */* we do sys-critical inits only at reboot,* not when booting from ram!*/選擇是否初始化 CPU#ifndef CONFIG_SKIP_LOWLEVEL_INITbl cpu_init_crit妙行CPU初始化,BL完成跳轉(zhuǎn)的同時(shí)會(huì)把后面緊跟的一條指令地址保存到連接寄存器LR(R14)中。以使子程序執(zhí)行完后正常返回。#endif酬試階段的代碼是直接在RAM中運(yùn)行的,而最后需要把這些代碼固化到Flash中,因此U-Boot 需要自己

23、從 Flash 轉(zhuǎn)移到RA中運(yùn)行,這也是重定向的目的所在。通過 adr 指令得到當(dāng)前代碼的地址信息:如果U-boot 是從 RAM 開始運(yùn)行,則從adr,r0,_start 得到的地址信息為r0=_start=_TEXT_BASE=TEXT_BASE=0x33F80000ffl果 U-boot 從 Flash 開始運(yùn)行,即從處 理器對(duì)應(yīng)的地址運(yùn)行,則 r0=0x0000, 這時(shí)將會(huì)執(zhí)行 copy_loop 標(biāo)識(shí)的那段代碼了。 _TEXT_BASE定義在 board/smdk2410/ 中#ifndef CONFIG_SKIP_RELOCATE_UBOOTrelocate: /* relocat

24、e U-Boot to RAM */ adr r0, _start /* r0 - current position of code */ldr r1, _TEXT_BASE /* test if we run from flash or RAM */ cmp r0, r1 /* dont reloc during debug */ beq stack_setupldr r2, _armboot_start_armboot_start 為 _start 地址ldr r3, _bss_start_bss_start 為數(shù)據(jù)段地址sub r2, r3, r2 /* r2 - size of arm

25、boot */add r2, r0, r2 /* r2 - source end address */ copy_loop:ldmia r0!, r3-r10 /* copy from source address r0 */ 從源地址 r0 讀取 8 個(gè)字節(jié)到寄存器 , 每讀一個(gè)就更新一次 r0 地址ldmia:r0 安字節(jié)增長(zhǎng)stmia r1!, r3-r10 /* copy to target address r1 */LDM(STM)于在寄存器所指的一片連續(xù)存儲(chǔ)器和寄存器列表的寄存器間進(jìn)行數(shù)據(jù)移動(dòng),或是進(jìn)行壓棧和出棧操作。格式為:LDM(STM)條件類型基址寄存器 ! ,寄存器列表 仔

26、對(duì)于類型有以下幾種情況:IA 每次傳送后地址加 1,用于移動(dòng)數(shù)據(jù)塊IB 每次傳送前地址加 1,用于移動(dòng)數(shù)據(jù)塊DA 每次傳送后地址減 1,用于移動(dòng)數(shù)據(jù)塊DB 每次傳送前地址減 1,用于移動(dòng)數(shù)據(jù)塊FD 滿遞減堆棧,用于操作堆棧(即先移動(dòng)指針再操作數(shù)據(jù),相當(dāng)于DB)ED 空遞減堆棧,用于操作堆棧(即先操作數(shù)據(jù)再移動(dòng)指針,相當(dāng)于DA)FA 滿遞增堆棧,用于操作堆棧(即先移動(dòng)指針再操作數(shù)據(jù),相當(dāng)于IB )EA 空遞增堆棧,用于操作堆棧(即先操作數(shù)據(jù)再移動(dòng)指針,相當(dāng)于IA )(這里是不是應(yīng)該要涉及到NAND或者NOR的讀寫沒有看出來)cmp r0, r2 /* until source end addre

27、ee r2 */ble copy_loop#endif /* CONFIG_SKIP_RELOCATE_UBOOT */* Set up the stack */初始化堆棧stack_setup:ldr r0, _TEXT_BASE /* upper 128 KiB: relocated uboot */獲取分配區(qū)域起始指針,sub r0, r0, #CONFIG_SYS_MALLOC_LEN /* malloc area */CFG_MALLOC_LEN=128*1024+CFG_ENV_SIZE=128*1024+0x10000=192K用來存儲(chǔ)開發(fā)板sub r0, r0, #CONFIG

28、_SYS_GBL_DATA_SIZE /* bdinfo */CFG_GBL_DATA_SIZE 128-size in bytes reserved for initial data信息#ifdef CONFIG_USE_IRQ這里如果需要使用 IRQ, 還有給 IRQ 保留堆??臻g , 一般不使用 . sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ) #endifsub sp, r0, #12 /* leave 3 words for abort-stack */該部分將未初始化數(shù)據(jù)段 _bss_start_bss_end 中

29、的數(shù)據(jù) 清零clear_bss:ldr r0, _bss_start /* find start of bss segment */ldr r1, _bss_end /* stop here */mov r2, #0x00000000 /* clear */ clbss_l:str r2, r0 /* clear loop. */add r0, r0, #4cmp r0, r1ble clbss_l跳到階段二 C 語言中去ldr pc, _start_armboot_start_armboot: .word start_armbootC語言start_armboot 在 /lib_arm/ 中

30、,到這里因該是第一階段已經(jīng)完成了吧,下面就要去 中執(zhí)行第二階段了吧/* CPU_init_critical registers* setup important registers* setup memory timing*/CP初始化在“ relocate: /* relocate U-Boot to RAM */”之前被調(diào)用#ifndef CONFIG_SKIP_LOWLEVEL_INITcpu_init_crit:/* flush v4 I/D caches*/初始化 CACHESmov r0, #0mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cac

31、he */mcr p15, 0, r0, c8, c7, 0 /* flush v4 TLB */* disable MMU stuff and caches*/關(guān)閉 MMI和 CACHESmrc p15, 0, r0, c1, c0, 0bic r0, r0, #0x00002300 clear bits 13, 9:8 (-V- -RS) bic r0, r0, #0x00000087 clear bits 7, 2:0 (B- -CAM) orr r0, r0, #0x00000002 set bit 2 (A) Align orr r0, r0, #0x00001000 set bit

32、 12 (I) I-Cache mcr p15, 0, r0, c1, c0, 0 對(duì)協(xié)處理器的操作還是看不懂,暫時(shí)先不管吧,有時(shí)間研究一下 部分。/* before relocating, we have to setup RAM timing* because memory timing is board-dependend, you will* find a in your board directory.*/初始化RAM寸鐘,因?yàn)閮?nèi)存是跟開發(fā)板密切相關(guān)的,所以這部分在 mov ip, lr保存LR,以便正常返回,注意前面是通過 BL跳到cpu_init_crit ( ARM9有 37

33、個(gè)寄存器,ARM7有 27 個(gè))37個(gè)寄存器=7個(gè)未分組寄存器(R0R7) + 2X ( 5個(gè)分組寄存器 R14=lr 分組寄存器) + 1(R15=PC) +1(CPSR) + 5(SPSR) 用途和訪問權(quán)限:R(R7:USR(用戶模式)、fiq (快速中斷模式)、irq (中斷模式)、ARM技術(shù)手冊(cè)的協(xié)處理器/ 開發(fā)板目錄 / 中實(shí)現(xiàn)來的。R8R12) +6X 2( R13=SPsvc (超級(jí)用法模式)、abt、undR8R12: R8_usr R12_usr (usr , irq , svc , abt , und)R8_fiq R12_fiq (fiq )R11=fpR12=IP(從反

34、匯編上看,fp和ip 一般用于存放 SP的值)R13R14: R13_usr R14_usr( 每種模式都有自己的寄存器 )SP lr : R13_fiq R14_fiqR13_irq R14_irqR13_svc R14_svcR13_abt R14_abtR13_und R14_undR15(PC):都可以訪問(即 PC的值為當(dāng)前指令的地址值加8個(gè)字節(jié))R16 :( (Current Program Status Register ,當(dāng)前程序狀態(tài)寄存器 ) )SPSR _fiq,SPSR_irq,SPSR_abt,SPSR_und(USR 模式?jīng)]有 )#if defined(CONFIG_

35、AT91RM9200EK)#elsebl lowlevel_init在重定向代碼之前,必須初始化內(nèi)存時(shí)序,因?yàn)橹囟ㄏ驎r(shí)需要將flash 中的代碼復(fù)制到內(nèi)存中 lowlevel_init 在 /board/smdk2410/ 中。#endifmov lr, ip mov pc, lr返回到主程序#endif /* CONFIG_SKIP_LOWLEVEL_INIT */* Interrupt handling*/這段沒有看明白,不過好像跟移植關(guān)系不是很大,先放一放。 IRQ stack frame.#define S_FRAME_SIZE 72#define S_OLD_R0 68#define

36、 S_PSR 64#define S_PC 60#define S_LR 56 #define S_SP 52#define S_IP 48 #define S_FP 44#define S_R10 40#define S_R9 36#define S_R8 32#define S_R7 28#define S_R6 24#define S_R5 20#define S_R4 16#define S_R3 12#define S_R2 8#define S_R1 4#define S_R0 0#define MODE_SVC 0x13#define I_BIT 0x80/* use bad_s

37、ave_user_regs for abort/prefetch/undef/swi .* use irq_save_user_regs / irq_restore_user_regs for IRQ/FIQ handling*/.macro bad_save_user_regssub sp, sp, #S_FRAME_SIZEstmia sp, r0 - r12 Calling r0-r12ldr r2, _armboot_startsub r2, r2, #(CONFIG_STACKSIZE)sub r2, r2, #(CONFIG_SYS_MALLOC_LEN)sub r2, r2, #

38、(CONFIG_SYS_GBL_DATA_SIZE+8) set base 2 words into abort stackldmia r2, r2 - r3 get pc, cpsradd r0, sp, #S_FRAME_SIZE restore sp_SVCadd r5, sp, #S_SPmov r1, lrstmia r5, r0 - r3 save sp_SVC, lr_SVC, pc, cpsrmov r0, sp.endm.macro irq_save_user_regssub sp, sp, #S_FRAME_SIZEstmia sp, r0 - r12 Calling r0

39、-r12add r7, sp, #S_PCstmdb r7, sp, lrA Calli ng SP, LRstr lr, r7, #0 Save calling PCmrs r6, spsrstr r6, r7, #4 Save CPSRstr r0, r7, #8 Save OLD_R0mov r0, sp .endm.macro irq_restore_user_regsIdmia sp, r0 - lrA Calli ng r0 - Irmov r0, r0ldr lr, sp, #S_PC Get PCadd sp, sp, #S_FRAME_SIZEsubs pc, lr, #4 return & move spsr_svc into cpsr.endm.macro get_bad_stackldr r13, _armboot_start setup our mode stacksub r13, r13, #(CONFIG_STACKSIZE)sub r13, r13, #(CONFIG_SYS_MALLOC_L

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論