diff options
-rw-r--r-- | include/libvfio-user.h | 2 | ||||
-rw-r--r-- | lib/dma.c | 7 | ||||
-rw-r--r-- | lib/dma.h | 7 | ||||
-rw-r--r-- | test/unit-tests.c | 21 |
4 files changed, 29 insertions, 8 deletions
diff --git a/include/libvfio-user.h b/include/libvfio-user.h index 28933a5..371daaf 100644 --- a/include/libvfio-user.h +++ b/include/libvfio-user.h @@ -66,7 +66,7 @@ typedef void *vfu_dma_addr_t; typedef struct { vfu_dma_addr_t dma_addr; int region; - int length; + uint64_t length; uint64_t offset; bool mappable; } dma_sg_t; @@ -362,7 +362,7 @@ MOCK_DEFINE(dma_controller_add_region)(dma_controller_t *dma, int _dma_addr_sg_split(const dma_controller_t *dma, - vfu_dma_addr_t dma_addr, uint32_t len, + vfu_dma_addr_t dma_addr, uint64_t len, dma_sg_t *sg, int max_sg, int prot) { int idx; @@ -377,7 +377,7 @@ _dma_addr_sg_split(const dma_controller_t *dma, vfu_dma_addr_t region_end = iov_end(®ion->info.iova); while (dma_addr >= region_start && dma_addr < region_end) { - size_t region_len = MIN(region_end - dma_addr, len); + size_t region_len = MIN((uint64_t)(region_end - dma_addr), len); if (cnt < max_sg) { ret = dma_init_sg(dma, sg, dma_addr, region_len, prot, idx); @@ -489,7 +489,8 @@ dma_controller_dirty_page_logging_stop(dma_controller_t *dma) int dma_controller_dirty_page_get(dma_controller_t *dma, vfu_dma_addr_t addr, - int len, size_t pgsize, size_t size, char **data) + uint64_t len, size_t pgsize, size_t size, + char **data) { int ret; ssize_t bitmap_size; @@ -128,7 +128,7 @@ MOCK_DECLARE(void, dma_controller_unmap_region, dma_controller_t *dma, // Helper for dma_addr_to_sg() slow path. int _dma_addr_sg_split(const dma_controller_t *dma, - vfu_dma_addr_t dma_addr, uint32_t len, + vfu_dma_addr_t dma_addr, uint64_t len, dma_sg_t *sg, int max_sg, int prot); static bool @@ -185,7 +185,7 @@ _dma_mark_dirty(const dma_controller_t *dma, const dma_memory_region_t *region, static inline int dma_init_sg(const dma_controller_t *dma, dma_sg_t *sg, vfu_dma_addr_t dma_addr, - uint32_t len, int prot, int region_index) + uint64_t len, int prot, int region_index) { const dma_memory_region_t *const region = &dma->regions[region_index]; @@ -316,7 +316,8 @@ dma_controller_dirty_page_logging_stop(dma_controller_t *dma); int dma_controller_dirty_page_get(dma_controller_t *dma, vfu_dma_addr_t addr, - int len, size_t pgsize, size_t size, char **data); + uint64_t len, size_t pgsize, size_t size, + char **data); #endif /* LIB_VFIO_USER_DMA_H */ diff --git a/test/unit-tests.c b/test/unit-tests.c index 7fbb055..df51b08 100644 --- a/test/unit-tests.c +++ b/test/unit-tests.c @@ -486,7 +486,7 @@ test_dma_map_sg(void **state UNUSED) sg.length = 0xcafebabe; assert_int_equal(0, dma_map_sg(vfu_ctx.dma, &sg, &iovec, 1)); assert_int_equal(0xdeadbeef, iovec.iov_base); - assert_int_equal((int)0x00000000cafebabe, iovec.iov_len); + assert_int_equal(0x00000000cafebabe, iovec.iov_len); } static void @@ -1816,6 +1816,24 @@ test_process_request_free_passed_fds(void **state UNUSED) assert_int_equal(0, process_request(&vfu_ctx)); } +static void +test_dma_controller_dirty_page_get(void **state UNUSED) +{ + dma_memory_region_t *r; + uint64_t len = UINT32_MAX + (uint64_t)10; + char bp[131073]; + + vfu_ctx.dma->nregions = 1; + r = &vfu_ctx.dma->regions[0]; + r->info.iova.iov_base = (void *)0; + r->info.iova.iov_len = len; + r->info.vaddr = (void *)0xdeadbeef; + vfu_ctx.dma->dirty_pgsize = 4096; + + assert_int_equal(0, dma_controller_dirty_page_get(vfu_ctx.dma, (void *)0, + len, 4096, 131073, (char **)&bp)); +} + int main(void) { @@ -1869,6 +1887,7 @@ main(void) cmocka_unit_test_setup(test_cmd_allowed_when_stopped_and_copying, setup), cmocka_unit_test_setup(test_should_exec_command, setup), cmocka_unit_test_setup(test_process_request_free_passed_fds, setup), + cmocka_unit_test_setup(test_dma_controller_dirty_page_get, setup), }; return cmocka_run_group_tests(tests, NULL, NULL); |