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 の割り当てを復元するときは、次の順序に従わなければ ならない:

  1. すべてのゲストメモリを復元し、vCPU を作成する

  2. すべての redistributor を復元する

  3. ITS のベースアドレスを渡す (KVM_DEV_ARM_VGIC_GRP_ADDR)

  4. ITS を次の順序で復元する:

    1. GITS_CBASER を復元する

    2. GITS_CTLR 以外の他のすべての GITS_ レジスタを復元する!

    3. ITS のテーブルデータをロードする (KVM_DEV_ARM_ITS_RESTORE_TABLES)

    4. GITS_CTLR を復元する

  5. 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 デバイスを最初に作成したときに設定された ままである。