| .. | .. |
|---|
| 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 | } |
|---|