VFIO PCIe BAR写入不起作用,程序执行完成时寄存器值福尔斯

h5qlskok  于 2023-03-17  发布在  其他
关注(0)|答案(1)|浏览(151)

我使用以下代码测试通过VFIO_PCI API写入PCIe BAR寄存器。

`   struct vfio_group_status group_status = { .argsz = sizeof(group_status) };
    struct vfio_device_info device_info = { .argsz = sizeof(device_info) };
    struct vfio_region_info reg = { .argsz = sizeof(reg) };
    int container = open("/dev/vfio/vfio", O_RDWR);
    int group = open("/dev/vfio/17", O_RDWR);

    /* Add the group to the container */
    ioctl(group, VFIO_GROUP_SET_CONTAINER, &container);
    /* Enable the IOMMU model we want */
    ioctl(container, VFIO_SET_IOMMU, VFIO_TYPE1_IOMMU);

    int dev = ioctl(group, VFIO_GROUP_GET_DEVICE_FD, "0000:02:00.0");

    void* ptr;
    ptr = mmap(0, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, dev, ( 0UL << 40));
    cout << *((unsigned int *)ptr + 0x202) << endl; //this always print out 0
    *((unsigned int *)ptr + 0x202) = 4; //write 4
    cout << *((unsigned int *)ptr + 0x202) << endl;` //this always print out 4

但是,只有当程序还在运行时,写操作才会生效。在程序执行完成后,值总是福尔斯。
我已经验证了这不是因为缓存,因为我可以在程序仍在运行时看到FPGA中的寄存器值变化。
我的问题是:我能做些什么来使我写持久化?

bejyjqdl

bejyjqdl1#

对于任何一个谁可能encouter与此在未来。
我找到了this related post。显然,这是预期行为:如果VFIO-PCI被用来控制一个PCIe设备。“vfio_pci_try_bus_reset”将在一个进程结束时被调用。导致设备被重置。正如在帖子中提到的,如果一个模块参数可以被添加来绕过重置,那就太好了。但是到目前为止,这个参数似乎还没有出现。

相关问题