受保护执行设施

简介

受保护执行设施 (PEF) 是 POWER 9 的一项架构变更,旨在启用安全虚拟机 (SVM)。DD2.3 芯片 (PVR=0x004e1203) 或更高版本将具备 PEF 能力。新的 ISA 版本将包含 PEF RFC02487 变更。

启用后,PEF 向 POWER 架构添加了一种新的更高特权模式,称为 Ultravisor 模式。伴随该新模式的是名为“受保护执行 Ultravisor”(简称 Ultravisor)的新固件。Ultravisor 模式是 POWER 架构中特权最高的模式。

特权状态

问题 (Problem)

管理程序 (Supervisor)

虚拟机管理程序 (Hypervisor)

Ultravisor

PEF 保护 SVM 免受虚拟机管理程序、特权用户以及系统中其他 VM 的侵害。SVM 在静态时受到保护,且只能由经授权的机器执行。所有虚拟机都使用虚拟机管理程序服务。Ultravisor 过滤 SVM 与虚拟机管理程序之间的调用,以确保信息不会意外泄露。除 H_RANDOM 外,所有 hypercalls 都会反映给虚拟机管理程序。H_RANDOM 不会反映,以防止虚拟机管理程序影响 SVM 中的随机值。

为了支持这一点,对 CPU 资源的归属进行了重构。一些以前属于虚拟机管理程序特权的资源现在属于 ultravisor 特权。

硬件

硬件变更包括:

  • MSR 中有一个新位用于确定当前进程是否运行在安全模式下,即 MSR(S) 第 41 位。MSR(S)=1 表示进程处于安全模式,MSR(s)=0 表示进程处于正常模式。

  • MSR(S) 位只能由 Ultravisor 设置。

  • HRFID 不能用于设置 MSR(S) 位。如果虚拟机管理程序需要返回到 SVM,它必须使用 ultracall。它可以确定其返回的 VM 是否是安全的。

  • 有一个新的 Ultravisor 特权寄存器 SMFCTRL,它具有一个使能/禁用位 SMFCTRL(E)。

  • 进程的特权现在由三个 MSR 位决定:MSR(S, HV, PR)。在下方的每个表中,模式按照从最低特权到最高特权的顺序列出。较高特权的模式可以访问较低特权模式的所有资源。

    安全模式 MSR 设置

    S

    HV

    PR

    特权

    1

    0

    1

    问题 (Problem)

    1

    0

    0

    特权级 (OS)

    1

    1

    0

    Ultravisor

    1

    1

    1

    保留

    正常模式 MSR 设置

    S

    HV

    PR

    特权

    0

    0

    1

    问题 (Problem)

    0

    0

    0

    特权级 (OS)

    0

    1

    0

    虚拟机管理程序 (Hypervisor)

    0

    1

    1

    问题模式 (Host)

  • 内存被划分为安全内存和正常内存。只有在安全模式下运行的进程才能访问安全内存。

  • 硬件不允许任何非安全运行的任务访问安全内存。这意味着虚拟机管理程序在不使用 ultracall(请求 Ultravisor)的情况下无法访问 SVM 的内存。Ultravisor 仅允许虚拟机管理程序看到加密后的 SVM 内存。

  • I/O 系统不允许直接寻址安全内存。这将 SVM 限制为仅能使用虚拟 I/O。

  • 该架构允许 SVM 与虚拟机管理程序共享不受加密保护的内存页。然而,这种共享必须由 SVM 发起。

  • 当进程在安全模式下运行时,所有 hypercalls (syscall lev=1) 都会进入 Ultravisor。

  • 当进程处于安全模式时,所有中断都会进入 Ultravisor。

  • 以下资源已变为 Ultravisor 特权,需要通过 Ultravisor 接口进行操作:

    • 处理器配置寄存器 (SCOMs)。

    • 停止状态 (Stop state) 信息。

    • 设置 SMFCTRL(D) 时的调试寄存器 CIABR、DAWR 和 DAWRX。如果未设置 SMFCTRL(D),它们在安全模式下将无法工作。设置后,读取和写入需要 Ultravisor 调用,否则会引起虚拟机管理程序模拟协助 (Hypervisor Emulation Assistance) 中断。

    • PTCR 和分区表项(分区表位于安全内存中)。尝试写入 PTCR 将引起虚拟机管理程序模拟协助中断。

    • LDBAR(LD 基地址寄存器)和 IMC(内存内收集)非架构化寄存器。尝试写入它们将引起虚拟机管理程序模拟协助中断。

    • SVM 的分页、SVM 与虚拟机管理程序的内存共享。(包括虚拟处理器区域 (VPA) 和虚拟 I/O)。

软件/微码

软件变更包括:

  • SVM 是使用 IBM 提供的(开源)工具从普通 VM 创建的。

  • 所有 SVM 最初都作为普通 VM 启动,并利用 ultracall `UV_ESM`(进入安全模式)进行转换。

  • 执行 `UV_ESM` ultracall 时,Ultravisor 将 VM 拷贝到安全内存中,解密验证信息,并检查 SVM 的完整性。如果完整性检查通过,Ultravisor 以安全模式移交控制权。

  • 验证信息包括与 SVM 关联的加密磁盘的密码。当 SVM 请求时,该密码会被提供给它。

  • Ultravisor 不参与保护 SVM 在静态时的加密磁盘。

  • 对于外部中断,Ultravisor 保存 SVM 的状态,并将中断反映给虚拟机管理程序进行处理。对于 hypercalls,Ultravisor 将所有 hypercall 不需要用到的寄存器插入中性状态,然后将调用反映给虚拟机管理程序进行处理。`H_RANDOM` hypercall 由 Ultravisor 执行且不反映。

  • 为了使虚拟 I/O 正常工作,必须进行弹跳缓冲 (bounce buffering)。

  • Ultravisor 使用 AES (IAPM) 保护 SVM 内存。IAPM 是一种同时提供完整性和机密性的 AES 模式。

  • 正常页和安全页之间的数据移动是由虚拟机管理程序中新的 HMM 插件与 Ultravisor 协作完成的。

Ultravisor 为虚拟机管理程序和 SVM 提供新服务。这些服务通过 ultracalls 访问。

术语

  • Hypercalls:用于从虚拟机管理程序请求服务的特殊系统调用。

  • 正常内存 (Normal memory):虚拟机管理程序可以访问的内存。

  • 正常页 (Normal page):由正常内存支持并可由虚拟机管理程序访问的页。

  • 共享页 (Shared page):由正常内存支持并可供虚拟机管理程序/QEMU 和 SVM 同时访问的页(即页在 SVM 和虚拟机管理程序/QEMU 中均有映射)。

  • 安全内存 (Secure memory):仅限 Ultravisor 和 SVM 访问的内存。

  • 安全页 (Secure page):由安全内存支持且仅限 Ultravisor 和 SVM 访问的页。

  • SVM:安全虚拟机。

  • Ultracalls:用于从 Ultravisor 请求服务的特殊系统调用。

Ultravisor 调用 API

本节描述支持安全虚拟机 (SVM) 和半虚拟化 KVM 所需的 Ultravisor 调用 (ultracalls)。Ultracalls 允许 SVM 和虚拟机管理程序从 Ultravisor 请求服务,例如访问仅在 Ultravisor 特权模式下运行时才能访问的寄存器或内存区域。

ultracall 需要的具体服务在寄存器 R3(ultracall 的第一个参数)中指定。ultracall 的其他参数(如果有)在寄存器 R4 至 R12 中指定。

所有 ultracalls 的返回值都在寄存器 R3 中。ultracall 的其他输出值(如果有)在寄存器 R4 至 R12 中返回。这种寄存器用法的唯一例外是下文所述的 UV_RETURN ultracall。

每个 ultracall 都会返回特定的错误代码,适用于该 ultracall 的上下文。但是,与 PowerPC 架构平台参考 (PAPR) 类似,如果未为特定情况定义特定的错误代码,则 ultracall 将回退到基于参数位置的错误代码。即根据可能引起错误的 ultracall 参数返回 U_PARAMETER、U_P2、U_P3 等。

某些 ultracalls 涉及在 Ultravisor 和虚拟机管理程序之间传输数据页。从安全内存传输到正常内存的安全页可能会使用动态生成的密钥进行加密。当安全页传回安全内存时,可能会使用相同的动态生成密钥进行解密。这些密钥的生成和管理将在单独的文档中介绍。

目前这仅涵盖虚拟机管理程序和 SVM 正在使用的已实现 ultracalls,但在合理时可以添加其他调用。

所有 hypercalls/ultracalls 的完整规范最终将在 PAPR 规范的公开/OpenPower 版本中提供。

注意

如果未启用 PEF,ultracalls 将被重定向到虚拟机管理程序,后者必须处理这些调用或使其失败。

虚拟机管理程序使用的 Ultracalls

本节描述虚拟机管理程序用于管理 SVM 的虚拟内存管理 ultracalls。

UV_PAGE_OUT

加密并将内存页内容从安全内存移动到正常内存。

语法
uint64_t ultracall(const uint64_t UV_PAGE_OUT,
        uint16_t lpid,          /* LPAR ID */
        uint64_t dest_ra,       /* real address of destination page */
        uint64_t src_gpa,       /* source guest-physical-address */
        uint8_t  flags,         /* flags */
        uint64_t order)         /* page size order */
返回值

以下值之一:

  • 成功时返回 U_SUCCESS。

  • 如果 lpid 无效,返回 U_PARAMETER。

  • 如果 dest_ra 无效,返回 U_P2。

  • 如果 src_gpa 地址无效,返回 U_P3。

  • 如果 flags 中的任何位无法识别,返回 U_P4。

  • 如果 order 参数不受支持,返回 U_P5。

  • 如果功能不受支持,返回 U_FUNCTION。

  • 如果页面当前无法换出,返回 U_BUSY。

描述

加密安全页的内容,并使其在正常页中对虚拟机管理程序可用。

默认情况下,源页将从 SVM 的分区范围页表中取消映射。但虚拟机管理程序可以通过在 flags 参数中设置 UV_SNAPSHOT 标志来向 Ultravisor 提供保留页映射的提示。

如果源页已经是共享页,则调用返回 U_SUCCESS,且不执行任何操作。

用例
  1. QEMU 尝试访问属于 SVM 的地址,但该地址的页框未映射到 QEMU 的地址空间。在这种情况下,虚拟机管理程序将分配一个页框,将其映射到 QEMU 的地址空间并发出 UV_PAGE_OUT 调用以检索页面的加密内容。

  2. 当 Ultravisor 缺乏安全内存且需要换出一个 LRU 页时。在这种情况下,Ultravisor 将向虚拟机管理程序发出 H_SVM_PAGE_OUT hypercall。随后,虚拟机管理程序将分配一个正常页并发出 UV_PAGE_OUT ultracall,Ultravisor 将加密并将安全页的内容移动到正常页中。

  3. 当虚拟机管理程序访问 SVM 数据时,虚拟机管理程序请求 Ultravisor 将相应的页传输到虚拟机管理程序可以访问的非安全页。不过,正常页中的数据将被加密。

UV_PAGE_IN

将内存页内容从正常内存移动到安全内存。

语法
uint64_t ultracall(const uint64_t UV_PAGE_IN,
        uint16_t lpid,          /* the LPAR ID */
        uint64_t src_ra,        /* source real address of page */
        uint64_t dest_gpa,      /* destination guest physical address */
        uint64_t flags,         /* flags */
        uint64_t order)         /* page size order */
返回值

以下值之一:

  • 成功时返回 U_SUCCESS。

  • 如果页面当前无法换入,返回 U_BUSY。

  • 如果功能不受支持,返回 U_FUNCTION。

  • 如果 lpid 无效,返回 U_PARAMETER。

  • 如果 src_ra 无效,返回 U_P2。

  • 如果 dest_gpa 地址无效,返回 U_P3。

  • 如果 flags 中的任何位无法识别,返回 U_P4。

  • 如果 order 参数不受支持,返回 U_P5。

描述

src_ra 标识的页面内容从正常内存移动到安全内存,并将其映射到访客物理地址 dest_gpa

如果 dest_gpa 指向共享地址,则将该页映射到 SVM 的分区范围页表。如果 dest_gpa 非共享,则将该页内容拷贝到相应的安全页中。根据上下文,在拷贝前解密该页。

调用者通过 flags 参数提供页的属性。flags 的有效值包括:

  • CACHE_INHIBITED

  • CACHE_ENABLED

  • WRITE_PROTECTION

在执行 UV_PAGE_IN ultracall 之前,虚拟机管理程序必须将该页锁定在内存中。

用例
  1. 当普通 VM 切换到安全模式时,其驻留在正常内存中的所有页面都会移动到安全内存中。

  2. 当 SVM 请求与虚拟机管理程序共享内存页时,虚拟机管理程序分配一个页并通知 Ultravisor。

  3. 当 SVM 访问已被换出的安全页时,Ultravisor 调用虚拟机管理程序来定位该页。在定位页面后,虚拟机管理程序使用 UV_PAGE_IN 使该页对 Ultravisor 可用。

UV_PAGE_INVAL

使页面的 Ultravisor 映射失效。

语法
uint64_t ultracall(const uint64_t UV_PAGE_INVAL,
        uint16_t lpid,          /* the LPAR ID */
        uint64_t guest_pa,      /* destination guest-physical-address */
        uint64_t order)         /* page size order */
返回值

以下值之一:

  • 成功时返回 U_SUCCESS。

  • 如果 lpid 无效,返回 U_PARAMETER。

  • 如果 guest_pa 无效(或对应于安全内存

    页映射),返回 U_P2。

  • 如果 order 无效,返回 U_P3。

  • 如果功能不受支持,返回 U_FUNCTION。

  • 如果页面目前无法使无效,返回 U_BUSY。

描述

此 ultracall 通知 Ultravisor:虚拟机管理程序中对应于给定访客物理地址的页映射已失效,Ultravisor 不应访问该页。如果指定的 guest_pa 对应于安全页,Ultravisor 将忽略失效尝试并返回 U_P2。

用例
  1. 当从 QEMU 的页表中取消映射共享页时(可能是因为其被换出到磁盘),Ultravisor 需要知道在其端也不应访问该页。

UV_WRITE_PATE

验证并写入给定分区的分区表项 (PATE)。

语法
uint64_t ultracall(const uint64_t UV_WRITE_PATE,
        uint32_t lpid,          /* the LPAR ID */
        uint64_t dw0            /* the first double word to write */
        uint64_t dw1)           /* the second double word to write */
返回值

以下值之一:

  • 成功时返回 U_SUCCESS。

  • 如果 PATE 目前无法写入,返回 U_BUSY。

  • 如果功能不受支持,返回 U_FUNCTION。

  • 如果 lpid 无效,返回 U_PARAMETER。

  • 如果 dw0 无效,返回 U_P2。

  • 如果 dw1 地址无效,返回 U_P3。

  • 如果虚拟机管理程序尝试更改安全虚拟机的 PATE,

    或从虚拟机管理程序以外的上下文调用,返回 U_PERMISSION。

描述

验证并为给定的 LPID 写入 LPID 及其分区表项。如果 LPID 已分配并初始化,此调用将导致更改分区表项。

用例
  1. 分区表位于安全内存中,其条目称为 PATE(分区表项),指向虚拟机管理程序以及每个虚拟机(包括安全和普通)的分区范围页表。虚拟机管理程序在分区 0 中运行,其分区范围页表位于正常内存中。

  2. 此 ultracall 允许虚拟机管理程序向 Ultravisor 注册其自身及其他分区(虚拟机)的分区范围和进程范围页表项。

  3. 如果现有分区 (VM) 的 PATE 值发生更改,则会刷新该分区的 TLB 缓存。

  4. 虚拟机管理程序负责分配 LPID。LPID 及其 PATE 条目被一起注册。虚拟机管理程序管理普通 VM 的 PATE 条目,并可以随时更改。Ultravisor 管理 SVM 的 PATE 条目,且不允许虚拟机管理程序修改它们。

UV_RETURN

在处理完转发(即 *反映*)给虚拟机管理程序的 hypercall 或中断后,将控制权从虚拟机管理程序返回给 Ultravisor。

语法
uint64_t ultracall(const uint64_t UV_RETURN)
返回值

成功时此调用永远不会返回到虚拟机管理程序。如果不是从虚拟机管理程序上下文进行的 ultracall,则返回 U_INVALID。

描述

当 SVM 发起 hypercall 或发生某些其他异常时,Ultravisor 通常将异常转发(即 *反映*)给虚拟机管理程序。在处理完异常后,虚拟机管理程序使用 UV_RETURN ultracall 将控制权交还给 SVM。

进入此 ultracall 时预期的寄存器状态为:

  • 非易失性寄存器已恢复为原始值。

  • 如果是从 hypercall 返回,寄存器 R0 包含返回值(**与其他 ultracalls 不同**),且寄存器 R4 至 R12 包含 hypercall 的任何输出值。

  • R3 包含 ultracall 编号,即 UV_RETURN。

  • 如果带着综合中断返回,R2 包含综合中断号。

用例
  1. Ultravisor 依赖虚拟机管理程序为 SVM 提供多项服务,例如处理 hypercall 和其他异常。在处理完异常后,虚拟机管理程序使用 UV_RETURN 将控制权交还给 Ultravisor。

  2. 虚拟机管理程序必须使用此 ultracall 将控制权返回给 SVM。

UV_REGISTER_MEM_SLOT

注册具有指定属性的 SVM 地址范围。

语法
uint64_t ultracall(const uint64_t UV_REGISTER_MEM_SLOT,
        uint64_t lpid,          /* LPAR ID of the SVM */
        uint64_t start_gpa,     /* start guest physical address */
        uint64_t size,          /* size of address range in bytes */
        uint64_t flags          /* reserved for future expansion */
        uint16_t slotid)        /* slot identifier */
返回值

以下值之一:

  • 成功时返回 U_SUCCESS。

  • 如果 lpid 无效,返回 U_PARAMETER。

  • 如果 start_gpa 无效,返回 U_P2。

  • 如果 size 无效,返回 U_P3。

  • 如果 flags 中的任何位无法识别,返回 U_P4。

  • 如果 slotid 参数不受支持,返回 U_P5。

  • 如果从虚拟机管理程序以外的上下文调用,返回 U_PERMISSION。

  • 如果功能不受支持,返回 U_FUNCTION。

描述

为 SVM 注册一个内存范围。该内存范围始于访客物理地址 start_gpa,长度为 size 字节。

用例
  1. 当虚拟机进入安全模式时,由虚拟机管理程序管理的所有内存插槽都会移入安全内存。虚拟机管理程序遍历每个内存插槽,并将插槽注册到 Ultravisor。虚拟机管理程序可能会放弃某些插槽,例如用于固件 (SLOF) 的插槽。

  2. 当热插拔新内存时,会注册一个新的内存插槽。

UV_UNREGISTER_MEM_SLOT

注销之前使用 UV_REGISTER_MEM_SLOT 注册的 SVM 地址范围。

语法
uint64_t ultracall(const uint64_t UV_UNREGISTER_MEM_SLOT,
        uint64_t lpid,          /* LPAR ID of the SVM */
        uint64_t slotid)        /* reservation slotid */
返回值

以下值之一:

  • 成功时返回 U_SUCCESS。

  • 如果功能不受支持,返回 U_FUNCTION。

  • 如果 lpid 无效,返回 U_PARAMETER。

  • 如果 slotid 无效,返回 U_P2。

  • 如果从虚拟机管理程序以外的上下文调用,返回 U_PERMISSION。

描述

释放由 slotid 标识的内存插槽,并释放为该预留分配的所有资源。

用例
  1. 内存热移除。

UV_SVM_TERMINATE

终止 SVM 并释放其资源。

语法
uint64_t ultracall(const uint64_t UV_SVM_TERMINATE,
        uint64_t lpid,          /* LPAR ID of the SVM */)
返回值

以下值之一:

  • 成功时返回 U_SUCCESS。

  • 如果功能不受支持,返回 U_FUNCTION。

  • 如果 lpid 无效,返回 U_PARAMETER。

  • 如果 VM 不安全,返回 U_INVALID。

  • 如果不是从虚拟机管理程序上下文调用,返回 U_PERMISSION。

描述

终止 SVM 并释放其所有资源。

用例
  1. 由虚拟机管理程序在终止 SVM 时调用。

SVM 使用的 Ultracalls

UV_SHARE_PAGE

与虚拟机管理程序共享一组访客物理页。

语法
uint64_t ultracall(const uint64_t UV_SHARE_PAGE,
        uint64_t gfn,   /* guest page frame number */
        uint64_t num)   /* number of pages of size PAGE_SIZE */
返回值

以下值之一:

  • 成功时返回 U_SUCCESS。

  • 如果功能不受支持,返回 U_FUNCTION。

  • 如果 VM 不安全,返回 U_INVALID。

  • 如果 gfn 无效,返回 U_PARAMETER。

  • 如果 num 无效,返回 U_P2。

描述

与虚拟机管理程序共享从访客物理帧编号 gfn 开始的 num 个页。假设页大小为 PAGE_SIZE 字节。在返回前将这些页清零。

如果该地址已有安全页支持,则取消该页映射并在虚拟机管理程序的帮助下用非安全页支持。如果尚未有任何页支持,则将 PTE 标记为非安全,并在访问该地址时用非安全页支持。如果已有非安全页支持,则将页清零并返回。

用例
  1. 虚拟机管理程序无法访问 SVM 页,因为它们由安全页支持。因此,SVM 必须显式向 Ultravisor 请求可以与虚拟机管理程序共享的页面。

  2. 共享页对于支持 SVM 中的 virtio 和虚拟处理器区域 (VPA) 是必需的。

UV_UNSHARE_PAGE

将共享的 SVM 页恢复至其初始状态。

语法
uint64_t ultracall(const uint64_t UV_UNSHARE_PAGE,
        uint64_t gfn,   /* guest page frame number */
        uint73 num)     /* number of pages of size PAGE_SIZE*/
返回值

以下值之一:

  • 成功时返回 U_SUCCESS。

  • 如果功能不受支持,返回 U_FUNCTION。

  • 如果 VM 不安全,返回 U_INVALID。

  • 如果 gfn 无效,返回 U_PARAMETER。

  • 如果 num 无效,返回 U_P2。

描述

停止与虚拟机管理程序共享从 gfn 开始的 num 个页。假设页大小为 PAGE_SIZE。在返回前将这些页清零。

如果该地址已有非安全页支持,则取消该页映射并用安全页支持。通知虚拟机管理程序释放对其共享页的引用。如果该地址尚未有页支持,则将 PTE 标记为安全,并在访问该地址时用安全页支持。如果已有安全页支持,则将页清零并返回。

用例
  1. SVM 可能会决定取消与虚拟机管理程序共享的页面。

UV_UNSHARE_ALL_PAGES

取消 SVM 与虚拟机管理程序共享的所有页面。

语法
uint64_t ultracall(const uint64_t UV_UNSHARE_ALL_PAGES)
返回值

以下值之一:

  • 成功时返回 U_SUCCESS。

  • 如果功能不受支持,返回 U_FUNCTION。

  • 如果 VM 不安全,返回 U_INVAL。

描述

取消与虚拟机管理程序共享的所有共享页。返回时所有取消共享的页都已清零。只有 SVM 显式(使用 UV_SHARE_PAGE ultracall)与虚拟机管理程序共享的页会被取消共享。Ultravisor 可能会在内部根据 SVM 的显式请求与虚拟机管理程序共享一些页面。这些页面不会被此 ultracall 取消共享。

用例
  1. 当使用 kexec 引导不同的内核时需要此调用。在 SVM 重置期间也可能需要。

UV_ESM

使虚拟机安全化(*进入安全模式*)。

语法
uint64_t ultracall(const uint64_t UV_ESM,
        uint64_t esm_blob_addr, /* location of the ESM blob */
        unint64_t fdt)          /* Flattened device tree */
返回值

以下值之一:

  • 成功时返回 U_SUCCESS(包括 VM 已处于安全状态的情况)。

  • 如果功能不受支持,返回 U_FUNCTION。

  • 如果 VM 不安全,返回 U_INVALID。

  • 如果 esm_blob_addr 无效,返回 U_PARAMETER。

  • 如果 fdt 无效,返回 U_P2。

  • 如果任何完整性检查失败,返回 U_PERMISSION。

  • 如果内存不足,无法创建 SVM,返回 U_RETRY。

  • 如果对称密钥不可用,返回 U_NO_KEY。

描述

使虚拟机安全化。成功完成后,在 ESM blob 中指定的地址处将控制权返回给虚拟机。

用例
  1. 普通虚拟机可以选择切换到安全模式。

Hypervisor 调用 API

本文档描述支持 Ultravisor 所需的 Hypervisor 调用 (hypercalls)。Hypercalls 是虚拟机管理程序向虚拟机和 Ultravisor 提供的服务。

这些 hypercalls 的寄存器用法与 Power Architecture 平台参考 (PAPR) 文档中定义的其他 hypercalls 相同。即在输入时,寄存器 R3 标识正在请求的具体服务,寄存器 R4 至 R11 包含 hypercall 的额外参数(如果有)。在输出时,寄存器 R3 包含返回值,寄存器 R4 至 R9 包含 hypercall 的任何其他输出值。

本文档仅涵盖目前为 Ultravisor 使用而实现/计划的 hypercalls,但在合理时可以添加其他调用。

所有 hypercalls/ultracalls 的完整规范最终将在 PAPR 规范的公开/OpenPower 版本中提供。

支持 Ultravisor 的 Hypervisor 调用

以下是支持 Ultravisor 所需的一组 hypercalls。

H_SVM_INIT_START

开始将普通虚拟机转换为 SVM 的过程。

语法
uint64_t hypercall(const uint64_t H_SVM_INIT_START)
返回值

以下值之一:

  • 成功时返回 H_SUCCESS。

  • 如果 VM 未处于可切换到安全状态的位置,返回 H_STATE。

描述

发起安全化虚拟机的过程。这涉及利用 ultracalls 与 Ultravisor 协调,在 Ultravisor 中为新 SVM 分配资源,将 VM 的页面从正常内存转移到安全内存等。该过程完成后,Ultravisor 发出 H_SVM_INIT_DONE hypercall。

用例
  1. Ultravisor 使用此 hypercall 通知虚拟机管理程序:某个 VM 已发起切换到安全模式的过程。

H_SVM_INIT_DONE

完成 SVM 安全化的过程。

语法
uint64_t hypercall(const uint64_t H_SVM_INIT_DONE)
返回值

以下值之一:

  • 成功时返回 H_SUCCESS。

  • 如果从错误的上下文调用(例如从 SVM 调用或在

    H_SVM_INIT_START hypercall 之前调用),返回 H_UNSUPPORTED。

  • 如果虚拟机管理程序无法成功将 VM 转换为

    安全 VM,返回 H_STATE。

描述

完成使虚拟机安全化的过程。此调用必须在之前调用过 H_SVM_INIT_START hypercall 之后进行。

用例

在成功使虚拟机安全化后,Ultravisor 将此消息通知虚拟机管理程序。虚拟机管理程序可以使用此调用来完成该虚拟机内部状态的设置。

H_SVM_INIT_ABORT

中止 SVM 安全化的过程。

语法
uint64_t hypercall(const uint64_t H_SVM_INIT_ABORT)
返回值

以下值之一:

  • 成功清理状态后,虚拟机管理程序将向 **访客 (guest)**

    返回此值,以指示底层的 UV_ESM ultracall 失败。

  • 如果在 VM 已经安全后调用(即 H_SVM_INIT_DONE

    hypercall 成功),返回 H_STATE。

  • 如果从错误的上下文(例如从普通 VM)调用,

    返回 H_UNSUPPORTED。

描述

中止使虚拟机安全化的过程。此调用必须在之前调用过 H_SVM_INIT_START hypercall 之后且在调用 H_SVM_INIT_DONE 之前进行。

进入此 hypercall 时,非易失性 GPR 和 FPR 应包含 VM 发起 UV_ESM ultracall 时的值。此外,SRR0 预期包含 UV_ESM ultracall 之后的指令地址,SRR1 预期包含返回 VM 时所用的 MSR 值。

此 hypercall 将清理自之前的 H_SVM_INIT_START hypercall 以来为 VM 建立的任何部分状态,包括换出已换入安全内存的页面,并发出 UV_SVM_TERMINATE ultracall 以终止 VM。

在部分状态清理后,控制权返回给 VM(**而非 Ultravisor**),返回地址位于 SRR0,MSR 值设置为 SRR1 中的值。

用例

如果在成功调用 H_SVM_INIT_START 之后,Ultravisor 在使虚拟机安全化时由于资源不足或因为 VM 的安全信息无法验证而遇到错误,Ultravisor 将通知虚拟机管理程序。虚拟机管理程序应使用此调用来清理该虚拟机的任何内部状态并返回 VM。

H_SVM_PAGE_IN

将内存页内容从正常内存移动到安全内存。

语法
uint64_t hypercall(const uint64_t H_SVM_PAGE_IN,
        uint64_t guest_pa,      /* guest-physical-address */
        uint64_t flags,         /* flags */
        uint64_t order)         /* page size order */
返回值

以下值之一:

  • 成功时返回 H_SUCCESS。

  • 如果 guest_pa 无效,返回 H_PARAMETER。

  • 如果 flags 无效,返回 H_P2。

  • 如果页面的 order 无效,返回 H_P3。

描述

检索属于位于指定访客物理地址处的 VM 的页内容。

flags 中唯一的有效值:

  • H_PAGE_IN_SHARED:表示该页将与 Ultravisor 共享。

  • H_PAGE_IN_NONSHARED:表示 UV 不再对该页感兴趣。适用于共享页。

order 参数必须对应于配置的页大小。

用例
  1. 当普通 VM 变成安全 VM 时(使用 UV_ESM ultracall),Ultravisor 使用此 hypercall 将 VM 每个页的内容从正常内存移动到安全内存。

  2. Ultravisor 使用此 hypercall 请求虚拟机管理程序提供一个可以在 SVM 和虚拟机管理程序之间共享的正常内存页。

  3. Ultravisor 使用此 hypercall 将一个已换出的页面换入。这会在 SVM 访问已换出页面时发生。

  4. 如果 SVM 想要禁用与虚拟机管理程序的页面共享,它可以通知 Ultravisor。Ultravisor 随后将使用此 hypercall 通知虚拟机管理程序它已释放对正常页的访问权。

H_SVM_PAGE_OUT

将页面内容移动到正常内存。

语法
uint64_t hypercall(const uint64_t H_SVM_PAGE_OUT,
        uint64_t guest_pa,      /* guest-physical-address */
        uint64_t flags,         /* flags (currently none) */
        uint64_t order)         /* page size order */
返回值

以下值之一:

  • 成功时返回 H_SUCCESS。

  • 如果 guest_pa 无效,返回 H_PARAMETER。

  • 如果 flags 无效,返回 H_P2。

  • 如果 order 无效,返回 H_P3。

描述

将由 guest_pa 标识的页面内容移动到正常内存。

目前 flags 未被使用且必须设置为 0。order 参数必须对应于配置的页大小。

用例
  1. 如果 Ultravisor 的安全页不足,它可以使用此 hypercall 将某些安全页的内容移动到正常页中。内容将被加密。

参考文献