diff options
-rw-r--r-- | arch/powerpc/kvm/book3s_hv.c | 10 | ||||
-rw-r--r-- | arch/powerpc/kvm/book3s_hv_rmhandlers.S | 19 |
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) | |||
686 | 5: mtspr SPRN_SRR0, r6 | 686 | 5: 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 | */ | ||
689 | fast_guest_return: | 696 | fast_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: | |||
1471 | hcall_try_real_mode: | 1478 | hcall_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 | ||
1503 | sc_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 */ |