WRMSRLIST

Escribir lista de registros específicos modelo

estableVMJITAOTinstruccion

Codificaciones

OpcodeInstruccionOp/En64 bitsCompat/LegacyDescripcion
F3 0F 01 C6WRMSRLISTZOValidoNo codificableEscriba la lista solicitada de MSRs con los valores especificados en la memoria.

Coste medido

Cargando las mediciones de arch-data...

Descripción

Esta instrucción escribe una lista proporcionada por software de hasta 64 MSRs con valores cargados de memoria.

WRMSRLIST toma tres entradas implícitas operandos:

Para cada bit RCX [n] de 0 a 63, si RCX[n] es 1, WRMSRLIST escribirá el MSR especificado en la entrada [n] en la tabla basada en RSI con el valor leído de la memoria en la entrada [n] en la tabla basada en RDI.

Esto implica un máximo de 64 MSR que pueden ser procesados por esta instrucción. El procesador limpiará RCX[n] después de que termine de manejar ese MSR. Similar a operaciones de cuerda repetidas, WRMSRLIST apoya la terminación parcial para interrupciones, excepciones y trampas. En estas situaciones, el registro RIP guardado indicará la instrucción MSRLIST, mientras que el registro RCX habrá borrado bits correspondientes a todas las iteraciones completadas.

Esta instrucción debe ejecutarse a nivel de privilegios 0; de lo contrario, una excepción de protección general #GP(0) se genera. Esta instrucción realiza cheques específicos de MSR de la misma manera que WRMSR.

Al igual que WRMSRNS (y a diferencia de WRMSR), WRMSRLIST no se define como una instrucción serializadora (ver "Instrucciones de serialización" en el Capítulo 11 del Intel(R) 64 e IA-32 Architectures Software Developer's Manual, Volumen 3A). Esto significa que el software no debe confiar en WRMSRLIST para drenar todas las escrituras amortiguadas a la memoria antes de que la siguiente instrucción sea traída y ejecutada. Por razones de aplicación, algunos procesadores pueden serializarse cuando escriben ciertos MSR, aunque eso no esté garantizado.

Como WRMSR y WRMSRNS, WRMSRLIST asegura que todas las operaciones antes de WRMSRLIST no usen ningún nuevo valor MSR y que todas las operaciones después de WRMSRLIST utilizan los nuevos valores. Una excepción a esta regla es ciertos eventos de monitorización de rendimiento relacionados con la tienda que sólo cuentan las tiendas cuando se drenan a la memoria. Puesto que WRMSRLIST no es una instrucción serializadora, si el software utiliza WRMSRLIST para cambiar los controles para tales eventos de monitorización de rendimiento, las tiendas emitidas antes de WRMSRLIST pueden ser contados sobre la base de los controles establecidos por WRMSRLIST. El software puede insertar la instrucción SERIALIZE antes del WRMSRLIST si así lo desea.

Los MSR que causan una invalidación TLB cuando se escriben a través de WRMSR (por ejemplo, MTRR) también causarán la misma invalidación TLB cuando se escribe por WRMSRLIST.

En lugares donde WRMSR está siendo utilizado como un proxy para una instrucción de serialización, se puede utilizar una instrucción de serialización diferente (por ejemplo, SERIALIZE).

WRMSRLIST escribe MSRs en orden, lo que significa que el procesador asegurará que un MSR en iteración "n" se escribirá sólo después de las iteraciones anteriores ("n-1"). Si el MSR más viejo escribe tenía un efecto secundario que afecta el comportamiento del siguiente MSR, el procesador asegurará que el efecto secundario es honrado.

Se permite al procesador (pero no se requiere) "cargar adelante" en la lista. Los siguientes son ejemplos de cosas que el procesador puede hacer:

escrito por una iteración anterior cambiando MTRR o invalidando TLBs.

  1. Dado que las direcciones MSR son sólo de 32 bits de ancho, se reservan los bits 63:32 de cada mesa de dirección MSR.

Operación

DO WHILE RCX != 0
    MSR_index := position of least significant bit set in RCX;
    Load MSR_address_table_entry from 8 bytes at the linear address RSI + (MSR_index * 8);
    IF MSR_address_table_entry[63:32] != 0 THEN #GP(0); FI;
    MSR_address := MSR_address_table_entry[31:0];
    Load MSR_data from 8 bytes at the linear address RDI + (MSR_index * 8);
    IF WRMSR of MSR_data to the MSR with address MSR_address would #GP THEN #GP(0); FI;
    Load the MSR with address MSR_address with MSR_data;
    RCX[MSR_index] := 0;
    Allow delivery of any pending interrupts or traps;

OD;

Banderas afectadas

None.

Excepciones

Modo protegido
#UDLa instrucción WRMSRLIST no se reconoce en modo protegido.
Modo real
#UDLa instrucción WRMSRLIST no se reconoce en modo de direccion real.
Modo virtual-8086
#UDLa instrucción WRMSRLIST no se reconoce en modo virtual-8086.
Modo de compatibilidad
#UDLa instrucción WRMSRLIST no se reconoce en modo de compatibilidad.
Modo de 64 bits
#GP(0)Si el nivel actual de privilegios no es 0. SiRSI [2:0] 0, RDI[2:0] 0, o bits 63:32 de unMSR- la entrada de la tabla de direcciones no es todo cero.WRMSRa una especificaciónMSRcon un valor especificado generaría una excepción de protección general (#GP(0)). Si la dirección de memoria está en forma no canónica.#PF(fault-code)Siun fallo de paginaocurre.
#UDSi se utiliza el prefijo LOCK. Si CPUID.07H.01H:EAX.MSRLIST[27] = 0. 1. Por ejemplo, el procesador puede tomar un fallo de pagina debido a una dirección lineal para la décima entrada en la tabla de direcciones MSR a pesar de haber completado el MSR escribe hasta la entrada 5.

Fuentes