KVM: PPC: e500: Emulate TMCFG0 TMRN register
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>
This commit is contained in:
parent
d4cd4f9586
commit
2daab50e17
|
@ -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 @@
|
||||||
#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 @@
|
||||||
#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)
|
||||||
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,
|
||||||
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);
|
||||||
|
|
Loading…
Reference in New Issue