|
@@ -26,6 +26,7 @@
|
|
|
#define XOP_TLBRE 946
|
|
|
#define XOP_TLBWE 978
|
|
|
#define XOP_TLBILX 18
|
|
|
+#define XOP_EHPRIV 270
|
|
|
|
|
|
#ifdef CONFIG_KVM_E500MC
|
|
|
static int dbell2prio(ulong param)
|
|
@@ -82,6 +83,26 @@ static int kvmppc_e500_emul_msgsnd(struct kvm_vcpu *vcpu, int rb)
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
+static int kvmppc_e500_emul_ehpriv(struct kvm_run *run, struct kvm_vcpu *vcpu,
|
|
|
+ unsigned int inst, int *advance)
|
|
|
+{
|
|
|
+ int emulated = EMULATE_DONE;
|
|
|
+
|
|
|
+ switch (get_oc(inst)) {
|
|
|
+ case EHPRIV_OC_DEBUG:
|
|
|
+ run->exit_reason = KVM_EXIT_DEBUG;
|
|
|
+ run->debug.arch.address = vcpu->arch.pc;
|
|
|
+ run->debug.arch.status = 0;
|
|
|
+ kvmppc_account_exit(vcpu, DEBUG_EXITS);
|
|
|
+ emulated = EMULATE_EXIT_USER;
|
|
|
+ *advance = 0;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ emulated = EMULATE_FAIL;
|
|
|
+ }
|
|
|
+ return emulated;
|
|
|
+}
|
|
|
+
|
|
|
int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu,
|
|
|
unsigned int inst, int *advance)
|
|
|
{
|
|
@@ -130,6 +151,11 @@ int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu,
|
|
|
emulated = kvmppc_e500_emul_tlbivax(vcpu, ea);
|
|
|
break;
|
|
|
|
|
|
+ case XOP_EHPRIV:
|
|
|
+ emulated = kvmppc_e500_emul_ehpriv(run, vcpu, inst,
|
|
|
+ advance);
|
|
|
+ break;
|
|
|
+
|
|
|
default:
|
|
|
emulated = EMULATE_FAIL;
|
|
|
}
|