KVM: PPC: Convert DSISR to shared page
authorAlexander Graf <agraf@suse.de>
Thu, 29 Jul 2010 12:47:44 +0000 (14:47 +0200)
committerAvi Kivity <avi@redhat.com>
Sun, 24 Oct 2010 08:50:44 +0000 (10:50 +0200)
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>
arch/powerpc/include/asm/kvm_book3s.h
arch/powerpc/include/asm/kvm_para.h
arch/powerpc/kvm/book3s.c
arch/powerpc/kvm/book3s_emulate.c
arch/powerpc/kvm/book3s_paired_singles.c

index 8274a2d4392525ebe9f58a83dbb426686da7c224..b5b1961664558639d375b796b633ba7f7f5aaf36 100644 (file)
@@ -85,7 +85,6 @@ struct kvmppc_vcpu_book3s {
        u64 hid[6];
        u64 gqr[8];
        int slb_nr;
-       u32 dsisr;
        u64 sdr1;
        u64 hior;
        u64 msr_mask;
index a17dc5229d9971fabc19bc41d63b311fa13fc476..9f7565b1de6568cc134864c71d9ca8bdb679c729 100644 (file)
@@ -24,6 +24,7 @@
 
 struct kvm_vcpu_arch_shared {
        __u64 msr;
+       __u32 dsisr;
 };
 
 #ifdef __KERNEL__
index 2efe69240e1b1e47a62310b8876f8aa019f775f0..eb401b6d4d8c7aa1505e250c19a2a710ce51db13 100644 (file)
@@ -595,15 +595,16 @@ int kvmppc_handle_pagefault(struct kvm_run *run, struct kvm_vcpu *vcpu,
        if (page_found == -ENOENT) {
                /* Page not found in guest PTE entries */
                vcpu->arch.dear = kvmppc_get_fault_dar(vcpu);
-               to_book3s(vcpu)->dsisr = to_svcpu(vcpu)->fault_dsisr;
+               vcpu->arch.shared->dsisr = to_svcpu(vcpu)->fault_dsisr;
                vcpu->arch.shared->msr |=
                        (to_svcpu(vcpu)->shadow_srr1 & 0x00000000f8000000ULL);
                kvmppc_book3s_queue_irqprio(vcpu, vec);
        } else if (page_found == -EPERM) {
                /* Storage protection */
                vcpu->arch.dear = kvmppc_get_fault_dar(vcpu);
-               to_book3s(vcpu)->dsisr = to_svcpu(vcpu)->fault_dsisr & ~DSISR_NOHPTE;
-               to_book3s(vcpu)->dsisr |= DSISR_PROTFAULT;
+               vcpu->arch.shared->dsisr =
+                       to_svcpu(vcpu)->fault_dsisr & ~DSISR_NOHPTE;
+               vcpu->arch.shared->dsisr |= DSISR_PROTFAULT;
                vcpu->arch.shared->msr |=
                        (to_svcpu(vcpu)->shadow_srr1 & 0x00000000f8000000ULL);
                kvmppc_book3s_queue_irqprio(vcpu, vec);
@@ -867,7 +868,7 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu,
                        r = kvmppc_handle_pagefault(run, vcpu, dar, exit_nr);
                } else {
                        vcpu->arch.dear = dar;
-                       to_book3s(vcpu)->dsisr = to_svcpu(vcpu)->fault_dsisr;
+                       vcpu->arch.shared->dsisr = to_svcpu(vcpu)->fault_dsisr;
                        kvmppc_book3s_queue_irqprio(vcpu, exit_nr);
                        kvmppc_mmu_pte_flush(vcpu, vcpu->arch.dear, ~0xFFFUL);
                        r = RESUME_GUEST;
@@ -994,7 +995,7 @@ program_interrupt:
        }
        case BOOK3S_INTERRUPT_ALIGNMENT:
                if (kvmppc_read_inst(vcpu) == EMULATE_DONE) {
-                       to_book3s(vcpu)->dsisr = kvmppc_alignment_dsisr(vcpu,
+                       vcpu->arch.shared->dsisr = kvmppc_alignment_dsisr(vcpu,
                                kvmppc_get_last_inst(vcpu));
                        vcpu->arch.dear = kvmppc_alignment_dar(vcpu,
                                kvmppc_get_last_inst(vcpu));
index 35d3c16b293849a7aaf3ba7399399c0055d9e6d2..9982ff163af084aec7ca7d891ddcef098936c02f 100644 (file)
@@ -221,7 +221,7 @@ int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu,
                                else if (r == -EPERM)
                                        dsisr |= DSISR_PROTFAULT;
 
-                               to_book3s(vcpu)->dsisr = dsisr;
+                               vcpu->arch.shared->dsisr = dsisr;
                                to_svcpu(vcpu)->fault_dsisr = dsisr;
 
                                kvmppc_book3s_queue_irqprio(vcpu,
@@ -327,7 +327,7 @@ int kvmppc_core_emulate_mtspr(struct kvm_vcpu *vcpu, int sprn, int rs)
                to_book3s(vcpu)->sdr1 = spr_val;
                break;
        case SPRN_DSISR:
-               to_book3s(vcpu)->dsisr = spr_val;
+               vcpu->arch.shared->dsisr = spr_val;
                break;
        case SPRN_DAR:
                vcpu->arch.dear = spr_val;
@@ -440,7 +440,7 @@ int kvmppc_core_emulate_mfspr(struct kvm_vcpu *vcpu, int sprn, int rt)
                kvmppc_set_gpr(vcpu, rt, to_book3s(vcpu)->sdr1);
                break;
        case SPRN_DSISR:
-               kvmppc_set_gpr(vcpu, rt, to_book3s(vcpu)->dsisr);
+               kvmppc_set_gpr(vcpu, rt, vcpu->arch.shared->dsisr);
                break;
        case SPRN_DAR:
                kvmppc_set_gpr(vcpu, rt, vcpu->arch.dear);
index 626e6efaa79f4dc5b6494c21c37ab737f42ff0e1..749dfbd047386fcd0360c6678d8dc0cb9793c860 100644 (file)
@@ -173,7 +173,7 @@ static void kvmppc_inject_pf(struct kvm_vcpu *vcpu, ulong eaddr, bool is_store)
        /* Page Fault */
        dsisr = kvmppc_set_field(0, 33, 33, 1);
        if (is_store)
-               to_book3s(vcpu)->dsisr = kvmppc_set_field(dsisr, 38, 38, 1);
+               shared->dsisr = kvmppc_set_field(dsisr, 38, 38, 1);
        kvmppc_book3s_queue_irqprio(vcpu, BOOK3S_INTERRUPT_DATA_STORAGE);
 }