INVPCID

无效进程- 文本标识符

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
66 0F 38 82 /rINVPCID r32, m128RM不可编码有效将 TLBs 中的条目和基于 r32 中的无效类型和 m128 中的 descrip- tor 的 page- 结构缓存无效 。
66 0F 38 82 /rINVPCID r64, m128RM有效不可编码将 TLBs 中的条目和基于 r64 中的无效类型和 m128 中的 descrip- tor 的 page- 结构缓存无效 。

操作数编码

每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。

RM

  1. modrm.reg lecturaModRM 字节的 reg 字段(第 5-3 位)
  2. modrm.rm lecturaModRM 字节的 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 描述符中指定的 PCID 关联的全局翻译。 在某些情况下,该指示也可能使其他PCID的全球翻译或绘图无效。

所有绘图 - 包括全局翻译 - 与任何 PCID 相关。

与任何 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 描述符

  1. 联合国 如果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.

来源