KVM: PPC: e500: Emulate TMCFG0 TMRN register
authorTudor Laurentiu <b10716@freescale.com>
Fri, 25 Sep 2015 15:02:23 +0000 (18:02 +0300)
committerPaul Mackerras <paulus@samba.org>
Thu, 15 Oct 2015 04:58:16 +0000 (15:58 +1100)
Emulate TMCFG0 TMRN register exposing one HW thread per vcpu.

Signed-off-by: Mihai Caraman <mihai.caraman@freescale.com>
[Laurentiu.Tudor@freescale.com: rebased on latest kernel, use
 define instead of hardcoded value, moved code in own function]
Signed-off-by: Laurentiu Tudor <Laurentiu.Tudor@freescale.com>
Acked-by: Scott Wood <scotttwood@freescale.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
arch/powerpc/include/asm/disassemble.h
arch/powerpc/kvm/e500_emulate.c

index 6330a61b875a3d145396142294e0917c7b242905..4852e849128bf88f057d9af05ff4bdce5fa6976d 100644 (file)
@@ -42,6 +42,11 @@ static inline unsigned int get_dcrn(u32 inst)
        return ((inst >> 16) & 0x1f) | ((inst >> 6) & 0x3e0);
 }
 
+static inline unsigned int get_tmrn(u32 inst)
+{
+       return ((inst >> 16) & 0x1f) | ((inst >> 6) & 0x3e0);
+}
+
 static inline unsigned int get_rt(u32 inst)
 {
        return (inst >> 21) & 0x1f;
index ce7291c79f6c7d72a2def9d7d4a0681e09776564..990db69a1d0b0f9a76d31ae1323fb6e23cb39a82 100644 (file)
@@ -15,6 +15,7 @@
 #include <asm/kvm_ppc.h>
 #include <asm/disassemble.h>
 #include <asm/dbell.h>
+#include <asm/reg_booke.h>
 
 #include "booke.h"
 #include "e500.h"
@@ -22,6 +23,7 @@
 #define XOP_DCBTLS  166
 #define XOP_MSGSND  206
 #define XOP_MSGCLR  238
+#define XOP_MFTMR   366
 #define XOP_TLBIVAX 786
 #define XOP_TLBSX   914
 #define XOP_TLBRE   946
@@ -113,6 +115,19 @@ static int kvmppc_e500_emul_dcbtls(struct kvm_vcpu *vcpu)
        return EMULATE_DONE;
 }
 
+static int kvmppc_e500_emul_mftmr(struct kvm_vcpu *vcpu, unsigned int inst,
+                                 int rt)
+{
+       /* Expose one thread per vcpu */
+       if (get_tmrn(inst) == TMRN_TMCFG0) {
+               kvmppc_set_gpr(vcpu, rt,
+                              1 | (1 << TMRN_TMCFG0_NATHRD_SHIFT));
+               return EMULATE_DONE;
+       }
+
+       return EMULATE_FAIL;
+}
+
 int kvmppc_core_emulate_op_e500(struct kvm_run *run, struct kvm_vcpu *vcpu,
                                unsigned int inst, int *advance)
 {
@@ -165,6 +180,10 @@ int kvmppc_core_emulate_op_e500(struct kvm_run *run, struct kvm_vcpu *vcpu,
                        emulated = kvmppc_e500_emul_tlbivax(vcpu, ea);
                        break;
 
+               case XOP_MFTMR:
+                       emulated = kvmppc_e500_emul_mftmr(vcpu, inst, rt);
+                       break;
+
                case XOP_EHPRIV:
                        emulated = kvmppc_e500_emul_ehpriv(run, vcpu, inst,
                                                           advance);