这样的话该PCI桥及桥下所有设备都会使用PCIe switch的Source Identifier去定位Context Entry,找到的页表也是同一个,如果将这个PCI桥下的不同设备分给不同虚机,由于会使用同一份页表,这样会产生问题,针对这种情况,当前PCI桥及桥下的所有设备必须分配给同一个虚机,这就是VFIO中组的概念,下面会再讲到。
当Guest的bios-kernel通过写入vfio-device的配置空间,来配置msi、msi-x时(也就是向msi/msi-x的capability structure中写入msi/msi-x enable bit),就会调用提前注册好的处理函数,即vfio_pci_write_config。void vfio_pci_write_config(PCIDevice *pdev, uint32_t addr, uint32_t val, int len) ...
vfio_realize:/* Get a copy of config space */ret= pread(vdev- >vbasedev.fd, vdev- >pdev.config,MIN(pci_config_size(&vdev- >pdev), vdev- >config_size), vdev- >config_offset);if(ret< (int)MIN(pci_config_size(&vdev- >pdev), vdev- >config_size)) {ret=ret< 0 ? -e...
登录后复制vfio_realize:/* Get a copy of config space */ret= pread(vdev- >vbasedev.fd, vdev- >pdev.config,MIN(pci_config_size(&vdev- >pdev), vdev- >config_size), vdev- >config_offset);if(ret< (int)MIN(pci_config_size(&vdev- >pdev), vdev- >config_size)) {ret=ret<...
pdc->config_write =vfio_pci_write_config; } 4 vfio_pci_reset vfio_pci_reset ->vdev->resetfn(vdev) //用户自定义reset函数 ->ioctl(vdev->vbasedev.fd, VFIO_DEVICE_RESET) //has_flr || !vdev->has_pm_reset ->vfio_pci_hot_reset_one(vdev)//See if we can do our own bus reset...
/* Setup mappings... read/write offsets, mmaps * For PCI devices, config space is a region */ } 首先分析ioctl(device, VFIO_DEVICE_GET_REGION_INFO, ),经device fd对应的struct file_operations vfio_device_fops{.ioctl} ==> struct vfio_device{vfio_device_ops{.ioctl}} : ...
当虚机访问透传设备的config空间时,触发vm_exit,然后qemu会调用被访问设备的vfio_pci_read_config或vfio_pci_write_config操作。对于读操作,会查看当前读取的config空间是否被qemu模拟,如果模拟,则直接读取qemu中保存的config值,否则调用vfio提供的read接口进行读取。对于写操作,会直接调用vfio提供的write接口,对于不可写...
vfio_pci 是的device 驱动的封装,为vfio interface 提供设备的访问能力,例如访问设备的配置空间,bar空间。在内核源码中代码路径为:drivers\vfio \pci\ vfio_pci.c 。pci_bus driver 是物理PCI 设备的驱动。VFIO的中断重映射相关的部分需要有kvm 相关的代码分析,本文没有分析。
(pdev, vfio_pci_set_decode(pdev, false)) vfio_pci_probe_power_state pci_read_config_word(pdev, pdev->pm_cap + PCI_PM_CTRL, &pmcsr) vfio_pci_set_power_state pm_runtime_allow vfio_register_group_dev -> vfio:简化中介设备的 iommu 组分配,重用 vfio_noiommu_group_alloc 中的逻辑,...
目的。VFIO驱动程序框架旨在替换KVM PCI特定设备分配代码,并提供比UIO更安全、功能更强大的用户空间驱动程序环境,通过VFIO向用户态开放IOMMU的功能,编写用户态的驱动。 应用。如OVMF支持将GPU透传给qemu虚拟机 依赖。CONFIG_VFIO,CONFIG_VFIO_IOMMU_TYPE1,CONFIG_VFIO_PLATFORM ...