diff options
author | Alexander Graf <agraf@suse.de> | 2010-07-29 08:47:45 -0400 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2010-10-24 04:50:45 -0400 |
commit | 5e030186dfc4e4e47c84d2557b17e4aa06c76f96 (patch) | |
tree | f41b39de6fc9367537d89fa358a00db4b3d07935 /arch/powerpc/kvm/book3s.c | |
parent | d562de48de68b60b3d2522e7d8273d7112034ee6 (diff) |
KVM: PPC: Convert DAR to shared page.
The DAR register contains the address a data page fault occured at. This
register behaves pretty much like a simple data storage register that gets
written to on data faults. There is no hypervisor interaction required on
read or write.
This patch converts all users of the current field to the shared page.
Signed-off-by: Alexander Graf <agraf@suse.de>
Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch/powerpc/kvm/book3s.c')
-rw-r--r-- | arch/powerpc/kvm/book3s.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/arch/powerpc/kvm/book3s.c b/arch/powerpc/kvm/book3s.c index eb401b6d4d8c..4d46f8b13cc6 100644 --- a/arch/powerpc/kvm/book3s.c +++ b/arch/powerpc/kvm/book3s.c | |||
@@ -594,14 +594,14 @@ int kvmppc_handle_pagefault(struct kvm_run *run, struct kvm_vcpu *vcpu, | |||
594 | 594 | ||
595 | if (page_found == -ENOENT) { | 595 | if (page_found == -ENOENT) { |
596 | /* Page not found in guest PTE entries */ | 596 | /* Page not found in guest PTE entries */ |
597 | vcpu->arch.dear = kvmppc_get_fault_dar(vcpu); | 597 | vcpu->arch.shared->dar = kvmppc_get_fault_dar(vcpu); |
598 | vcpu->arch.shared->dsisr = to_svcpu(vcpu)->fault_dsisr; | 598 | vcpu->arch.shared->dsisr = to_svcpu(vcpu)->fault_dsisr; |
599 | vcpu->arch.shared->msr |= | 599 | vcpu->arch.shared->msr |= |
600 | (to_svcpu(vcpu)->shadow_srr1 & 0x00000000f8000000ULL); | 600 | (to_svcpu(vcpu)->shadow_srr1 & 0x00000000f8000000ULL); |
601 | kvmppc_book3s_queue_irqprio(vcpu, vec); | 601 | kvmppc_book3s_queue_irqprio(vcpu, vec); |
602 | } else if (page_found == -EPERM) { | 602 | } else if (page_found == -EPERM) { |
603 | /* Storage protection */ | 603 | /* Storage protection */ |
604 | vcpu->arch.dear = kvmppc_get_fault_dar(vcpu); | 604 | vcpu->arch.shared->dar = kvmppc_get_fault_dar(vcpu); |
605 | vcpu->arch.shared->dsisr = | 605 | vcpu->arch.shared->dsisr = |
606 | to_svcpu(vcpu)->fault_dsisr & ~DSISR_NOHPTE; | 606 | to_svcpu(vcpu)->fault_dsisr & ~DSISR_NOHPTE; |
607 | vcpu->arch.shared->dsisr |= DSISR_PROTFAULT; | 607 | vcpu->arch.shared->dsisr |= DSISR_PROTFAULT; |
@@ -610,7 +610,7 @@ int kvmppc_handle_pagefault(struct kvm_run *run, struct kvm_vcpu *vcpu, | |||
610 | kvmppc_book3s_queue_irqprio(vcpu, vec); | 610 | kvmppc_book3s_queue_irqprio(vcpu, vec); |
611 | } else if (page_found == -EINVAL) { | 611 | } else if (page_found == -EINVAL) { |
612 | /* Page not found in guest SLB */ | 612 | /* Page not found in guest SLB */ |
613 | vcpu->arch.dear = kvmppc_get_fault_dar(vcpu); | 613 | vcpu->arch.shared->dar = kvmppc_get_fault_dar(vcpu); |
614 | kvmppc_book3s_queue_irqprio(vcpu, vec + 0x80); | 614 | kvmppc_book3s_queue_irqprio(vcpu, vec + 0x80); |
615 | } else if (!is_mmio && | 615 | } else if (!is_mmio && |
616 | kvmppc_visible_gfn(vcpu, pte.raddr >> PAGE_SHIFT)) { | 616 | kvmppc_visible_gfn(vcpu, pte.raddr >> PAGE_SHIFT)) { |
@@ -867,17 +867,17 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu, | |||
867 | if (to_svcpu(vcpu)->fault_dsisr & DSISR_NOHPTE) { | 867 | if (to_svcpu(vcpu)->fault_dsisr & DSISR_NOHPTE) { |
868 | r = kvmppc_handle_pagefault(run, vcpu, dar, exit_nr); | 868 | r = kvmppc_handle_pagefault(run, vcpu, dar, exit_nr); |
869 | } else { | 869 | } else { |
870 | vcpu->arch.dear = dar; | 870 | vcpu->arch.shared->dar = dar; |
871 | vcpu->arch.shared->dsisr = to_svcpu(vcpu)->fault_dsisr; | 871 | vcpu->arch.shared->dsisr = to_svcpu(vcpu)->fault_dsisr; |
872 | kvmppc_book3s_queue_irqprio(vcpu, exit_nr); | 872 | kvmppc_book3s_queue_irqprio(vcpu, exit_nr); |
873 | kvmppc_mmu_pte_flush(vcpu, vcpu->arch.dear, ~0xFFFUL); | 873 | kvmppc_mmu_pte_flush(vcpu, dar, ~0xFFFUL); |
874 | r = RESUME_GUEST; | 874 | r = RESUME_GUEST; |
875 | } | 875 | } |
876 | break; | 876 | break; |
877 | } | 877 | } |
878 | case BOOK3S_INTERRUPT_DATA_SEGMENT: | 878 | case BOOK3S_INTERRUPT_DATA_SEGMENT: |
879 | if (kvmppc_mmu_map_segment(vcpu, kvmppc_get_fault_dar(vcpu)) < 0) { | 879 | if (kvmppc_mmu_map_segment(vcpu, kvmppc_get_fault_dar(vcpu)) < 0) { |
880 | vcpu->arch.dear = kvmppc_get_fault_dar(vcpu); | 880 | vcpu->arch.shared->dar = kvmppc_get_fault_dar(vcpu); |
881 | kvmppc_book3s_queue_irqprio(vcpu, | 881 | kvmppc_book3s_queue_irqprio(vcpu, |
882 | BOOK3S_INTERRUPT_DATA_SEGMENT); | 882 | BOOK3S_INTERRUPT_DATA_SEGMENT); |
883 | } | 883 | } |
@@ -997,7 +997,7 @@ program_interrupt: | |||
997 | if (kvmppc_read_inst(vcpu) == EMULATE_DONE) { | 997 | if (kvmppc_read_inst(vcpu) == EMULATE_DONE) { |
998 | vcpu->arch.shared->dsisr = kvmppc_alignment_dsisr(vcpu, | 998 | vcpu->arch.shared->dsisr = kvmppc_alignment_dsisr(vcpu, |
999 | kvmppc_get_last_inst(vcpu)); | 999 | kvmppc_get_last_inst(vcpu)); |
1000 | vcpu->arch.dear = kvmppc_alignment_dar(vcpu, | 1000 | vcpu->arch.shared->dar = kvmppc_alignment_dar(vcpu, |
1001 | kvmppc_get_last_inst(vcpu)); | 1001 | kvmppc_get_last_inst(vcpu)); |
1002 | kvmppc_book3s_queue_irqprio(vcpu, exit_nr); | 1002 | kvmppc_book3s_queue_irqprio(vcpu, exit_nr); |
1003 | } | 1003 | } |