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 */ |