module_init(vfio_iommu_type1_init); static int __init vfio_iommu_type1_init(void) { return vfio_register_iommu_driver(&vfio_iommu_driver_ops_type1); } 2 vfio_iommu_driver_ops_type1 static const struct vfio_iommu_driver_ops vfio_iommu_driver_ops_type1 = { .name = "vfio-iommu-type...
vfio_iommu层面详解(vfio_iommu_type1.ko) 以下为container设置其vfio_iommu为type1时的实现,通过这段code可见核心实现最终会调到vfio_iommu_type1驱动中的vfio_iommu_type1_open( )和vfio_iommu_type1_attach_group( ) //举例ioctl(container, VFIO_SET_IOMMU, VFIO_TYPE1_IOMMU) vfio_ioctl_set_iommu //注...
case VFIO_TYPE1_NESTING_IOMMU: case __VFIO_RESERVED_TYPE1_NESTING_IOMMU: return 0; /* 12 changes: 1 addition & 11 deletions 12 drivers/vfio/vfio_iommu_type1.c Original file line numberDiff line numberDiff line change @@ -72,7 +72,6 @@ struct vfio_iommu { uint64_t pgsize_bit...
1staticintvfio_dma_do_map(structvfio_iommu *iommu,2structvfio_iommu_type1_dma_map *map)3{4dma_addr_t iova = map->iova;5unsignedlongvaddr = map->vaddr;6size_t size = map->size;7intret =0, prot =0;8uint64_t mask;9structvfio_dma *dma;10...11if(vfio_find_dma(iommu, iova,...
VFIO框架中很重要的一部分是要完成DMA Remapping,即为Domain创建对应的IOMMU页表,这个部分是由vfio_iommu_driver来完成的。 vfio_container包含一个指针记录vfio_iommu_driver的信息,在x86上vfio_iommu_driver的具体实现是由vfio_iommu_type1来完成的。 其中包含了vfio_iommu, vfio_domain, vfio_group, vfio_dma等关...
vfio会用到vfio-pci和vfio_iommu_type1_driver两个驱动。其中vfio-pci用于访问PCI设备。通常使用VFIO时,主要是读取PCIe设备的配置空间和DMA信息。Group Group是IOMMU进行DMA隔离的最小单元。如果两个设备会找到同一个context entry和同一份页表,就属于同一个group,比如在PCIe-PCI桥下就属于同一个group...
vifo_iommu 是对IOMMU driver 的封装,为vifo interface 提供IOMMU 功能,在内核源码中代码路径为:drivers\vfio\vfio_iommu_type1.c。iommu driver 是物理硬件的IOMMU 实现,例如intel VT-D。vfio_pci 是的device 驱动的封装,为vfio interface 提供设备的访问能力,例如访问设备的配置空间,bar空间。在内核源码中代码...
1.创建新的container,并检查版本(保证兼容性),以及支持的iommu驱动类型 int container container = open("/dev/vfio/vfio", O_RDWR); if (ioctl(container, VFIO_GET_API_VERSION) != VFIO_API_VERSION) /* Unknown API version */ if (!ioctl(container, VFIO_CHECK_EXTENSION, VFIO_TYPE1_IOMMU)) ...
登录后复制vfio_realize:group= vfio_get_group(groupid, pci_device_iommu_address_space(pdev), errp); vfio_connect_container(group,as, errp) ret = ioctl(fd, VFIO_SET_IOMMU, container- >iommu_type); container- >listener = vfio_memory_listener; ...
创建新的container,并检查版本(保证兼容性),以及支持的iommu驱动类型 intcontainer container=open("/dev/vfio/vfio",O_RDWR);if(ioctl(container,VFIO_GET_API_VERSION)!=VFIO_API_VERSION)/* Unknown API version */if(!ioctl(container,VFIO_CHECK_EXTENSION,VFIO_TYPE1_IOMMU))/* Doesn't support the IOMM...