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. ハイパーコール名

  2. 目的

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 を使う。