aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorswapnili <swapnil.ingle@nutanix.com>2021-01-21 15:38:24 +0100
committerGitHub <noreply@github.com>2021-01-21 15:38:24 +0100
commite899af8f842c9ba2d48fb44b507e90187f2fab47 (patch)
tree3987cf106c923ad52b9605c6486b7868ac3c2cbe /test
parent4f3ad36fc3956d9c1ca926615301e40134b75d58 (diff)
downloadlibvfio-user-e899af8f842c9ba2d48fb44b507e90187f2fab47.zip
libvfio-user-e899af8f842c9ba2d48fb44b507e90187f2fab47.tar.gz
libvfio-user-e899af8f842c9ba2d48fb44b507e90187f2fab47.tar.bz2
Misc fixes for DMA_MAP region prot (#233)
* Misc fixes for DMA_MAP region prot 1. Validate prot passed in vfu_addr_to_sg() 2. Let user know region prot via vfu_unmap_dma_cb_t Signed-off-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.c35
1 files changed, 33 insertions, 2 deletions
diff --git a/test/unit-tests.c b/test/unit-tests.c
index 402b7d0..5272aa3 100644
--- a/test/unit-tests.c
+++ b/test/unit-tests.c
@@ -101,6 +101,21 @@ test_dma_map_without_fd(void **state __attribute__((unused)))
assert_int_equal(0, handle_dma_map_or_unmap(&vfu_ctx, size, true, &fd, 0, &r));
}
+static void dma_map_cb(UNUSED vfu_ctx_t *vfu_ctx, uint64_t iova, uint64_t len,
+ uint32_t prot)
+{
+ if (iova == 0xcafebabe) {
+ assert_int_equal(0x1000, len);
+ assert_int_equal(PROT_READ | PROT_WRITE, prot);
+ } else {
+ assert_int_equal(0xdeadbeef, iova);
+ assert_int_equal(0x1000, len);
+ assert_int_equal(PROT_NONE, prot);
+ }
+
+ return;
+}
+
/*
* Tests that adding multiple DMA regions that not all of them are mappable
* results in only the mappable one being memory mapped.
@@ -109,7 +124,7 @@ static void
test_dma_add_regions_mixed(void **state __attribute__((unused)))
{
dma_controller_t dma = { 0 };
- vfu_ctx_t vfu_ctx = { .dma = &dma };
+ vfu_ctx_t vfu_ctx = { .dma = &dma , .map_dma = dma_map_cb};
dma.vfu_ctx = &vfu_ctx;
struct vfio_user_dma_region r[2] = {
[0] = {
@@ -1046,14 +1061,30 @@ test_dma_addr_to_sg(void **state __attribute__((unused)))
r->virt_addr = (void*)0xdeadbeef;
/* fast path, region hint hit */
+ r->prot = PROT_WRITE;
assert_int_equal(1,
- dma_addr_to_sg(dma, 0x2000, 0x400, &sg, 1, PROT_NONE));
+ dma_addr_to_sg(dma, 0x2000, 0x400, &sg, 1, PROT_READ));
assert_int_equal(r->dma_addr, sg.dma_addr);
assert_int_equal(0, sg.region);
assert_int_equal(0x2000 - r->dma_addr, sg.offset);
assert_int_equal(0x400, sg.length);
assert_true(sg.mappable);
+ errno = 0;
+ r->prot = PROT_WRITE;
+ assert_int_equal(-1,
+ dma_addr_to_sg(dma, 0x6000, 0x400, &sg, 1, PROT_READ));
+ assert_int_equal(0, errno);
+
+ r->prot = PROT_READ;
+ assert_int_equal(-1,
+ dma_addr_to_sg(dma, 0x2000, 0x400, &sg, 1, PROT_WRITE));
+ assert_int_equal(EACCES, errno);
+
+ r->prot = PROT_READ|PROT_WRITE;
+ assert_int_equal(1,
+ dma_addr_to_sg(dma, 0x2000, 0x400, &sg, 1, PROT_READ));
+
/* TODO test more scenarios */
}