diff options
Diffstat (limited to 'arch/powerpc/kvm/book3s_pr.c')
| -rw-r--r-- | arch/powerpc/kvm/book3s_pr.c | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/arch/powerpc/kvm/book3s_pr.c b/arch/powerpc/kvm/book3s_pr.c index 78dcf659e120..48558f6176e9 100644 --- a/arch/powerpc/kvm/book3s_pr.c +++ b/arch/powerpc/kvm/book3s_pr.c | |||
| @@ -648,7 +648,27 @@ program_interrupt: | |||
| 648 | break; | 648 | break; |
| 649 | } | 649 | } |
| 650 | case BOOK3S_INTERRUPT_SYSCALL: | 650 | case BOOK3S_INTERRUPT_SYSCALL: |
| 651 | if (vcpu->arch.osi_enabled && | 651 | if (vcpu->arch.papr_enabled && |
| 652 | (kvmppc_get_last_inst(vcpu) == 0x44000022) && | ||
| 653 | !(vcpu->arch.shared->msr & MSR_PR)) { | ||
| 654 | /* SC 1 papr hypercalls */ | ||
| 655 | ulong cmd = kvmppc_get_gpr(vcpu, 3); | ||
| 656 | int i; | ||
| 657 | |||
| 658 | if (kvmppc_h_pr(vcpu, cmd) == EMULATE_DONE) { | ||
| 659 | r = RESUME_GUEST; | ||
| 660 | break; | ||
| 661 | } | ||
| 662 | |||
| 663 | run->papr_hcall.nr = cmd; | ||
| 664 | for (i = 0; i < 9; ++i) { | ||
| 665 | ulong gpr = kvmppc_get_gpr(vcpu, 4 + i); | ||
| 666 | run->papr_hcall.args[i] = gpr; | ||
| 667 | } | ||
| 668 | run->exit_reason = KVM_EXIT_PAPR_HCALL; | ||
| 669 | vcpu->arch.hcall_needed = 1; | ||
| 670 | r = RESUME_HOST; | ||
| 671 | } else if (vcpu->arch.osi_enabled && | ||
| 652 | (((u32)kvmppc_get_gpr(vcpu, 3)) == OSI_SC_MAGIC_R3) && | 672 | (((u32)kvmppc_get_gpr(vcpu, 3)) == OSI_SC_MAGIC_R3) && |
| 653 | (((u32)kvmppc_get_gpr(vcpu, 4)) == OSI_SC_MAGIC_R4)) { | 673 | (((u32)kvmppc_get_gpr(vcpu, 4)) == OSI_SC_MAGIC_R4)) { |
| 654 | /* MOL hypercalls */ | 674 | /* MOL hypercalls */ |
