KVM 上的 s390 DIAGNOSE 呼叫

s390 上的 KVM 支援 DIAGNOSE 呼叫以進行超呼叫(hypercalls),包括原生超呼叫和在其他 s390 虛擬機器監控程式上發現的特定超呼叫。

請注意,位(bit)的編號遵循通常的 s390 約定(最高有效位在左側)。

一般說明

客戶機發出的 DIAGNOSE 呼叫會引起強制攔截。這意味著所有受支援的 DIAGNOSE 呼叫都需要由 KVM 或其使用者空間處理。

KVM 支援的所有 DIAGNOSE 呼叫都使用 RS-a 格式

--------------------------------------
|  '83'  | R1 | R3 | B2 |     D2     |
--------------------------------------
0        8    12   16   20           31

第二個運算元地址(透過基址/位移計算獲得)不用於定址資料。相反,該地址的位 48-63 指定功能程式碼,而位 0-47 被忽略。

受支援的 DIAGNOSE 功能程式碼因所使用的使用者空間而異。對於非 KVM 特定的 DIAGNOSE 功能程式碼,請參閱定義它們的 s390 虛擬機器監控程式的文件。

DIAGNOSE 功能程式碼 'X'500' - KVM 功能

如果功能程式碼指定為 0x500,則會執行各種 KVM 特定功能,包括 virtio 功能。

通用暫存器 1 包含子功能程式碼。受支援的子功能取決於 KVM 的使用者空間。關於 virtio 子功能,使用者空間通常提供 s390-virtio(子程式碼 0-2)或 virtio-ccw(子程式碼 3)。

DIAGNOSE 指令完成後,通用暫存器 2 包含功能的返回程式碼,該程式碼可以是返回程式碼,也可以是子程式碼特定值。

如果指定的子功能不受支援,將觸發 SPECIFICATION 異常。

子程式碼 0 - s390-virtio 通知和早期控制檯 printk

由使用者空間處理。

子程式碼 1 - s390-virtio 重置

由使用者空間處理。

子程式碼 2 - s390-virtio 設定狀態

由使用者空間處理。

子程式碼 3 - virtio-ccw 通知

由使用者空間或 KVM 處理(ioeventfd 情況)。

通用暫存器 2 包含一個子通道識別字,表示要通知的 virtio-ccw 代理裝置的子通道。

通用暫存器 3 包含要通知的 virtqueue 編號。

通用暫存器 4 包含一個用於 KVM 使用的 64 位識別符號(kvm_io_bus cookie)。如果通用暫存器 4 不包含有效識別符號,則忽略它。

DIAGNOSE 呼叫完成後,如果發生內部錯誤,通用暫存器 2 可能包含一個 64 位識別符號(在 kvm_io_bus cookie 情況下),或者一個負錯誤值。

另請參閱 virtio 標準中對此超呼叫的討論。

子程式碼 4 - 儲存限制

由使用者空間處理。

DIAGNOSE 呼叫完成後,通用暫存器 2 將包含儲存限制:虛擬機器生命週期內可能用於儲存的最大物理地址。

儲存限制不表示當前可用的儲存空間,它可能包括空洞、備用儲存以及為其他目的保留的區域,例如記憶體熱插拔或 virtio-mem 裝置。其他用於檢測實際可用儲存的介面,例如 SCLP,必須與此子功能結合使用。

請注意,儲存限制可以大於,但絕不能小於 SCLP 透過“最大儲存增量”和“增量大小”指示的最大儲存地址。

DIAGNOSE 功能程式碼 'X'501 - KVM 斷點

如果功能程式碼指定為 0x501,則可能執行斷點功能。此功能程式碼由使用者空間處理。

此診斷功能程式碼沒有子功能,也不使用任何引數。

DIAGNOSE 功能程式碼 'X'9C - 自願時間片讓出

通用暫存器 1 包含目標 CPU 地址。

在 LPAR、KVM 或 z/VM 等使用共享宿主機 CPU 的虛擬機器監控程式客戶機中,功能程式碼為 0x9c 的 DIAGNOSE 可以透過讓出客戶機 CPU 正在執行的宿主機 CPU,以便將其分配給另一個客戶機 CPU(最好是包含指定目標 CPU 的邏輯 CPU),從而提高系統性能。

DIAG 'X'9C 轉發

客戶機可能會發送 DIAGNOSE 0x9c 以讓出給某個其他 vcpu。例如,一個 Linux 客戶機試圖讓出給當前持有自旋鎖但未執行的 vcpu。

然而,在宿主機上,支援該 vcpu 的真實 CPU 本身可能沒有執行。將客戶機最初發送的 DIAGNOSE 0x9c 轉發給支援 CPU,有望導致該 CPU(以及隨後客戶機的 vcpu)被排程。

diag9c_forwarding_hz

KVM 核心引數,允許指定每秒 DIAGNOSE 0x9c 轉發的最大次數,以避免 DIAGNOSE 0x9c 轉發風暴。值為 0 會關閉轉發功能。