KVM: PPC: Convert SPRG[0-4] to shared page
authorAlexander Graf <agraf@suse.de>
Thu, 29 Jul 2010 12:47:47 +0000 (14:47 +0200)
committerAvi Kivity <avi@redhat.com>
Sun, 24 Oct 2010 08:50:45 +0000 (10:50 +0200)
When in kernel mode there are 4 additional registers available that are
simple data storage. Instead of exiting to the hypervisor to read and
write those, we can just share them with the guest using the page.

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_host.h
arch/powerpc/include/asm/kvm_para.h
arch/powerpc/kvm/book3s.c
arch/powerpc/kvm/booke.c
arch/powerpc/kvm/emulate.c

index 5255d754f9a9b4df8d16b5c7c147341f5d2bc9eb..221cf85e9a6e46a5ed9ccf427dc22bfc863efa4b 100644 (file)
@@ -217,10 +217,6 @@ struct kvm_vcpu_arch {
        ulong guest_owned_ext;
 #endif
        u32 mmucr;
-       ulong sprg0;
-       ulong sprg1;
-       ulong sprg2;
-       ulong sprg3;
        ulong sprg4;
        ulong sprg5;
        ulong sprg6;
index d7fc6c2c9730312019b873e6779eddaa8d82526d..e402999ba193288cafdf2156045107b529d9cd6c 100644 (file)
 #include <linux/types.h>
 
 struct kvm_vcpu_arch_shared {
+       __u64 sprg0;
+       __u64 sprg1;
+       __u64 sprg2;
+       __u64 sprg3;
        __u64 srr0;
        __u64 srr1;
        __u64 dar;
index afa0dd4a27f438adfa984cfc801304d5b348f083..cfd7fe5c3a6282f694f966f56a29e8dd70f26727 100644 (file)
@@ -1062,10 +1062,10 @@ int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
        regs->srr0 = vcpu->arch.shared->srr0;
        regs->srr1 = vcpu->arch.shared->srr1;
        regs->pid = vcpu->arch.pid;
-       regs->sprg0 = vcpu->arch.sprg0;
-       regs->sprg1 = vcpu->arch.sprg1;
-       regs->sprg2 = vcpu->arch.sprg2;
-       regs->sprg3 = vcpu->arch.sprg3;
+       regs->sprg0 = vcpu->arch.shared->sprg0;
+       regs->sprg1 = vcpu->arch.shared->sprg1;
+       regs->sprg2 = vcpu->arch.shared->sprg2;
+       regs->sprg3 = vcpu->arch.shared->sprg3;
        regs->sprg5 = vcpu->arch.sprg4;
        regs->sprg6 = vcpu->arch.sprg5;
        regs->sprg7 = vcpu->arch.sprg6;
@@ -1088,10 +1088,10 @@ int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
        kvmppc_set_msr(vcpu, regs->msr);
        vcpu->arch.shared->srr0 = regs->srr0;
        vcpu->arch.shared->srr1 = regs->srr1;
-       vcpu->arch.sprg0 = regs->sprg0;
-       vcpu->arch.sprg1 = regs->sprg1;
-       vcpu->arch.sprg2 = regs->sprg2;
-       vcpu->arch.sprg3 = regs->sprg3;
+       vcpu->arch.shared->sprg0 = regs->sprg0;
+       vcpu->arch.shared->sprg1 = regs->sprg1;
+       vcpu->arch.shared->sprg2 = regs->sprg2;
+       vcpu->arch.shared->sprg3 = regs->sprg3;
        vcpu->arch.sprg5 = regs->sprg4;
        vcpu->arch.sprg6 = regs->sprg5;
        vcpu->arch.sprg7 = regs->sprg6;
index 793df28b628d0ff4a69b6a989acb6d4d84e836f8..b2c8c423c4d502bdc284606755291e283a258f08 100644 (file)
@@ -495,10 +495,10 @@ int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
        regs->srr0 = vcpu->arch.shared->srr0;
        regs->srr1 = vcpu->arch.shared->srr1;
        regs->pid = vcpu->arch.pid;
-       regs->sprg0 = vcpu->arch.sprg0;
-       regs->sprg1 = vcpu->arch.sprg1;
-       regs->sprg2 = vcpu->arch.sprg2;
-       regs->sprg3 = vcpu->arch.sprg3;
+       regs->sprg0 = vcpu->arch.shared->sprg0;
+       regs->sprg1 = vcpu->arch.shared->sprg1;
+       regs->sprg2 = vcpu->arch.shared->sprg2;
+       regs->sprg3 = vcpu->arch.shared->sprg3;
        regs->sprg5 = vcpu->arch.sprg4;
        regs->sprg6 = vcpu->arch.sprg5;
        regs->sprg7 = vcpu->arch.sprg6;
@@ -521,10 +521,10 @@ int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
        kvmppc_set_msr(vcpu, regs->msr);
        vcpu->arch.shared->srr0 = regs->srr0;
        vcpu->arch.shared->srr1 = regs->srr1;
-       vcpu->arch.sprg0 = regs->sprg0;
-       vcpu->arch.sprg1 = regs->sprg1;
-       vcpu->arch.sprg2 = regs->sprg2;
-       vcpu->arch.sprg3 = regs->sprg3;
+       vcpu->arch.shared->sprg0 = regs->sprg0;
+       vcpu->arch.shared->sprg1 = regs->sprg1;
+       vcpu->arch.shared->sprg2 = regs->sprg2;
+       vcpu->arch.shared->sprg3 = regs->sprg3;
        vcpu->arch.sprg5 = regs->sprg4;
        vcpu->arch.sprg6 = regs->sprg5;
        vcpu->arch.sprg7 = regs->sprg6;
index ad0fa4ff4ea06a5b5f9fade3c1ccc328178368c3..454869b5e91e88cf6421554d9c8ad8160d484641 100644 (file)
@@ -263,13 +263,17 @@ int kvmppc_emulate_instruction(struct kvm_run *run, struct kvm_vcpu *vcpu)
                                kvmppc_set_gpr(vcpu, rt, get_tb()); break;
 
                        case SPRN_SPRG0:
-                               kvmppc_set_gpr(vcpu, rt, vcpu->arch.sprg0); break;
+                               kvmppc_set_gpr(vcpu, rt, vcpu->arch.shared->sprg0);
+                               break;
                        case SPRN_SPRG1:
-                               kvmppc_set_gpr(vcpu, rt, vcpu->arch.sprg1); break;
+                               kvmppc_set_gpr(vcpu, rt, vcpu->arch.shared->sprg1);
+                               break;
                        case SPRN_SPRG2:
-                               kvmppc_set_gpr(vcpu, rt, vcpu->arch.sprg2); break;
+                               kvmppc_set_gpr(vcpu, rt, vcpu->arch.shared->sprg2);
+                               break;
                        case SPRN_SPRG3:
-                               kvmppc_set_gpr(vcpu, rt, vcpu->arch.sprg3); break;
+                               kvmppc_set_gpr(vcpu, rt, vcpu->arch.shared->sprg3);
+                               break;
                        /* Note: SPRG4-7 are user-readable, so we don't get
                         * a trap. */
 
@@ -341,13 +345,17 @@ int kvmppc_emulate_instruction(struct kvm_run *run, struct kvm_vcpu *vcpu)
                                break;
 
                        case SPRN_SPRG0:
-                               vcpu->arch.sprg0 = kvmppc_get_gpr(vcpu, rs); break;
+                               vcpu->arch.shared->sprg0 = kvmppc_get_gpr(vcpu, rs);
+                               break;
                        case SPRN_SPRG1:
-                               vcpu->arch.sprg1 = kvmppc_get_gpr(vcpu, rs); break;
+                               vcpu->arch.shared->sprg1 = kvmppc_get_gpr(vcpu, rs);
+                               break;
                        case SPRN_SPRG2:
-                               vcpu->arch.sprg2 = kvmppc_get_gpr(vcpu, rs); break;
+                               vcpu->arch.shared->sprg2 = kvmppc_get_gpr(vcpu, rs);
+                               break;
                        case SPRN_SPRG3:
-                               vcpu->arch.sprg3 = kvmppc_get_gpr(vcpu, rs); break;
+                               vcpu->arch.shared->sprg3 = kvmppc_get_gpr(vcpu, rs);
+                               break;
 
                        default:
                                emulated = kvmppc_core_emulate_mtspr(vcpu, sprn, rs);