This shaves off a bunch of cycles from the KVM exit path and the XIVE related hypercall. Signed-off-by: Benjamin Herrenschmidt <benh@xxxxxxxxxxxxxxxxxxx> --- arch/powerpc/kvm/book3s_hv_builtin.c | 5 ++--- arch/powerpc/kvm/book3s_hv_rmhandlers.S | 16 ++++++++++------ 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/arch/powerpc/kvm/book3s_hv_builtin.c b/arch/powerpc/kvm/book3s_hv_builtin.c index 90644db9d38e..45525b76b724 100644 --- a/arch/powerpc/kvm/book3s_hv_builtin.c +++ b/arch/powerpc/kvm/book3s_hv_builtin.c @@ -209,8 +209,7 @@ long kvmppc_h_random(struct kvm_vcpu *vcpu) { int r; - /* Only need to do the expensive mfmsr() on radix */ - if (kvm_is_radix(vcpu->kvm) && (mfmsr() & MSR_IR)) + if (local_paca->kvm_hstate.exit_virt) r = powernv_get_random_long(&vcpu->arch.gpr[4]); else r = powernv_get_random_real_mode(&vcpu->arch.gpr[4]); @@ -524,7 +523,7 @@ static long kvmppc_read_one_intr(bool *again) #ifdef CONFIG_KVM_XICS static inline bool is_rm(void) { - return !(mfmsr() & MSR_DR); + return !local_paca->kvm_hstate.exit_virt; } unsigned long kvmppc_rm_h_xirr(struct kvm_vcpu *vcpu) diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S index 83862fba8cfb..ade13f7a9077 100644 --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S @@ -81,6 +81,8 @@ _GLOBAL_TOC(kvmppc_hv_entry_trampoline) RFI kvmppc_call_hv_entry: + li r0,0 + stb r0,HSTATE_EXIT_VIRT(r13) ld r4, HSTATE_KVM_VCPU(r13) bl kvmppc_hv_entry @@ -176,8 +178,8 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_300) * we will be in virtual mode at this point, which makes it a * little easier to get back to the caller. */ - mfmsr r0 - andi. r0, r0, MSR_IR /* in real mode? */ + lbz r0,HSTATE_EXIT_VIRT(r13) + cmpwi r0,0 bne .Lvirt_return /* RFI into the highmem handler */ @@ -1440,8 +1442,9 @@ guest_exit_cont: /* r9 = vcpu, r12 = trap, r13 = paca */ beq 1f li r7, TM_SPC_PULL_OS_CTX li r6, TM_QW1_OS - mfmsr r0 - andi. r0, r0, MSR_DR /* in real mode? */ + /* Are we in virtual or real mode ? */ + lbz r0,HSTATE_EXIT_VIRT(r13) + cmpwi r0,0 beq 2f ld r10, HSTATE_XIVE_TIMA_VIRT(r13) cmpldi cr0, r10, 0 @@ -2749,8 +2752,9 @@ kvm_cede_exit: stb r0, VCPU_CEDED(r9) 1: /* Enable XIVE escalation */ li r5, XIVE_ESB_SET_PQ_00 - mfmsr r0 - andi. r0, r0, MSR_DR /* in real mode? */ + /* Are we in virtual or real mode ? */ + lbz r0,HSTATE_EXIT_VIRT(r13) + cmpwi r0,0 beq 1f ld r10, VCPU_XIVE_ESC_VADDR(r9) cmpdi r10, 0 -- 2.14.3