KVM: PPC: Enable native paired singles
authorAlexander Graf <agraf@suse.de>
Tue, 20 Apr 2010 00:49:54 +0000 (02:49 +0200)
committerAvi Kivity <avi@redhat.com>
Mon, 17 May 2010 09:19:08 +0000 (12:19 +0300)
When we're on a paired single capable host, we can just always enable
paired singles and expose them to the guest directly.

This approach breaks when multiple VMs run and access PS concurrently,
but this should suffice until we get a proper framework for it in Linux.

Signed-off-by: Alexander Graf <agraf@suse.de>
Signed-off-by: Avi Kivity <avi@redhat.com>
arch/powerpc/include/asm/kvm_asm.h
arch/powerpc/kvm/book3s.c
arch/powerpc/kvm/book3s_emulate.c

index 7238c04..c5ea4cd 100644 (file)
@@ -89,6 +89,7 @@
 #define BOOK3S_HFLAG_DCBZ32                    0x1
 #define BOOK3S_HFLAG_SLB                       0x2
 #define BOOK3S_HFLAG_PAIRED_SINGLE             0x4
+#define BOOK3S_HFLAG_NATIVE_PS                 0x8
 
 #define RESUME_FLAG_NV          (1<<0)  /* Reload guest nonvolatile state? */
 #define RESUME_FLAG_HOST        (1<<1)  /* Resume host? */
index 397701d..9f97dbe 100644 (file)
@@ -345,6 +345,8 @@ void kvmppc_core_deliver_interrupts(struct kvm_vcpu *vcpu)
 
 void kvmppc_set_pvr(struct kvm_vcpu *vcpu, u32 pvr)
 {
+       u32 host_pvr;
+
        vcpu->arch.hflags &= ~BOOK3S_HFLAG_SLB;
        vcpu->arch.pvr = pvr;
 #ifdef CONFIG_PPC_BOOK3S_64
@@ -376,6 +378,23 @@ void kvmppc_set_pvr(struct kvm_vcpu *vcpu, u32 pvr)
        /* 32 bit Book3S always has 32 byte dcbz */
        vcpu->arch.hflags |= BOOK3S_HFLAG_DCBZ32;
 #endif
+
+       /* On some CPUs we can execute paired single operations natively */
+       asm ( "mfpvr %0" : "=r"(host_pvr));
+       switch (host_pvr) {
+       case 0x00080200:        /* lonestar 2.0 */
+       case 0x00088202:        /* lonestar 2.2 */
+       case 0x70000100:        /* gekko 1.0 */
+       case 0x00080100:        /* gekko 2.0 */
+       case 0x00083203:        /* gekko 2.3a */
+       case 0x00083213:        /* gekko 2.3b */
+       case 0x00083204:        /* gekko 2.4 */
+       case 0x00083214:        /* gekko 2.4e (8SE) - retail HW2 */
+       case 0x00087200:        /* broadway */
+               vcpu->arch.hflags |= BOOK3S_HFLAG_NATIVE_PS;
+               /* Enable HID2.PSE - in case we need it later */
+               mtspr(SPRN_HID2_GEKKO, mfspr(SPRN_HID2_GEKKO) | (1 << 29));
+       }
 }
 
 /* Book3s_32 CPUs always have 32 bytes cache line size, which Linux assumes. To
index 3f7afb5..c85f906 100644 (file)
@@ -365,7 +365,10 @@ int kvmppc_core_emulate_mtspr(struct kvm_vcpu *vcpu, int sprn, int rs)
                case 0x00083213:        /* gekko 2.3b */
                case 0x00083204:        /* gekko 2.4 */
                case 0x00083214:        /* gekko 2.4e (8SE) - retail HW2 */
-                       if (spr_val & (1 << 29)) { /* HID2.PSE */
+               case 0x00087200:        /* broadway */
+                       if (vcpu->arch.hflags & BOOK3S_HFLAG_NATIVE_PS) {
+                               /* Native paired singles */
+                       } else if (spr_val & (1 << 29)) { /* HID2.PSE */
                                vcpu->arch.hflags |= BOOK3S_HFLAG_PAIRED_SINGLE;
                                kvmppc_giveup_ext(vcpu, MSR_FP);
                        } else {