INVPCID
无效进程- 文本标识符
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
66 0F 38 82 /r | INVPCID r32, m128 | RM | 不可编码 | 有效 | 将 TLBs 中的条目和基于 r32 中的无效类型和 m128 中的 descrip- tor 的 page- 结构缓存无效 。 |
66 0F 38 82 /r | INVPCID r64, m128 | RM | 有效 | 不可编码 | 将 TLBs 中的条目和基于 r64 中的无效类型和 m128 中的 descrip- tor 的 page- 结构缓存无效 。 |
操作数编码
每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。
RM
modrm.reglecturaModRM 字节的 reg 字段(第 5-3 位)modrm.rmlecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移
实测开销
正在从 arch-data 加载实测数据...
说明
在翻译的外观边缓冲器(TLBs)和基于进程文本标识符(PCID)的 page-结构缓存中将映射无效. (参见第5.10节,"Caching transformation Intel 64和IA-32 Architecture Software's Handory,Volume 3A.) 无效化是基于寄存器操作中指定的INVPCID类型和内存操作中指定的INVPCID描述符.
在64位模式外,寄存器操作数总是32位,无论CS.D的值如何. 在64位模式下,寄存器操作数有64位.
目前定义的INVPCID类型有四种:
- 个人地址无效 : 如果 INVPCID 类型为 0,则逻辑处理器将线性地址的映射-除全局翻译-和 INVPCID 描述符中指定的 PCID 无效。 1 在某些情况下,该指令也可能使其他线性地址(或其他PCID)的全局翻译或映射无效。
- 单文本无效 : 如果 INVPCID 类型是 1, 逻辑处理器将所有映射无效 - 例外
与 INVPCID 描述符中指定的 PCID 关联的全局翻译。 在某些情况下,该指示也可能使其他PCID的全球翻译或绘图无效。
- 全文本无效, 包括全局翻译 : 如果 INVPCID 类型为 2, 逻辑处理器无效
所有绘图 - 包括全局翻译 - 与任何 PCID 相关。
- 全文本无效 : 如果 INVPCID 类型为 3, 逻辑处理器将所有映射无效 - 环球除外
与任何 PCID 相关的翻译。 在某些情况下,该指示也可能使全球翻译无效。
INVPCID描述符包含128位元,包含一个PCID和一个线性地址,如图3-20所示. 对于INVPCID类型0,处理器甚至使用64位模式外的全64位线性地址;线性地址不用于其他INVPCID类型.
127 64 63 12 11 0 Linear Address Reserved (must be zero) PCID图3-20. INVPCID 描述符
- 联合国 如果page结构使用大于4 KBytes的页面映射线性地址,且该页面有多个TLB条目(见第5.10.2.3节,"TLB使用的细节",Intel(R)64和IA-32架构软件开发者手册第3A卷),则指令将所有条目无效.
如果 CR4.PCIDE = 0,则逻辑处理器不会缓存除 000H 以外的任何 PCID 信息. 在这种情况下,
处决INVPCID类型 0 和 1 只有在PCID定义INVPCID描述符是000H;
使用 INVPCID 类型 2 和 3 无效映射 PCID 000H 执行. 注意CR4.PCIDE必须是IA-32e模式外的0(见第5.10.1节,Intel(R)64和IA-32 Archi-)的"Process-Context Identifiers (PCIDs)".
构造软件开发者手册,第3A卷。
行动
INVPCID_TYPE := value of register operand; // must be in the range of 03
INVPCID_DESC := value of memory operand;
CASE INVPCID_TYPE OF
0: // individual-address invalidation
PCID := INVPCID_DESC[11:0];
L_ADDR := INVPCID_DESC[127:64];
Invalidate mappings for L_ADDR associated with PCID except global translations;
BREAK;
1: // single PCID invalidation
PCID := INVPCID_DESC[11:0];
Invalidate all mappings associated with PCID except global translations;
BREAK;
2: // all PCID invalidation including global translations
Invalidate all mappings for all PCIDs, including global translations;
BREAK;
3: // all PCID invalidation retaining global translations
Invalidate all mappings for all PCIDs except global translations;
BREAK;
ESAC;Intel C/C++ 内在编译器
INVPCID void _invpcid(unsigned __int32 type, void * descriptor);SIMD 浮点 例外
None.
异常
保护模式
#GP(0) | 如果当前特权级别不是 0. 如果内存运行有效地址不在 CS, DS, ES, FS, 或 GS 分区限制之外。 如果 DS, ES, FS, 或 GS 寄存器包含一个无法使用的分区。 如果源代码运行位于一个只执行的代码分区中。 如果在寄存器运行中指定了一个无效类型, 即 INVPCID TYPE > 3. 如果 INVPCID DESC的63: 12 位不是全部为零 。 如果 INVPCID TYPE为 0 或 1 或 INVPCID DESC [11: 0] , 则不是零 。 如果 INVPCID TYPE为 0 , 而 INVPCID DESC [127: 64] 中的线性地址不可用 。 #PF(fault-code) 如果访问内存运行时发生页错误 。 |
#SS(0) | 如果 内存操作数 有效地址在 SS 段限制之外。如果 SS 寄存器包含一个无法使用的段。 #UDIf 如果 CPUID.07H.00H: EBX.INVPCID[10] = 0。如果使用 LOCK 前缀 。 |
实地址模式
#GP | 如果在寄存器中指定了无效类型 操作数, 即 INVPCID TYPE > 3. 如果INVPCID DESC中的位数63:12不是全部为零。 如果INVPCID TYPE是0或1, INVPCID DESC [11: 0] 则不是零。 如果INVPCID TYPE是0, INVPCID DESC [127:64] 中的线性地址不是零。 |
#UD | 如果 CPUID.07H.00H: EBX.INVPCID[10] = 0. 如果使用 LOCK 前缀. |
虚拟 8086 模式
#GP(0) | INVPCID指令在虚拟 8086 模式中不被识别. |
兼容模式
| 与保护模式中的例外相同. |
64 位模式
#GP(0) | 如果当前特权级别不是 0. 如果 内存操作数 在 CS, DS, ES, FS, 或 GS 片段中, 内存地址是非冠状的。 如果在寄存器中指定了无效类型 操作数, 即 INVPCID TYPE > 3. 如果 INVPCID DESC中的位数 63: 12 并非全部为 0, 如果 CR4.PCIDE= 0, INVPCID TYPE 是 0 或 1, INVPCID DESC [11: 0] 则不是0。 如果 INVPCID TYPE是 0, INVPCID DESC [127: 64] 中的线性地址不是冠状的。 #PF(fault-code) 如果 页面错误在访问 内存操作数时发生的话。 |
#SS(0) | 如果内存目标操作数位于SS段,内存地址为非卡通形式. |
#UD | 如果使用 LOCK 前缀。如果 CPUID.07H.00H: EBX.INVPCID[10] = 0. |