|
@@ -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);
|