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 を 参照。