Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9f199d0a authored by Andre Przywara's avatar Andre Przywara Committed by Marc Zyngier
Browse files

KVM: arm/arm64: simplify vgic_find_range() and callers



The vgic_find_range() function in vgic.c takes a struct kvm_exit_mmio
argument, but actually only used the length field in there. Since we
need to get rid of that structure in that part of the code anyway,
let's rework the function (and it's callers) to pass the length
argument to the function directly.

Signed-off-by: default avatarAndre Przywara <andre.przywara@arm.com>
Reviewed-by: default avatarChristoffer Dall <christoffer.dall@linaro.org>
Reviewed-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
Signed-off-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
parent cf50a1eb
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -715,7 +715,7 @@ static int vgic_attr_regs_access(struct kvm_device *dev,
	default:
		BUG();
	}
	r = vgic_find_range(ranges, &mmio, offset);
	r = vgic_find_range(ranges, 4, offset);

	if (unlikely(!r || !r->handle_mmio)) {
		ret = -ENXIO;
+8 −14
Original line number Diff line number Diff line
@@ -713,16 +713,13 @@ void vgic_unqueue_irqs(struct kvm_vcpu *vcpu)

const
struct vgic_io_range *vgic_find_range(const struct vgic_io_range *ranges,
				      struct kvm_exit_mmio *mmio,
				      phys_addr_t offset)
				      int len, gpa_t offset)
{
	const struct vgic_io_range *r = ranges;

	while (r->len) {
		if (offset >= r->base &&
		    (offset + mmio->len) <= (r->base + r->len))
			return r;
		r++;
	while (ranges->len) {
		if (offset >= ranges->base &&
		    (offset + len) <= (ranges->base + ranges->len))
			return ranges;
		ranges++;
	}

	return NULL;
@@ -813,7 +810,7 @@ bool vgic_handle_mmio_range(struct kvm_vcpu *vcpu, struct kvm_run *run,
	unsigned long offset;

	offset = mmio->phys_addr - mmio_base;
	range = vgic_find_range(ranges, mmio, offset);
	range = vgic_find_range(ranges, mmio->len, offset);
	if (unlikely(!range || !range->handle_mmio)) {
		pr_warn("Unhandled access %d %08llx %d\n",
			mmio->is_write, mmio->phys_addr, mmio->len);
@@ -1986,10 +1983,7 @@ int vgic_get_common_attr(struct kvm_device *dev, struct kvm_device_attr *attr)

int vgic_has_attr_regs(const struct vgic_io_range *ranges, phys_addr_t offset)
{
	struct kvm_exit_mmio dev_attr_mmio;

	dev_attr_mmio.len = 4;
	if (vgic_find_range(ranges, &dev_attr_mmio, offset))
	if (vgic_find_range(ranges, 4, offset))
		return 0;
	else
		return -ENXIO;
+1 −2
Original line number Diff line number Diff line
@@ -90,8 +90,7 @@ static inline bool is_in_range(phys_addr_t addr, unsigned long len,

const
struct vgic_io_range *vgic_find_range(const struct vgic_io_range *ranges,
				      struct kvm_exit_mmio *mmio,
				      phys_addr_t offset);
				      int len, gpa_t offset);

bool vgic_handle_mmio_range(struct kvm_vcpu *vcpu, struct kvm_run *run,
			    struct kvm_exit_mmio *mmio,