HVM的事件模型

来源:互联网 发布:淘宝 盗图 申诉 编辑:程序博客网 时间:2024/05/21 07:32

概述
HVM支持虚拟事件(也称事件)从而在用户模式应用以及访客模式操作系统下转移控件。HVM时间可以由Hexagon处理器的异常或中断来触发

事件模型
事件通过对齐的事件号来制定。当事件发生的时候,HVM将使用事件号作为一个索引代入到向量表中从而决定需要处理的事件句柄。向量表以及句柄可以在访客模式下定义。

在接受事件前,访客操作系统必须通过HVM注册访客事件向量基础值(BEVB)。在HVM中可以通过虚拟指令vmsetvec来实现。

HVM通过保存一个事件相关的信息来对事件进行响应(也称事件记录),然后将控件转移至事件向量。

事件句柄通过虚拟指令vmgetregs以及vmsetregs来访问事件寄存器,同时访客操作系统负责将这些寄存器进行管理。

当一个事件被派遣至句柄时,虚拟处理器的中断将会被失能。只有在句柄执行了虚拟指令vmsetie或句柄通过执行虚拟指令vmrte返回后才能重新使能中断。

当HVM在用户以及访客模式间进行控件转移时,GOSP(访客其他栈指针)的值将于Hexagon中的栈指针R29对换。

如果一个事件处理器导致了额外的事件,由于事件寄存器被覆盖,那么原始的事件记录将会丢失。同样的,从事件返回时,在访客操作系统中的执行虚拟指令vmrte前,事件寄存器将会被重新导入。

事件寄存器

下图给出了四个用于保存HVM事件记录的32位寄存器的定义:
这里写图片描述
Hexagon处理器指令集不会提供直接访问事件寄存器的指令,这些寄存器需要通过虚拟指令vmgetregs以及vmsetregs来访问。

GELR:访客事件连接寄存器
GELR包含了一个32位的虚拟地址值,用于指定虚拟处理器在执行完事件服务后处理器继续运行的地址。

如果访客操作系统希望在用户模式下的处理完毕的时间返回一个不同的地址(如用户级别的上下文切换),那么GELR可以在vmrte执行前进行修改。

GSR:访客状态寄存器
当时间发生时,HVM可为提供虚拟处理器的状态信息,以及事件的本质。

这里写图片描述
GSR字的域

这里写图片描述

GSR域的编码
GOSP:访客其他栈指针
当运行在用户模式下时,该寄存器保存了访客模式的栈指针

如果一个事件在用户模式执行下发生,HVM将交换GOSP与R29的值。因此当事件向量满足时,R29包含了访客模式下的栈指针,而GOSP保存了用户模式下的栈指针。

当虚拟指令vmrte从访客模式切换到用户模式时,HVM将再次交换R29寄存器与GOSP,保存访客模式下的栈指针至GOSP中,保存用户模式下的栈指针至R29寄存器中。

事件类型
下图总结了事件类型的种类

标注:Hexagon架构指定当一个指令包包含多个异常导致的指令时,Slot1异常要先于Slot0异常解决。如果单个指令有多个异常,则根据表中的优先级进行筛选。

事件向量注册
访客模式软件可以为事件注册一个服务向量,通过执行虚拟设备指令vmsetvec,通过一个32位的访客模式虚拟地址。

事件开始执行的地址由以下公式给出:
GEBV + (event_number * 4)

事件句柄的返回
事件句柄通过执行虚拟指令vmrte进行返回。该指令使用存储于事件寄存器中的值来恢复如下状态

 用户/访客模式以及中断使能
 程序计数器
 栈指针

事件管理的的虚拟指令
这里写图片描述

0 0
原创粉丝点击