Skip to content

Commit 7e9f723

Browse files
author
Marc Zyngier
committed
KVM: arm64: vgic-v2: Consolidate userspace access for MMIO registers
Align the GICv2 MMIO accesses from userspace with the way the GICv3 code is now structured. Reviewed-by: Reiji Watanabe <[email protected]> Signed-off-by: Marc Zyngier <[email protected]>
1 parent e1246f3 commit 7e9f723

File tree

1 file changed

+17
-22
lines changed

1 file changed

+17
-22
lines changed

arch/arm64/kvm/vgic/vgic-kvm-device.c

Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -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
*/
354353
static 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);
394399
out:
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

Comments
 (0)