Loongarch: KVM: Add KVM hypercalls documentation for LoongArch
Add documentation topic for using pv_virt when running as a guest on KVM hypervisor. Signed-off-by: Bibo Mao <maobibo@loongson.cn> Signed-off-by: Xianglai Li <lixianglai@loongson.cn> Co-developed-by: Mingcong Bai <jeffbai@aosc.io> Signed-off-by: Mingcong Bai <jeffbai@aosc.io> Link: https://lore.kernel.org/all/5c338084b1bcccc1d57dce9ddb1e7081@aosc.io/ Signed-off-by: Dandan Zhang <zhangdandan@uniontech.com> [jc: fixed htmldocs build error] Signed-off-by: Jonathan Corbet <corbet@lwn.net> Link: https://lore.kernel.org/r/4769C036576F8816+20240828045950.3484113-1-zhangdandan@uniontech.com
This commit is contained in:
parent
e04eb52bfa
commit
bc6cb62007
@ -14,6 +14,7 @@ KVM
|
|||||||
s390/index
|
s390/index
|
||||||
ppc-pv
|
ppc-pv
|
||||||
x86/index
|
x86/index
|
||||||
|
loongarch/index
|
||||||
|
|
||||||
locking
|
locking
|
||||||
vcpu-requests
|
vcpu-requests
|
||||||
|
89
Documentation/virt/kvm/loongarch/hypercalls.rst
Normal file
89
Documentation/virt/kvm/loongarch/hypercalls.rst
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
.. SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
|
===================================
|
||||||
|
The LoongArch paravirtual interface
|
||||||
|
===================================
|
||||||
|
|
||||||
|
KVM hypercalls use the HVCL instruction with code 0x100 and the hypercall
|
||||||
|
number is put in a0. Up to five arguments may be placed in registers a1 - a5.
|
||||||
|
The return value is placed in v0 (an alias of a0).
|
||||||
|
|
||||||
|
Source code for this interface can be found in arch/loongarch/kvm*.
|
||||||
|
|
||||||
|
Querying for existence
|
||||||
|
======================
|
||||||
|
|
||||||
|
To determine if the host is running on KVM, we can utilize the cpucfg()
|
||||||
|
function at index CPUCFG_KVM_BASE (0x40000000).
|
||||||
|
|
||||||
|
The CPUCFG_KVM_BASE range, spanning from 0x40000000 to 0x400000FF, The
|
||||||
|
CPUCFG_KVM_BASE range between 0x40000000 - 0x400000FF is marked as reserved.
|
||||||
|
Consequently, all current and future processors will not implement any
|
||||||
|
feature within this range.
|
||||||
|
|
||||||
|
On a KVM-virtualized Linux system, a read operation on cpucfg() at index
|
||||||
|
CPUCFG_KVM_BASE (0x40000000) returns the magic string 'KVM\0'.
|
||||||
|
|
||||||
|
Once you have determined that your host is running on a paravirtualization-
|
||||||
|
capable KVM, you may now use hypercalls as described below.
|
||||||
|
|
||||||
|
KVM hypercall ABI
|
||||||
|
=================
|
||||||
|
|
||||||
|
The KVM hypercall ABI is simple, with one scratch register a0 (v0) and at most
|
||||||
|
five generic registers (a1 - a5) used as input parameters. The FP (Floating-
|
||||||
|
point) and vector registers are not utilized as input registers and must
|
||||||
|
remain unmodified during a hypercall.
|
||||||
|
|
||||||
|
Hypercall functions can be inlined as it only uses one scratch register.
|
||||||
|
|
||||||
|
The parameters are as follows:
|
||||||
|
|
||||||
|
======== ================= ================
|
||||||
|
Register IN OUT
|
||||||
|
======== ================= ================
|
||||||
|
a0 function number Return code
|
||||||
|
a1 1st parameter -
|
||||||
|
a2 2nd parameter -
|
||||||
|
a3 3rd parameter -
|
||||||
|
a4 4th parameter -
|
||||||
|
a5 5th parameter -
|
||||||
|
======== ================= ================
|
||||||
|
|
||||||
|
The return codes may be one of the following:
|
||||||
|
|
||||||
|
==== =========================
|
||||||
|
Code Meaning
|
||||||
|
==== =========================
|
||||||
|
0 Success
|
||||||
|
-1 Hypercall not implemented
|
||||||
|
-2 Bad Hypercall parameter
|
||||||
|
==== =========================
|
||||||
|
|
||||||
|
KVM Hypercalls Documentation
|
||||||
|
============================
|
||||||
|
|
||||||
|
The template for each hypercall is as follows:
|
||||||
|
|
||||||
|
1. Hypercall name
|
||||||
|
2. Purpose
|
||||||
|
|
||||||
|
1. KVM_HCALL_FUNC_IPI
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
:Purpose: Send IPIs to multiple vCPUs.
|
||||||
|
|
||||||
|
- a0: KVM_HCALL_FUNC_IPI
|
||||||
|
- a1: Lower part of the bitmap for destination physical CPUIDs
|
||||||
|
- a2: Higher part of the bitmap for destination physical CPUIDs
|
||||||
|
- a3: The lowest physical CPUID in the bitmap
|
||||||
|
|
||||||
|
The hypercall lets a guest send multiple IPIs (Inter-Process Interrupts) with
|
||||||
|
at most 128 destinations per hypercall. The destinations are represented in a
|
||||||
|
bitmap contained in the first two input registers (a1 and a2).
|
||||||
|
|
||||||
|
Bit 0 of a1 corresponds to the physical CPUID in the third input register (a3)
|
||||||
|
and bit 1 corresponds to the physical CPUID in a3+1, and so on.
|
||||||
|
|
||||||
|
PV IPI on LoongArch includes both PV IPI multicast sending and PV IPI receiving,
|
||||||
|
and SWI is used for PV IPI inject since there is no VM-exits accessing SWI registers.
|
10
Documentation/virt/kvm/loongarch/index.rst
Normal file
10
Documentation/virt/kvm/loongarch/index.rst
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
.. SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
|
=========================
|
||||||
|
KVM for LoongArch systems
|
||||||
|
=========================
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
|
||||||
|
hypercalls.rst
|
@ -12299,6 +12299,7 @@ L: kvm@vger.kernel.org
|
|||||||
L: loongarch@lists.linux.dev
|
L: loongarch@lists.linux.dev
|
||||||
S: Maintained
|
S: Maintained
|
||||||
T: git git://git.kernel.org/pub/scm/virt/kvm/kvm.git
|
T: git git://git.kernel.org/pub/scm/virt/kvm/kvm.git
|
||||||
|
F: Documentation/virt/kvm/loongarch/
|
||||||
F: arch/loongarch/include/asm/kvm*
|
F: arch/loongarch/include/asm/kvm*
|
||||||
F: arch/loongarch/include/uapi/asm/kvm*
|
F: arch/loongarch/include/uapi/asm/kvm*
|
||||||
F: arch/loongarch/kvm/
|
F: arch/loongarch/kvm/
|
||||||
|
Loading…
Reference in New Issue
Block a user