@@ -348,17 +348,18 @@ bool lock_all_vcpus(struct kvm *kvm)
348348 *
349349 * @dev: kvm device handle
350350 * @attr: kvm device attribute
351- * @reg: address the value is read or written
352351 * @is_write: true if userspace is writing a register
353352 */
354353static int vgic_v2_attr_regs_access (struct kvm_device * dev ,
355354 struct kvm_device_attr * attr ,
356- u32 * reg , bool is_write )
355+ bool is_write )
357356{
357+ u32 __user * uaddr = (u32 __user * )(unsigned long )attr -> addr ;
358358 struct vgic_reg_attr reg_attr ;
359359 gpa_t addr ;
360360 struct kvm_vcpu * vcpu ;
361361 int ret ;
362+ u32 val ;
362363
363364 ret = vgic_v2_parse_attr (dev , attr , & reg_attr );
364365 if (ret )
@@ -367,6 +368,10 @@ static int vgic_v2_attr_regs_access(struct kvm_device *dev,
367368 vcpu = reg_attr .vcpu ;
368369 addr = reg_attr .addr ;
369370
371+ if (is_write )
372+ if (get_user (val , uaddr ))
373+ return - EFAULT ;
374+
370375 mutex_lock (& dev -> kvm -> lock );
371376
372377 ret = vgic_init (dev -> kvm );
@@ -380,10 +385,10 @@ static int vgic_v2_attr_regs_access(struct kvm_device *dev,
380385
381386 switch (attr -> group ) {
382387 case KVM_DEV_ARM_VGIC_GRP_CPU_REGS :
383- ret = vgic_v2_cpuif_uaccess (vcpu , is_write , addr , reg );
388+ ret = vgic_v2_cpuif_uaccess (vcpu , is_write , addr , & val );
384389 break ;
385390 case KVM_DEV_ARM_VGIC_GRP_DIST_REGS :
386- ret = vgic_v2_dist_uaccess (vcpu , is_write , addr , reg );
391+ ret = vgic_v2_dist_uaccess (vcpu , is_write , addr , & val );
387392 break ;
388393 default :
389394 ret = - EINVAL ;
@@ -393,6 +398,10 @@ static int vgic_v2_attr_regs_access(struct kvm_device *dev,
393398 unlock_all_vcpus (dev -> kvm );
394399out :
395400 mutex_unlock (& dev -> kvm -> lock );
401+
402+ if (!ret && !is_write )
403+ ret = put_user (val , uaddr );
404+
396405 return ret ;
397406}
398407
@@ -407,15 +416,8 @@ static int vgic_v2_set_attr(struct kvm_device *dev,
407416
408417 switch (attr -> group ) {
409418 case KVM_DEV_ARM_VGIC_GRP_DIST_REGS :
410- case KVM_DEV_ARM_VGIC_GRP_CPU_REGS : {
411- u32 __user * uaddr = (u32 __user * )(long )attr -> addr ;
412- u32 reg ;
413-
414- if (get_user (reg , uaddr ))
415- return - EFAULT ;
416-
417- return vgic_v2_attr_regs_access (dev , attr , & reg , true);
418- }
419+ case KVM_DEV_ARM_VGIC_GRP_CPU_REGS :
420+ return vgic_v2_attr_regs_access (dev , attr , true);
419421 }
420422
421423 return - ENXIO ;
@@ -432,15 +434,8 @@ static int vgic_v2_get_attr(struct kvm_device *dev,
432434
433435 switch (attr -> group ) {
434436 case KVM_DEV_ARM_VGIC_GRP_DIST_REGS :
435- case KVM_DEV_ARM_VGIC_GRP_CPU_REGS : {
436- u32 __user * uaddr = (u32 __user * )(long )attr -> addr ;
437- u32 reg = 0 ;
438-
439- ret = vgic_v2_attr_regs_access (dev , attr , & reg , false);
440- if (ret )
441- return ret ;
442- return put_user (reg , uaddr );
443- }
437+ case KVM_DEV_ARM_VGIC_GRP_CPU_REGS :
438+ return vgic_v2_attr_regs_access (dev , attr , false);
444439 }
445440
446441 return - ENXIO ;
0 commit comments