mirror of https://gitee.com/openkylin/linux.git
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);
|
||||
}
|
||||
|
||||
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;
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue