diff options
author | Alexander Graf <agraf@suse.de> | 2012-08-15 18:28:09 -0400 |
---|---|---|
committer | Alexander Graf <agraf@suse.de> | 2012-10-05 17:38:49 -0400 |
commit | e4dcfe88fb30bcedda80c151018086fffb8280e6 (patch) | |
tree | d7525d4b559b1f6f27e30ee216715b56122e97d1 | |
parent | 2e2327023fe090d68aacad395178298645eaffea (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.c | 36 |
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 | ||
37 | static 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 | |||
36 | int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu, | 54 | int 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: |