WHvMapVpciDeviceInterrupt

割り当てられた仮想 PCI デバイスの MSI または MSI-X 割り込みをマップし、MSI アドレスとデータをデバイスにプログラムに返します。

構文

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

仮想 PCI デバイスを所有するパーティションへのハンドル。

LogicalDeviceId

デバイスの作成時に割り当てられる仮想 PCI デバイスの論理デバイス ID を指定します。

Index

作成する割り込みマッピング エントリのインデックスを指定します。 各マッピング要求では、一意の未使用のインデックスを指定する必要があります。

MessageCount

割り込みに対して要求されたメッセージの数を指定します。 マルチメッセージ MSI 割り込みの場合、これは 1 から 32 の間の 2 つの累乗です(両端を含む)。 MSI-X 割り込みの場合は、この値を 1 に設定します。

Target

割り込みのターゲット ベクターとプロセッサ セットを提供する WHV_VPCI_INTERRUPT_TARGET 構造体へのポインターを指定します。 MessageCountが 1 より大きい場合、すべてのメッセージは同じターゲット プロセッサ セットで初期化されます。

MsiAddress

割り込みに割り当てられた MSI アドレスを受け取ります。 この値を MSI またはデバイスの MSI-X 機能にプログラムします。

MsiData

割り込みに割り当てられた MSI データ ペイロードを受け取ります。 この値を MSI またはデバイスの MSI-X 機能にプログラムします。

戻り値

関数が成功した場合、戻り値は S_OK

この関数は、Indexが 65535 より大きい場合、MessageCountが 0 または 32 より大きい場合、Target->Flagsが未定義フラグを指定した場合、Target->ProcessorCountが 0 またはパーティション内の仮想プロセッサの数を超えている場合、Target->Processors内のプロセッサが有効な仮想プロセッサ インデックスでない場合、または 1 つのターゲット プロセッサと共にWHvVpciInterruptTargetFlagMulticastが設定されている場合に、E_INVALIDARGを返します。 Arm64 では、Target->ProcessorCountが 1 より大きい場合、またはWHvVpciInterruptTargetFlagMulticastが設定されている場合、この関数はE_INVALIDARGを返します。これは、ハイパーバイザーが各 MSI を Arm64 上の単一の仮想プロセッサを対象とするためです。

Remarks

WHvMapVpciDeviceInterrupt関数は、割り当てられたデバイスをバックアップする物理リソースによって発行された割り込みが、デバイスを所有するパーティションのターゲット仮想プロセッサにルーティングされるようにマッピングを確立します。 マッピングが作成されたら、返された MsiAddress をプログラムし、デバイスの MSI または MSI-X 機能に値を MsiData します。

デバイスが論理割り込みを有効にして作成された場合、呼び出し元は、返されたMsiAddressを渡してWHvRequestVpciDeviceInterruptMsiDataすることで、割り込みを直接アサートすることもできます。

マルチメッセージ MSI 割り込み (MessageCount 1 より大きい) をマッピングすると、すべてのメッセージが同じターゲット プロセッサ セットで初期化されます。 後で WHvRetargetVpciDeviceInterrupt を使用して、個々のメッセージを別のプロセッサ セットに再ターゲットします。 WHvGetVpciDeviceInterruptTargetを使用してマップされた割り込みの現在のターゲットに対してクエリを実行し、WHvUnmapVpciDeviceInterruptを使用してマッピングを削除します。

Requirements

要件 価値
サポートされている最小Windows Windows 10バージョン 20H2 (x64);Windows 11、バージョン 24H2、ビルド 26100.3915 (Arm64)
Header WinHvPlatform.h
図書館 WinHvPlatform.lib
DLL WinHvPlatform.dll
Architecture x64、Arm64

こちらも参照ください