仮想 PCI データ型

仮想 PCI (VPCI) データ型は、デバイス リソースの割り当て、仮想 PCI デバイスの作成、MMIO 範囲のマップ、デバイス レジスタへのアクセス、ターゲット デバイスの割り込みに使用されるフラグ、プロパティ コード、および値の構造を定義します。

構文

//
// Virtual PCI type definitions.
//

typedef enum WHV_ALLOCATE_VPCI_RESOURCE_FLAGS
{
    WHvAllocateVpciResourceFlagNone = 0x00000000,
    WHvAllocateVpciResourceFlagAllowDirectP2P = 0x00000001
} WHV_ALLOCATE_VPCI_RESOURCE_FLAGS;

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

#define WHV_MAX_DEVICE_ID_SIZE_IN_CHARS 200 // PnP manager limit

typedef struct WHV_SRIOV_RESOURCE_DESCRIPTOR
{
    WCHAR PnpInstanceId[WHV_MAX_DEVICE_ID_SIZE_IN_CHARS];
    LUID VirtualFunctionId;
    UINT16 VirtualFunctionIndex;
    UINT16 Reserved;
} WHV_SRIOV_RESOURCE_DESCRIPTOR;

typedef enum WHV_VPCI_DEVICE_NOTIFICATION_TYPE
{
    WHvVpciDeviceNotificationUndefined = 0,
    WHvVpciDeviceNotificationMmioRemapping = 1,
    WHvVpciDeviceNotificationSurpriseRemoval = 2
} WHV_VPCI_DEVICE_NOTIFICATION_TYPE;

typedef struct WHV_VPCI_DEVICE_NOTIFICATION
{
    WHV_VPCI_DEVICE_NOTIFICATION_TYPE NotificationType;
    UINT32 Reserved1;
    union
    {
        UINT64 Reserved2;
    };
} WHV_VPCI_DEVICE_NOTIFICATION;

typedef enum WHV_CREATE_VPCI_DEVICE_FLAGS
{
    WHvCreateVpciDeviceFlagNone = 0x00000000,
    WHvCreateVpciDeviceFlagPhysicallyBacked = 0x00000001,
    WHvCreateVpciDeviceFlagUseLogicalInterrupts = 0x00000002
} WHV_CREATE_VPCI_DEVICE_FLAGS;

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

typedef enum WHV_VPCI_DEVICE_PROPERTY_CODE
{
    WHvVpciDevicePropertyCodeUndefined   = 0,
    WHvVpciDevicePropertyCodeHardwareIDs = 1,
    WHvVpciDevicePropertyCodeProbedBARs  = 2
} WHV_VPCI_DEVICE_PROPERTY_CODE;

typedef struct WHV_VPCI_HARDWARE_IDS
{
    UINT16 VendorID;
    UINT16 DeviceID;
    UINT8 RevisionID;
    UINT8 ProgIf;
    UINT8 SubClass;
    UINT8 BaseClass;
    UINT16 SubVendorID;
    UINT16 SubSystemID;
} WHV_VPCI_HARDWARE_IDS;

#define WHV_VPCI_TYPE0_BAR_COUNT 6

typedef struct WHV_VPCI_PROBED_BARS
{
    UINT32 Value[WHV_VPCI_TYPE0_BAR_COUNT];
} WHV_VPCI_PROBED_BARS;

typedef enum WHV_VPCI_MMIO_RANGE_FLAGS
{
    WHvVpciMmioRangeFlagReadAccess = 0x00000001,
    WHvVpciMmioRangeFlagWriteAccess = 0x00000002
} WHV_VPCI_MMIO_RANGE_FLAGS;

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

typedef enum WHV_VPCI_DEVICE_REGISTER_SPACE
{
    WHvVpciConfigSpace = -1,
    WHvVpciBar0 = 0,
    WHvVpciBar1 = 1,
    WHvVpciBar2 = 2,
    WHvVpciBar3 = 3,
    WHvVpciBar4 = 4,
    WHvVpciBar5 = 5
} WHV_VPCI_DEVICE_REGISTER_SPACE;

typedef struct WHV_VPCI_MMIO_MAPPING
{
    WHV_VPCI_DEVICE_REGISTER_SPACE Location;
    WHV_VPCI_MMIO_RANGE_FLAGS Flags;
    UINT64 SizeInBytes;
    UINT64 OffsetInBytes;
    PVOID VirtualAddress;
} WHV_VPCI_MMIO_MAPPING;

typedef struct WHV_VPCI_DEVICE_REGISTER
{
    WHV_VPCI_DEVICE_REGISTER_SPACE Location;
    UINT32 SizeInBytes;
    UINT64 OffsetInBytes;
} WHV_VPCI_DEVICE_REGISTER;

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;

Members

WHV_ALLOCATE_VPCI_RESOURCE_FLAGS

WHvAllocateVpciResourceによって割り当てられるリソースのオプションを指定します。

WHvAllocateVpciResourceFlagNone

割り当てられたリソースに特別なオプションが適用されていないことを指定します。

WHvAllocateVpciResourceFlagAllowDirectP2P

割り当てられたリソースが、直接変換されたピアツーピア (P2P) トランザクションへの参加を許可されることを指定します。

WHV_SRIOV_RESOURCE_DESCRIPTOR

割り当てる単一ルート I/O 仮想化 (SR-IOV) 仮想関数について説明します。 この構造体は、ProviderIdNULLされたときにWHvAllocateVpciResourceするResourceDescriptorとして渡します。

PnpInstanceId

仮想関数をホストする物理関数のプラグ アンド プレイ (PnP) インスタンス識別子を指定します。 識別子は最大 WHV_MAX_DEVICE_ID_SIZE_IN_CHARS 文字であり、PnP マネージャーの制限に一致します。

VirtualFunctionId

割り当てる仮想関数のローカル一意識別子 (LUID) を指定します。

VirtualFunctionIndex

仮想関数の物理関数のインデックスを指定します。

Reserved

予約済み。 0 に設定します。

WHV_VPCI_DEVICE_NOTIFICATION_TYPE

WHvGetVpciDeviceNotificationによって VPCI デバイスに対して報告される非同期通知の種類を識別します。

WHvVpciDeviceNotificationUndefined

使用可能な通知がないことを示します。 WHvGetVpciDeviceNotificationがこの型を返すと、呼び出し元はすべての保留中の通知をドレインしています。

WHvVpciDeviceNotificationMmioRemapping

デバイスの MMIO 範囲が再マップされたことを示します。 呼び出し元は、デバイスの MMIO 範囲を WHvMapVpciDeviceMmioRangesに再マップする必要があります。

WHvVpciDeviceNotificationSurpriseRemoval

デバイスが予期せず削除されたことを示します (突然の削除)。

WHV_VPCI_DEVICE_NOTIFICATION

WHvGetVpciDeviceNotificationによって返された VPCI デバイス通知の種類とデータを受信します。

NotificationType

通知を識別する WHV_VPCI_DEVICE_NOTIFICATION_TYPE 値を受け取ります。

Reserved1

予約済み。

Reserved2

予約済み。

WHV_CREATE_VPCI_DEVICE_FLAGS

WHvCreateVpciDeviceによって作成されたデバイスのオプションの特性を指定します。

WHvCreateVpciDeviceFlagNone

省略可能な特性が適用されていないことを指定します。

WHvCreateVpciDeviceFlagPhysicallyBacked

指定された VPCI リソース ハンドルによって識別される物理リソースによってデバイスがバックアップされることを指定します。

WHvCreateVpciDeviceFlagUseLogicalInterrupts

デバイスがゲスト オペレーティング システムに論理割り込みを公開することを指定します。

WHV_VPCI_DEVICE_PROPERTY_CODE

WHvGetVpciDevicePropertyによって照会された VPCI デバイスプロパティを識別します。

WHvVpciDevicePropertyCodeUndefined

予約済み。 有効なプロパティ コードではありません。

WHvVpciDevicePropertyCodeHardwareIDs

デバイスのハードウェア識別子を選択します。 プロパティ値は WHV_VPCI_HARDWARE_IDS 構造体です。

WHvVpciDevicePropertyCodeProbedBARs

デバイスのプローブされたベース アドレス レジスタ (BAR) を選択します。 プロパティ値は WHV_VPCI_PROBED_BARS 構造体です。

WHV_VPCI_HARDWARE_IDS

VPCI デバイスの PCI ハードウェア識別子が含まれます。 WHvVpciDevicePropertyCodeHardwareIDs プロパティのWHvGetVpciDevicePropertyによって返されます。

VendorID

PCI ベンダー識別子を受け取ります。

DeviceID

PCI デバイス識別子を受け取ります。

RevisionID

PCI リビジョン識別子を受け取ります。

ProgIf

PCI クラス コードのプログラミング インターフェイス バイトを受け取ります。

SubClass

PCI クラス コードのサブクラス バイトを受け取ります。

BaseClass

PCI クラス コードの基底クラス バイトを受け取ります。

SubVendorID

PCI サブシステム ベンダー識別子を受け取ります。

SubSystemID

PCI サブシステム識別子を受け取ります。

WHV_VPCI_PROBED_BARS

VPCI デバイスのタイプ 0 ベース アドレス レジスタ (BAR) のプローブされた値が含まれます。 WHvVpciDevicePropertyCodeProbedBARs プロパティのWHvGetVpciDevicePropertyによって返されます。

Value

WHV_VPCI_TYPE0_BAR_COUNT (6) タイプ 0 の各 BAR のプローブされた値を受け取ります。

WHV_VPCI_MMIO_RANGE_FLAGS

WHV_VPCI_MMIO_MAPPINGによって記述された MMIO 範囲に付与されるアクセスを指定します。

WHvVpciMmioRangeFlagReadAccess

呼び出し元のプロセスが範囲への読み取りアクセス権を持っていることを示します。

WHvVpciMmioRangeFlagWriteAccess

呼び出し元のプロセスが範囲への書き込みアクセス権を持っていることを示します。

WHV_VPCI_DEVICE_REGISTER_SPACE

WHV_VPCI_MMIO_MAPPINGおよびWHV_VPCI_DEVICE_REGISTERによって使用される VPCI デバイスのレジスタ領域を識別します。

WHvVpciConfigSpace

デバイスの PCI 構成領域を識別します。

WHvVpciBar0 から WHvVpciBar5

デバイスのベース アドレス レジスタ (BAR) 0 から 5 を識別します。

WHV_VPCI_MMIO_MAPPING

WHvMapVpciDeviceMmioRangesによって呼び出し元のプロセスにマップされた 1 つの MMIO サブ範囲について説明します。

Location

サブ範囲が属する BAR を WHV_VPCI_DEVICE_REGISTER_SPACE 値として識別します。

Flags

このサブ範囲の呼び出し元のプロセスに付与されるアクセスを、 WHV_VPCI_MMIO_RANGE_FLAGS 値の組み合わせとして指定します。

SizeInBytes

サブ範囲の長さをバイト単位で指定します。

OffsetInBytes

Locationで識別される BAR のベース アドレスからのサブ範囲のオフセットをバイト単位で指定します。

VirtualAddress

サブ範囲がマップされる呼び出し元のプロセスの仮想アドレスを指定します。

WHV_VPCI_DEVICE_REGISTER

WHvReadVpciDeviceRegisterで読み取るレジスタ、またはWHvWriteVpciDeviceRegisterで書き込むレジスタを識別します。

Location

レジスタ領域を WHV_VPCI_DEVICE_REGISTER_SPACE 値 (構成領域または特定の BAR) として指定します。

SizeInBytes

レジスタ アクセスのサイズをバイト単位で指定します。

OffsetInBytes

Locationによって識別される領域内のレジスタのオフセット (バイト単位) を指定します。

WHV_VPCI_INTERRUPT_TARGET_FLAGS

WHV_VPCI_INTERRUPT_TARGETによって記述される割り込みターゲットのオプションを指定します。

WHvVpciInterruptTargetFlagNone

割り込みターゲットに特別なオプションが適用されていないことを指定します。

WHvVpciInterruptTargetFlagMulticast

割り込みをマルチキャストとして一連のターゲット プロセッサに配信することを指定します。

WHV_VPCI_INTERRUPT_TARGET

VPCI デバイス割り込みのターゲット (ベクトルと一連の仮想プロセッサ) を指定します。 Processorsは柔軟な配列メンバーであるため、この構造体は可変長です。

Vector

ターゲット プロセッサに配信する割り込みベクトルを指定します。

Flags

WHV_VPCI_INTERRUPT_TARGET_FLAGS値の組み合わせとして、ターゲットのオプションを指定します。

ProcessorCount

Processors配列内の有効なエントリの数を指定します。

Processors

割り込みがターゲットとする仮想プロセッサのインデックスを指定します。

Remarks

パーティションに割り当てられた VPCI デバイスは、単一ルート I/O 仮想化 (SR-IOV) 仮想関数、個別に割り当て可能な物理機能、または物理リソースによってサポートされていない仮想デバイスを表します。 一般的なライフサイクルは、 WHvAllocateVpciResourceでリソースを割り当て、 WHvCreateVpciDeviceを使用してデバイスを作成し、デバイスの MMIO 範囲を WHvMapVpciDeviceMmioRangesにマップし、その割り込みを WHvMapVpciDeviceInterruptにマップし、最後に WHvDeleteVpciDeviceでデバイスを破棄することです。

WHV_VPCI_INTERRUPT_TARGETWHV_VPCI_INTERRUPT_TARGET_FLAGSの種類は、デバイス割り込み関数WHvMapVpciDeviceInterruptWHvRetargetVpciDeviceInterrupt、およびWHvGetVpciDeviceInterruptTargetによって共有されます。 Processorsは柔軟な配列メンバーであるため、呼び出し元は構造体の固定部分の後にプロセッサ インデックスProcessorCount保持するのに十分な大きさのバッファーを割り当てる必要があります。

こちらも参照ください