KVM: MIPS: Improve kvm_get_inst() error return

Currently kvm_get_inst() returns KVM_INVALID_INST in the event of a
fault reading the guest instruction. This has the rather arbitrary magic
value 0xdeadbeef. This API isn't very robust, and in fact 0xdeadbeef is
a valid MIPS64 instruction encoding, namely "ld t1,-16657(s5)".

Therefore change the kvm_get_inst() API to return 0 or -EFAULT, and to
return the instruction via a u32 *out argument. We can then drop the
KVM_INVALID_INST definition entirely.

Signed-off-by: James 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
This commit is contained in:
James Hogan
2016-11-28 17:23:14 +00:00
parent a1ecc54d7e
commit 122e51d474
4 changed files with 56 additions and 53 deletions

View File

@@ -503,16 +503,15 @@ void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu)
local_irq_restore(flags);
}
u32 kvm_get_inst(u32 *opc, struct kvm_vcpu *vcpu)
int kvm_get_inst(u32 *opc, struct kvm_vcpu *vcpu, u32 *out)
{
u32 inst;
int err;
err = get_user(inst, opc);
err = get_user(*out, opc);
if (unlikely(err)) {
kvm_err("%s: illegal address: %p\n", __func__, opc);
return KVM_INVALID_INST;
return -EFAULT;
}
return inst;
return 0;
}