當前位置:首頁 > 嵌入式 > 嵌入式軟件
[導(dǎo)讀]異常和中斷處理過程是每個體系結(jié)構(gòu)和OS都要面對的重要問題,本文從硬件角度以及軟件角度來分析PowerPc這個過程,文字水平有限,將就著看。PowerPC定義了十幾種異常,其中常

異常和中斷處理過程是每個體系結(jié)構(gòu)和OS都要面對的重要問題,本文從硬件角度以及軟件角度來分析PowerPc這個過程,文字水平有限,將就著看。

PowerPC定義了十幾種異常,其中常見的如DataTLB miss, Instruction TLB miss, external input....每一個都有固定的地址(ivorn),從物理地址0x100開始.0x500是中斷入口,0xe00是DTLBmiss,0xf00是itlbmiss入口.首先整體了解一下中斷發(fā)生時硬件/軟件處理流程,硬件會做什么,OS軟件要做什么。

PowerPC 中斷的硬件處理流程:(ePAPR第四章)

1. 把正在執(zhí)行的指令序列下一條指令地址保存到中斷寄存器SRR0(Save/RestoreRegiser 0)。

2. 把當前 MSR 的內(nèi)容保存到 SRR1。

3. 把 MSR 某些比特置為 0,如MSR[SPE,WE,EE,PR,FP,FE0,FE1,IS,DS]are 0 by all interrupts.

【注】:PowerPC有兩種執(zhí)行模式,分別為用戶模式(UserMode) 和特權(quán)模式(SupervisorMode), MSR[PR]=0 表示特權(quán)模式。Linux內(nèi)核運行在特權(quán)模式,而普通程序運行在用戶模式。vxWorks全部運行在特權(quán)模式。

1. 在新的 MSR 狀態(tài)下,從中斷向量偏移處開始指令讀取和執(zhí)行。

2. 外部中斷處理結(jié)束時,必須通過 rfi 指令返回。

3. rfi 的執(zhí)行,會把 SRR1 的內(nèi)容恢復(fù)到 MSR, 并從 SRR0 所保存的地址處繼續(xù)執(zhí)行。

PowerPC Linux (軟件)中斷處理程序

異常向量ExternalInput處的處理程序主要分為以下幾個步驟:

1. NORMAL_EXCEPTION_PROLOG宏

建立用戶中斷處理程序的棧幀,并把一些寄存器的值保存在棧幀中,它們在棧幀中布局由structpt_regs 定義。

2. 執(zhí)行 do_IRQ

在irq_enter()函數(shù)中更新preempt_count。 讀MPIC的IACK寄存器,通知MPIC開始處理該中斷,同時獲取MPIC中斷號,映射為軟件中斷號,找到并運行注冊在該軟件中斷號上的用戶中斷處理程序,最后寫MPIC的EOI寄存器,通知MPIC中斷處理結(jié)束。

在irq_exit()中更新preempt_count,調(diào)用invoke_softirq()處理pending的軟中斷。

3. ret_from_except

某些條件滿足時,進行進程調(diào)度和信號處理,最后調(diào)用rfi指令返回。

PowerPC vxWorks(軟件)中斷處理程序

VxWorks的處理流程大體上與linux一樣,只是在代碼實現(xiàn)細節(jié)上存在些區(qū)別。

代碼的調(diào)用路徑:usrInit ->excVecInit ->excVecConnectCommon

代碼實現(xiàn)過程:

把一段機器碼excConnectCode[]拷貝到每個異常vector的入口地址處(excVecConnectCommon里實現(xiàn)),再重新計算異常處理函數(shù)的地址并覆蓋通用處理函數(shù)地址。

[cpp] view plain copyLOCAL INSTR excConnectCode[]=

{

/* data word byte opcode operands */

0x7c7343a6, /* 0 0x00 mtspr SPRG3, p0 */

0x7c6000a6, /* 1 0x04 mfmsr p0 */

0x546303da, /* 2 0x08 rlwinm p0,p0,0,15,13 clear MSR[CE] */

0x7c600124, /* 3 0x0c mtmsr p0 */

0x60000000, /* 4 0x10 nop */

/* If either ofthe above, add 4 words/0x10bytes to following offsets */

0x7c6802a6, /* 1 0x04 mflr p0 */

0x48000001, /* 2(6) 0x08/18 bl xxxEnt */

0x38610000, /* 3 0x0c addi r3, sp, 0 */

0x9421fff0, /* 4 0x10 stwu sp, -FRAMEBASESZ(sp) */

0x48000001, /* 5(9) 0x14/24 bl xxxHandler */

0x38210010, /* 6 0x18 addi sp, sp, FRAMEBASESZ */

0x48000001 /* 7(11) 0x1c/2c bl xxxExit */

};

整個過程中最關(guān)鍵的就是這段機器碼數(shù)組,一共12條指令。

[cpp] view plain copy0x7c7343a6, /* 0 0x00 mtspr SPRG3, p0 */

0x7c6000a6, /* 1 0x04 mfmsr p0 */

0x546303da, /* 2 0x08 rlwinm p0,p0,0,15,13 clear MSR[CE] */

0x7c600124, /* 3 0x0c mtmsr p0 */

0x60000000, /* 4 0x10 nop

首先清MSR[CE],防止在保存中斷context時被CE中斷打斷

[cpp] view plain copy0x7c6802a6, /* 1 0x04 mflr p0 */

0x48000001, /* 2(6) 0x08/18 bl xxxEnt */

0x38610000, /* 3 0x0c addi r3, sp, 0 */

0x9421fff0, /* 4 0x10 stwu sp, -FRAMEBASESZ(sp) */

0x48000001, /* 5(9) 0x14/24 bl xxxHandler */

0x38210010, /* 6 0x18 addi sp, sp, FRAMEBASESZ */

0x48000001 /* 7(11) 0x1c/2c bl xxxExit */

xxxEnt是intEntorexcEnt.

xxxHandler是 excIntHandle or excExcHandle

xxxExit是intExitor excExit.

其中intEnt/intExit,excEnt/excExit是通用中斷/異常入口和出口函數(shù),中斷進前者,異常進后者,主要作用是保存context以及恢復(fù)context,設(shè)置中斷棧,保存易失的寄存器變量。。。。。

excIntHandle/excExcHandle也是通用處理函數(shù),主要作用是打印下異常信息,對于關(guān)鍵異?;蛘咧袛嗟脑挘加凶约簡为毜奶幚砗瘮?shù),會在接下來的初始化過程中逐個把xxxHandler換成專用的處理函數(shù),實現(xiàn)的方法是直接修改機器碼后16bit。

MMU初始化的時候替換excExcHandle為mmuPpcDataTlbMissHandler/mmuPpcInstTlbMissHandler

MPIC初始化的時候會用vxbMpicIntHandler替換excIntHandle來調(diào)用ISR

WD/Timer初始化的時候也會替換成自己的Handler

至此,真正中斷/異常來的時候會執(zhí)行intEnt->vxbMpicIntHandler->intExit

下面的代碼實現(xiàn)是intEnt,可以看看里面都做了哪些事情

[cpp] view plain copy864 /*

865 *ThePowerPC Family doesn't support the notion of an interrupt

866 * stackinhardware. To avoid having to allowspacefor interrupt

867 *handlingin each task stack, this stub switches from the task

868 * stacktothe interrupt stack by changing the value of the SP(R1).

869 * Iftheinterrupt is nested, we don't need to switch stacks but

870 * wedoneed to check for overflow.[!--empirenews.page--]

871 */

893 _PPC_PER_CPU_VALUE_GET(p0,vxIntStackBase)

894 stwu sp, -_PPC_ESF_STK_SIZE(p0) /* carve stack */

895 mr sp, p0 /* switch tointerruptstack */

/*

1251 * The critical status are saved atthisstage. The interrupt should

1252 *beenabled as soon as possible to reduce the interrupt latency.

1253 *However,there is only one mask bit on PowerPC. It is at the

1254 *interruptcontroller level to set mask for each individual

1255 *interrupt.

1256 * Thus,wesave task's register first, then call interrupt controller

1257 *routineto decide if the interrupt should be re-enabled or not.

1258 */

mfspr p0, XER /* load XER to P0 */

1261 stw p0, _PPC_ESF_XER(sp) /* save XER to the stack */

1262

1263 mfspr p0, CTR /* load CTR to P0 */

1264 stw p0, _PPC_ESF_CTR(sp) /* save CTR to the stack */

1265

1266#if (CPU==PPC601)

1267 mfspr p0, MQ /* load MQ to P0 */

1268 stw p0, _PPC_ESF_MQ(sp) /* save MQ to the stack */

1269#endif /*(CPU==PPC601)*/

1270#if (defined(_WRS_CONFIG_PPC_E500))

1271#ifdef _WRS_SPE_SUPPORT

1272 mfspr p0, SPEFSCR /* load SPEFSCR to P0 */

1273 stw p0, _PPC_ESF_SPEFSCR(sp) /* save SPEFSCR to the stack */

1274#endif /*_WRS_SPE_SUPPORT */

1275#endif /*(defined(_WRS_CONFIG_PPC_E500)) */

1276

1277 stw r0, _PPC_ESF_R0(sp) /* save general register 0 */

1278 stw r2, _PPC_ESF_R2(sp) /* save general register 2 */

1279

1280 stw p2, _PPC_ESF_P2(sp) /* save general register 5 */

1281 stw p3, _PPC_ESF_P3(sp) /* save general register 6 */

1282 stw p4, _PPC_ESF_P4(sp) /* save general register 7 */

1283 stw p5, _PPC_ESF_P5(sp) /* save general register 8 */

1284 stw p6, _PPC_ESF_P6(sp) /* save general register 9 */

1285 stw p7, _PPC_ESF_P7(sp) /* save general register 10 */

1286

1287 stw r11,_PPC_ESF_R11(sp) /* savegeneral register 11 */

1288 stw r12, _PPC_ESF_R12(sp) /* save general register 12 */

1289 stw r13, _PPC_ESF_R13(sp) /* save general register 13 */

1290 beqlr+ cr4 /* return to vector unlessstackoverflow */

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉