HvCallSetVpRegisters ハイパーコールは、仮想プロセッサの状態を書き込みます。
インターフェイス
HV_STATUS
HvCallSetVpRegisters(
_In_ HV_PARTITION_ID PartitionId,
_In_ HV_VP_INDEX VpIndex,
_In_ HV_INPUT_VTL InputVtl,
_Inout_ UINT32* RegisterCount,
_In_reads_(*RegisterCount) const HV_REGISTER_NAME* RegisterNameList,
_In_reads_(*RegisterCount) const HV_REGISTER_VALUE* RegisterValueList
);
状態は一連のレジスタ値として書き込まれ、それぞれが入力として指定されたレジスタ名に対応します。
レジスタ値が変更されると、最小限のエラー チェックが実行されます。 特に、ハイパーバイザーは、レジスタの予約ビットが 0 に設定されていること、常に 0 または 1 を含むものとしてアーキテクチャ上定義されているビットが適切に設定されていること、およびレジスタのアーキテクチャ サイズを超える指定ビットがゼロに設定されていることを検証します。
この呼び出しを使用して、読み取り専用レジスタの値を変更することはできません。
レジスタの変更による副作用は実行されません。 これには、例外の生成、パイプライン同期、TLB フラッシュなどが含まれます。
制約
- 呼び出し元は PartitionId で指定されたパーティションの親であるか、指定されたパーティションが "自己" であり、パーティションに AccessVpRegisters 特権が必要です。
呼び出しコード
0x0051 (Rep)
パラメーターの入力
| 名前 | オフセット | サイズ | 提供される情報 |
|---|---|---|---|
PartitionId |
0 | 八 | パーティション ID を指定します。 |
VpIndex |
八 | 4 | 仮想プロセッサのインデックスを指定します。 |
TargetVtl |
12 | 1 | はターゲット VTL を指定します。 |
| RsvdZ | 13 | 3 |
Input List 要素
| 名前 | オフセット | サイズ | 提供される情報 |
|---|---|---|---|
RegisterName |
0 | 4 | 変更するレジスタの名前を指定します。 |
| RsvdZ | 4 | 12 | |
RegisterValue |
16 | 16 | 指定したレジスタの新しい値を指定します。 |
早期登録リスト (ARM64)
ARM64 では、ゲスト OS ID レジスタ (HvRegisterGuestOsId) がゼロ以外の値に設定される前に、このハイパーコールを使用して特定のレジスタを設定できます。 これにより、ブート プロセス中に重要なシステム レジスタを早期に初期化できます。
ゲスト OS ID の前に、次のレジスタを設定できます。
| レジスタ名 | Description |
|---|---|
HvRegisterGuestOsId |
ゲスト オペレーティング システム ID レジスタ |
HvArm64RegisterSyntheticVbarEl1 |
EL1 の合成ベクター ベース アドレス レジスタ |
HvRegisterGuestCrashCtl |
ゲスト クラッシュ コントロール レジスタ |
HvRegisterGuestCrashP0 |
ゲスト クラッシュ パラメーター 0 |
HvRegisterGuestCrashP1 |
ゲスト クラッシュ パラメーター 1 |
HvRegisterGuestCrashP2 |
ゲスト クラッシュ パラメーター 2 |
HvRegisterGuestCrashP3 |
ゲスト クラッシュ パラメーター 3 |
HvRegisterGuestCrashP4 |
ゲスト クラッシュ パラメーター 4 |
他のすべてのレジスタでは、このハイパーコールを使用して変更する前に、ゲスト OS ID を確立する (0 以外) 必要があります。
手記:HvRegisterGuestOsIdをゼロ以外の値に設定することは、通常、ハイパーバイザー初期化シーケンスの最初の手順です。これは、ハイパーバイザーに対するゲスト オペレーティング システムを識別し、完全なレジスタ セットへのアクセスを有効にするためです。