Skip to content

Commit 88209c1

Browse files
Ricardo KollerMarc Zyngier
authored andcommitted
KVM: selftests: Add IRQ GSI routing library functions
Add an architecture independent wrapper function for creating and writing IRQ GSI routing tables. Also add a function to add irqchip entries. Signed-off-by: Ricardo Koller <[email protected]> Acked-by: Andrew Jones <[email protected]> Signed-off-by: Marc Zyngier <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent 90f50ac commit 88209c1

File tree

2 files changed

+59
-0
lines changed

2 files changed

+59
-0
lines changed

tools/testing/selftests/kvm/include/kvm_util.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,14 @@ int _vcpu_access_device_attr(struct kvm_vm *vm, uint32_t vcpuid, uint32_t group,
252252
int vcpu_access_device_attr(struct kvm_vm *vm, uint32_t vcpuid, uint32_t group,
253253
uint64_t attr, void *val, bool write);
254254

255+
#define KVM_MAX_IRQ_ROUTES 4096
256+
257+
struct kvm_irq_routing *kvm_gsi_routing_create(void);
258+
void kvm_gsi_routing_irqchip_add(struct kvm_irq_routing *routing,
259+
uint32_t gsi, uint32_t pin);
260+
int _kvm_gsi_routing_write(struct kvm_vm *vm, struct kvm_irq_routing *routing);
261+
void kvm_gsi_routing_write(struct kvm_vm *vm, struct kvm_irq_routing *routing);
262+
255263
const char *exit_reason_str(unsigned int exit_reason);
256264

257265
void virt_pgd_alloc(struct kvm_vm *vm);

tools/testing/selftests/kvm/lib/kvm_util.c

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2107,6 +2107,57 @@ void kvm_irq_line(struct kvm_vm *vm, uint32_t irq, int level)
21072107
TEST_ASSERT(ret >= 0, "KVM_IRQ_LINE failed, rc: %i errno: %i", ret, errno);
21082108
}
21092109

2110+
struct kvm_irq_routing *kvm_gsi_routing_create(void)
2111+
{
2112+
struct kvm_irq_routing *routing;
2113+
size_t size;
2114+
2115+
size = sizeof(struct kvm_irq_routing);
2116+
/* Allocate space for the max number of entries: this wastes 196 KBs. */
2117+
size += KVM_MAX_IRQ_ROUTES * sizeof(struct kvm_irq_routing_entry);
2118+
routing = calloc(1, size);
2119+
assert(routing);
2120+
2121+
return routing;
2122+
}
2123+
2124+
void kvm_gsi_routing_irqchip_add(struct kvm_irq_routing *routing,
2125+
uint32_t gsi, uint32_t pin)
2126+
{
2127+
int i;
2128+
2129+
assert(routing);
2130+
assert(routing->nr < KVM_MAX_IRQ_ROUTES);
2131+
2132+
i = routing->nr;
2133+
routing->entries[i].gsi = gsi;
2134+
routing->entries[i].type = KVM_IRQ_ROUTING_IRQCHIP;
2135+
routing->entries[i].flags = 0;
2136+
routing->entries[i].u.irqchip.irqchip = 0;
2137+
routing->entries[i].u.irqchip.pin = pin;
2138+
routing->nr++;
2139+
}
2140+
2141+
int _kvm_gsi_routing_write(struct kvm_vm *vm, struct kvm_irq_routing *routing)
2142+
{
2143+
int ret;
2144+
2145+
assert(routing);
2146+
ret = ioctl(vm_get_fd(vm), KVM_SET_GSI_ROUTING, routing);
2147+
free(routing);
2148+
2149+
return ret;
2150+
}
2151+
2152+
void kvm_gsi_routing_write(struct kvm_vm *vm, struct kvm_irq_routing *routing)
2153+
{
2154+
int ret;
2155+
2156+
ret = _kvm_gsi_routing_write(vm, routing);
2157+
TEST_ASSERT(ret == 0, "KVM_SET_GSI_ROUTING failed, rc: %i errno: %i",
2158+
ret, errno);
2159+
}
2160+
21102161
/*
21112162
* VM Dump
21122163
*

0 commit comments

Comments
 (0)