aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kvm/book3s.c
diff options
context:
space:
mode:
authorAlexander Graf <agraf@suse.de>2010-01-07 20:58:09 -0500
committerMarcelo Tosatti <mtosatti@redhat.com>2010-03-01 10:35:49 -0500
commitff1ca3f983c4180018dbf5e02f2af06f86ef6d03 (patch)
tree86bfaefb5935a619024d823b71ceba11aaae6bf2 /arch/powerpc/kvm/book3s.c
parentd35feb26ef7e9fbef7643051be5f0773662b1f91 (diff)
KVM: PPC: Pass program interrupt flags to the guest
When we need to reinject a program interrupt into the guest, we also need to reinject the corresponding flags into the guest. Signed-off-by: Alexander Graf <agraf@suse.de> Reported-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch/powerpc/kvm/book3s.c')
-rw-r--r--arch/powerpc/kvm/book3s.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/arch/powerpc/kvm/book3s.c b/arch/powerpc/kvm/book3s.c
index 66b5924e1748..02861fda73da 100644
--- a/arch/powerpc/kvm/book3s.c
+++ b/arch/powerpc/kvm/book3s.c
@@ -633,6 +633,9 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu,
633 case BOOK3S_INTERRUPT_PROGRAM: 633 case BOOK3S_INTERRUPT_PROGRAM:
634 { 634 {
635 enum emulation_result er; 635 enum emulation_result er;
636 ulong flags;
637
638 flags = (vcpu->arch.shadow_msr & 0x1f0000ull);
636 639
637 if (vcpu->arch.msr & MSR_PR) { 640 if (vcpu->arch.msr & MSR_PR) {
638#ifdef EXIT_DEBUG 641#ifdef EXIT_DEBUG
@@ -640,7 +643,7 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu,
640#endif 643#endif
641 if ((vcpu->arch.last_inst & 0xff0007ff) != 644 if ((vcpu->arch.last_inst & 0xff0007ff) !=
642 (INS_DCBZ & 0xfffffff7)) { 645 (INS_DCBZ & 0xfffffff7)) {
643 kvmppc_book3s_queue_irqprio(vcpu, exit_nr); 646 kvmppc_core_queue_program(vcpu, flags);
644 r = RESUME_GUEST; 647 r = RESUME_GUEST;
645 break; 648 break;
646 } 649 }
@@ -655,7 +658,7 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu,
655 case EMULATE_FAIL: 658 case EMULATE_FAIL:
656 printk(KERN_CRIT "%s: emulation at %lx failed (%08x)\n", 659 printk(KERN_CRIT "%s: emulation at %lx failed (%08x)\n",
657 __func__, vcpu->arch.pc, vcpu->arch.last_inst); 660 __func__, vcpu->arch.pc, vcpu->arch.last_inst);
658 kvmppc_book3s_queue_irqprio(vcpu, exit_nr); 661 kvmppc_core_queue_program(vcpu, flags);
659 r = RESUME_GUEST; 662 r = RESUME_GUEST;
660 break; 663 break;
661 default: 664 default: