KVM: PPC: Book3S 64: move KVM interrupt entry to a common entry point
Rather than bifurcate the call depending on whether or not HV is possible, and have the HV entry test for PR, just make a single common point which does the demultiplexing. This makes it simpler to add another type of exit handler. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Reviewed-by: Daniel Axtens <dja@axtens.net> Reviewed-by: Fabiano Rosas <farosas@linux.ibm.com> Acked-by: Paul Mackerras <paulus@ozlabs.org> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20210528090752.3542186-2-npiggin@gmail.com
This commit is contained in:
parent
6ba53317d4
commit
f36011569b
4 changed files with 40 additions and 16 deletions
|
@ -208,7 +208,6 @@ do_define_int n
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
#ifdef CONFIG_KVM_BOOK3S_64_HANDLER
|
#ifdef CONFIG_KVM_BOOK3S_64_HANDLER
|
||||||
#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
|
|
||||||
/*
|
/*
|
||||||
* All interrupts which set HSRR registers, as well as SRESET and MCE and
|
* All interrupts which set HSRR registers, as well as SRESET and MCE and
|
||||||
* syscall when invoked with "sc 1" switch to MSR[HV]=1 (HVMODE) to be taken,
|
* syscall when invoked with "sc 1" switch to MSR[HV]=1 (HVMODE) to be taken,
|
||||||
|
@ -238,13 +237,8 @@ do_define_int n
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If an interrupt is taken while a guest is running, it is immediately routed
|
* If an interrupt is taken while a guest is running, it is immediately routed
|
||||||
* to KVM to handle. If both HV and PR KVM arepossible, KVM interrupts go first
|
* to KVM to handle.
|
||||||
* to kvmppc_interrupt_hv, which handles the PR guest case.
|
|
||||||
*/
|
*/
|
||||||
#define kvmppc_interrupt kvmppc_interrupt_hv
|
|
||||||
#else
|
|
||||||
#define kvmppc_interrupt kvmppc_interrupt_pr
|
|
||||||
#endif
|
|
||||||
|
|
||||||
.macro KVMTEST name
|
.macro KVMTEST name
|
||||||
lbz r10,HSTATE_IN_GUEST(r13)
|
lbz r10,HSTATE_IN_GUEST(r13)
|
||||||
|
|
|
@ -57,6 +57,7 @@ kvm-pr-y := \
|
||||||
book3s_32_mmu.o
|
book3s_32_mmu.o
|
||||||
|
|
||||||
kvm-book3s_64-builtin-objs-$(CONFIG_KVM_BOOK3S_64_HANDLER) += \
|
kvm-book3s_64-builtin-objs-$(CONFIG_KVM_BOOK3S_64_HANDLER) += \
|
||||||
|
book3s_64_entry.o \
|
||||||
tm.o
|
tm.o
|
||||||
|
|
||||||
ifdef CONFIG_KVM_BOOK3S_PR_POSSIBLE
|
ifdef CONFIG_KVM_BOOK3S_PR_POSSIBLE
|
||||||
|
|
36
arch/powerpc/kvm/book3s_64_entry.S
Normal file
36
arch/powerpc/kvm/book3s_64_entry.S
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||||
|
#include <asm/asm-offsets.h>
|
||||||
|
#include <asm/cache.h>
|
||||||
|
#include <asm/kvm_asm.h>
|
||||||
|
#include <asm/kvm_book3s_asm.h>
|
||||||
|
#include <asm/ppc_asm.h>
|
||||||
|
#include <asm/reg.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is branched to from interrupt handlers in exception-64s.S which set
|
||||||
|
* IKVM_REAL or IKVM_VIRT, if HSTATE_IN_GUEST was found to be non-zero.
|
||||||
|
*/
|
||||||
|
.global kvmppc_interrupt
|
||||||
|
.balign IFETCH_ALIGN_BYTES
|
||||||
|
kvmppc_interrupt:
|
||||||
|
/*
|
||||||
|
* Register contents:
|
||||||
|
* R12 = (guest CR << 32) | interrupt vector
|
||||||
|
* R13 = PACA
|
||||||
|
* guest R12 saved in shadow VCPU SCRATCH0
|
||||||
|
* guest R13 saved in SPRN_SCRATCH0
|
||||||
|
*/
|
||||||
|
#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
|
||||||
|
std r9,HSTATE_SCRATCH2(r13)
|
||||||
|
lbz r9,HSTATE_IN_GUEST(r13)
|
||||||
|
cmpwi r9,KVM_GUEST_MODE_HOST_HV
|
||||||
|
beq kvmppc_bad_host_intr
|
||||||
|
#ifdef CONFIG_KVM_BOOK3S_PR_POSSIBLE
|
||||||
|
cmpwi r9,KVM_GUEST_MODE_GUEST
|
||||||
|
ld r9,HSTATE_SCRATCH2(r13)
|
||||||
|
beq kvmppc_interrupt_pr
|
||||||
|
#endif
|
||||||
|
b kvmppc_interrupt_hv
|
||||||
|
#else
|
||||||
|
b kvmppc_interrupt_pr
|
||||||
|
#endif
|
|
@ -1272,16 +1272,8 @@ kvmppc_interrupt_hv:
|
||||||
* R13 = PACA
|
* R13 = PACA
|
||||||
* guest R12 saved in shadow VCPU SCRATCH0
|
* guest R12 saved in shadow VCPU SCRATCH0
|
||||||
* guest R13 saved in SPRN_SCRATCH0
|
* guest R13 saved in SPRN_SCRATCH0
|
||||||
|
* guest R9 saved in HSTATE_SCRATCH2
|
||||||
*/
|
*/
|
||||||
std r9, HSTATE_SCRATCH2(r13)
|
|
||||||
lbz r9, HSTATE_IN_GUEST(r13)
|
|
||||||
cmpwi r9, KVM_GUEST_MODE_HOST_HV
|
|
||||||
beq kvmppc_bad_host_intr
|
|
||||||
#ifdef CONFIG_KVM_BOOK3S_PR_POSSIBLE
|
|
||||||
cmpwi r9, KVM_GUEST_MODE_GUEST
|
|
||||||
ld r9, HSTATE_SCRATCH2(r13)
|
|
||||||
beq kvmppc_interrupt_pr
|
|
||||||
#endif
|
|
||||||
/* We're now back in the host but in guest MMU context */
|
/* We're now back in the host but in guest MMU context */
|
||||||
li r9, KVM_GUEST_MODE_HOST_HV
|
li r9, KVM_GUEST_MODE_HOST_HV
|
||||||
stb r9, HSTATE_IN_GUEST(r13)
|
stb r9, HSTATE_IN_GUEST(r13)
|
||||||
|
@ -3287,6 +3279,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_P9_TM_HV_ASSIST)
|
||||||
* cfar is saved in HSTATE_CFAR(r13)
|
* cfar is saved in HSTATE_CFAR(r13)
|
||||||
* ppr is saved in HSTATE_PPR(r13)
|
* ppr is saved in HSTATE_PPR(r13)
|
||||||
*/
|
*/
|
||||||
|
.global kvmppc_bad_host_intr
|
||||||
kvmppc_bad_host_intr:
|
kvmppc_bad_host_intr:
|
||||||
/*
|
/*
|
||||||
* Switch to the emergency stack, but start half-way down in
|
* Switch to the emergency stack, but start half-way down in
|
||||||
|
|
Loading…
Add table
Reference in a new issue