aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kvm/book3s.c
diff options
context:
space:
mode:
authorAlexander Graf <agraf@suse.de>2010-07-29 08:47:45 -0400
committerAvi Kivity <avi@redhat.com>2010-10-24 04:50:45 -0400
commit5e030186dfc4e4e47c84d2557b17e4aa06c76f96 (patch)
treef41b39de6fc9367537d89fa358a00db4b3d07935 /arch/powerpc/kvm/book3s.c
parentd562de48de68b60b3d2522e7d8273d7112034ee6 (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.c14
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 }