arm64 における vCPU 機能の選択

KVM/arm64 は、ゲストに見せる CPU 機能をユーザ空間から設定する 2 つの仕組みを提供する。

KVM_ARM_VCPU_INIT

KVM_ARM_VCPU_INIT ioctl は、機能フラグのビットマップ (struct kvm_vcpu_init::features)を受け取る。このインタフェースで有効に する機能は*オプトイン*であり、UAPI が変わる/拡張されることがある。この ioctl が制御する機能の完全なドキュメントは 4.82 KVM_ARM_VCPU_INIT を参照。

それ以外の、KVM がサポートする CPU 機能はすべて、アーキテクチャで定義された ID レジスタに記述される。

ID レジスタ

Arm アーキテクチャは、CPU 実装がサポートするアーキテクチャ機能の集合を 記述する ID レジスタ の範囲を定めている。KVM は、ゲストの ID レジスタを、 システムがサポートする CPU 機能の最大集合に初期化する。KVM では ID レジスタの値を VM スコープにできる。つまり、その値は VM 内のすべての vCPU で 共有されうる。

KVM では、ユーザ空間が KVM_SET_ONE_REG ioctl で値を書き込むことで、 ID レジスタが記述する特定の CPU 機能を*オプトアウト*できる。ID レジスタは、 VM が起動するまで、すなわちユーザ空間が VM 内の少なくとも 1 つの vCPU で KVM_RUN を呼び出すまで変更できる。ユーザ空間は、 KVM_ARM_GET_REG_WRITABLE_MASKS を使うと、ID レジスタのどのフィールドが 変更可能かを調べられる。詳しくは ioctl のドキュメント を参照。

ユーザ空間は、アーキテクチャが DDI0487J.a の D19.1.3 「Principles of the ID scheme for fields in ID register」で示す規則に従って、 CPU 機能を*制限*または*マスク*できる。KVM は、システムの能力を超える ID レジスタの値を許可しない。

警告

ユーザ空間は、vCPU の残りの CPU レジスタ状態にアクセスする前に ID レジスタの値を変更することを 強く推奨する。KVM は ID レジスタの値を 使って機能のエミュレーションを制御することがある。ID レジスタの変更と ほかのシステムレジスタへのアクセスを交互に行うと、予測できない動作に なるおそれがある。