diff options
author | Alexander Graf <agraf@suse.de> | 2010-01-07 20:58:09 -0500 |
---|---|---|
committer | Marcelo Tosatti <mtosatti@redhat.com> | 2010-03-01 10:35:49 -0500 |
commit | ff1ca3f983c4180018dbf5e02f2af06f86ef6d03 (patch) | |
tree | 86bfaefb5935a619024d823b71ceba11aaae6bf2 /arch/powerpc/kvm/book3s.c | |
parent | d35feb26ef7e9fbef7643051be5f0773662b1f91 (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.c | 7 |
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: |