Unverified Commit ab8bc242 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!5655 add steal time software breakpoint pv ipi support for loongarch kvm

Merge Pull Request from: @lixianglai 
 
Add hypercall instruction emulation
Add cpucfg area for kvm hypervisor
Add vcpu search support from physical cpuid
Add pv ipi support on kvm side
Add pv ipi support on guest kernel side
Add hypercall for LoongArch
Add software breakpoint support
loongson-eiointc: Add virt extension support
Add steal time support in kvm side
Add steal time support in guest side

ISSUE: https://gitee.com/openeuler/kernel/issues/I9BTWW 
 
Link:https://gitee.com/openeuler/kernel/pulls/5655

 

Reviewed-by: default avatarMao Bibo <maobibo@loongson.cn>
Signed-off-by: default avatarZheng Zengkai <zhengzengkai@huawei.com>
parents c1283078 f860ab82
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -14,6 +14,7 @@ KVM
   s390/index
   ppc-pv
   x86/index
   loongarch/index

   locking
   vcpu-requests
+79 −0
Original line number Diff line number Diff line
.. 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 and up to five arguments may be placed in a1-a5, the
return value is placed in v0 (alias with a0).

The code for that interface can be found in arch/loongarch/kvm/*

Querying for existence
======================

To find out if we're running on KVM or not, cpucfg can be used with index
CPUCFG_KVM_BASE (0x40000000), cpucfg range between 0x40000000 - 0x400000FF
is marked as a specially reserved range. All existing and future processors
will not implement any features in this range.

When Linux is running on KVM, cpucfg with index CPUCFG_KVM_BASE (0x40000000)
returns magic string "KVM\0"

Once you determined you're running under a PV capable KVM, you can now use
hypercalls as described below.

KVM hypercall ABI
=================

Hypercall ABI on KVM is simple, only one scratch register a0 (v0) and at most
five generic registers used as input parameter. FP register and vector register
is not used for input register and should not be modified during hypercall.
Hypercall function can be inlined since there is only 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		-
        ========	================	================

Return codes can be as follows:

	====		=========================
	Code		Meaning
	====		=========================
	0		Success
	-1		Hypercall not implemented
	-2		Hypercall parameter error
	====		=========================

KVM Hypercalls Documentation
============================

The template for each hypercall is:
1. Hypercall name
2. Purpose

1. KVM_HCALL_FUNC_PV_IPI
------------------------

:Purpose: Send IPIs to multiple vCPUs.

- a0: KVM_HCALL_FUNC_PV_IPI
- a1: lower part of the bitmap of destination physical CPUIDs
- a2: higher part of the bitmap of destination physical CPUIDs
- a3: the lowest physical CPUID in bitmap

The hypercall lets a guest send multicast IPIs, with at most 128
destinations per hypercall.  The destinations are represented by a bitmap
contained in the first two arguments (a1 and a2). Bit 0 of a1 corresponds
to the physical CPUID in the third argument (a3), bit 1 corresponds to the
physical ID a3+1, and so on.
+10 −0
Original line number Diff line number Diff line
.. SPDX-License-Identifier: GPL-2.0

=========================
KVM for LoongArch systems
=========================

.. toctree::
   :maxdepth: 2

   hypercalls.rst
+9 −0
Original line number Diff line number Diff line
@@ -567,6 +567,15 @@ config CPU_HAS_PREFETCH
	bool
	default y

config PARAVIRT
	bool "Enable paravirtualization code"
	depends on AS_HAS_LVZ_EXTENSION
	help
          This changes the kernel so it can modify itself when it is run
	  under a hypervisor, potentially improving performance significantly
	  over full virtualization.  However, when run without a hypervisor
	  the kernel is theoretically slower and slightly larger.

config ARCH_SUPPORTS_KEXEC
	def_bool y

+0 −1
Original line number Diff line number Diff line
@@ -23,4 +23,3 @@ generic-y += poll.h
generic-y += param.h
generic-y += posix_types.h
generic-y += resource.h
generic-y += kvm_para.h
Loading