【问题标题】:How does ARM switch to svc mode in IRQ handler?ARM 如何在 IRQ 处理程序中切换到 svc 模式?
【发布时间】:2013-03-21 09:05:48
【问题描述】:

以下代码sn-p取自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”中是否发生了某些事情。有人可以帮我理解这一点吗?

【问题讨论】:

    标签: linux linux-kernel kernel arm interrupt


    【解决方案1】:

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

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

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

    ARM reference manual 中有更多相关信息。

    【讨论】:

      【解决方案2】:

      我在这里回答SPSRCPSR 的问题。

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

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

      【讨论】:

      • CPSR 在所有模式下都可以访问(部分在用户模式下)。
      猜你喜欢
      • 2012-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-23
      • 1970-01-01
      • 2021-11-13
      • 1970-01-01
      相关资源
      最近更新 更多