ARM在IRQ处理程序中如何切换到svc模式?

3
以下代码片段摘自Linux v2.6.11,v3.8版本中也有类似的内容。
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”中发生了什么?能否有人帮助我理解这个问题?
2个回答

7

带有“S”后缀和程序计数器作为目标寄存器的movsub指令表示异常返回。

它将SPSR的内容复制到CPSR中,并将源寄存器的值移动到程序计数器中(在这种情况下,是链接寄存器)。

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

ARM参考手册中有更多信息。


0

我在这里回答关于 SPSRCPSR 的问题。

CPSR 是用户/系统模式寄存器,在其他模式下,如 fiqirq 模式中不存在。而 SPSR 存在于 fiqirq 模式中。在模式更改时,CPSR 被复制到 SPSR 中,改变的模式必须使用 SPSR 来对处理器的当前状态进行任何更改。 SPSR 在用户模式下不可用。在非用户模式下所做的任何对 CPSR 的更改都将无效。

CPSR - Current Program Status Register
SPSR - Saved Program Status Register

CPSR在所有模式下都可以访问(部分在用户模式下)。 - Timothy Baldwin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接