aboutsummaryrefslogtreecommitdiff
path: root/samples/server.c
diff options
context:
space:
mode:
Diffstat (limited to 'samples/server.c')
-rw-r--r--samples/server.c46
1 files changed, 23 insertions, 23 deletions
diff --git a/samples/server.c b/samples/server.c
index d5318a3..5130688 100644
--- a/samples/server.c
+++ b/samples/server.c
@@ -48,8 +48,7 @@
#include "tran_sock.h"
struct dma_regions {
- uint64_t addr;
- uint64_t len;
+ struct iovec iova;
uint32_t prot;
};
@@ -152,36 +151,35 @@ static void _sa_handler(int signum)
}
static void
-map_dma(vfu_ctx_t *vfu_ctx, uint64_t iova, uint64_t len, uint32_t prot)
+dma_register(vfu_ctx_t *vfu_ctx, vfu_dma_info_t *info)
{
struct server_data *server_data = vfu_get_private(vfu_ctx);
int idx;
for (idx = 0; idx < NR_DMA_REGIONS; idx++) {
- if (server_data->regions[idx].addr == 0 &&
- server_data->regions[idx].len == 0)
+ if (server_data->regions[idx].iova.iov_base == NULL &&
+ server_data->regions[idx].iova.iov_len == 0)
break;
}
if (idx >= NR_DMA_REGIONS) {
errx(EXIT_FAILURE, "Failed to add dma region, slots full\n");
}
- server_data->regions[idx].addr = iova;
- server_data->regions[idx].len = len;
- server_data->regions[idx].prot = prot;
+ server_data->regions[idx].iova = info->iova;
+ server_data->regions[idx].prot = info->prot;
}
static int
-unmap_dma(vfu_ctx_t *vfu_ctx, uint64_t iova, uint64_t len)
+dma_unregister(vfu_ctx_t *vfu_ctx, vfu_dma_info_t *info)
{
struct server_data *server_data = vfu_get_private(vfu_ctx);
int idx;
for (idx = 0; idx < NR_DMA_REGIONS; idx++) {
- if (server_data->regions[idx].addr == iova &&
- server_data->regions[idx].len == len) {
- server_data->regions[idx].addr = 0;
- server_data->regions[idx].len = 0;
+ if (server_data->regions[idx].iova.iov_len == info->iova.iov_len &&
+ server_data->regions[idx].iova.iov_base == info->iova.iov_base) {
+ server_data->regions[idx].iova.iov_base = NULL;
+ server_data->regions[idx].iova.iov_len = 0;
return 0;
}
}
@@ -217,26 +215,28 @@ static void do_dma_io(vfu_ctx_t *vfu_ctx, struct server_data *server_data)
assert(vfu_ctx != NULL);
- ret = vfu_addr_to_sg(vfu_ctx, server_data->regions[0].addr, count, &sg,
- 1, PROT_WRITE);
+ ret = vfu_addr_to_sg(vfu_ctx,
+ (vfu_dma_addr_t)server_data->regions[0].iova.iov_base,
+ count, &sg, 1, PROT_WRITE);
if (ret < 0) {
- errx(EXIT_FAILURE, "failed to map %#lx-%#lx: %s\n",
- server_data->regions[0].addr,
- server_data->regions[0].addr + count -1, strerror(-ret));
+ errx(EXIT_FAILURE, "failed to map %p-%p: %s\n",
+ server_data->regions[0].iova.iov_base,
+ server_data->regions[0].iova.iov_base + count -1,
+ strerror(-ret));
}
memset(buf, 'A', count);
get_md5sum(buf, count, md5sum1);
- printf("%s: WRITE addr %#lx count %d\n", __func__,
- server_data->regions[0].addr, count);
+ printf("%s: WRITE addr %p count %d\n", __func__,
+ server_data->regions[0].iova.iov_base, count);
ret = vfu_dma_write(vfu_ctx, &sg, buf);
if (ret < 0) {
errx(EXIT_FAILURE, "vfu_dma_write failed: %s\n", strerror(-ret));
}
memset(buf, 0, count);
- printf("%s: READ addr %#lx count %d\n", __func__,
- server_data->regions[0].addr, count);
+ printf("%s: READ addr %p count %d\n", __func__,
+ server_data->regions[0].iova.iov_base, count);
ret = vfu_dma_read(vfu_ctx, &sg, buf);
if (ret < 0) {
errx(EXIT_FAILURE, "vfu_dma_read failed: %s\n", strerror(-ret));
@@ -518,7 +518,7 @@ int main(int argc, char *argv[])
err(EXIT_FAILURE, "failed to setup device reset callbacks");
}
- ret = vfu_setup_device_dma_cb(vfu_ctx, &map_dma, &unmap_dma);
+ ret = vfu_setup_device_dma(vfu_ctx, &dma_register, &dma_unregister);
if (ret < 0) {
err(EXIT_FAILURE, "failed to setup device DMA callbacks");
}