Commit f3601156 authored by Nicholas Piggin's avatar Nicholas Piggin Committed by Michael Ellerman

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: default avatarNicholas Piggin <npiggin@gmail.com>
Reviewed-by: default avatarDaniel Axtens <dja@axtens.net>
Reviewed-by: default avatarFabiano Rosas <farosas@linux.ibm.com>
Acked-by: default avatarPaul Mackerras <paulus@ozlabs.org>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20210528090752.3542186-2-npiggin@gmail.com
parent 6ba53317
...@@ -208,7 +208,6 @@ do_define_int n ...@@ -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 ...@@ -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 := \ ...@@ -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
......
/* 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: ...@@ -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) ...@@ -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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment