I'm using qemu to do PCIe passthrough. The card shows up in my Windows VM and I'm loading the same driver I load when running Windows natively. I can see my device gets the MSI-X interrupt resources in Device Manager. I can step through my code to register a service routine with each interrupt as I expect. However, when an IRQ is generated my ISR doesn't get called. I'm rather stumped. I suspect there's something magic I can tell qemu to get this to work, but I'm to the point of looking for things to try/consider.
I have exactly no suggestions to offer, BUT I can tell you that I did a large, complex, project for a multi-function FPGA device using QEMU running a Windows VM, hosted on Linux (RHEL, IIRC). We had one function of the FPGA device passed-through to Windows. The device uses multiple MSI-X interrupts, and they worked.
I was, quite frankly, shocked at how well this worked. For the most part, it was exactly like developing and debugging on bare metal running Windows (modulo some issues with WinDbg, but… that’s another story).
I don’t know if that’s helpful to you or not, but… it’s all I’ve got to offer ![]()
Thanks Peter. Probably a stretch, but any recollection what you were doing to pass that one function through? I’ve tried doing the point and click with the virt-manager and just about any variation of options to qemu command line.
I'm sorry, Shane. We did the project a couple of years ago... and I looked EVERYwhere... and I can't find the config instructions. Which is frankly kind of scary. I'm sooo no Linux expert, and I know even less about qemu, so, given I didn't find any detailed step-by-step instructions I'm pretty sure we didn't do anything "tricky" to accomplish the pass-though. ISTR just doing the point-and-click as you described.
While not addressing your problem, I will point you to some notes I made at the time regardng WinDbg. -- These issues MIGHT have been fixed by now, but just in case it's useful.
Thanks for looking. Surprisingly windbg has “just worked” so far.