xref: /linux/tools/testing/selftests/kvm/lib/proc_util.c (revision 362cc00162499413d720fd1c9dfcf1fbba762e9b)
1*362cc001SDavid Matlack // SPDX-License-Identifier: GPL-2.0
2*362cc001SDavid Matlack #include "kvm_util.h"
3*362cc001SDavid Matlack #include "test_util.h"
4*362cc001SDavid Matlack #include "proc_util.h"
5*362cc001SDavid Matlack 
6*362cc001SDavid Matlack static FILE *open_proc_interrupts(void)
7*362cc001SDavid Matlack {
8*362cc001SDavid Matlack 	FILE *fp;
9*362cc001SDavid Matlack 
10*362cc001SDavid Matlack 	fp = fopen("/proc/interrupts", "r");
11*362cc001SDavid Matlack 	TEST_ASSERT(fp, "fopen(/proc/interrupts) failed");
12*362cc001SDavid Matlack 
13*362cc001SDavid Matlack 	return fp;
14*362cc001SDavid Matlack }
15*362cc001SDavid Matlack 
16*362cc001SDavid Matlack unsigned int vfio_msix_to_host_irq(const char *device_bdf, int msix)
17*362cc001SDavid Matlack {
18*362cc001SDavid Matlack 	char search_string[64];
19*362cc001SDavid Matlack 	char line[4096];
20*362cc001SDavid Matlack 	int irq = -1;
21*362cc001SDavid Matlack 	FILE *fp;
22*362cc001SDavid Matlack 
23*362cc001SDavid Matlack 	fp = open_proc_interrupts();
24*362cc001SDavid Matlack 
25*362cc001SDavid Matlack 	snprintf(search_string, sizeof(search_string), "vfio-msix[%d]", msix);
26*362cc001SDavid Matlack 
27*362cc001SDavid Matlack 	while (fgets(line, sizeof(line), fp)) {
28*362cc001SDavid Matlack 		if (strstr(line, device_bdf) && strstr(line, search_string)) {
29*362cc001SDavid Matlack 			TEST_ASSERT_EQ(1, sscanf(line, "%d:", &irq));
30*362cc001SDavid Matlack 			break;
31*362cc001SDavid Matlack 		}
32*362cc001SDavid Matlack 	}
33*362cc001SDavid Matlack 
34*362cc001SDavid Matlack 	fclose(fp);
35*362cc001SDavid Matlack 
36*362cc001SDavid Matlack 	TEST_ASSERT(irq != -1, "Failed to locate IRQ for %s %s", device_bdf,
37*362cc001SDavid Matlack 		    search_string);
38*362cc001SDavid Matlack 	return (unsigned int)irq;
39*362cc001SDavid Matlack }
40*362cc001SDavid Matlack 
41