ENQCMDS

Enqueue Command Supervisor

estableVMJITAOTinstruccion

Codificaciones

OpcodeInstruccionOp/En64 bitsCompat/LegacyDescripcion
F3 0F 38 F8 !(11):rrr:bbbENQCMDS r32/r64, m512AValidoValidoEncargar atómicamente el comando 64-byte con PASID de la fuente operando de memoria a la compensación de destino en segmento ES especificado en el registro operando como offset en segmento ES.

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.

A

  1. modrm.reg escriturabyte ModRM, campo reg (bits 5-3)
  2. 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...

Banderas nombradas

Descripción

La instrucción ENQCMDS permite que el software del sistema escriba comandos para encuue registers, que son registros especiales de dispositivos a los que se accede utilizando I/O (MMIO).

Los registros esperan que los escritos tengan el formato dado en la Figura 3-11 y explicado en la sección sobre "ENQCMD--Enqueue Command".

La instrucción ENQCMDS comienza leyendo 64 bytes de datos de comando de su fuente operando de memoria. Esta es una carga ordinaria con caqueabilidad y pedidos de memoria implicados normalmente por el tipo de memoria. El operando de origen no necesita ser alineado, y no hay garantía de que todos los 64 bytes están cargados atómico. Bits 30:20 del operando de origen debe ser cero.

ENQCMDS formatos sus datos fuente de forma diferente de ENQCMD. Específicamente, los convierte en datos de comandos de la siguiente manera:

un identificador de dirección-espacio de proceso (PASID).

identificación de privilegios (0 = usuario; 1 = supervisor).

La instrucción ENQCMDS utiliza una tienda de encuue (definida a continuación) para escribir estos datos de comandos al operando de destino. La dirección del operando de destino se especifica en un registro de proposito general como compensación en el segmento ES (el segmento no puede ser superado).1 La dirección lineal de destino debe ser alineada de 64 bytes. El funcionamiento de una tienda enqueue ignora el tipo de memoria de la dirección de memoria de destino.

Una tienda de encuues no se ordena en relación con tiendas mayores a la memoria WB o WC (incluyendo tiendas no temporales) o a las ejecuciones de la CLFLUSHOPT o CLWB (cuando se aplica a direcciones distintas a la de la tienda de encuue). El software puede hacer cumplir tal orden ejecutando una instrucción de esgrima como SFENCE o MFENCE antes de la tienda de encuue.

Una tienda de encuues no escribe los datos en la jerarquía de caché, ni recoge ningún dato en la jerarquía de caché. Los datos de comando de una tienda de encuue nunca se combinan con el de cualquier otra tienda a la misma dirección.

A diferencia de otras tiendas, una tienda enqueue devuelve un estado, que la instrucción ENQCMDS carga en la bandera ZF en el registro RFLAGS:

y ha sido aceptado por el dispositivo. (No garantiza que el dispositivo haya actuado en el comando; puede que lo haya solicitado para la ejecución posterior.)

dirección es un registro de la entrada, pero el comando no fue aceptado debido a la capacidad u otras razones temporales.

  1. En modo de 64 bits, la anchura del registro operando es de 64 bits (32 bits con un prefijo 67H). Modo exterior de 64 bits cuando CS.D = 1, el ancho es de 32 bits (16 bits con un prefijo 67H). Fuera del modo 64-bit cuando CS.D=0, el ancho es de 16 bits (32 bits con un prefijo 67H).

Este estado también se devuelve si la dirección de destino no era un registro de encuue (incluido el caso de una dirección de memoria); en estos casos, la tienda se deja caer y se escribe ni a MMIO ni a la memoria.

La instrucción ENQCMDS puede ejecutarse sólo si CPL= 0. La disponibilidad de la instrucción ENQCMDS está indicada por la presencia de la bandera CPUID ENQCMD (CPUID.07H.00H:ECX[29]).

Operación

DEST := SRC;

Intel C/C++ compilador intrínseco

ENQCMDS int_enqcmds(void *dst, const void *src);

Banderas afectadas

La bandera ZF se establece si la terminación de la tienda de encuue devuelve el estado de la reingresación; de lo contrario se pone a cero. Todas las otras banderas están limpias.

SIMD coma flotante Excepciones

None.

Excepciones

Modo protegido
#GP(0)Para una dirección efectiva operando de memoria ilegal en los segmentos CS, DS, ES, FS o GS. Si la dirección lineal de destino no está alineada a un límite de 64 bytes.
#SS(0)Si el nivel actual de privilegios no es 0.
#PF(fault-code)Si los bits 30:20 del operando de origen no son todos cero.
#UDPara una dirección ilegal en el segmento SS. Para un fallo de pagina. Si CPUID.07H.00H:ECX.ENQCMD[29] = 0. Si el prefijo LOCK es utilizado.
Modo real
#GPSi alguna parte del operando se encuentra fuera del espacio de dirección eficaz de 0 a FFFFH.
#UDSi la dirección lineal de destino no está alineada a un límite de 64 bits. Si los bits 30:20 del operando de origen no son todos cero. Si CPUID.07H.00H:ECX.ENQCMD[29] = 0. Si el prefijo LOCK es usado.
Modo virtual-8086
#GP(0)La instrucción ENQCMDS no se reconoce en modo virtual-8086.
Modo de compatibilidad
Las mismas excepciones que en modo protegido.
Modo de 64 bits
#SS(0)Si una dirección de memoria que hace referencia al segmento SS está en forma no canónica.
#GP(0)Si la dirección de memoria está en forma no canónica. Si la dirección lineal de destino no está alineada a un límite de 64 bytes.
#PF(fault-code)Si el nivel de privilegio actual no es 0. Si los bits 30:20 del operando de origen no son todos cero. Para un fallo de pagina.
#UDSi CPUID.07H.00H:ECX.ENQCMD[29]. Si se utiliza el prefijo LOCK.

Fuentes