LoongArch 半虛擬化介面¶
KVM 超呼叫使用程式碼為 0x100 的 HVCL 指令,並將超呼叫編號放入 a0。最多可以將五個引數放入暫存器 a1 - a5 中。返回值放在 v0 (a0 的別名) 中。
此介面的原始碼可以在 arch/loongarch/kvm* 中找到。
查詢是否存在¶
為了確定主機是否在 KVM 上執行,我們可以利用索引為 CPUCFG_KVM_BASE (0x40000000) 的 cpucfg() 函式。
CPUCFG_KVM_BASE 範圍從 0x40000000 到 0x400000FF。 0x40000000 - 0x400000FF 之間的 CPUCFG_KVM_BASE 範圍被標記為保留。 因此,所有當前和未來的處理器都不會在此範圍內實現任何功能。
在 KVM 虛擬化的 Linux 系統上,對索引為 CPUCFG_KVM_BASE (0x40000000) 的 cpucfg() 執行讀取操作會返回魔術字串 ‘KVM0’。
一旦您確定您的主機在支援半虛擬化的 KVM 上執行,您現在可以使用如下所述的超呼叫。
KVM 超呼叫 ABI¶
KVM 超呼叫 ABI 很簡單,只有一個暫存暫存器 a0 (v0) 和最多五個通用暫存器 (a1 - a5) 用作輸入引數。 FP(浮點)和向量暫存器不作為輸入暫存器使用,並且必須在超呼叫期間保持未修改狀態。
超呼叫函式可以內聯,因為它只使用一個暫存暫存器。
引數如下
暫存器
輸入
輸出
a0
函式編號
返回碼
a1
第一個引數
a2
第二個引數
a3
第三個引數
a4
第四個引數
a5
第五個引數
返回碼可能是以下之一
程式碼
含義
0
成功
-1
超呼叫未實現
-2
錯誤的超呼叫引數
KVM 超呼叫文件¶
每個超呼叫的模板如下
超呼叫名稱
目的
1. KVM_HCALL_FUNC_IPI¶
- 目的:
向多個 vCPU 傳送 IPI。
a0: KVM_HCALL_FUNC_IPI
a1: 目標物理 CPUID 的點陣圖的低位部分
a2: 目標物理 CPUID 的點陣圖的高位部分
a3: 點陣圖中最低的物理 CPUID
該超呼叫允許訪客每個超呼叫最多傳送 128 個目的地的多個 IPI(程序間中斷)。 目的地以包含在頭兩個輸入暫存器(a1 和 a2)中的位圖表示。
a1 的位 0 對應於第三個輸入暫存器(a3)中的物理 CPUID,位 1 對應於 a3+1 中的物理 CPUID,依此類推。
LoongArch 上的 PV IPI 包括 PV IPI 多播發送和 PV IPI 接收,並且 SWI 用於 PV IPI 注入,因為沒有 VM-exits 訪問 SWI 暫存器。