【问题标题】:how to switch back to svc mode from hyp mode using ELR_Hyp in armv7如何在 armv7 中使用 ELR_Hyp 从 hyp 模式切换回 svc 模式
【发布时间】:2016-12-15 02:47:17
【问题描述】:

我已经能够使用命令hvc #0 将我的处理器从 svc 模式置于 hyp 模式。我在 HVBAR 上做了一些寄存器读写操作,我想回到主管模式。
我尝试了以下方法:

  1. 在调用 hvc 之前复制 sp 和 lr,然后在注册操作结束后恢复它们。然后跳转到链接寄存器值。

    mov r5,sp;  
    mov r6,lr;  
    bx lr;  
    
  2. 我也尝试过将链接寄存器直接传递给程序计数器的旧方法

    mov pc,lr;  
    
  3. 我尝试从 hyp 模式进行 svc 调用,并希望它将处理器状态更改为主管模式

    svc #0;  
    
  4. 我已经在寄存器操作结束时使用了eret指令,看看会不会有效果。没有任何影响。

但是这些都没有导致处理器改变状态。运行代码后 我的 CPSR 和 SPSR 中的模式仅为非安全管理程序模式。
在进行文献调查后,我知道我必须使用 ELR_Hyp 寄存器,因为我正在使用虚拟化扩展。但是我不明白如何使用 ELR_Hyp 从 Hyp 模式返回到 Supervisor 模式。

【问题讨论】:

  • 相当肯定你需要一个异常返回(不仅仅是一个分支),我认为这是 ARMv7 中的一个显式指令(但我现在没有时间检查)
  • @achoora 你能分享你进入炒作模式的代码吗?我的意思是能够调用“hvc #0”之前的所有准备工作。全网没有它的代码。
  • @Joey 对不起伙计,我理解这个问题,但我写的代码现在是专有的。 arm架构参考手册有你需要的一切。特别是 B1136 页。如果要保留上下文,则必须在从模式返回时处理堆栈。

标签: assembly arm hypervisor


【解决方案1】:

从 Hyp 模式降到 PL1 模式很像从 PL1 模式降到用户模式;这是一个异常返回。唯一的区别是你必须使用特定的eret instruction,而不是movs pc, lr和朋友。

【讨论】:

  • 那么,显然不仅仅是基础知识。 SPSR_hyp 中的模式是什么?可能是您正在处理嵌套异常(例如,您的 svc 仍将处于 Hyp 模式,此时您被卡住了,因为您现在已经覆盖了以前的 ELR/SPSR)。此外,有人在第一时间接听您的hvc 电话这一事实意味着您已经运行了一个虚拟机管理程序,这可能不太高兴它的系统注册状态被弄乱。
  • SPSR_hyp 中的模式也是 NSHyp 即 Hypervisor 模式
  • 好的,从 Hyp 模式返回到 Hyp 模式会保持在 Hyp 模式,这并不奇怪。
  • 是的,那么在这种情况下我将如何返回主管模式?
  • 如果不明显,请将您想要的 CPSR 和 PC 值分别移动到 SPSR 和 ELR 中,然后将eret 移到它们。如果你真的是从 SVC 出来的,并且随后丢失了原始值(与最初启动或上下文切换 VM 不同,当 Hyp 用它想要的任何东西初始化 SVC 时),那么你还有其他问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
  • 2016-05-11
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
相关资源
最近更新 更多