aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/libvfio-user.h2
-rw-r--r--lib/dma.c7
-rw-r--r--lib/dma.h7
-rw-r--r--test/unit-tests.c21
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;
diff --git a/lib/dma.c b/lib/dma.c
index 9b29cc9..32f786b 100644
--- a/lib/dma.c
+++ b/lib/dma.c
@@ -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(&region->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;
diff --git a/lib/dma.h b/lib/dma.h
index b9bf38e..cd17c73 100644
--- a/lib/dma.h
+++ b/lib/dma.h
@@ -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);