aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Graf <agraf@suse.de>2012-08-15 18:28:09 -0400
committerAlexander Graf <agraf@suse.de>2012-10-05 17:38:49 -0400
commite4dcfe88fb30bcedda80c151018086fffb8280e6 (patch)
treed7525d4b559b1f6f27e30ee216715b56122e97d1
parent2e2327023fe090d68aacad395178298645eaffea (diff)
KVM: PPC: 440: Implement mtdcrx
We need mtdcrx to execute properly on 460 cores. Signed-off-by: Alexander Graf <agraf@suse.de>
-rw-r--r--arch/powerpc/kvm/44x_emulate.c36
1 files changed, 23 insertions, 13 deletions
diff --git a/arch/powerpc/kvm/44x_emulate.c b/arch/powerpc/kvm/44x_emulate.c
index c8c61578fdfc..3843a75e3e98 100644
--- a/arch/powerpc/kvm/44x_emulate.c
+++ b/arch/powerpc/kvm/44x_emulate.c
@@ -28,11 +28,29 @@
28#include "44x_tlb.h" 28#include "44x_tlb.h"
29 29
30#define XOP_MFDCR 323 30#define XOP_MFDCR 323
31#define XOP_MTDCRX 387
31#define XOP_MTDCR 451 32#define XOP_MTDCR 451
32#define XOP_TLBSX 914 33#define XOP_TLBSX 914
33#define XOP_ICCCI 966 34#define XOP_ICCCI 966
34#define XOP_TLBWE 978 35#define XOP_TLBWE 978
35 36
37static int emulate_mtdcr(struct kvm_vcpu *vcpu, int rs, int dcrn)
38{
39 /* emulate some access in kernel */
40 switch (dcrn) {
41 case DCRN_CPR0_CONFIG_ADDR:
42 vcpu->arch.cpr0_cfgaddr = kvmppc_get_gpr(vcpu, rs);
43 return EMULATE_DONE;
44 default:
45 vcpu->run->dcr.dcrn = dcrn;
46 vcpu->run->dcr.data = kvmppc_get_gpr(vcpu, rs);
47 vcpu->run->dcr.is_write = 1;
48 vcpu->arch.dcr_needed = 1;
49 kvmppc_account_exit(vcpu, DCR_EXITS);
50 return EMULATE_DO_DCR;
51 }
52}
53
36int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu, 54int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu,
37 unsigned int inst, int *advance) 55 unsigned int inst, int *advance)
38{ 56{
@@ -85,20 +103,12 @@ int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu,
85 break; 103 break;
86 104
87 case XOP_MTDCR: 105 case XOP_MTDCR:
88 /* emulate some access in kernel */ 106 emulated = emulate_mtdcr(vcpu, rs, dcrn);
89 switch (dcrn) { 107 break;
90 case DCRN_CPR0_CONFIG_ADDR:
91 vcpu->arch.cpr0_cfgaddr = kvmppc_get_gpr(vcpu, rs);
92 break;
93 default:
94 run->dcr.dcrn = dcrn;
95 run->dcr.data = kvmppc_get_gpr(vcpu, rs);
96 run->dcr.is_write = 1;
97 vcpu->arch.dcr_needed = 1;
98 kvmppc_account_exit(vcpu, DCR_EXITS);
99 emulated = EMULATE_DO_DCR;
100 }
101 108
109 case XOP_MTDCRX:
110 emulated = emulate_mtdcr(vcpu, rs,
111 kvmppc_get_gpr(vcpu, ra));
102 break; 112 break;
103 113
104 case XOP_TLBWE: 114 case XOP_TLBWE: