管理程序调用hvc参数uasage

时间:2016-03-08 16:41:36

标签: arm

如何使用hvc(0)调用参数,我通常看到0,使用?

如果r0不用于传递此参数,那么它是如何传递给hvc处理程序的。

我见过两个虚拟机管理程序向量表的实现,两者都像

.align 5
__hyp_stub_vectors:
__hyp_stub_reset:   W(b)    .
__hyp_stub_und:     W(b)    .
__hyp_stub_svc:     W(b)    .
__hyp_stub_pabort:  W(b)    .
__hyp_stub_dabort:  W(b)    .
__hyp_stub_trap:    W(b)    __hyp_stub_do_trap
__hyp_stub_irq:     W(b)    .
__hyp_stub_fiq:     W(b)    .

e.g。在以下链接

https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/arch/arm/kernel/hyp-stub.S?id=refs/tags/v3.9-rc3#n206

我不明白为什么管理程序陷阱总是位于向量表中的第6个位置。

现在调用hvc(0)切换到HYP模式,将CPSR保存到Hyp_SPSR并分支到hyp向量表。从向量表中将调用__hyp_stub_do_trap例程,该例程位于第6位。

为什么这个陷阱例程将被调用为什么不例行,例如在第四个位置(如果已定义)将被调用?

谢谢, 的Pankaj

1 个答案:

答案 0 :(得分:1)

ARM Aarch32中的异常具有特定的向量地址,具体取决于异常的类型。如上所列,异常可以是复位,未定义指令,系统调用(SVC),预取或数据中止,管理程序陷阱,中断。

这是异常处理程序的工作,用于定义异常发生的原因。如果是由HVC指令或指令或寄存器陷阱引起的管理程序陷阱,则调用相同的处理程序。然后,处理程序可以查看异常综合症(HSR),它将提供有关异常原因的信息。

关于HVC的参数,这不在r0上传递,而是直接在指令的操作码中编码。处理程序可以使用链接寄存器(LR或R14)查找指令并对其进行解码,或使用Syndrome寄存器查找此信息。