受保护的执行设施¶
简介¶
受保护的执行设施 (PEF) 是 POWER 9 的一项架构更改,可实现安全虚拟机 (SVM)。 DD2.3 芯片 (PVR=0x004e1203) 或更高版本将支持 PEF。 新的 ISA 版本将包含 PEF RFC02487 更改。
启用后,PEF 会向 POWER 架构添加一种新的、更高权限的模式,称为 Ultravisor 模式。 除了新模式之外,还有一种新的固件,称为受保护的执行 Ultravisor(简称 Ultravisor)。 Ultravisor 模式是 POWER 架构中权限最高的模式。
特权状态
问题
Supervisor
Hypervisor
Ultravisor
PEF 保护 SVM 免受 Hypervisor、特权用户和系统中其他 VM 的影响。 SVM 在静止时受到保护,并且只能由授权机器执行。 所有虚拟机都使用 Hypervisor 服务。 Ultravisor 过滤 SVM 和 Hypervisor 之间的调用,以确保信息不会意外泄漏。 除了 H_RANDOM 之外的所有 Hypercall 都会反映到 Hypervisor。 H_RANDOM 不会反映,以防止 Hypervisor 影响 SVM 中的随机值。
为了支持这一点,需要对 CPU 中资源的所有权进行重构。 以前具有 Hypervisor 特权的一些资源现在具有 Ultravisor 特权。
硬件¶
硬件更改包括以下内容
MSR 中有一个新位,用于确定当前进程是否在安全模式下运行,MSR(S) 位 41。 MSR(S)=1,进程处于安全模式,MSR(s)=0,进程处于正常模式。
MSR(S) 位只能由 Ultravisor 设置。
HRFID 不能用于设置 MSR(S) 位。 如果 Hypervisor 需要返回到 SVM,则必须使用 ultracall。 它可以确定它要返回到的 VM 是否安全。
有一个新的 Ultravisor 特权寄存器 SMFCTRL,它有一个启用/禁用位 SMFCTRL(E)。
进程的特权现在由三个 MSR 位确定,MSR(S, HV, PR)。 在下面的每个表中,模式都按从最低特权到最高特权的顺序列出。 较高特权模式可以访问较低特权模式的所有资源。
安全模式 MSR 设置
S
HV
PR
特权
1
0
1
问题
1
0
0
特权(操作系统)
1
1
0
Ultravisor
1
1
1
保留
正常模式 MSR 设置
S
HV
PR
特权
0
0
1
问题
0
0
0
特权(操作系统)
0
1
0
Hypervisor
0
1
1
问题 (Host)
内存被划分为安全内存和正常内存。 只有在安全模式下运行的进程才能访问安全内存。
硬件不允许任何未以安全方式运行的程序访问安全内存。 这意味着 Hypervisor 无法访问 SVM 的内存,除非使用 ultracall(询问 Ultravisor)。 Ultravisor 只允许 Hypervisor 以加密形式查看 SVM 内存。
不允许 I/O 系统直接寻址安全内存。 这将 SVM 限制为仅虚拟 I/O。
该架构允许 SVM 与 Hypervisor 共享未受加密保护的内存页。 但是,此共享必须由 SVM 启动。
当进程在安全模式下运行时,所有 Hypercall(syscall lev=1)都会转到 Ultravisor。
当进程处于安全模式时,所有中断都会转到 Ultravisor。
以下资源已变为 Ultravisor 特权,并且需要 Ultravisor 接口才能进行操作
处理器配置寄存器 (SCOM)。
停止状态信息。
调试寄存器 CIABR、DAWR 和 DAWRX(当设置了 SMFCTRL(D) 时)。 如果未设置 SMFCTRL(D),则它们在安全模式下不起作用。 设置后,读取和写入需要 Ultravisor 调用,否则将导致 Hypervisor 仿真辅助中断。
PTCR 和分区表条目(分区表位于安全内存中)。 尝试写入 PTCR 将导致 Hypervisor 仿真辅助中断。
LDBAR(LD 基址寄存器)和 IMC(内存集合)非架构寄存器。 尝试写入它们将导致 Hypervisor 仿真辅助中断。
SVM 的分页,与 Hypervisor 共享 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 的状态,并将中断反映到 Hypervisor 以进行处理。 对于 Hypercall,Ultravisor 会将中性状态插入到所有不需要用于 Hypercall 的寄存器中,然后将调用反映到 Hypervisor 以进行处理。 H_RANDOM Hypercall 由 Ultravisor 执行,而不是反映。
为了使虚拟 I/O 工作,必须进行跳转缓冲。
Ultravisor 使用 AES (IAPM) 来保护 SVM 内存。 IAPM 是一种 AES 模式,可同时提供完整性和保密性。
正常页面和安全页面之间的数据移动由 Hypervisor 中的新 HMM 插件与 Ultravisor 协调。
Ultravisor 为 Hypervisor 和 SVM 提供新服务。 这些服务通过 ultracall 访问。
术语¶
Hypercall:用于从 Hypervisor 请求服务的特殊系统调用。
正常内存:Hypervisor 可以访问的内存。
正常页面:由正常内存支持的页面,Hypervisor 可以使用。
共享页面:由正常内存支持的页面,Hypervisor/QEMU 和 SVM 都可以使用(即,页面在 SVM 和 Hypervisor/QEMU 中都有映射)。
安全内存:只有 Ultravisor 和 SVM 才能访问的内存。
安全页面:由安全内存支持的页面,只有 Ultravisor 和 SVM 可以使用。
SVM:安全虚拟机。
Ultracall:用于从 Ultravisor 请求服务的特殊系统调用。
Ultravisor 调用 API¶
本节介绍支持安全虚拟机 (SVM) 和半虚拟化 KVM 所需的 Ultravisor 调用 (ultracall)。 ultracall 允许 SVM 和 Hypervisor 从 Ultravisor 请求服务,例如访问只能在 Ultravisor 特权模式下运行的寄存器或内存区域。
来自 ultracall 的特定服务需要在寄存器 R3 中指定(ultracall 的第一个参数)。 如果有任何其他参数,则在寄存器 R4 到 R12 中指定。
所有 ultracall 的返回值都在寄存器 R3 中。 来自 ultracall 的其他输出值(如果有)在寄存器 R4 到 R12 中返回。 此寄存器使用的唯一例外是下面描述的
UV_RETURN
ultracall。每个 ultracall 都返回特定的错误代码,这些代码适用于 ultracall 的上下文中。 但是,与 PowerPC 架构平台参考 (PAPR) 一样,如果没有为特定情况定义特定的错误代码,则 ultracall 将回退到基于错误参数位置的代码。 即,U_PARAMETER、U_P2、U_P3 等,具体取决于可能导致错误的 ultracall 参数。
一些 ultracall 涉及在 Ultravisor 和 Hypervisor 之间传输数据页。 从安全内存传输到正常内存的安全页面可以使用动态生成的密钥进行加密。 当安全页面传输回安全内存时,可以使用相同的动态生成的密钥对其进行解密。 这些密钥的生成和管理将在单独的文档中介绍。
目前,这仅涵盖 Hypervisor 和 SVM 当前实现和正在使用的 ultracall,但可以在有意义时在此处添加其他 ultracall。
所有 Hypercall/Ultracall 的完整规范最终将在 PAPR 规范的公共/OpenPower 版本中提供。
注意
如果未启用 PEF,ultracall 将重定向到 Hypervisor,后者必须处理/使调用失败。
Hypervisor 使用的 Ultracall¶
本节介绍 Hypervisor 用来管理 SVM 的虚拟内存管理 ultracall。
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。
描述¶
加密安全页面的内容,并使其在正常页面中可供 Hypervisor 使用。
默认情况下,源页面从 SVM 的分区范围的页面表中取消映射。 但是,Hypervisor 可以通过在
flags
参数中设置UV_SNAPSHOT
标志,向 Ultravisor 提供提示以保留页面映射。如果源页面已经是共享页面,则该调用将返回 U_SUCCESS,而不执行任何操作。
用例¶
QEMU 尝试访问属于 SVM 的地址,但是该地址的页面帧未映射到 QEMU 的地址空间中。 在这种情况下,Hypervisor 将分配一个页面帧,将其映射到 QEMU 的地址空间中,并发出
UV_PAGE_OUT
调用以检索页面的加密内容。当 Ultravisor 的安全内存不足并且需要调出 LRU 页面时。 在这种情况下,Ultravisor 将向 Hypervisor 发出
H_SVM_PAGE_OUT
Hypercall。 然后,Hypervisor 将分配一个正常页面并发出UV_PAGE_OUT
ultracall,并且 Ultravisor 将加密安全页面的内容并将其移动到正常页面中。当 Hypervisor 访问 SVM 数据时,Hypervisor 请求 Ultravisor 将相应的页面传输到非安全页面中,Hypervisor 可以访问该页面。 但是,正常页面中的数据将被加密。
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
Hypervisor 必须在发出
UV_PAGE_IN
ultracall 之前将页面固定在内存中。
用例¶
当正常 VM 切换到安全模式时,其驻留在正常内存中的所有页面都会移动到安全内存中。
当 SVM 请求与 Hypervisor 共享页面时,Hypervisor 会分配一个页面并通知 Ultravisor。
当 SVM 访问已调出的安全页面时,Ultravisor 会调用 Hypervisor 以定位该页面。 在定位该页面后,Hypervisor 使用 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,Hypervisor 中对应于给定客户物理地址的页面映射已无效,并且 Ultravisor 不应访问该页面。 如果指定的
guest_pa
对应于安全页面,则 Ultravisor 将忽略使页面无效的尝试,并返回 U_P2。
用例¶
当从 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。
- 如果 Hypervisor 尝试更改安全虚拟机的 PATE,或者从 Hypervisor 以外的上下文中调用,则返回 U_PERMISSION。
从 Hypervisor 以外的上下文调用。
描述¶
验证并写入给定 LPID 的 LPID 及其分区表条目。 如果已分配和初始化 LPID,则此调用将导致更改分区表条目。
用例¶
分区表驻留在安全内存中,其条目(称为 PATE(分区表条目))指向 Hypervisor 以及每个虚拟机(安全和正常)的分区范围的页面表。 Hypervisor 在分区 0 中运行,其分区范围的页面表驻留在正常内存中。
此 ultracall 允许 Hypervisor 向 Ultravisor 注册 Hypervisor 和其他分区(虚拟机)的分区范围和进程范围的页面表条目。
如果现有分区 (VM) 的 PATE 值更改,则会刷新该分区的 TLB 缓存。
Hypervisor 负责分配 LPID。 LPID 及其 PATE 条目一起注册。 Hypervisor 管理正常 VM 的 PATE 条目,并且可以随时更改 PATE 条目。 Ultravisor 管理 SVM 的 PATE 条目,并且不允许 Hypervisor 修改它们。
UV_RETURN¶
在处理完已转发(也称为反射)到 Hypervisor 的 Hypercall 或中断后,将控制权从 Hypervisor 返回给 Ultravisor。
语法¶
uint64_t ultracall(const uint64_t UV_RETURN)
返回值¶
成功后,此调用永远不会返回到 Hypervisor。 如果 ultracall 不是从 Hypervisor 上下文进行的,则返回 U_INVALID。
描述¶
当 SVM 进行 Hypercall 或发生其他异常时,Ultravisor 通常会将异常转发(也称为反射)到 Hypervisor。 在处理完异常后,Hypervisor 使用
UV_RETURN
ultracall 将控制权返回给 SVM。此 ultracall 的入口处的预期寄存器状态为
非易失性寄存器恢复为其原始值。
如果从 Hypercall 返回,则寄存器 R0 包含返回值(与其他 ultracall 不同),并且寄存器 R4 到 R12 包含 Hypercall 的任何输出值。
R3 包含 ultracall 编号,即 UV_RETURN。
如果返回合成中断,则 R2 包含合成中断编号。
用例¶
Ultravisor 依赖 Hypervisor 为 SVM 提供多项服务,例如处理 Hypercall 和其他异常。 在处理完异常后,Hypervisor 使用 UV_RETURN 将控制权返回给 Ultravisor。
Hypervisor 必须使用此 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。如果从 Hypervisor 以外的上下文中调用,则返回 U_PERMISSION。
如果不支持该功能,则返回 U_FUNCTION。
描述¶
注册 SVM 的内存范围。 内存范围从客户物理地址
start_gpa
开始,长度为size
字节。
用例¶
当虚拟机变为安全虚拟机时,Hypervisor 管理的所有内存插槽都会移动到安全内存中。 Hypervisor 会迭代每个内存插槽,并使用 Ultravisor 注册该插槽。 Hypervisor 可能会丢弃一些插槽,例如用于固件的插槽 (SLOF)。
当热插拔新内存时,会注册新的内存插槽。
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。如果从 Hypervisor 以外的上下文中调用,则返回 U_PERMISSION。
描述¶
释放由
slotid
标识的内存槽,并释放为预留分配的任何资源。
用例¶
内存热移除。
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。
如果不是从 Hypervisor 上下文中调用,则返回 U_PERMISSION。
描述¶
终止 SVM 并释放其所有资源。
用例¶
由 Hypervisor 在终止 SVM 时调用。
SVM 使用的 Ultracall¶
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。
U_RETRY:内存不足,无法创建 SVM。
U_NO_KEY:对称密钥不可用。
描述¶
保护虚拟机。 成功完成后,将控制权返回给 ESM blob 中指定的地址处的虚拟机。
用例¶
普通的虚拟机可以选择切换到安全模式。
Hypervisor 调用 API¶
本文档描述了支持 Ultravisor 所需的 Hypervisor 调用(hypercall)。 Hypercall 是 Hypervisor 向虚拟机和 Ultravisor 提供的服务。
这些 hypercall 的寄存器用法与其他 Power Architecture Platform Reference (PAPR) 文档中定义的 hypercall 相同。 即,在输入时,寄存器 R3 标识所请求的特定服务,寄存器 R4 到 R11 包含 hypercall 的附加参数(如果有)。 在输出时,寄存器 R3 包含返回值,寄存器 R4 到 R9 包含 hypercall 的任何其他输出值。
本文档仅涵盖当前为 Ultravisor 用途实现/计划的 hypercall,但如果合理,可以在此处添加其他 hypercall。
所有 Hypercall/Ultracall 的完整规范最终将在 PAPR 规范的公共/OpenPower 版本中提供。
支持 Ultravisor 的 Hypervisor 调用¶
以下是支持 Ultravisor 所需的一组 hypercall。
H_SVM_INIT_START¶
开始将普通虚拟机转换为 SVM 的过程。
语法¶
uint64_t hypercall(const uint64_t H_SVM_INIT_START)
返回值¶
以下值之一
成功时返回 H_SUCCESS。
如果 VM 不处于切换到安全状态的位置,则返回 H_STATE。
描述¶
启动保护虚拟机的过程。 这涉及与 Ultravisor 协调,使用 ultracall 在 Ultravisor 中为新的 SVM 分配资源,将 VM 的页面从普通内存传输到安全内存等。 完成该过程后,Ultravisor 发出 H_SVM_INIT_DONE hypercall。
用例¶
Ultravisor 使用此 hypercall 通知 Hypervisor 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。
- 如果 hypervisor 无法成功
将 VM 转换为安全 VM,则返回 H_STATE。
描述¶
完成保护虚拟机的过程。 必须在先前调用
H_SVM_INIT_START
hypercall 之后进行此调用。
用例¶
成功保护虚拟机后,Ultravisor 会通知 Hypervisor。 Hypervisor 可以使用此调用来完成为此虚拟机设置其内部状态。
H_SVM_INIT_ABORT¶
中止保护 SVM 的过程。
语法¶
uint64_t hypercall(const uint64_t H_SVM_INIT_ABORT)
返回值¶
以下值之一
- 成功清理状态后,
Hypervisor 将向**访客**返回此值,以指示底层的 UV_ESM ultracall 失败。
- 如果在 VM 进入安全状态后调用,则返回 H_STATE(即
H_SVM_INIT_DONE hypercall 成功)。
- 如果从错误的上下文中调用(例如,从
普通的 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 都会通知 Hypervisor。 Hypervisor 应该使用此调用来清理此虚拟机的任何内部状态并返回到 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
参数必须与配置的页面大小相对应。
用例¶
当普通 VM 成为安全 VM(使用 UV_ESM ultracall)时,Ultravisor 使用此 hypercall 将 VM 的每个页面的内容从普通内存移动到安全内存。
Ultravisor 使用此 hypercall 要求 Hypervisor 提供普通内存中的页面,该页面可以在 SVM 和 Hypervisor 之间共享。
Ultravisor 使用此 hypercall 来分页调入分页调出的页面。 当 SVM 访问分页调出的页面时,可能会发生这种情况。
如果 SVM 想要禁用与 Hypervisor 的页面共享,它可以通知 Ultravisor。 Ultravisor 然后将使用此 hypercall 并通知 Hypervisor 它已释放对普通页面的访问权限。
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
参数必须与配置的页面大小相对应。
用例¶
如果 Ultravisor 的安全页面不足,它可以使用此 hypercall 将一些安全页面的内容移动到普通页面。 内容将被加密。