diff options
author | Marc Zyngier <marc.zyngier@arm.com> | 2013-03-04 21:43:23 -0500 |
---|---|---|
committer | Christoffer Dall <cdall@cs.columbia.edu> | 2013-03-06 19:01:51 -0500 |
commit | f42798c6898bf1e536673e798d263e492355162f (patch) | |
tree | f70352f51956a3309954d91681080eab775dc120 /arch/arm/kvm | |
parent | 000d399625b4b302935508f2fc9ce93ff1bd1ba4 (diff) |
ARM: KVM: Fix length of mmio access
Instead of hardcoding the maximum MMIO access to be 4 bytes,
compare it to sizeof(unsigned long), which will do the
right thing on both 32 and 64bit systems.
Same thing for sign extention.
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Christoffer Dall <cdall@cs.columbia.edu>
Diffstat (limited to 'arch/arm/kvm')
-rw-r--r-- | arch/arm/kvm/mmio.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/arch/arm/kvm/mmio.c b/arch/arm/kvm/mmio.c index 02ca76555bd4..72a12f2171b2 100644 --- a/arch/arm/kvm/mmio.c +++ b/arch/arm/kvm/mmio.c | |||
@@ -39,10 +39,10 @@ int kvm_handle_mmio_return(struct kvm_vcpu *vcpu, struct kvm_run *run) | |||
39 | 39 | ||
40 | if (!run->mmio.is_write) { | 40 | if (!run->mmio.is_write) { |
41 | dest = vcpu_reg(vcpu, vcpu->arch.mmio_decode.rt); | 41 | dest = vcpu_reg(vcpu, vcpu->arch.mmio_decode.rt); |
42 | memset(dest, 0, sizeof(int)); | 42 | *dest = 0; |
43 | 43 | ||
44 | len = run->mmio.len; | 44 | len = run->mmio.len; |
45 | if (len > 4) | 45 | if (len > sizeof(unsigned long)) |
46 | return -EINVAL; | 46 | return -EINVAL; |
47 | 47 | ||
48 | memcpy(dest, run->mmio.data, len); | 48 | memcpy(dest, run->mmio.data, len); |
@@ -50,7 +50,8 @@ int kvm_handle_mmio_return(struct kvm_vcpu *vcpu, struct kvm_run *run) | |||
50 | trace_kvm_mmio(KVM_TRACE_MMIO_READ, len, run->mmio.phys_addr, | 50 | trace_kvm_mmio(KVM_TRACE_MMIO_READ, len, run->mmio.phys_addr, |
51 | *((u64 *)run->mmio.data)); | 51 | *((u64 *)run->mmio.data)); |
52 | 52 | ||
53 | if (vcpu->arch.mmio_decode.sign_extend && len < 4) { | 53 | if (vcpu->arch.mmio_decode.sign_extend && |
54 | len < sizeof(unsigned long)) { | ||
54 | mask = 1U << ((len * 8) - 1); | 55 | mask = 1U << ((len * 8) - 1); |
55 | *dest = (*dest ^ mask) - mask; | 56 | *dest = (*dest ^ mask) - mask; |
56 | } | 57 | } |