/* * VFIO test suite * * Copyright (C) 2012-2025, Red Hat Inc. * * This work is licensed under the terms of the GNU GPL, version 2. See * the COPYING file in the top-level directory. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "utils.h" void usage(char *name) { printf("usage: %s \n", name); } int main(int argc, char **argv) { const char *devname; int container, device; int i; int ret; struct vfio_device_info device_info = { .argsz = sizeof(device_info) }; struct vfio_region_info region_info = { .argsz = sizeof(region_info) }; if (argc < 2) { usage(argv[0]); return -1; } devname = argv[1]; if (vfio_device_attach(devname, &container, &device, NULL)) return -1; ret = ioctl(device, VFIO_DEVICE_GET_INFO, &device_info); if (ret) { printf("VFIO_DEVICE_GET_INFO failed: %d (%s)\n", ret, strerror(errno)); return -1; } printf("Device %s supports %d regions, %d irqs\n", devname, device_info.num_regions, device_info.num_irqs); for (i = 0; i < device_info.num_regions; i++) { printf("Region %d: ", i); region_info.index = i; if (ioctl(device, VFIO_DEVICE_GET_REGION_INFO, ®ion_info)) { printf("Failed to get info\n"); continue; } printf("size 0x%lx, offset 0x%lx, flags 0x%x\n", (unsigned long)region_info.size, (unsigned long)region_info.offset, region_info.flags); if (region_info.flags & VFIO_REGION_INFO_FLAG_MMAP) { void *map = mmap(NULL, (size_t)region_info.size, PROT_READ, MAP_SHARED, device, (off_t)region_info.offset); if (map == MAP_FAILED) { printf("mmap failed\n"); continue; } if (verbose) { printf("["); fwrite(map, 1, region_info.size > 16 ? 16 : region_info.size, stdout); printf("]\n"); } munmap(map, (size_t)region_info.size); } } printf("Success\n"); return 0; }