diff options
author | Mihai Caraman <mihai.caraman@freescale.com> | 2012-10-11 02:13:22 -0400 |
---|---|---|
committer | Alexander Graf <agraf@suse.de> | 2012-12-05 19:34:12 -0500 |
commit | 7cdd7a95c66a6309ae6156471033fb5375cbcfca (patch) | |
tree | 5a527c59bf4d162b46d3fc9cf6cab0baf5117b2b /arch/powerpc/kvm/e500_emulate.c | |
parent | e51f8f32d6b82f4a34dbb5781769c79b813e5694 (diff) |
KVM: PPC: e500: Add emulation helper for getting instruction ea
Add emulation helper for getting instruction ea and refactor tlb instruction
emulation to use it.
Signed-off-by: Mihai Caraman <mihai.caraman@freescale.com>
[agraf: keep rt variable around]
Signed-off-by: Alexander Graf <agraf@suse.de>
Diffstat (limited to 'arch/powerpc/kvm/e500_emulate.c')
-rw-r--r-- | arch/powerpc/kvm/e500_emulate.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/arch/powerpc/kvm/e500_emulate.c b/arch/powerpc/kvm/e500_emulate.c index e04b0ef55ce0..e78f353a836a 100644 --- a/arch/powerpc/kvm/e500_emulate.c +++ b/arch/powerpc/kvm/e500_emulate.c | |||
@@ -89,6 +89,7 @@ int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu, | |||
89 | int ra = get_ra(inst); | 89 | int ra = get_ra(inst); |
90 | int rb = get_rb(inst); | 90 | int rb = get_rb(inst); |
91 | int rt = get_rt(inst); | 91 | int rt = get_rt(inst); |
92 | gva_t ea; | ||
92 | 93 | ||
93 | switch (get_op(inst)) { | 94 | switch (get_op(inst)) { |
94 | case 31: | 95 | case 31: |
@@ -113,15 +114,20 @@ int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu, | |||
113 | break; | 114 | break; |
114 | 115 | ||
115 | case XOP_TLBSX: | 116 | case XOP_TLBSX: |
116 | emulated = kvmppc_e500_emul_tlbsx(vcpu,rb); | 117 | ea = kvmppc_get_ea_indexed(vcpu, ra, rb); |
118 | emulated = kvmppc_e500_emul_tlbsx(vcpu, ea); | ||
117 | break; | 119 | break; |
118 | 120 | ||
119 | case XOP_TLBILX: | 121 | case XOP_TLBILX: { |
120 | emulated = kvmppc_e500_emul_tlbilx(vcpu, rt, ra, rb); | 122 | int type = rt & 0x3; |
123 | ea = kvmppc_get_ea_indexed(vcpu, ra, rb); | ||
124 | emulated = kvmppc_e500_emul_tlbilx(vcpu, type, ea); | ||
121 | break; | 125 | break; |
126 | } | ||
122 | 127 | ||
123 | case XOP_TLBIVAX: | 128 | case XOP_TLBIVAX: |
124 | emulated = kvmppc_e500_emul_tlbivax(vcpu, ra, rb); | 129 | ea = kvmppc_get_ea_indexed(vcpu, ra, rb); |
130 | emulated = kvmppc_e500_emul_tlbivax(vcpu, ea); | ||
125 | break; | 131 | break; |
126 | 132 | ||
127 | default: | 133 | default: |