2013-03-21 91 views
3

以下代码片段取自linux v2.6.11。 v3.8中也有类似的东西。ARM如何在IRQ处理程序中切换到svc模式?

mrs  r13, cpsr 
bic  r13, r13, #MODE_MASK 
orr  r13, r13, #MODE_SVC 
msr  spsr_cxsf, r13     @ switch to SVC_32 mode 

and  lr, lr, #15 
ldr  lr, [pc, lr, lsl #2] 
movs pc, lr       @ Changes mode and branches 

请查看以下链接的实际文件: http://lxr.linux.no/linux+v2.6.11/arch/arm/kernel/entry-armv.S

我觉得写入CPSR的模式位可以改变当前的ARM模式。但是如何写入SPSR(而不是CPSR)导致切换到SVC_32模式?

(或)在最后一条指令“movs pc,lr”中发生了什么。有人能帮我理解这一点吗?

回答

6

A movsub带'S'后缀且程序计数器作为其目标寄存器的指令意味着异常返回。

它将SPSR的内容复制到CPSR并将源寄存器的值移入程序计数器(在本例中为链接寄存器)。

在你的例子中,这有效地将模式设置为SVC模式,并一次性从函数返回。

还有更多的信息在这ARM reference manual

+0

非常感谢你......! – YBlore 2013-03-21 11:04:32

1

我回答了SPSR Vs CPSR问题在这里。

CPSRuser/system模式寄存器,并不存在于其他模式,如fiqirq模式。而SPSR存在于fiqirq模式中。在模式更改CPSR被复制到SPSR中,并且更改后的模式必须使用SPSR来更改处理器的当前状态。 SPSR在用户模式下不可用。并且在非用户模式下对CPSR所做的任何更改都不会生效。

CPSR - Current Program Status Register 
SPSR - Saved Program Status Register 
相关问题