ARM 仮想割り込み変換サービス (ITS)
- サポートされるデバイスタイプ:
KVM_DEV_TYPE_ARM_VGIC_ITS ARM 割り込み変換サービスコントローラ
ITS を使うと、MSI(-X) 割り込みをゲストへ注入できる。この拡張は任意である。 仮想 ITS コントローラを作成するには、ホスト側に GICv3 も必要である (arm-vgic-v3.txt を参照)。ただし、物理 ITS コントローラがある必要はない。
ゲストごとに複数の ITS コントローラを置ける。それぞれに、重複しない別々の MMIO 領域が必要である。
グループ
KVM_DEV_ARM_VGIC_GRP_ADDR
- Attributes:
- KVM_VGIC_ITS_ADDR_TYPE (rw, 64-bit)
GICv3 ITS 制御レジスタフレームの、ゲスト物理アドレス空間における ベースアドレス。 このアドレスは 64K に整列している必要があり、領域は 128K を占める。
Errors:
-E2BIG
アドレス可能な IPA 範囲外のアドレス
-EINVAL
アドレスの整列が不正
-EEXIST
アドレスがすでに設定済み
-EFAULT
attr->addr に対する不正なユーザポインタ
-ENODEV
不正な属性、または ITS がサポートされていない
KVM_DEV_ARM_VGIC_GRP_CTRL
- Attributes:
- KVM_DEV_ARM_VGIC_CTRL_INIT
ITS の初期化を要求する。kvm_device_attr.addr に追加のパラメータはない。
- KVM_DEV_ARM_ITS_CTRL_RESET
ITS をリセットする。kvm_device_attr.addr に追加のパラメータはない。 「ITS リセット状態」の節を参照。
- KVM_DEV_ARM_ITS_SAVE_TABLES
ITS のテーブルデータを、ゲストが対応するレジスタ/テーブルエントリで 指定した位置のゲスト RAM に保存する。保存処理でどのページが変更されるかを 特定するためのダーティトラッキングの仕組みをユーザ空間が求めるなら、 vCPU がダーティにしたメモリを追跡する別の仕組みを使う場合でも、 ビットマップを使うこと。
ゲストメモリ内のテーブルのレイアウトは ABI を定める。エントリは最後の 段落で述べるようにリトルエンディアン形式で並ぶ。
- KVM_DEV_ARM_ITS_RESTORE_TABLES
ITS テーブルをゲスト RAM から ITS 内部構造へ復元する。
ITS より先に GICv3 を復元しなければならず、GITS_CTLR 以外のすべての ITS レジスタを ITS テーブルの復元より先に復元しなければならない。
GITS_IIDR 読み取り専用レジスタも、KVM_DEV_ARM_ITS_RESTORE_TABLES を 呼ぶ前に復元しなければならない。IIDR のリビジョンフィールドが ABI の リビジョンを表すためである。
GICv3/ITS を復元するときの期待される順序は「ITS 復元シーケンス」の節に 書かれている。
Errors:
-ENXIO
ITS がこの属性を設定する前に要求どおりに適切に設定されて いない
-ENOMEM
ITS 内部データを割り当てるときのメモリ不足
-EINVAL
復元されたデータが矛盾している
-EFAULT
不正なゲスト RAM アクセス
-EBUSY
1 つ以上の vCPU が動作している
-EACCES
仮想 ITS が物理 GICv4 ITS でバックアップされており、 GICv4.1 なしでは状態を取得できない
KVM_DEV_ARM_VGIC_GRP_ITS_REGS
- Attributes:
kvm_device_attr の attr フィールドは、ITS 制御フレームのベースアドレス (ITS_base) からの相対で ITS レジスタのオフセットを表す。
kvm_device_attr.addr は、対象レジスタの幅 (32/64 ビット) にかかわらず __u64 の値を指す。64 ビットレジスタは全長でしかアクセスできない。
読み取り専用レジスタへの書き込みは、次のものを除いてカーネルに無視される:
GITS_CREADR。これを復元しないと、CWRITER を復元した後にキュー内の コマンドが再実行される。GITS_CREADR は、ITS を有効にする可能性が 高い GITS_CTLR を復元する前に復元しなければならない。また、 GITS_CBASER への書き込みが GITS_CREADR をリセットするため、 GITS_CBASER の後に復元しなければならない。
GITS_IIDR。Revision フィールドがテーブルレイアウトの ABI リビジョンを 表す。将来、仮想 LPI の直接注入を実装するかもしれない。その場合、 テーブルレイアウトの更新と ABI の変更が必要になる。GITS_IIDR は KVM_DEV_ARM_ITS_RESTORE_TABLES を呼ぶ前に復元しなければならない。
その他のレジスタについては、レジスタの取得や設定は、実ハードウェアで レジスタを読み書きするのと同じ効果を持つ。
Errors:
-ENXIO
オフセットがサポートされるどのレジスタにも対応しない
-EFAULT
attr->addr に対する不正なユーザポインタ
-EINVAL
オフセットが 64 ビットに整列していない
-EBUSY
1 つ以上の vCPU が動作している
ITS 復元シーケンス:
GIC、ITS、KVM_IRQFD の割り当てを復元するときは、次の順序に従わなければ ならない:
すべてのゲストメモリを復元し、vCPU を作成する
すべての redistributor を復元する
ITS のベースアドレスを渡す (KVM_DEV_ARM_VGIC_GRP_ADDR)
ITS を次の順序で復元する:
GITS_CBASER を復元する
GITS_CTLR 以外の他のすべての
GITS_レジスタを復元する!ITS のテーブルデータをロードする (KVM_DEV_ARM_ITS_RESTORE_TABLES)
GITS_CTLR を復元する
MSI の KVM_IRQFD の割り当てを復元する
その後、vCPU を開始できる。
ITS テーブル ABI REV0:
ABI のリビジョン 0 は仮想 GICv3 の機能だけをサポートし、ネストハイパーバイザ 向けの仮想割り込みの直接注入をサポートする仮想 GICv4 はサポートしない。
デバイステーブルと ITT は、それぞれ DeviceID と EventID で索引付けされる。 コレクションテーブルは CollectionID で索引付けされず、コレクション内の エントリは特定の順序で並べられていない。 すべてのエントリは 8 バイトである。
デバイステーブルエントリ (DTE):
bits: | 63| 62 ... 49 | 48 ... 5 | 4 ... 0 | values: | V | next | ITT_addr | Size |where: - V はエントリが有効かどうかを示す。無効なら他のフィールドは意味を持たない。 - next: このエントリが最後なら 0 に等しい。そうでなければ、次の DTE への
DeviceID オフセットに対応し、2^14 -1 で上限が付く。
ITT_addr は ITT アドレスのビット [51:8] に一致する (256 バイトに整列)。
Size は EventID にサポートされるビット数から 1 を引いた値を指定する
コレクションテーブルエントリ (CTE):
bits: | 63| 62 .. 52 | 51 ... 16 | 15 ... 0 | values: | V | RES0 | RDBase | ICID |where: - V はエントリが有効かどうかを示す。無効なら他のフィールドは意味を持たない。 - RES0: Should-Be-Zero-or-Preserved の挙動を持つ予約済みフィールド。 - RDBase は PE 番号である (GICR_TYPER.Processor_Number の意味)。 - ICID はコレクション ID である
割り込み変換エントリ (ITE):
bits: | 63 ... 48 | 47 ... 16 | 15 ... 0 | values: | next | pINTID | ICID |where: - next: このエントリが最後なら 0 に等しい。そうでなければ、次の ITE への
EventID オフセットに対応し、2^16 -1 で上限が付く。
pINTID は物理 LPI ID である。0 ならエントリは無効であり、他のフィールドは 意味を持たない。
ICID はコレクション ID である
ITS リセット状態:
RESET は、ITS を最初に作成して初期化したときと同じ状態に戻す。RESET コマンドが 戻ると、次のことが保証される:
ITS は有効になっておらず、静止している GITS_CTLR.Enabled = 0 .Quiescent=1
内部にキャッシュされた状態はない
コレクションテーブルもデバイステーブルも使われていない GITS_BASER<n>.Valid = 0
GITS_CBASER = 0、GITS_CREADR = 0、GITS_CWRITER = 0
ABI バージョンは変わらず、ITS デバイスを最初に作成したときに設定された ままである。