aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorJohn Levon <john.levon@nutanix.com>2021-01-07 19:55:44 +0000
committerGitHub <noreply@github.com>2021-01-07 19:55:44 +0000
commit6ec31642f6253f5c19187c1ffb396d5921138b67 (patch)
tree9dd88104b0d56e63a83a48efbec6887cafc26730 /test
parent70524c550322948765415d9b0eb29ac766e32e79 (diff)
downloadlibvfio-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.c44
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