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. 超呼叫名稱

  2. 目的

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 暫存器。