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 7238c048e5bbeff35d025a0a228e665a202fd003..c5ea4cda34b329fa3f6bac605e95ad114105c09d 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 397701d39ae7571ab04b903191aa800bcd26fbd6..9f97dbe25e4eec866dd11e8c2e36dd4b6f107732 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 3f7afb5f348379db3a01a01a5836d9586e9f6adb..c85f906038ce8d4441a841721d046e7de3611c8f 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 {