| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- .. 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.
|