.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
---|
1 | 2 | /* |
---|
2 | | - * This program is free software; you can redistribute it and/or modify |
---|
3 | | - * it under the terms of the GNU General Public License, version 2, as |
---|
4 | | - * published by the Free Software Foundation. |
---|
5 | | - * |
---|
6 | | - * This program is distributed in the hope that it will be useful, |
---|
7 | | - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
8 | | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
---|
9 | | - * GNU General Public License for more details. |
---|
10 | | - * |
---|
11 | | - * You should have received a copy of the GNU General Public License |
---|
12 | | - * along with this program; if not, write to the Free Software |
---|
13 | | - * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
---|
14 | 3 | * |
---|
15 | 4 | * Copyright IBM Corp. 2007 |
---|
16 | 5 | * Copyright 2011 Freescale Semiconductor, Inc. |
---|
.. | .. |
---|
82 | 71 | */ |
---|
83 | 72 | int kvmppc_emulate_loadstore(struct kvm_vcpu *vcpu) |
---|
84 | 73 | { |
---|
85 | | - struct kvm_run *run = vcpu->run; |
---|
86 | 74 | u32 inst; |
---|
87 | | - int ra, rs, rt; |
---|
88 | 75 | enum emulation_result emulated = EMULATE_FAIL; |
---|
89 | 76 | int advance = 1; |
---|
90 | 77 | struct instruction_op op; |
---|
.. | .. |
---|
96 | 83 | if (emulated != EMULATE_DONE) |
---|
97 | 84 | return emulated; |
---|
98 | 85 | |
---|
99 | | - ra = get_ra(inst); |
---|
100 | | - rs = get_rs(inst); |
---|
101 | | - rt = get_rt(inst); |
---|
102 | | - |
---|
103 | | - /* |
---|
104 | | - * if mmio_vsx_tx_sx_enabled == 0, copy data between |
---|
105 | | - * VSR[0..31] and memory |
---|
106 | | - * if mmio_vsx_tx_sx_enabled == 1, copy data between |
---|
107 | | - * VSR[32..63] and memory |
---|
108 | | - */ |
---|
109 | 86 | vcpu->arch.mmio_vsx_copy_nums = 0; |
---|
110 | 87 | vcpu->arch.mmio_vsx_offset = 0; |
---|
111 | 88 | vcpu->arch.mmio_copy_type = KVMPPC_VSX_COPY_NONE; |
---|
.. | .. |
---|
117 | 94 | |
---|
118 | 95 | emulated = EMULATE_FAIL; |
---|
119 | 96 | vcpu->arch.regs.msr = vcpu->arch.shared->msr; |
---|
120 | | - if (analyse_instr(&op, &vcpu->arch.regs, inst) == 0) { |
---|
| 97 | + if (analyse_instr(&op, &vcpu->arch.regs, ppc_inst(inst)) == 0) { |
---|
121 | 98 | int type = op.type & INSTR_TYPE_MASK; |
---|
122 | 99 | int size = GETSIZE(op.type); |
---|
123 | 100 | |
---|
.. | .. |
---|
126 | 103 | int instr_byte_swap = op.type & BYTEREV; |
---|
127 | 104 | |
---|
128 | 105 | if (op.type & SIGNEXT) |
---|
129 | | - emulated = kvmppc_handle_loads(run, vcpu, |
---|
| 106 | + emulated = kvmppc_handle_loads(vcpu, |
---|
130 | 107 | op.reg, size, !instr_byte_swap); |
---|
131 | 108 | else |
---|
132 | | - emulated = kvmppc_handle_load(run, vcpu, |
---|
| 109 | + emulated = kvmppc_handle_load(vcpu, |
---|
133 | 110 | op.reg, size, !instr_byte_swap); |
---|
134 | 111 | |
---|
135 | 112 | if ((op.type & UPDATE) && (emulated != EMULATE_FAIL)) |
---|
.. | .. |
---|
146 | 123 | vcpu->arch.mmio_sp64_extend = 1; |
---|
147 | 124 | |
---|
148 | 125 | if (op.type & SIGNEXT) |
---|
149 | | - emulated = kvmppc_handle_loads(run, vcpu, |
---|
| 126 | + emulated = kvmppc_handle_loads(vcpu, |
---|
150 | 127 | KVM_MMIO_REG_FPR|op.reg, size, 1); |
---|
151 | 128 | else |
---|
152 | | - emulated = kvmppc_handle_load(run, vcpu, |
---|
| 129 | + emulated = kvmppc_handle_load(vcpu, |
---|
153 | 130 | KVM_MMIO_REG_FPR|op.reg, size, 1); |
---|
154 | 131 | |
---|
155 | 132 | if ((op.type & UPDATE) && (emulated != EMULATE_FAIL)) |
---|
.. | .. |
---|
186 | 163 | |
---|
187 | 164 | if (size == 16) { |
---|
188 | 165 | vcpu->arch.mmio_vmx_copy_nums = 2; |
---|
189 | | - emulated = kvmppc_handle_vmx_load(run, |
---|
190 | | - vcpu, KVM_MMIO_REG_VMX|op.reg, |
---|
| 166 | + emulated = kvmppc_handle_vmx_load(vcpu, |
---|
| 167 | + KVM_MMIO_REG_VMX|op.reg, |
---|
191 | 168 | 8, 1); |
---|
192 | 169 | } else { |
---|
193 | 170 | vcpu->arch.mmio_vmx_copy_nums = 1; |
---|
194 | | - emulated = kvmppc_handle_vmx_load(run, vcpu, |
---|
| 171 | + emulated = kvmppc_handle_vmx_load(vcpu, |
---|
195 | 172 | KVM_MMIO_REG_VMX|op.reg, |
---|
196 | 173 | size, 1); |
---|
197 | 174 | } |
---|
.. | .. |
---|
239 | 216 | io_size_each = op.element_size; |
---|
240 | 217 | } |
---|
241 | 218 | |
---|
242 | | - emulated = kvmppc_handle_vsx_load(run, vcpu, |
---|
| 219 | + emulated = kvmppc_handle_vsx_load(vcpu, |
---|
243 | 220 | KVM_MMIO_REG_VSX|op.reg, io_size_each, |
---|
244 | 221 | 1, op.type & SIGNEXT); |
---|
245 | 222 | break; |
---|
.. | .. |
---|
249 | 226 | /* if need byte reverse, op.val has been reversed by |
---|
250 | 227 | * analyse_instr(). |
---|
251 | 228 | */ |
---|
252 | | - emulated = kvmppc_handle_store(run, vcpu, op.val, |
---|
253 | | - size, 1); |
---|
| 229 | + emulated = kvmppc_handle_store(vcpu, op.val, size, 1); |
---|
254 | 230 | |
---|
255 | 231 | if ((op.type & UPDATE) && (emulated != EMULATE_FAIL)) |
---|
256 | 232 | kvmppc_set_gpr(vcpu, op.update_reg, op.ea); |
---|
.. | .. |
---|
272 | 248 | if (op.type & FPCONV) |
---|
273 | 249 | vcpu->arch.mmio_sp64_extend = 1; |
---|
274 | 250 | |
---|
275 | | - emulated = kvmppc_handle_store(run, vcpu, |
---|
| 251 | + emulated = kvmppc_handle_store(vcpu, |
---|
276 | 252 | VCPU_FPR(vcpu, op.reg), size, 1); |
---|
277 | 253 | |
---|
278 | 254 | if ((op.type & UPDATE) && (emulated != EMULATE_FAIL)) |
---|
.. | .. |
---|
312 | 288 | |
---|
313 | 289 | if (size == 16) { |
---|
314 | 290 | vcpu->arch.mmio_vmx_copy_nums = 2; |
---|
315 | | - emulated = kvmppc_handle_vmx_store(run, |
---|
316 | | - vcpu, op.reg, 8, 1); |
---|
| 291 | + emulated = kvmppc_handle_vmx_store(vcpu, |
---|
| 292 | + op.reg, 8, 1); |
---|
317 | 293 | } else { |
---|
318 | 294 | vcpu->arch.mmio_vmx_copy_nums = 1; |
---|
319 | | - emulated = kvmppc_handle_vmx_store(run, |
---|
320 | | - vcpu, op.reg, size, 1); |
---|
| 295 | + emulated = kvmppc_handle_vmx_store(vcpu, |
---|
| 296 | + op.reg, size, 1); |
---|
321 | 297 | } |
---|
322 | 298 | |
---|
323 | 299 | break; |
---|
.. | .. |
---|
360 | 336 | io_size_each = op.element_size; |
---|
361 | 337 | } |
---|
362 | 338 | |
---|
363 | | - emulated = kvmppc_handle_vsx_store(run, vcpu, |
---|
| 339 | + emulated = kvmppc_handle_vsx_store(vcpu, |
---|
364 | 340 | op.reg, io_size_each, 1); |
---|
365 | 341 | break; |
---|
366 | 342 | } |
---|