Commit 5cc4aafc authored by James Hogan's avatar James Hogan Committed by Paolo Bonzini

MIPS: KVM: Recognise r6 CACHE encoding

Recognise the new MIPSr6 CACHE instruction encoding rather than the
pre-r6 one when an r6 kernel is being built. A SPECIAL3 opcode is used
and the immediate field is reduced to 9 bits wide since MIPSr6.
Signed-off-by: default avatarJames Hogan <james.hogan@imgtec.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Radim KrÄmáŠ<rkrcmar@redhat.com>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: linux-mips@linux-mips.org
Cc: kvm@vger.kernel.org
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent 2e0badfa
...@@ -72,7 +72,10 @@ int kvm_mips_trans_cache_va(union mips_instruction inst, u32 *opc, ...@@ -72,7 +72,10 @@ int kvm_mips_trans_cache_va(union mips_instruction inst, u32 *opc,
synci_inst.i_format.opcode = bcond_op; synci_inst.i_format.opcode = bcond_op;
synci_inst.i_format.rs = inst.i_format.rs; synci_inst.i_format.rs = inst.i_format.rs;
synci_inst.i_format.rt = synci_op; synci_inst.i_format.rt = synci_op;
synci_inst.i_format.simmediate = inst.i_format.simmediate; if (cpu_has_mips_r6)
synci_inst.i_format.simmediate = inst.spec3_format.simmediate;
else
synci_inst.i_format.simmediate = inst.i_format.simmediate;
return kvm_mips_trans_replace(vcpu, opc, synci_inst); return kvm_mips_trans_replace(vcpu, opc, synci_inst);
} }
......
...@@ -1601,7 +1601,10 @@ enum emulation_result kvm_mips_emulate_cache(union mips_instruction inst, ...@@ -1601,7 +1601,10 @@ enum emulation_result kvm_mips_emulate_cache(union mips_instruction inst,
base = inst.i_format.rs; base = inst.i_format.rs;
op_inst = inst.i_format.rt; op_inst = inst.i_format.rt;
offset = inst.i_format.simmediate; if (cpu_has_mips_r6)
offset = inst.spec3_format.simmediate;
else
offset = inst.i_format.simmediate;
cache = op_inst & CacheOp_Cache; cache = op_inst & CacheOp_Cache;
op = op_inst & CacheOp_Op; op = op_inst & CacheOp_Op;
...@@ -1764,11 +1767,27 @@ enum emulation_result kvm_mips_emulate_inst(u32 cause, u32 *opc, ...@@ -1764,11 +1767,27 @@ enum emulation_result kvm_mips_emulate_inst(u32 cause, u32 *opc,
er = kvm_mips_emulate_load(inst, cause, run, vcpu); er = kvm_mips_emulate_load(inst, cause, run, vcpu);
break; break;
#ifndef CONFIG_CPU_MIPSR6
case cache_op: case cache_op:
++vcpu->stat.cache_exits; ++vcpu->stat.cache_exits;
trace_kvm_exit(vcpu, KVM_TRACE_EXIT_CACHE); trace_kvm_exit(vcpu, KVM_TRACE_EXIT_CACHE);
er = kvm_mips_emulate_cache(inst, opc, cause, run, vcpu); er = kvm_mips_emulate_cache(inst, opc, cause, run, vcpu);
break; break;
#else
case spec3_op:
switch (inst.spec3_format.func) {
case cache6_op:
++vcpu->stat.cache_exits;
trace_kvm_exit(vcpu, KVM_TRACE_EXIT_CACHE);
er = kvm_mips_emulate_cache(inst, opc, cause, run,
vcpu);
break;
default:
goto unknown;
};
break;
unknown:
#endif
default: default:
kvm_err("Instruction emulation not supported (%p/%#x)\n", opc, kvm_err("Instruction emulation not supported (%p/%#x)\n", opc,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment