@@ -348,17 +348,18 @@ bool lock_all_vcpus(struct kvm *kvm)
348
348
*
349
349
* @dev: kvm device handle
350
350
* @attr: kvm device attribute
351
- * @reg: address the value is read or written
352
351
* @is_write: true if userspace is writing a register
353
352
*/
354
353
static int vgic_v2_attr_regs_access (struct kvm_device * dev ,
355
354
struct kvm_device_attr * attr ,
356
- u32 * reg , bool is_write )
355
+ bool is_write )
357
356
{
357
+ u32 __user * uaddr = (u32 __user * )(unsigned long )attr -> addr ;
358
358
struct vgic_reg_attr reg_attr ;
359
359
gpa_t addr ;
360
360
struct kvm_vcpu * vcpu ;
361
361
int ret ;
362
+ u32 val ;
362
363
363
364
ret = vgic_v2_parse_attr (dev , attr , & reg_attr );
364
365
if (ret )
@@ -367,6 +368,10 @@ static int vgic_v2_attr_regs_access(struct kvm_device *dev,
367
368
vcpu = reg_attr .vcpu ;
368
369
addr = reg_attr .addr ;
369
370
371
+ if (is_write )
372
+ if (get_user (val , uaddr ))
373
+ return - EFAULT ;
374
+
370
375
mutex_lock (& dev -> kvm -> lock );
371
376
372
377
ret = vgic_init (dev -> kvm );
@@ -380,10 +385,10 @@ static int vgic_v2_attr_regs_access(struct kvm_device *dev,
380
385
381
386
switch (attr -> group ) {
382
387
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 );
384
389
break ;
385
390
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 );
387
392
break ;
388
393
default :
389
394
ret = - EINVAL ;
@@ -393,6 +398,10 @@ static int vgic_v2_attr_regs_access(struct kvm_device *dev,
393
398
unlock_all_vcpus (dev -> kvm );
394
399
out :
395
400
mutex_unlock (& dev -> kvm -> lock );
401
+
402
+ if (!ret && !is_write )
403
+ ret = put_user (val , uaddr );
404
+
396
405
return ret ;
397
406
}
398
407
@@ -407,15 +416,8 @@ static int vgic_v2_set_attr(struct kvm_device *dev,
407
416
408
417
switch (attr -> group ) {
409
418
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);
419
421
}
420
422
421
423
return - ENXIO ;
@@ -432,15 +434,8 @@ static int vgic_v2_get_attr(struct kvm_device *dev,
432
434
433
435
switch (attr -> group ) {
434
436
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);
444
439
}
445
440
446
441
return - ENXIO ;
0 commit comments