提交 e4dcfe88 编写于 作者: A Alexander Graf

KVM: PPC: 440: Implement mtdcrx

We need mtdcrx to execute properly on 460 cores.
Signed-off-by: NAlexander Graf <agraf@suse.de>
上级 2e232702
...@@ -28,11 +28,29 @@ ...@@ -28,11 +28,29 @@
#include "44x_tlb.h" #include "44x_tlb.h"
#define XOP_MFDCR 323 #define XOP_MFDCR 323
#define XOP_MTDCRX 387
#define XOP_MTDCR 451 #define XOP_MTDCR 451
#define XOP_TLBSX 914 #define XOP_TLBSX 914
#define XOP_ICCCI 966 #define XOP_ICCCI 966
#define XOP_TLBWE 978 #define XOP_TLBWE 978
static int emulate_mtdcr(struct kvm_vcpu *vcpu, int rs, int dcrn)
{
/* emulate some access in kernel */
switch (dcrn) {
case DCRN_CPR0_CONFIG_ADDR:
vcpu->arch.cpr0_cfgaddr = kvmppc_get_gpr(vcpu, rs);
return EMULATE_DONE;
default:
vcpu->run->dcr.dcrn = dcrn;
vcpu->run->dcr.data = kvmppc_get_gpr(vcpu, rs);
vcpu->run->dcr.is_write = 1;
vcpu->arch.dcr_needed = 1;
kvmppc_account_exit(vcpu, DCR_EXITS);
return EMULATE_DO_DCR;
}
}
int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu, int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu,
unsigned int inst, int *advance) unsigned int inst, int *advance)
{ {
...@@ -85,20 +103,12 @@ int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu, ...@@ -85,20 +103,12 @@ int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu,
break; break;
case XOP_MTDCR: case XOP_MTDCR:
/* emulate some access in kernel */ emulated = emulate_mtdcr(vcpu, rs, dcrn);
switch (dcrn) {
case DCRN_CPR0_CONFIG_ADDR:
vcpu->arch.cpr0_cfgaddr = kvmppc_get_gpr(vcpu, rs);
break; break;
default:
run->dcr.dcrn = dcrn;
run->dcr.data = kvmppc_get_gpr(vcpu, rs);
run->dcr.is_write = 1;
vcpu->arch.dcr_needed = 1;
kvmppc_account_exit(vcpu, DCR_EXITS);
emulated = EMULATE_DO_DCR;
}
case XOP_MTDCRX:
emulated = emulate_mtdcr(vcpu, rs,
kvmppc_get_gpr(vcpu, ra));
break; break;
case XOP_TLBWE: case XOP_TLBWE:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册