Commit 2daab50e authored by Tudor Laurentiu's avatar Tudor Laurentiu Committed by Paul Mackerras

KVM: PPC: e500: Emulate TMCFG0 TMRN register

Emulate TMCFG0 TMRN register exposing one HW thread per vcpu.
Signed-off-by: default avatarMihai 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: default avatarLaurentiu Tudor <Laurentiu.Tudor@freescale.com>
Acked-by: default avatarScott Wood <scotttwood@freescale.com>
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent d4cd4f95
...@@ -42,6 +42,11 @@ static inline unsigned int get_dcrn(u32 inst) ...@@ -42,6 +42,11 @@ static inline unsigned int get_dcrn(u32 inst)
return ((inst >> 16) & 0x1f) | ((inst >> 6) & 0x3e0); 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) static inline unsigned int get_rt(u32 inst)
{ {
return (inst >> 21) & 0x1f; return (inst >> 21) & 0x1f;
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include <asm/kvm_ppc.h> #include <asm/kvm_ppc.h>
#include <asm/disassemble.h> #include <asm/disassemble.h>
#include <asm/dbell.h> #include <asm/dbell.h>
#include <asm/reg_booke.h>
#include "booke.h" #include "booke.h"
#include "e500.h" #include "e500.h"
...@@ -22,6 +23,7 @@ ...@@ -22,6 +23,7 @@
#define XOP_DCBTLS 166 #define XOP_DCBTLS 166
#define XOP_MSGSND 206 #define XOP_MSGSND 206
#define XOP_MSGCLR 238 #define XOP_MSGCLR 238
#define XOP_MFTMR 366
#define XOP_TLBIVAX 786 #define XOP_TLBIVAX 786
#define XOP_TLBSX 914 #define XOP_TLBSX 914
#define XOP_TLBRE 946 #define XOP_TLBRE 946
...@@ -113,6 +115,19 @@ static int kvmppc_e500_emul_dcbtls(struct kvm_vcpu *vcpu) ...@@ -113,6 +115,19 @@ static int kvmppc_e500_emul_dcbtls(struct kvm_vcpu *vcpu)
return EMULATE_DONE; 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, int kvmppc_core_emulate_op_e500(struct kvm_run *run, struct kvm_vcpu *vcpu,
unsigned int inst, int *advance) unsigned int inst, int *advance)
{ {
...@@ -165,6 +180,10 @@ int kvmppc_core_emulate_op_e500(struct kvm_run *run, struct kvm_vcpu *vcpu, ...@@ -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); emulated = kvmppc_e500_emul_tlbivax(vcpu, ea);
break; break;
case XOP_MFTMR:
emulated = kvmppc_e500_emul_mftmr(vcpu, inst, rt);
break;
case XOP_EHPRIV: case XOP_EHPRIV:
emulated = kvmppc_e500_emul_ehpriv(run, vcpu, inst, emulated = kvmppc_e500_emul_ehpriv(run, vcpu, inst,
advance); advance);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment