HvCallFlushVirtualAddressList hypercall 使属于指定地址空间的虚拟 TLB 部分失效。
接口
HV_STATUS
HvCallFlushVirtualAddressList(
_In_ HV_ADDRESS_SPACE_ID AddressSpace,
_In_ HV_FLUSH_FLAGS Flags,
_In_ UINT64 ProcessorMask,
_Inout_ PUINT32 GvaCount,
_In_reads_(GvaCount) PCHV_GVA GvaRangeList
);
虚拟 TLB 失效操作作用于一个或多个处理器。
如果来宾知道可能需要刷新哪些处理器,则可以指定处理器掩码。 掩码中的每个位对应于一个虚拟处理器索引。 例如,0x0000000000000051掩码指示虚拟机监控程序应仅刷新虚拟处理器 0、4 和 6 的 TLB。
以下标志可用于修改刷新的行为:
- HV_FLUSH_ALL_PROCESSORS指示该操作应应用于分区中的所有虚拟处理器。 如果设置了此标志,则忽略 ProcessorMask 参数。
- HV_FLUSH_ALL_VIRTUAL_ADDRESS_SPACES指示操作应应用于所有虚拟地址空间。 如果设置了此标志,则忽略 AddressSpace 参数。
- HV_FLUSH_NON_GLOBAL_MAPPINGS_ONLY对此调用没有意义,被视为无效选项。
所有其他标志都是保留的,并且必须设置为零。
此调用采用一个标通范围列表。 每个范围都有一个基的GVA。 由于刷新是使用页面粒度执行的,因此可以使用最底部的 12 位来定义范围长度。 这些位对超出范围内初始页) (的其他页数进行编码。 这允许每个条目编码 1 到 4096 页的范围。
属于“大页”映射 (2MB 或 4MB) 的“大页”映射中的一个云图,将导致从虚拟 TLB 刷新整个大页面。
此调用保证在控件返回给调用方的时间之前,所有刷新对指定虚拟处理器的可观测效果都已发生。
无效的 GVA (那些指定超出分区的GVA空间末尾的地址) 将被忽略。
如果目标虚拟处理器的 TLB 需要刷新,并且该虚拟处理器正在阻止 TLB 刷新,则调用方虚拟处理器将挂起。 当不再禁止 TLB 刷新时,虚拟处理器将“取消挂起”,并且将重新发出超all。
调用代码
0x0003 (Rep)
输入参数
| 名称 | Offset | 大小 | 提供的信息 |
|---|---|---|---|
AddressSpace |
0 | 8 | 指定) CR3 值 (地址空间 ID。 |
Flags |
8 | 8 | 修改刷新操作的标志位集。 |
ProcessorMask |
16 | 8 | 指示哪些处理器应受刷新操作影响的处理器掩码。 |
输入列表元素
| 名称 | Offset | 大小 | 提供的信息 |
|---|---|---|---|
GvaRange |
0 | 8 | 军区范围 |