background image

Vol. 3C 30-7

VMX INSTRUCTION REFERENCE

Operation

IF (not in VMX operation) or (CR0.PE = 0) or (RFLAGS.VM = 1) or (IA32_EFER.LMA = 1 and CS.L = 0)

THEN #UD;

ELSIF in VMX non-root operation

THEN VM exit;

ELSIF CPL

>

 0

THEN #GP(0);
ELSE

INVVPID_TYPE ← value of register operand;

IF IA32_VMX_EPT_VPID_CAP MSR indicates that processor does not support
INVVPID_TYPE

THEN VMfail(Invalid operand to INVEPT/INVVPID);
ELSE

// INVVPID_TYPE must be in the range 0–3

INVVPID_DESC ← value of memory operand;

IF INVVPID_DESC[63:16] ≠ 0

THEN VMfail(Invalid operand to INVEPT/INVVPID);
ELSE

CASE INVVPID_TYPE OF

0:

// individual-address invalidation

VPID ← INVVPID_DESC[15:0];

IF VPID = 0

THEN VMfail(Invalid operand to INVEPT/INVVPID);
ELSE

GL_ADDR ← INVVPID_DESC[127:64];

IF (GL_ADDR is not in a canonical form)

THEN

VMfail(Invalid operand to INVEPT/INVVPID);

ELSE

Invalidate mappings for GL_ADDR tagged with VPID;
VMsucceed;

FI;

FI;
BREAK;

1:

// single-context invalidation

VPID ← INVVPID_DESC[15:0];

IF VPID = 0

THEN VMfail(Invalid operand to INVEPT/INVVPID);
ELSE

Invalidate all mappings tagged with VPID;
VMsucceed;

FI;
BREAK;

2:

// all-context invalidation

Invalidate all mappings tagged with all non-zero VPIDs;
VMsucceed;
BREAK;

3:

// single-context invalidation retaining globals

VPID ← INVVPID_DESC[15:0];

IF VPID = 0

THEN VMfail(Invalid operand to INVEPT/INVVPID);
ELSE

Invalidate all mappings tagged with VPID except global translations;
VMsucceed;