- 論壇徽章:
- 1
|
本帖最后由 arm-linux-gcc 于 2013-07-19 18:55 編輯
回復(fù) 6# blake326
從irq到svc的切換過程如下:
.macro vector_stub, name, mode, correction=0
.align 5
vector_\name:
.if \correction
sub lr, lr, #\correction
.endif
@
@ Save r0, lr_<exception> (parent PC) and spsr_<exception>
@ (parent CPSR)
@
stmia sp, {r0, lr} @ save r0, lr
mrs lr, spsr
str lr, [sp, #8] @ save spsr
@
@ Prepare for SVC32 mode. IRQs remain disabled.
@
mrs r0, cpsr
eor r0, r0, #(\mode ^ SVC_MODE | PSR_ISETSTATE)
msr spsr_cxsf, r0
以上3句是將spsr中的模式位改為svc,注意這里只是修改了irq的spsr,還未切換狀態(tài)
@
@ the branch table must immediately follow this code
@
and lr, lr, #0x0f 取出spsr中的[M3:M0],這里不用取M4,因?yàn)镸4是表示26位還是32位尋址的,如果只想知道模式的話,取[M3:M0]就夠了
THUMB( adr r0, 1f )
THUMB( ldr lr, [r0, lr, lsl #2] )
mov r0, sp 將irq模式的;刂诽畹絩0,以后在svc_entry中可以通過r0去讀取irq的棧
ARM( ldr lr, [pc, lr, lsl #2] ) 直接將[M3:M0]乘以4再加上pc就可以計(jì)算出入口(因?yàn)橐粋(gè)entry占4個(gè)字節(jié)),結(jié)果為__irq_usr或__irq_svc,具體是usr還是svc要看發(fā)生中斷之前是什么模式
movs pc, lr @ branch to handler in SVC mode 跳進(jìn)入口(__irq_usr或__irq_svc),同時(shí)做模式切換(mov帶了s,就會(huì)給pc賦值的同時(shí)將用spsr去填cpsr)
ENDPROC(vector_\name)
vector_stub irq, IRQ_MODE, 4 宏vector_\name展開,展開之后的結(jié)果,使得上述 ARM(ldr lr,[pc,lr,lsl #2])處的pc值就是下面的.long __irq_usr處的地址
.long __irq_usr @ 0 (USR_26 / USR_32) [M3:M0]為0
.long __irq_invalid @ 1 (FIQ_26 / FIQ_32)
.long __irq_invalid @ 2 (IRQ_26 / IRQ_32)
.long __irq_svc @ 3 (SVC_26 / SVC_32) [M3:M0]為3
.long __irq_invalid @ 4
.long __irq_invalid @ 5
.long __irq_invalid @ 6
.long __irq_invalid @ 7
.long __irq_invalid @ 8
.long __irq_invalid @ 9
.long __irq_invalid @ a
.long __irq_invalid @ b
.long __irq_invalid @ c
.long __irq_invalid @ d
.long __irq_invalid @ e
.long __irq_invalid @ f
其中一些是占位符,這里剛好16個(gè),對(duì)應(yīng)了[M3:M0]的所有可能取值,所以entry的地址就可以用[M3:M0]很快的算出來,之所以弄16個(gè)entry,是因?yàn)閇M3:M0]在各種模式的取值中并不是連續(xù)的
你在svc_entry是看不到模式切換的,因?yàn)樵谶M(jìn)入svc_entry之前就已經(jīng)做了,你可以去直接看irq的棧,可以查看以下數(shù)據(jù)結(jié)構(gòu)
arch/arm/kernel/setup.c,他們分別是irq abt und模式的棧
struct stack {
u32 irq[3];
u32 abt[3];
u32 und[3];
} ____cacheline_aligned;
寫的挺亂的,不知道說清楚沒,向來不善于寫這類東西
|
|