问题描述
我正在研究需要PCIe直通(也称为virtio-passthrough)和Intel x86 cpu和KVM的项目。
有一种有趣的情况,来宾中经过的设备正在正确配置向量表中的所有条目。但是,如果从主机看,该表将被填充,但是所有向量“ Mask Interrupt”都将置位。请注意,功能寄存器会将值设置为“启用”,并将“掩码设置为0”。当Guest程序MSI-X控制寄存器注册时,就会发生这种情况。
有趣的是,PBA位也与Guest看到的同步。向量表中只有MSI-X向量控制设置为“ 1”。
Target offset is 0x0,page size is 4096
mmap(0,4096,0x3,0x1,3,0x0)
PCI Memory mapped to address 0x7f5f2d957000.
0x0000: 0x00000000
...
0x000C: 0x00000001
0x0010: 0x00000000
...
0x001C: 0x00000001
0x0020: 0x00000000
PBA:
Target offset is 0x1000,0x1000)
PCI Memory mapped to address 0x7fc7e890d000.
0x1000: 0x00000003
0x1004: 0x00000000
0x1008: 0xFFFFFFFF
PS:使用pcimem实用程序执行MMIO读取。
在上述情况下,来宾看到的设备配置了MSI-X,执行了DMA并最终超时,以等待请求完成(PCIe跟踪显示它正在等待中断)。
我的论文是MSI-X中断没有路由到Guest(当然是通过IOMMU),因为中断被屏蔽了。但是,从客户角度来看,可以自由执行DMA。而且第一个请求失败。
我需要帮助调试此问题。
我正在浏览[vfio_pci](https://elixir.bootlin.com/linux/v5.4.61/source/drivers/vfio/pci)代码,希望找到MSI-X地址映射将在哪里完成。特别是,尝试调试主机(KVM)如何知道对该表进行编程的时间,以便找到合适的地址。
任何指向方向的指针都会有很大帮助!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)