XRSTOR

Restaurar los Estados Extendidos

estableVMJITAOTinstruccion

Codificaciones

OpcodeInstruccionOp/En64 bitsCompat/LegacyDescripcion
NP 0F AE /5XRSTOR memMValidoValidoRestaurar componentes del estado especificados por EDX:EAX de mem.
NP REX.W + 0F AE /5XRSTOR64 memMValidoNo codificableRestaurar componentes del estado especificados por EDX:EAX de mem.

Codificacion de operandos

Cada modo es un valor de la columna Op/En de arriba. Dice en que campo de la instruccion codificada va cada operando, en el orden en que se escriben, y si la instruccion lo lee, lo escribe o ambas cosas.

M

  1. modrm.rm lecturabyte ModRM, campo r/m (bits 2-0); con el byte SIB y el desplazamiento cuando el campo mod los pide

Coste medido

Cargando las mediciones de arch-data...

Descripción

Realiza una restauración total o parcial de los componentes del estado procesador de la zona XSAVE ubicada en la dirección de memoria especificada por el operando de origen. El par de registro implícito EDX:EAX especifica una máscara de instrucciones de 64 bits. Los componentes de estado específicos restaurados corresponden a los bits establecidos en el bitmap de la alimentación solicitada (RFBM), que es el lógico-AND de EDX:EAX y XCR0.

El formato del área XSAVE se detalla en la Sección 13.4, "XSAVE Area", de Intel(R) 64 e IA-32 Architectures Software Developer's Manual, Volumen 1. Como FXRSTOR y FXSAVE, el formato de memoria utilizado para el estado x87 depende de un prefijo REX.W; ver Sección 13.5.1, "x87 Estado" de Intel(R) 64 e IA-32 Architectures Software Developer's Manual, Volumen 1.

Sección 13.8, "Operación de XRSTOR", de Intel(R) 64 e IA-32 Architectures Software Developer's Manual, Volumen 1 proporciona una descripción detallada del funcionamiento de la instrucción XRSTOR. Los siguientes temas proporcionan un esbozo de alto nivel:

El encabezado XSAVE determina qué forma se utiliza: valor 0 especifica la forma estándar, mientras que el valor 1 especifica la forma compactada.

component i.

XMM se registra. Si se trata de cargar MXCSR con un valor ilegal, una excepción de protección general (#GP) ocurre.

XSAVEOPT or XSAVES.

componente estatal i para el cual RFBM[i] = 1 y XSTATE BV[i] = 1; rastrea como modificado cualquier componente estatal i para el cual RFBM[i] = 0.

El uso de un operando de origen no alineado a los límites de 64 bits (para modos de 64 bits y 32 bits) resulta en una excepción de protección general (#GP). En modo de 64 bits, se ignoran los 32 bits superiores de RDX y RAX.

Véase Sección 13.6, "Processor Tracking ofXSAVE-Managed State", de Intel(R) 64 e IA-32 Architectures Software Developer's Manual, Volumen 1 para la discusión de los bitmapsXINUSEyXMODIFIEDy de la cantidad XRSTOR INFO.

  1. Hay una excepción si RFBM[1] = 0 y RFBM[2] = 1. En este caso, la forma estándar de XRSTOR cargará MXCSR de memoria, aunque MXCSR es parte del componente estatal 1 - SSE. La forma compactada de XRSTOR no hace esta excepción.

Operación

RFBM := XCR0 AND EDX:EAX; /* bitwise logical AND */
COMPMASK := XCOMP_BV field from XSAVE header;
RSTORMASK := XSTATE_BV field from XSAVE header;

IF COMPMASK[63] = 0
    THEN
          /* Standard form of XRSTOR */
          TO_BE_RESTORED := RFBM AND RSTORMASK;
          TO_BE_INITIALIZED := RFBM AND NOT RSTORMASK;

          IF TO_BE_RESTORED[0] = 1
                THEN
                       XINUSE[0] := 1;
                       load x87 state from legacy region of XSAVE area;

          ELSIF TO_BE_INITIALIZED[0] = 1
                THEN
                       XINUSE[0] := 0;
                       initialize x87 state;

          FI;

          IF RFBM[1] = 1 OR RFBM[2] = 1
                THEN load MXCSR from legacy region of XSAVE area;

          FI;

          IF TO_BE_RESTORED[1] = 1
                THEN
                       XINUSE[1] := 1;
                       load XMM registers from legacy region of XSAVE area; // this step does not load MXCSR

          ELSIF TO_BE_INITIALIZED[1] = 1
                THEN
                       XINUSE[1] := 0;
                       set all XMM registers to 0; // this step does not initialize MXCSR

          FI;

          FOR i := 2 TO 62
                IF TO_BE_RESTORED[i] = 1
                       THEN
                             XINUSE[i] := 1;
                             load XSAVE state component i at offset n from base of XSAVE area;
                                   // n enumerated by CPUID.0DH.i:EBX)
                ELSIF TO_BE_INITIALIZED[i] = 1
                       THEN
                             XINUSE[i] := 0;
                             initialize XSAVE state component i;
                FI;

          ENDFOR;

    ELSE
          /* Compacted form of XRSTOR */
          IF CPUID.0DH.01H:EAX.XSAVEC[1] = 0
                THEN /* compacted form not supported */
                       #GP(0);
          FI;


     FORMAT = COMPMASK AND 7FFFFFFF_FFFFFFFFH;
     RESTORE_FEATURES = FORMAT AND RFBM;
     TO_BE_RESTORED := RESTORE_FEATURES AND RSTORMASK;
     FORCE_INIT := RFBM AND NOT FORMAT;
     TO_BE_INITIALIZED = (RFBM AND NOT RSTORMASK) OR FORCE_INIT;

     IF TO_BE_RESTORED[0] = 1
           THEN
                 XINUSE[0] := 1;
                 load x87 state from legacy region of XSAVE area;

     ELSIF TO_BE_INITIALIZED[0] = 1
           THEN
                 XINUSE[0] := 0;
                 initialize x87 state;

     FI;

     IF TO_BE_RESTORED[1] = 1
           THEN
                 XINUSE[1] := 1;
                 load SSE state from legacy region of XSAVE area; // this step loads the XMM registers and MXCSR

     ELSIF TO_BE_INITIALIZED[1] = 1
           THEN
                 set all XMM registers to 0;
                 XINUSE[1] := 0;
                 MXCSR := 1F80H;

     FI;

     NEXT_FEATURE_OFFSET = 576;            // Legacy area and XSAVE header consume 576 bytes

     FOR i := 2 TO 62

     IF FORMAT[i] = 1

              THEN

              IF TO_BE_RESTORED[i] = 1

                        THEN

                        XINUSE[i] := 1;

                        load XSAVE state component i at offset NEXT_FEATURE_OFFSET from base of XSAVE area;

              FI;

NEXT_FEATURE_OFFSET = NEXT_FEATURE_OFFSET + n (n enumerated by CPUID.0DH.i:EAX);

     FI;

     IF TO_BE_INITIALIZED[i] = 1

              THEN

              XINUSE[i] := 0;

              initialize XSAVE state component i;

     FI;

     ENDFOR;

FI;

XMODIFIED := NOT RFBM;

IF in VMX non-root operation
    THEN VMXNR := 1;
    ELSE VMXNR := 0;

FI;
LAXA := linear address of XSAVE area;


XRSTOR_INFO := CPL,VMXNR,LAXA,COMPMASK;

Banderas afectadas

None.

Intel C/C++ compilador intrínseco

XRSTOR void _xrstor( void * , unsigned __int64);
XRSTOR void _xrstor64( void * , unsigned __int64);

Excepciones

Modo protegido
#GP(0)Siun operando de memoriadirección efectiva está fuera del límite de segmento CS, DS, ES, FS o GS. Siun operando de memoriano está alineado en un límite de 64 bytes, independientemente del segmento. Si bit 63 del campo XCOMP BV delXSAVEcabeza es 1 yCPUID.0DH.01H:EAX.XSAVEC[1]= 0. Si el formulario estándar es ejecutado y un poco enXCR0es 0 y el bit correspondiente en el campo XSTATE BV delXSAVE1. Si la forma estándar es ejecutada y bytes 23:8 delXSAVEencabezado no son todos cero. Si la forma compactada es ejecutada y un poco enXCR0es 0 y el bit correspondiente en el campo XCOMP BV delXSAVEencabezado es 1. Si la forma compactada se ejecuta y un poco en el campo XCOMP BV en elXSAVEencabezado es 0 y el bit correspondiente en el campo XSTATE BV es 1. Si la forma compactada se ejecuta y bytes 63:16 delXSAVEencabezado no son todos cero.MXCSRregistro con 1.
#SS(0)Si un operando de memoria dirección efectiva está fuera del límite del segmento SS. #PF(fault-code) Si un fallo de pagina ocurre.
#NMSi CR0.TS[bit 3] = 1.
#UDSi CPUID.01H:ECX.XSAVE[26] = 0. Si CR4.OSXSAVE[bit 18] = 0. Si se utiliza el prefijo LOCK.
#ACSi esta excepción es deshabilitadauna excepción de protección general (#GP) se señalizasiel operando de memoriano se alinea en un límite de 64 bytes, como se describe anteriormente. Si la excepción de comprobación de alineación (#AC) está habilitado (y elCPL3), señalización de#ACno se garantiza y puede variar con la aplicación, como se indica a continuación.#ACno es señalizado,una excepción de protección general se señalizaAdemás, el ancho del control de alineación también puede variar con la implementación. Por ejemplo, para una implementación determinada, una excepción de control de alineación puede ser señalizada para un mal alineamiento de 2 bytes, mientras queuna excepción de protección generalpuede ser señalizado para todas las otras mal alineaciones (4-, 8-, o 16-bytes).
Modo real
#GPSiun operando de memoriano está alineado en un límite de 64 bytes, independientemente del segmento.el operandose encuentra fuera del espacio de dirección eficaz de 0 aFFFFH. Si el bit 63 del campo XCOMP BV delXSAVEcabeza es 1 yCPUID.0DH.01H:EAX.XSAVEC[1]= 0. Si el formulario estándar es ejecutado y un poco enXCR0es 0 y el bit correspondiente en el campo XSTATE BV delXSAVE1. Si la forma estándar es ejecutada y bytes 23:8 delXSAVEencabezado no son todos cero. Si la forma compactada es ejecutada y un poco enXCR0es 0 y el bit correspondiente en el campo XCOMP BV delXSAVEencabezado es 1. Si la forma compactada se ejecuta y un poco en el campo XCOMP BV en elXSAVEencabezado es 0 y el bit correspondiente en el campo XSTATE BV es 1. Si la forma compactada se ejecuta y bytes 63:16 delXSAVEEl encabezado no es todo cero.
#NMSi intenta escribir cualquier bit reservado del registro MXCSR con 1.
#UDSi CR0.TS[bit 3] = 1. Si CPUID.01H:ECX.XSAVE[26] = 0. Si CR4.OSXSAVE[bit 18] = 0. Si el prefijo LOCK es usado.
Modo virtual-8086
Las mismas excepciones que en modo protegido.
Modo de compatibilidad
Las mismas excepciones que en modo protegido.
Modo de 64 bits
#GP(0)Si una dirección de memoria está en forma no canónica.un operando de memoriano está alineado en un límite de 64 bytes, independientemente del segmento. Si bit 63 del campo XCOMP BV delXSAVEcabeza es 1 yCPUID.0DH.01H:EAX.XSAVEC[1]= 0. Si el formulario estándar es ejecutado y un poco enXCR0es 0 y el bit correspondiente en el campo XSTATE BV delXSAVE1. Si la forma estándar es ejecutada y bytes 23:8 delXSAVEencabezado no son todos cero. Si la forma compactada es ejecutada y un poco enXCR0es 0 y el bit correspondiente en el campo XCOMP BV delXSAVEencabezado es 1. Si la forma compactada se ejecuta y un poco en el campo XCOMP BV en elXSAVEencabezado es 0 y el bit correspondiente en el campo XSTATE BV es 1. Si la forma compactada se ejecuta y bytes 63:16 delXSAVEencabezado no son todos cero.MXCSRregistro con 1.
#SS(0)Si una dirección de memoria que hace referencia al segmento SS está en forma no canónica. #PF(fault-code) Si ocurre un fallo de pagina.
#NMSi CR0.TS[bit 3] = 1.
#UDSi CPUID.01H:ECX[26, "XSAVE"] = 0. Si CR4.OSXSAVE[bit 18] = 0. Si el prefijo LOCK es usado.
#ACSi esta excepción es deshabilitadauna excepción de protección general (#GP) se señalizasiel operando de memoriano se alinea en un límite de 64 bytes, como se describe anteriormente. Si la excepción de comprobación de alineación (#AC) está habilitado (y elCPL3), señalización de#ACno se garantiza y puede variar con la aplicación, como se indica a continuación.#ACno es señalizado,una excepción de protección general se señalizaAdemás, el ancho del control de alineación también puede variar con la implementación. Por ejemplo, para una implementación determinada, una excepción de control de alineación puede ser señalizada para un mal alineamiento de 2 bytes, mientras queuna excepción de protección generalpuede ser señalizado para todas las otras mal alineaciones (4-, 8-, o 16-bytes).

Fuentes