aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/powerpc/kvm/book3s_hv.c10
-rw-r--r--arch/powerpc/kvm/book3s_hv_rmhandlers.S19
2 files changed, 22 insertions, 7 deletions
diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c
index 072287f1c3bc..93203bbe5714 100644
--- a/arch/powerpc/kvm/book3s_hv.c
+++ b/arch/powerpc/kvm/book3s_hv.c
@@ -669,12 +669,10 @@ static int kvmppc_handle_exit_hv(struct kvm_run *run, struct kvm_vcpu *vcpu,
669 /* hcall - punt to userspace */ 669 /* hcall - punt to userspace */
670 int i; 670 int i;
671 671
672 if (vcpu->arch.shregs.msr & MSR_PR) { 672 /* hypercall with MSR_PR has already been handled in rmode,
673 /* sc 1 from userspace - reflect to guest syscall */ 673 * and never reaches here.
674 kvmppc_book3s_queue_irqprio(vcpu, BOOK3S_INTERRUPT_SYSCALL); 674 */
675 r = RESUME_GUEST; 675
676 break;
677 }
678 run->papr_hcall.nr = kvmppc_get_gpr(vcpu, 3); 676 run->papr_hcall.nr = kvmppc_get_gpr(vcpu, 3);
679 for (i = 0; i < 9; ++i) 677 for (i = 0; i < 9; ++i)
680 run->papr_hcall.args[i] = kvmppc_get_gpr(vcpu, 4 + i); 678 run->papr_hcall.args[i] = kvmppc_get_gpr(vcpu, 4 + i);
diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
index bc8de75b1925..d5ddc2d10748 100644
--- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S
+++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
@@ -686,6 +686,13 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_206)
6865: mtspr SPRN_SRR0, r6 6865: mtspr SPRN_SRR0, r6
687 mtspr SPRN_SRR1, r7 687 mtspr SPRN_SRR1, r7
688 688
689/*
690 * Required state:
691 * R4 = vcpu
692 * R10: value for HSRR0
693 * R11: value for HSRR1
694 * R13 = PACA
695 */
689fast_guest_return: 696fast_guest_return:
690 li r0,0 697 li r0,0
691 stb r0,VCPU_CEDED(r4) /* cancel cede */ 698 stb r0,VCPU_CEDED(r4) /* cancel cede */
@@ -1471,7 +1478,8 @@ kvmppc_hisi:
1471hcall_try_real_mode: 1478hcall_try_real_mode:
1472 ld r3,VCPU_GPR(R3)(r9) 1479 ld r3,VCPU_GPR(R3)(r9)
1473 andi. r0,r11,MSR_PR 1480 andi. r0,r11,MSR_PR
1474 bne guest_exit_cont 1481 /* sc 1 from userspace - reflect to guest syscall */
1482 bne sc_1_fast_return
1475 clrrdi r3,r3,2 1483 clrrdi r3,r3,2
1476 cmpldi r3,hcall_real_table_end - hcall_real_table 1484 cmpldi r3,hcall_real_table_end - hcall_real_table
1477 bge guest_exit_cont 1485 bge guest_exit_cont
@@ -1492,6 +1500,15 @@ hcall_try_real_mode:
1492 ld r11,VCPU_MSR(r4) 1500 ld r11,VCPU_MSR(r4)
1493 b fast_guest_return 1501 b fast_guest_return
1494 1502
1503sc_1_fast_return:
1504 mtspr SPRN_SRR0,r10
1505 mtspr SPRN_SRR1,r11
1506 li r10, BOOK3S_INTERRUPT_SYSCALL
1507 li r11, (MSR_ME << 1) | 1 /* synthesize MSR_SF | MSR_ME */
1508 rotldi r11, r11, 63
1509 mr r4,r9
1510 b fast_guest_return
1511
1495 /* We've attempted a real mode hcall, but it's punted it back 1512 /* We've attempted a real mode hcall, but it's punted it back
1496 * to userspace. We need to restore some clobbered volatiles 1513 * to userspace. We need to restore some clobbered volatiles
1497 * before resuming the pass-it-to-qemu path */ 1514 * before resuming the pass-it-to-qemu path */