SENDUIPI

Enviar Interruptor de Interprocesador de Usuario

estableVMJITAOTinstruccion

Codificaciones

OpcodeInstruccionOp/En64 bitsCompat/LegacyDescripcion
F3 0F C7 /6SENDUIPI regAValidoNo validoEnviar interprocesador interrumpe el usuario.

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 lecturabyte ModRM, campo reg (bits 5-3)

Coste medido

Cargando las mediciones de arch-data...

Descripción

La instrucción SENDUIPI envía la interrupción del interprocesador del usuario (IPI) indicada por su registro operando. (el operando siempre tiene 64 bits; operando-size anula como el prefijo 66 son ignorados.)

SENDUIPI utiliza una estructura de datos llamada la tabla de destino interrumpida por el usuario (UITT). Esta tabla se encuentra en la dirección lineal UITTADDR (en el IA32 UINTR TT MSR); consta de entradas UITTSZ+1 de 16 bytes, donde UITTSZ = IA32 UINT MISC[31:0]. SENDUIPI utiliza la entrada UITT (UITTE) indexada por el registro de la instrucción operando. Cada UITTE tiene el siguiente formato:

byte alineado, por lo que los bits 69:64 de cada UITTE debe ser 0.)

Cada UPID tiene el siguiente formato (campos y bits no referenciados están reservados):

más usuarios interrumpen en PIR.

no debe enviar notificaciones cuando el usuario interrumpe en este descriptor.

(incluyendo SENDUIPI).

bits 47:40 son el ID APIC de 8 bits; en modo x2APIC, todo el campo forma el ID APIC de 32 bits).

solicitud de interrupción del usuario para un vector si el bit correspondiente es 1.

Aunque SENDUIPI puede ser ejecutado a cualquier nivel de privilegio, todos los accesos de memoria de la instrucción (a un UITTE y un UPID) se realizan con privilegio supervisor.

SENDUIPI envía una interrupción del usuario publicando una interrupción del usuario con el vector V en el UPID referenciado por UPIDADDR y luego enviando, como un IPI ordinario, cualquier interrupción de notificación especificada en ese UPID.

Operación

    IF reg > UITTSZ;
          THEN #GP(0);

    FI;
    read tempUITTE from 16 bytes at UITTADDR+ (reg << 4);
    IF tempUITTE.V = 0 or tempUITTE sets any reserved bit

          THEN #GP(0);
    FI;


read tempUPID from 16 bytes at tempUITTE.UPIDADDR;// under lock
IF tempUPID sets any reserved bits or bits that must be zero

      THEN #GP(0); // release lock
FI;
tempUPID.PIR[tempUITTE.UV] := 1;
IF tempUPID.SN = tempUPID.ON = 0

      THEN
            tempUPID.ON := 1;
            sendNotify := 1;

      ELSE sendNotify := 0;
FI;
write tempUPID to 16 bytes at tempUITTE.UPIDADDR;// release lock
IF sendNotify = 1

      THEN
            IF local APIC is in x2APIC mode
                  THEN send ordinary IPI with vector tempUPID.NV
                        to 32-bit physical APIC ID tempUPID.NDST;
                  ELSE send ordinary IPI with vector tempUPID.NV
                        to 8-bit physical APIC ID tempUPID.NDST[15:8];
            FI;

FI;

Banderas afectadas

None.

Excepciones

Modo protegido
#UDLa instrucción SENDUIPI no se reconoce en modo protegido.
Modo real
#UDLa instrucción SENDUIPI no se reconoce en modo de direccion real.
Modo virtual-8086
#UDLa instrucción SENDUIPI no se reconoce en modo virtual-8086.
Modo de compatibilidad
#UDLa instrucción SENDUIPI no se reconoce en modo de compatibilidad.
Modo de 64 bits
#UDSi se utiliza el prefijo LOCK. Si se ejecuta dentro de un enclave. Si CR4.UINTR = 0. Si IA32 UINTR TT[0] = 0. Si CPUID.07H.00H:EDX.UINTR[5] = 0.
#PFSi un fallo de pagina ocurre.
#GPSi el valor del registro operando excede UITTSZ. Si el UITTE seleccionado no es válido o establece cualquier bit reservado. Si el UPID seleccionado establece cualquier bit reservado. Si hay un intento de acceder a la memoria usando una dirección lineal que no es canónica relativa al modo de pavimentación actual.

Fuentes