首页
社区
课程
招聘
[翻译]Intel手册-VT部分 第27章 VM Entries
2024-4-16 01:24 3307

[翻译]Intel手册-VT部分 第27章 VM Entries

2024-4-16 01:24
3307

目录

27 VM Entries

软件可以使用 VM entry指令 VMLAUNCH 和 VMRESUME 之一进入 VMX non-root operation。 VMLAUNCH 只能与启动状态为清除的 VMCS 一起使用,VMRESUME 只能与启动状态为已启动的 VMCS 一起使用。 VMLAUNCH 应用于 VMCLEAR 之后的第一个 VM entries; VMRESUME 应用于具有相同 VMCS 的后续 VM entries。

每个 VM entries按指示的顺序执行以下步骤:

  1. 执行基本检查以确保 VM entry可以开始(第 27.1 节)。
  2. 检查 VMCS 的控制和host状态区域,以确保它们适合支持 VMX non-root operation,并且 VMCS 已正确配置为支持下一个 VM Exits(第 27.2 节)。
  3. 以下可以并行或以任何顺序执行(第 27.3 节):
    • 检查 VMCS 的guest状态区域,以确保 VM entry完成后,逻辑处理器的状态与 IA-32 和 Intel 64 架构一致。
    • 处理器状态从客户状态区域加载并基于 VMCS 中的控制。
    • 地址范围监控已清除。
  4. MSR 从 VM-entry MSR 加载区域加载(第 27.4 节)。
  5. 如果正在执行 VMLAUNCH,VMCS 的启动状态将设置为“已启动”。
  6. 如果“Intel PT 使用客户物理地址”VM-execution control为 1,则可能会发生跟踪地址预转换(TAPT)(请参见第 26.5.4 节和第 27.5 节)。
  7. 事件可以被注入到guest上下文中(第 27.6 节)。

上述步骤 1-4 执行的检查可能会导致 VM entries失败。此类故障通过以下三种方式之一发生:

  • 第 27.1 节中的某些检查可能会生成普通错误(例如,无效操作码异常)。此类故障正常发货。
  • 第 27.1 节中的一些检查和第 27.2 节中的所有检查导致控制传递到 VM-entry 指令后面的指令。通过设置 RFLAGS.ZF1(如果存在当前 VMCS)或 RFLAGS.CF(如果当前没有 VMCS)来指示失败。如果存在当前VMCS,则指示失败原因的错误号被存储在VM指令错误字段中。有关错误号,请参阅第 31 章。
  • 第 27.3 节和第 27.4 节中的检查导致从 VMCS 的host状态区域加载处理器状态(就像在 VM Exits时所做的那样)。有关故障的信息存储在 VM Exits信息字段中。详细信息请参见第 27.8 节。

仅当第 27.1 节和第 27.2 节中的检查之一失败导致控制权传递给后续指令时,EFLAGS.TF = 1 才会导致 VM entry指令生成单步调试异常。在以下任何情况下,VM-entry 不会生成单步调试异常: (1) 指令生成故障; (2) 第 27.3 节中的检查之一或加载 MSR 失败导致从 VMCS 的host状态区域加载处理器状态; (3) 该指令通过了第 27.1 节、第 27.2 节和第 27.3 节中的所有检查,并且加载 MSR 没有失败。

第 32.15 节描述了系统管理中断(SMI)和系统管理模式(SMM)的双监视器处理。在这种处理下,SMM 中运行的代码使用 VM entries而不是 RSM 指令返回。如果VM条目在SMM中执行并且“进入SMM”VM条目控制为0,则VM条目从SMM返回。从SMM返回的VM条目与普通VM条目的不同之处在第32.15.4节中详细描述。

27.1 基本的VM-Entry 检查

在 VM entry开始之前,按以下顺序检查逻辑处理器的当前状态:

  1. 如果逻辑处理器处于虚拟 8086 模式或兼容模式,则会生成无效操作码异常。

  2. 如果当前特权级别 (CPL) 不为零,则会生成一般保护异常。

  3. 如果当前没有 VMCS,则 RFLAGS.CF 设置为 1,并且控制权传递到下一条指令。

  4. 如果存在当前 VMCS,但当前 VMCS 是影子 VMCS(请参阅第 25.10 节),则 RFLAGS.CF 设置为 1,并且控制传递到下一条指令。

  5. 如果当前 VMCS 不是影子 VMCS,则按顺序评估以下条件;其中任何一个都会导致 VM entry失败:

    • 是否存在MOV-SS阻塞(见表25-3)。

    • 如果 VM entries由 VMLAUNCH 调用并且 VMCS 启动状态不清楚

    • 如果 VM entries由 VMRESUME 调用并且 VMCS 启动状态未启动。

      如果这些检查中的任何一个失败,RFLAGS.ZF 将设置为 1,并且控制权将传递到下一条指令。指示故障原因的错误号被存储在VM指令错误字段中。有关错误号,请参阅第 31 章。

27.2 检查 VMX 控制和host状态区域

如果第 27.1 节中的检查不会导致 VM entry失败,则检查 VMCS 的控制和host状态区域,以确保它们适合支持 VMX non-root operation,并且 VMCS 已正确配置为支持下一个操作。 VM退出,并且在下一次VM退出后,处理器的状态与Intel 64和IA-32架构一致。

如果其中任何一项检查失败,VM entries就会失败。当发生此类故障时,控制权将传递到下一条指令,RFLAGS.ZF 设置为 1 以指示故障,并且 VM 指令错误字段会加载一个错误号,该错误号指示故障是由于控制还是由于东道国区域(参见第 31 章)。

这些检查可以按任何顺序执行。因此,由一种原因(例如host状态)的错误编号指示并不意味着不存在其他错误。因此,不同的处理器可能会针对相同的 VMCS 给出不同的错误号。某些检查会阻止建立当前保留的设置(或设置组合)。未来的处理器可能允许此类设置(或组合),并且可能不执行相应的检查。软件的正确性不应依赖于本节中记录的检查导致的 VM entry失败。

第 27.2.1 节到第 27.2.4 节介绍了对控件和host状态区域的检查。这些部分引用与处理器状态相对应的 VMCS 字段。除非另有说明,这些引用是指东道国区域中的字段。

27.2.1 检查 VMX 控制

本节介绍了 VMX 控制字段上的 VM entry检查。

27.2.1.1 VM-execution control字段

VM entries对 VM-execution control字段执行以下检查:

  • 基于引脚的 VM-execution control中的保留位必须正确设置。软件可以参考 VMX 功能 MSR 来确定正确的设置(参见附录 A.3.1)。

  • 必须正确设置基于主处理器的 VM-execution control中的保留位。软件可以参考 VMX 功能 MSR 来确定正确的设置(参见附录 A.3.2)。

  • 如果“激活辅助控制”基于主处理器的VM执行控制为1,则必须清除基于辅助处理器的VM执行控制中的保留位。软件可以参考 VMX 功能 MSR 来确定保留哪些位(参见附录 A.3.3)。

    如果“激活辅助控制”基于主处理器的 VM-execution control为 0(或者如果处理器不支持该控制的 1 设置),则不会对基于辅助处理器的 VM-execution control执行任何检查。逻辑处理器的运行方式就好像所有基于辅助处理器的 VM-execution control都为 0。

  • 如果“激活第三控制”基于主处理器的VM执行控制为1,则必须清除基于第三处理器的VM执行控制中的保留位。软件可以参考 VMX 功能 MSR 来确定保留哪些位(参见附录 A.3.4)。

    如果“激活第三级控制”基于主处理器的 VM-execution control为 0(或者如果处理器不支持该控制的 1 设置),则不会对基于第三处理器的 VM-execution control执行任何检查。逻辑处理器的运行方式就好像所有基于第三处理器的 VM-execution control都为 0。

  • CR3 目标计数不得大于 4。未来的处理器可能支持不同数量的 CR3 目标值。软件应读取 VMX 功能 MSR IA32_VMX_MISC 以确定支持的值的数量(请参阅附录 A.6)。

  • 如果“使用 I/O 位图”VM-execution control为 1,则每个 I/O 位图地址的位 11:0 必须为 0。两个地址都不应设置超出处理器物理地址宽度的任何位

  • 如果“使用 MSR 位图”VM-execution control为 1,则 MSR 位图地址的位 11:0 必须为 0。该地址不应设置超出处理器物理地址宽度的任何位

  • 如果“使用 TPR 影子”VM-execution control为 1,则虚拟 APIC 地址必须满足以下检查:

    • 地址的位 11:0 必须为 0。
    • 地址不应设置超出处理器物理地址宽度的任何位。4

    如果满足上述所有检查,并且“使用 TPR 影子”VM-execution control为 1,则 VTPR 的字节 3:1(请参阅第 30.1.1 节)可能会被清除(行为可能是特定于实现的)。

    即使 VM entries失败,也可能会清除这些字节。如果故障导致控制传递到 VM entry指令之后的指令,或者如果它导致从 VMCS 的host状态区域加载处理器状态,则这是 true。

  • 如果“使用 TPR 影子”VM-execution control为 1,“虚拟中断传送”VM-execution control为 0,则 TPR 阈值 VM-execution control字段的位 31:4 必须为 0。

  • 如果“使用 TPR 影子”VM-execution control为 1 并且“虚拟化 APIC 访问”和“虚拟中断传送”VM-execution control均为 0,则执行以下检查:TPR 的位 3:0 的值VM-execution control字段阈值不应大于 VTPR 的位 7:4 的值(请参见第 30.1.1 节)。

  • 如果“NMI 退出”VM-execution control为 0,则“虚拟 NMI”VM-execution control必须为 0。

  • 如果“虚拟 NMI”VM-execution control为 0,则“NMI 窗口退出”VM-execution control必须为 0。

  • 如果“虚拟化 APIC 访问”VM-execution control为 1,则 APIC 访问地址必须满足以下检查:

    • 地址的位 11:0 必须为 0
    • 地址不应设置超出处理器物理地址宽度的任何位。
  • 如果“使用 TPR 影子”VM-execution control为 0,则以下 VM-execution control也必须为 0:“虚拟化 x2APIC 模式”、“APIC 寄存器虚拟化”、“虚拟中断传送”和“IPI 虚拟化” 。

  • 如果“虚拟化 x2APIC 模式”VM-execution control为 1,则“虚拟化 APIC 访问”VM-execution control必须为 0。

  • 如果“虚拟中断传递”VM-execution control为 1,则“外部中断退出”VM 执行

    控制必须为1。

  • 如果“进程发布中断”VM-execution control为 1,则以下条件必须为真:

    • “虚拟中断传递”VM-execution control为 1。
    • “退出时确认中断”VM Exits控制为 1
    • 中断后通知向量的值范围为 0–255(位 15:8 均为 0)
    • 中断后描述符地址的位 5:0 均为 0。
    • 后置中断描述符地址不会设置超出处理器物理地址宽度的任何位。
  • 如果“IPI 虚拟化”VM-execution control为 1,则必须满足以下条件:

    • PID 指针表地址的位 2:0 均为 0
    • PID 指针表地址不会设置超出处理器物理地址宽度的任何位。
    • PID 指针表中最后一个条目的地址不会设置超出处理器物理地址宽度的任何位。 (该地址是 PID 指针表地址加上最后一个 PID 指针索引的 8 倍。)
  • 如果“启用 VPID”VM-execution control为 1,则 VPID VM-execution control字段的值不得为 0000H。

  • 如果“启用 EPT”VM-execution control为 1,则 EPTP VM-execution control字段(参见第 25.6.11 节中的表 25-9)必须满足以下检查:

    • EPT 存储器类型(位 2:0)必须是处理器支持的值,如 IA32_VMX_EPT_VPID_CAP MSR 中所示(请参阅附录 A.10)。

    • 位 5:3(比 EPT 页面遍历长度少 1)必须为 3,表示 EPT 页面遍历长度为 4;参见第 29.3.2 节。

    • 如果 IA32_VMX_EPT_VPID_CAP 的位 21,则位 6(EPT 的已访问标志和脏标志的启用位)必须为 0

      MSR(参见附录 A.10)读为 0,表明处理器不支持 EPT 的已访问标志和脏标志。

    • 保留位 11:7 和 63:N(其中 N 是处理器的物理地址宽度)必须全部为 0

  • 如果以下任一 VM-execution control为 1,则“启用 EPT”VM-execution control必须为 1:“启用 PML”、“不受限制的guest”、“EPT 基于模式的执行控制”、“子页面写入权限”对于 EPT,”“英特尔 PT 使用guest物理地址”、“启用 HLAT”、“EPT 分页写入控制”或“guest分页验证”。

  • 如果“启用 PML”VM-execution control为 1,则 PML 地址必须满足以下检查:

    • 地址的位 11:0 必须为 0。
    • 地址不应设置超出处理器物理地址宽度的任何位。
  • 如果“EPT的子页写入权限”VM执行控制为1,则SPPTP VM执行控制字段(参见第25.6.22节中的表25-11)必须满足以下检查:

    • 地址的位 11:0 必须为 0。
    • 地址不应设置超出处理器物理地址宽度的任何位。
  • 如果“启用VM功能”基于处理器的VM执行控制为1,则VM功能控制中的保留位必须被清除。软件可以参考 VMX 功能 MSR 来确定保留哪些位(参见附录 A.11)。此外,根据 VM 功能控制中的位设置执行以下检查(参见第 25.6.14 节):

    • 如果“EPTP 切换”VM 功能控制为 1,则“启用 EPT”VM-execution control也必须为 1。此外,EPTP 列表地址必须满足以下检查:

      • 地址的位 11:0 必须为 0。
      • 地址不得设置超出处理器物理地址宽度的任何位

      如果“启用VM功能”基于处理器的VM执行控制为0,则不对VM功能控制执行任何检查。

  • 如果“VMCS 阴影”VM-execution control为 1,则 VMREAD 位图和 VMWRITE 位图地址必须分别满足以下检查:

    • 地址的位 11:0 必须为 0。
    • 地址设置的任何位不得超出处理器的物理地址宽度。
  • 如果“EPT-violation #VE”VM-execution control为 1,则虚拟化异常信息地址必须满足以下检查:

    • 地址的位 11:0 必须为 0。
    • 地址设置的任何位不得超出处理器的物理地址宽度。
  • 如果逻辑处理器在启用 Intel PT 的情况下运行(如果 IA32_RTIT_CTL.TraceEn = 1),则此时

    VM entries,“加载 IA32_RTIT_CTL”VM entries控制必须为 0。

  • 如果“Intel PT 使用客户物理地址”VM-execution control为 1,则“加载 IA32_RTIT_CTL”VM entry控制和“清除 IA32_RTIT_CTL”VM Exits控制必须均为 1。

  • 如果“使用 TSC 缩放”VM-execution control为 1,则 TSC 乘数不得为零。

  • 如果“启用 HLAT”VM-execution control为 1,则 HLATP VM-execution control字段中的以下位(参见第 25.6.23 节中的表 25-12)必须为零:位 2:0、位 11:5、以及超出处理器物理地址宽度的位。

  • 如果“PASID 转换”VM-execution control为 1,则低 PASID 目录地址和高 PASID

    每个目录地址必须满足以下检查:

    • 地址的位 11:0 必须为 0。
    • 地址设置的任何位不得超出处理器的物理地址宽度。

27.2.1.2 VM Exits控制字段

VM entries对 VM Exits控制字段执行以下检查

  • 必须正确设置主 VM Exits控件中的保留位。软件可以参考 VMX 功能 MSR 来确定正确的设置(参见附录 A.4.1)。

  • 如果“激活辅助控制”主 VM Exits控制为 1,则必须清除辅助 VM Exits控制中的保留位。软件可以参考 VMX 功能 MSR 来确定保留哪些位(参见附录 A.4.2)。

  • 如果“激活辅助控制”主要 VM Exits控制为 0(或者如果处理器不支持该控制的 1 设置),则不会对辅助 VM Exits控制执行任何检查。逻辑处理器的运行方式就好像所有辅助 VM Exits控制都为 0。

  • 如果“激活VMX抢占定时器”VM执行控制为0,则“保存VMX抢占定时器值”VM退出控制也必须为0。

  • 如果 VM Exits MSR 存储计数字段非零,则对 VM Exits MSR 存储地址执行以下检查:

    • VM Exits MSR 存储地址的低 4 位必须为 0。该地址不应设置超出处理器物理地址宽度的任何位。

    • VM Exits MSR 存储区域中最后一个字节的地址不应设置超出处理器物理地址宽度的任何位。最后一个字节的地址是 VM Exits MSR 存储地址 + (MSR 计数 * 16) – 1。(用于计算的算术使用的位数多于处理器的物理地址宽度。)

      如果 IA32_VMX_BASIC[48] 读为 1,则两个地址都不应设置 63:32 范围内的任何位;参见附录 A.1。

  • 如果 VM Exits MSR 负载计数字段非零,则对 VM Exits MSR 负载地址执行以下检查:

    • VM Exits MSR 加载地址的低 4 位必须为 0。该地址不应设置超出处理器物理地址宽度的任何位。

    • VM Exits MSR 加载区域中最后一个字节的地址不应设置超出处理器物理地址宽度的任何位。最后一个字节的地址是 VM Exits MSR 加载地址(MSR 计数 * 16)– 1。(用于计算的算术使用的位数多于处理器的物理地址宽度。)

      如果 IA32_VMX_BASIC[48] 读为 1,则两个地址都不应设置 63:32 范围内的任何位;参见附录 A.1。

27.2.1.3 VM-entry控制字段

VM entries对 VM entries控制字段执行以下检查。

  • 必须正确设置 VM-entry控件中的保留位。软件可以参考 VMX 功能 MSR 来确定正确的设置(参见附录 A.5)。

  • 必须正确设置与 VM entry事件注入相关的字段。这些字段是VM-entry中断信息字段(参见第25.8.3节中的表25-17)、VM-entry异常错误代码和VM-entry指令长度。如果VM-entry中断信息字段中的有效位(位31)为1,则必须满足以下条件:

    • 该字段的中断类型(位 10:8)未设置为保留值。值 1 在所有逻辑处理器上保留;值 7(其他事件)保留在不支持“监视器陷阱标志”VM-execution control的 1 设置的逻辑处理器上。
    • 该字段的向量(位 7:0)与中断类型一致:
    • 如果中断类型是不可屏蔽中断(NMI),则向量为2。
    • 如果中断类型为硬件异常,则向量最多为31。
    • 如果中断类型是其他事件,则向量为 0(挂起 MTF VM Exits)。
    • 如果以下各项成立,则该字段的传递错误代码位(位 11)为 1: (1) 中断类型为硬件异常; (2)在客态区域的CR0字段中设置位0(对应CR0.PE); (3) IA32_VMX_BASIC[56]读为0(见附录A.1); (4)向量指示以下例外之一:#DF(向量8)、#TS(10)、#NP(11)、#SS(12)、#GP(13)、#PF(14)、或#AC (17)。
    • 如果满足以下任一条件,则该字段的传递错误代码位为 0: (1) 中断类型不是硬件异常; (2) 客态区 CR0 字段的位 0 清零; (3) IA32_VMX_BASIC[56] 读为 0,且向量处于以下范围之一:0–7、9、15、16 或 18–31。
    • 该字段 (30:12) 中的保留位为 0。
    • 如果传递错误代码位(位 11)为 1,则 VM entries异常错误代码字段的位 31:16 为 0
    • 如果中断类型为软件中断、软件异常或特权软件异常,则VM-entry指令长度字段的范围为0-15。仅当 IA32_VMX_MISC[30] 读为 1 时,才允许 VM-entry指令长度为 0;参见附录 A.6。
  • 如果 VM entries MSR 负载计数字段非零,则对 VM entries MSR 负载地址执行以下检查:

    • VM entries MSR 加载地址的低 4 位必须为 0。该地址不应设置超出处理器物理地址宽度的任何位。
    • VM-entry MSR 加载区域中最后一个字节的地址不应设置超出处理器物理地址宽度的任何位。最后一个字节的地址是 VM entries MSR 加载地址 + (MSR 计数 * 16) – \1。 (用于计算的算术使用的位数多于处理器的物理地址宽度。)

    如果 IA32_VMX_BASIC[48] 读为 1,则两个地址都不应设置 63:32 范围内的任何位;参见附录 A.1。

  • 如果处理器不在 SMM 中,则“进入 SMM”和“停用双显示器处理”VM entry控件必须为 0。

  • “进入 SMM”和“停用双显示器处理”VM entry控制不能同时为 1

27.2.2 检查host控制寄存器、MSR 和 SSP

对host状态区域中与控制寄存器和 MSR 对应的字段执行以下检查:

  • CR0 字段不得将任何位设置为 VMX 操作不支持的值(参见第 24.8 节)。
  • CR4 字段不得将任何位设置为 VMX 操作不支持的值(参见第 24.8 节)
  • 如果 CR4 字段(对应 CET)中的位 23 为 1,则 CR0 字段(WP)中的位 16 也必须为 1。
  • 在支持 Intel 64 架构的处理器上,CR3 字段必须使得位 63:52 和超出处理器物理地址宽度的 51:32 范围内的位必须为 0。
  • 在支持 Intel 64 架构的处理器上,IA32_SYSENTER_ESP 字段和 IA32_SYSENTER_EIP 字段必须各自包含一个规范地址。
  • 如果“加载 IA32_PERF_GLOBAL_CTRL”VM Exits控制为 1,则 IA32_PERF_GLOBAL_CTRL MSR 中该寄存器字段中的保留位必须为 0(参见图 20-3)。
  • 如果“加载 IA32_PAT”VM Exits控制为 1,则 IA32_PAT MSR 字段的值必须是可由 WRMSR 在 CPL 0 处无故障地写入的值。具体来说,该字段中的 8 个字节中的每一个都必须有一个值 0 (UC)、1 (WC)、4 (WT)、5 (WP)、6 (WB) 或 7 (UC-)。
  • 如果“加载 IA32_EFER”VM Exits控制为 1,则 IA32_EFER MSR 中保留的位在该寄存器的字段中必须为 0。此外,该字段中 LMA 和 LME 位的值必须分别是“host地址空间大小”VM Exits控制的值。
  • 如果“加载 CET 状态”VM Exits控制为 1,则 IA32_S_CET 字段不得设置 IA32_S_CET MSR 中保留的任何位,并且该字段中的位 10(对应于 SUPPRESS)和位 11(TRACKER)不能同时被设置。
  • 如果“加载 CET 状态”VM Exits控制为 1,则 SSP 字段中的位 1:0 必须为 0
  • 如果“加载 PKRS”VM Exits控制为 1,则 IA32_PKRS 字段中的位 63:32 必须为 0

27.2.3 检查host段和描述符表寄存器

对host状态区域中与段和描述符表寄存器对应的字段执行以下检查:

  • 在每个 CS、SS、DS、ES、FS、GS 和 TR 的选择器字段中,RPL(位 1:0)和 TI 标志(位 2)必须为 0。
  • CS 和 TR 的选择器字段不能为 0000H。
  • 如果“host地址空间大小”VM Exits控制为 0,则 SS 的选择器字段不能为 0000H。
  • 在支持 Intel 64 架构的处理器上,FS、GS、GDTR、IDTR 和 TR 的基地址字段必须包含规范地址。

27.2.4 与地址空间大小相关的检查

在支持 Intel 64 架构的处理器上,对host状态区域中的 VMX 控件和字段执行以下与地址空间大小相关的检查:

  • 如果逻辑处理器在 VM entry时处于 IA-32e 模式之外(如果 IA32_EFER.LMA = 0),则必须满足以下条件:

    • “IA-32e 模式guest”VM-entry控制为 0
    • “host地址空间大小”VM Exits控制为 0
  • 如果逻辑处理器在VM进入时处于IA-32e模式(如果IA32_EFER.LMA = 1),则“host地址空间大小”VM退出控制必须为1

  • 如果“host地址空间大小”VM Exits控制为 0,则必须满足以下条件:

    • “IA-32e 模式guest”VM entries控制为 0。
    • CR4字段的位17(对应CR4.PCIDE)为0
    • RIP 字段中的位 63:32 为 0
    • 如果“加载 CET 状态”VM Exits控制为 1,则 IA32_S_CET 字段和 SSP 字段中的位 63:32 为 0。
  • 如果“host地址空间大小”VM Exits控制为 1,则必须满足以下条件:

    • CR4字段的位5(对应CR4.PAE)为1

    • RIP 字段包含规范地址。

    • 如果“加载 CET 状态”VM Exits控制为 1,则 IA32_S_CET 字段和 SSP 字段包含规范

      地址。

  • 如果“加载 CET 状态”VM Exits控制为 1,则 IA32_INTERRUPT_SSP_TABLE_ADDR 字段包含规范地址。

在不支持 Intel 64 架构的处理器上,执行检查以确保“IA-32e 模式guest”VM entry控制和“host地址空间大小”VM Exits控制均为 0。

27.3 检查和加载guest状态

如果对 VMX 控制和host状态区域的所有检查都通过(参见第 27.2 节),则同时发生以下操作: (1) 检查 VMCS 的客户状态区域,以确保在 VM entry完成后,逻辑处理器的状态与IA-32和Intel 64架构一致; (2) 处理器状态从客户状态区域加载或按照 VM-entry控制字段的指定加载; (3)地址范围监控被清除。

由于检查和加载是同时发生的,因此只有在加载某些状态后才可能发现故障。因此,逻辑处理器通过从host状态区域加载状态来响应此类故障,就像 VM Exits一样。参见第 27.8 节。

27.3.1 检查guest状态区

本节描述对guest状态区域中的字段执行的检查。这些检查可以按任何顺序执行。某些检查会阻止建立当前保留的设置(或设置组合)。未来的处理器可能允许此类设置(或组合),并且可能不执行相应的检查。软件的正确性不应依赖于本节中记录的检查导致的 VM entry失败。

以下小节引用与处理器状态相对应的字段。除非另有说明,否则这些引用是指客区区域中的字段。

27.3.1.1 检查guest控制寄存器、调试寄存器和 MSR

对控制寄存器、调试寄存器和 MSR 对应的客户状态区域中的字段执行以下检查:

  • CR0 字段不得将任何位设置为 VMX 操作不支持的值(参见第 24.8 节)。以下情况除外:

    • 如果“不受限制的guest”VM-execution control为 1,则不会检查位 0(对应于 CR0.PE)和位 31 (PG)。
    • 位 29(对应于 CR0.NW)和位 30(CD)永远不会被检查,因为这些位的值不会被 VM entries更改;参见第 27.3.2.1 节。
  • 如果 CR0 字段(对应 PG)中的位 31 为 1,则该字段(PE)中的位 0 也必须为 1。

  • CR4 字段不得将任何位设置为 VMX 操作不支持的值(参见第 24.8 节)。

  • 如果 CR4 字段(对应 CET)中的位 23 为 1,则 CR0 字段(WP)中的位 16 也必须为 1。

  • 如果“加载调试控制”VM-entry控制为 1,则 IA32_DEBUGCTL MSR 中保留的位在该寄存器的字段中必须为 0。第一个支持虚拟机扩展的处理器仅支持此控制的 1 设置,因此无条件地执行此检查。

  • 在支持 Intel 64 架构的处理器上执行以下检查:

    • 如果“IA-32e 模式guest”VM-entry控制为 1,则 CR0 字段中的位 31(对应于 CR0.PG)和 CR4 字段中的位 5(对应于 CR4.PAE)必须均为 1。
    • 如果“IA-32e 模式guest”VM entries控制为 0,则 CR4 字段中的位 17(对应于 CR4.PCIDE)必须为 0。
    • CR3 字段必须使得位 63:52 和超出处理器物理地址宽度的 51:32 范围内的位均为 0。
    • 如果“加载调试控制”VM-entry 控制为 1,则 DR7 字段中的位 63:32 必须为 0。第一个支持虚拟机扩展的处理器仅支持此控制的 1 设置,因此执行此检查无条件(如果他们支持 Intel 64 架构)。
    • IA32_SYSENTER_ESP 字段和 IA32_SYSENTER_EIP 字段必须各自包含一个规范地址。
    • 如果“加载 CET 状态”VM entries控制为 1,则 IA32_S_CET 字段和 IA32_INTERRUPT_SSP_TABLE_ADDR 字段必须包含规范地址。
  • 如果“加载 IA32_PERF_GLOBAL_CTRL”VM 输入控制为 1,则 IA32_PERF_GLOBAL_CTRL MSR 中该寄存器字段中的保留位必须为 0(参见图 20-3)。

  • 如果“加载 IA32_PAT”VM entries控制为 1,则 IA32_PAT MSR 字段的值必须是可由 WRMSR 在 CPL 0 处无故障地写入的值。具体来说,该字段中的 8 个字节中的每一个都必须有一个值 0 (UC)、1 (WC)、4 (WT)、5 (WP)、6 (WB) 或 7 (UC-)。

  • 如果“加载 IA32_EFER”VM entries控制为 1,则对 IA32_EFER MSR 字段执行以下检查:

    • IA32_EFER MSR 中保留的位必须为 0。
    • 位 10(对应于 IA32_EFER.LMA)必须等于“IA-32e 模式guest”VM-entry控制的值。如果 CR0 字段中的位 31(对应于 CR0.PG)为 1,则它也必须与位 8 (LME) 相同。
  • 如果“加载 IA32_BNDCFGS”VM entries控制为 1,则对 IA32_BNDCFGS MSR 的字段执行以下检查:

    • IA32_BNDCFGS MSR 中保留的位必须为 0。
    • 位 63:12 中的线性地址必须是规范的。
  • 如果“加载 IA32_RTIT_CTL”VM entries控制为 1,则 IA32_RTIT_CTL MSR 中保留的位在该寄存器的字段中必须为 0(见表 33-6)。

  • 如果“加载 CET 状态”VM entries控制为 1,则 IA32_S_CET 字段不得设置保留在

    IA32_S_CET MSR 以及该字段的位 10(对应于 SUPPRESS)和位 11(TRACKER)不能同时设置。

  • 如果“加载客机 IA32_LBR_CTL”VM-entry控制为 1,则 IA32_LBR_CTL MSR 中保留的位在该寄存器的字段中必须为 0。

  • 如果“加载 PKRS”VM entries控制为 1,则 IA32_PKRS 字段中的位 63:32 必须为 0。

  • 如果“加载 UINV”VM entries控制为 1,则guest UINV 字段中的位 15:8 必须为 0。

27.3.1.2 检查guest段寄存器

本节指定对 CS、SS、DS、ES、FS、GS、TR 和 LDTR 字段的检查。以下术语用于定义这些检查:

  • 如果客户状态区域中 RFLAGS 字段中的 VM 标志(位 17)为 1,则客户将是virtual-8086 。
  • 如果“IA-32e 模式guest”VM entries控制为 1,guest将采用IA-32e 模式。 (这仅在支持 Intel 64 架构的处理器上可行。)
  • 如果这些寄存器中的任何一个的访问权限字段中的不可用位(位 16)为 0,则称该寄存器可用

以下是对这些字段的检查:

  • 选择器字段

    • TR。 TI 标志(位 2)必须为 0。
    • LDTR。如果 LDTR 可用,TI 标志(位 2)必须为 0
    • SS。如果guest不是 virtual-8086 并且“不受限制的guest”VM-execution control为 0,则 RPL(位 1:0)必须等于 CS 选择器字段的 RPL。
  • 基地址字段。

    • CS、SS、DS、ES、FS、GS。如果客户机是虚拟 8086,则地址必须是选择器字段左移 4 位(乘以 16)。
    • 在支持 Intel 64 架构的处理器上执行以下检查:
    • TR、FS、GS。该地址必须是规范的。
    • LDTR。如果 LDTR 可用,则该地址必须是规范的。
    • CS。地址的第 63:32 位必须为零。
    • SS、DS、ES。如果寄存器可用,则地址的 63:32 位必须为零
  • CS、SS、DS、ES、FS、GS 的限制字段。如果客户机为 virtual-8086,则该字段必须为 0000FFFFH。

  • 访问权限字段。

    • CS、SS、DS、ES、FS、GS。

    • 如果guest是虚拟 8086,则该字段必须为 000000F3H。这意味着以下内容:

      • 位 3:0(类型)必须为 3,表示扩展读/写访问的数据段

      • 位 4 (S) 必须为 1。

      • 位 6:5 (DPL) 必须为 3。

      • 位 7 (P) 必须为 1。

      • 位 11:8(保留)、位 12(软件可用)、位 13(保留/L)、位 14(D/B)、位 15(G)、

        位 16(不可用)和位 31:17(保留)必须全部为 0。

    • 如果guest不是 virtual-8086,则分别考虑不同的子字段:

      • 位 3:0(类型)。

        • CS。允许的值取决于“不受限制的guest”VM-execution control的设置:
          • 如果控制为 0,则类型必须为 9、11、13 或 15(访问的代码段)。
          • 如果控制为 1,则类型必须为 3(读/写访问的扩展数据段)或 9、11、13 和 15(访问的代码段)之一。
        • SS。如果 SS 可用,则 Type 必须为 3 或 7(读/写、访问数据段)。
        • DS、ES、FS、GS。如果寄存器可用,则进行以下检查:
          • 类型的位 0 必须为 1(已访问)。
          • 如果Type的bit 3为1(代码段),则Type的bit 1必须为1(可读
      • 位 4 (S)。如果寄存器是CS或者寄存器可用,则S必须为1。

      • 位 6:5 (DPL)。

      • CS。

        • 如果类型为 3(读/写访问的扩展数据段),则 DPL 必须为 0。仅当“不受限制的guest”VM-execution control为 1 时,类型才可以为 3。
        • 如果类型为 9 或 11(非一致性代码段),则 DPL 必须等于 SS 访问权限字段中的 DPL。
        • 如果Type为13或15(一致代码段),则DPL不能大于SS的访问权限字段中的DPL。
      • SS。

        • 如果“不受限制的guest”VM-execution control为 0,则 DPL 必须等于选择器字段中的 RPL。

        • 如果 CS 的访问权限字段中的类型为 3(读/写),则 DPL 必须为 0

          访问的扩展数据段)或者 CR0 字段中的位 0(对应于 CR0.PE)为 0。

      • DS、ES、FS、GS。 DPL 不能小于选择器字段中的 RPL,如果 (1)

        “不受限制的guest”VM-execution control为 0; (2)登记册可以使用; (3)访问权限字段中的Type的范围为0-11(数据段或非一致代码段)。

      • 位 7 (P)。如果寄存器是CS或者寄存器可用,则P必须为1。

      • 位 11:8(保留)。如果寄存器是CS或者寄存器可用,则这些位必须全部为0。

      • 位 14 (D/B)。对于 CS,如果客户机将处于 IA-32e 模式并且访问权限字段中的 L 位(位 13)为 1,则 D/B 必须为 0。

      • 位 15 (G)。如果寄存器是 CS 或寄存器可用,则适用以下检查:

      • 如果 11:0 范围内的限制字段中的任何位为 0,则 G 必须为 0。

      • 如果 31:20 范围内的限制字段中的任何位为 1,则 G 必须为 1。

      • 位 31:17(保留)。如果寄存器是CS或者寄存器可用,则这些位必须全部为0。

    • TR。不同的子字段分别考虑:

      • 位 3:0(类型)。
        • 如果客户机不是 IA-32e 模式,则类型必须为 3(16 位忙 TSS)或 11(32 位忙 TSS)。
        • 如果客户机采用 IA-32e 模式,则类型必须为 11(64 位繁忙 TSS)。
      • 位 4 (S)。 S 必须为 0。
      • 位 7 (P)。 P 必须为 1。
      • 位 11:8(保留)。这些位必须全部为 0。
      • 位 15 (G)。
        • 如果 11:0 范围内的限制字段中的任何位为 0,则 G 必须为 0
        • 如果 31:20 范围内的限制字段中的任何位为 1,则 G 必须为 1。
      • 位 16(不可用)。不可用位必须为 0。
      • 位 31:17(保留)。这些位必须全部为0
    • LDTR。仅当 LDTR 可用时,才适用对不同子字段的以下检查:

      • 位 3:0(类型)。类型必须为 2 (LDT)。
      • 位 4 (S)。 S 必须为 0。
      • 位 7 (P)。 P 必须为 1。
      • 位 11:8(保留)。这些位必须全部为 0。
      • 位 15 (G)。
        • 如果 11:0 范围内的限制字段中的任何位为 0,则 G 必须为 0。
        • 如果 31:20 范围内的限制字段中的任何位为 1,则 G 必须为 1。
      • 位 31:17(保留)。这些位必须全部为 0。

27.3.1.3 检查guest描述符表寄存器

对 GDTR 和 IDTR 字段执行以下检查:

  • 在支持 Intel 64 架构的处理器上,基地址字段必须包含规范地址。
  • 每个限制字段的位 31:16 必须为 0。

27.3.1.4 检查guest RIP、RFLAGS 和 SSP

对RIP、RFLAGS、SSP对应的Guest-state区域字段进行如下检查

(影子堆栈指针):

  • 安息吧。在支持 Intel 64 架构的处理器上执行以下检查:
    • 如果“IA-32e 模式guest”VM entries控制为 0 或者 CS 访问权限字段中的 L 位(位 13)为 0,则位 63:32 必须为 0。
    • 如果处理器支持 N < 64 个线性地址位,并且“IA-32e 模式guest”VM-entry控制为 1 并且 CS 访问权限字段中的 L 位为 1.1(否),则位 63:N 必须相同。如果处理器支持 64 个线性地址位,则检查适用。)guest RIP 值不需要是规范的;位 N-1 的值可能与位 N 的值不同。
  • 射频标记
    • 保留位 63:22(不支持 Intel 64 架构的处理器上的位 31:22)、该字段中的位 15、位 5 和位 3 必须为 0,保留位 1 必须为 1。
    • 如果“IA-32e 模式guest”VM entry控制为 1 或 CR0 字段中的位 0(对应于 CR0.PE)为 0,则 VM 标志(位 17)必须为 0
    • 如果 VM entries中断信息字段中的有效位(位 31)为 1 并且中断类型(位 10:8)为外部中断,则 IF 标志(RFLAGS[位 9])必须为 1
  • SSP。如果“加载 CET 状态”VM-entry 控制为 1,则执行以下检查
    • 位 1:0 必须为 0
    • 如果处理器支持 Intel 64 架构,则第 63:N 位必须相同,其中 N 是 CPU 的最大线性地址宽度。 (如果处理器支持 64 个线性地址位,则此检查不适用。)guest SSP 值不需要是规范的;位 N-1 的值可能与位 N 的值不同

27.3.1.5 检查guest未注册状态

对非注册状态对应的guest状态区域中的字段进行如下检查:

  • 活动状态。

    • 活动状态字段必须包含 0 – 3 范围内的值,指示实现支持的活动状态(参见第 25.4.2 节)。未来的处理器可能包括对其他活动状态的支持。软件应读取 VMX 功能 MSR IA32_VMX_MISC(请参阅附录 A.6)以确定支持哪些活动状态。

    • 如果 SS 的访问权限字段中的 DPL(位 6:5)不为 0,则活动状态字段不得指示 HLT 状态

    • 如果中断状态字段指示 MOV-SS 或 STI 阻塞(如果该字段中的位 0 或位 1 为 1),则活动状态字段必须指示活动状态。

    • 如果VM条目中断信息字段中的有效位(位31)为1,则要传递的中断(由中断类型和向量定义)不得是逻辑处理器处于正常状态时被阻止的中断。活动状态对应于活动状态字段的内容。以下各项枚举了不同活动状态允许注入的中断(如 VM-entry 中断信息字段中所指定):

      • 积极的。允许任何中断

      • HLT。唯一允许的事件如下:

        • 具有中断类型的外部中断或不可屏蔽中断(NMI)。

        • 具有中断类型硬件异常和向量 1(调试异常)或向量 18(机器检查异常)的那些。

        • 具有中断类型的其他事件和向量 0(挂起的 MTF VM Exits)。

          有关VM进入中断信息字段的格式的详细信息,请参见第25.8.3节中的表25-17。

      • 关闭。仅允许 NMI 和机器检查例外。

      • 等待-SIPI。不允许任何打扰。

    • 如果“进入 SMM”VM entry控制为 1,则活动状态字段不得指示等待 SIPI 状态。

  • 可中断状态。

    • 保留位(位 31:5)必须为 0
    • 该字段不能指示 STI 和 MOV SS 都阻塞(位 0 和 1 不能同时为 1)
    • 如果 RFLAGS 字段中的 IF 标志(位 9)为 0,则位 0(被 STI 阻塞)必须为 0。
    • 如果 VM entries中断信息字段中的有效位(位 31)为 1 并且中断类型(位 10:8),则位 0(被 STI 阻塞)和位 1(被 MOV-SS 阻塞)必须均为 0该字段的值为 0,表示外部中断;值为 2,表示不可屏蔽中断 (NMI)。
    • 如果处理器不在 SMM 中,则位 2(被 SMI 阻止)必须为 0。
    • 如果“进入 SMM”VM entry控制为 1,则位 2(由 SMI 阻止)必须为 1
    • 如果“虚拟 NMI”VM-execution control为 1,VM entries中断信息字段中的有效位(位 31)为 1,并且中断类型(位 10: 8) 该字段的值为 2(表示 NMI)。
    • 如果位 4(飞地中断)为 1,则位 1(由 MOV-SS 阻止)必须为 0,并且处理器必须通过枚举 CPUID 支持 SGX。(EAX=07H,ECX=0):EBX.SGX[位 2]如1。
  • 待处理的调试异常。

    • 位 11:4、位 13、位 15 和位 63:17(不支持 Intel 64 架构的处理器上的位 31:17)必须为 0。

    • 如果以下任一条件成立,则执行以下检查: (1) 可中断状态字段指示 STI 阻塞(该字段中的位 0 为 1); (2) 可中断状态字段指示 MOV SS 阻塞(该字段中的位 1 为 1);或 (3) 活动状态字段指示 HLT:

      • 如果 RFLAGS 字段中的 TF 标志(位 8)为 1 并且 IA32_DEBUGCTL 字段中的 BTF 标志(位 1)为 0,则位 14 (BS) 必须为 1。

      • 如果 RFLAGS 字段中的 TF 标志(位 8)为 0 或 RFLAGS 字段中的 BTF 标志(位 1)为 0,则位 14(BS)必须为 0。

        IA32_DEBUGCTL 字段是

    • 如果位 16 (RTM) 为 1,则执行以下检查:

      • 位 11:0、位 15:13 和位 63:17(不支持 Intel 64 架构的处理器上的位 31:17)必须为 0;位 12 必须为 1。
      • 处理器必须通过枚举CPUID来支持RTM。(EAX=07H,ECX=0):EBX[位11]为1
      • 可中断状态字段不得指示 MOV SS 阻塞(该字段中的位 1 必须为 0)
  • VMCS 链接指针。如果该字段包含 FFFFFFFF_FFFFFFFFH 以外的值,则应用以下检查:

    • 位 11:0 必须为 0
    • 超出处理器物理地址宽度的位必须为 0。
    • 字段值(作为物理地址)引用的位于内存中的 4 个字节必须满足以下条件:
      • 位 30:0 必须包含处理器的 VMCS 修订标识符(参见第 25.2 节)。
      • 位 31 必须包含“VMCS 影子”VM-execution control的设置。4 这意味着当且仅当“VMCS 影子”VM-execution control为 1 时,引用的 VMCS 才是影子 VMCS(请参阅第 25.10 节)。
      • 如果处理器不在 SMM 中或“进入 SMM”VM entries控制为 1,则该字段不得包含当前 VMCS 指针。
      • 如果处理器处于 SMM 且“SMM 入口”VM-entry控制为 0,则该字段必须与执行 VMCS 指针不同。

27.3.1.6 检查guest页面目录指针表条目

如果 CR0.PG =1、CR4.PAE = 1 且 IA32_EFER.LME = 0,则逻辑处理器使用PAE 分页(请参阅《英特尔® 64 和 IA-32 架构软件开发人员手册》第 3A 卷中的第 4.4 节)。1 当PAE 分页正在使用中,CR3 中的物理地址引用页目录指针表条目表(PDPTE)。当使用 PAE 寻呼时,MOV 到 CR3 检查 PDPTE 的有效性。

如果 (1) 在客户状态区域的 CR0 字段中设置了位 31(对应于 CR0.PG),则 VM entries针对使用 PAE 分页的客户; (2)在CR4字段中设置位5(对应于CR4.PAE); (3) “IA-32e 模式guest”VM entries控制为 0。这样的 VM entries检查 PDPTE 的有效性:

  • 如果“启用 EPT”VM-execution control为 0,则 VM entries将检查guest状态区域中 CR3 字段引用的 PDPTE 的有效性(1)在 VM entries之前未使用 PAE 分页; (2) CR3 的值由于 VM entries而发生变化。即使 (1) 和 (2) 都不成立,VM entries也可以检查其有效性。
  • 如果“启用 EPT”VM-execution control为 1,VM entries将检查guest状态区域中 PDPTE 字段的有效性(请参见第 25.4.2 节)。

不使用 PAE 分页的虚拟机条目不会检查任何 PDPTE 的有效性

检查 PDPTE 有效性的 VM entries使用的检查与使用 PAE 分页时通过 MOV 加载到 CR3 时使用的检查相同。3 如果 MOV 到 CR3 会由于 PDPTE 导致一般保护异常,被加载(例如,因为设置了保留位),VM条目失败。

27.3.2 加载guest状态

VM entries上的处理器状态通过以下方式更新:

  • 某些状态是从guest状态区域加载的。
  • 某些状态由 VM entry控件确定
  • 页目录指针是根据某些控制寄存器的值加载的。

该加载可以以任何顺序执行,并且与 VMCS 内容的检查并行(参见第 27.3.1 节)。

guest状态的加载详见第 27.3.2.1 节至第 27.3.2.4 节。这些部分引用与处理器状态相对应的 VMCS 字段。除非另有说明,否则这些引用是指客区区域中的字段。

除了本节中描述的状态加载之外,VM条目还可以从VM条目MSR加载区域加载MSR(参见第27.4节)。此加载仅在本节中描述的状态加载和第 27.3.1 节中描述的 VMCS 内容检查之后发生。

27.3.2.1 加载guest控制寄存器、调试寄存器和 MSR

以下各项描述了guest控制寄存器、调试寄存器和 MSR 如何加载到 VM entries上:

  1. 在支持 Intel 64 架构的处理器上,物理地址扩展可能支持超过 36 个物理地址位。软件可以通过在 EAX 中使用 80000008H 执行 CPUID 来确定支持的物理地址位数。物理地址宽度在 EAX 的位 7:0 中返回。
  2. “启用 EPT”是基于辅助处理器的 VM-execution control。如果基于主处理器的 VM-execution control的位 31 为 0,则 VM entries的功能就像“启用 EPT”VM-execution control为 0 一样。请参见第 25.6.2 节。
  3. 这意味着 (1) 每个 PDPTE 中的位 11:9 被忽略; (2) 如果 PDPTE 之一中的位 0(存在)被清除,则忽略该 PDPTE 的位 63:1。
  • CR0 从 CR0 字段加载,但以下位除外,这些位在 VM entry时永远不会修改: ET(位 4);保留位 15:6、17 和 28:19; NW(位 29)和 CD(位 30)。1 CR0 字段中这些位的值被忽略。

  • CR3和CR4分别从CR3字段和CR4字段加载

  • 如果“加载调试控制”VM-entry 控制为 1,则从 DR7 字段加载 DR7,但位 12 和位 15:14 始终为 0,位 10 始终为 1。DR7 中这些位的值字段被忽略。

    第一个支持虚拟机扩展的处理器仅支持“负载”的 1 设置

    调试控制”VM entry控制,因此始终从 DR7 字段加载 DR7。

  • 下面描述了如何使用guest状态区域中的字段加载某些MSR:

    • 如果“加载调试控制”VM-entry控制为 1,则从 IA32_DEBUGCTL 字段加载 IA32_DEBUGCTL MSR。第一个支持虚拟机扩展的处理器仅支持此控制的 1 设置,因此始终从 IA32_DEBUGCTL 字段加载 IA32_DEBUGCTL MSR。

    • IA32_SYSENTER_CS MSR 是从 IA32_SYSENTER_CS 字段加载的。由于该字段只有 32 位,因此 MSR 的位 63:32 被清除为 0。

    • IA32_SYSENTER_ESP 和 IA32_SYSENTER_EIP MSR 分别从 IA32_SYSENTER_ESP 字段和 IA32_SYSENTER_EIP 字段加载。在不支持Intel 64架构的处理器上,这些字段只有32位; MSR 的位 63:32 被清除为 0

    • 以下是在支持 Intel 64 架构的处理器上执行的:

    • MSR FS.base 和 GS.base 分别从 FS 和 GS 的基地址字段加载(参见第 27.3.2.2 节)。

    • 如果“加载 IA32_EFER”VM entries控制为 0,则 IA32_EFER MSR 中的位将修改如下:

      • IA32_EFER.LMA 加载“IA-32e 模式guest”VM-entry控制的设置。

      • 如果加载 CR0 使得 CR0.PG = 1,则 IA32_EFER.LME 也会加载“IA-32e 模式guest”VM-entry控制的设置。2 否则,IA32_EFER.LME 不会被修改。

        请参阅下面“加载 IA32_EFER”VM-entry控制为 1 的情况

    • 如果“加载 IA32_PERF_GLOBAL_CTRL”VM entries控制为 1,则从 IA32_PERF_GLOBAL_CTRL 字段加载 IA32_PERF_GLOBAL_CTRL MSR。

    • 如果“加载 IA32_PAT”VM-entry控制为 1,则从 IA32_PAT 字段加载 IA32_PAT MSR

    • 如果“加载 IA32_EFER”VM entries控制为 1,则从 IA32_EFER 字段加载 IA32_EFER MSR。

    • 如果“加载 IA32_BNDCFGS”VM entries控制为 1,则从 IA32_BNDCFGS 字段加载 IA32_BNDCFGS MSR。

    • 如果“加载 IA32_RTIT_CTL”VM-entry控制为 1,则从 IA32_RTIT_CTL MSR 加载

      IA32_RTIT_CTL 字段。

    • 如果“加载 CET”VM entries控制为 1,则分别从 IA32_S_CET 字段和 IA32_INTERRUPT_SSP_TABLE_ADDR 字段加载 IA32_S_CET 和 IA32_INTERRUPT_SSP_TABLE_ADDR MSR。在不支持Intel 64架构的处理器上,这些字段只有32位; MSR 的位 63:32 被清除为 0

    • 如果“加载客机 IA32_LBR_CTL”VM-entry控制为 1,则从 IA32_LBR_CTL MSR 加载

    IA32_LBR_CTL guest状态字段。

    • 如果“加载 PKRS”VM entries控制为 1,则从 IA32_PKRS 字段加载 IA32_PKRS MSR。

      除了 FS.base 和 GS.base 之外,这些 MSR 中的任何一个如果出现在 VM-entry MSR-load 区域中,随后都会被覆盖。参见第 27.4 节

  • 除了从 SMM 返回的条目之外,所有 VM entries都不会修改 SMBASE 寄存器。

27.3.2.2 加载guest段寄存器和描述符表寄存器

对于每个 CS、SS、DS、ES、FS、GS、TR 和 LDTR,字段从客户状态区域加载,如下所示:

  • 不可用位从访问权限字段加载。永远不能为 TR 设置该位(参见第 27.3.1.2 节)。如果为其他寄存器之一设置,则适用以下内容:

    • 对于 CS、SS、DS、ES、FS 和 GS 中的每一个,在 64 位模式之外使用段会导致故障(一般保护异常或堆栈故障异常),就像使用空选择器。该位不会导致 64 位模式下的访问错误。
    • 如果为 LDTR 设置该位,则使用 LDTR 会在所有模式下导致一般保护异常,就像使用空选择器加载 LDTR 一样。

    如果对于 CS、SS、DS、ES、FS、GS、TR 和 LDTR 中的任何一个清除该位,则空选择器值不会导致故障(一般保护异常或堆栈故障异常)。

  • TR。选择器、基址、限制和访问权限字段已加载。

  • CS。

    • 始终加载以下字段:选择器、基址、限制和(来自访问权限字段)L、D 和 G 位
    • 对于其他字段,参考访问权限字段的不可用位:
    • 如果不可用位为 0,则加载所有访问权限字段。
    • 如果不可用位为1,则VM进入后剩余的CS访问权限未定义
  • SS、DS、ES、FS、GS 和 LDTR。

    • 选择器字段已加载。
    • 对于其他字段,参考相应访问权限字段的不可用位:
    • 如果不可用位为 0,则加载基地址、限制和访问权限字段。
    • 如果不可用位为 1,则在 VM entry后基地址、段限制和剩余访问权限未定义,但以下情况除外:
      • SS 基地址的位 3:0 清除为 0
      • SS.DPL 始终从 SS 访问权限字段加载。这将是 VM entries完成后的当前特权级别 (CPL)。
      • SS.B 始终设置为 1
      • FS 和 GS 的基地址是从 VMCS 中的相应字段加载的。在支持 Intel 64 架构的处理器上,为 FS 和 GS 的基地址加载的值也体现在 FS.base 和 GS.base MSR 中。
      • 在支持 Intel 64 架构的处理器上,LDTR 的基地址设置为未定义但规范的值。
      • 在支持 Intel 64 架构的处理器上,SS、DS 和 ES 基地址的第 63:32 位被清除为 0。

GDTR 和 IDTR 使用基本字段和限制字段加载。

27.3.2.3 加载guest RIP、RSP、RFLAGS 和 SSP

RSP、RIP 和 RFLAGS 分别从 RSP 字段、RIP 字段和 RFLAGS 字段加载。如果“加载 CET”VM entries控制为 1,则从 SSP 字段加载 SSP(影子堆栈指针)。以下各项涉及非 64 位模式的 VM entries上这些字段的高 32 位:

  • RSP 的位 63:32 在 64 位模式之外未定义。因此,逻辑处理器可以忽略非64位模式的VM条目上的RSP字段的位63:32的内容。
  • 如第 27.3.1.4 节所述,在非 64 位模式的 VM entries上,RIP 和 RFLAGS 字段的位 63:32 必须为 0。 (当“加载 CET”VM entries控制为 1 时,对于非 64 位模式的 VM entries,SSP 也是如此。)

27.3.2.4 加载页目录指针表条目

如第 27.3.1.6 节所述,如果 CR0.PG = 1、CR4.PAE = 1 且 IA32_EFER.LME = 0,则逻辑处理器使用 PAE 分页。使用 PAE 分页的 guest 虚拟机的 VM entries将 PDPTE 加载到内部,基于“启用 EPT”VM-execution control设置的非架构寄存器:

  • 如果控制为0,则从VM条目加载的CR3值中的物理地址引用的页目录指针表加载PDPTE(参见第27.3.2.1节)。加载的值在 VMX non-root operation中被视为物理地址。

  • 如果控制为 1,则从客户状态区域中的相应字段加载 PDPTE(请参阅第

    25.4.2)。加载的值在 VMX non-root operation中被视为guest物理地址。

27.3.2.5 更新非注册状态

第 29.4 节描述了 VMX 架构如何控制逻辑处理器如何管理 TLB 和分页结构高速缓存中的信息。以下项目详细介绍了 VM entries如何使缓存的映射失效:

  • 如果“启用 VPID”VM-execution control为 0,则逻辑处理器将使与 VPID 0000H 关联的线性映射和组合映射(对于所有 PCID)无效; VPID 0000H 的组合映射对于所有 EP4TA 值均无效(EP4TA 是 EPTP 的位 51:12 的值)。
  • 如果“启用 VPID”VM-execution control为 1,则 VM entries不需要使任何guest物理映射无效,也不需要使任何线性映射或组合映射无效。

如果“虚拟中断传递”VM-execution control为 1,VM entries从 VMCS 中的客户中断状态字段加载 RVI 和 SVI 的值(请参见第 25.4.2 节)。这样做之后,逻辑处理器首先引起 PPR 虚拟化(第 30.1.3 节),然后评估挂起的虚拟中断(第 30.2.1 节)。

如果识别出虚拟中断,则可以在 VM entry(包括任何指定的事件注入)完成后立即在 VMX non-root operation中传递该中断;参见第 27.7.5 节。有关虚拟中断传送的详细信息,请参见第 30.2.2 节。

27.3.3 清除地址范围监控

Intel 64 和 IA-32 架构允许软件使用 MONITOR 和 MWAIT 指令监视指定的地址范围。请参阅《英特尔® 64 和 IA-32 架构软件开发人员手册》第 3A 卷中的第 9.10.4 节。 VM entries清除任何可能有效的地址范围监控。

27.4 加载 MSRS

VM条目可以从VM条目MSR加载区域加载MSR(参见第25.8.2节)。具体来说,该区域中的每个条目(最多为 VM entries MSR 加载计数中指定的数量)通过加载由位 31:0 索引的 MSR 以及位 127:64 的内容来按顺序处理,因为它们将由WRMSR。

如果出现以下任一情况,则条目处理失败:

  • 位 31:0 的值为 C0000100H(IA32_FS_BASE MSR)或 C0000101(IA32_GS_BASE MSR)。
  • 位 31:8 的值为 000008H,这意味着当本地 APIC 处于 x2APIC 模式时,索引 MSR 允许访问 APIC 寄存器。
  • 位 31:0 的值指示只能在系统管理模式 (SMM) 下写入的 MSR,并且 VM entries未在 SMM 下开始。 (IA32_SMM_MONITOR_CTL是只能在SMM中写入的MSR。)
  • 位 31:0 的值表示由于特定于模型的原因,无法将 MSR 加载到 VM entries上。处理器可能会阻止加载某些 MSR,即使它们通常可以由 WRMSR 写入。此类特定于模型的行为记录在《英特尔® 64 和 IA-32 架构软件开发人员手册》第 4 卷的第 2 章“特定于模型的寄存器 (MSR)”中。
  • 位 63:32 不全为 0。
  • 如果通过 CPL = 0.1 的 WRMSR 执行,尝试将位 127:64 写入由条目的位 31:0 索引的 MSR 将导致一般保护异常

如果任何条目的处理失败,则 VM entries将失败。逻辑处理器通过从host状态区域加载状态来响应此类故障,就像 VM Exits一样。参见第 27.8 节。

如果任何 MSR 的加载方式在架构上需要 TLB 刷新,则 TLB 会被更新,以便在 VM entry后,逻辑处理器将不会使用在转换之前缓存的任何转换。

27.5 跟踪地址Pre-Translation(TAPT)

当“Intel PT 使用guest物理地址”VM-execution control为 1 时,Intel PT 使用的地址被视为guest物理地址,并使用 EPT 将这些地址转换为物理地址

VM入口使用跟踪地址预转换TAPT)来防止缓冲的跟踪数据由于EPT违规而丢失;参见第 26.5.4.2 节。仅当在 VM entries (IA32_RTIT_CTL.TraceEn = 1) 之后启用 Intel PT 且仅当“Intel PT 使用guest物理地址”VM-execution control为 1 时,VM entries才使用 TAPT。

如第 26.5.4 节所述,TAPT 可能会由于 EPT 违规、EPT 配置错误、页面修改日志已满事件或 APIC 访问而导致 VM Exits。如果这样的 VM Exits是由于 VM entry期间的 TAPT 的结果而发生的,则 VM Exits的操作就像在 VM entry完成后(在guest上下文中)在 VMX non-root operation中发生一样。

如果VM进入期间的TAPT导致VM退出,则VM进入不执行事件注入(第27.6节),即使VM-entry中断信息字段中的有效位为1。这样的VM退出保存VM-entry的内容中断信息和VM进入异常错误代码字段分别进入IDT向量信息和IDT向量错误代码字段。

27.6 事件注入

如果 VM entries中断信息字段(参见第 25.8.3 节)中的有效位为 1,则 VM entries会在加载guest状态的所有组件(包括 MSR)后导致事件被传递(或挂起),并且建立 VM-execution control字段后。

  • 如果该字段中的中断类型为0(外部中断)、2(不可屏蔽中断); 3(硬件异常)、4(软件中断)、5(特权软件异常)或6(软件异常),事件按照第27.6.1节中所述进行传递
  • 如果该字段中的中断类型为7(其他事件)并且向量字段为0,则在VM进入之后MTF VM退出待决。参见第 27.6.2 节

27.6.1 矢量事件注入

VM entries在 VM entries建立的guest上下文中传递注入的向量事件。这意味着在加载guest状态的所有组件(包括 MSR)以及建立 VM-execution control字段之后发生传递。1 使用该字段中的向量来传递事件以选择 IDT 中的描述符。由于事件注入是在从客户状态区域加载IDTR之后发生的,因此这是客户IDT。

第 27.6.1.1 节提供了向量事件注入的详细信息。一般来说,事件的传递与正常生成的事件完全一样。如果满足以下所有条件,则发生例外:客户 CR4 字段中的位 25 (UINTR) 设置为 1,并且“IA-32e 模式客户”VM -entry control为1,如果它正在注入一个外部中断,其向量是UINV在VM进入后将具有的值,则VM条目被修改。在这种情况下,逻辑处理器然后执行第 7.5.2 节中指定的用户中断通知处理,而不是第 27.6.1.1 节中描述的过程。 (如果客户活动状态字段指示 HLT 状态,则逻辑处理器在用户中断通知处理之后进入 HLT 状态。)

如果事件传递(或用户中断通知处理;见上文)遇到嵌套异常(例如,一般保护异常,因为向量指示超出 IDT 限制的描述符),则使用该异常的向量查阅异常位图:

  • 如果嵌套异常的位为0,则嵌套异常正常传递。如果嵌套异常是良性的,则通过 IDT 传递。如果是共同错误或页面错误,则可能会生成双重错误,具体取决于其传递遇到嵌套异常的事件的性质。请参阅《英特尔® 64 和 IA-32 架构软件开发人员手册》第 3A.2 卷中的第 6 章“中断 8 — 双故障异常 (#DF)”
  • 如果嵌套异常的位为 1,则发生 VM Exits。第 27.6.1.2 节详细介绍了事件注入导致 VM Exits的情况。

27.6.1.1 矢量事件注入的详细信息

事件注入过程由VM-entry中断信息字段(格式在表25-17中给出)、VM-entry异常错误代码字段和VM-entry指令长度字段的内容控制。以下项目提供了该过程的详细信息:

  • RFLAGS 压入堆栈的值通常是从客户状态区域加载的值。为 RF 标志推送的值不会根据正在传递的事件类型进行修改。然而,如果软件中断被注入到处于虚拟 8086 模式的客户机中,则 RFLAGS 的推送值可能会被修改(见下文)。将 RFLAGS 压入堆栈后,RFLAGS 寄存器中的值将像通过 IDT 传递事件时通常所做的那样进行修改

  • 压入堆栈的指令指针取决于事件的类型以及在其传递期间是否发生嵌套异常。术语“**当前客户 RIP”**是指要从客户状态区域加载的值。推送的值确定如下:

    • 如果VM条目成功注入(没有嵌套异常)具有中断类型外部中断、NMI或硬件异常的事件,则当前客户RIP被推送到堆栈上。
    • 如果VM条目成功注入(没有嵌套异常)具有中断类型软件中断、特权软件异常或软件异常的事件,则当前客户RIP在被推入堆栈之前增加VM条目指令长度。
    • 如果 VM entries在注入事件时遇到异常,并且该异常不会导致 VM Exits,则无论事件类型或 VM entries指令长度如何,当前客户机 RIP 都会被推送到堆栈上。如果遇到的异常确实导致保存 RIP 的 VM Exits,则保存的 RIP 是当前guest RIP。
  • 如果在 VM-entry 中断信息字段中设置了传送错误代码位(位 11),则 VM-entry 异常错误代码字段的内容将被推送到堆栈上,因为在传送期间将推送错误代码的一个例外。

  • DR6、DR7 和 IA32_DEBUGCTL MSR 不会被事件注入修改,即使事件具有向量 1(具有向量 1 的调试异常的正常传送也会更新这些寄存器)。

  • 如果 VM entries注入软件中断,并且 guest 虚拟机将处于虚拟 8086 模式 (RFLAGS.VM = 1),则由于 RFLAGS.IOPL < 3,不会发生一般保护异常。VM 监视器应在之前检查 RFLAGS.IOPL注入此类事件,并且如果需要,注入一般保护异常而不是软件中断。

  • 如果 VM entries注入软件中断,并且 guest 虚拟机将处于具有虚拟 8086 模式扩展的虚拟 8086 模式 (RFLAGS.VM = CR4.VME = 1),则事件传递将受到基于软件的基于 VME 的中断重定向的影响任务状态段(TSS)中的中断重定向位图如下:

    • 如果位图中的位n被清除(其中**n是软件中断的编号),则中断将定向到 8086 程序中断处理程序:处理器使用位于线性地址 0 的 16 位中断向量表 (IVT) 。如果RFLAGS.IOPL的值小于3,则对入栈的RFLAGS的值进行以下修改:IOPL设置为3,IF设置为VIF的值。
    • 如果位图中的位n被设置(其中**n是软件中断的编号),则中断将定向到保护模式中断处理程序。 (换句话说,注入按照下一项中所述进行处理。)在这种情况下,如果 RFLAGS.IOPL < 3,软件中断不会调用此类处理程序(而是发生一般保护异常)。但是,如上所述,RFLAGS.IOPL 无法通过注入的软件中断来引发此类异常。因此,在这种情况下,注入将调用独立于 RFLAGS.IOPL 值的保护模式中断处理程序。

    其他类型事件的注入不受此重定向的影响

  • 如果 VM entries注入软件中断(未如上所述重定向)或软件异常,则会对正在访问的 IDT 描述符执行特权检查,就像执行 INT n、 INT3 或 INTO 的情况一样(描述符的 DPL 不能被小于 CPL)。即使 guest 虚拟机处于 virtual-8086 模式,也不会检查 RFLAGS.IOPL。此检查失败可能会导致嵌套异常。具有中断类型外部中断、NMI、硬件异常和特权软件异常的事件注入,或者具有中断类型软件中断并如上所述被重定向的事件,不执行这些检查。

  • 如果 VM entry注入不可屏蔽中断 (NMI) 并且“虚拟 NMI”VM-execution control为 1,则虚拟 NMI 阻塞在 VM entry后生效。

  • 如果 IA32_DEBUGCTL MSR 中设置了 LBR 位,则转换会导致记录最后一个分支记录。即使对于诸如调试异常之类的事件也是如此,这些事件通常在交付之前清除 LBR 位

  • 最后异常记录 MSR (LER) 可以根据 LBR 位的设置进行更新。

    IA32_DEBUGCTL MSR。诸如调试异常之类的事件通常会在传递之前清除 LBR 位,因此通常不会更新 LER,但可能会作为 VM entry事件注入的一部分进行更新。

  • 如果事件注入遇到嵌套异常,则该嵌套异常的任何错误代码中的 EXT 位(位 0)的值确定如下:

    • 如果注入的事件具有中断类型外部中断、NMI、硬件异常或特权软件异常,并且遇到嵌套异常(但不产生双重故障),则该异常的错误代码会设置 EXT 位。
    • 如果注入的事件是软件中断或软件异常并且遇到嵌套异常,则该异常的错误代码会清除 EXT 位。
    • 如果事件传递遇到嵌套异常,并且该异常的传递遇到另一个异常(但不会产生双重错误),则该异常的错误代码会设置 EXT 位。
    • 如果产生双重故障,则双重故障的错误代码为0000H(EXT 位清零)。

27.6.1.2 事件注入期间虚拟机退出

无论 VM 执行控件的设置如何,注入的事件都不会直接导致 VM Exits。例如,将“NMI 退出”VM-execution control设置为 1 不会因注入 NMI 而导致 VM Exits。

但是,事件传递过程可能会导致 VM Exits:

  • 如果 VM entry中断信息字段中的向量标识了 IDT 中的任务门,则尝试的任务切换可能会导致 VM Exits,就像在 VMX non-root operation的正常执行期间发生注入事件一样(请参阅第26.4.2)。

  • 如果事件传递遇到嵌套异常,则可能会发生 VM Exits,具体取决于异常位图的内容(请参阅第 26.2 节)。

  • 如果事件传递生成双错误异常(由于嵌套异常);逻辑处理器

    尝试调用双错误处理程序时遇到另一个嵌套异常;并且该异常不会因异常位图而导致 VM Exits;然后由于三重故障而发生 VM Exits(参见第 26.2 节)。

  • 如果事件传递注入双重故障异常并遇到嵌套异常,但由于异常位图而不会导致 VM Exits,则由于三重故障而发生 VM Exits(请参阅第 26.2 节)。

  • 如果“虚拟化 APIC 访问”VM-execution control为 1 并且事件传递生成对 APIC 访问页的访问,则该访问将按第 30.4 节中所述进行处理,并可能导致 VM Exits。

如果事件传递过程确实导致VM退出,则确定VM退出之前的处理器状态,就像在VMX非根操作的正常执行期间发生注入事件一样。如果注入事件直接访问导致 VM Exits的任务门,或者遇到的第一个嵌套异常导致 VM Exits,则有关注入事件的信息将保存在 IDT 向量信息字段中(请参阅第 28.2.4 节)。

如果外部中断的注入导致用户中断通知处理而不是事件传递,本节中的内容也适用(请参阅前面的第 27.6.1 节)。

27.6.1.3 VM entry实地址模式的事件注入

如果VM条目正在用0加载CR0.PE,则任何注入的向量事件都会像通常在实地址模式中完成的那样被传递。2具体而言,VM条目使用VM条目中断信息字段中提供的向量来选择4- IDTR.base 中线性地址处的中断向量表中的字节条目。英特尔® 64 和 IA-32 架构软件开发人员手册第 3A 卷第 15.1.4 节提供了更多详细信息。

由于如果 VM entry后 CR0.PE 为 0(请参阅第 27.2.1.3 节),VM entry中断信息字段中的位 11(传递错误代码)必须为 0,因此以 CR0.PE = 0 注入的向量事件不会推送堆栈上的错误代码。这与实地址模式下的事件传递是一致的

如果事件传送遇到故障(由于违反 IDTR.limit 或 SS.limit),则该故障将被视为在 VMX non-root operation中的事件传送期间发生。此类故障可能会导致 VM Exits,如第 27.6.1.2 节中所述。

27.6.2 注入挂起的 MTF VM Exits

如果VM进入中断信息字段中的中断类型是7(其他事件)并且向量字段是0,则VM进入导致MTF VM退出在VM进入之后的指令边界上待决。即使“监视器陷阱标志”VM-execution control为 0,情况也是如此。有关待处理 MTF VM Exits的处理,请参阅第 26.5.2 节。

27.7 VM-entry的特殊功能

本节详细介绍 VM-entry的各种功能。它使用以下术语:如果VM条目中断信息字段的有效位(位31)为1并且该字段中的中断类型为0(外部中断)、2(不可屏蔽中断),则VM条目是矢量化的; 3(硬件异常)、4(软件中断)、5(特权软件异常)或6(软件异常)。

27.7.1 中断状态

客户状态区域中的可中断状态字段(参见表 25-3)包含控制 STI 阻塞、MOV SS 阻塞和 NMI 阻塞的位。该字段对VM进入后的事件阻塞影响如下:

  • 如果VM条目是矢量化的,则无论中断状态字段的内容如何,VM条目之后的STI或MOV SS都不会阻塞。

  • 如果 VM entries未进行矢量化,则适用以下规则:

    • 当且仅当可中断状态字段中的位 0 为 1 时,事件才会被 STI 阻止。在 guest 执行一条指令或引发异常(包括由 VM entries挂起的调试异常;请参阅第 27.7.3 节)后,此阻止会被清除。 )。
    • 当且仅当中断状态字段中的位 1 为 1 时,事件才会被 MOV SS 阻止。这可能会影响待处理调试异常的处理;参见第 27.7.3 节。在guest执行一条指令或引发异常(包括由 VM entries挂起的调试异常)后,此阻塞将被清除。
  • 不可屏蔽中断(NMI)的阻塞确定如下:

    • 如果“虚拟 NMI”VM-execution control为 0,当且仅当可中断状态字段中的位 3(由 NMI 阻止)为 1 时,NMI 才会被阻止。如果“NMI 退出”VM-execution control为 0,则执行IRET 指令的执行消除了这种阻塞(即使该指令生成故障)。如果“NMI退出”控制为1,IRET不影响此阻塞。

    • — 如果“虚拟 NMI”VM-execution control为 1,以下各项描述了可中断状态字段中位 3(由 NMI 阻止)的使用:

      • 该位的值不影响VM进入后NMI的阻塞。 NMI 在 VMX non-root operation中不会被阻塞(除了由于其他原因造成的普通阻塞,例如由于 MOV SS 指令、等待 SIPI 状态等)
      • 该位的值决定了VM进入后是否存在虚拟NMI阻塞。如果该位为 1,则虚拟 NMI 阻塞在 VM entry后生效。如果该位为 0,则在 VM entries之后不存在虚拟 NMI 阻塞,除非 VM entries正在注入 NMI(请参阅第 27.6.1.1 节)。执行 IRET 可消除虚拟 NMI 阻塞(即使指令生成故障)。

      如果“NMI退出”VM执行控制为0,则“虚拟NMI”控制必须为0;参见第 27.2.1.1 节。

  • 系统管理中断 (SMI) 的阻塞确定如下:

    • 如果VM条目不是在系统管理模式(SMM)下执行的,则VM条目不会改变SMI阻塞。
    • 如果 VM entry是在 SMM 中执行的,则当且仅当中断状态字段中的位 2 为 1 时,SMI 在 VM entry后被阻止。

27.7.2 活动状态

客户状态区域中的活动状态字段控制在VM进入之后逻辑处理器是活动的还是处于第25.4.2节中标识的非活动状态之一。该字段的使用确定如下:

  • 如果VM进入是矢量化,则逻辑处理器在VM进入后处于活动状态。虽然第 27.3.1.5 节中描述的关于活动状态字段的一致性检查确实适用于这种情况,但活动状态字段的内容并不能确定 VM entry后的活动状态。
  • 如果VM条目不是向量化的,则逻辑处理器以客户状态区域中指定的活动状态结束VM条目。如果VM条目以逻辑处理器处于非活动状态而结束,则VM条目生成通常在从活动状态进入该活动状态时生成的任何特殊总线周期。如果 VM entry结束时逻辑处理器处于关闭状态并且逻辑处理器处于 SMX 操作1,则会发生英特尔® TXT 关闭情况。使用的错误代码是 0000H,表示“传统关闭”。请参阅英特尔® 可信执行技术初步架构规范。
  • 某些活动状态无条件阻止某些事件。在任何将处理器置于指示状态的 VM entries之后,以下阻塞将生效:
    • 活动状态会阻止启动 IPI (SIPI)。当逻辑处理器处于活动状态且处于 VMX non-root operation时到达的 SIPI 将被丢弃,并且不会导致 VM Exits。
    • HLT 状态阻止启动 IPI (SIPI)。当逻辑处理器处于 HLT 状态和 VMX non-root operation时到达的 SIPI 将被丢弃,并且不会导致 VM Exits。
    • 关闭状态阻止外部中断和 SIPI。即使“外部中断退出”VM-execution control为 1,逻辑处理器处于关闭状态和 VMX non-root operation时到达的外部中断也不会导致 VM Exits。当逻辑处理器处于关闭状态时到达的 SIPI关闭状态和VMX非root操作都会被丢弃,不会导致VM退出。
    • 等待 SIPI 状态会阻止外部中断、不可屏蔽中断 (NMI)、INIT 信号和系统管理中断 (SMI)。如果此类事件在逻辑处理器处于等待 SIPI 状态且处于 VMX non-root operation中时到达,则不会导致 VM Exits。

27.7.3 VM进入后传递挂起的调试异常

客户状态区域中的待处理调试异常字段指示是否存在尚未传递的调试异常(参见第 25.4.2 节)。本节介绍如何在 VM-entry处处理这些

如果满足以下任一条件,则在 VM entry后不存在挂起的调试异常:

  • VM entries使用以下中断类型之一进行引导:外部中断、不可屏蔽中断 (NMI)、硬件异常或特权软件异常。
  • 可中断状态字段不指示 MOV SS 的阻塞,并且 VM entries正在通过以下中断类型之一进行引导:软件中断或软件异常。
  • VM entries未进行引导,并且活动状态字段指示关闭或等待 SIPI

如果上述情况均不成立,则挂起的调试异常字段指定为guest挂起的调试异常。如果 BS 位(位 14)或启用断点位(位 12)为 1,则存在有效的挂起调试异常。如果存在有效的挂起调试异常,则按如下方式处理它们:

  • 如果 VM entries未进行矢量化,则将按照在guest执行中正常遇到的方式处理待处理的调试异常:
    • 如果逻辑处理器没有阻止此类异常(中断状态字段指示 MOV SS 没有阻止),则在 VM entry后将传递调试异常(见下文)。
    • 如果逻辑处理器正在阻止此类异常(由于 MOV SS 的阻止),则挂起的调试异常会像通常情况一样保持挂起或丢失。
  • 如果 VM entries是矢量化(具有中断类型软件中断或软件异常并通过 MOV SS 进行阻止),则适用以下各项:
    • 对于注入软件中断或带有向量 3 (#BP) 或向量 4 (#OF) 的软件异常 — 或带有向量 1 (#DB) 的特权软件异常 — 待处理的调试异常将按原样进行处理如果在遇到调试陷阱的 MOV SS 之后执行相应的指令(INT1、INT3 或 INTO),则在guest执行中通常会遇到这种情况。
    • 对于使用除 3 和 4 之外的向量注入软件异常,挂起的调试异常可能会丢失,或者它们可能会在注入后传递(见下文)。

如果没有有效的挂起调试异常(如上所述),则在 VM entry后不会传递挂起的调试异常如果在 VM entry后传递挂起调试异常,则它具有“前一条指令上的陷阱”的优先级(请参见第 6.9 节)英特尔® 64 和 IA-32 架构软件开发人员手册,第 3A 卷)。因此,INIT 信号和系统管理中断 (SMI) 优先于此类异常,正如由 TPR 阈值引起的 VM Exits(请参阅第 27.7.7 节)和挂起的 MTF VM Exits(请参阅第 27.7.8 节)一样。异常发生由于“中断窗口退出”和“NMI 窗口退出”VM-execution control的 1 设置,该优先级高于任何挂起的不可屏蔽中断 (NMI) 或外部中断,并且也高于 VM Exits。

如果异常位图中的位 1 (#DB) 为 1,则 VM entry后传递的待处理调试异常会导致 VM Exits。如果它不会导致 VM Exits,则会正常更新 DR6。

27.7.4 VMX 抢占定时器

如果“激活VMX抢占定时器”VM执行控制为1,则VM条目使用VMX抢占定时器值字段中的无符号值启动VMX抢占定时器。

VMX抢占定时器有可能在VM进入期间到期(例如,如果VMX抢占定时器值字段中的值为零)。如果发生这种情况(并且如果VM进入未进入等待SIPI状态),则在任何事件注入之后和执行VM进入之后的任何指令之前,VM退出以其正常优先级发生。例如,由 VM entry(参见第 27.7.3 节)建立的任何挂起的调试异常优先于计时器引起的 VM Exits。 (定时器引起的 VM Exits将在调试异常传递后发生,除非该异常或其传递导致不同的 VM Exits。)

有关 VMX non-root operation中 VMX 抢占定时器操作的详细信息,请参见第 26.5.1 节,包括其导致的 VM Exits的阻塞和优先级。

27.7.5 中断窗口退出和虚拟中断传送

如果“中断窗口退出”VM-execution control为 1,则打开的中断窗口可能会导致 VM 在进入 VM 后立即退出(详细信息请参见第 26.2 节)。如果“中断窗口退出”VM-execution control为 0,但“虚拟中断传递”VM-execution control为 1,则可以在 VM entry后立即传递虚拟中断(参见第 27.3.2.5 节和第 30.2.1 节) )。

以下项目详细说明了这些事件的处理:

  • 这些事件在为 VM entries指定的任何事件注入之后发生。
  • 不可屏蔽中断 (NMI) 和较高优先级事件的优先级高于这些事件。这些事件的优先级高于外部中断和较低优先级的事件。
  • 如果逻辑处理器由于 VM entry而刚刚进入 HLT 状态,则这些事件会唤醒逻辑处理器(请参阅第 27.7.2 节)。如果逻辑处理器刚刚进入关闭状态或等待 SIPI 状态,则不会发生这些情况。

27.7.6 NMI 窗口退出

“NMI 窗口退出”VM-execution control可能会导致 VM Exits在 VM entry后立即发生(详细信息请参见第 26.2 节)。

以下各项详细说明了这些 VM Exits的处理:

  • 如果为 VM entry指定了此类注入,则这些 VM Exits将遵循事件注入
  • 调试陷阱异常(参见第 27.7.3 节)和更高优先级的事件优先于由该控制引起的 VM Exits。由该控制引起的 VM Exits优先于不可屏蔽中断 (NMI) 和较低优先级事件。
  • 如果由于 VM entry而导致逻辑处理器刚刚进入 HLT 状态或关闭状态(请参阅第 27.7.2 节),则由该控制引起的 VM Exits会唤醒逻辑处理器。如果逻辑处理器刚刚进入等待 SIPI 状态,则不会发生这些情况。

27.7.7 TPR阈值引起的VM退出

如果“使用 TPR 影子”和“虚拟化 APIC 访问”VM-execution control均为 1,且“虚拟中断传送”VM-execution control为 0,则在 VM entry后立即发生 VM Exits,如果位 3 的值: TPR 阈值 VM-execution control字段的 0 大于 VTPR 的位 7:4 的值(参见第 30.1.1 节)。

以下各项详细说明了这些 VM Exits的处理:

  • 如果 RFLAGS.IF = 0 或通过设置guest状态区域中的可中断状态字段中的位,则不会阻止 VM Exits。
  • 如果为 VM entry指定了此类注入,则 VM 将退出以下事件注入。
  • 由该控制引起的 VM Exits优先于系统管理中断 (SMI)、INIT 信号和较低优先级事件。因此,它们比第 27.7.5 节、第 27.7.6 节和第 27.7.8 节中描述的 VM Exits以及 VM entry时可能待处理的任何中断或调试异常具有优先级
  • 如果逻辑处理器刚刚作为 VM entries的一部分进入 HLT 状态,则这些 VM Exits会唤醒逻辑处理器(请参阅第 27.7.2 节)。如果逻辑处理器刚刚进入关闭状态或等待 SIPI 状态,则不会发生这些情况。如果由于处理器刚刚进入关闭状态而抑制此类 VM Exits,则它会在导致逻辑处理器关闭的任何事件传递后发生离开关闭状态,同时保持 VMX non-root operation(例如,由于“NMI 退出”VM-execution control为 0 时发生 NMI)。
  • 基本的退出原因是“TPR低于阈值”。

27.7.8 挂起的 MTF VM Exits

如第 27.6.2 节所述,VM entry可能会导致 MTF VM Exits在 VM entry后立即挂起。以下各项详细说明了这些 VM Exits的处理:

  • 系统管理中断 (SMI)、INIT 信号和更高优先级事件的优先级高于这些 VM Exits。这些虚拟机退出的优先级高于调试陷阱异常和较低优先级事件。
  • 如果逻辑处理器由于 VM entry而刚刚进入 HLT 状态,则这些 VM Exits会唤醒逻辑处理器(请参阅第 27.7.2 节)。如果逻辑处理器刚刚进入关闭状态或等待 SIPI 状态,则不会发生这些情况。

27.7.9 VM条目和高级调试功能

VM entries不记录最后分支记录,不生成分支跟踪消息,也不更新分支跟踪存储。

27.7.10 VM进入后的用户中断识别

如果 VM entries以 CR4.UINTR = IA32_EFER.LMA = 1 且 UIRR ≠ 0 完成,则会导致识别待处理的用户中断;否则,不会识别待处理的用户中断。

27.8 加载guest状态期间或之后的 VM entry失败

由于第 27.3.1 节中确定的检查而导致的 VM entry失败以及第 27.4 节中确定的 MSR 加载期间的失败的处理方式与早期在 VM entry中发生的失败不同。在这些情况下,将执行以下步骤:

  1. VM-exit信息字段中记录了VM-entry失败的信息:
  • 退出原因。
1
-` `Bits ``15``:``0` `of this field contain the basic exit reason. It ``is` `loaded with a number indicating the general cause of the VM``-``entry failure. The following numbers are used:` ` ``33.VM``-``entry failure due to invalid guest state. A VM entry failed one of the checks identified ``in` `Section ``27.3``.``1.` ` ``34.VM``-``entry failure due to MSR loading. A VM entry failed ``in` `an attempt to load MSRs (see Section ``27.4``).` ` ``41.VM``-``entry failure due to machine``-``check event. A machine``-``check event occurred during VM entry (see Section ``27.9``).` `-` `Bit ``31` `is` `set` `to ``1` `to indicate a VM``-``entry failure.` `-` `The remainder of the field (bits ``30``:``16``) ``is` `cleared.
  • 退出资格。该字段根据退出原因设置。
1
-` `VM``-``entry failure due to invalid guest state. In most cases, the exit qualification ``is` `cleared to ``0.` `The following non``-``zero values are used ``in` `the cases indicated:` ` ``1.` `Not used.` ` ``2.` `Failure was due to a problem loading the PDPTEs (see Section ``27.3``.``1.6``).` ` ``3.` `Failure was due to an attempt to inject a non``-``maskable interrupt (NMI) into a guest that ``is` `blocking events through the STI blocking bit ``in` `the interruptibility``-``state field.` ` ``4.` `Failure was due to an invalid VMCS link pointer (see Section ``27.3``.``1.5``).` `   ``VM``-``entry checks on guest``-``state fields may be performed ``in` `any` `order. Thus, an indication by exitqualification of one cause does ``not` `imply that there are ``not` `also other errors. Different processorsmay give different exit qualifications ``for` `the same VMCS.` `-` `VM``-``entry failure due to MSR loading. The exit qualification ``is` `loaded to indicate which entry ``in` `the VM``-``entry MSR``-``load area caused the problem (``1` `for` `the first entry, ``2` `for` `the second, etc.).
  • 所有其他 VM Exits信息字段均未修改。
  1. 处理器状态的加载就像 VM Exits时一样(参见第 28.5 节)。如果这导致 [CR4.PAE & CR0.PG & ~IA32_EFER.LMA] = 1,则可以检查并加载页目录指针表条目(PDPTE)(参见第 28.5.4 节)。
  2. NMI 阻塞的状态是VM entry之前的状态。
  3. MSR 按照 VM-exit MSR-load 区域中的指定进行加载(参见第 28.6 节)。

尽管此过程类似于 VM Exits过程,但对于这些 VM entry故障,不会发生 VM Exits期间执行的许多步骤:

  • 大多数 VM Exits信息字段不会更新(请参阅上面的步骤 1)。
  • VM-entry中断信息字段中的有效位不被清除。
  • 客态区域不被修改。
  • 没有 MSR 保存到 VM Exits MSR 存储区域中。

27.9 VM entry期间的机器检查事件

如果在 VM entry期间发生机器检查事件,则会发生以下情况之一:

  • 处理机器检查事件就好像它发生在 VM entry之前一样:
    • 如果 CR4.MCE = 0,逻辑处理器的操作取决于逻辑处理器是否处于 SMX 操作中:
      • 如果逻辑处理器处于 SMX 操作中,则会发生英特尔® TXT 关闭情况。使用的错误代码是000CH,表示“不可恢复的机器检查状况”。
      • 如果逻辑处理器不在 SMX 操作范围内,则它会进入关闭状态
    • 如果 CR4.MCE = 1,则通过 IDT 传递机器检查异常 (#MC)。
  • 机器检查事件在 VM entry完成后处理:
    • 如果VM条目以CR4.MCE = 0结束,则逻辑处理器的操作取决于逻辑处理器是否处于SMX操作中:
      • 如果逻辑处理器处于 SMX 操作中,则会发生英特尔® TXT 关闭情况,并显示错误代码 000CH(不可恢复的机器检查情况)。
      • 如果逻辑处理器不在 SMX 操作范围内,则它会进入关闭状态
    • 如果 VM entries以 CR4.MCE = 1 结尾,则会生成机器检查异常 (#MC):
    • 如果异常位图的位 18 (#MC) 为 0,则异常通过 guest IDT 传递
    • 如果异常位图的位 18 为 1,则异常导致 VM Exits
  • 如第 27.8 节所述,发生 VM entry失败。基本退出原因是 41,即“由于机器检查事件导致虚拟机进入失败”。

如果在加载任何guest状态之后发生机器检查事件,则不使用第一个选项。仅当 VM entries能够加载所有guest状态时才使用第二个选项。


阿里云助力开发者!2核2G 3M带宽不限流量!6.18限时价,开 发者可享99元/年,续费同价!

最后于 2024-4-22 00:57 被zhang_derek编辑 ,原因:
收藏
点赞7
打赏
分享
最新回复 (3)
雪    币: 19759
活跃值: (29377)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
秋狝 2024-4-16 09:16
2
1
感谢分享
雪    币: 3867
活跃值: (5760)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
huangjw 2024-4-17 16:05
3
0
真的给力
雪    币: 3981
活跃值: (5619)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
badboyl 2 2024-4-20 22:59
4
0
感谢分享,很不错的资料。
游客
登录 | 注册 方可回帖
返回