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

KVM: PPC: Convert DSISR to shared page

The DSISR register contains information about a data page fault. It is fully
read/write from inside the guest context and we don't need to worry about
interacting based on writes of this register.

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
d562de48 666e7252

+11 -10
-1
arch/powerpc/include/asm/kvm_book3s.h
··· 85 85 u64 hid[6]; 86 86 u64 gqr[8]; 87 87 int slb_nr; 88 - u32 dsisr; 89 88 u64 sdr1; 90 89 u64 hior; 91 90 u64 msr_mask;
+1
arch/powerpc/include/asm/kvm_para.h
··· 24 24 25 25 struct kvm_vcpu_arch_shared { 26 26 __u64 msr; 27 + __u32 dsisr; 27 28 }; 28 29 29 30 #ifdef __KERNEL__
+6 -5
arch/powerpc/kvm/book3s.c
··· 595 595 if (page_found == -ENOENT) { 596 596 /* Page not found in guest PTE entries */ 597 597 vcpu->arch.dear = kvmppc_get_fault_dar(vcpu); 598 - to_book3s(vcpu)->dsisr = to_svcpu(vcpu)->fault_dsisr; 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 604 vcpu->arch.dear = kvmppc_get_fault_dar(vcpu); 605 - to_book3s(vcpu)->dsisr = to_svcpu(vcpu)->fault_dsisr & ~DSISR_NOHPTE; 606 - to_book3s(vcpu)->dsisr |= DSISR_PROTFAULT; 605 + vcpu->arch.shared->dsisr = 606 + to_svcpu(vcpu)->fault_dsisr & ~DSISR_NOHPTE; 607 + vcpu->arch.shared->dsisr |= DSISR_PROTFAULT; 607 608 vcpu->arch.shared->msr |= 608 609 (to_svcpu(vcpu)->shadow_srr1 & 0x00000000f8000000ULL); 609 610 kvmppc_book3s_queue_irqprio(vcpu, vec); ··· 868 867 r = kvmppc_handle_pagefault(run, vcpu, dar, exit_nr); 869 868 } else { 870 869 vcpu->arch.dear = dar; 871 - to_book3s(vcpu)->dsisr = to_svcpu(vcpu)->fault_dsisr; 870 + vcpu->arch.shared->dsisr = to_svcpu(vcpu)->fault_dsisr; 872 871 kvmppc_book3s_queue_irqprio(vcpu, exit_nr); 873 872 kvmppc_mmu_pte_flush(vcpu, vcpu->arch.dear, ~0xFFFUL); 874 873 r = RESUME_GUEST; ··· 995 994 } 996 995 case BOOK3S_INTERRUPT_ALIGNMENT: 997 996 if (kvmppc_read_inst(vcpu) == EMULATE_DONE) { 998 - to_book3s(vcpu)->dsisr = kvmppc_alignment_dsisr(vcpu, 997 + vcpu->arch.shared->dsisr = kvmppc_alignment_dsisr(vcpu, 999 998 kvmppc_get_last_inst(vcpu)); 1000 999 vcpu->arch.dear = kvmppc_alignment_dar(vcpu, 1001 1000 kvmppc_get_last_inst(vcpu));
+3 -3
arch/powerpc/kvm/book3s_emulate.c
··· 221 221 else if (r == -EPERM) 222 222 dsisr |= DSISR_PROTFAULT; 223 223 224 - to_book3s(vcpu)->dsisr = dsisr; 224 + vcpu->arch.shared->dsisr = dsisr; 225 225 to_svcpu(vcpu)->fault_dsisr = dsisr; 226 226 227 227 kvmppc_book3s_queue_irqprio(vcpu, ··· 327 327 to_book3s(vcpu)->sdr1 = spr_val; 328 328 break; 329 329 case SPRN_DSISR: 330 - to_book3s(vcpu)->dsisr = spr_val; 330 + vcpu->arch.shared->dsisr = spr_val; 331 331 break; 332 332 case SPRN_DAR: 333 333 vcpu->arch.dear = spr_val; ··· 440 440 kvmppc_set_gpr(vcpu, rt, to_book3s(vcpu)->sdr1); 441 441 break; 442 442 case SPRN_DSISR: 443 - kvmppc_set_gpr(vcpu, rt, to_book3s(vcpu)->dsisr); 443 + kvmppc_set_gpr(vcpu, rt, vcpu->arch.shared->dsisr); 444 444 break; 445 445 case SPRN_DAR: 446 446 kvmppc_set_gpr(vcpu, rt, vcpu->arch.dear);
+1 -1
arch/powerpc/kvm/book3s_paired_singles.c
··· 173 173 /* Page Fault */ 174 174 dsisr = kvmppc_set_field(0, 33, 33, 1); 175 175 if (is_store) 176 - to_book3s(vcpu)->dsisr = kvmppc_set_field(dsisr, 38, 38, 1); 176 + shared->dsisr = kvmppc_set_field(dsisr, 38, 38, 1); 177 177 kvmppc_book3s_queue_irqprio(vcpu, BOOK3S_INTERRUPT_DATA_STORAGE); 178 178 } 179 179