Skip to content

Commit

Permalink
arm/arm64: KVM: refactor/wrap vgic_set/get_attr()
Browse files Browse the repository at this point in the history
vgic_set_attr() and vgic_get_attr() contain both code specific for
the emulated GIC as well as code for the userland facing, generic
part of the GIC.
Split the guest GIC facing code of from the generic part to allow
easier splitting later.

Signed-off-by: Andre Przywara <[email protected]>
Reviewed-by: Christoffer Dall <[email protected]>
Signed-off-by: Christoffer Dall <[email protected]>
  • Loading branch information
Andre-ARM authored and chazy committed Jan 20, 2015
1 parent d97f683 commit b60da14
Showing 1 changed file with 54 additions and 24 deletions.
78 changes: 54 additions & 24 deletions virt/kvm/arm/vgic.c
Original file line number Diff line number Diff line change
Expand Up @@ -2440,7 +2440,8 @@ static int vgic_attr_regs_access(struct kvm_device *dev,
return ret;
}

static int vgic_set_attr(struct kvm_device *dev, struct kvm_device_attr *attr)
static int vgic_set_common_attr(struct kvm_device *dev,
struct kvm_device_attr *attr)
{
int r;

Expand All @@ -2456,17 +2457,6 @@ static int vgic_set_attr(struct kvm_device *dev, struct kvm_device_attr *attr)
r = kvm_vgic_addr(dev->kvm, type, &addr, true);
return (r == -ENODEV) ? -ENXIO : r;
}

case KVM_DEV_ARM_VGIC_GRP_DIST_REGS:
case KVM_DEV_ARM_VGIC_GRP_CPU_REGS: {
u32 __user *uaddr = (u32 __user *)(long)attr->addr;
u32 reg;

if (get_user(reg, uaddr))
return -EFAULT;

return vgic_attr_regs_access(dev, attr, &reg, true);
}
case KVM_DEV_ARM_VGIC_GRP_NR_IRQS: {
u32 __user *uaddr = (u32 __user *)(long)attr->addr;
u32 val;
Expand Down Expand Up @@ -2510,7 +2500,33 @@ static int vgic_set_attr(struct kvm_device *dev, struct kvm_device_attr *attr)
return -ENXIO;
}

static int vgic_get_attr(struct kvm_device *dev, struct kvm_device_attr *attr)
static int vgic_set_attr(struct kvm_device *dev, struct kvm_device_attr *attr)
{
int ret;

ret = vgic_set_common_attr(dev, attr);
if (ret != -ENXIO)
return ret;

switch (attr->group) {
case KVM_DEV_ARM_VGIC_GRP_DIST_REGS:
case KVM_DEV_ARM_VGIC_GRP_CPU_REGS: {
u32 __user *uaddr = (u32 __user *)(long)attr->addr;
u32 reg;

if (get_user(reg, uaddr))
return -EFAULT;

return vgic_attr_regs_access(dev, attr, &reg, true);
}

}

return -ENXIO;
}

static int vgic_get_common_attr(struct kvm_device *dev,
struct kvm_device_attr *attr)
{
int r = -ENXIO;

Expand All @@ -2528,27 +2544,41 @@ static int vgic_get_attr(struct kvm_device *dev, struct kvm_device_attr *attr)
return -EFAULT;
break;
}
case KVM_DEV_ARM_VGIC_GRP_NR_IRQS: {
u32 __user *uaddr = (u32 __user *)(long)attr->addr;

r = put_user(dev->kvm->arch.vgic.nr_irqs, uaddr);
break;
}

}

return r;
}

static int vgic_get_attr(struct kvm_device *dev, struct kvm_device_attr *attr)
{
int ret;

ret = vgic_get_common_attr(dev, attr);
if (ret != -ENXIO)
return ret;

switch (attr->group) {
case KVM_DEV_ARM_VGIC_GRP_DIST_REGS:
case KVM_DEV_ARM_VGIC_GRP_CPU_REGS: {
u32 __user *uaddr = (u32 __user *)(long)attr->addr;
u32 reg = 0;

r = vgic_attr_regs_access(dev, attr, &reg, false);
if (r)
return r;
r = put_user(reg, uaddr);
break;
}
case KVM_DEV_ARM_VGIC_GRP_NR_IRQS: {
u32 __user *uaddr = (u32 __user *)(long)attr->addr;
r = put_user(dev->kvm->arch.vgic.nr_irqs, uaddr);
break;
ret = vgic_attr_regs_access(dev, attr, &reg, false);
if (ret)
return ret;
return put_user(reg, uaddr);
}

}

return r;
return -ENXIO;
}

static int vgic_has_attr_regs(const struct mmio_range *ranges,
Expand Down

0 comments on commit b60da14

Please sign in to comment.