4)vfiodevice驱动分析 vifo_device 的创建函数为struct vfio_device *vfio_group_create_device(struct vfio_group *group,struct device *dev,const struct vfio_device_ops *ops,void *device_data)。 vifo_device 表示在VFIO 层面的设备,dev 为物理设备,ops为物理设备的操作回调,这里是vfio_pci_ops,group 表示...
ioctl(s->device, VFIO_DEVICE_SET_IRQS, irq_set); struct vfio_irq_set { __u32 argsz; __u32 flags; #define VFIO_IRQ_SET_DATA_NONE (1 << 0) /* Data not present */ #define VFIO_IRQ_SET_DATA_BOOL (1 << 1) /* Data is bool (u8) */ #define VFIO_IRQ_SET_DATA_EVENTFD (...
ioctl(device, VFIO_DEVICE_GET_IRQ_INFO, &irq); /* Setup IRQs... eventfds, VFIO_DEVICE_SET_IRQS */ } /* Gratuitous device reset and go... */ ioctl(device, VFIO_DEVICE_RESET); IOMMUFD 和 vfio_iommu_type1 IOMMUFD 是用于从用户空间管理 I/O 页表的新用户 API。它旨在成为提供高级用户...
The VFIO_DEVICE_SET_IRQS ioctl did not sufficiently sanitize user-supplied integers, potentially allowing memory corruption. This patch adds appropriate integer overflow checks, checks the range bounds for VFIO_IRQ_SET_DATA_NONE, and also verifies that only single element in the VFIO_IRQ_SET_DATA...
VFIO_GROUP_SET_CONTAINER:设置group和container 之间的绑定关系 VFIO_GROUP_GET_DEVICE_FD:获取device的文件描述符fd. 第三个层面的是device ,通过group 层面的ioctl的VFIO_GROUP_GET_DEVICE_FD 命令获取fd, 对获取的fd执行ioctl操作,主要的操作有: VFIO_DEVICE_GET_REGION_INFO:用来获得设备指定区域region的数据,...
-> VFIO_DEVICE_SET_IRQS irq_mask #由于中断电平触发,为设置重采样,先mask irq -> VFIO_DEVICE_SET_IRQS resample_virq_enable #Guest EOI重采样irqfd,通过resamplefd #将取消屏蔽从KVM发到VFIO -> VFIO_DEVICE_SET_IRQS #EOI(end of interrupt)信号 ...
构造irq_set,包含了设备的irq数量=1,irq类型(msix),irq的flags等。 * 然后ioctl(VFIO_DEVICE_SET_IRQS),在ioctl中: * 2. 为vdev分配irq数量的中断,并将这些中断类型确定为msix. * 3. 为传入的所有fd(eventfd)注册trigger函数(vfio_msihandler),以及注册producer. * vfio_msihandler的调用会toggle ...
通过以上步骤,虚机可以访问设备的config空间(模拟或直接访问物理设备),可以访问BAR空间(除MSI-X table外都可透传),中断(利用vfio VFIO_DEVICE_SET_IRQS、kvm协同实现)。 参考资料
eventfds, VFIO_DEVICE_SET_IRQS */ } /* Gratuitous device reset and go... */ ioctl(device, VFIO_DEVICE_RESET); struct vfio_device_bind_iommufd bind = { .argsz = sizeof(bind), .flags = 0, }; struct iommu_ioas_alloc alloc_data = { .size = sizeof(alloc_data), ...
使用VFIO_GROUP_GET_DEVICE_FD得到表示设备的文件描述 (参数为设备名称,一个典型的PCI设备名形如0000:03.00.01) 对设备进行read/write/mmap等操作 用VFIO配置IOMMU的步骤: 打开/dev/vfio,得到container文件描述符 用VFIO_SET_IOMMU绑定一种IOMMU实现层