LoongArch 準仮想化インタフェース
KVM ハイパーコールは、コード 0x100 を指定した HVCL 命令を使い、 ハイパーコール番号を a0 に置く。引数は最大 5 個をレジスタ a1〜a5 に 置ける。戻り値は v0(a0 の別名)に置く。
このインタフェースのソースコードは arch/loongarch/kvm* にある。
存在の確認
ホストが KVM 上で動作しているかを調べるには、インデックス CPUCFG_KVM_BASE(0x40000000)で cpucfg() 関数を利用できる。
CPUCFG_KVM_BASE の範囲は 0x40000000 から 0x400000FF にわたり、 0x40000000〜0x400000FF の範囲は予約済みとして扱われる。したがって、 現在および将来のすべてのプロセッサは、この範囲内の機能を実装しない。
KVM で仮想化された Linux システムでは、インデックス CPUCFG_KVM_BASE(0x40000000)で cpucfg() を読み出すと、マジック文字列 'KVM0' が返る。
ホストが準仮想化に対応した KVM 上で動作していると分かったら、以下で 説明するハイパーコールを使える。
KVM ハイパーコール ABI
KVM のハイパーコール ABI は単純である。スクラッチレジスタ a0(v0)を 1 つと、 入力パラメータとして最大 5 個の汎用レジスタ(a1〜a5)を使う。FP(浮動 小数点)レジスタとベクタレジスタは入力レジスタとして使わず、ハイパーコール の間は変更してはならない。
ハイパーコールはスクラッチレジスタを 1 つしか使わないので、インライン化 できる。
パラメータは次のとおりである:
レジスタ
入力
出力
a0
ファンクション番号
戻りコード
a1
第 1 パラメータ
a2
第 2 パラメータ
a3
第 3 パラメータ
a4
第 4 パラメータ
a5
第 5 パラメータ
戻りコードは次のいずれかである:
コード
意味
0
成功
-1
ハイパーコールが実装されていない
-2
ハイパーコールのパラメータが不正
KVM ハイパーコールのドキュメント
各ハイパーコールのテンプレートは次のとおりである:
ハイパーコール名
目的
1. KVM_HCALL_FUNC_IPI
- Purpose:
複数の vCPU に IPI を送る。
a0: KVM_HCALL_FUNC_IPI
a1: 送信先の物理 CPUID のビットマップの下位部分
a2: 送信先の物理 CPUID のビットマップの上位部分
a3: ビットマップ内で最も小さい物理 CPUID
このハイパーコールを使うと、ゲストは 1 回のハイパーコールで最大 128 個の 宛先に複数の IPI(プロセッサ間割り込み)を送れる。宛先は、最初の 2 つの 入力レジスタ(a1 と a2)に入るビットマップで表す。
a1 のビット 0 は 3 番目の入力レジスタ(a3)の物理 CPUID に対応し、ビット 1 は a3+1 の物理 CPUID に対応する。以下同様である。
LoongArch の PV IPI には、PV IPI のマルチキャスト送信と PV IPI の受信の 両方が含まれる。SWI レジスタにアクセスする VM エグジットが存在しないため、 PV IPI の注入には SWI を使う。