diff options
Diffstat (limited to 'arch/powerpc/kvm/powerpc.c')
-rw-r--r-- | arch/powerpc/kvm/powerpc.c | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c index 4633e7850dd2..2c291161df89 100644 --- a/arch/powerpc/kvm/powerpc.c +++ b/arch/powerpc/kvm/powerpc.c | |||
@@ -270,34 +270,35 @@ int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu, | |||
270 | static void kvmppc_complete_dcr_load(struct kvm_vcpu *vcpu, | 270 | static void kvmppc_complete_dcr_load(struct kvm_vcpu *vcpu, |
271 | struct kvm_run *run) | 271 | struct kvm_run *run) |
272 | { | 272 | { |
273 | ulong *gpr = &vcpu->arch.gpr[vcpu->arch.io_gpr]; | 273 | kvmppc_set_gpr(vcpu, vcpu->arch.io_gpr, run->dcr.data); |
274 | *gpr = run->dcr.data; | ||
275 | } | 274 | } |
276 | 275 | ||
277 | static void kvmppc_complete_mmio_load(struct kvm_vcpu *vcpu, | 276 | static void kvmppc_complete_mmio_load(struct kvm_vcpu *vcpu, |
278 | struct kvm_run *run) | 277 | struct kvm_run *run) |
279 | { | 278 | { |
280 | ulong *gpr = &vcpu->arch.gpr[vcpu->arch.io_gpr]; | 279 | ulong gpr; |
281 | 280 | ||
282 | if (run->mmio.len > sizeof(*gpr)) { | 281 | if (run->mmio.len > sizeof(gpr)) { |
283 | printk(KERN_ERR "bad MMIO length: %d\n", run->mmio.len); | 282 | printk(KERN_ERR "bad MMIO length: %d\n", run->mmio.len); |
284 | return; | 283 | return; |
285 | } | 284 | } |
286 | 285 | ||
287 | if (vcpu->arch.mmio_is_bigendian) { | 286 | if (vcpu->arch.mmio_is_bigendian) { |
288 | switch (run->mmio.len) { | 287 | switch (run->mmio.len) { |
289 | case 4: *gpr = *(u32 *)run->mmio.data; break; | 288 | case 4: gpr = *(u32 *)run->mmio.data; break; |
290 | case 2: *gpr = *(u16 *)run->mmio.data; break; | 289 | case 2: gpr = *(u16 *)run->mmio.data; break; |
291 | case 1: *gpr = *(u8 *)run->mmio.data; break; | 290 | case 1: gpr = *(u8 *)run->mmio.data; break; |
292 | } | 291 | } |
293 | } else { | 292 | } else { |
294 | /* Convert BE data from userland back to LE. */ | 293 | /* Convert BE data from userland back to LE. */ |
295 | switch (run->mmio.len) { | 294 | switch (run->mmio.len) { |
296 | case 4: *gpr = ld_le32((u32 *)run->mmio.data); break; | 295 | case 4: gpr = ld_le32((u32 *)run->mmio.data); break; |
297 | case 2: *gpr = ld_le16((u16 *)run->mmio.data); break; | 296 | case 2: gpr = ld_le16((u16 *)run->mmio.data); break; |
298 | case 1: *gpr = *(u8 *)run->mmio.data; break; | 297 | case 1: gpr = *(u8 *)run->mmio.data; break; |
299 | } | 298 | } |
300 | } | 299 | } |
300 | |||
301 | kvmppc_set_gpr(vcpu, vcpu->arch.io_gpr, gpr); | ||
301 | } | 302 | } |
302 | 303 | ||
303 | int kvmppc_handle_load(struct kvm_run *run, struct kvm_vcpu *vcpu, | 304 | int kvmppc_handle_load(struct kvm_run *run, struct kvm_vcpu *vcpu, |