# VMCLEAR — Clear Virtual-Machine Control Structure

Opcode/Instruction | Op/En | Description
--- | --- | ---
66 0F C7 /6 VMCLEAR m64 | M | Copy VMCS data to VMCS region in memory.

## Instruction Operand Encoding ¶

Op/En | Operand 1 | Operand 2 | Operand 3 | Operand 4
M | ModRM:r/m (r) | NA | NA | NA

## Description ¶

This instruction applies to the VMCS whose VMCS region resides at the physical address contained in the instruction operand. The instruction ensures that VMCS data for that VMCS (some of these data may be currently maintained on the processor) are copied to the VMCS region in memory. It also initializes parts of the VMCS region (for example, it sets the launch state of that VMCS to clear). See Chapter 25, “Virtual Machine Control Structures.”

The operand of this instruction is always 64 bits and is always in memory. If the operand is the current-VMCS pointer, then that pointer is made invalid (set to FFFFFFFF_FFFFFFFFH).

Note that the VMCLEAR instruction might not explicitly write any VMCS data to memory; the data may be already resident in memory before the VMCLEAR is executed.

## Operation ¶

    IF (register operand) or (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
            addr := contents of 64-bit in-memory operand;
            IF addr is not 4KB-aligned OR
            addr sets any bits beyond the physical-address width1
                THEN VMfail(VMCLEAR with invalid physical address);
            ELSIF addr = VMXON pointer
                THEN VMfail(VMCLEAR with VMXON pointer);
                ELSE
                    ensure that data for VMCS referenced by the operand is in memory;
                    initialize implementation-specific data in VMCS region;
                    launch state of VMCS referenced by the operand := “clear”
                    IF operand addr = current-VMCS pointer
                        THEN current-VMCS pointer := FFFFFFFF_FFFFFFFFH;
                    FI;
                    VMsucceed;
            FI;
    FI;

> 1. If IA32_VMX_BASIC[48] is read as 1, VMfail occurs if addr sets any bits in the range 63:32; see Appendix A.1.

## Flags Affected ¶

See the operation section and Section 31.2.

## Protected Mode Exceptions ¶

#GP(0) | If the current privilege level is not 0.
If the memory operand effective address is outside the CS, DS, ES, FS, or GS segment limit.
If the DS, ES, FS, or GS register contains an unusable segment.
If the operand is located in an execute-only code segment.
#PF(fault-code) | If a page fault occurs in accessing the memory operand.
#SS(0) | If the memory operand effective address is outside the SS segment limit.
If the SS register contains an unusable segment.
#UD | If operand is a register.
If not in VMX operation.

## Real-Address Mode Exceptions ¶

#UD | The VMCLEAR instruction is not recognized in real-address mode.

## Virtual-8086 Mode Exceptions ¶

#UD | The VMCLEAR instruction is not recognized in virtual-8086 mode.

## Compatibility Mode Exceptions ¶

#UD | The VMCLEAR instruction is not recognized in compatibility mode.

## 64-Bit Mode Exceptions ¶

#GP(0) | If the current privilege level is not 0.
If the source operand is in the CS, DS, ES, FS, or GS segments and the memory address is in a non-canonical form.
#PF(fault-code) | If a page fault occurs in accessing the memory operand.
#SS(0) | If the source operand is in the SS segment and the memory address is in a non-canonical form.
#UD | If operand is a register.
If not in VMX operation.