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 | 14 ++++++++------ 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/arch/powerpc/kvm/book3s_hv_builtin.c b/arch/powerpc/kvm/book3s_hv_builtin.c index 49a2c7825e04..5fbaa8710e0c 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]); @@ -541,7 +540,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 1e32e188ba17..0024c449340b 100644 --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S @@ -190,8 +190,8 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) * 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 */ @@ -1481,8 +1481,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 @@ -2804,8 +2805,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