【问题标题】:Handling PCI read/write to configuration space in a QEMU device处理 QEMU 设备中配置空间的 PCI 读/写
【发布时间】:2019-05-04 11:28:25
【问题描述】:

我正致力于在 QEMU 中实现一个简单的 PCI 设备及其内核驱动程序,但在处理来自设备端的 pci_read/write_config_* 函数调用时遇到了一些麻烦。

与内存映射条上的简单 rw 操作不同,其中 MemoryRegionOps 回调接收驱动程序使用的确切偏移量,作为 PCIDevice 结构中的成员实现的 config_read/write 回调接收经过我的一些操作/映射的地址很难理解。

在 QEMU 源代码中遵循直到 pci_config_host_read/write 的代码路径,以及在内核端的 pci_read/write_config_* 函数相同,都没有提供任何明确的答案。

谁能帮我理解在调用 pci config rw 函数时如何提取驱动程序使用的配置偏移量?

【问题讨论】:

  • 为什么要知道驱动使用的地址?您所需要的只是设备配置空间的 12 位偏移量。
  • 我想我的问题不清楚。我说的是 pci config rw 函数使用的地址参数,据我了解,它是 12 位偏移量。

标签: c linux-kernel qemu pci


【解决方案1】:

如果您将 PCI 设备模型设置为实现 QEMU PCIDevice config_read 和 config_write 方法,则传递给它们的地址应该是 PCI 配置空间的偏移量(即从标准 0 == PCI_VENDOR_ID 开始,2 == PCI_DEVICE_ID , 4 == PCI_COMMAND 等等,以及 64 字节标准化配置空间之后的任何特定于设备的内容)。

【讨论】:

  • 我可以从 config_read 和 config_write 的打印输出中看到,当驱动程序被探测/删除时,这些标准单词就是这种情况,但由于某种原因,当我尝试写入自定义地址时,如:pci_write_config_dword(pdev, 0xFF0, data) 可以看到 rw 回调被调用了 3 次,顺序为:write->read->write,地址值分别为:4、13、13。对于其他地址,甚至不会调用回调。我想我错过了关于 QEMU 如何处理 PCI 设备的一些基本知识,或者甚至可能是 PCI 的一般工作原理。
  • 0xff0 超出了 256 字节的普通 PCI 配置空间——您的设备型号是否确实将自己正确地宣传为具有这么多配置空间的 PCI-E 设备?您是否仍然看到前 256 个字节内的访问有奇怪的行为?
  • 实际上是的,我正在尝试模拟 PCI-E 设备。我不确定我是否正确地宣传了这个设备,但我确实将 TypeInfo 的“接口”成员设置为 INTERFACE_PCIE_DEVICE,我不知道这是否足够。
猜你喜欢
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-31
  • 1970-01-01
相关资源
最近更新 更多