ARM 仮想汎用割り込みコントローラ v2 (VGIC)

サポートされるデバイスタイプ:

  • KVM_DEV_TYPE_ARM_VGIC_V2 ARM 汎用割り込みコントローラ v2.0

VGIC インスタンスは、この API かレガシーな KVM_CREATE_IRQCHIP API のどちらかを 介して 1 つだけ生成できる。作成された VGIC は VM の割り込みコントローラとして動作し、 エミュレートされたユーザ空間デバイスは、CPU に直接ではなく VGIC に割り込みを 注入する必要がある。

ハードウェア互換性サポートを備えた GICv3 実装では、このインターフェースを介して ゲスト GICv2 を作成できる。ゲスト GICv3 デバイスとゲスト ITS デバイスの作成については、 arm-vgic-v3.txt を参照。同じ VM 上で GICv3 デバイスと GICv2 デバイスの両方を 作成することはできない。

Groups:
KVM_DEV_ARM_VGIC_GRP_ADDR

Attributes:

KVM_VGIC_V2_ADDR_TYPE_DIST (rw, 64-bit)

ゲスト物理アドレス空間における GIC ディストリビュータレジスタマッピングの ベースアドレス。KVM_DEV_TYPE_ARM_VGIC_V2 でのみ有効。 このアドレスは 4K にアラインされている必要があり、領域は 4 KByte をカバーする。

KVM_VGIC_V2_ADDR_TYPE_CPU (rw, 64-bit)

ゲスト物理アドレス空間における GIC 仮想 CPU インターフェースレジスタマッピングの ベースアドレス。KVM_DEV_TYPE_ARM_VGIC_V2 でのみ有効。 このアドレスは 4K にアラインされている必要があり、領域は 8 KByte をカバーする。

Errors:

-E2BIG

アドレスがアドレス指定可能な IPA 範囲外である

-EINVAL

アドレスのアラインメントが正しくない

-EEXIST

アドレスがすでに設定されている

-ENXIO

このデバイスに対してグループまたは属性が不明/未サポートである、 またはハードウェアサポートがない。

-EFAULT

attr->addr のユーザポインタが無効である。

KVM_DEV_ARM_VGIC_GRP_DIST_REGS

Attributes:

kvm_device_attr の attr フィールドは 2 つの値をエンコードする:

bits:     | 63   ....  40 | 39 ..  32  |  31   ....    0 |
values:   |    reserved   | vcpu_index |      offset     |

すべてのディストリビュータレジスタは (rw, 32-bit) である。

オフセットは、GICv2 仕様で定義されている "Distributor base address" に対する 相対値である。このようなレジスタを取得または設定することは、vcpu_index フィールドで インデックスが指定された CPU から実際のハードウェア上でレジスタを読み書きするのと 同じ効果を持つ。ほとんどのディストリビュータフィールドはバンク化されておらず、 レジスタへのアクセスに使われた vcpu_index に関係なく同じ値を返すことに注意。

GICD_IIDR.Revision は、エミュレートされた GICv2 の KVM 実装が、ゲストまたは ユーザ空間から直接観測できる形で変更されたときに更新される。 ユーザ空間は、KVM から GICD_IIDR を読み取り、読み取った値を書き戻して、 期待する動作が KVM 実装と整合していることを確認すべきである。 ユーザ空間は、期待する動作を保証するために、他のレジスタ (KVM_DEV_ARM_VGIC_GRP_DIST_REGS と KVM_DEV_ARM_VGIC_GRP_CPU_REGS の両方) を設定する前に GICD_IIDR を設定すべきである。 ユーザ空間から GICD_IIDR が設定されていない限り、割り込みグループレジスタ (GICD_IGROUPR) への書き込みは無視される。

Errors:

-ENXIO

このレジスタの取得または設定はまだサポートされていない

-EBUSY

1 つ以上の vCPU が実行中である

-EINVAL

無効な vcpu_index が指定された

KVM_DEV_ARM_VGIC_GRP_CPU_REGS

Attributes:

kvm_device_attr の attr フィールドは 2 つの値をエンコードする:

bits:     | 63   ....  40 | 39 ..  32  |  31   ....    0 |
values:   |    reserved   | vcpu_index |      offset     |

すべての CPU インターフェースレジスタは (rw, 32-bit) である。

オフセットは、GICv2 仕様で定義されている "CPU interface base address" からの オフセットを指定する。このようなレジスタを取得または設定することは、実際の ハードウェア上でレジスタを読み書きするのと同じ効果を持つ。

Active Priorities Registers APRn は実装定義であるため、我々の実装では、 ゲストに提示する "セキュリティ拡張のない GICv2 実装" のモデルに合う固定形式を 設定する。このインターフェースは常に 4 つのレジスタ APR[0-3] を公開し、 最大 128 のプリエンプションレベルを記述する。レジスタのセマンティクスは、 対応するビットを設定することで、特定のプリエンプションレベルにある割り込みが アクティブ状態かどうかを示す。

したがって、プリエンプションレベル X に 1 つ以上のアクティブな割り込みがあるのは、 次の場合に限る:

APRn[X mod 32] == 0b1、ここで n = X / 32

未定義のプリエンプションレベルのビットは RAZ/WI である。

これは、ハードウェア上の CPU から見た APR の見方とは異なることに注意。 セキュリティ拡張のない GIC では、グループ 0 とグループ 1 のアクティブ優先度を 別々のレジスタグループで公開するが、我々は GICv2 の GICH_APR に似た 統合ビューを示す。

歴史的な理由と、ユーザ空間との ABI 互換性を提供するため、我々は GICC_PMR レジスタを、 ワードの下位 5 ビットにある GICH_VMCR.VMPriMask フィールドの形式でエクスポートする。 つまり、ユーザ空間は KVM デバイスと通信するために常に下位 5 ビットを使わなければならず、 実際の優先度マスクレベルを得るには値を 3 桁左シフトしなければならない。

Errors:

-ENXIO

このレジスタの取得または設定はまだサポートされていない

-EBUSY

1 つ以上の vCPU が実行中である

-EINVAL

無効な vcpu_index が指定された

KVM_DEV_ARM_VGIC_GRP_NR_IRQS

Attributes:

この GIC インスタンスの割り込み数 (SGI、PPI、SPI) を記述する値。 64 から 1024 まで、32 刻みである。

Errors:

-EINVAL

設定値が想定範囲外である

-EBUSY

値がすでに設定されている、または GIC がすでにデフォルト値で 初期化されている。

KVM_DEV_ARM_VGIC_GRP_CTRL

Attributes:

KVM_DEV_ARM_VGIC_CTRL_INIT

VGIC または ITS の初期化を要求する。kvm_device_attr.addr に追加のパラメータはない。

Errors:

-ENXIO

この属性を呼び出す前に、VGIC が必要に応じて適切に 設定されていない

-ENODEV

オンラインの vCPU がない

-ENOMEM

vgic 内部データの割り当て時にメモリ不足