Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

arm/arm64: KVM: refactor/wrap vgic_set/get_attr()

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 <andre.przywara@arm.com>
Reviewed-by: Christoffer Dall <christoffer.dall@linaro.org>
Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org>

authored by

Andre Przywara and committed by
Christoffer Dall
b60da146 d97f683d

+55 -25
+55 -25
virt/kvm/arm/vgic.c
··· 2440 2440 return ret; 2441 2441 } 2442 2442 2443 - static int vgic_set_attr(struct kvm_device *dev, struct kvm_device_attr *attr) 2443 + static int vgic_set_common_attr(struct kvm_device *dev, 2444 + struct kvm_device_attr *attr) 2444 2445 { 2445 2446 int r; 2446 2447 ··· 2456 2455 2457 2456 r = kvm_vgic_addr(dev->kvm, type, &addr, true); 2458 2457 return (r == -ENODEV) ? -ENXIO : r; 2459 - } 2460 - 2461 - case KVM_DEV_ARM_VGIC_GRP_DIST_REGS: 2462 - case KVM_DEV_ARM_VGIC_GRP_CPU_REGS: { 2463 - u32 __user *uaddr = (u32 __user *)(long)attr->addr; 2464 - u32 reg; 2465 - 2466 - if (get_user(reg, uaddr)) 2467 - return -EFAULT; 2468 - 2469 - return vgic_attr_regs_access(dev, attr, &reg, true); 2470 2458 } 2471 2459 case KVM_DEV_ARM_VGIC_GRP_NR_IRQS: { 2472 2460 u32 __user *uaddr = (u32 __user *)(long)attr->addr; ··· 2500 2510 return -ENXIO; 2501 2511 } 2502 2512 2503 - static int vgic_get_attr(struct kvm_device *dev, struct kvm_device_attr *attr) 2513 + static int vgic_set_attr(struct kvm_device *dev, struct kvm_device_attr *attr) 2514 + { 2515 + int ret; 2516 + 2517 + ret = vgic_set_common_attr(dev, attr); 2518 + if (ret != -ENXIO) 2519 + return ret; 2520 + 2521 + switch (attr->group) { 2522 + case KVM_DEV_ARM_VGIC_GRP_DIST_REGS: 2523 + case KVM_DEV_ARM_VGIC_GRP_CPU_REGS: { 2524 + u32 __user *uaddr = (u32 __user *)(long)attr->addr; 2525 + u32 reg; 2526 + 2527 + if (get_user(reg, uaddr)) 2528 + return -EFAULT; 2529 + 2530 + return vgic_attr_regs_access(dev, attr, &reg, true); 2531 + } 2532 + 2533 + } 2534 + 2535 + return -ENXIO; 2536 + } 2537 + 2538 + static int vgic_get_common_attr(struct kvm_device *dev, 2539 + struct kvm_device_attr *attr) 2504 2540 { 2505 2541 int r = -ENXIO; 2506 2542 ··· 2544 2528 return -EFAULT; 2545 2529 break; 2546 2530 } 2547 - 2548 - case KVM_DEV_ARM_VGIC_GRP_DIST_REGS: 2549 - case KVM_DEV_ARM_VGIC_GRP_CPU_REGS: { 2550 - u32 __user *uaddr = (u32 __user *)(long)attr->addr; 2551 - u32 reg = 0; 2552 - 2553 - r = vgic_attr_regs_access(dev, attr, &reg, false); 2554 - if (r) 2555 - return r; 2556 - r = put_user(reg, uaddr); 2557 - break; 2558 - } 2559 2531 case KVM_DEV_ARM_VGIC_GRP_NR_IRQS: { 2560 2532 u32 __user *uaddr = (u32 __user *)(long)attr->addr; 2533 + 2561 2534 r = put_user(dev->kvm->arch.vgic.nr_irqs, uaddr); 2562 2535 break; 2563 2536 } ··· 2554 2549 } 2555 2550 2556 2551 return r; 2552 + } 2553 + 2554 + static int vgic_get_attr(struct kvm_device *dev, struct kvm_device_attr *attr) 2555 + { 2556 + int ret; 2557 + 2558 + ret = vgic_get_common_attr(dev, attr); 2559 + if (ret != -ENXIO) 2560 + return ret; 2561 + 2562 + switch (attr->group) { 2563 + case KVM_DEV_ARM_VGIC_GRP_DIST_REGS: 2564 + case KVM_DEV_ARM_VGIC_GRP_CPU_REGS: { 2565 + u32 __user *uaddr = (u32 __user *)(long)attr->addr; 2566 + u32 reg = 0; 2567 + 2568 + ret = vgic_attr_regs_access(dev, attr, &reg, false); 2569 + if (ret) 2570 + return ret; 2571 + return put_user(reg, uaddr); 2572 + } 2573 + 2574 + } 2575 + 2576 + return -ENXIO; 2557 2577 } 2558 2578 2559 2579 static int vgic_has_attr_regs(const struct mmio_range *ranges,