background image

13-4 Vol. 1

MANAGING STATE USING THE XSAVE FEATURE SET

— CPUID function 0DH, sub-function i (i > 1). This sub-function enumerates details for state component i. If 

the XSAVE feature set supports state component i (see note above), the following items provide specific 
details:

EAX enumerates the size (in bytes) required for state component i.

If state component i is a user state component, EBX enumerates the offset (in bytes, from the base of 
the XSAVE area) of the section used for state component i. (This offset applies only when the standard 
format for the extended region of the XSAVE area is being used; see Section 13.4.3.)

If state component i is a supervisor state component, EBX returns 0.

If state component i is a user state component, ECX[0] return 0; if state component i is a supervisor 
state component, ECX[0] returns 1.

The value returned by ECX[1] indicates the alignment of state component i when the compacted format 
of the extended region of an XSAVE area is used (see Section 13.4.3). If ECX[1] returns 0, state 
component i is located immediately following the preceding state component; if ECX[1] returns 1, state 
component i is located on the next 64-byte boundary following the preceding state component.

ECX[31:2] and EDX return 0.

If the XSAVE feature set does not support state component i, sub-function i returns 0 in EAX, EBX, ECX, and 
EDX.

13.3 

ENABLING THE XSAVE FEATURE SET AND XSAVE-ENABLED FEATURES

Software enables the XSAVE feature set by setting CR4.OSXSAVE[bit 18] to 1 (e.g., with the MOV to CR4 instruc-
tion). If this bit is 0, execution of any of XGETBV, XRSTOR, XRSTORS, XSAVE, XSAVEC, XSAVEOPT, XSAVES, and 
XSETBV causes an invalid-opcode exception (#UD).
When CR4.OSXSAVE = 1 and CPL = 0, executing the XSETBV instruction with ECX = 0 writes the 64-bit value in 
EDX:EAX to XCR0 (EAX is written to XCR0[31:0] and EDX to XCR0[63:32]). (Execution of the XSETBV instruction 
causes a general-protection fault — #GP — if CPL > 0.) The following items provide details regarding individual bits 
in XCR0:

XCR0[0] is associated with x87 state (see Section 13.5.1). XCR0[0] is always 1. It has that value coming out of 
RESET. Executing the XSETBV instruction causes a general-protection fault (#GP) if ECX = 0 and EAX[0] is 0.

XCR0[1] is associated with SSE state (see Section 13.5.2). Software can use the XSAVE feature set to manage 
SSE state only if XCR0[1] = 1. The value of XCR0[1] in no way determines whether software can execute SSE 
instructions (these instructions can be executed even if XCR0[1] = 0).
XCR0[1] is 0 coming out of RESET. As noted in Section 13.2, every processor that supports the XSAVE feature 
set allows software to set XCR0[1].

XCR0[2] is associated with AVX state (see Section 13.5.3). Software can use the XSAVE feature set to manage 
AVX state only if XCR0[2] = 1. In addition, software can execute AVX instructions only if CR4.OSXSAVE = 
XCR0[2] = 1. Otherwise, any execution of an AVX instruction causes an invalid-opcode exception (#UD).
XCR0[2] is 0 coming out of RESET. As noted in Section 13.2, a processor allows software to set XCR0[2] if and 
only if CPUID.(EAX=0DH,ECX=0):EAX[2] = 1. In addition, executing the XSETBV instruction causes a general-
protection fault (#GP) if ECX = 0 and EAX[2:1] has the value 10b; that is, software cannot enable the XSAVE 
feature set for AVX state but not for SSE state.
As noted in Section 13.1, the processor will preserve AVX state unmodified if software clears XCR0[2]. 
However, clearing XCR0[2] while AVX state is not in its initial configuration may cause SSE instructions to incur 
a power and performance penalty. See Section 13.5.3, “Enable the Use Of XSAVE Feature Set And XSAVE State 
Components”
 of Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 3A, for how system 
software can avoid this penalty.

XCR0[4:3] are associated with MPX state (see Section 13.5.4). Software can use the XSAVE feature set to 
manage MPX state only if XCR0[4:3] = 11b. In addition, software can execute MPX instructions only if 
CR4.OSXSAVE = 1 and XCR0[4:3] = 11b. Otherwise, any execution of an MPX instruction causes an invalid-
opcode exception (#UD).

1