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

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
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -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;
+19 −0
Original line number Diff line number Diff line
@@ -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);