aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kvm
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
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')
-rw-r--r--arch/powerpc/kvm/book3s.c14
-rw-r--r--arch/powerpc/kvm/book3s_emulate.c6
-rw-r--r--arch/powerpc/kvm/book3s_paired_singles.c2
-rw-r--r--arch/powerpc/kvm/booke.c2
-rw-r--r--arch/powerpc/kvm/booke_emulate.c4
5 files changed, 14 insertions, 14 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 }
diff --git a/arch/powerpc/kvm/book3s_emulate.c b/arch/powerpc/kvm/book3s_emulate.c
index 9982ff163af0..c1478642f856 100644
--- a/arch/powerpc/kvm/book3s_emulate.c
+++ b/arch/powerpc/kvm/book3s_emulate.c
@@ -212,7 +212,7 @@ int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu,
212 r = kvmppc_st(vcpu, &addr, 32, zeros, true); 212 r = kvmppc_st(vcpu, &addr, 32, zeros, true);
213 if ((r == -ENOENT) || (r == -EPERM)) { 213 if ((r == -ENOENT) || (r == -EPERM)) {
214 *advance = 0; 214 *advance = 0;
215 vcpu->arch.dear = vaddr; 215 vcpu->arch.shared->dar = vaddr;
216 to_svcpu(vcpu)->fault_dar = vaddr; 216 to_svcpu(vcpu)->fault_dar = vaddr;
217 217
218 dsisr = DSISR_ISSTORE; 218 dsisr = DSISR_ISSTORE;
@@ -330,7 +330,7 @@ int kvmppc_core_emulate_mtspr(struct kvm_vcpu *vcpu, int sprn, int rs)
330 vcpu->arch.shared->dsisr = spr_val; 330 vcpu->arch.shared->dsisr = spr_val;
331 break; 331 break;
332 case SPRN_DAR: 332 case SPRN_DAR:
333 vcpu->arch.dear = spr_val; 333 vcpu->arch.shared->dar = spr_val;
334 break; 334 break;
335 case SPRN_HIOR: 335 case SPRN_HIOR:
336 to_book3s(vcpu)->hior = spr_val; 336 to_book3s(vcpu)->hior = spr_val;
@@ -443,7 +443,7 @@ int kvmppc_core_emulate_mfspr(struct kvm_vcpu *vcpu, int sprn, int rt)
443 kvmppc_set_gpr(vcpu, rt, vcpu->arch.shared->dsisr); 443 kvmppc_set_gpr(vcpu, rt, vcpu->arch.shared->dsisr);
444 break; 444 break;
445 case SPRN_DAR: 445 case SPRN_DAR:
446 kvmppc_set_gpr(vcpu, rt, vcpu->arch.dear); 446 kvmppc_set_gpr(vcpu, rt, vcpu->arch.shared->dar);
447 break; 447 break;
448 case SPRN_HIOR: 448 case SPRN_HIOR:
449 kvmppc_set_gpr(vcpu, rt, to_book3s(vcpu)->hior); 449 kvmppc_set_gpr(vcpu, rt, to_book3s(vcpu)->hior);
diff --git a/arch/powerpc/kvm/book3s_paired_singles.c b/arch/powerpc/kvm/book3s_paired_singles.c
index 749dfbd04738..807576f148ce 100644
--- a/arch/powerpc/kvm/book3s_paired_singles.c
+++ b/arch/powerpc/kvm/book3s_paired_singles.c
@@ -169,7 +169,7 @@ static void kvmppc_inject_pf(struct kvm_vcpu *vcpu, ulong eaddr, bool is_store)
169 169
170 shared->msr = kvmppc_set_field(shared->msr, 33, 36, 0); 170 shared->msr = kvmppc_set_field(shared->msr, 33, 36, 0);
171 shared->msr = kvmppc_set_field(shared->msr, 42, 47, 0); 171 shared->msr = kvmppc_set_field(shared->msr, 42, 47, 0);
172 vcpu->arch.dear = eaddr; 172 shared->dar = eaddr;
173 /* Page Fault */ 173 /* Page Fault */
174 dsisr = kvmppc_set_field(0, 33, 33, 1); 174 dsisr = kvmppc_set_field(0, 33, 33, 1);
175 if (is_store) 175 if (is_store)
diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c
index 4ec9d49a1cb9..4aab6d2ce133 100644
--- a/arch/powerpc/kvm/booke.c
+++ b/arch/powerpc/kvm/booke.c
@@ -195,7 +195,7 @@ static int kvmppc_booke_irqprio_deliver(struct kvm_vcpu *vcpu,
195 if (update_esr == true) 195 if (update_esr == true)
196 vcpu->arch.esr = vcpu->arch.queued_esr; 196 vcpu->arch.esr = vcpu->arch.queued_esr;
197 if (update_dear == true) 197 if (update_dear == true)
198 vcpu->arch.dear = vcpu->arch.queued_dear; 198 vcpu->arch.shared->dar = vcpu->arch.queued_dear;
199 kvmppc_set_msr(vcpu, vcpu->arch.shared->msr & msr_mask); 199 kvmppc_set_msr(vcpu, vcpu->arch.shared->msr & msr_mask);
200 200
201 clear_bit(priority, &vcpu->arch.pending_exceptions); 201 clear_bit(priority, &vcpu->arch.pending_exceptions);
diff --git a/arch/powerpc/kvm/booke_emulate.c b/arch/powerpc/kvm/booke_emulate.c
index b115203ac118..51ef4539ed51 100644
--- a/arch/powerpc/kvm/booke_emulate.c
+++ b/arch/powerpc/kvm/booke_emulate.c
@@ -105,7 +105,7 @@ int kvmppc_booke_emulate_mtspr(struct kvm_vcpu *vcpu, int sprn, int rs)
105 105
106 switch (sprn) { 106 switch (sprn) {
107 case SPRN_DEAR: 107 case SPRN_DEAR:
108 vcpu->arch.dear = spr_val; break; 108 vcpu->arch.shared->dar = spr_val; break;
109 case SPRN_ESR: 109 case SPRN_ESR:
110 vcpu->arch.esr = spr_val; break; 110 vcpu->arch.esr = spr_val; break;
111 case SPRN_DBCR0: 111 case SPRN_DBCR0:
@@ -200,7 +200,7 @@ int kvmppc_booke_emulate_mfspr(struct kvm_vcpu *vcpu, int sprn, int rt)
200 case SPRN_IVPR: 200 case SPRN_IVPR:
201 kvmppc_set_gpr(vcpu, rt, vcpu->arch.ivpr); break; 201 kvmppc_set_gpr(vcpu, rt, vcpu->arch.ivpr); break;
202 case SPRN_DEAR: 202 case SPRN_DEAR:
203 kvmppc_set_gpr(vcpu, rt, vcpu->arch.dear); break; 203 kvmppc_set_gpr(vcpu, rt, vcpu->arch.shared->dar); break;
204 case SPRN_ESR: 204 case SPRN_ESR:
205 kvmppc_set_gpr(vcpu, rt, vcpu->arch.esr); break; 205 kvmppc_set_gpr(vcpu, rt, vcpu->arch.esr); break;
206 case SPRN_DBCR0: 206 case SPRN_DBCR0: