aboutsummaryrefslogtreecommitdiff
path: root/test/mocks.c
diff options
context:
space:
mode:
authorJohn Levon <john.levon@nutanix.com>2021-03-31 16:49:52 +0100
committerGitHub <noreply@github.com>2021-03-31 16:49:52 +0100
commit14b237fc80473bf4419a2bccda4cf7e7d382c174 (patch)
tree959e0cc1c4d2557f624df6fa5c189a8cdc92993f /test/mocks.c
parent0ae00cbb9edcc3879b1276cd61479d668a7f1ec9 (diff)
downloadlibvfio-user-14b237fc80473bf4419a2bccda4cf7e7d382c174.zip
libvfio-user-14b237fc80473bf4419a2bccda4cf7e7d382c174.tar.gz
libvfio-user-14b237fc80473bf4419a2bccda4cf7e7d382c174.tar.bz2
rework DMA callbacks (#396)
This fixes a number of issues with how DMA is handled, based on some changes by Thanos Makatos: - rename callbacks to register/unregister, as there is not necessarily any mapping - provide the (large) page-aligned mapped start and size, the page size used, as well as the protection flags: some API users need these - for convenience, provide the virtual address separately that corresponds to the mapped region - we should only require a DMA controller to use vfu_addr_to_sg(), not an unregister callback - the callbacks should return errno not -errno - region removal was incorrectly updating the region array - various other cleanups and clarifications Signed-off-by: John Levon <john.levon@nutanix.com> Reviewed-by: Thanos Makatos <thanos.makatos@nutanix.com>
Diffstat (limited to 'test/mocks.c')
-rw-r--r--test/mocks.c42
1 files changed, 19 insertions, 23 deletions
diff --git a/test/mocks.c b/test/mocks.c
index 3a83ed5..b01011e 100644
--- a/test/mocks.c
+++ b/test/mocks.c
@@ -50,16 +50,16 @@ struct function
const char *name;
bool patched;
};
-;
+
static int (*__real_close)(int);
static struct function funcs[] = {
/* mocked internal funcs */
- { .name = "_dma_controller_do_remove_region" },
{ .name = "cmd_allowed_when_stopped_and_copying" },
{ .name = "device_is_stopped_and_copying" },
{ .name = "device_is_stopped" },
{ .name = "dma_controller_add_region" },
+ { .name = "dma_controller_unmap_region" },
{ .name = "dma_controller_remove_region" },
{ .name = "dma_map_region" },
{ .name = "exec_command" },
@@ -110,7 +110,7 @@ unpatch_all(void)
}
int
-dma_controller_add_region(dma_controller_t *dma, dma_addr_t dma_addr,
+dma_controller_add_region(dma_controller_t *dma, void *dma_addr,
size_t size, int fd, off_t offset,
uint32_t prot)
{
@@ -130,36 +130,26 @@ dma_controller_add_region(dma_controller_t *dma, dma_addr_t dma_addr,
int
dma_controller_remove_region(dma_controller_t *dma,
- dma_addr_t dma_addr, size_t size,
- vfu_unmap_dma_cb_t *unmap_dma, void *data)
+ void *dma_addr, size_t size,
+ vfu_dma_unregister_cb_t *dma_unregister,
+ void *data)
{
if (!is_patched("dma_controller_remove_region")) {
return __real_dma_controller_remove_region(dma, dma_addr, size,
- unmap_dma, data);
+ dma_unregister, data);
}
check_expected(dma);
check_expected(dma_addr);
check_expected(size);
- check_expected(unmap_dma);
+ check_expected(dma_unregister);
check_expected(data);
return mock();
}
-void *
-dma_map_region(dma_memory_region_t *region, int prot, size_t offset,
- size_t len)
-{
- check_expected_ptr(region);
- check_expected(prot);
- check_expected(offset);
- check_expected(len);
- return mock_ptr_type(void*);
-}
-
void
-_dma_controller_do_remove_region(dma_controller_t *dma,
- dma_memory_region_t *region)
+dma_controller_unmap_region(dma_controller_t *dma,
+ dma_memory_region_t *region)
{
check_expected(dma);
check_expected(region);
@@ -291,12 +281,18 @@ handle_dirty_pages(vfu_ctx_t *vfu_ctx, uint32_t size,
}
/* Always mocked. */
+void
+mock_dma_register(vfu_ctx_t *vfu_ctx, vfu_dma_info_t *info)
+{
+ check_expected(vfu_ctx);
+ check_expected(info);
+}
+
int
-mock_unmap_dma(vfu_ctx_t *vfu_ctx, uint64_t iova, uint64_t len)
+mock_dma_unregister(vfu_ctx_t *vfu_ctx, vfu_dma_info_t *info)
{
check_expected(vfu_ctx);
- check_expected(iova);
- check_expected(len);
+ check_expected(info);
return mock();
}