arm64 向けの準仮想化時刻サポート
Arm 仕様 DEN0057/A は、AArch64 ゲスト向けの準仮想化時刻サポートの標準を 定めている:
https://developer.arm.com/docs/den0057/a
KVM/arm64 は、この仕様のうちスティール時間の部分を実装している。準仮想化 ゲストが、自身の実行から奪われた時間の量を把握できるようにするため、 いくつかのハイパーバイザサービスコールを提供する。
次の 2 つの SMCCC 互換ハイパーコールが定義されている:
PV_TIME_FEATURES: 0xC5000020
PV_TIME_ST: 0xC5000021
これらは SMC64/HVC64 呼び出し規約でのみ利用できる。32 ビット Arm ゲストでは 準仮想化時刻を利用できないためである。PV_TIME_FEATURES ハイパーコールの 存在は、呼び出す前に SMCCC 1.1 の ARCH_FEATURES の仕組みで調べるべきである。
PV_TIME_FEATURES
ファンクション ID:
(uint32) 0xC5000020
PV_call_id:
- (uint32) サポートを問い合わせるファンクション。
現在は PV_TIME_ST のみをサポートする。
戻り値:
- (int64) 該当する PV-time 機能をハイパーバイザがサポート
していれば、NOT_SUPPORTED (-1) または SUCCESS (0) を返す。
PV_TIME_ST
ファンクション ID:
(uint32) 0xC5000021
戻り値:
- (int64) この VCPU のスティール時間データ構造体の IPA。
失敗時は NOT_SUPPORTED (-1)。
PV_TIME_ST が返す IPA は、ゲストが通常メモリとして、内部共有可能ドメインで、 インナーおよびアウターのライトバックキャッシュ属性を付けてマップすべきで ある。返された IPA の先頭 16 バイトについては、ハイパーバイザが意味のある 値で埋めることが保証されている(下記の構造体を参照)。
PV_TIME_ST は、呼び出した VCPU の構造体を返す。
スティール時間
PV_TIME_ST ハイパーコールが指す構造体は次のとおりである:
フィールド |
バイト長 |
バイトオフセット |
説明 |
|---|---|---|---|
Revision |
4 |
0 |
バージョン 1.0 では 0 でなければならない |
Attributes |
4 |
4 |
0 でなければならない |
Stolen time |
8 |
8 |
この VCPU スレッドが物理 CPU 上で意図せず 実行されていなかった時間を、符号なしナノ秒で 表したスティール時間。 |
構造体内の値はすべてリトルエンディアンで格納される。
この構造体は、VCPU をスケジュールする前にハイパーバイザが更新する。ゲストに 与えられた通常メモリの予約領域内に置かれる。ゲストはこのメモリに書き込もうと してはならない。構造体はゲストの VCPU ごとに 1 つある。
これらの構造体のために 64k ページを 1 つ以上確保し、ほかの用途に使わないのが 望ましい。そうするとゲストはその領域を 64k ページでマップでき、ほかのメモリと 属性が衝突するのを避けられる。
ユーザ空間向けのインタフェースは Documentation/virt/kvm/devices/vcpu.rst を 参照。