Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Alexander Graf and committed by
Avi Kivity
5e030186 d562de48

+15 -15
-1
arch/powerpc/include/asm/kvm_host.h
··· 231 231 ulong csrr1; 232 232 ulong dsrr0; 233 233 ulong dsrr1; 234 - ulong dear; 235 234 ulong esr; 236 235 u32 dec; 237 236 u32 decar;
+1
arch/powerpc/include/asm/kvm_para.h
··· 23 23 #include <linux/types.h> 24 24 25 25 struct kvm_vcpu_arch_shared { 26 + __u64 dar; 26 27 __u64 msr; 27 28 __u32 dsisr; 28 29 };
+7 -7
arch/powerpc/kvm/book3s.c
··· 594 594 595 595 if (page_found == -ENOENT) { 596 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 598 vcpu->arch.shared->dsisr = to_svcpu(vcpu)->fault_dsisr; 599 599 vcpu->arch.shared->msr |= 600 600 (to_svcpu(vcpu)->shadow_srr1 & 0x00000000f8000000ULL); 601 601 kvmppc_book3s_queue_irqprio(vcpu, vec); 602 602 } else if (page_found == -EPERM) { 603 603 /* Storage protection */ 604 - vcpu->arch.dear = kvmppc_get_fault_dar(vcpu); 604 + vcpu->arch.shared->dar = kvmppc_get_fault_dar(vcpu); 605 605 vcpu->arch.shared->dsisr = 606 606 to_svcpu(vcpu)->fault_dsisr & ~DSISR_NOHPTE; 607 607 vcpu->arch.shared->dsisr |= DSISR_PROTFAULT; ··· 610 610 kvmppc_book3s_queue_irqprio(vcpu, vec); 611 611 } else if (page_found == -EINVAL) { 612 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 614 kvmppc_book3s_queue_irqprio(vcpu, vec + 0x80); 615 615 } else if (!is_mmio && 616 616 kvmppc_visible_gfn(vcpu, pte.raddr >> PAGE_SHIFT)) { ··· 867 867 if (to_svcpu(vcpu)->fault_dsisr & DSISR_NOHPTE) { 868 868 r = kvmppc_handle_pagefault(run, vcpu, dar, exit_nr); 869 869 } else { 870 - vcpu->arch.dear = dar; 870 + vcpu->arch.shared->dar = dar; 871 871 vcpu->arch.shared->dsisr = to_svcpu(vcpu)->fault_dsisr; 872 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 874 r = RESUME_GUEST; 875 875 } 876 876 break; 877 877 } 878 878 case BOOK3S_INTERRUPT_DATA_SEGMENT: 879 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 881 kvmppc_book3s_queue_irqprio(vcpu, 882 882 BOOK3S_INTERRUPT_DATA_SEGMENT); 883 883 } ··· 997 997 if (kvmppc_read_inst(vcpu) == EMULATE_DONE) { 998 998 vcpu->arch.shared->dsisr = kvmppc_alignment_dsisr(vcpu, 999 999 kvmppc_get_last_inst(vcpu)); 1000 - vcpu->arch.dear = kvmppc_alignment_dar(vcpu, 1000 + vcpu->arch.shared->dar = kvmppc_alignment_dar(vcpu, 1001 1001 kvmppc_get_last_inst(vcpu)); 1002 1002 kvmppc_book3s_queue_irqprio(vcpu, exit_nr); 1003 1003 }
+3 -3
arch/powerpc/kvm/book3s_emulate.c
··· 212 212 r = kvmppc_st(vcpu, &addr, 32, zeros, true); 213 213 if ((r == -ENOENT) || (r == -EPERM)) { 214 214 *advance = 0; 215 - vcpu->arch.dear = vaddr; 215 + vcpu->arch.shared->dar = vaddr; 216 216 to_svcpu(vcpu)->fault_dar = vaddr; 217 217 218 218 dsisr = DSISR_ISSTORE; ··· 330 330 vcpu->arch.shared->dsisr = spr_val; 331 331 break; 332 332 case SPRN_DAR: 333 - vcpu->arch.dear = spr_val; 333 + vcpu->arch.shared->dar = spr_val; 334 334 break; 335 335 case SPRN_HIOR: 336 336 to_book3s(vcpu)->hior = spr_val; ··· 443 443 kvmppc_set_gpr(vcpu, rt, vcpu->arch.shared->dsisr); 444 444 break; 445 445 case SPRN_DAR: 446 - kvmppc_set_gpr(vcpu, rt, vcpu->arch.dear); 446 + kvmppc_set_gpr(vcpu, rt, vcpu->arch.shared->dar); 447 447 break; 448 448 case SPRN_HIOR: 449 449 kvmppc_set_gpr(vcpu, rt, to_book3s(vcpu)->hior);
+1 -1
arch/powerpc/kvm/book3s_paired_singles.c
··· 169 169 170 170 shared->msr = kvmppc_set_field(shared->msr, 33, 36, 0); 171 171 shared->msr = kvmppc_set_field(shared->msr, 42, 47, 0); 172 - vcpu->arch.dear = eaddr; 172 + shared->dar = eaddr; 173 173 /* Page Fault */ 174 174 dsisr = kvmppc_set_field(0, 33, 33, 1); 175 175 if (is_store)
+1 -1
arch/powerpc/kvm/booke.c
··· 195 195 if (update_esr == true) 196 196 vcpu->arch.esr = vcpu->arch.queued_esr; 197 197 if (update_dear == true) 198 - vcpu->arch.dear = vcpu->arch.queued_dear; 198 + vcpu->arch.shared->dar = vcpu->arch.queued_dear; 199 199 kvmppc_set_msr(vcpu, vcpu->arch.shared->msr & msr_mask); 200 200 201 201 clear_bit(priority, &vcpu->arch.pending_exceptions);
+2 -2
arch/powerpc/kvm/booke_emulate.c
··· 105 105 106 106 switch (sprn) { 107 107 case SPRN_DEAR: 108 - vcpu->arch.dear = spr_val; break; 108 + vcpu->arch.shared->dar = spr_val; break; 109 109 case SPRN_ESR: 110 110 vcpu->arch.esr = spr_val; break; 111 111 case SPRN_DBCR0: ··· 200 200 case SPRN_IVPR: 201 201 kvmppc_set_gpr(vcpu, rt, vcpu->arch.ivpr); break; 202 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 204 case SPRN_ESR: 205 205 kvmppc_set_gpr(vcpu, rt, vcpu->arch.esr); break; 206 206 case SPRN_DBCR0: