Compartir a través de


HV_MESSAGE

Los mensajes SynIC tienen un tamaño fijo compuesto por un encabezado de mensaje (que incluye el tipo de mensaje y la información sobre dónde se originó el mensaje) seguido de la carga. Los mensajes que se envían en respuesta a HvCallPostMessage contienen el identificador de puerto. Los mensajes de interceptación contienen el identificador de partición de la partición cuyo procesador virtual generó la interceptación. Las interceptaciones de temporizador no tienen un identificador de origen (es decir, el identificador especificado es cero).

La marca MessagePending indica si hay o no mensajes pendientes en la cola de mensajes del origen de interrupción sintética. Si lo hay, el invitado debe realizar un "fin del mensaje" después de vaciar la ranura del mensaje. Esto permite escrituras oportunistas en EOM MSR (solo cuando sea necesario). Tenga en cuenta que el hipervisor puede establecer esta marca después de la entrega del mensaje o en cualquier momento posterior. La marca debe probarse después de vaciar la ranura del mensaje y, si se establece, hay uno o varios mensajes pendientes y se debe realizar el "final del mensaje".

Sintaxis

#define HV_MESSAGE_SIZE 256
#define HV_MESSAGE_MAX_PAYLOAD_BYTE_COUNT 240
#define HV_MESSAGE_MAX_PAYLOAD_QWORD_COUNT 30

typedef struct
{
   UINT8 MessagePending:1;
   UINT8 Reserved:7;
} HV_MESSAGE_FLAGS;

typedef struct
{
   HV_MESSAGE_TYPE MessageType;
   UINT8 PayloadSize;
   HV_MESSAGE_FLAGS MessageFlags;
   UINT16 Reserved;
   union
   {
       UINT64 OriginationId;
       HV_PARTITION_ID Sender;
       HV_PORT_ID Port;
   };
} HV_MESSAGE_HEADER;

typedef struct
{
   HV_MESSAGE_HEADER Header;
   UINT64 Payload[HV_MESSAGE_MAX_PAYLOAD_QWORD_COUNT];
} HV_MESSAGE;