Linux KVM 超級呼叫

X86

KVM 超級呼叫包含一個三位元組的 vmcall 或 vmmcall 指令序列。虛擬機器監控程式可以將其替換為保證支援的指令。

最多可以將四個引數分別傳遞到 rbx、rcx、rdx 和 rsi 中。超級呼叫號應放置在 rax 中,返回值將放置在 rax 中。除非特定的超級呼叫明確宣告,否則不會破壞其他暫存器。

S390

R2-R7 用於引數 1-6。此外,R1 用於超級呼叫號。返回值寫入 R2。

S390 使用 diagnose 指令作為超級呼叫 (0x500),同時 R1 中包含超級呼叫號。

有關 KVM 支援的 S390 diagnose 呼叫的更多資訊,請參閱KVM 上的 s390 DIAGNOSE 呼叫

PowerPC

它使用 R3-R10,並且超級呼叫號在 R11 中。R4-R11 用作輸出暫存器。返回值放置在 R3 中。

KVM 超級呼叫使用 4 位元組操作碼,這些操作碼透過裝置樹 /hypervisor 節點內的“hypercall-instructions”屬性進行修補。有關更多資訊,請參閱PPC KVM 半虛擬化介面

MIPS

KVM 超級呼叫使用 HYPCALL 指令,程式碼為 0,超級呼叫號在 $2 (v0) 中。最多可以將四個引數放置在 $4-$7 (a0-a3) 中,返回值放置在 $2 (v0) 中。

KVM 超級呼叫文件

每個超級呼叫的模板是:1. 超級呼叫名稱。2. 架構 3. 狀態(已廢棄、已過時、活躍) 4. 目的

1. KVM_HC_VAPIC_POLL_IRQ

架構:

x86

狀態:

活躍

目的:

觸發客戶機退出,以便宿主機在重新進入時檢查掛起的中斷。

2. KVM_HC_MMU_OP

架構:

x86

狀態:

已廢棄。

目的:

支援 MMU 操作,例如寫入 PTE、重新整理 TLB、釋放 PT。

3. KVM_HC_FEATURES

架構:

PPC

狀態:

活躍

目的:

向客戶機公開超級呼叫可用性。在 x86 平臺上,cpuid 用於列舉哪些超級呼叫可用。在 PPC 上,可以使用基於裝置樹的查詢(這也是 EPAPR 規定的)或 KVM 特定列舉機制(即此超級呼叫)。

4. KVM_HC_PPC_MAP_MAGIC_PAGE

架構:

PPC

狀態:

活躍

目的:

為了啟用虛擬機器監控程式和客戶機之間的通訊,有一個共享頁面,其中包含部分對超級使用者可見的暫存器狀態。客戶機可以使用此超級呼叫將此共享頁面對映到透過記憶體訪問其超級使用者暫存器。

5. KVM_HC_KICK_CPU

架構:

x86

狀態:

活躍

目的:

用於喚醒 HLT 狀態的 vcpu 的超級呼叫

使用示例:

在客戶機核心模式下忙等待事件發生(例如:自旋鎖變為可用)的半虛擬化客戶機的 vcpu,在忙等待超過閾值時間間隔後,可以執行 HLT 指令。執行 HLT 指令將導致虛擬機器監控程式使 vcpu 睡眠,直到發生適當的事件。同一客戶機的另一個 vcpu 可以透過發出 KVM_HC_KICK_CPU 超級呼叫來喚醒睡眠的 vcpu,指定要喚醒的 vcpu 的 APIC ID (a1)。超級呼叫中使用了附加引數 (a0) 用於將來用途。

6. KVM_HC_CLOCK_PAIRING

架構:

x86

狀態:

活躍

目的:

用於同步宿主機和客戶機時鐘的超級呼叫。

用法

a0: 宿主機複製“struct kvm_clock_offset”結構的客戶機物理地址。

a1: clock_type,目前僅支援 KVM_CLOCK_PAIRING_WALLCLOCK (0)(對應於宿主機的 CLOCK_REALTIME 時鐘)。

struct kvm_clock_pairing {
        __s64 sec;
        __s64 nsec;
        __u64 tsc;
        __u32 flags;
        __u32 pad[9];
};
其中
  • sec: 來自 clock_type 時鐘的秒數。

  • nsec: 來自 clock_type 時鐘的納秒數。

  • tsc: 用於計算秒/納秒對的客戶機 TSC 值

  • flags: 標誌,目前未使用 (0)。

該超級呼叫允許客戶機在宿主機和客戶機之間計算精確的時間戳。客戶機可以使用返回的 TSC 值在同一時刻計算其時鐘的 CLOCK_REALTIME。

如果宿主機不使用 TSC 時鐘源,或者時鐘型別與 KVM_CLOCK_PAIRING_WALLCLOCK 不同,則返回 KVM_EOPNOTSUPP。

6. KVM_HC_SEND_IPI

架構:

x86

狀態:

活躍

目的:

向多個 vCPU 傳送 IPI。

  • a0: 目標 APIC ID 點陣圖的低位部分

  • a1: 目標 APIC ID 點陣圖的高位部分

  • a2: 點陣圖中的最低 APIC ID

  • a3: APIC ICR

該超級呼叫允許客戶機發送組播 IPI,在 64 位模式下每個超級呼叫最多 128 個目的地,在 32 位模式下每個超級呼叫最多 64 個 vCPU。目的地由前兩個引數 (a0 和 a1) 中包含的位圖表示。a0 的第 0 位對應於第三個引數 (a2) 中的 APIC ID,第 1 位對應於 APIC ID a2+1,依此類推。

返回成功傳送 IPI 的 CPU 數量。

7. KVM_HC_SCHED_YIELD

架構:

x86

狀態:

活躍

目的:

如果 IPI 目標 vCPU 被搶佔,則使用超級呼叫進行讓步

a0: 目標 APIC ID

使用示例:

當向 vCPU 傳送 call-function IPI-many 時,如果任何 IPI 目標 vCPU 被搶佔,則讓步。

8. KVM_HC_MAP_GPA_RANGE

架構:

x86

狀態:

活躍

目的:

請求 KVM 對映指定屬性的 GPA 範圍。

a0: 起始頁的客戶機物理地址 a1: 頁數(4kb)(必須在 GPA 空間中連續) a2: 屬性

其中“屬性”
  • 位 3:0 - 首選頁面大小編碼 0 = 4kb, 1 = 2mb, 2 = 1gb, 等...

  • 位 4 - 明文 = 0, 加密 = 1

  • 位 63:5 - 保留(必須為零)

實現說明:此超級呼叫透過 KVM_CAP_EXIT_HYPERCALL 能力在使用者空間中實現。使用者空間必須在客戶機 CPUID 中宣傳 KVM_FEATURE_HC_MAP_GPA_RANGE 之前啟用該能力。此外,如果客戶機支援 KVM_FEATURE_MIGRATION_CONTROL,使用者空間還必須設定 MSR 過濾器以處理對 MSR_KVM_MIGRATION_CONTROL 的寫入。