WHvMapVpciDeviceInterrupt

Mapeia uma interrupção MSI ou MSI-X para um dispositivo PCI virtual atribuído e devolve o endereço MSI e os dados para programar no dispositivo.

Sintaxe

typedef enum WHV_VPCI_INTERRUPT_TARGET_FLAGS
{
    WHvVpciInterruptTargetFlagNone      = 0x00000000,
    WHvVpciInterruptTargetFlagMulticast = 0x00000001,

} WHV_VPCI_INTERRUPT_TARGET_FLAGS;

// Enables bitwise operators on the WHV_VPCI_INTERRUPT_TARGET_FLAGS enumeration.
DEFINE_ENUM_FLAG_OPERATORS(WHV_VPCI_INTERRUPT_TARGET_FLAGS);

typedef struct WHV_VPCI_INTERRUPT_TARGET
{
    UINT32 Vector;
    WHV_VPCI_INTERRUPT_TARGET_FLAGS Flags;
    UINT32 ProcessorCount;
    UINT32 Processors[ANYSIZE_ARRAY];

} WHV_VPCI_INTERRUPT_TARGET;

HRESULT
WINAPI
WHvMapVpciDeviceInterrupt(
    _In_ WHV_PARTITION_HANDLE Partition,
    _In_ UINT64 LogicalDeviceId,
    _In_ UINT32 Index,
    _In_ UINT32 MessageCount,
    _In_ const WHV_VPCI_INTERRUPT_TARGET* Target,
    _Out_ UINT64* MsiAddress,
    _Out_ UINT32* MsiData
    );

Parameters

Partition

Handle para a partição que possui o dispositivo PCI virtual.

LogicalDeviceId

Especifica o ID lógico do dispositivo PCI virtual, conforme atribuído quando o dispositivo foi criado.

Index

Especifica o índice da entrada de mapeamento de interrupções a criar. Cada pedido de mapeamento deve especificar um índice único e não utilizado.

MessageCount

Especifica o número de mensagens solicitadas para a interrupção. Para uma interrupção MSI multi-mensagem, esta é uma potência de dois entre 1 e 32, inclusive. Para uma interrupção MSI-X, defina este valor para 1.

Target

Especifica um ponteiro para uma WHV_VPCI_INTERRUPT_TARGET estrutura que fornece o vetor de destino e o conjunto de processador para a interrupção. Quando MessageCount é maior que 1, cada mensagem é inicializada com o mesmo conjunto de processadores de destino.

MsiAddress

Recebe o endereço MSI atribuído à interrupção. Programe este valor na capacidade MSI ou MSI-X do dispositivo.

MsiData

Recebe a carga útil de dados MSI atribuída à interrupção. Programe este valor na capacidade MSI ou MSI-X do dispositivo.

Valor de retorno

Se a função tiver sucesso, o valor de retorno é S_OK.

A função devolve E_INVALIDARG quando Index é maior que 65535, quando MessageCount é 0 ou superior a 32, quando Target->Flags especifica uma bandeira indefinida, quando Target->ProcessorCount é 0 ou excede o número de processadores virtuais na partição, quando um processador em Target->Processors não é um índice válido de processador virtual, ou quando WHvVpciInterruptTargetFlagMulticast está definido juntamente com um único processador alvo. No Arm64, a função retorna E_INVALIDARG quando Target->ProcessorCount é maior que 1 ou quando WHvVpciInterruptTargetFlagMulticast está definido, porque o hipervisor direciona cada MSI para um único processador virtual no Arm64.

Remarks

A WHvMapVpciDeviceInterrupt função estabelece um mapeamento para que as interrupções emitidas pelos recursos físicos que suportam o dispositivo atribuído sejam encaminhadas para os processadores virtuais alvo da partição que detém o dispositivo. Depois de criado o mapeamento, programe os valores retornados MsiAddressMsiData e no MSI ou MSI-X capacidade do dispositivo.

Quando o dispositivo foi criado com as interrupções lógicas ativadas, o chamador pode também afirmar a interrupção diretamente ao passar o retorno MsiAddress e MsiData para WHvRequestVpciDeviceInterrupt.

Ao mapear uma interrupção MSI multi-mensagem (MessageCount maior que 1), todas as mensagens são inicializadas com o mesmo conjunto de processadores alvo. Use WHvRetargetVpciDeviceInterrupt After para redirecionar mensagens individuais para um conjunto de processadores diferente. Consulte o alvo atual de uma interrupção mapeada com WHvGetVpciDeviceInterruptTarget, e remova o mapeamento com WHvUnmapVpciDeviceInterrupt.

Requirements

Requirement Value
Windows mínimo suportado Windows 10, versão 20H2 (x64); Windows 11, versão 24H2, build 26100.3915 (Arm64)
Header WinHvPlatform.h
Biblioteca WinHvPlatform.lib
DLL WinHvPlatform.dll
Arquitetura x64, ARM64

Ver também