diff options
author | John Levon <john.levon@nutanix.com> | 2021-01-07 19:55:44 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-01-07 19:55:44 +0000 |
commit | 6ec31642f6253f5c19187c1ffb396d5921138b67 (patch) | |
tree | 9dd88104b0d56e63a83a48efbec6887cafc26730 /test | |
parent | 70524c550322948765415d9b0eb29ac766e32e79 (diff) | |
download | libvfio-user-6ec31642f6253f5c19187c1ffb396d5921138b67.zip libvfio-user-6ec31642f6253f5c19187c1ffb396d5921138b67.tar.gz libvfio-user-6ec31642f6253f5c19187c1ffb396d5921138b67.tar.bz2 |
re-work access handling (#220)
Various cleanups and fixes to handling of region accesses, including:
- there should be no reason for us to split accesses into 1/2/4/8 byte accesses:
in general, the client will have already be doing that, and if not, there's no
particular reason we should be the ones to split up such larger accesses.
- use a callback for PCI config space reads and writes if one is provided (needs
more work for capabilities)
Signed-off-by: John Levon <john.levon@nutanix.com>
Reviewed-by: Swapnil Ingle <swapnil.ingle@nutanix.com>
Reviewed-by: Thanos Makatos <thanos.makatos@nutanix.com>
Diffstat (limited to 'test')
-rw-r--r-- | test/unit-tests.c | 44 |
1 files changed, 28 insertions, 16 deletions
diff --git a/test/unit-tests.c b/test/unit-tests.c index 6fb89a4..30cc71c 100644 --- a/test/unit-tests.c +++ b/test/unit-tests.c @@ -471,24 +471,25 @@ test_get_region_info(UNUSED void **state) dev_get_reginfo(&vfu_ctx, index, argsz, &vfio_reg, &fds, &nr_fds)); assert_int_equal(sizeof(struct vfio_region_info), vfio_reg->argsz); - assert_int_equal(VFU_REGION_FLAG_RW, vfio_reg->flags); + assert_int_equal(VFIO_REGION_INFO_FLAG_READ | VFIO_REGION_INFO_FLAG_WRITE | + VFIO_REGION_INFO_FLAG_MMAP, vfio_reg->flags); assert_int_equal(1, vfio_reg->index); - assert_int_equal(0x10000000000, region_to_offset(vfio_reg->index)); + assert_int_equal(0x10000000000, vfio_reg->offset); assert_int_equal(0xdeadbeef, vfio_reg->size); assert_int_equal(0, nr_fds); /* regions caps (sparse mmap) but argsz too small */ - mmap_areas->nr_mmap_areas = 1; + mmap_areas->nr_mmap_areas = 1; mmap_areas->areas[0].iov_base = (void*)0x8badf00d; mmap_areas->areas[0].iov_len = 0x0d15ea5e; vfu_ctx.reg_info[1].mmap_areas = mmap_areas; - vfu_ctx.reg_info[1].flags |= VFIO_REGION_INFO_FLAG_MMAP; assert_int_equal(0, dev_get_reginfo(&vfu_ctx, index, argsz, &vfio_reg, &fds, &nr_fds)); assert_int_equal(argsz + sizeof(struct vfio_region_info_cap_sparse_mmap) + sizeof(struct vfio_region_sparse_mmap_area), vfio_reg->argsz); - assert_int_equal(VFU_REGION_FLAG_RW | VFIO_REGION_INFO_FLAG_MMAP | VFIO_REGION_INFO_FLAG_CAPS, + assert_int_equal(VFIO_REGION_INFO_FLAG_READ | VFIO_REGION_INFO_FLAG_WRITE | + VFIO_REGION_INFO_FLAG_MMAP | VFIO_REGION_INFO_FLAG_CAPS, vfio_reg->flags); assert_int_equal(0, nr_fds); @@ -668,25 +669,36 @@ test_setup_sparse_region(void **state __attribute__((unused))) .iov_len = 0x1000 } }; + int ret; - /* bad fd */ - assert_int_equal(-1, - vfu_setup_region(&vfu_ctx, VFU_PCI_DEV_BAR0_REGION_IDX, - 0x2000, NULL, 0, mmap_areas, 2, -1)); - assert_int_equal(EBADF, errno); + /* invalid mappable settings */ + ret = vfu_setup_region(&vfu_ctx, VFU_PCI_DEV_BAR0_REGION_IDX, + 0x2000, NULL, 0, mmap_areas, 2, -1); + assert_int_equal(-1, ret); + assert_int_equal(EINVAL, errno); + + ret = vfu_setup_region(&vfu_ctx, VFU_PCI_DEV_BAR0_REGION_IDX, + 0x2000, NULL, 0, NULL, 0, 1); + assert_int_equal(-1, ret); + assert_int_equal(EINVAL, errno); + + ret = vfu_setup_region(&vfu_ctx, VFU_PCI_DEV_BAR0_REGION_IDX, + 0x2000, NULL, 0, mmap_areas, 0, 1); + assert_int_equal(-1, ret); + assert_int_equal(EINVAL, errno); /* sparse region exceeds region size */ mmap_areas[1].iov_len = 0x1001; - assert_int_equal(-1, - vfu_setup_region(&vfu_ctx, VFU_PCI_DEV_BAR0_REGION_IDX, - 0x2000, NULL, 0, mmap_areas, 2, 0)); + ret = vfu_setup_region(&vfu_ctx, VFU_PCI_DEV_BAR0_REGION_IDX, + 0x2000, NULL, 0, mmap_areas, 2, 0); + assert_int_equal(-1, ret); assert_int_equal(EINVAL, errno); /* sparse region within region size */ mmap_areas[1].iov_len = 0x1000; - assert_int_equal(0, - vfu_setup_region(&vfu_ctx, VFU_PCI_DEV_BAR0_REGION_IDX, - 0x2000, NULL, 0, mmap_areas, 2, 0)); + ret = vfu_setup_region(&vfu_ctx, VFU_PCI_DEV_BAR0_REGION_IDX, + 0x2000, NULL, 0, mmap_areas, 2, 0); + assert_int_equal(0, ret); } static void |