diff options
author | John Levon <john.levon@nutanix.com> | 2020-11-27 14:48:07 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-11-27 14:48:07 +0000 |
commit | e94bd44d10d8019ea2c39356363a5743136bdb5d (patch) | |
tree | 93f71114f5e57682a5a5a1182f7c1e19ce963ff8 /lib | |
parent | 40ac852fec651f54a4be8905ab8bb6b25ddb64e2 (diff) | |
download | libvfio-user-e94bd44d10d8019ea2c39356363a5743136bdb5d.zip libvfio-user-e94bd44d10d8019ea2c39356363a5743136bdb5d.tar.gz libvfio-user-e94bd44d10d8019ea2c39356363a5743136bdb5d.tar.bz2 |
rename to libvfio-user (#128)
The muser name no longer reflects the implementation, and will just serve to
confuse. Bite the bullet now, and rename ourselves to reflect the actual
implementation.
Signed-off-by: John Levon <john.levon@nutanix.com>
Reviewed-by: Thanos Makatos <thanos.makatos@nutanix.com>
Reviewed-by: Swapnil Ingle <swapnil.ingle@nutanix.com>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/CMakeLists.txt | 43 | ||||
-rw-r--r-- | lib/cap.c | 111 | ||||
-rw-r--r-- | lib/cap.h | 16 | ||||
-rw-r--r-- | lib/common.h | 6 | ||||
-rw-r--r-- | lib/dma.c | 33 | ||||
-rw-r--r-- | lib/dma.h | 20 | ||||
-rw-r--r-- | lib/irq.c | 168 | ||||
-rw-r--r-- | lib/irq.h | 12 | ||||
-rw-r--r-- | lib/libvfio-user.c (renamed from lib/muser_ctx.c) | 818 | ||||
-rw-r--r-- | lib/migration.c | 101 | ||||
-rw-r--r-- | lib/migration.h | 18 | ||||
-rw-r--r-- | lib/muser_priv.h | 217 | ||||
-rw-r--r-- | lib/pci.c (renamed from lib/muser_pci.c) | 123 | ||||
-rw-r--r-- | lib/private.h | 150 | ||||
-rw-r--r-- | lib/python_bindings.c | 34 | ||||
-rw-r--r-- | lib/setup.py | 4 | ||||
-rw-r--r-- | lib/tran_sock.c | 186 | ||||
-rw-r--r-- | lib/tran_sock.h | 69 |
18 files changed, 1041 insertions, 1088 deletions
diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 246e0ad..efc0a68 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -30,22 +30,22 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC") -add_library(muser SHARED +add_library(vfio-user SHARED $<TARGET_OBJECTS:cap> $<TARGET_OBJECTS:dma> - $<TARGET_OBJECTS:muser_ctx> - $<TARGET_OBJECTS:muser_pci> - $<TARGET_OBJECTS:tran_sock> - $<TARGET_OBJECTS:migration> $<TARGET_OBJECTS:irq> + $<TARGET_OBJECTS:libvfio-user> + $<TARGET_OBJECTS:migration> + $<TARGET_OBJECTS:pci> + $<TARGET_OBJECTS:tran_sock> common.h irq.h - muser_priv.h + private.h tran_sock.h) -set_target_properties(muser PROPERTIES LINKER_LANGUAGE C) +set_target_properties(vfio-user PROPERTIES LINKER_LANGUAGE C) -target_link_libraries(muser json-c pthread) +target_link_libraries(vfio-user json-c pthread) set(UT_CFLAGS "-O0 -ggdb --coverage") set(UT_LFLAGS "--coverage") @@ -60,23 +60,22 @@ endfunction(add_library_ut) add_library_ut(cap cap.c) add_library_ut(dma dma.c) -add_library_ut(muser_ctx muser_ctx.c) -add_library_ut(muser_pci muser_pci.c) -add_library_ut(tran_sock tran_sock.c) -add_library_ut(migration migration.c) add_library_ut(irq irq.c) +add_library_ut(libvfio-user libvfio-user.c) +add_library_ut(migration migration.c) +add_library_ut(pci pci.c) +add_library_ut(tran_sock tran_sock.c) -install(TARGETS muser +install(TARGETS vfio-user LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) if (DEFINED ENV{PYTHON_BINDINGS}) - add_custom_target(python_bindings_build ALL - COMMAND python setup.py build -b ${CMAKE_BINARY_DIR} - DEPENDS python_bindings.c setup.py - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/lib - SOURCES python_bindings.c setup.py) - # execute_process seems to only execute a single command, e.g. it can't - # handle two commands joined by && - install(CODE "execute_process(COMMAND ${CMAKE_SOURCE_DIR}/lib/python_bindings_install.sh ${CMAKE_SOURCE_DIR})") - + add_custom_target(python_bindings_build ALL + COMMAND python setup.py build -b ${CMAKE_BINARY_DIR} + DEPENDS python_bindings.c setup.py + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/lib + SOURCES python_bindings.c setup.py) + # execute_process seems to only execute a single command, e.g. it can't + # handle two commands joined by && + install(CODE "execute_process(COMMAND ${CMAKE_SOURCE_DIR}/lib/python_bindings_install.sh ${CMAKE_SOURCE_DIR})") endif() @@ -37,7 +37,7 @@ #include <stddef.h> #include <string.h> -#include "muser.h" +#include "libvfio-user.h" #include "cap.h" struct cap { @@ -46,7 +46,7 @@ struct cap { }; struct caps { - struct cap caps[LM_MAX_CAPS]; /* FIXME only needs to be as big as nr_caps */ + struct cap caps[VFU_MAX_CAPS]; /* FIXME only needs to be as big as nr_caps */ unsigned int nr_caps; }; @@ -72,7 +72,7 @@ cap_is_accessed(struct cap *caps, int nr_caps, size_t count, loff_t offset) /* * FIXME write starts before capabilities but extends into them. I don't - * think that the while loop in lm_access will allow this in the first + * think that the while loop in vfu_access will allow this in the first * place. */ assert(false); @@ -97,7 +97,7 @@ cap_is_accessed(struct cap *caps, int nr_caps, size_t count, loff_t offset) * (offset + count). */ static uint8_t * -cap_find(lm_pci_config_space_t *config_space, struct caps *caps, loff_t offset, +cap_find(vfu_pci_config_space_t *config_space, struct caps *caps, loff_t offset, size_t count) { struct cap *cap; @@ -133,17 +133,17 @@ cap_is_valid(uint8_t id) } uint8_t * -cap_find_by_id(lm_ctx_t *lm_ctx, uint8_t id) +cap_find_by_id(vfu_ctx_t *vfu_ctx, uint8_t id) { uint8_t *pos; - lm_pci_config_space_t *config_space; + vfu_pci_config_space_t *config_space; if (!cap_is_valid(id)) { errno = EINVAL; return NULL; } - config_space = lm_get_pci_config_space(lm_ctx); + config_space = vfu_pci_get_config_space(vfu_ctx); if (config_space->hdr.cap == 0) { errno = ENOENT; @@ -160,7 +160,7 @@ cap_find_by_id(lm_ctx_t *lm_ctx, uint8_t id) } pos = config_space->raw + *(pos + PCI_CAP_LIST_NEXT); } - errno = ENOENT; + errno = ENOENT; return NULL; } @@ -173,32 +173,32 @@ cap_header_is_accessed(uint8_t cap_offset, loff_t offset) return offset - cap_offset <= 1; } -typedef ssize_t (cap_access) (lm_ctx_t *lm_ctx, uint8_t *cap, char *buf, +typedef ssize_t (cap_access) (vfu_ctx_t *vfu_ctx, uint8_t *cap, char *buf, size_t count, loff_t offset); static ssize_t -handle_pmcs_write(lm_ctx_t *lm_ctx, struct pmcap *pm, +handle_pmcs_write(vfu_ctx_t *vfu_ctx, struct pmcap *pm, const struct pmcs *const pmcs) { if (pm->pmcs.ps != pmcs->ps) { - lm_log(lm_ctx, LM_DBG, "power state set to %#x\n", pmcs->ps); + vfu_log(vfu_ctx, VFU_DBG, "power state set to %#x\n", pmcs->ps); } if (pm->pmcs.pmee != pmcs->pmee) { - lm_log(lm_ctx, LM_DBG, "PME enable set to %#x\n", pmcs->pmee); + vfu_log(vfu_ctx, VFU_DBG, "PME enable set to %#x\n", pmcs->pmee); } if (pm->pmcs.dse != pmcs->dse) { - lm_log(lm_ctx, LM_DBG, "data select set to %#x\n", pmcs->dse); + vfu_log(vfu_ctx, VFU_DBG, "data select set to %#x\n", pmcs->dse); } if (pm->pmcs.pmes != pmcs->pmes) { - lm_log(lm_ctx, LM_DBG, "PME status set to %#x\n", pmcs->pmes); + vfu_log(vfu_ctx, VFU_DBG, "PME status set to %#x\n", pmcs->pmes); } pm->pmcs = *pmcs; return 0; } static ssize_t -handle_pm_write(lm_ctx_t *lm_ctx, uint8_t *cap, char *const buf, +handle_pm_write(vfu_ctx_t *vfu_ctx, uint8_t *cap, char *const buf, const size_t count, const loff_t offset) { struct pmcap *pm = (struct pmcap *)cap; @@ -214,28 +214,29 @@ handle_pm_write(lm_ctx_t *lm_ctx, uint8_t *cap, char *const buf, if (count != sizeof(struct pmcs)) { return -EINVAL; } - return handle_pmcs_write(lm_ctx, pm, (struct pmcs *)buf); + return handle_pmcs_write(vfu_ctx, pm, (struct pmcs *)buf); } return -EINVAL; } static ssize_t -handle_mxc_write(lm_ctx_t *lm_ctx, struct msixcap *msix, +handle_mxc_write(vfu_ctx_t *vfu_ctx, struct msixcap *msix, const struct mxc *const mxc) { assert(msix != NULL); assert(mxc != NULL); if (mxc->mxe != msix->mxc.mxe) { - lm_log(lm_ctx, LM_DBG, "%s MSI-X\n", mxc->mxe ? "enable" : "disable"); + vfu_log(vfu_ctx, VFU_DBG, "%s MSI-X\n", + mxc->mxe ? "enable" : "disable"); msix->mxc.mxe = mxc->mxe; } if (mxc->fm != msix->mxc.fm) { if (mxc->fm) { - lm_log(lm_ctx, LM_DBG, "all MSI-X vectors masked\n"); + vfu_log(vfu_ctx, VFU_DBG, "all MSI-X vectors masked\n"); } else { - lm_log(lm_ctx, LM_DBG, + vfu_log(vfu_ctx, VFU_DBG, "vector's mask bit determines whether vector is masked\n"); } msix->mxc.fm = mxc->fm; @@ -245,7 +246,7 @@ handle_mxc_write(lm_ctx_t *lm_ctx, struct msixcap *msix, } static ssize_t -handle_msix_write(lm_ctx_t *lm_ctx, uint8_t *cap, char *const buf, +handle_msix_write(vfu_ctx_t *vfu_ctx, uint8_t *cap, char *const buf, const size_t count, const loff_t offset) { struct msixcap *msix = (struct msixcap *)cap; @@ -253,79 +254,83 @@ handle_msix_write(lm_ctx_t *lm_ctx, uint8_t *cap, char *const buf, if (count == sizeof(struct mxc)) { switch (offset) { case offsetof(struct msixcap, mxc): - return handle_mxc_write(lm_ctx, msix, (struct mxc *)buf); + return handle_mxc_write(vfu_ctx, msix, (struct mxc *)buf); default: - lm_log(lm_ctx, LM_ERR, "invalid MSI-X write offset %ld\n", offset); + vfu_log(vfu_ctx, VFU_ERR, + "invalid MSI-X write offset %ld\n", offset); return -EINVAL; } } - lm_log(lm_ctx, LM_ERR, "invalid MSI-X write size %lu\n", count); + vfu_log(vfu_ctx, VFU_ERR, "invalid MSI-X write size %lu\n", count); return -EINVAL; } static int -handle_px_pxdc_write(lm_ctx_t *lm_ctx, struct pxcap *px, const union pxdc *const p) +handle_px_pxdc_write(vfu_ctx_t *vfu_ctx, struct pxcap *px, + const union pxdc *const p) { assert(px != NULL); assert(p != NULL); if (p->cere != px->pxdc.cere) { px->pxdc.cere = p->cere; - lm_log(lm_ctx, LM_DBG, "CERE %s\n", p->cere ? "enable" : "disable"); + vfu_log(vfu_ctx, VFU_DBG, "CERE %s\n", p->cere ? "enable" : "disable"); } if (p->nfere != px->pxdc.nfere) { px->pxdc.nfere = p->nfere; - lm_log(lm_ctx, LM_DBG, "NFERE %s\n", p->nfere ? "enable" : "disable"); + vfu_log(vfu_ctx, VFU_DBG, "NFERE %s\n", + p->nfere ? "enable" : "disable"); } if (p->fere != px->pxdc.fere) { px->pxdc.fere = p->fere; - lm_log(lm_ctx, LM_DBG, "FERE %s\n", p->fere ? "enable" : "disable"); + vfu_log(vfu_ctx, VFU_DBG, "FERE %s\n", p->fere ? "enable" : "disable"); } if (p->urre != px->pxdc.urre) { px->pxdc.urre = p->urre; - lm_log(lm_ctx, LM_DBG, "URRE %s\n", p->urre ? "enable" : "disable"); + vfu_log(vfu_ctx, VFU_DBG, "URRE %s\n", p->urre ? "enable" : "disable"); } if (p->ero != px->pxdc.ero) { px->pxdc.ero = p->ero; - lm_log(lm_ctx, LM_DBG, "ERO %s\n", p->ero ? "enable" : "disable"); + vfu_log(vfu_ctx, VFU_DBG, "ERO %s\n", p->ero ? "enable" : "disable"); } if (p->mps != px->pxdc.mps) { px->pxdc.mps = p->mps; - lm_log(lm_ctx, LM_DBG, "MPS set to %d\n", p->mps); + vfu_log(vfu_ctx, VFU_DBG, "MPS set to %d\n", p->mps); } if (p->ete != px->pxdc.ete) { px->pxdc.ete = p->ete; - lm_log(lm_ctx, LM_DBG, "ETE %s\n", p->ete ? "enable" : "disable"); + vfu_log(vfu_ctx, VFU_DBG, "ETE %s\n", p->ete ? "enable" : "disable"); } if (p->pfe != px->pxdc.pfe) { px->pxdc.pfe = p->pfe; - lm_log(lm_ctx, LM_DBG, "PFE %s\n", p->pfe ? "enable" : "disable"); + vfu_log(vfu_ctx, VFU_DBG, "PFE %s\n", p->pfe ? "enable" : "disable"); } if (p->appme != px->pxdc.appme) { px->pxdc.appme = p->appme; - lm_log(lm_ctx, LM_DBG, "APPME %s\n", p->appme ? "enable" : "disable"); + vfu_log(vfu_ctx, VFU_DBG, "APPME %s\n", + p->appme ? "enable" : "disable"); } if (p->ens != px->pxdc.ens) { px->pxdc.ens = p->ens; - lm_log(lm_ctx, LM_DBG, "ENS %s\n", p->ens ? "enable" : "disable"); + vfu_log(vfu_ctx, VFU_DBG, "ENS %s\n", p->ens ? "enable" : "disable"); } if (p->mrrs != px->pxdc.mrrs) { px->pxdc.mrrs = p->mrrs; - lm_log(lm_ctx, LM_DBG, "MRRS set to %d\n", p->mrrs); + vfu_log(vfu_ctx, VFU_DBG, "MRRS set to %d\n", p->mrrs); } if (p->iflr) { - lm_log(lm_ctx, LM_DBG, + vfu_log(vfu_ctx, VFU_DBG, "initiate function level reset\n"); } @@ -333,18 +338,18 @@ handle_px_pxdc_write(lm_ctx_t *lm_ctx, struct pxcap *px, const union pxdc *const } static int -handle_px_write_2_bytes(lm_ctx_t *lm_ctx, struct pxcap *px, char *const buf, +handle_px_write_2_bytes(vfu_ctx_t *vfu_ctx, struct pxcap *px, char *const buf, loff_t off) { switch (off) { case offsetof(struct pxcap, pxdc): - return handle_px_pxdc_write(lm_ctx, px, (union pxdc *)buf); + return handle_px_pxdc_write(vfu_ctx, px, (union pxdc *)buf); } return -EINVAL; } static ssize_t -handle_px_write(lm_ctx_t *lm_ctx, uint8_t *cap, char *const buf, +handle_px_write(vfu_ctx_t *vfu_ctx, uint8_t *cap, char *const buf, size_t count, loff_t offset) { struct pxcap *px = (struct pxcap *)cap; @@ -352,7 +357,7 @@ handle_px_write(lm_ctx_t *lm_ctx, uint8_t *cap, char *const buf, int err = -EINVAL; switch (count) { case 2: - err = handle_px_write_2_bytes(lm_ctx, px, buf, offset); + err = handle_px_write_2_bytes(vfu_ctx, px, buf, offset); break; } if (err != 0) { @@ -373,10 +378,10 @@ static const struct cap_handler { }; ssize_t -cap_maybe_access(lm_ctx_t *lm_ctx, struct caps *caps, char *buf, size_t count, +cap_maybe_access(vfu_ctx_t *vfu_ctx, struct caps *caps, char *buf, size_t count, loff_t offset) { - lm_pci_config_space_t *config_space; + vfu_pci_config_space_t *config_space; uint8_t *cap; if (caps == NULL) { @@ -392,7 +397,7 @@ cap_maybe_access(lm_ctx_t *lm_ctx, struct caps *caps, char *buf, size_t count, } /* we're now guaranteed that the access is within some capability */ - config_space = lm_get_pci_config_space(lm_ctx); + config_space = vfu_pci_get_config_space(vfu_ctx); cap = cap_find(config_space, caps, offset, count); assert(cap != NULL); /* FIXME */ @@ -400,26 +405,26 @@ cap_maybe_access(lm_ctx_t *lm_ctx, struct caps *caps, char *buf, size_t count, /* FIXME how to deal with writes to capability header? */ assert(false); } - return cap_handlers[cap[PCI_CAP_LIST_ID]].fn(lm_ctx, cap, buf, count, + return cap_handlers[cap[PCI_CAP_LIST_ID]].fn(vfu_ctx, cap, buf, count, offset - (loff_t)(cap - config_space->raw)); } -struct caps *caps_create(lm_ctx_t *lm_ctx, lm_cap_t **lm_caps, int nr_caps, - int *err) +struct caps * +caps_create(vfu_ctx_t *vfu_ctx, vfu_cap_t **vfu_caps, int nr_caps, int *err) { int i; uint8_t *prev; uint8_t next; - lm_pci_config_space_t *config_space; + vfu_pci_config_space_t *config_space; struct caps *caps = NULL; *err = 0; - if (nr_caps <= 0 || nr_caps >= LM_MAX_CAPS) { + if (nr_caps <= 0 || nr_caps >= VFU_MAX_CAPS) { *err = EINVAL; return NULL; } - assert(lm_caps != NULL); + assert(vfu_caps != NULL); caps = calloc(1, sizeof *caps); if (caps == NULL) { @@ -427,7 +432,7 @@ struct caps *caps_create(lm_ctx_t *lm_ctx, lm_cap_t **lm_caps, int nr_caps, goto err_out; } - config_space = lm_get_pci_config_space(lm_ctx); + config_space = vfu_pci_get_config_space(vfu_ctx); /* points to the next field of the previous capability */ prev = &config_space->hdr.cap; @@ -435,7 +440,7 @@ struct caps *caps_create(lm_ctx_t *lm_ctx, lm_cap_t **lm_caps, int nr_caps, next = PCI_STD_HEADER_SIZEOF; for (i = 0; i < nr_caps; i++) { - uint8_t *cap = (uint8_t*)lm_caps[i]; + uint8_t *cap = (uint8_t*)vfu_caps[i]; uint8_t id = cap[PCI_CAP_LIST_ID]; size_t size; @@ -460,7 +465,7 @@ struct caps *caps_create(lm_ctx_t *lm_ctx, lm_cap_t **lm_caps, int nr_caps, next += size; assert(next % 4 == 0); /* FIXME */ - lm_log(lm_ctx, LM_DBG, "initialized capability %s %#x-%#x\n", + vfu_log(vfu_ctx, VFU_DBG, "initialized capability %s %#x-%#x\n", cap_handlers[id].name, caps->caps[i].start, caps->caps[i].end); } caps->nr_caps = nr_caps; @@ -30,18 +30,18 @@ * */ -#ifndef LIB_MUSER_CAP_H -#define LIB_MUSER_CAP_H +#ifndef LIB_VFIO_USER_CAP_H +#define LIB_VFIO_USER_CAP_H -#include "muser.h" +#include "libvfio-user.h" struct caps; /** * Initializes PCI capabilities. */ -struct caps *caps_create(lm_ctx_t *lm_ctx, lm_cap_t **caps, int nr_caps, - int *err); +struct caps * +caps_create(vfu_ctx_t *vfu_ctx, vfu_cap_t **caps, int nr_caps, int *err); /* * Conditionally accesses the PCI capabilities. Returns: @@ -51,12 +51,12 @@ struct caps *caps_create(lm_ctx_t *lm_ctx, lm_cap_t **caps, int nr_caps, * <0: negative error code on error. */ ssize_t -cap_maybe_access(lm_ctx_t *lm_ctx, struct caps *caps, char *buf, size_t count, +cap_maybe_access(vfu_ctx_t *vfu_ctx, struct caps *caps, char *buf, size_t count, loff_t offset); uint8_t * -cap_find_by_id(lm_ctx_t *lm_ctx, uint8_t id); +cap_find_by_id(vfu_ctx_t *vfu_ctx, uint8_t id); -#endif /* LIB_MUSER_CAP_H */ +#endif /* LIB_VFIO_USER_CAP_H */ /* ex: set tabstop=4 shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/lib/common.h b/lib/common.h index dbd3c9b..9a5189d 100644 --- a/lib/common.h +++ b/lib/common.h @@ -34,8 +34,8 @@ * Private utilities used by the library and sample/test code. */ -#ifndef LIB_MUSER_COMMON_H -#define LIB_MUSER_COMMON_H +#ifndef LIB_VFIO_USER_COMMON_H +#define LIB_VFIO_USER_COMMON_H #include <stdint.h> @@ -58,6 +58,6 @@ #define UNIT_TEST_SYMBOL(x) \ typeof(x) __wrap_##x __attribute__((weak, alias(#x))) -#endif /* LIB_MUSER_COMMON_H */ +#endif /* LIB_VFIO_USER_COMMON_H */ /* ex: set tabstop=4 shiftwidth=4 softtabstop=4 expandtab: */ @@ -70,7 +70,7 @@ fds_are_same_file(int fd1, int fd2) } dma_controller_t * -dma_controller_create(lm_ctx_t *lm_ctx, int max_regions) +dma_controller_create(vfu_ctx_t *vfu_ctx, int max_regions) { dma_controller_t *dma; @@ -81,7 +81,7 @@ dma_controller_create(lm_ctx_t *lm_ctx, int max_regions) return dma; } - dma->lm_ctx = lm_ctx; + dma->vfu_ctx = vfu_ctx; dma->max_regions = max_regions; dma->nregions = 0; memset(dma->regions, 0, max_regions * sizeof(dma->regions[0])); @@ -101,13 +101,14 @@ _dma_controller_do_remove_region(dma_controller_t *dma, err = dma_unmap_region(region, region->virt_addr, region->size); if (err != 0) { - lm_log(dma->lm_ctx, LM_DBG, "failed to unmap fd=%d vaddr=%p-%p\n", + vfu_log(dma->vfu_ctx, VFU_DBG, "failed to unmap fd=%d vaddr=%p-%p\n", region->fd, region->virt_addr, region->virt_addr + region->size - 1); } if (region->fd != -1) { if (close(region->fd) == -1) { - lm_log(dma->lm_ctx, LM_DBG, "failed to close fd %d: %m\n", region->fd); + vfu_log(dma->vfu_ctx, VFU_DBG, + "failed to close fd %d: %m\n", region->fd); } } } @@ -145,7 +146,7 @@ dma_controller_region_valid(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, - lm_unmap_dma_cb_t *unmap_dma, void *data) + vfu_unmap_dma_cb_t *unmap_dma, void *data) { int idx; dma_memory_region_t *region; @@ -159,7 +160,7 @@ dma_controller_remove_region(dma_controller_t *dma, if (region->refcnt > 0) { err = unmap_dma(data, region->dma_addr, region->size); if (err != 0) { - lm_log(dma->lm_ctx, LM_ERR, + vfu_log(dma->vfu_ctx, VFU_ERR, "failed to notify of removal of DMA region %#lx-%#lx: %s\n", region->dma_addr, region->dma_addr + region->size, strerror(-err)); @@ -193,7 +194,7 @@ dma_controller_remove_regions(dma_controller_t *dma) for (i = 0; i < dma->nregions; i++) { dma_memory_region_t *region = &dma->regions[i]; - lm_log(dma->lm_ctx, LM_INF, "unmap vaddr=%p IOVA=%lx", + vfu_log(dma->vfu_ctx, VFU_INF, "unmap vaddr=%p IOVA=%lx", region->virt_addr, region->dma_addr); _dma_controller_do_remove_region(dma, region); @@ -228,7 +229,7 @@ dma_controller_add_region(dma_controller_t *dma, /* First check if this is the same exact region. */ if (region->dma_addr == dma_addr && region->size == size) { if (offset != region->offset) { - lm_log(dma->lm_ctx, LM_ERR, + vfu_log(dma->vfu_ctx, VFU_ERR, "bad offset for new DMA region %#lx-%#lx, want=%ld, existing=%ld\n", dma_addr, dma_addr + size, offset, region->offset); goto err; @@ -240,7 +241,7 @@ dma_controller_add_region(dma_controller_t *dma, * the same file, however in the majority of cases we'll be * using a single fd. */ - lm_log(dma->lm_ctx, LM_ERR, + vfu_log(dma->vfu_ctx, VFU_ERR, "bad fd=%d for new DMA region %#lx-%#lx, existing fd=%d\n", fd, offset, offset + size, region->fd); goto err; @@ -253,7 +254,7 @@ dma_controller_add_region(dma_controller_t *dma, dma_addr < region->dma_addr + region->size) || (region->dma_addr >= dma_addr && region->dma_addr < dma_addr + size)) { - lm_log(dma->lm_ctx, LM_INF, + vfu_log(dma->vfu_ctx, VFU_INF, "new DMA region %#lx+%#lx overlaps with DMA region %#lx-%#lx\n", dma_addr, size, region->dma_addr, region->size); goto err; @@ -262,7 +263,7 @@ dma_controller_add_region(dma_controller_t *dma, if (dma->nregions == dma->max_regions) { idx = dma->max_regions; - lm_log(dma->lm_ctx, LM_ERR, + vfu_log(dma->vfu_ctx, VFU_ERR, "reached maxed regions, recompile with higher number of DMA regions\n"); goto err; } @@ -273,7 +274,7 @@ dma_controller_add_region(dma_controller_t *dma, if (fd != -1) { page_size = fd_get_blocksize(fd); if (page_size < 0) { - lm_log(dma->lm_ctx, LM_ERR, "bad page size %d\n", page_size); + vfu_log(dma->vfu_ctx, VFU_ERR, "bad page size %d\n", page_size); goto err; } } @@ -290,13 +291,13 @@ dma_controller_add_region(dma_controller_t *dma, region->virt_addr = dma_map_region(region, PROT_READ | PROT_WRITE, 0, region->size); if (region->virt_addr == MAP_FAILED) { - lm_log(dma->lm_ctx, LM_ERR, + vfu_log(dma->vfu_ctx, VFU_ERR, "failed to memory map DMA region %#lx-%#lx: %s\n", dma_addr, dma_addr + size, strerror(errno)); if (region->fd != -1) { if (close(region->fd) == -1) { - lm_log(dma->lm_ctx, LM_DBG, "failed to close fd %d: %m\n", - region->fd); + vfu_log(dma->vfu_ctx, VFU_DBG, + "failed to close fd %d: %m\n", region->fd); } } goto err; @@ -514,7 +515,7 @@ dma_controller_dirty_page_get(dma_controller_t *dma, dma_addr_t addr, int len, if (size != (size_t)bitmap_size) { return -EINVAL; } - + region = &dma->regions[sg.region]; *data = region->dirty_bitmap; @@ -28,8 +28,8 @@ * */ -#ifndef LIB_MUSER_DMA_H -#define LIB_MUSER_DMA_H +#ifndef LIB_VFIO_USER_DMA_H +#define LIB_VFIO_USER_DMA_H /* * FIXME check whether DMA regions must be page aligned. If so then the @@ -75,10 +75,10 @@ #include <stdlib.h> #include <limits.h> -#include "muser.h" +#include "libvfio-user.h" #include "common.h" -struct lm_ctx; +struct vfu_ctx; typedef struct { dma_addr_t dma_addr; // DMA address of this region @@ -94,13 +94,13 @@ typedef struct { typedef struct { int max_regions; int nregions; - struct lm_ctx *lm_ctx; + struct vfu_ctx *vfu_ctx; size_t dirty_pgsize; // Dirty page granularity dma_memory_region_t regions[0]; } dma_controller_t; dma_controller_t * -dma_controller_create(lm_ctx_t *lm_ctx, int max_regions); +dma_controller_create(vfu_ctx_t *vfu_ctx, int max_regions); void dma_controller_destroy(dma_controller_t *dma); @@ -120,7 +120,7 @@ dma_controller_add_region(dma_controller_t *dma, int dma_controller_remove_region(dma_controller_t *dma, dma_addr_t dma_addr, size_t size, - lm_unmap_dma_cb_t *unmap_dma, void *data); + vfu_unmap_dma_cb_t *unmap_dma, void *data); // Helper for dma_addr_to_sg() slow path. int @@ -238,7 +238,7 @@ dma_map_sg(dma_controller_t *dma, const dma_sg_t *sg, struct iovec *iov, int i; for (i = 0; i < cnt; i++) { - lm_log(dma->lm_ctx, LM_DBG, "map %#lx-%#lx\n", + vfu_log(dma->vfu_ctx, VFU_DBG, "map %#lx-%#lx\n", sg->dma_addr + sg->offset, sg->dma_addr + sg->offset + sg->length); region = &dma->regions[sg[i].region]; iov[i].iov_base = region->virt_addr + sg[i].offset; @@ -271,7 +271,7 @@ dma_unmap_sg(dma_controller_t *dma, const dma_sg_t *sg, /* bad region */ continue; } - lm_log(dma->lm_ctx, LM_DBG, "unmap %#lx-%#lx\n", + vfu_log(dma->vfu_ctx, VFU_DBG, "unmap %#lx-%#lx\n", sg[i].dma_addr + sg[i].offset, sg[i].dma_addr + sg[i].offset + sg[i].length); r->refcnt--; } @@ -325,6 +325,6 @@ bool dma_controller_region_valid(dma_controller_t *dma, dma_addr_t dma_addr, size_t size); -#endif /* LIB_MUSER_DMA_H */ +#endif /* LIB_VFIO_USER_DMA_H */ /* ex: set tabstop=4 shiftwidth=4 softtabstop=4 expandtab: */ @@ -47,48 +47,49 @@ vfio_irq_idx_to_str(int index) { [VFIO_PCI_MSIX_IRQ_INDEX] = "MSI-X", }; - assert(index < LM_DEV_NUM_IRQS); + assert(index < VFU_DEV_NUM_IRQS); return s[index]; } static long -irqs_disable(lm_ctx_t *lm_ctx, uint32_t index) +irqs_disable(vfu_ctx_t *vfu_ctx, uint32_t index) { int *irq_efd = NULL; uint32_t i; - assert(lm_ctx != NULL); - assert(index < LM_DEV_NUM_IRQS); + assert(vfu_ctx != NULL); + assert(index < VFU_DEV_NUM_IRQS); switch (index) { case VFIO_PCI_INTX_IRQ_INDEX: case VFIO_PCI_MSI_IRQ_INDEX: case VFIO_PCI_MSIX_IRQ_INDEX: - lm_log(lm_ctx, LM_DBG, "disabling IRQ %s", vfio_irq_idx_to_str(index)); - lm_ctx->irqs->type = IRQ_NONE; - for (i = 0; i < lm_ctx->irqs->max_ivs; i++) { - if (lm_ctx->irqs->efds[i] >= 0) { - if (close(lm_ctx->irqs->efds[i]) == -1) { - lm_log(lm_ctx, LM_DBG, "failed to close IRQ fd %d: %m", - lm_ctx->irqs->efds[i]); + vfu_log(vfu_ctx, VFU_DBG, "disabling IRQ %s", + vfio_irq_idx_to_str(index)); + vfu_ctx->irqs->type = IRQ_NONE; + for (i = 0; i < vfu_ctx->irqs->max_ivs; i++) { + if (vfu_ctx->irqs->efds[i] >= 0) { + if (close(vfu_ctx->irqs->efds[i]) == -1) { + vfu_log(vfu_ctx, VFU_DBG, "failed to close IRQ fd %d: %m", + vfu_ctx->irqs->efds[i]); } - lm_ctx->irqs->efds[i] = -1; + vfu_ctx->irqs->efds[i] = -1; } } return 0; case VFIO_PCI_ERR_IRQ_INDEX: - irq_efd = &lm_ctx->irqs->err_efd; + irq_efd = &vfu_ctx->irqs->err_efd; break; case VFIO_PCI_REQ_IRQ_INDEX: - irq_efd = &lm_ctx->irqs->req_efd; + irq_efd = &vfu_ctx->irqs->req_efd; break; } if (irq_efd != NULL) { if (*irq_efd != -1) { if (close(*irq_efd) == -1) { - lm_log(lm_ctx, LM_DBG, "failed to close IRQ fd %d: %m", + vfu_log(vfu_ctx, VFU_DBG, "failed to close IRQ fd %d: %m", *irq_efd); } *irq_efd = -1; @@ -96,12 +97,12 @@ irqs_disable(lm_ctx_t *lm_ctx, uint32_t index) return 0; } - lm_log(lm_ctx, LM_DBG, "failed to disable IRQs"); + vfu_log(vfu_ctx, VFU_DBG, "failed to disable IRQs"); return -EINVAL; } static int -irqs_set_data_none(lm_ctx_t *lm_ctx, struct vfio_irq_set *irq_set) +irqs_set_data_none(vfu_ctx_t *vfu_ctx, struct vfio_irq_set *irq_set) { int efd; __u32 i; @@ -109,12 +110,13 @@ irqs_set_data_none(lm_ctx_t *lm_ctx, struct vfio_irq_set *irq_set) eventfd_t val; for (i = irq_set->start; i < (irq_set->start + irq_set->count); i++) { - efd = lm_ctx->irqs->efds[i]; + efd = vfu_ctx->irqs->efds[i]; if (efd >= 0) { val = 1; ret = eventfd_write(efd, val); if (ret == -1) { - lm_log(lm_ctx, LM_DBG, "IRQ: failed to set data to none: %m"); + vfu_log(vfu_ctx, VFU_DBG, + "IRQ: failed to set data to none: %m"); return -errno; } } @@ -124,7 +126,7 @@ irqs_set_data_none(lm_ctx_t *lm_ctx, struct vfio_irq_set *irq_set) } static int -irqs_set_data_bool(lm_ctx_t *lm_ctx, struct vfio_irq_set *irq_set, void *data) +irqs_set_data_bool(vfu_ctx_t *vfu_ctx, struct vfio_irq_set *irq_set, void *data) { uint8_t *d8; int efd; @@ -135,12 +137,13 @@ irqs_set_data_bool(lm_ctx_t *lm_ctx, struct vfio_irq_set *irq_set, void *data) assert(data != NULL); for (i = irq_set->start, d8 = data; i < (irq_set->start + irq_set->count); i++, d8++) { - efd = lm_ctx->irqs->efds[i]; + efd = vfu_ctx->irqs->efds[i]; if (efd >= 0 && *d8 == 1) { val = 1; ret = eventfd_write(efd, val); if (ret == -1) { - lm_log(lm_ctx, LM_DBG, "IRQ: failed to set data to bool: %m"); + vfu_log(vfu_ctx, VFU_DBG, + "IRQ: failed to set data to bool: %m"); return -errno; } } @@ -150,7 +153,8 @@ irqs_set_data_bool(lm_ctx_t *lm_ctx, struct vfio_irq_set *irq_set, void *data) } static int -irqs_set_data_eventfd(lm_ctx_t *lm_ctx, struct vfio_irq_set *irq_set, void *data) +irqs_set_data_eventfd(vfu_ctx_t *vfu_ctx, struct vfio_irq_set *irq_set, + void *data) { int32_t *d32; int efd; @@ -159,47 +163,47 @@ irqs_set_data_eventfd(lm_ctx_t *lm_ctx, struct vfio_irq_set *irq_set, void *data assert(data != NULL); for (i = irq_set->start, d32 = data; i < (irq_set->start + irq_set->count); i++, d32++) { - efd = lm_ctx->irqs->efds[i]; + efd = vfu_ctx->irqs->efds[i]; if (efd >= 0) { if (close(efd) == -1) { - lm_log(lm_ctx, LM_DBG, "failed to close IRQ fd %d: %m", efd); + vfu_log(vfu_ctx, VFU_DBG, "failed to close IRQ fd %d: %m", efd); } - lm_ctx->irqs->efds[i] = -1; + vfu_ctx->irqs->efds[i] = -1; } if (*d32 >= 0) { - lm_ctx->irqs->efds[i] = *d32; + vfu_ctx->irqs->efds[i] = *d32; } - lm_log(lm_ctx, LM_DBG, "event fd[%d]=%d", i, lm_ctx->irqs->efds[i]); + vfu_log(vfu_ctx, VFU_DBG, "event fd[%d]=%d", i, vfu_ctx->irqs->efds[i]); } return 0; } static long -irqs_trigger(lm_ctx_t *lm_ctx, struct vfio_irq_set *irq_set, void *data) +irqs_trigger(vfu_ctx_t *vfu_ctx, struct vfio_irq_set *irq_set, void *data) { int err = 0; - assert(lm_ctx != NULL); + assert(vfu_ctx != NULL); assert(irq_set != NULL); if (irq_set->count == 0) { - return irqs_disable(lm_ctx, irq_set->index); + return irqs_disable(vfu_ctx, irq_set->index); } - lm_log(lm_ctx, LM_DBG, "setting IRQ %s flags=%#x", - vfio_irq_idx_to_str(irq_set->index), irq_set->flags); + vfu_log(vfu_ctx, VFU_DBG, "setting IRQ %s flags=%#x", + vfio_irq_idx_to_str(irq_set->index), irq_set->flags); switch (irq_set->flags & VFIO_IRQ_SET_DATA_TYPE_MASK) { case VFIO_IRQ_SET_DATA_NONE: - err = irqs_set_data_none(lm_ctx, irq_set); + err = irqs_set_data_none(vfu_ctx, irq_set); break; case VFIO_IRQ_SET_DATA_BOOL: - err = irqs_set_data_bool(lm_ctx, irq_set, data); + err = irqs_set_data_bool(vfu_ctx, irq_set, data); break; case VFIO_IRQ_SET_DATA_EVENTFD: - err = irqs_set_data_eventfd(lm_ctx, irq_set, data); + err = irqs_set_data_eventfd(vfu_ctx, irq_set, data); break; } @@ -207,11 +211,11 @@ irqs_trigger(lm_ctx_t *lm_ctx, struct vfio_irq_set *irq_set, void *data) } static long -dev_set_irqs_validate(lm_ctx_t *lm_ctx, struct vfio_irq_set *irq_set) +dev_set_irqs_validate(vfu_ctx_t *vfu_ctx, struct vfio_irq_set *irq_set) { uint32_t a_type, d_type; - assert(lm_ctx != NULL); + assert(vfu_ctx != NULL); assert(irq_set != NULL); // Separate action and data types from flags. @@ -219,8 +223,8 @@ dev_set_irqs_validate(lm_ctx_t *lm_ctx, struct vfio_irq_set *irq_set) d_type = (irq_set->flags & VFIO_IRQ_SET_DATA_TYPE_MASK); // Ensure index is within bounds. - if (irq_set->index >= LM_DEV_NUM_IRQS) { - lm_log(lm_ctx, LM_DBG, "bad IRQ index %d\n", irq_set->index); + if (irq_set->index >= VFU_DEV_NUM_IRQS) { + vfu_log(vfu_ctx, VFU_DBG, "bad IRQ index %d\n", irq_set->index); return -EINVAL; } @@ -230,39 +234,39 @@ dev_set_irqs_validate(lm_ctx_t *lm_ctx, struct vfio_irq_set *irq_set) if ((a_type != VFIO_IRQ_SET_ACTION_MASK) && (a_type != VFIO_IRQ_SET_ACTION_UNMASK) && (a_type != VFIO_IRQ_SET_ACTION_TRIGGER)) { - lm_log(lm_ctx, LM_DBG, "bad IRQ action mask %d\n", a_type); + vfu_log(vfu_ctx, VFU_DBG, "bad IRQ action mask %d\n", a_type); return -EINVAL; } // Only one of NONE/BOOL/EVENTFD is valid. if ((d_type != VFIO_IRQ_SET_DATA_NONE) && (d_type != VFIO_IRQ_SET_DATA_BOOL) && (d_type != VFIO_IRQ_SET_DATA_EVENTFD)) { - lm_log(lm_ctx, LM_DBG, "bad IRQ data %d\n", d_type); + vfu_log(vfu_ctx, VFU_DBG, "bad IRQ data %d\n", d_type); return -EINVAL; } // Ensure irq_set's start and count are within bounds. - if ((irq_set->start >= lm_ctx->irq_count[irq_set->index]) || - (irq_set->start + irq_set->count > lm_ctx->irq_count[irq_set->index])) { - lm_log(lm_ctx, LM_DBG, "bad IRQ start/count\n"); + if ((irq_set->start >= vfu_ctx->irq_count[irq_set->index]) || + (irq_set->start + irq_set->count > vfu_ctx->irq_count[irq_set->index])) { + vfu_log(vfu_ctx, VFU_DBG, "bad IRQ start/count\n"); return -EINVAL; } // Only TRIGGER is valid for ERR/REQ. if (((irq_set->index == VFIO_PCI_ERR_IRQ_INDEX) || (irq_set->index == VFIO_PCI_REQ_IRQ_INDEX)) && (a_type != VFIO_IRQ_SET_ACTION_TRIGGER)) { - lm_log(lm_ctx, LM_DBG, "bad IRQ trigger w/o ERR/REQ\n"); + vfu_log(vfu_ctx, VFU_DBG, "bad IRQ trigger w/o ERR/REQ\n"); return -EINVAL; } // count == 0 is only valid with ACTION_TRIGGER and DATA_NONE. if ((irq_set->count == 0) && ((a_type != VFIO_IRQ_SET_ACTION_TRIGGER) || (d_type != VFIO_IRQ_SET_DATA_NONE))) { - lm_log(lm_ctx, LM_DBG, "bad IRQ count %d\n", irq_set->count); + vfu_log(vfu_ctx, VFU_DBG, "bad IRQ count %d\n", irq_set->count); return -EINVAL; } // If IRQs are set, ensure index matches what's enabled for the device. - if ((irq_set->count != 0) && (lm_ctx->irqs->type != IRQ_NONE) && - (irq_set->index != LM2VFIO_IRQT(lm_ctx->irqs->type))) { - lm_log(lm_ctx, LM_DBG, "bad IRQ index\n"); + if ((irq_set->count != 0) && (vfu_ctx->irqs->type != IRQ_NONE) && + (irq_set->index != LM2VFIO_IRQT(vfu_ctx->irqs->type))) { + vfu_log(vfu_ctx, VFU_DBG, "bad IRQ index\n"); return -EINVAL; } @@ -270,15 +274,15 @@ dev_set_irqs_validate(lm_ctx_t *lm_ctx, struct vfio_irq_set *irq_set) } static long -dev_set_irqs(lm_ctx_t *lm_ctx, struct vfio_irq_set *irq_set, void *data) +dev_set_irqs(vfu_ctx_t *vfu_ctx, struct vfio_irq_set *irq_set, void *data) { long ret; - assert(lm_ctx != NULL); + assert(vfu_ctx != NULL); assert(irq_set != NULL); // Ensure irq_set is valid. - ret = dev_set_irqs_validate(lm_ctx, irq_set); + ret = dev_set_irqs_validate(vfu_ctx, irq_set); if (ret != 0) { return ret; } @@ -290,37 +294,37 @@ dev_set_irqs(lm_ctx_t *lm_ctx, struct vfio_irq_set *irq_set, void *data) return 0; } - return irqs_trigger(lm_ctx, irq_set, data); + return irqs_trigger(vfu_ctx, irq_set, data); } static long -dev_get_irqinfo(lm_ctx_t *lm_ctx, struct vfio_irq_info *irq_info_in, +dev_get_irqinfo(vfu_ctx_t *vfu_ctx, struct vfio_irq_info *irq_info_in, struct vfio_irq_info *irq_info_out) { - assert(lm_ctx != NULL); + assert(vfu_ctx != NULL); assert(irq_info_in != NULL); assert(irq_info_out != NULL); // Ensure provided argsz is sufficiently big and index is within bounds. if ((irq_info_in->argsz < sizeof(struct vfio_irq_info)) || - (irq_info_in->index >= LM_DEV_NUM_IRQS)) { - lm_log(lm_ctx, LM_DBG, "bad irq_info (size=%d index=%d)\n", - irq_info_in->argsz, irq_info_in->index); + (irq_info_in->index >= VFU_DEV_NUM_IRQS)) { + vfu_log(vfu_ctx, VFU_DBG, "bad irq_info (size=%d index=%d)\n", + irq_info_in->argsz, irq_info_in->index); return -EINVAL; } - irq_info_out->count = lm_ctx->irq_count[irq_info_in->index]; + irq_info_out->count = vfu_ctx->irq_count[irq_info_in->index]; irq_info_out->flags = VFIO_IRQ_INFO_EVENTFD; return 0; } int -handle_device_get_irq_info(lm_ctx_t *lm_ctx, uint32_t size, +handle_device_get_irq_info(vfu_ctx_t *vfu_ctx, uint32_t size, struct vfio_irq_info *irq_info_in, struct vfio_irq_info *irq_info_out) { - assert(lm_ctx != NULL); + assert(vfu_ctx != NULL); assert(irq_info_in != NULL); assert(irq_info_out != NULL); @@ -328,16 +332,16 @@ handle_device_get_irq_info(lm_ctx_t *lm_ctx, uint32_t size, return -EINVAL; } - return dev_get_irqinfo(lm_ctx, irq_info_in, irq_info_out); + return dev_get_irqinfo(vfu_ctx, irq_info_in, irq_info_out); } int -handle_device_set_irqs(lm_ctx_t *lm_ctx, uint32_t size, +handle_device_set_irqs(vfu_ctx_t *vfu_ctx, uint32_t size, int *fds, int nr_fds, struct vfio_irq_set *irq_set) { void *data = NULL; - assert(lm_ctx != NULL); + assert(vfu_ctx != NULL); assert(irq_set != NULL); if (size < sizeof *irq_set || size != irq_set->argsz) { @@ -359,19 +363,19 @@ handle_device_set_irqs(lm_ctx_t *lm_ctx, uint32_t size, return -EINVAL; } - return dev_set_irqs(lm_ctx, irq_set, data); + return dev_set_irqs(vfu_ctx, irq_set, data); } -static int validate_irq_subindex(lm_ctx_t *lm_ctx, uint32_t subindex) +static int validate_irq_subindex(vfu_ctx_t *vfu_ctx, uint32_t subindex) { - if (lm_ctx == NULL) { + if (vfu_ctx == NULL) { errno = EINVAL; return -1; } - if ((subindex >= lm_ctx->irqs->max_ivs)) { - lm_log(lm_ctx, LM_ERR, "bad IRQ %d, max=%d\n", subindex, - lm_ctx->irqs->max_ivs); + if ((subindex >= vfu_ctx->irqs->max_ivs)) { + vfu_log(vfu_ctx, VFU_ERR, "bad IRQ %d, max=%d\n", subindex, + vfu_ctx->irqs->max_ivs); /* FIXME should return -errno */ errno = EINVAL; return -1; @@ -381,42 +385,42 @@ static int validate_irq_subindex(lm_ctx_t *lm_ctx, uint32_t subindex) } int -lm_irq_trigger(lm_ctx_t *lm_ctx, uint32_t subindex) +vfu_irq_trigger(vfu_ctx_t *vfu_ctx, uint32_t subindex) { int ret; eventfd_t val = 1; - ret = validate_irq_subindex(lm_ctx, subindex); + ret = validate_irq_subindex(vfu_ctx, subindex); if (ret < 0) { return ret; } - if (lm_ctx->irqs->efds[subindex] == -1) { - lm_log(lm_ctx, LM_ERR, "no fd for interrupt %d\n", subindex); + if (vfu_ctx->irqs->efds[subindex] == -1) { + vfu_log(vfu_ctx, VFU_ERR, "no fd for interrupt %d\n", subindex); /* FIXME should return -errno */ errno = ENOENT; return -1; } - return eventfd_write(lm_ctx->irqs->efds[subindex], val); + return eventfd_write(vfu_ctx->irqs->efds[subindex], val); } int -lm_irq_message(lm_ctx_t *lm_ctx, uint32_t subindex) +vfu_irq_message(vfu_ctx_t *vfu_ctx, uint32_t subindex) { int ret, msg_id = 1; struct vfio_user_irq_info irq_info; - ret = validate_irq_subindex(lm_ctx, subindex); + ret = validate_irq_subindex(vfu_ctx, subindex); if (ret < 0) { return -1; } irq_info.subindex = subindex; - ret = vfio_user_msg(lm_ctx->conn_fd, msg_id, - VFIO_USER_VM_INTERRUPT, - &irq_info, sizeof irq_info, - NULL, NULL, 0); + ret = vfu_msg(vfu_ctx->conn_fd, msg_id, + VFIO_USER_VM_INTERRUPT, + &irq_info, sizeof irq_info, + NULL, NULL, 0); if (ret < 0) { /* FIXME should return -errno */ errno = -ret; @@ -30,19 +30,19 @@ * */ -#ifndef LIB_MUSER_IRQ_H -#define LIB_MUSER_IRQ_H +#ifndef LIB_VFIO_USER_IRQ_H +#define LIB_VFIO_USER_IRQ_H -#include "muser_priv.h" +#include "private.h" int -handle_device_get_irq_info(lm_ctx_t *lm_ctx, uint32_t size, +handle_device_get_irq_info(vfu_ctx_t *vfu_ctx, uint32_t size, struct vfio_irq_info *irq_info_in, struct vfio_irq_info *irq_info_out); int -handle_device_set_irqs(lm_ctx_t *lm_ctx, uint32_t size, +handle_device_set_irqs(vfu_ctx_t *vfu_ctx, uint32_t size, int *fds, int nr_fds, struct vfio_irq_set *irq_set); -#endif /* LIB_MUSER_IRQ_H */ +#endif /* LIB_VFIO_USER_IRQ_H */ /* ex: set tabstop=4 shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/lib/muser_ctx.c b/lib/libvfio-user.c index d80e952..2676362 100644 --- a/lib/muser_ctx.c +++ b/lib/libvfio-user.c @@ -51,30 +51,30 @@ #include "cap.h" #include "dma.h" -#include "muser.h" -#include "muser_priv.h" +#include "libvfio-user.h" +#include "private.h" #include "tran_sock.h" #include "migration.h" #include "irq.h" void -lm_log(lm_ctx_t *lm_ctx, lm_log_lvl_t lvl, const char *fmt, ...) +vfu_log(vfu_ctx_t *vfu_ctx, vfu_log_lvl_t lvl, const char *fmt, ...) { va_list ap; char buf[BUFSIZ]; int _errno = errno; - assert(lm_ctx != NULL); + assert(vfu_ctx != NULL); - if (lm_ctx->log == NULL || lvl > lm_ctx->log_lvl || fmt == NULL) { + if (vfu_ctx->log == NULL || lvl > vfu_ctx->log_lvl || fmt == NULL) { return; } va_start(ap, fmt); vsnprintf(buf, sizeof buf, fmt, ap); va_end(ap); - lm_ctx->log(lm_ctx->pvt, lvl, buf); + vfu_ctx->log(vfu_ctx->pvt, lvl, buf); errno = _errno; } @@ -85,7 +85,7 @@ static inline int ERROR(int err) } static size_t -get_vfio_caps_size(bool is_migr_reg, struct lm_sparse_mmap_areas *m) +get_vfio_caps_size(bool is_migr_reg, struct vfu_sparse_mmap_areas *m) { size_t type_size = 0; size_t sparse_size = 0; @@ -108,15 +108,15 @@ get_vfio_caps_size(bool is_migr_reg, struct lm_sparse_mmap_areas *m) * points accordingly. */ static void -dev_get_caps(lm_ctx_t *lm_ctx, lm_reg_info_t *lm_reg, bool is_migr_reg, +dev_get_caps(vfu_ctx_t *vfu_ctx, vfu_reg_info_t *vfu_reg, bool is_migr_reg, struct vfio_region_info *vfio_reg) { struct vfio_info_cap_header *header; struct vfio_region_info_cap_type *type = NULL; struct vfio_region_info_cap_sparse_mmap *sparse = NULL; - struct lm_sparse_mmap_areas *mmap_areas; + struct vfu_sparse_mmap_areas *mmap_areas; - assert(lm_ctx != NULL); + assert(vfu_ctx != NULL); assert(vfio_reg != NULL); header = (struct vfio_info_cap_header*)(vfio_reg + 1); @@ -125,14 +125,14 @@ dev_get_caps(lm_ctx_t *lm_ctx, lm_reg_info_t *lm_reg, bool is_migr_reg, type = (struct vfio_region_info_cap_type*)header; type->header.id = VFIO_REGION_INFO_CAP_TYPE; type->header.version = 1; - type->header.next = 0; - type->type = VFIO_REGION_TYPE_MIGRATION; + type->header.next = 0; + type->type = VFIO_REGION_TYPE_MIGRATION; type->subtype = VFIO_REGION_SUBTYPE_MIGRATION; vfio_reg->cap_offset = sizeof(struct vfio_region_info); } - if (lm_reg->mmap_areas != NULL) { - int i, nr_mmap_areas = lm_reg->mmap_areas->nr_mmap_areas; + if (vfu_reg->mmap_areas != NULL) { + int i, nr_mmap_areas = vfu_reg->mmap_areas->nr_mmap_areas; if (type != NULL) { type->header.next = vfio_reg->cap_offset + sizeof(struct vfio_region_info_cap_type); sparse = (struct vfio_region_info_cap_sparse_mmap*)(type + 1); @@ -145,13 +145,13 @@ dev_get_caps(lm_ctx_t *lm_ctx, lm_reg_info_t *lm_reg, bool is_migr_reg, sparse->header.next = 0; sparse->nr_areas = nr_mmap_areas; - mmap_areas = lm_reg->mmap_areas; + mmap_areas = vfu_reg->mmap_areas; for (i = 0; i < nr_mmap_areas; i++) { sparse->areas[i].offset = mmap_areas->areas[i].start; sparse->areas[i].size = mmap_areas->areas[i].size; - lm_log(lm_ctx, LM_DBG, "%s: area %d %#llx-%#llx", __func__, - i, sparse->areas[i].offset, - sparse->areas[i].offset + sparse->areas[i].size); + vfu_log(vfu_ctx, VFU_DBG, "%s: area %d %#llx-%#llx", __func__, + i, sparse->areas[i].offset, + sparse->areas[i].offset + sparse->areas[i].size); } } @@ -162,22 +162,22 @@ dev_get_caps(lm_ctx_t *lm_ctx, lm_reg_info_t *lm_reg, bool is_migr_reg, vfio_reg->flags |= VFIO_REGION_INFO_FLAG_MMAP | VFIO_REGION_INFO_FLAG_CAPS; } -#define LM_REGION_SHIFT 40 -#define LM_REGION_MASK ((1ULL << LM_REGION_SHIFT) - 1) +#define VFU_REGION_SHIFT 40 +#define VFU_REGION_MASK ((1ULL << VFU_REGION_SHIFT) - 1) uint64_t region_to_offset(uint32_t region) { - return (uint64_t)region << LM_REGION_SHIFT; + return (uint64_t)region << VFU_REGION_SHIFT; } uint32_t offset_to_region(uint64_t offset) { - return (offset >> LM_REGION_SHIFT) & LM_REGION_MASK; + return (offset >> VFU_REGION_SHIFT) & VFU_REGION_MASK; } -#ifdef LM_VERBOSE_LOGGING +#ifdef VFU_VERBOSE_LOGGING void dump_buffer(const char *prefix, const char *buf, uint32_t count) { @@ -206,30 +206,31 @@ dump_buffer(const char *prefix, const char *buf, uint32_t count) #endif static bool -is_migr_reg(lm_ctx_t *lm_ctx, int index) +is_migr_reg(vfu_ctx_t *vfu_ctx, int index) { - return &lm_ctx->reg_info[index] == lm_ctx->migr_reg; + return &vfu_ctx->reg_info[index] == vfu_ctx->migr_reg; } static long -dev_get_reginfo(lm_ctx_t *lm_ctx, uint32_t index, +dev_get_reginfo(vfu_ctx_t *vfu_ctx, uint32_t index, struct vfio_region_info **vfio_reg) { - lm_reg_info_t *lm_reg; + vfu_reg_info_t *vfu_reg; size_t caps_size; uint32_t argsz; - assert(lm_ctx != NULL); + assert(vfu_ctx != NULL); assert(vfio_reg != NULL); - lm_reg = &lm_ctx->reg_info[index]; + vfu_reg = &vfu_ctx->reg_info[index]; - if (index >= lm_ctx->nr_regions) { - lm_log(lm_ctx, LM_DBG, "bad region index %d", index); + if (index >= vfu_ctx->nr_regions) { + vfu_log(vfu_ctx, VFU_DBG, "bad region index %d", index); return -EINVAL; } - caps_size = get_vfio_caps_size(is_migr_reg(lm_ctx, index), lm_reg->mmap_areas); + caps_size = get_vfio_caps_size(is_migr_reg(vfu_ctx, index), + vfu_reg->mmap_areas); argsz = caps_size + sizeof(struct vfio_region_info); *vfio_reg = calloc(1, argsz); if (!*vfio_reg) { @@ -237,25 +238,25 @@ dev_get_reginfo(lm_ctx_t *lm_ctx, uint32_t index, } /* FIXME document in the protocol that vfio_req->argsz is ignored */ (*vfio_reg)->argsz = argsz; - (*vfio_reg)->flags = lm_reg->flags; + (*vfio_reg)->flags = vfu_reg->flags; (*vfio_reg)->index = index; (*vfio_reg)->offset = region_to_offset((*vfio_reg)->index); - (*vfio_reg)->size = lm_reg->size; + (*vfio_reg)->size = vfu_reg->size; if (caps_size > 0) { - dev_get_caps(lm_ctx, lm_reg, is_migr_reg(lm_ctx, index), *vfio_reg); + dev_get_caps(vfu_ctx, vfu_reg, is_migr_reg(vfu_ctx, index), *vfio_reg); } - lm_log(lm_ctx, LM_DBG, "region_info[%d] offset %#llx flags %#x size %llu " - "argsz %u", - (*vfio_reg)->index, (*vfio_reg)->offset, (*vfio_reg)->flags, - (*vfio_reg)->size, (*vfio_reg)->argsz); + vfu_log(vfu_ctx, VFU_DBG, "region_info[%d] offset %#llx flags %#x size %llu " + "argsz %u", + (*vfio_reg)->index, (*vfio_reg)->offset, (*vfio_reg)->flags, + (*vfio_reg)->size, (*vfio_reg)->argsz); return 0; } int -lm_get_region(loff_t pos, size_t count, loff_t *off) +vfu_get_region(loff_t pos, size_t count, loff_t *off) { int r; @@ -271,73 +272,73 @@ lm_get_region(loff_t pos, size_t count, loff_t *off) } static uint32_t -region_size(lm_ctx_t *lm_ctx, int region) +region_size(vfu_ctx_t *vfu_ctx, int region) { - assert(region >= LM_PCI_DEV_BAR0_REGION_IDX && region <= LM_PCI_DEV_VGA_REGION_IDX); - return lm_ctx->reg_info[region].size; + assert(region >= VFU_PCI_DEV_BAR0_REGION_IDX && region <= VFU_PCI_DEV_VGA_REGION_IDX); + return vfu_ctx->reg_info[region].size; } static uint32_t -pci_config_space_size(lm_ctx_t *lm_ctx) +pci_config_space_size(vfu_ctx_t *vfu_ctx) { - return region_size(lm_ctx, LM_PCI_DEV_CFG_REGION_IDX); + return region_size(vfu_ctx, VFU_PCI_DEV_CFG_REGION_IDX); } static ssize_t -handle_pci_config_space_access(lm_ctx_t *lm_ctx, char *buf, size_t count, +handle_pci_config_space_access(vfu_ctx_t *vfu_ctx, char *buf, size_t count, loff_t pos, bool is_write) { int ret; - count = MIN(pci_config_space_size(lm_ctx), count); + count = MIN(pci_config_space_size(vfu_ctx), count); if (is_write) { - ret = cap_maybe_access(lm_ctx, lm_ctx->caps, buf, count, pos); + ret = cap_maybe_access(vfu_ctx, vfu_ctx->caps, buf, count, pos); if (ret < 0) { - lm_log(lm_ctx, LM_ERR, "bad access to capabilities %#lx-%#lx\n", - pos, pos + count); + vfu_log(vfu_ctx, VFU_ERR, "bad access to capabilities %#lx-%#lx\n", + pos, pos + count); return ret; } } else { - memcpy(buf, lm_ctx->pci_config_space->raw + pos, count); + memcpy(buf, vfu_ctx->pci_config_space->raw + pos, count); } return count; } static ssize_t -do_access(lm_ctx_t *lm_ctx, char *buf, uint8_t count, uint64_t pos, bool is_write) +do_access(vfu_ctx_t *vfu_ctx, char *buf, uint8_t count, uint64_t pos, bool is_write) { int idx; loff_t offset; - assert(lm_ctx != NULL); + assert(vfu_ctx != NULL); assert(buf != NULL); assert(count == 1 || count == 2 || count == 4 || count == 8); - idx = lm_get_region(pos, count, &offset); + idx = vfu_get_region(pos, count, &offset); if (idx < 0) { - lm_log(lm_ctx, LM_ERR, "invalid region %d", idx); + vfu_log(vfu_ctx, VFU_ERR, "invalid region %d", idx); return idx; } - if (idx < 0 || idx >= (int)lm_ctx->nr_regions) { - lm_log(lm_ctx, LM_ERR, "bad region %d", idx); + if (idx < 0 || idx >= (int)vfu_ctx->nr_regions) { + vfu_log(vfu_ctx, VFU_ERR, "bad region %d", idx); return -EINVAL; } - if (idx == LM_PCI_DEV_CFG_REGION_IDX) { - return handle_pci_config_space_access(lm_ctx, buf, count, offset, + if (idx == VFU_PCI_DEV_CFG_REGION_IDX) { + return handle_pci_config_space_access(vfu_ctx, buf, count, offset, is_write); } - if (is_migr_reg(lm_ctx, idx)) { - if (offset + count > lm_ctx->reg_info[idx].size) { - lm_log(lm_ctx, LM_ERR, "read %#lx-%#lx past end of migration region (%#x)", - offset, offset + count - 1, - lm_ctx->reg_info[idx].size); + if (is_migr_reg(vfu_ctx, idx)) { + if (offset + count > vfu_ctx->reg_info[idx].size) { + vfu_log(vfu_ctx, VFU_ERR, "read %#lx-%#lx past end of migration region (%#x)", + offset, offset + count - 1, + vfu_ctx->reg_info[idx].size); return -EINVAL; } - return handle_migration_region_access(lm_ctx, lm_ctx->pvt, - lm_ctx->migration, + return handle_migration_region_access(vfu_ctx, vfu_ctx->pvt, + vfu_ctx->migration, buf, count, offset, is_write); } @@ -345,14 +346,14 @@ do_access(lm_ctx_t *lm_ctx, char *buf, uint8_t count, uint64_t pos, bool is_writ * Checking whether a callback exists might sound expensive however this * code is not performance critical. This works well when we don't expect a * region to be used, so the user of the library can simply leave the - * callback NULL in lm_create_ctx. + * callback NULL in vfu_create_ctx. */ - if (lm_ctx->reg_info[idx].fn != NULL) { - return lm_ctx->reg_info[idx].fn(lm_ctx->pvt, buf, count, offset, - is_write); + if (vfu_ctx->reg_info[idx].fn != NULL) { + return vfu_ctx->reg_info[idx].fn(vfu_ctx->pvt, buf, count, offset, + is_write); } - lm_log(lm_ctx, LM_ERR, "no callback for region %d", idx); + vfu_log(vfu_ctx, VFU_ERR, "no callback for region %d", idx); return -EINVAL; } @@ -361,19 +362,19 @@ do_access(lm_ctx_t *lm_ctx, char *buf, uint8_t count, uint64_t pos, bool is_writ * Returns the number of bytes processed on success or a negative number on * error. * - * TODO function name same lm_access_t, fix + * TODO function naming, general cleanup of access path * FIXME we must be able to return values up to uint32_t bit, or negative on * error. Better to make return value an int and return the number of bytes * processed via an argument. */ -ssize_t -lm_access(lm_ctx_t *lm_ctx, char *buf, uint32_t count, uint64_t *ppos, +static ssize_t +_vfu_access(vfu_ctx_t *vfu_ctx, char *buf, uint32_t count, uint64_t *ppos, bool is_write) { uint32_t done = 0; int ret; - assert(lm_ctx != NULL); + assert(vfu_ctx != NULL); /* buf and ppos can be NULL if count is 0 */ while (count) { @@ -394,18 +395,18 @@ lm_access(lm_ctx_t *lm_ctx, char *buf, uint32_t count, uint64_t *ppos, } else { size = 1; } - ret = do_access(lm_ctx, buf, size, *ppos, is_write); + ret = do_access(vfu_ctx, buf, size, *ppos, is_write); if (ret <= 0) { - lm_log(lm_ctx, LM_ERR, "failed to %s %#lx-%#lx: %s", - is_write ? "write to" : "read from", *ppos, *ppos + size - 1, - strerror(-ret)); + vfu_log(vfu_ctx, VFU_ERR, "failed to %s %#lx-%#lx: %s", + is_write ? "write to" : "read from", *ppos, *ppos + size - 1, + strerror(-ret)); /* * TODO if ret < 0 then it might contain a legitimate error code, why replace it with EFAULT? */ return -EFAULT; } if (ret != (int)size) { - lm_log(lm_ctx, LM_DBG, "bad read %d != %ld", ret, size); + vfu_log(vfu_ctx, VFU_DBG, "bad read %d != %ld", ret, size); } count -= size; done += size; @@ -416,45 +417,45 @@ lm_access(lm_ctx_t *lm_ctx, char *buf, uint32_t count, uint64_t *ppos, } static inline int -muser_access(lm_ctx_t *lm_ctx, bool is_write, char *rwbuf, uint32_t count, +vfu_access(vfu_ctx_t *vfu_ctx, bool is_write, char *rwbuf, uint32_t count, uint64_t *pos) { uint32_t processed = 0, _count; int ret; - assert(lm_ctx != NULL); + assert(vfu_ctx != NULL); assert(rwbuf != NULL); assert(pos != NULL); - lm_log(lm_ctx, LM_DBG, "%s %#lx-%#lx", is_write ? "W" : "R", *pos, - *pos + count - 1); + vfu_log(vfu_ctx, VFU_DBG, "%s %#lx-%#lx", is_write ? "W" : "R", *pos, + *pos + count - 1); -#ifdef LM_VERBOSE_LOGGING +#ifdef VFU_VERBOSE_LOGGING if (is_write) { dump_buffer("buffer write", rwbuf, count); } #endif _count = count; - ret = muser_pci_hdr_access(lm_ctx, &_count, pos, is_write, rwbuf); + ret = vfu_pci_hdr_access(vfu_ctx, &_count, pos, is_write, rwbuf); if (ret != 0) { /* FIXME shouldn't we fail here? */ - lm_log(lm_ctx, LM_ERR, "failed to access PCI header: %s", - strerror(-ret)); -#ifdef LM_VERBOSE_LOGGING + vfu_log(vfu_ctx, VFU_ERR, "failed to access PCI header: %s", + strerror(-ret)); +#ifdef VFU_VERBOSE_LOGGING dump_buffer("buffer write", rwbuf, _count); #endif } /* - * count is how much has been processed by muser_pci_hdr_access, - * _count is how much there's left to be processed by lm_access + * count is how much has been processed by vfu_pci_hdr_access, + * _count is how much there's left to be processed by vfu_access */ processed = count - _count; - ret = lm_access(lm_ctx, rwbuf + processed, _count, pos, is_write); + ret = _vfu_access(vfu_ctx, rwbuf + processed, _count, pos, is_write); if (ret >= 0) { ret += processed; -#ifdef LM_VERBOSE_LOGGING +#ifdef VFU_VERBOSE_LOGGING if (!is_write && err == ret) { dump_buffer("buffer read", rwbuf, ret); } @@ -466,7 +467,7 @@ muser_access(lm_ctx_t *lm_ctx, bool is_write, char *rwbuf, uint32_t count, /* TODO merge with dev_get_reginfo */ static int -handle_device_get_region_info(lm_ctx_t *lm_ctx, uint32_t size, +handle_device_get_region_info(vfu_ctx_t *vfu_ctx, uint32_t size, struct vfio_region_info *reg_info_in, struct vfio_region_info **reg_info_out) { @@ -474,14 +475,14 @@ handle_device_get_region_info(lm_ctx_t *lm_ctx, uint32_t size, return -EINVAL; } - return dev_get_reginfo(lm_ctx, reg_info_in->index, reg_info_out); + return dev_get_reginfo(vfu_ctx, reg_info_in->index, reg_info_out); } static int -handle_device_get_info(lm_ctx_t *lm_ctx, uint32_t size, +handle_device_get_info(vfu_ctx_t *vfu_ctx, uint32_t size, struct vfio_device_info *dev_info) { - assert(lm_ctx != NULL); + assert(vfu_ctx != NULL); assert(dev_info != NULL); if (size != sizeof *dev_info) { @@ -490,11 +491,11 @@ handle_device_get_info(lm_ctx_t *lm_ctx, uint32_t size, dev_info->argsz = sizeof *dev_info; dev_info->flags = VFIO_DEVICE_FLAGS_PCI | VFIO_DEVICE_FLAGS_RESET; - dev_info->num_regions = lm_ctx->nr_regions; - dev_info->num_irqs = LM_DEV_NUM_IRQS; + dev_info->num_regions = vfu_ctx->nr_regions; + dev_info->num_irqs = VFU_DEV_NUM_IRQS; - lm_log(lm_ctx, LM_DBG, "sent devinfo flags %#x, num_regions %d, num_irqs" - " %d", dev_info->flags, dev_info->num_regions, dev_info->num_irqs); + vfu_log(vfu_ctx, VFU_DBG, "sent devinfo flags %#x, num_regions %d, num_irqs" + " %d", dev_info->flags, dev_info->num_regions, dev_info->num_irqs); return 0; } @@ -502,7 +503,7 @@ handle_device_get_info(lm_ctx_t *lm_ctx, uint32_t size, /* * Handles a DMA map/unmap request. * - * @lm_ctx: LM context + * @vfu_ctx: LM context * @size: size, in bytes, of the memory pointed to be @dma_regions * @map: whether this is a DMA map operation * @fds: array of file descriptors. It's length must equal the number of DMA @@ -514,22 +515,22 @@ handle_device_get_info(lm_ctx_t *lm_ctx, uint32_t size, * @returns 0 on success, -errno on failure. */ int -handle_dma_map_or_unmap(lm_ctx_t *lm_ctx, uint32_t size, bool map, +handle_dma_map_or_unmap(vfu_ctx_t *vfu_ctx, uint32_t size, bool map, int *fds, int nr_fds, struct vfio_user_dma_region *dma_regions) { int nr_dma_regions; int ret, i, fdi; - assert(lm_ctx != NULL); + assert(vfu_ctx != NULL); assert(fds != NULL); - if (lm_ctx->dma == NULL) { + if (vfu_ctx->dma == NULL) { return 0; } if (size % sizeof(struct vfio_user_dma_region) != 0) { - lm_log(lm_ctx, LM_ERR, "bad size of DMA regions %d", size); + vfu_log(vfu_ctx, VFU_ERR, "bad size of DMA regions %d", size); return -EINVAL; } @@ -545,93 +546,94 @@ handle_dma_map_or_unmap(lm_ctx_t *lm_ctx, uint32_t size, bool map, fd = fds[fdi++]; } - ret = dma_controller_add_region(lm_ctx->dma, + ret = dma_controller_add_region(vfu_ctx->dma, dma_regions[i].addr, dma_regions[i].size, fd, dma_regions[i].offset); if (ret < 0) { - lm_log(lm_ctx, LM_INF, - "failed to add DMA region %#lx-%#lx offset=%#lx fd=%d: %s", - dma_regions[i].addr, - dma_regions[i].addr + dma_regions[i].size - 1, - dma_regions[i].offset, fd, - strerror(-ret)); + vfu_log(vfu_ctx, VFU_INF, + "failed to add DMA region %#lx-%#lx offset=%#lx fd=%d: %s", + dma_regions[i].addr, + dma_regions[i].addr + dma_regions[i].size - 1, + dma_regions[i].offset, fd, + strerror(-ret)); } else { - lm_log(lm_ctx, LM_DBG, - "added DMA region %#lx-%#lx offset=%#lx fd=%d", - dma_regions[i].addr, - dma_regions[i].addr + dma_regions[i].size - 1, - dma_regions[i].offset, fd); + vfu_log(vfu_ctx, VFU_DBG, + "added DMA region %#lx-%#lx offset=%#lx fd=%d", + dma_regions[i].addr, + dma_regions[i].addr + dma_regions[i].size - 1, + dma_regions[i].offset, fd); } } else { - ret = dma_controller_remove_region(lm_ctx->dma, + ret = dma_controller_remove_region(vfu_ctx->dma, dma_regions[i].addr, dma_regions[i].size, - lm_ctx->unmap_dma, lm_ctx->pvt); + vfu_ctx->unmap_dma, vfu_ctx->pvt); if (ret < 0) { - lm_log(lm_ctx, LM_INF, - "failed to remove DMA region %#lx-%#lx: %s", - dma_regions[i].addr, - dma_regions[i].addr + dma_regions[i].size - 1, - strerror(-ret)); + vfu_log(vfu_ctx, VFU_INF, + "failed to remove DMA region %#lx-%#lx: %s", + dma_regions[i].addr, + dma_regions[i].addr + dma_regions[i].size - 1, + strerror(-ret)); } else { - lm_log(lm_ctx, LM_DBG, - "removed DMA region %#lx-%#lx", - dma_regions[i].addr, - dma_regions[i].addr + dma_regions[i].size - 1); + vfu_log(vfu_ctx, VFU_DBG, + "removed DMA region %#lx-%#lx", + dma_regions[i].addr, + dma_regions[i].addr + dma_regions[i].size - 1); } } if (ret < 0) { return ret; } - if (lm_ctx->map_dma != NULL) { - lm_ctx->map_dma(lm_ctx->pvt, dma_regions[i].addr, dma_regions[i].size); + if (vfu_ctx->map_dma != NULL) { + vfu_ctx->map_dma(vfu_ctx->pvt, dma_regions[i].addr, + dma_regions[i].size); } } return 0; } static int -handle_device_reset(lm_ctx_t *lm_ctx) +handle_device_reset(vfu_ctx_t *vfu_ctx) { - lm_log(lm_ctx, LM_DBG, "Device reset called by client"); - if (lm_ctx->reset != NULL) { - return lm_ctx->reset(lm_ctx->pvt); + vfu_log(vfu_ctx, VFU_DBG, "Device reset called by client"); + if (vfu_ctx->reset != NULL) { + return vfu_ctx->reset(vfu_ctx->pvt); } return 0; } static int -validate_region_access(lm_ctx_t *lm_ctx, uint32_t size, uint16_t cmd, +validate_region_access(vfu_ctx_t *vfu_ctx, uint32_t size, uint16_t cmd, struct vfio_user_region_access *region_access) { assert(region_access != NULL); if (size < sizeof *region_access) { - lm_log(lm_ctx, LM_ERR, "message size too small (%d)", size); + vfu_log(vfu_ctx, VFU_ERR, "message size too small (%d)", size); return -EINVAL; } - if (region_access->region > lm_ctx->nr_regions || region_access->count <= 0) { - lm_log(lm_ctx, LM_ERR, "bad region %d and/or count %d", - region_access->region, region_access->count); + if (region_access->region > vfu_ctx->nr_regions || region_access->count <= 0) { + vfu_log(vfu_ctx, VFU_ERR, "bad region %d and/or count %d", + region_access->region, region_access->count); return -EINVAL; } - if (device_is_stopped_and_copying(lm_ctx->migration) && - !is_migr_reg(lm_ctx, region_access->region)) { - lm_log(lm_ctx, LM_ERR, - "cannot access region %d while device in stop-and-copy state", - region_access->region); + if (device_is_stopped_and_copying(vfu_ctx->migration) && + !is_migr_reg(vfu_ctx, region_access->region)) { + vfu_log(vfu_ctx, VFU_ERR, + "cannot access region %d while device in stop-and-copy state", + region_access->region); return -EINVAL; } if (cmd == VFIO_USER_REGION_WRITE && size - sizeof *region_access != region_access->count) { - lm_log(lm_ctx, LM_ERR, "bad region access, expected %lu, actual %d", - size - sizeof *region_access, region_access->count); + vfu_log(vfu_ctx, VFU_ERR, "bad region access, expected %lu, actual %d", + size - sizeof *region_access, region_access->count); return -EINVAL; } @@ -639,7 +641,7 @@ validate_region_access(lm_ctx_t *lm_ctx, uint32_t size, uint16_t cmd, } static int -handle_region_access(lm_ctx_t *lm_ctx, uint32_t size, uint16_t cmd, +handle_region_access(vfu_ctx_t *vfu_ctx, uint32_t size, uint16_t cmd, void **data, size_t *len, struct vfio_user_region_access *region_access) { @@ -647,11 +649,11 @@ handle_region_access(lm_ctx_t *lm_ctx, uint32_t size, uint16_t cmd, int ret; char *buf; - assert(lm_ctx != NULL); + assert(vfu_ctx != NULL); assert(data != NULL); assert(region_access != NULL); - ret = validate_region_access(lm_ctx, size, cmd, region_access); + ret = validate_region_access(vfu_ctx, size, cmd, region_access); if (ret < 0) { return ret; } @@ -673,13 +675,12 @@ handle_region_access(lm_ctx_t *lm_ctx, uint32_t size, uint16_t cmd, count = region_access->count; offset = region_to_offset(region_access->region) + region_access->offset; - ret = muser_access(lm_ctx, cmd == VFIO_USER_REGION_WRITE, - buf, count, &offset); + ret = vfu_access(vfu_ctx, cmd == VFIO_USER_REGION_WRITE, buf, count, &offset); if (ret != (int)region_access->count) { - lm_log(lm_ctx, LM_ERR, "failed to %s %#x-%#lx: %d", - cmd == VFIO_USER_REGION_WRITE ? "write" : "read", - region_access->count, - region_access->offset + region_access->count - 1, ret); + vfu_log(vfu_ctx, VFU_ERR, "failed to %s %#x-%#lx: %d", + cmd == VFIO_USER_REGION_WRITE ? "write" : "read", + region_access->count, + region_access->offset + region_access->count - 1, ret); /* FIXME we should return whatever has been accessed, not an error */ if (ret >= 0) { ret = -EINVAL; @@ -694,7 +695,7 @@ handle_region_access(lm_ctx_t *lm_ctx, uint32_t size, uint16_t cmd, } static int -handle_dirty_pages_get(lm_ctx_t *lm_ctx, +handle_dirty_pages_get(vfu_ctx_t *vfu_ctx, struct iovec **iovecs, size_t *nr_iovecs, struct vfio_iommu_type1_dirty_bitmap_get *ranges, uint32_t size) @@ -702,7 +703,7 @@ handle_dirty_pages_get(lm_ctx_t *lm_ctx, int ret = -EINVAL; size_t i; - assert(lm_ctx != NULL); + assert(vfu_ctx != NULL); assert(iovecs != NULL); assert(nr_iovecs != NULL); assert(ranges != NULL); @@ -715,10 +716,10 @@ handle_dirty_pages_get(lm_ctx_t *lm_ctx, if (*iovecs == NULL) { return -ENOMEM; } - + for (i = 1; i < *nr_iovecs; i++) { struct vfio_iommu_type1_dirty_bitmap_get *r = &ranges[(i - 1)]; /* FIXME ugly indexing */ - ret = dma_controller_dirty_page_get(lm_ctx->dma, r->iova, r->size, + ret = dma_controller_dirty_page_get(vfu_ctx->dma, r->iova, r->size, r->bitmap.pgsize, r->bitmap.size, (char**)&((*iovecs)[i].iov_base)); if (ret != 0) { @@ -737,33 +738,33 @@ out: } static int -handle_dirty_pages(lm_ctx_t *lm_ctx, uint32_t size, +handle_dirty_pages(vfu_ctx_t *vfu_ctx, uint32_t size, struct iovec **iovecs, size_t *nr_iovecs, struct vfio_iommu_type1_dirty_bitmap *dirty_bitmap) { int ret; - assert(lm_ctx != NULL); + assert(vfu_ctx != NULL); assert(iovecs != NULL); assert(nr_iovecs != NULL); assert(dirty_bitmap != NULL); if (size < sizeof *dirty_bitmap || size != dirty_bitmap->argsz) { - lm_log(lm_ctx, LM_ERR, "invalid header size %u", size); + vfu_log(vfu_ctx, VFU_ERR, "invalid header size %u", size); return -EINVAL; } if (dirty_bitmap->flags & VFIO_IOMMU_DIRTY_PAGES_FLAG_START) { - ret = dma_controller_dirty_page_logging_start(lm_ctx->dma, - migration_get_pgsize(lm_ctx->migration)); + ret = dma_controller_dirty_page_logging_start(vfu_ctx->dma, + migration_get_pgsize(vfu_ctx->migration)); } else if (dirty_bitmap->flags & VFIO_IOMMU_DIRTY_PAGES_FLAG_STOP) { - ret = dma_controller_dirty_page_logging_stop(lm_ctx->dma); + ret = dma_controller_dirty_page_logging_stop(vfu_ctx->dma); } else if (dirty_bitmap->flags & VFIO_IOMMU_DIRTY_PAGES_FLAG_GET_BITMAP) { - ret = handle_dirty_pages_get(lm_ctx, iovecs, nr_iovecs, + ret = handle_dirty_pages_get(vfu_ctx, iovecs, nr_iovecs, (struct vfio_iommu_type1_dirty_bitmap_get*)(dirty_bitmap + 1), size - sizeof *dirty_bitmap); } else { - lm_log(lm_ctx, LM_ERR, "bad flags %#x", dirty_bitmap->flags); + vfu_log(vfu_ctx, VFU_ERR, "bad flags %#x", dirty_bitmap->flags); ret = -EINVAL; } @@ -779,27 +780,27 @@ handle_dirty_pages(lm_ctx_t *lm_ctx, uint32_t size, * Returns 0 if the header is valid, -errno otherwise. */ static int -validate_header(lm_ctx_t *lm_ctx, struct vfio_user_header *hdr, size_t size) +validate_header(vfu_ctx_t *vfu_ctx, struct vfio_user_header *hdr, size_t size) { assert(hdr != NULL); if (size < sizeof hdr) { - lm_log(lm_ctx, LM_ERR, "short header read %ld", size); + vfu_log(vfu_ctx, VFU_ERR, "short header read %ld", size); return -EINVAL; } if (hdr->flags.type != VFIO_USER_F_TYPE_COMMAND) { - lm_log(lm_ctx, LM_ERR, "header not a request"); + vfu_log(vfu_ctx, VFU_ERR, "header not a request"); return -EINVAL; } if (hdr->msg_size < sizeof hdr) { - lm_log(lm_ctx, LM_ERR, "bad size in header %d", hdr->msg_size); + vfu_log(vfu_ctx, VFU_ERR, "bad size in header %d", hdr->msg_size); return -EINVAL; } return 0; -} +} /* * Populates @hdr to contain the header for the next command to be processed. @@ -809,19 +810,19 @@ validate_header(lm_ctx_t *lm_ctx, struct vfio_user_header *hdr, size_t size) * the number of bytes read. */ static int -get_next_command(lm_ctx_t *lm_ctx, struct vfio_user_header *hdr, int *fds, +get_next_command(vfu_ctx_t *vfu_ctx, struct vfio_user_header *hdr, int *fds, int *nr_fds) { int ret; /* FIXME get request shouldn't set errno, it should return it as -errno */ - ret = lm_ctx->trans->get_request(lm_ctx, hdr, fds, nr_fds); + ret = vfu_ctx->trans->get_request(vfu_ctx, hdr, fds, nr_fds); if (unlikely(ret < 0)) { if (ret == -EAGAIN || ret == -EWOULDBLOCK) { return 0; } if (ret != -EINTR) { - lm_log(lm_ctx, LM_ERR, "failed to receive request: %s", + vfu_log(vfu_ctx, VFU_ERR, "failed to receive request: %s", strerror(-ret)); } return ret; @@ -831,9 +832,9 @@ get_next_command(lm_ctx_t *lm_ctx, struct vfio_user_header *hdr, int *fds, return -EINTR; } if (errno == 0) { - lm_log(lm_ctx, LM_INF, "vfio-user client closed connection"); + vfu_log(vfu_ctx, VFU_INF, "vfio-user client closed connection"); } else { - lm_log(lm_ctx, LM_ERR, "end of file: %m"); + vfu_log(vfu_ctx, VFU_ERR, "end of file: %m"); } return -ENOTCONN; } @@ -841,7 +842,7 @@ get_next_command(lm_ctx_t *lm_ctx, struct vfio_user_header *hdr, int *fds, } static int -process_request(lm_ctx_t *lm_ctx) +process_request(vfu_ctx_t *vfu_ctx) { struct vfio_user_header hdr = { 0, }; int ret; @@ -856,9 +857,9 @@ process_request(lm_ctx_t *lm_ctx) bool free_iovec_data = true; void *cmd_data = NULL; - assert(lm_ctx != NULL); + assert(vfu_ctx != NULL); - if (device_is_stopped(lm_ctx->migration)) { + if (device_is_stopped(vfu_ctx->migration)) { return -ESHUTDOWN; } @@ -871,15 +872,15 @@ process_request(lm_ctx_t *lm_ctx) * state. */ - nr_fds = lm_ctx->client_max_fds; + nr_fds = vfu_ctx->client_max_fds; fds = alloca(nr_fds * sizeof(int)); - ret = get_next_command(lm_ctx, &hdr, fds, &nr_fds); + ret = get_next_command(vfu_ctx, &hdr, fds, &nr_fds); if (ret <= 0) { return ret; } - ret = validate_header(lm_ctx, &hdr, ret); + ret = validate_header(vfu_ctx, &hdr, ret); if (ret < 0) { return ret; } @@ -897,22 +898,22 @@ process_request(lm_ctx_t *lm_ctx) goto reply; } // FIXME: should be transport op - ret = recv(lm_ctx->conn_fd, cmd_data, hdr.msg_size, 0); + ret = recv(vfu_ctx->conn_fd, cmd_data, hdr.msg_size, 0); if (ret < 0) { ret = -errno; goto reply; } if (ret != (int)hdr.msg_size) { - lm_log(lm_ctx, LM_ERR, "short read, expected=%d, actual=%d", - hdr.msg_size, ret); + vfu_log(vfu_ctx, VFU_ERR, "short read, expected=%d, actual=%d", + hdr.msg_size, ret); ret = -EINVAL; goto reply; } } - if (device_is_stopped_and_copying(lm_ctx->migration) + if (device_is_stopped_and_copying(vfu_ctx->migration) && !(hdr.cmd == VFIO_USER_REGION_READ || hdr.cmd == VFIO_USER_REGION_WRITE)) { - lm_log(lm_ctx, LM_ERR, + vfu_log(vfu_ctx, VFU_ERR, "bad command %d while device in stop-and-copy state", hdr.cmd); ret = -EINVAL; goto reply; @@ -921,12 +922,12 @@ process_request(lm_ctx_t *lm_ctx) switch (hdr.cmd) { case VFIO_USER_DMA_MAP: case VFIO_USER_DMA_UNMAP: - ret = handle_dma_map_or_unmap(lm_ctx, hdr.msg_size, + ret = handle_dma_map_or_unmap(vfu_ctx, hdr.msg_size, hdr.cmd == VFIO_USER_DMA_MAP, fds, nr_fds, cmd_data); break; case VFIO_USER_DEVICE_GET_INFO: - ret = handle_device_get_info(lm_ctx, hdr.msg_size, &dev_info); + ret = handle_device_get_info(vfu_ctx, hdr.msg_size, &dev_info); if (ret >= 0) { _iovecs[1].iov_base = &dev_info; _iovecs[1].iov_len = dev_info.argsz; @@ -935,7 +936,7 @@ process_request(lm_ctx_t *lm_ctx) } break; case VFIO_USER_DEVICE_GET_REGION_INFO: - ret = handle_device_get_region_info(lm_ctx, hdr.msg_size, cmd_data, + ret = handle_device_get_region_info(vfu_ctx, hdr.msg_size, cmd_data, &dev_reg_info); if (ret == 0) { _iovecs[1].iov_base = dev_reg_info; @@ -945,7 +946,7 @@ process_request(lm_ctx_t *lm_ctx) } break; case VFIO_USER_DEVICE_GET_IRQ_INFO: - ret = handle_device_get_irq_info(lm_ctx, hdr.msg_size, cmd_data, + ret = handle_device_get_irq_info(vfu_ctx, hdr.msg_size, cmd_data, &irq_info); if (ret == 0) { _iovecs[1].iov_base = &irq_info; @@ -955,30 +956,30 @@ process_request(lm_ctx_t *lm_ctx) } break; case VFIO_USER_DEVICE_SET_IRQS: - ret = handle_device_set_irqs(lm_ctx, hdr.msg_size, fds, nr_fds, + ret = handle_device_set_irqs(vfu_ctx, hdr.msg_size, fds, nr_fds, cmd_data); break; case VFIO_USER_REGION_READ: case VFIO_USER_REGION_WRITE: iovecs = _iovecs; - ret = handle_region_access(lm_ctx, hdr.msg_size, hdr.cmd, + ret = handle_region_access(vfu_ctx, hdr.msg_size, hdr.cmd, &iovecs[1].iov_base, &iovecs[1].iov_len, cmd_data); nr_iovecs = 2; break; case VFIO_USER_DEVICE_RESET: - ret = handle_device_reset(lm_ctx); + ret = handle_device_reset(vfu_ctx); break; case VFIO_USER_DIRTY_PAGES: // FIXME: don't allow migration calls if migration == NULL - ret = handle_dirty_pages(lm_ctx, hdr.msg_size, &iovecs, &nr_iovecs, + ret = handle_dirty_pages(vfu_ctx, hdr.msg_size, &iovecs, &nr_iovecs, cmd_data); if (ret >= 0) { free_iovec_data = false; } break; default: - lm_log(lm_ctx, LM_ERR, "bad command %d", hdr.cmd); + vfu_log(vfu_ctx, VFU_ERR, "bad command %d", hdr.cmd); ret = -EINVAL; goto reply; } @@ -989,17 +990,17 @@ reply: * in the reply message. */ if (ret < 0) { - lm_log(lm_ctx, LM_ERR, "failed to handle command %d: %s", hdr.cmd, - strerror(-ret)); + vfu_log(vfu_ctx, VFU_ERR, "failed to handle command %d: %s", hdr.cmd, + strerror(-ret)); } else { ret = 0; } // FIXME: SPEC: should the reply include the command? I'd say yes? - ret = vfio_user_send_iovec(lm_ctx->conn_fd, hdr.msg_id, true, - 0, iovecs, nr_iovecs, NULL, 0, -ret); + ret = vfu_send_iovec(vfu_ctx->conn_fd, hdr.msg_id, true, + 0, iovecs, nr_iovecs, NULL, 0, -ret); if (unlikely(ret < 0)) { - lm_log(lm_ctx, LM_ERR, "failed to complete command: %s", + vfu_log(vfu_ctx, VFU_ERR, "failed to complete command: %s", strerror(-ret)); } if (iovecs != NULL && iovecs != _iovecs) { @@ -1016,144 +1017,146 @@ reply: return ret; } -static int prepare_ctx(lm_ctx_t *lm_ctx) +static int prepare_ctx(vfu_ctx_t *vfu_ctx) { - lm_reg_info_t *cfg_reg; - const lm_reg_info_t zero_reg = { 0 }; + vfu_reg_info_t *cfg_reg; + const vfu_reg_info_t zero_reg = { 0 }; int err; uint32_t max_ivs = 0, i; size_t size; - if (lm_ctx->ready != 0) { + if (vfu_ctx->ready != 0) { return 0; } - // Attach to the muser control device. With LM_FLAG_ATTACH_NB caller is - // always expected to call lm_ctx_try_attach(). - if ((lm_ctx->flags & LM_FLAG_ATTACH_NB) == 0) { - lm_ctx->conn_fd = lm_ctx->trans->attach(lm_ctx); - if (lm_ctx->conn_fd < 0) { - err = lm_ctx->conn_fd; + /* + * With LIBVFIO_USER_FLAG_ATTACH_NB caller is always expected to call + * vfu_ctx_try_attach(). + */ + if ((vfu_ctx->flags & LIBVFIO_USER_FLAG_ATTACH_NB) == 0) { + vfu_ctx->conn_fd = vfu_ctx->trans->attach(vfu_ctx); + if (vfu_ctx->conn_fd < 0) { + err = vfu_ctx->conn_fd; if (err != EINTR) { - lm_log(lm_ctx, LM_ERR, "failed to attach: %s", + vfu_log(vfu_ctx, VFU_ERR, "failed to attach: %s", strerror(-err)); } return err; } } - cfg_reg = &lm_ctx->reg_info[LM_PCI_DEV_CFG_REGION_IDX]; + cfg_reg = &vfu_ctx->reg_info[VFU_PCI_DEV_CFG_REGION_IDX]; // Set a default config region if none provided. /* TODO should it be enough to check that the size of region is 0? */ if (memcmp(cfg_reg, &zero_reg, sizeof(*cfg_reg)) == 0) { - cfg_reg->flags = LM_REG_FLAG_RW; + cfg_reg->flags = VFU_REG_FLAG_RW; cfg_reg->size = PCI_CFG_SPACE_SIZE; } - // This maybe allocated by lm_setup_pci_config_hdr(). - if (lm_ctx->pci_config_space == NULL) { - lm_ctx->pci_config_space = calloc(1, cfg_reg->size); - if (lm_ctx->pci_config_space == NULL) { + // This maybe allocated by vfu_setup_pci_config_hdr(). + if (vfu_ctx->pci_config_space == NULL) { + vfu_ctx->pci_config_space = calloc(1, cfg_reg->size); + if (vfu_ctx->pci_config_space == NULL) { return -ENOMEM; } } // Set type for region registers. for (i = 0; i < PCI_BARS_NR; i++) { - if (!(lm_ctx->reg_info[i].flags & LM_REG_FLAG_MEM)) { - lm_ctx->pci_config_space->hdr.bars[i].io.region_type |= 0x1; + if (!(vfu_ctx->reg_info[i].flags & VFU_REG_FLAG_MEM)) { + vfu_ctx->pci_config_space->hdr.bars[i].io.region_type |= 0x1; } } - if (lm_ctx->irqs == NULL) { + if (vfu_ctx->irqs == NULL) { /* * FIXME need to check that the number of MSI and MSI-X IRQs are valid * (1, 2, 4, 8, 16 or 32 for MSI and up to 2048 for MSI-X). */ // Work out highest count of irq vectors. - for (i = 0; i < LM_DEV_NUM_IRQS; i++) { - if (max_ivs < lm_ctx->irq_count[i]) { - max_ivs = lm_ctx->irq_count[i]; + for (i = 0; i < VFU_DEV_NUM_IRQS; i++) { + if (max_ivs < vfu_ctx->irq_count[i]) { + max_ivs = vfu_ctx->irq_count[i]; } } //FIXME: assert(max_ivs > 0)? size = sizeof(int) * max_ivs; - lm_ctx->irqs = calloc(1, sizeof(lm_irqs_t) + size); - if (lm_ctx->irqs == NULL) { - // lm_ctx->pci_config_space should be free'ed by lm_destroy_ctx(). + vfu_ctx->irqs = calloc(1, sizeof(vfu_irqs_t) + size); + if (vfu_ctx->irqs == NULL) { + // vfu_ctx->pci_config_space should be free'ed by vfu_destroy_ctx(). return -ENOMEM; } // Set context irq information. for (i = 0; i < max_ivs; i++) { - lm_ctx->irqs->efds[i] = -1; + vfu_ctx->irqs->efds[i] = -1; } - lm_ctx->irqs->err_efd = -1; - lm_ctx->irqs->req_efd = -1; - lm_ctx->irqs->type = IRQ_NONE; - lm_ctx->irqs->max_ivs = max_ivs; + vfu_ctx->irqs->err_efd = -1; + vfu_ctx->irqs->req_efd = -1; + vfu_ctx->irqs->type = IRQ_NONE; + vfu_ctx->irqs->max_ivs = max_ivs; // Reflect on the config space whether INTX is available. - if (lm_ctx->irq_count[LM_DEV_INTX_IRQ] != 0) { - lm_ctx->pci_config_space->hdr.intr.ipin = 1; // INTA# + if (vfu_ctx->irq_count[VFU_DEV_INTX_IRQ] != 0) { + vfu_ctx->pci_config_space->hdr.intr.ipin = 1; // INTA# } } - if (lm_ctx->caps != NULL) { - lm_ctx->pci_config_space->hdr.sts.cl = 0x1; - lm_ctx->pci_config_space->hdr.cap = PCI_STD_HEADER_SIZEOF; + if (vfu_ctx->caps != NULL) { + vfu_ctx->pci_config_space->hdr.sts.cl = 0x1; + vfu_ctx->pci_config_space->hdr.cap = PCI_STD_HEADER_SIZEOF; } - lm_ctx->ready = 1; + vfu_ctx->ready = 1; return 0; } int -lm_ctx_drive(lm_ctx_t *lm_ctx) +vfu_ctx_drive(vfu_ctx_t *vfu_ctx) { int err; - if (lm_ctx == NULL) { + if (vfu_ctx == NULL) { return ERROR(EINVAL); } - err = prepare_ctx(lm_ctx); + err = prepare_ctx(vfu_ctx); if (err < 0) { return ERROR(-err); } do { - err = process_request(lm_ctx); + err = process_request(vfu_ctx); } while (err >= 0); return err; } int -lm_ctx_poll(lm_ctx_t *lm_ctx) +vfu_ctx_poll(vfu_ctx_t *vfu_ctx) { int err; - if (unlikely((lm_ctx->flags & LM_FLAG_ATTACH_NB) == 0)) { + if (unlikely((vfu_ctx->flags & LIBVFIO_USER_FLAG_ATTACH_NB) == 0)) { return -ENOTSUP; } - assert(lm_ctx->ready == 1); - err = process_request(lm_ctx); + assert(vfu_ctx->ready == 1); + err = process_request(vfu_ctx); return err >= 0 ? 0 : err; } -/* FIXME this is not enough anymore, check muser_mmap */ +/* FIXME this is not enough anymore ? */ void * -lm_mmap(lm_ctx_t *lm_ctx, off_t offset, size_t length) +vfu_mmap(vfu_ctx_t *vfu_ctx, off_t offset, size_t length) { - if ((lm_ctx == NULL) || (length == 0) || !PAGE_ALIGNED(offset)) { - if (lm_ctx != NULL) { - lm_log(lm_ctx, LM_DBG, "bad device mmap region %#lx-%#lx\n", + if ((vfu_ctx == NULL) || (length == 0) || !PAGE_ALIGNED(offset)) { + if (vfu_ctx != NULL) { + vfu_log(vfu_ctx, VFU_DBG, "bad device mmap region %#lx-%#lx\n", offset, offset + length); } errno = EINVAL; @@ -1161,54 +1164,55 @@ lm_mmap(lm_ctx_t *lm_ctx, off_t offset, size_t length) } return mmap(NULL, length, PROT_READ | PROT_WRITE, MAP_SHARED, - lm_ctx->fd, offset); + vfu_ctx->fd, offset); } static void -free_sparse_mmap_areas(lm_ctx_t *lm_ctx) +free_sparse_mmap_areas(vfu_ctx_t *vfu_ctx) { int i; - assert(lm_ctx != NULL); + assert(vfu_ctx != NULL); - for (i = 0; i < (int)lm_ctx->nr_regions; i++) - free(lm_ctx->reg_info[i].mmap_areas); + for (i = 0; i < (int)vfu_ctx->nr_regions; i++) { + free(vfu_ctx->reg_info[i].mmap_areas); + } } void -lm_ctx_destroy(lm_ctx_t *lm_ctx) +vfu_ctx_destroy(vfu_ctx_t *vfu_ctx) { - if (lm_ctx == NULL) { + if (vfu_ctx == NULL) { return; } - free(lm_ctx->uuid); - free(lm_ctx->pci_config_space); - if (lm_ctx->trans->detach != NULL) { - lm_ctx->trans->detach(lm_ctx); + free(vfu_ctx->uuid); + free(vfu_ctx->pci_config_space); + if (vfu_ctx->trans->detach != NULL) { + vfu_ctx->trans->detach(vfu_ctx); } - if (lm_ctx->dma != NULL) { - dma_controller_destroy(lm_ctx->dma); + if (vfu_ctx->dma != NULL) { + dma_controller_destroy(vfu_ctx->dma); } - free_sparse_mmap_areas(lm_ctx); - free(lm_ctx->reg_info); - free(lm_ctx->caps); - free(lm_ctx->migration); - free(lm_ctx->irqs); - free(lm_ctx); + free_sparse_mmap_areas(vfu_ctx); + free(vfu_ctx->reg_info); + free(vfu_ctx->caps); + free(vfu_ctx->migration); + free(vfu_ctx->irqs); + free(vfu_ctx); // FIXME: Maybe close any open irq efds? Unmap stuff? } -struct lm_sparse_mmap_areas* -copy_sparse_mmap_area(struct lm_sparse_mmap_areas *src) +struct vfu_sparse_mmap_areas* +copy_sparse_mmap_area(struct vfu_sparse_mmap_areas *src) { - struct lm_sparse_mmap_areas *dest; + struct vfu_sparse_mmap_areas *dest; size_t size; assert(src != NULL); - size = sizeof(*dest) + (src->nr_mmap_areas * sizeof(struct lm_mmap_area)); + size = sizeof(*dest) + (src->nr_mmap_areas * sizeof(struct vfu_mmap_area)); dest = calloc(1, size); if (dest != NULL) { memcpy(dest, src, size); @@ -1217,109 +1221,109 @@ copy_sparse_mmap_area(struct lm_sparse_mmap_areas *src) } int -lm_ctx_try_attach(lm_ctx_t *lm_ctx) +vfu_ctx_try_attach(vfu_ctx_t *vfu_ctx) { int err; - assert(lm_ctx != NULL); + assert(vfu_ctx != NULL); - if ((lm_ctx->flags & LM_FLAG_ATTACH_NB) == 0) { + if ((vfu_ctx->flags & LIBVFIO_USER_FLAG_ATTACH_NB) == 0) { return ERROR(EINVAL); } - err = prepare_ctx(lm_ctx); + err = prepare_ctx(vfu_ctx); if (err < 0) { return ERROR(-err); } - return lm_ctx->trans->attach(lm_ctx); + return vfu_ctx->trans->attach(vfu_ctx); } -lm_ctx_t *lm_create_ctx(lm_trans_t trans, const char *path, int flags, +vfu_ctx_t *vfu_create_ctx(vfu_trans_t trans, const char *path, int flags, void *pvt) { - lm_ctx_t *lm_ctx = NULL; + vfu_ctx_t *vfu_ctx = NULL; int err = 0; - if (trans != LM_TRANS_SOCK) { + if (trans != VFU_TRANS_SOCK) { errno = ENOTSUP; return NULL; } - lm_ctx = calloc(1, sizeof(lm_ctx_t)); - if (lm_ctx == NULL) { + vfu_ctx = calloc(1, sizeof(vfu_ctx_t)); + if (vfu_ctx == NULL) { return NULL; } - lm_ctx->trans = &sock_transport_ops; + vfu_ctx->trans = &sock_transport_ops; //FIXME: Validate arguments. // Set other context data. - lm_ctx->pvt = pvt; - lm_ctx->flags = flags; - lm_ctx->log_lvl = LM_ERR; + vfu_ctx->pvt = pvt; + vfu_ctx->flags = flags; + vfu_ctx->log_lvl = VFU_ERR; - lm_ctx->uuid = strdup(path); - if (lm_ctx->uuid == NULL) { + vfu_ctx->uuid = strdup(path); + if (vfu_ctx->uuid == NULL) { err = errno; goto out; } /* * FIXME: Now we always allocate for migration region. Check if its better - * to seperate migration region from standard regions in lm_ctx.reg_info - * and move it into lm_ctx.migration. + * to seperate migration region from standard regions in vfu_ctx.reg_info + * and move it into vfu_ctx.migration. */ - lm_ctx->nr_regions = LM_PCI_DEV_NUM_REGIONS + 1; - lm_ctx->reg_info = calloc(lm_ctx->nr_regions, sizeof *lm_ctx->reg_info); - if (lm_ctx->reg_info == NULL) { + vfu_ctx->nr_regions = VFU_PCI_DEV_NUM_REGIONS + 1; + vfu_ctx->reg_info = calloc(vfu_ctx->nr_regions, sizeof *vfu_ctx->reg_info); + if (vfu_ctx->reg_info == NULL) { err = -ENOMEM; goto out; } - if (lm_ctx->trans->init != NULL) { - err = lm_ctx->trans->init(lm_ctx); + if (vfu_ctx->trans->init != NULL) { + err = vfu_ctx->trans->init(vfu_ctx); if (err < 0) { goto out; } - lm_ctx->fd = err; + vfu_ctx->fd = err; } err = 0; out: if (err != 0) { - if (lm_ctx != NULL) { - lm_ctx_destroy(lm_ctx); - lm_ctx = NULL; + if (vfu_ctx != NULL) { + vfu_ctx_destroy(vfu_ctx); + vfu_ctx = NULL; } errno = -err; } - return lm_ctx; + return vfu_ctx; } -int lm_setup_log(lm_ctx_t *lm_ctx, lm_log_fn_t *log, lm_log_lvl_t log_lvl) +int vfu_setup_log(vfu_ctx_t *vfu_ctx, vfu_log_fn_t *log, vfu_log_lvl_t log_lvl) { - if (log_lvl != LM_ERR && log_lvl != LM_INF && log_lvl != LM_DBG) { + if (log_lvl != VFU_ERR && log_lvl != VFU_INF && log_lvl != VFU_DBG) { return ERROR(EINVAL); } - lm_ctx->log = log; - lm_ctx->log_lvl = log_lvl; + vfu_ctx->log = log; + vfu_ctx->log_lvl = log_lvl; return 0; } -int lm_pci_setup_config_hdr(lm_ctx_t *lm_ctx, lm_pci_hdr_id_t id, - lm_pci_hdr_ss_t ss, lm_pci_hdr_cc_t cc, - UNUSED bool extended) +int vfu_pci_setup_config_hdr(vfu_ctx_t *vfu_ctx, vfu_pci_hdr_id_t id, + vfu_pci_hdr_ss_t ss, vfu_pci_hdr_cc_t cc, + UNUSED bool extended) { - lm_pci_config_space_t *config_space; + vfu_pci_config_space_t *config_space; - assert(lm_ctx != NULL); + assert(vfu_ctx != NULL); - if (lm_ctx->pci_config_space != NULL) { - lm_log(lm_ctx, LM_ERR, "pci header already setup"); + if (vfu_ctx->pci_config_space != NULL) { + vfu_log(vfu_ctx, VFU_ERR, "pci header already setup"); return ERROR(EEXIST); } @@ -1334,30 +1338,30 @@ int lm_pci_setup_config_hdr(lm_ctx_t *lm_ctx, lm_pci_hdr_id_t id, config_space->hdr.id = id; config_space->hdr.ss = ss; config_space->hdr.cc = cc; - lm_ctx->pci_config_space = config_space; + vfu_ctx->pci_config_space = config_space; return 0; } -int lm_pci_setup_caps(lm_ctx_t *lm_ctx, lm_cap_t **caps, int nr_caps) +int vfu_pci_setup_caps(vfu_ctx_t *vfu_ctx, vfu_cap_t **caps, int nr_caps) { int ret; - assert(lm_ctx != NULL); + assert(vfu_ctx != NULL); - if (lm_ctx->caps != NULL) { - lm_log(lm_ctx, LM_ERR, "capabilities are already setup"); + if (vfu_ctx->caps != NULL) { + vfu_log(vfu_ctx, VFU_ERR, "capabilities are already setup"); return ERROR(EEXIST); } if (caps == NULL || nr_caps == 0) { - lm_log(lm_ctx, LM_ERR, "Invalid args passed"); + vfu_log(vfu_ctx, VFU_ERR, "Invalid args passed"); return ERROR(EINVAL); } - lm_ctx->caps = caps_create(lm_ctx, caps, nr_caps, &ret); - if (lm_ctx->caps == NULL) { - lm_log(lm_ctx, LM_ERR, "failed to create PCI capabilities: %s", + vfu_ctx->caps = caps_create(vfu_ctx, caps, nr_caps, &ret); + if (vfu_ctx->caps == NULL) { + vfu_log(vfu_ctx, VFU_ERR, "failed to create PCI capabilities: %s", strerror(ret)); return ERROR(ret); } @@ -1366,8 +1370,8 @@ int lm_pci_setup_caps(lm_ctx_t *lm_ctx, lm_cap_t **caps, int nr_caps) } static int -copy_sparse_mmap_areas(lm_reg_info_t *reg_info, - struct lm_sparse_mmap_areas *mmap_areas) +copy_sparse_mmap_areas(vfu_reg_info_t *reg_info, + struct vfu_sparse_mmap_areas *mmap_areas) { int nr_mmap_areas; size_t size; @@ -1377,7 +1381,7 @@ copy_sparse_mmap_areas(lm_reg_info_t *reg_info, } nr_mmap_areas = mmap_areas->nr_mmap_areas; - size = sizeof(*mmap_areas) + (nr_mmap_areas * sizeof(struct lm_mmap_area)); + size = sizeof(*mmap_areas) + (nr_mmap_areas * sizeof(struct vfu_mmap_area)); reg_info->mmap_areas = calloc(1, size); if (reg_info->mmap_areas == NULL) { return -ENOMEM; @@ -1390,36 +1394,36 @@ copy_sparse_mmap_areas(lm_reg_info_t *reg_info, static inline bool is_valid_pci_config_space_region(int flags, size_t size) { - return flags == LM_REG_FLAG_RW && (size == PCI_CFG_SPACE_SIZE + return flags == VFU_REG_FLAG_RW && (size == PCI_CFG_SPACE_SIZE || size == PCI_CFG_SPACE_EXP_SIZE); } -int lm_setup_region(lm_ctx_t *lm_ctx, int region_idx, size_t size, - lm_region_access_cb_t *region_access, int flags, - struct lm_sparse_mmap_areas *mmap_areas, - lm_map_region_cb_t *map) +int vfu_setup_region(vfu_ctx_t *vfu_ctx, int region_idx, size_t size, + vfu_region_access_cb_t *region_access, int flags, + struct vfu_sparse_mmap_areas *mmap_areas, + vfu_map_region_cb_t *map) { int ret; - assert(lm_ctx != NULL); + assert(vfu_ctx != NULL); switch(region_idx) { - case LM_PCI_DEV_BAR0_REGION_IDX ... LM_PCI_DEV_VGA_REGION_IDX: + case VFU_PCI_DEV_BAR0_REGION_IDX ... VFU_PCI_DEV_VGA_REGION_IDX: // Validate the config region provided. - if (region_idx == LM_PCI_DEV_CFG_REGION_IDX && + if (region_idx == VFU_PCI_DEV_CFG_REGION_IDX && !is_valid_pci_config_space_region(flags, size)) { return ERROR(EINVAL); } - lm_ctx->reg_info[region_idx].flags = flags; - lm_ctx->reg_info[region_idx].size = size; - lm_ctx->reg_info[region_idx].fn = region_access; + vfu_ctx->reg_info[region_idx].flags = flags; + vfu_ctx->reg_info[region_idx].size = size; + vfu_ctx->reg_info[region_idx].fn = region_access; if (map != NULL) { - lm_ctx->reg_info[region_idx].map = map; + vfu_ctx->reg_info[region_idx].map = map; } if (mmap_areas) { - ret = copy_sparse_mmap_areas(&lm_ctx->reg_info[region_idx], + ret = copy_sparse_mmap_areas(&vfu_ctx->reg_info[region_idx], mmap_areas); if (ret < 0) { return ERROR(-ret); @@ -1427,35 +1431,35 @@ int lm_setup_region(lm_ctx_t *lm_ctx, int region_idx, size_t size, } break; default: - lm_log(lm_ctx, LM_ERR, "Invalid region index %d", region_idx); + vfu_log(vfu_ctx, VFU_ERR, "Invalid region index %d", region_idx); return ERROR(EINVAL); } return 0; } -int lm_setup_device_reset_cb(lm_ctx_t *lm_ctx, lm_reset_cb_t *reset) +int vfu_setup_device_reset_cb(vfu_ctx_t *vfu_ctx, vfu_reset_cb_t *reset) { - assert(lm_ctx != NULL); - lm_ctx->reset = reset; + assert(vfu_ctx != NULL); + vfu_ctx->reset = reset; return 0; } -int lm_setup_device_dma_cb(lm_ctx_t *lm_ctx, lm_map_dma_cb_t *map_dma, - lm_unmap_dma_cb_t *unmap_dma) +int vfu_setup_device_dma_cb(vfu_ctx_t *vfu_ctx, vfu_map_dma_cb_t *map_dma, + vfu_unmap_dma_cb_t *unmap_dma) { - assert(lm_ctx != NULL); + assert(vfu_ctx != NULL); - lm_ctx->map_dma = map_dma; - lm_ctx->unmap_dma = unmap_dma; + vfu_ctx->map_dma = map_dma; + vfu_ctx->unmap_dma = unmap_dma; // Create the internal DMA controller. - if (lm_ctx->unmap_dma != NULL) { - lm_ctx->dma = dma_controller_create(lm_ctx, LM_DMA_REGIONS); - if (lm_ctx->dma == NULL) { + if (vfu_ctx->unmap_dma != NULL) { + vfu_ctx->dma = dma_controller_create(vfu_ctx, VFU_DMA_REGIONS); + if (vfu_ctx->dma == NULL) { return ERROR(ENOMEM); } } @@ -1463,40 +1467,40 @@ int lm_setup_device_dma_cb(lm_ctx_t *lm_ctx, lm_map_dma_cb_t *map_dma, return 0; } -int lm_setup_device_nr_irqs(lm_ctx_t *lm_ctx, enum lm_dev_irq_type type, - uint32_t count) +int vfu_setup_device_nr_irqs(vfu_ctx_t *vfu_ctx, enum vfu_dev_irq_type type, + uint32_t count) { - assert(lm_ctx != NULL); + assert(vfu_ctx != NULL); - if (type < LM_DEV_INTX_IRQ || type > LM_DEV_REQ_IRQ) { - lm_log(lm_ctx, LM_ERR, "Invalid IRQ index %d, should be between " - "(%d to %d)", type, LM_DEV_INTX_IRQ, - LM_DEV_REQ_IRQ); + if (type < VFU_DEV_INTX_IRQ || type > VFU_DEV_REQ_IRQ) { + vfu_log(vfu_ctx, VFU_ERR, "Invalid IRQ index %d, should be between " + "(%d to %d)", type, VFU_DEV_INTX_IRQ, + VFU_DEV_REQ_IRQ); return ERROR(EINVAL); } - lm_ctx->irq_count[type] = count; + vfu_ctx->irq_count[type] = count; return 0; } -int lm_setup_device_migration(lm_ctx_t *lm_ctx, lm_migration_t *migration) +int vfu_setup_device_migration(vfu_ctx_t *vfu_ctx, vfu_migration_t *migration) { - lm_reg_info_t *migr_reg; + vfu_reg_info_t *migr_reg; int ret = 0; - assert(lm_ctx != NULL); + assert(vfu_ctx != NULL); //FIXME: Validate args. - if (lm_ctx->migr_reg != NULL) { - lm_log(lm_ctx, LM_ERR, "device migration is already setup"); + if (vfu_ctx->migr_reg != NULL) { + vfu_log(vfu_ctx, VFU_ERR, "device migration is already setup"); return ERROR(EEXIST); } /* FIXME hacky, find a more robust way to allocate a region index */ - migr_reg = &lm_ctx->reg_info[(lm_ctx->nr_regions - 1)]; + migr_reg = &vfu_ctx->reg_info[(vfu_ctx->nr_regions - 1)]; /* FIXME: Are there sparse areas need to be setup flags accordingly */ ret = copy_sparse_mmap_areas(migr_reg, migration->mmap_areas); @@ -1504,16 +1508,16 @@ int lm_setup_device_migration(lm_ctx_t *lm_ctx, lm_migration_t *migration) return ERROR(-ret); } - migr_reg->flags = LM_REG_FLAG_RW; + migr_reg->flags = VFU_REG_FLAG_RW; migr_reg->size = sizeof(struct vfio_device_migration_info) + migration->size; - lm_ctx->migration = init_migration(migration, &ret); - if (lm_ctx->migration == NULL) { - lm_log(lm_ctx, LM_ERR, "failed to initialize device migration"); + vfu_ctx->migration = init_migration(migration, &ret); + if (vfu_ctx->migration == NULL) { + vfu_log(vfu_ctx, VFU_ERR, "failed to initialize device migration"); free(migr_reg->mmap_areas); return ERROR(ret); } - lm_ctx->migr_reg = migr_reg; + vfu_ctx->migr_reg = migr_reg; return 0; } @@ -1521,80 +1525,80 @@ int lm_setup_device_migration(lm_ctx_t *lm_ctx, lm_migration_t *migration) /* * Returns a pointer to the standard part of the PCI configuration space. */ -inline lm_pci_config_space_t * -lm_get_pci_config_space(lm_ctx_t *lm_ctx) +inline vfu_pci_config_space_t * +vfu_pci_get_config_space(vfu_ctx_t *vfu_ctx) { - assert(lm_ctx != NULL); - return lm_ctx->pci_config_space; + assert(vfu_ctx != NULL); + return vfu_ctx->pci_config_space; } /* * Returns a pointer to the non-standard part of the PCI configuration space. */ inline uint8_t * -lm_get_pci_non_std_config_space(lm_ctx_t *lm_ctx) +vfu_get_pci_non_std_config_space(vfu_ctx_t *vfu_ctx) { - assert(lm_ctx != NULL); - return (uint8_t *)&lm_ctx->pci_config_space->non_std; + assert(vfu_ctx != NULL); + return (uint8_t *)&vfu_ctx->pci_config_space->non_std; } -inline lm_reg_info_t * -lm_get_region_info(lm_ctx_t *lm_ctx) +inline vfu_reg_info_t * +vfu_get_region_info(vfu_ctx_t *vfu_ctx) { - assert(lm_ctx != NULL); - return lm_ctx->reg_info; + assert(vfu_ctx != NULL); + return vfu_ctx->reg_info; } inline int -lm_addr_to_sg(lm_ctx_t *lm_ctx, dma_addr_t dma_addr, - uint32_t len, dma_sg_t *sg, int max_sg, int prot) +vfu_addr_to_sg(vfu_ctx_t *vfu_ctx, dma_addr_t dma_addr, + uint32_t len, dma_sg_t *sg, int max_sg, int prot) { - assert(lm_ctx != NULL); + assert(vfu_ctx != NULL); - if (unlikely(lm_ctx->unmap_dma == NULL)) { + if (unlikely(vfu_ctx->unmap_dma == NULL)) { errno = EINVAL; return -1; } - return dma_addr_to_sg(lm_ctx->dma, dma_addr, len, sg, max_sg, prot); + return dma_addr_to_sg(vfu_ctx->dma, dma_addr, len, sg, max_sg, prot); } inline int -lm_map_sg(lm_ctx_t *lm_ctx, const dma_sg_t *sg, - struct iovec *iov, int cnt) +vfu_map_sg(vfu_ctx_t *vfu_ctx, const dma_sg_t *sg, + struct iovec *iov, int cnt) { - if (unlikely(lm_ctx->unmap_dma == NULL)) { + if (unlikely(vfu_ctx->unmap_dma == NULL)) { errno = EINVAL; return -1; } - return dma_map_sg(lm_ctx->dma, sg, iov, cnt); + return dma_map_sg(vfu_ctx->dma, sg, iov, cnt); } inline void -lm_unmap_sg(lm_ctx_t *lm_ctx, const dma_sg_t *sg, struct iovec *iov, int cnt) +vfu_unmap_sg(vfu_ctx_t *vfu_ctx, const dma_sg_t *sg, struct iovec *iov, int cnt) { - if (unlikely(lm_ctx->unmap_dma == NULL)) { + if (unlikely(vfu_ctx->unmap_dma == NULL)) { return; } - return dma_unmap_sg(lm_ctx->dma, sg, iov, cnt); + return dma_unmap_sg(vfu_ctx->dma, sg, iov, cnt); } uint8_t * -lm_ctx_get_cap(lm_ctx_t *lm_ctx, uint8_t id) +vfu_ctx_get_cap(vfu_ctx_t *vfu_ctx, uint8_t id) { - assert(lm_ctx != NULL); + assert(vfu_ctx != NULL); - return cap_find_by_id(lm_ctx, id); + return cap_find_by_id(vfu_ctx, id); } int -lm_dma_read(lm_ctx_t *lm_ctx, dma_sg_t *sg, void *data) +vfu_dma_read(vfu_ctx_t *vfu_ctx, dma_sg_t *sg, void *data) { struct vfio_user_dma_region_access *dma_recv; struct vfio_user_dma_region_access dma_send; int recv_size; int msg_id = 1, ret; - assert(lm_ctx != NULL); + assert(vfu_ctx != NULL); assert(sg != NULL); recv_size = sizeof(*dma_recv) + sg->length; @@ -1606,9 +1610,9 @@ lm_dma_read(lm_ctx_t *lm_ctx, dma_sg_t *sg, void *data) dma_send.addr = sg->dma_addr; dma_send.count = sg->length; - ret = vfio_user_msg(lm_ctx->conn_fd, msg_id, VFIO_USER_DMA_READ, - &dma_send, sizeof dma_send, NULL, - dma_recv, recv_size); + ret = vfu_msg(vfu_ctx->conn_fd, msg_id, VFIO_USER_DMA_READ, + &dma_send, sizeof dma_send, NULL, + dma_recv, recv_size); memcpy(data, dma_recv->data, sg->length); /* FIXME no need for memcpy */ free(dma_recv); @@ -1616,13 +1620,13 @@ lm_dma_read(lm_ctx_t *lm_ctx, dma_sg_t *sg, void *data) } int -lm_dma_write(lm_ctx_t *lm_ctx, dma_sg_t *sg, void *data) +vfu_dma_write(vfu_ctx_t *vfu_ctx, dma_sg_t *sg, void *data) { struct vfio_user_dma_region_access *dma_send, dma_recv; int send_size = sizeof(*dma_send) + sg->length; int msg_id = 1, ret; - assert(lm_ctx != NULL); + assert(vfu_ctx != NULL); assert(sg != NULL); dma_send = calloc(send_size, 1); @@ -1632,9 +1636,9 @@ lm_dma_write(lm_ctx_t *lm_ctx, dma_sg_t *sg, void *data) dma_send->addr = sg->dma_addr; dma_send->count = sg->length; memcpy(dma_send->data, data, sg->length); /* FIXME no need to copy! */ - ret = vfio_user_msg(lm_ctx->conn_fd, msg_id, VFIO_USER_DMA_WRITE, - dma_send, send_size, NULL, - &dma_recv, sizeof(dma_recv)); + ret = vfu_msg(vfu_ctx->conn_fd, msg_id, VFIO_USER_DMA_WRITE, + dma_send, send_size, NULL, + &dma_recv, sizeof(dma_recv)); free(dma_send); return ret; diff --git a/lib/migration.c b/lib/migration.c index 3493617..2c99c3a 100644 --- a/lib/migration.c +++ b/lib/migration.c @@ -47,7 +47,7 @@ enum migr_iter_state { struct migration { struct vfio_device_migration_info info; size_t pgsize; - lm_migration_callbacks_t callbacks; + vfu_migration_callbacks_t callbacks; struct { enum migr_iter_state state; __u64 offset; @@ -75,12 +75,13 @@ static const __u32 migr_states[VFIO_DEVICE_STATE_MASK] = { (1 << VFIO_DEVICE_STATE_RESUMING) }; -struct migration *init_migration(const lm_migration_t * const lm_migr, int *err) +struct migration * +init_migration(const vfu_migration_t * const vfu_migr, int *err) { struct migration *migr; *err = 0; - if (lm_migr->size < sizeof(struct vfio_device_migration_info)) { + if (vfu_migr->size < sizeof(struct vfio_device_migration_info)) { *err = EINVAL; return NULL; } @@ -98,10 +99,10 @@ struct migration *init_migration(const lm_migration_t * const lm_migr, int *err) migr->pgsize = sysconf(_SC_PAGESIZE); - /* FIXME this should be done in lm_ctx_run or poll */ + /* FIXME this should be done in vfu_ctx_run or poll */ migr->info.device_state = VFIO_DEVICE_STATE_RUNNING; - migr->callbacks = lm_migr->callbacks; + migr->callbacks = vfu_migr->callbacks; if (migr->callbacks.transition == NULL || migr->callbacks.get_pending_bytes == NULL || migr->callbacks.prepare_data == NULL || @@ -122,9 +123,9 @@ _migr_state_transition_is_valid(__u32 from, __u32 to) } static ssize_t -handle_device_state(lm_ctx_t *lm_ctx, void *pvt, - struct migration *migr, __u32 *device_state, - bool is_write) { +handle_device_state(vfu_ctx_t *vfu_ctx, void *pvt, + struct migration *migr, __u32 *device_state, + bool is_write) { int ret; @@ -137,24 +138,24 @@ handle_device_state(lm_ctx_t *lm_ctx, void *pvt, } if (*device_state & ~VFIO_DEVICE_STATE_MASK) { - lm_log(lm_ctx, LM_ERR, "bad device state %#x", *device_state); + vfu_log(vfu_ctx, VFU_ERR, "bad device state %#x", *device_state); return -EINVAL; } if (!_migr_state_transition_is_valid(migr->info.device_state, *device_state)) { /* TODO print descriptive device state names instead of raw value */ - lm_log(lm_ctx, LM_ERR, "bad transition from state %d to state %d", + vfu_log(vfu_ctx, VFU_ERR, "bad transition from state %d to state %d", migr->info.device_state, *device_state); return -EINVAL; } switch (*device_state) { case VFIO_DEVICE_STATE_STOP: - ret = migr->callbacks.transition(pvt, LM_MIGR_STATE_STOP); + ret = migr->callbacks.transition(pvt, VFU_MIGR_STATE_STOP); break; case VFIO_DEVICE_STATE_RUNNING: - ret = migr->callbacks.transition(pvt, LM_MIGR_STATE_RUNNING); + ret = migr->callbacks.transition(pvt, VFU_MIGR_STATE_RUNNING); break; case VFIO_DEVICE_STATE_SAVING: /* @@ -163,13 +164,13 @@ handle_device_state(lm_ctx_t *lm_ctx, void *pvt, * the migration region? E.g. Access to any other region should be * failed? This might be a good question to send to LKML. */ - ret = migr->callbacks.transition(pvt, LM_MIGR_STATE_STOP_AND_COPY); + ret = migr->callbacks.transition(pvt, VFU_MIGR_STATE_STOP_AND_COPY); break; case VFIO_DEVICE_STATE_RUNNING | VFIO_DEVICE_STATE_SAVING: - ret = migr->callbacks.transition(pvt, LM_MIGR_STATE_PRE_COPY); + ret = migr->callbacks.transition(pvt, VFU_MIGR_STATE_PRE_COPY); break; case VFIO_DEVICE_STATE_RESUMING: - ret = migr->callbacks.transition(pvt, LM_MIGR_STATE_RESUME); + ret = migr->callbacks.transition(pvt, VFU_MIGR_STATE_RESUME); break; default: assert(false); @@ -178,13 +179,15 @@ handle_device_state(lm_ctx_t *lm_ctx, void *pvt, if (ret == 0) { migr->info.device_state = *device_state; } else if (ret < 0) { - lm_log(lm_ctx, LM_ERR, "failed to transition to state %d: %s", - *device_state, strerror(-ret)); + vfu_log(vfu_ctx, VFU_ERR, "failed to transition to state %d: %s", + *device_state, strerror(-ret)); } return ret; } +// FIXME: no need to use __u* type variants + static ssize_t handle_pending_bytes(void *pvt, struct migration *migr, __u64 *pending_bytes, bool is_write) @@ -238,7 +241,7 @@ handle_pending_bytes(void *pvt, struct migration *migr, */ static ssize_t -handle_data_offset_when_saving(lm_ctx_t *lm_ctx, void *pvt, +handle_data_offset_when_saving(vfu_ctx_t *vfu_ctx, void *pvt, struct migration *migr, bool is_write) { int ret = 0; @@ -246,7 +249,7 @@ handle_data_offset_when_saving(lm_ctx_t *lm_ctx, void *pvt, assert(migr != NULL); if (is_write) { - lm_log(lm_ctx, LM_ERR, "data_offset is RO when saving"); + vfu_log(vfu_ctx, VFU_ERR, "data_offset is RO when saving"); return -EINVAL; } @@ -264,7 +267,8 @@ handle_data_offset_when_saving(lm_ctx_t *lm_ctx, void *pvt, */ break; default: - lm_log(lm_ctx, LM_ERR, "reading data_offset out of sequence is undefined"); + vfu_log(vfu_ctx, VFU_ERR, + "reading data_offset out of sequence is undefined"); return -EINVAL; } @@ -272,7 +276,7 @@ handle_data_offset_when_saving(lm_ctx_t *lm_ctx, void *pvt, } static ssize_t -handle_data_offset(lm_ctx_t *lm_ctx, void *pvt, struct migration *migr, +handle_data_offset(vfu_ctx_t *vfu_ctx, void *pvt, struct migration *migr, __u64 *offset, bool is_write) { int ret; @@ -283,11 +287,11 @@ handle_data_offset(lm_ctx_t *lm_ctx, void *pvt, struct migration *migr, switch (migr->info.device_state) { case VFIO_DEVICE_STATE_SAVING: case VFIO_DEVICE_STATE_RUNNING | VFIO_DEVICE_STATE_SAVING: - ret = handle_data_offset_when_saving(lm_ctx, pvt, migr, is_write); + ret = handle_data_offset_when_saving(vfu_ctx, pvt, migr, is_write); break; case VFIO_DEVICE_STATE_RESUMING: if (is_write) { - lm_log(lm_ctx, LM_ERR, "bad write to migration data_offset"); + vfu_log(vfu_ctx, VFU_ERR, "bad write to migration data_offset"); ret = -EINVAL; } else { ret = 0; @@ -295,7 +299,8 @@ handle_data_offset(lm_ctx_t *lm_ctx, void *pvt, struct migration *migr, break; default: /* TODO improve error message */ - lm_log(lm_ctx, LM_ERR, "bad access to migration data_offset in state %d", + vfu_log(vfu_ctx, VFU_ERR, + "bad access to migration data_offset in state %d", migr->info.device_state); ret = -EINVAL; } @@ -308,20 +313,21 @@ handle_data_offset(lm_ctx_t *lm_ctx, void *pvt, struct migration *migr, } static ssize_t -handle_data_size_when_saving(lm_ctx_t *lm_ctx, struct migration *migr, +handle_data_size_when_saving(vfu_ctx_t *vfu_ctx, struct migration *migr, bool is_write) { assert(migr != NULL); if (is_write) { /* TODO improve error message */ - lm_log(lm_ctx, LM_ERR, "data_size is RO when saving"); + vfu_log(vfu_ctx, VFU_ERR, "data_size is RO when saving"); return -EINVAL; } if (migr->iter.state != VFIO_USER_MIGR_ITER_STATE_STARTED && migr->iter.state != VFIO_USER_MIGR_ITER_STATE_DATA_PREPARED) { - lm_log(lm_ctx, LM_ERR, "reading data_size ouf of sequence is undefined"); + vfu_log(vfu_ctx, VFU_ERR, + "reading data_size ouf of sequence is undefined"); return -EINVAL; } return 0; @@ -344,25 +350,25 @@ handle_data_size_when_resuming(void *pvt, struct migration *migr, } static ssize_t -handle_data_size(lm_ctx_t *lm_ctx, void *pvt, struct migration *migr, +handle_data_size(vfu_ctx_t *vfu_ctx, void *pvt, struct migration *migr, __u64 *size, bool is_write) { int ret; - assert(lm_ctx != NULL); + assert(vfu_ctx != NULL); assert(size != NULL); switch (migr->info.device_state){ case VFIO_DEVICE_STATE_SAVING: case VFIO_DEVICE_STATE_RUNNING | VFIO_DEVICE_STATE_SAVING: - ret = handle_data_size_when_saving(lm_ctx, migr, is_write); + ret = handle_data_size_when_saving(vfu_ctx, migr, is_write); break; case VFIO_DEVICE_STATE_RESUMING: ret = handle_data_size_when_resuming(pvt, migr, *size, is_write); break; default: /* TODO improve error message */ - lm_log(lm_ctx, LM_ERR, "bad access to data_size"); + vfu_log(vfu_ctx, VFU_ERR, "bad access to data_size"); ret = -EINVAL; } @@ -374,7 +380,7 @@ handle_data_size(lm_ctx_t *lm_ctx, void *pvt, struct migration *migr, } static ssize_t -handle_region_access_registers(lm_ctx_t *lm_ctx, void *pvt, +handle_region_access_registers(vfu_ctx_t *vfu_ctx, void *pvt, struct migration *migr, char *buf, size_t count, loff_t pos, bool is_write) { @@ -385,34 +391,38 @@ handle_region_access_registers(lm_ctx_t *lm_ctx, void *pvt, switch (pos) { case offsetof(struct vfio_device_migration_info, device_state): if (count != sizeof(migr->info.device_state)) { - lm_log(lm_ctx, LM_ERR, "bad device_state access size %ld", count); + vfu_log(vfu_ctx, VFU_ERR, + "bad device_state access size %ld", count); return -EINVAL; } - ret = handle_device_state(lm_ctx, pvt, migr, (__u32*)buf, is_write); + ret = handle_device_state(vfu_ctx, pvt, migr, (__u32*)buf, is_write); break; case offsetof(struct vfio_device_migration_info, pending_bytes): if (count != sizeof(migr->info.pending_bytes)) { - lm_log(lm_ctx, LM_ERR, "bad pending_bytes access size %ld", count); + vfu_log(vfu_ctx, VFU_ERR, + "bad pending_bytes access size %ld", count); return -EINVAL; } ret = handle_pending_bytes(pvt, migr, (__u64*)buf, is_write); break; case offsetof(struct vfio_device_migration_info, data_offset): if (count != sizeof(migr->info.data_offset)) { - lm_log(lm_ctx, LM_ERR, "bad data_offset access size %ld", count); + vfu_log(vfu_ctx, VFU_ERR, + "bad data_offset access size %ld", count); return -EINVAL; } - ret = handle_data_offset(lm_ctx, pvt, migr, (__u64*)buf, is_write); + ret = handle_data_offset(vfu_ctx, pvt, migr, (__u64*)buf, is_write); break; case offsetof(struct vfio_device_migration_info, data_size): if (count != sizeof(migr->info.data_size)) { - lm_log(lm_ctx, LM_ERR, "bad data_size access size %ld", count); + vfu_log(vfu_ctx, VFU_ERR, + "bad data_size access size %ld", count); return -EINVAL; } - ret = handle_data_size(lm_ctx, pvt, migr, (__u64*)buf, is_write); + ret = handle_data_size(vfu_ctx, pvt, migr, (__u64*)buf, is_write); break; default: - lm_log(lm_ctx, LM_ERR, "bad migration region register offset %#lx", + vfu_log(vfu_ctx, VFU_ERR, "bad migration region register offset %#lx", pos); return -EINVAL; } @@ -420,7 +430,7 @@ handle_region_access_registers(lm_ctx_t *lm_ctx, void *pvt, } ssize_t -handle_migration_region_access(lm_ctx_t *lm_ctx, void *pvt, +handle_migration_region_access(vfu_ctx_t *vfu_ctx, void *pvt, struct migration *migr, char *buf, size_t count, loff_t pos, bool is_write) @@ -429,10 +439,10 @@ handle_migration_region_access(lm_ctx_t *lm_ctx, void *pvt, assert(migr != NULL); assert(buf != NULL); - + if (pos + count <= sizeof(struct vfio_device_migration_info)) { - ret = handle_region_access_registers(lm_ctx, pvt, migr, buf, - count, pos, is_write); + ret = handle_region_access_registers(vfu_ctx, pvt, migr, buf, + count, pos, is_write); } else { pos -= sizeof(struct vfio_device_migration_info); if (is_write) { @@ -474,8 +484,9 @@ migration_set_pgsize(struct migration *migr, size_t pgsize) assert(migr != NULL); // FIXME? - if (pgsize != PAGE_SIZE) + if (pgsize != PAGE_SIZE) { return -EINVAL; + } migr->pgsize = pgsize; return 0; diff --git a/lib/migration.h b/lib/migration.h index 079e6eb..05ed0de 100644 --- a/lib/migration.h +++ b/lib/migration.h @@ -31,28 +31,28 @@ // FIXME: license header (and SPDX ?) everywhere -#ifndef LIB_MUSER_MIGRATION_H -#define LIB_MUSER_MIGRATION_H +#ifndef LIB_VFIO_USER_MIGRATION_H +#define LIB_VFIO_USER_MIGRATION_H /* * These are not public routines, but for convenience, they are used by the - * sample/test code as well as privately within libmuser. + * sample/test code as well as privately within libvfio-user. */ #include <stddef.h> -#include "muser.h" +#include "libvfio-user.h" -struct migration *init_migration(const lm_migration_t * const lm_migr, - int *err); +struct migration * +init_migration(const vfu_migration_t * const vfu_migr, int *err); ssize_t -handle_migration_region_access(lm_ctx_t *lm_ctx, void *pvt, +handle_migration_region_access(vfu_ctx_t *vfu_ctx, void *pvt, struct migration *migr, char *buf, size_t count, loff_t pos, bool is_write); bool -migration_available(lm_ctx_t *lm_ctx); +migration_available(vfu_ctx_t *vfu_ctx); bool device_is_stopped_and_copying(struct migration *migr); @@ -66,6 +66,6 @@ migration_get_pgsize(struct migration *migr); int migration_set_pgsize(struct migration *migr, size_t pgsize); -#endif /* LIB_MUSER_MIGRATION_H */ +#endif /* LIB_VFIO_USER_MIGRATION_H */ /* ex: set tabstop=4 shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/lib/muser_priv.h b/lib/muser_priv.h deleted file mode 100644 index ea44237..0000000 --- a/lib/muser_priv.h +++ /dev/null @@ -1,217 +0,0 @@ -/* - * Copyright (c) 2019 Nutanix Inc. All rights reserved. - * - * Authors: Thanos Makatos <thanos@nutanix.com> - * Swapnil Ingle <swapnil.ingle@nutanix.com> - * Felipe Franciosi <felipe@nutanix.com> - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of Nutanix nor the names of its contributors may be - * used to endorse or promote products derived from this software without - * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - */ - -#ifndef LIB_MUSER_PRIV_H -#define LIB_MUSER_PRIV_H - -#include "dma.h" - -#ifdef LM_VERBOSE_LOGGING -void -dump_buffer(const char *prefix, const char *buf, uint32_t count); -#else -#define dump_buffer(prefix, buf, count) -#endif - -struct transport_ops { - int (*init)(lm_ctx_t*); - int (*attach)(lm_ctx_t*); - int(*detach)(lm_ctx_t*); - int (*get_request)(lm_ctx_t*, struct vfio_user_header*, int *fds, int *nr_fds); -}; - -typedef enum { - IRQ_NONE = 0, - IRQ_INTX, - IRQ_MSI, - IRQ_MSIX, -} irq_type_t; - -typedef struct { - irq_type_t type; /* irq type this device is using */ - int err_efd; /* eventfd for irq err */ - int req_efd; /* eventfd for irq req */ - uint32_t max_ivs; /* maximum number of ivs supported */ - int efds[0]; /* XXX must be last */ -} lm_irqs_t; - -struct migration; - -typedef struct { - - /* - * Region flags, see LM_REG_FLAG_XXX above. - */ - uint32_t flags; - - /* - * Size of the region. - */ - uint32_t size; - - /* - * Callback function that is called when the region is read or written. - * Note that the memory of the region is owned by the user, except for the - * standard header (first 64 bytes) of the PCI configuration space. - */ - lm_region_access_cb_t *fn; - - /* - * Callback function that is called when the region is memory mapped. - * Required if LM_REG_FLAG_MEM is set, otherwise ignored. - */ - lm_map_region_cb_t *map; - struct lm_sparse_mmap_areas *mmap_areas; /* sparse mmap areas */ -} lm_reg_info_t; - -struct lm_ctx { - void *pvt; - dma_controller_t *dma; - int fd; - int conn_fd; - lm_reset_cb_t *reset; - lm_log_lvl_t log_lvl; - lm_log_fn_t *log; - size_t nr_regions; - lm_reg_info_t *reg_info; - lm_pci_config_space_t *pci_config_space; - struct transport_ops *trans; - struct caps *caps; - uint64_t flags; - char *uuid; - lm_map_dma_cb_t *map_dma; - lm_unmap_dma_cb_t *unmap_dma; - - /* TODO there should be a void * variable to store transport-specific stuff */ - /* LM_TRANS_SOCK */ - int sock_flags; - - int client_max_fds; - - lm_reg_info_t *migr_reg; - struct migration *migration; - - uint32_t irq_count[LM_DEV_NUM_IRQS]; - lm_irqs_t *irqs; - int ready; -}; - -int -muser_pci_hdr_access(lm_ctx_t *lm_ctx, uint32_t *count, - uint64_t *pos, bool write, char *buf); - -lm_reg_info_t * -lm_get_region_info(lm_ctx_t *lm_ctx); - -uint64_t -region_to_offset(uint32_t region); - -/* FIXME copied from include/linux/stddef.h, is this OK license-wise? */ -#define sizeof_field(TYPE, MEMBER) sizeof((((TYPE *)0)->MEMBER)) -#define offsetofend(TYPE, MEMBER) \ - (offsetof(TYPE, MEMBER) + sizeof_field(TYPE, MEMBER)) - -static inline ssize_t -get_minsz(unsigned int cmd) -{ - switch (cmd) { - case VFIO_DEVICE_GET_INFO: - return offsetofend(struct vfio_device_info, num_irqs); - case VFIO_DEVICE_GET_REGION_INFO: - return offsetofend(struct vfio_region_info, offset); - case VFIO_DEVICE_GET_IRQ_INFO: - return offsetofend(struct vfio_irq_info, count); - case VFIO_DEVICE_SET_IRQS: - return offsetofend(struct vfio_irq_set, count); - case VFIO_GROUP_GET_STATUS: - return offsetofend(struct vfio_group_status, flags); - case VFIO_GET_API_VERSION: - return 0; - case VFIO_CHECK_EXTENSION: - case VFIO_GROUP_SET_CONTAINER: - case VFIO_GROUP_UNSET_CONTAINER: - case VFIO_SET_IOMMU: - return sizeof(int); - case VFIO_IOMMU_GET_INFO: - return offsetofend(struct vfio_iommu_type1_info, iova_pgsizes); - case VFIO_IOMMU_MAP_DMA: - return offsetofend(struct vfio_iommu_type1_dma_map, size); - case VFIO_IOMMU_UNMAP_DMA: - return offsetofend(struct vfio_iommu_type1_dma_unmap, size); - case VFIO_GROUP_GET_DEVICE_FD: - case VFIO_DEVICE_RESET: - return 0; - } - return -EOPNOTSUPP; -} - -static inline const char * -vfio_cmd_to_str(int cmd) { - switch (cmd) { - case VFIO_GET_API_VERSION: return "VFIO_GET_API_VERSION"; - case VFIO_CHECK_EXTENSION: return "VFIO_CHECK_EXTENSION"; - case VFIO_SET_IOMMU: return "VFIO_SET_IOMMU"; - case VFIO_GROUP_GET_STATUS: return "VFIO_GROUP_GET_STATUS"; - case VFIO_GROUP_SET_CONTAINER: return "VFIO_GROUP_SET_CONTAINER"; - case VFIO_GROUP_UNSET_CONTAINER: return "VFIO_GROUP_UNSET_CONTAINER"; - case VFIO_GROUP_GET_DEVICE_FD: return "VFIO_GROUP_GET_DEVICE_FD"; - case VFIO_DEVICE_GET_INFO: return "VFIO_DEVICE_GET_INFO"; - case VFIO_DEVICE_GET_REGION_INFO: return "VFIO_DEVICE_GET_REGION_INFO"; - case VFIO_DEVICE_GET_IRQ_INFO: return "VFIO_DEVICE_GET_IRQ_INFO"; - case VFIO_DEVICE_SET_IRQS: return "VFIO_DEVICE_SET_IRQS"; - case VFIO_DEVICE_RESET: return "VFIO_DEVICE_RESET"; - case VFIO_IOMMU_GET_INFO: return "VFIO_IOMMU_GET_INFO/VFIO_DEVICE_GET_PCI_HOT_RESET_INFO/VFIO_IOMMU_SPAPR_TCE_GET_INFO"; - case VFIO_IOMMU_MAP_DMA: return "VFIO_IOMMU_MAP_DMA/VFIO_DEVICE_PCI_HOT_RESET"; - case VFIO_IOMMU_UNMAP_DMA: return "VFIO_IOMMU_UNMAP_DMA"; - case VFIO_IOMMU_ENABLE: return "VFIO_IOMMU_ENABLE"; - case VFIO_IOMMU_DISABLE: return "VFIO_IOMMU_DISABLE"; - case VFIO_EEH_PE_OP: return "VFIO_EEH_PE_OP"; - case VFIO_IOMMU_SPAPR_REGISTER_MEMORY: return "VFIO_IOMMU_SPAPR_REGISTER_MEMORY"; - case VFIO_IOMMU_SPAPR_UNREGISTER_MEMORY: return "VFIO_IOMMU_SPAPR_UNREGISTER_MEMORY"; - case VFIO_IOMMU_SPAPR_TCE_CREATE: return "VFIO_IOMMU_SPAPR_TCE_CREATE"; - case VFIO_IOMMU_SPAPR_TCE_REMOVE: return "VFIO_IOMMU_SPAPR_TCE_REMOVE"; - } - return NULL; -} - -int -handle_dma_map_or_unmap(lm_ctx_t *lm_ctx, uint32_t size, bool map, - int *fds, int nr_fds, - struct vfio_user_dma_region *dma_regions); - -void -_dma_controller_do_remove_region(dma_controller_t *dma, - dma_memory_region_t *region); - -#endif /* LIB_MUSER_PRIV_H */ - -/* ex: set tabstop=4 shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/lib/muser_pci.c b/lib/pci.c index 9535f21..0a944e3 100644 --- a/lib/muser_pci.c +++ b/lib/pci.c @@ -39,36 +39,36 @@ #include <linux/pci_regs.h> #include <linux/vfio.h> -#include "muser.h" -#include "muser_priv.h" -#include "pci.h" #include "common.h" +#include "libvfio-user.h" +#include "pci.h" +#include "private.h" static inline void -muser_pci_hdr_write_bar(lm_ctx_t *lm_ctx, uint16_t bar_index, const char *buf) +vfu_pci_hdr_write_bar(vfu_ctx_t *vfu_ctx, uint16_t bar_index, const char *buf) { uint32_t cfg_addr; unsigned long mask; - lm_reg_info_t *reg_info = lm_get_region_info(lm_ctx); - lm_pci_hdr_t *hdr; + vfu_reg_info_t *reg_info = vfu_get_region_info(vfu_ctx); + vfu_pci_hdr_t *hdr; - assert(lm_ctx != NULL); + assert(vfu_ctx != NULL); if (reg_info[bar_index].size == 0) { return; } - hdr = &lm_get_pci_config_space(lm_ctx)->hdr; + hdr = &vfu_pci_get_config_space(vfu_ctx)->hdr; cfg_addr = *(uint32_t *) buf; - lm_log(lm_ctx, LM_DBG, "BAR%d addr 0x%x\n", bar_index, cfg_addr); + vfu_log(vfu_ctx, VFU_DBG, "BAR%d addr 0x%x\n", bar_index, cfg_addr); if (cfg_addr == 0xffffffff) { cfg_addr = ~(reg_info[bar_index].size) + 1; } - if ((reg_info[bar_index].flags & LM_REG_FLAG_MEM)) { + if ((reg_info[bar_index].flags & VFU_REG_FLAG_MEM)) { mask = PCI_BASE_ADDRESS_MEM_MASK; } else { mask = PCI_BASE_ADDRESS_IO_MASK; @@ -81,7 +81,7 @@ muser_pci_hdr_write_bar(lm_ctx_t *lm_ctx, uint16_t bar_index, const char *buf) #define BAR_INDEX(offset) ((offset - PCI_BASE_ADDRESS_0) >> 2) static int -handle_command_write(lm_ctx_t *ctx, lm_pci_config_space_t *pci, +handle_command_write(vfu_ctx_t *ctx, vfu_pci_config_space_t *pci, const char *buf, size_t count) { uint16_t v; @@ -89,7 +89,7 @@ handle_command_write(lm_ctx_t *ctx, lm_pci_config_space_t *pci, assert(ctx != NULL); if (count != 2) { - lm_log(ctx, LM_ERR, "bad write command size %lu\n", count); + vfu_log(ctx, VFU_ERR, "bad write command size %lu\n", count); return -EINVAL; } @@ -101,88 +101,88 @@ handle_command_write(lm_ctx_t *ctx, lm_pci_config_space_t *pci, if ((v & PCI_COMMAND_IO) == PCI_COMMAND_IO) { if (!pci->hdr.cmd.iose) { pci->hdr.cmd.iose = 0x1; - lm_log(ctx, LM_INF, "I/O space enabled\n"); + vfu_log(ctx, VFU_INF, "I/O space enabled\n"); } v &= ~PCI_COMMAND_IO; } else { if (pci->hdr.cmd.iose) { pci->hdr.cmd.iose = 0x0; - lm_log(ctx, LM_INF, "I/O space disabled\n"); + vfu_log(ctx, VFU_INF, "I/O space disabled\n"); } } if ((v & PCI_COMMAND_MEMORY) == PCI_COMMAND_MEMORY) { if (!pci->hdr.cmd.mse) { pci->hdr.cmd.mse = 0x1; - lm_log(ctx, LM_INF, "memory space enabled\n"); + vfu_log(ctx, VFU_INF, "memory space enabled\n"); } v &= ~PCI_COMMAND_MEMORY; } else { if (pci->hdr.cmd.mse) { pci->hdr.cmd.mse = 0x0; - lm_log(ctx, LM_INF, "memory space disabled\n"); + vfu_log(ctx, VFU_INF, "memory space disabled\n"); } } if ((v & PCI_COMMAND_MASTER) == PCI_COMMAND_MASTER) { if (!pci->hdr.cmd.bme) { pci->hdr.cmd.bme = 0x1; - lm_log(ctx, LM_INF, "bus master enabled\n"); + vfu_log(ctx, VFU_INF, "bus master enabled\n"); } v &= ~PCI_COMMAND_MASTER; } else { if (pci->hdr.cmd.bme) { pci->hdr.cmd.bme = 0x0; - lm_log(ctx, LM_INF, "bus master disabled\n"); + vfu_log(ctx, VFU_INF, "bus master disabled\n"); } } if ((v & PCI_COMMAND_SERR) == PCI_COMMAND_SERR) { if (!pci->hdr.cmd.see) { pci->hdr.cmd.see = 0x1; - lm_log(ctx, LM_INF, "SERR# enabled\n"); + vfu_log(ctx, VFU_INF, "SERR# enabled\n"); } v &= ~PCI_COMMAND_SERR; } else { if (pci->hdr.cmd.see) { pci->hdr.cmd.see = 0x0; - lm_log(ctx, LM_INF, "SERR# disabled\n"); + vfu_log(ctx, VFU_INF, "SERR# disabled\n"); } } if ((v & PCI_COMMAND_INTX_DISABLE) == PCI_COMMAND_INTX_DISABLE) { if (!pci->hdr.cmd.id) { pci->hdr.cmd.id = 0x1; - lm_log(ctx, LM_INF, "INTx emulation disabled\n"); + vfu_log(ctx, VFU_INF, "INTx emulation disabled\n"); } v &= ~PCI_COMMAND_INTX_DISABLE; } else { if (pci->hdr.cmd.id) { pci->hdr.cmd.id = 0x0; - lm_log(ctx, LM_INF, "INTx emulation enabled\n"); + vfu_log(ctx, VFU_INF, "INTx emulation enabled\n"); } } if ((v & PCI_COMMAND_INVALIDATE) == PCI_COMMAND_INVALIDATE) { if (!pci->hdr.cmd.mwie) { pci->hdr.cmd.mwie = 1U; - lm_log(ctx, LM_INF, "memory write and invalidate enabled\n"); + vfu_log(ctx, VFU_INF, "memory write and invalidate enabled\n"); } v &= ~PCI_COMMAND_INVALIDATE; } else { if (pci->hdr.cmd.mwie) { pci->hdr.cmd.mwie = 0; - lm_log(ctx, LM_INF, "memory write and invalidate disabled"); + vfu_log(ctx, VFU_INF, "memory write and invalidate disabled"); } } if ((v & PCI_COMMAND_VGA_PALETTE) == PCI_COMMAND_VGA_PALETTE) { - lm_log(ctx, LM_INF, "enabling VGA palette snooping ignored\n"); + vfu_log(ctx, VFU_INF, "enabling VGA palette snooping ignored\n"); v &= ~PCI_COMMAND_VGA_PALETTE; } if (v != 0) { - lm_log(ctx, LM_ERR, "unconsumed command flags %x\n", v); + vfu_log(ctx, VFU_ERR, "unconsumed command flags %x\n", v); return -EINVAL; } @@ -190,7 +190,7 @@ handle_command_write(lm_ctx_t *ctx, lm_pci_config_space_t *pci, } static int -handle_erom_write(lm_ctx_t *ctx, lm_pci_config_space_t *pci, +handle_erom_write(vfu_ctx_t *ctx, vfu_pci_config_space_t *pci, const char *buf, size_t count) { uint32_t v; @@ -199,55 +199,55 @@ handle_erom_write(lm_ctx_t *ctx, lm_pci_config_space_t *pci, assert(pci != NULL); if (count != 0x4) { - lm_log(ctx, LM_ERR, "bad EROM count %lu\n", count); + vfu_log(ctx, VFU_ERR, "bad EROM count %lu\n", count); return -EINVAL; } v = *(uint32_t*)buf; if (v == (uint32_t)PCI_ROM_ADDRESS_MASK) { - lm_log(ctx, LM_INF, "write mask to EROM ignored\n"); + vfu_log(ctx, VFU_INF, "write mask to EROM ignored\n"); } else if (v == 0) { - lm_log(ctx, LM_INF, "cleared EROM\n"); + vfu_log(ctx, VFU_INF, "cleared EROM\n"); pci->hdr.erom = 0; } else if (v == (uint32_t)~PCI_ROM_ADDRESS_ENABLE) { - lm_log(ctx, LM_INF, "EROM disable ignored\n"); + vfu_log(ctx, VFU_INF, "EROM disable ignored\n"); } else { - lm_log(ctx, LM_ERR, "bad write to EROM 0x%x bytes\n", v); + vfu_log(ctx, VFU_ERR, "bad write to EROM 0x%x bytes\n", v); return -EINVAL; } return 0; } static inline int -muser_pci_hdr_write(lm_ctx_t *lm_ctx, uint16_t offset, - const char *buf, size_t count) +vfu_pci_hdr_write(vfu_ctx_t *vfu_ctx, uint16_t offset, + const char *buf, size_t count) { - lm_pci_config_space_t *pci; + vfu_pci_config_space_t *pci; int ret = 0; - assert(lm_ctx != NULL); + assert(vfu_ctx != NULL); assert(buf != NULL); - pci = lm_get_pci_config_space(lm_ctx); + pci = vfu_pci_get_config_space(vfu_ctx); switch (offset) { case PCI_COMMAND: - ret = handle_command_write(lm_ctx, pci, buf, count); + ret = handle_command_write(vfu_ctx, pci, buf, count); break; case PCI_STATUS: - lm_log(lm_ctx, LM_INF, "write to status ignored\n"); + vfu_log(vfu_ctx, VFU_INF, "write to status ignored\n"); break; case PCI_INTERRUPT_PIN: - lm_log(lm_ctx, LM_ERR, "attempt to write read-only field IPIN\n"); + vfu_log(vfu_ctx, VFU_ERR, "attempt to write read-only field IPIN\n"); ret = -EINVAL; break; case PCI_INTERRUPT_LINE: pci->hdr.intr.iline = buf[0]; - lm_log(lm_ctx, LM_DBG, "ILINE=%0x\n", pci->hdr.intr.iline); + vfu_log(vfu_ctx, VFU_DBG, "ILINE=%0x\n", pci->hdr.intr.iline); break; case PCI_LATENCY_TIMER: pci->hdr.mlt = (uint8_t)buf[0]; - lm_log(lm_ctx, LM_INF, "set to latency timer to %hhx\n", pci->hdr.mlt); + vfu_log(vfu_ctx, VFU_INF, "set to latency timer to %hhx\n", pci->hdr.mlt); break; case PCI_BASE_ADDRESS_0: case PCI_BASE_ADDRESS_1: @@ -255,18 +255,18 @@ muser_pci_hdr_write(lm_ctx_t *lm_ctx, uint16_t offset, case PCI_BASE_ADDRESS_3: case PCI_BASE_ADDRESS_4: case PCI_BASE_ADDRESS_5: - muser_pci_hdr_write_bar(lm_ctx, BAR_INDEX(offset), buf); + vfu_pci_hdr_write_bar(vfu_ctx, BAR_INDEX(offset), buf); break; case PCI_ROM_ADDRESS: - ret = handle_erom_write(lm_ctx, pci, buf, count); + ret = handle_erom_write(vfu_ctx, pci, buf, count); break; default: - lm_log(lm_ctx, LM_INF, "PCI config write %#x-%#lx not handled\n", - offset, offset + count); + vfu_log(vfu_ctx, VFU_INF, "PCI config write %#x-%#lx not handled\n", + offset, offset + count); ret = -EINVAL; } -#ifdef LM_VERBOSE_LOGGING +#ifdef VFU_VERBOSE_LOGGING dump_buffer("PCI header", (char*)pci->hdr.raw, 0xff); #endif @@ -281,26 +281,26 @@ muser_pci_hdr_write(lm_ctx_t *lm_ctx, uint16_t offset, * @count: output parameter that receives the number of bytes read/written */ static inline int -muser_do_pci_hdr_access(lm_ctx_t *lm_ctx, uint32_t *count, - uint64_t *pos, bool is_write, - char *buf) +vfu_do_pci_hdr_access(vfu_ctx_t *vfu_ctx, uint32_t *count, + uint64_t *pos, bool is_write, + char *buf) { uint32_t _count; loff_t _pos; int err = 0; - assert(lm_ctx != NULL); + assert(vfu_ctx != NULL); assert(count != NULL); assert(pos != NULL); assert(buf != NULL); - _pos = *pos - region_to_offset(LM_PCI_DEV_CFG_REGION_IDX); + _pos = *pos - region_to_offset(VFU_PCI_DEV_CFG_REGION_IDX); _count = MIN(*count, PCI_STD_HEADER_SIZEOF - _pos); if (is_write) { - err = muser_pci_hdr_write(lm_ctx, _pos, buf, _count); + err = vfu_pci_hdr_write(vfu_ctx, _pos, buf, _count); } else { - memcpy(buf, lm_get_pci_config_space(lm_ctx)->hdr.raw + _pos, _count); + memcpy(buf, vfu_pci_get_config_space(vfu_ctx)->hdr.raw + _pos, _count); } *pos += _count; *count -= _count; @@ -308,26 +308,25 @@ muser_do_pci_hdr_access(lm_ctx_t *lm_ctx, uint32_t *count, } static inline bool -muser_is_pci_hdr_access(uint64_t pos) +vfu_is_pci_hdr_access(uint64_t pos) { - const uint64_t off = region_to_offset(LM_PCI_DEV_CFG_REGION_IDX); + const uint64_t off = region_to_offset(VFU_PCI_DEV_CFG_REGION_IDX); return pos >= off && pos - off < PCI_STD_HEADER_SIZEOF; } /* FIXME this function is misleading, remove it */ int -muser_pci_hdr_access(lm_ctx_t *lm_ctx, uint32_t *count, - uint64_t *pos, bool is_write, - char *buf) +vfu_pci_hdr_access(vfu_ctx_t *vfu_ctx, uint32_t *count, + uint64_t *pos, bool is_write, char *buf) { - assert(lm_ctx != NULL); + assert(vfu_ctx != NULL); assert(count != NULL); assert(pos != NULL); - if (!muser_is_pci_hdr_access(*pos)) { + if (!vfu_is_pci_hdr_access(*pos)) { return 0; } - return muser_do_pci_hdr_access(lm_ctx, count, pos, is_write, buf); + return vfu_do_pci_hdr_access(vfu_ctx, count, pos, is_write, buf); } /* ex: set tabstop=4 shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/lib/private.h b/lib/private.h new file mode 100644 index 0000000..9b13949 --- /dev/null +++ b/lib/private.h @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2019 Nutanix Inc. All rights reserved. + * + * Authors: Thanos Makatos <thanos@nutanix.com> + * Swapnil Ingle <swapnil.ingle@nutanix.com> + * Felipe Franciosi <felipe@nutanix.com> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Nutanix nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + */ + +#ifndef LIB_VFIO_USER_PRIVATE_H +#define LIB_VFIO_USER_PRIVATE_H + +#include "dma.h" + +#ifdef VFU_VERBOSE_LOGGING +void +dump_buffer(const char *prefix, const char *buf, uint32_t count); +#else +#define dump_buffer(prefix, buf, count) +#endif + +struct transport_ops { + int (*init)(vfu_ctx_t*); + int (*attach)(vfu_ctx_t*); + int(*detach)(vfu_ctx_t*); + int (*get_request)(vfu_ctx_t*, struct vfio_user_header*, + int *fds, int *nr_fds); +}; + +typedef enum { + IRQ_NONE = 0, + IRQ_INTX, + IRQ_MSI, + IRQ_MSIX, +} irq_type_t; + +typedef struct { + irq_type_t type; /* irq type this device is using */ + int err_efd; /* eventfd for irq err */ + int req_efd; /* eventfd for irq req */ + uint32_t max_ivs; /* maximum number of ivs supported */ + int efds[0]; /* XXX must be last */ +} vfu_irqs_t; + +struct migration; + +typedef struct { + + /* + * Region flags, see VFU_REG_FLAG_XXX above. + */ + uint32_t flags; + + /* + * Size of the region. + */ + uint32_t size; + + /* + * Callback function that is called when the region is read or written. + * Note that the memory of the region is owned by the user, except for the + * standard header (first 64 bytes) of the PCI configuration space. + */ + vfu_region_access_cb_t *fn; + + /* + * Callback function that is called when the region is memory mapped. + * Required if VFU_REG_FLAG_MEM is set, otherwise ignored. + */ + vfu_map_region_cb_t *map; + struct vfu_sparse_mmap_areas *mmap_areas; /* sparse mmap areas */ +} vfu_reg_info_t; + +struct vfu_ctx { + void *pvt; + dma_controller_t *dma; + int fd; + int conn_fd; + vfu_reset_cb_t *reset; + vfu_log_lvl_t log_lvl; + vfu_log_fn_t *log; + size_t nr_regions; + vfu_reg_info_t *reg_info; + vfu_pci_config_space_t *pci_config_space; + struct transport_ops *trans; + struct caps *caps; + uint64_t flags; + char *uuid; + vfu_map_dma_cb_t *map_dma; + vfu_unmap_dma_cb_t *unmap_dma; + + /* TODO there should be a void * variable to store transport-specific stuff */ + /* VFU_TRANS_SOCK */ + int sock_flags; + + int client_max_fds; + + vfu_reg_info_t *migr_reg; + struct migration *migration; + + uint32_t irq_count[VFU_DEV_NUM_IRQS]; + vfu_irqs_t *irqs; + int ready; +}; + +int +vfu_pci_hdr_access(vfu_ctx_t *vfu_ctx, uint32_t *count, + uint64_t *pos, bool write, char *buf); + +vfu_reg_info_t * +vfu_get_region_info(vfu_ctx_t *vfu_ctx); + +uint64_t +region_to_offset(uint32_t region); + +int +handle_dma_map_or_unmap(vfu_ctx_t *vfu_ctx, uint32_t size, bool map, + int *fds, int nr_fds, + struct vfio_user_dma_region *dma_regions); + +void +_dma_controller_do_remove_region(dma_controller_t *dma, + dma_memory_region_t *region); + +#endif /* LIB_VFIO_USER_PRIVATE_H */ + +/* ex: set tabstop=4 shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/lib/python_bindings.c b/lib/python_bindings.c index b6caa9f..87abc78 100644 --- a/lib/python_bindings.c +++ b/lib/python_bindings.c @@ -32,9 +32,9 @@ #include <Python.h> -#include "muser.h" +#include "libvfio-user.h" -static PyObject *region_access_callbacks[LM_PCI_DEV_NUM_REGIONS]; +static PyObject *region_access_callbacks[VFU_PCI_DEV_NUM_REGIONS]; static int handle_read(char *dst, PyObject *result, int count) @@ -48,7 +48,7 @@ handle_read(char *dst, PyObject *result, int count) } /* - * Function callback called by libmuser. We then call the Python function. + * Function callback called by libvfio-user. We then call the Python function. * * FIXME need a way to provide private pointer. */ @@ -107,7 +107,7 @@ REGION_WRAP(6) REGION_WRAP(7) REGION_WRAP(8) -static ssize_t (*region_access_wraps[LM_PCI_DEV_NUM_REGIONS])(void *, char *, size_t, +static ssize_t (*region_access_wraps[VFU_PCI_DEV_NUM_REGIONS])(void *, char *, size_t, loff_t, bool) = { r_0_wrap, r_1_wrap, @@ -129,7 +129,7 @@ struct _region_info { static const struct _region_info _0_ri; static PyObject *log_fn; -static lm_log_lvl_t log_lvl = LM_ERR; +static vfu_log_lvl_t log_lvl = VFU_ERR; static void _log_fn(void *pvt, const char *msg) @@ -146,16 +146,16 @@ _log_fn(void *pvt, const char *msg) } static PyObject * -libmuser_run(PyObject *self, PyObject *args, PyObject *kwargs) +libvfio_user_run(PyObject *self, PyObject *args, PyObject *kwargs) { static char *kwlist[] = {"vid", "did", "uuid", "log", "log_lvl", "bar0", "bar1", "bar2", "bar3", "bar4", "bar5", "rom", "cfg", "vga", "intx", "msi", "msix", "err", "req", NULL}; int err; - lm_dev_info_t dev_info = { 0 }; + vfu_dev_info_t dev_info = { 0 }; int i; - struct _region_info _ri[LM_PCI_DEV_NUM_REGIONS] = { 0 }; + struct _region_info _ri[VFU_PCI_DEV_NUM_REGIONS] = { 0 }; if (!PyArg_ParseTupleAndKeywords( args, @@ -184,20 +184,20 @@ libmuser_run(PyObject *self, PyObject *args, PyObject *kwargs) return NULL; } - for (i = 0; i < LM_PCI_DEV_NUM_REGIONS; i++) { + for (i = 0; i < VFU_PCI_DEV_NUM_REGIONS; i++) { int j; uint32_t flags = 0; - if (i == LM_PCI_DEV_CFG_REGION_IDX && !memcmp(&_0_ri, &_ri[i], sizeof _0_ri)) { + if (i == VFU_PCI_DEV_CFG_REGION_IDX && !memcmp(&_0_ri, &_ri[i], sizeof _0_ri)) { continue; } if (_ri[i].perm != NULL) { for (j = 0; j < strlen(_ri[i].perm); j++) { if (_ri[i].perm[j] == 'r') { - flags |= LM_REG_FLAG_READ; + flags |= VFU_REG_FLAG_READ; } else if (_ri[i].perm[j] == 'w') { - flags |= LM_REG_FLAG_WRITE; + flags |= VFU_REG_FLAG_WRITE; } else { /* FIXME shouldn't print to stderr */ fprintf(stderr, "bad permission '%c'\n", _ri[i].perm[j]); @@ -219,13 +219,13 @@ libmuser_run(PyObject *self, PyObject *args, PyObject *kwargs) dev_info.log_lvl = log_lvl; } - err = lm_ctx_run(&dev_info); + err = vfu_ctx_run(&dev_info); return Py_BuildValue("i", err); } -static PyMethodDef LibmuserMethods[] = { +static PyMethodDef LibVfioUserMethods[] = { { "run", - (PyCFunction)libmuser_run, + (PyCFunction)libvfio_user_run, METH_VARARGS | METH_KEYWORDS, "runs a device" }, @@ -233,9 +233,9 @@ static PyMethodDef LibmuserMethods[] = { }; PyMODINIT_FUNC -initmuser(void) +initvfiouser(void) { - (void)Py_InitModule("muser", LibmuserMethods); + (void)Py_InitModule("vfio_user", LibVfioUserMethods); } /* ex: set tabstop=4 shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/lib/setup.py b/lib/setup.py index 73bd93d..8b37343 100644 --- a/lib/setup.py +++ b/lib/setup.py @@ -29,10 +29,10 @@ from distutils.core import setup, Extension -module1 = Extension('muser', +module1 = Extension('vfio_user', sources = ['python_bindings.c'], #library_dirs=['/usr/local/lib'], - libraries=['muser'], + libraries=['vfio-user'], #extra_compile_args=['-g', '-O0'] ) diff --git a/lib/tran_sock.c b/lib/tran_sock.c index 3ad1222..ad57ccc 100644 --- a/lib/tran_sock.c +++ b/lib/tran_sock.c @@ -43,10 +43,10 @@ #include <sys/types.h> #include <sys/un.h> -#include "muser.h" -#include "muser_priv.h" -#include "tran_sock.h" +#include "libvfio-user.h" #include "migration.h" +#include "private.h" +#include "tran_sock.h" // FIXME: is this the value we want? #define SERVER_MAX_FDS 8 @@ -71,13 +71,13 @@ recv_blocking(int sock, void *buf, size_t len, int flags) } static int -init_sock(lm_ctx_t *lm_ctx) +init_sock(vfu_ctx_t *vfu_ctx) { struct sockaddr_un addr = { .sun_family = AF_UNIX }; int ret, unix_sock; mode_t mode; - assert(lm_ctx != NULL); + assert(vfu_ctx != NULL); /* FIXME SPDK can't easily run as non-root */ mode = umask(0000); @@ -87,19 +87,19 @@ init_sock(lm_ctx_t *lm_ctx) goto out; } - if (lm_ctx->flags & LM_FLAG_ATTACH_NB) { + if (vfu_ctx->flags & LIBVFIO_USER_FLAG_ATTACH_NB) { ret = fcntl(unix_sock, F_SETFL, fcntl(unix_sock, F_GETFL, 0) | O_NONBLOCK); if (ret < 0) { ret = -errno; goto out; } - lm_ctx->sock_flags = MSG_DONTWAIT | MSG_WAITALL; + vfu_ctx->sock_flags = MSG_DONTWAIT | MSG_WAITALL; } else { - lm_ctx->sock_flags = 0; + vfu_ctx->sock_flags = 0; } - ret = snprintf(addr.sun_path, sizeof addr.sun_path, "%s", lm_ctx->uuid); + ret = snprintf(addr.sun_path, sizeof addr.sun_path, "%s", vfu_ctx->uuid); if (ret >= (int)sizeof addr.sun_path) { ret = -ENAMETOOLONG; } @@ -131,10 +131,10 @@ out: } int -vfio_user_send_iovec(int sock, uint16_t msg_id, bool is_reply, - enum vfio_user_command cmd, - struct iovec *iovecs, size_t nr_iovecs, - int *fds, int count, int err) +vfu_send_iovec(int sock, uint16_t msg_id, bool is_reply, + enum vfio_user_command cmd, + struct iovec *iovecs, size_t nr_iovecs, + int *fds, int count, int err) { int ret; struct vfio_user_header hdr = {.msg_id = msg_id}; @@ -194,9 +194,9 @@ vfio_user_send_iovec(int sock, uint16_t msg_id, bool is_reply, } int -vfio_user_send(int sock, uint16_t msg_id, bool is_reply, - enum vfio_user_command cmd, - void *data, size_t data_len) +vfu_send(int sock, uint16_t msg_id, bool is_reply, + enum vfio_user_command cmd, + void *data, size_t data_len) { /* [0] is for the header. */ struct iovec iovecs[2] = { @@ -205,17 +205,16 @@ vfio_user_send(int sock, uint16_t msg_id, bool is_reply, .iov_len = data_len } }; - return vfio_user_send_iovec(sock, msg_id, is_reply, cmd, iovecs, - ARRAY_SIZE(iovecs), NULL, 0, 0); + return vfu_send_iovec(sock, msg_id, is_reply, cmd, iovecs, + ARRAY_SIZE(iovecs), NULL, 0, 0); } int -send_vfio_user_error(int sock, uint16_t msg_id, +vfu_send_error(int sock, uint16_t msg_id, enum vfio_user_command cmd, int error) { - return vfio_user_send_iovec(sock, msg_id, true, cmd, - NULL, 0, NULL, 0, error); + return vfu_send_iovec(sock, msg_id, true, cmd, NULL, 0, NULL, 0, error); } /* @@ -228,8 +227,8 @@ send_vfio_user_error(int sock, uint16_t msg_id, * better. */ int -vfio_user_recv(int sock, struct vfio_user_header *hdr, bool is_reply, - uint16_t *msg_id, void *data, size_t *len) +vfu_recv(int sock, struct vfio_user_header *hdr, bool is_reply, + uint16_t *msg_id, void *data, size_t *len) { int ret; @@ -280,19 +279,19 @@ vfio_user_recv(int sock, struct vfio_user_header *hdr, bool is_reply, } /* - * Like vfio_user_recv(), but will automatically allocate reply data. + * Like vfu_recv(), but will automatically allocate reply data. * * FIXME: this does an unconstrained alloc of client-supplied data. */ int -vfio_user_recv_alloc(int sock, struct vfio_user_header *hdr, bool is_reply, - uint16_t *msg_id, void **datap, size_t *lenp) +vfu_recv_alloc(int sock, struct vfio_user_header *hdr, bool is_reply, + uint16_t *msg_id, void **datap, size_t *lenp) { void *data; size_t len; int ret; - ret = vfio_user_recv(sock, hdr, is_reply, msg_id, NULL, NULL); + ret = vfu_recv(sock, hdr, is_reply, msg_id, NULL, NULL); if (ret != 0) { return ret; @@ -335,28 +334,28 @@ vfio_user_recv_alloc(int sock, struct vfio_user_header *hdr, bool is_reply, * messages. */ int -vfio_user_msg_iovec(int sock, uint16_t msg_id, enum vfio_user_command cmd, - struct iovec *iovecs, size_t nr_iovecs, - int *send_fds, size_t fd_count, - struct vfio_user_header *hdr, - void *recv_data, size_t recv_len) +vfu_msg_iovec(int sock, uint16_t msg_id, enum vfio_user_command cmd, + struct iovec *iovecs, size_t nr_iovecs, + int *send_fds, size_t fd_count, + struct vfio_user_header *hdr, + void *recv_data, size_t recv_len) { - int ret = vfio_user_send_iovec(sock, msg_id, false, cmd, iovecs, nr_iovecs, - send_fds, fd_count, 0); + int ret = vfu_send_iovec(sock, msg_id, false, cmd, iovecs, nr_iovecs, + send_fds, fd_count, 0); if (ret < 0) { return ret; } if (hdr == NULL) { hdr = alloca(sizeof *hdr); } - return vfio_user_recv(sock, hdr, true, &msg_id, recv_data, &recv_len); + return vfu_recv(sock, hdr, true, &msg_id, recv_data, &recv_len); } int -vfio_user_msg(int sock, uint16_t msg_id, enum vfio_user_command cmd, - void *send_data, size_t send_len, - struct vfio_user_header *hdr, - void *recv_data, size_t recv_len) +vfu_msg(int sock, uint16_t msg_id, enum vfio_user_command cmd, + void *send_data, size_t send_len, + struct vfio_user_header *hdr, + void *recv_data, size_t recv_len) { /* [0] is for the header. */ struct iovec iovecs[2] = { @@ -365,8 +364,8 @@ vfio_user_msg(int sock, uint16_t msg_id, enum vfio_user_command cmd, .iov_len = send_len } }; - return vfio_user_msg_iovec(sock, msg_id, cmd, iovecs, ARRAY_SIZE(iovecs), - NULL, 0, hdr, recv_data, recv_len); + return vfu_msg_iovec(sock, msg_id, cmd, iovecs, ARRAY_SIZE(iovecs), + NULL, 0, hdr, recv_data, recv_len); } /* @@ -385,8 +384,8 @@ vfio_user_msg(int sock, uint16_t msg_id, enum vfio_user_command cmd, * available in newer library versions, so we don't use it. */ int -vfio_user_parse_version_json(const char *json_str, - int *client_max_fdsp, size_t *pgsizep) +vfu_parse_version_json(const char *json_str, + int *client_max_fdsp, size_t *pgsizep) { struct json_object *jo_caps = NULL; struct json_object *jo_top = NULL; @@ -449,7 +448,7 @@ out: } int -recv_version(lm_ctx_t *lm_ctx, int sock, uint16_t *msg_idp, +recv_version(vfu_ctx_t *vfu_ctx, int sock, uint16_t *msg_idp, struct vfio_user_version **versionp) { struct vfio_user_version *cversion = NULL; @@ -459,36 +458,37 @@ recv_version(lm_ctx_t *lm_ctx, int sock, uint16_t *msg_idp, *versionp = NULL; - ret = vfio_user_recv_alloc(sock, &hdr, false, msg_idp, - (void **)&cversion, &vlen); + ret = vfu_recv_alloc(sock, &hdr, false, msg_idp, + (void **)&cversion, &vlen); if (ret < 0) { - lm_log(lm_ctx, LM_ERR, "failed to receive version: %s", strerror(-ret)); + vfu_log(vfu_ctx, VFU_ERR, "failed to receive version: %s", + strerror(-ret)); return ret; } if (hdr.cmd != VFIO_USER_VERSION) { - lm_log(lm_ctx, LM_ERR, "msg%hx: invalid cmd %hu (expected %hu)", - *msg_idp, hdr.cmd, VFIO_USER_VERSION); + vfu_log(vfu_ctx, VFU_ERR, "msg%hx: invalid cmd %hu (expected %hu)", + *msg_idp, hdr.cmd, VFIO_USER_VERSION); ret = -EINVAL; goto out; } if (vlen < sizeof (*cversion)) { - lm_log(lm_ctx, LM_ERR, "msg%hx (VFIO_USER_VERSION): invalid size %lu", - *msg_idp, vlen); + vfu_log(vfu_ctx, VFU_ERR, + "msg%hx (VFIO_USER_VERSION): invalid size %lu", *msg_idp, vlen); ret = -EINVAL; goto out; } - if (cversion->major != LIB_MUSER_VFIO_USER_VERS_MJ) { - lm_log(lm_ctx, LM_ERR, "unsupported client major %hu (must be %hu)", - cversion->major, LIB_MUSER_VFIO_USER_VERS_MJ); + if (cversion->major != LIB_VFIO_USER_MAJOR) { + vfu_log(vfu_ctx, VFU_ERR, "unsupported client major %hu (must be %hu)", + cversion->major, LIB_VFIO_USER_MAJOR); ret = -ENOTSUP; goto out; } - lm_ctx->client_max_fds = 1; + vfu_ctx->client_max_fds = 1; if (vlen > sizeof (*cversion)) { const char *json_str = (const char *)cversion->data; @@ -496,40 +496,40 @@ recv_version(lm_ctx_t *lm_ctx, int sock, uint16_t *msg_idp, size_t pgsize = 0; if (json_str[len - 1] != '\0') { - lm_log(lm_ctx, LM_ERR, "ignoring invalid JSON from client"); + vfu_log(vfu_ctx, VFU_ERR, "ignoring invalid JSON from client"); ret = -EINVAL; goto out; } - ret = vfio_user_parse_version_json(json_str, &lm_ctx->client_max_fds, - &pgsize); + ret = vfu_parse_version_json(json_str, &vfu_ctx->client_max_fds, + &pgsize); if (ret < 0) { /* No client-supplied strings in the log for release build. */ #ifdef DEBUG - lm_log(lm_ctx, LM_ERR, "failed to parse client JSON \"%s\"", - json_str); + vfu_log(vfu_ctx, VFU_ERR, "failed to parse client JSON \"%s\"", + json_str); #else - lm_log(lm_ctx, LM_ERR, "failed to parse client JSON"); + vfu_log(vfu_ctx, VFU_ERR, "failed to parse client JSON"); #endif goto out; } - if (lm_ctx->migration != NULL && pgsize != 0) { - ret = migration_set_pgsize(lm_ctx->migration, pgsize); + if (vfu_ctx->migration != NULL && pgsize != 0) { + ret = migration_set_pgsize(vfu_ctx->migration, pgsize); if (ret != 0) { - lm_log(lm_ctx, LM_ERR, "refusing client page size of %zu", - pgsize); + vfu_log(vfu_ctx, VFU_ERR, "refusing client page size of %zu", + pgsize); goto out; } } // FIXME: is the code resilient against ->client_max_fds == 0? - if (lm_ctx->client_max_fds < 0 || - lm_ctx->client_max_fds > MUSER_CLIENT_MAX_FDS_LIMIT) { - lm_log(lm_ctx, LM_ERR, "refusing client max_fds of %d", - lm_ctx->client_max_fds); + if (vfu_ctx->client_max_fds < 0 || + vfu_ctx->client_max_fds > VFIO_USER_CLIENT_MAX_FDS_LIMIT) { + vfu_log(vfu_ctx, VFU_ERR, "refusing client max_fds of %d", + vfu_ctx->client_max_fds); ret = -EINVAL; goto out; } @@ -538,7 +538,7 @@ recv_version(lm_ctx_t *lm_ctx, int sock, uint16_t *msg_idp, out: if (ret != 0) { // FIXME: spec, is it OK to just have the header? - (void) send_vfio_user_error(sock, *msg_idp, hdr.cmd, ret); + (void) vfu_send_error(sock, *msg_idp, hdr.cmd, ret); free(cversion); cversion = NULL; } @@ -548,7 +548,7 @@ out: } int -send_version(lm_ctx_t *lm_ctx, int sock, uint16_t msg_id, +send_version(vfu_ctx_t *vfu_ctx, int sock, uint16_t msg_id, struct vfio_user_version *cversion) { struct vfio_user_version sversion = { 0 }; @@ -556,7 +556,7 @@ send_version(lm_ctx_t *lm_ctx, int sock, uint16_t msg_id, char server_caps[1024]; int slen; - if (lm_ctx->migration == NULL) { + if (vfu_ctx->migration == NULL) { slen = snprintf(server_caps, sizeof (server_caps), "{" "\"capabilities\":{" @@ -572,13 +572,13 @@ send_version(lm_ctx_t *lm_ctx, int sock, uint16_t msg_id, "\"pgsize\":%zu" "}" "}" - "}", SERVER_MAX_FDS, migration_get_pgsize(lm_ctx->migration)); + "}", SERVER_MAX_FDS, migration_get_pgsize(vfu_ctx->migration)); } // FIXME: we should save the client minor here, and check that before trying // to send unsupported things. - sversion.major = LIB_MUSER_VFIO_USER_VERS_MJ; - sversion.minor = MIN(cversion->minor, LIB_MUSER_VFIO_USER_VERS_MN); + sversion.major = LIB_VFIO_USER_MAJOR; + sversion.minor = MIN(cversion->minor, LIB_VFIO_USER_MINOR); /* [0] is for the header. */ iovecs[1].iov_base = &sversion; @@ -587,70 +587,70 @@ send_version(lm_ctx_t *lm_ctx, int sock, uint16_t msg_id, /* Include the NUL. */ iovecs[2].iov_len = slen + 1; - return vfio_user_send_iovec(sock, msg_id, true, VFIO_USER_VERSION, - iovecs, ARRAY_SIZE(iovecs), NULL, 0, 0); + return vfu_send_iovec(sock, msg_id, true, VFIO_USER_VERSION, + iovecs, ARRAY_SIZE(iovecs), NULL, 0, 0); } static int -negotiate(lm_ctx_t *lm_ctx, int sock) +negotiate(vfu_ctx_t *vfu_ctx, int sock) { struct vfio_user_version *client_version = NULL; uint16_t msg_id = 1; int ret; - ret = recv_version(lm_ctx, sock, &msg_id, &client_version); + ret = recv_version(vfu_ctx, sock, &msg_id, &client_version); if (ret < 0) { - lm_log(lm_ctx, LM_ERR, "failed to recv version: %s", strerror(-ret)); + vfu_log(vfu_ctx, VFU_ERR, "failed to recv version: %s", strerror(-ret)); return ret; } - ret = send_version(lm_ctx, sock, msg_id, client_version); + ret = send_version(vfu_ctx, sock, msg_id, client_version); free(client_version); if (ret < 0) { - lm_log(lm_ctx, LM_ERR, "failed to send version: %s", strerror(-ret)); + vfu_log(vfu_ctx, VFU_ERR, "failed to send version: %s", strerror(-ret)); } return ret; } /** - * lm_ctx: libmuser context - * FIXME: this shouldn't be happening as part of lm_ctx_create(). + * vfu_ctx: libvfio-user context + * FIXME: this shouldn't be happening as part of vfu_ctx_create(). */ static int -open_sock(lm_ctx_t *lm_ctx) +open_sock(vfu_ctx_t *vfu_ctx) { int ret; int conn_fd; - assert(lm_ctx != NULL); + assert(vfu_ctx != NULL); - conn_fd = accept(lm_ctx->fd, NULL, NULL); + conn_fd = accept(vfu_ctx->fd, NULL, NULL); if (conn_fd == -1) { return conn_fd; } - ret = negotiate(lm_ctx, conn_fd); + ret = negotiate(vfu_ctx, conn_fd); if (ret < 0) { close(conn_fd); return ret; } - lm_ctx->conn_fd = conn_fd; + vfu_ctx->conn_fd = conn_fd; return conn_fd; } static int -close_sock(lm_ctx_t *lm_ctx) +close_sock(vfu_ctx_t *vfu_ctx) { - return close(lm_ctx->conn_fd); + return close(vfu_ctx->conn_fd); } static int -get_request_sock(lm_ctx_t *lm_ctx, struct vfio_user_header *hdr, +get_request_sock(vfu_ctx_t *vfu_ctx, struct vfio_user_header *hdr, int *fds, int *nr_fds) { int ret; @@ -668,7 +668,7 @@ get_request_sock(lm_ctx_t *lm_ctx, struct vfio_user_header *hdr, * faster (?). I tried that and get short reads, so we need to store the * partially received buffer somewhere and retry. */ - ret = recvmsg(lm_ctx->conn_fd, &msg, lm_ctx->sock_flags); + ret = recvmsg(vfu_ctx->conn_fd, &msg, vfu_ctx->sock_flags); if (ret == -1) { return -errno; } diff --git a/lib/tran_sock.h b/lib/tran_sock.h index a4c9a17..b764e9b 100644 --- a/lib/tran_sock.h +++ b/lib/tran_sock.h @@ -30,21 +30,21 @@ * */ -#ifndef LIB_MUSER_TRAN_SOCK_H -#define LIB_MUSER_TRAN_SOCK_H +#ifndef LIB_VFIO_USER_TRAN_SOCK_H +#define LIB_VFIO_USER_TRAN_SOCK_H -#include "muser.h" +#include "libvfio-user.h" /* * These are not public routines, but for convenience, they are used by the - * sample/test code as well as privately within libmuser. + * sample/test code as well as privately within libvfio-user. * * Note there is currently only one transport - talking over a UNIX socket. */ /* The largest number of fd's we are prepared to receive. */ // FIXME: value? -#define MUSER_CLIENT_MAX_FDS_LIMIT (1024) +#define VFIO_USER_CLIENT_MAX_FDS_LIMIT (1024) extern struct transport_ops sock_transport_ops; @@ -53,35 +53,34 @@ extern struct transport_ops sock_transport_ops; * will not be set if not found in the JSON. */ int -vfio_user_parse_version_json(const char *json_str, int *client_max_fdsp, - size_t *pgsizep); +vfu_parse_version_json(const char *json_str, int *client_max_fdsp, + size_t *pgsizep); /* * Send a message to the other end. The iovecs array should leave the first * entry empty, as it will be used for the header. */ int -vfio_user_send_iovec(int sock, uint16_t msg_id, bool is_reply, - enum vfio_user_command cmd, - struct iovec *iovecs, size_t nr_iovecs, - int *fds, int count, - int err); +vfu_send_iovec(int sock, uint16_t msg_id, bool is_reply, + enum vfio_user_command cmd, + struct iovec *iovecs, size_t nr_iovecs, + int *fds, int count, + int err); /* * Send a message to the other end with the given data. */ int -vfio_user_send(int sock, uint16_t msg_id, bool is_reply, - enum vfio_user_command cmd, - void *data, size_t data_len); +vfu_send(int sock, uint16_t msg_id, bool is_reply, enum vfio_user_command cmd, + void *data, size_t data_len); /* * Send an empty reply back to the other end with the given errno. */ int -vfio_user_send_error(int sock, uint16_t msg_id, - enum vfio_user_command cmd, - int error); +vfu_send_error(int sock, uint16_t msg_id, + enum vfio_user_command cmd, + int error); /* * Receive a message from the other end, and place the data into the given @@ -89,9 +88,8 @@ vfio_user_send_error(int sock, uint16_t msg_id, * size. */ int -vfio_user_recv(int sock, struct vfio_user_header *hdr, - bool is_reply, uint16_t *msg_id, - void *data, size_t *len); +vfu_recv(int sock, struct vfio_user_header *hdr, bool is_reply, + uint16_t *msg_id, void *data, size_t *len); /* * Receive a message from the other end, but automatically allocate a buffer for @@ -99,9 +97,8 @@ vfio_user_recv(int sock, struct vfio_user_header *hdr, * NULL. */ int -vfio_user_recv_alloc(int sock, struct vfio_user_header *hdr, - bool is_reply, uint16_t *msg_id, - void **datap, size_t *lenp); +vfu_recv_alloc(int sock, struct vfio_user_header *hdr, bool is_reply, + uint16_t *msg_id, void **datap, size_t *lenp); /* * Send and receive a message to the other end, using iovecs for the send. The @@ -112,24 +109,24 @@ vfio_user_recv_alloc(int sock, struct vfio_user_header *hdr, * the reply header if non-NULL. */ int -vfio_user_msg_iovec(int sock, uint16_t msg_id, - enum vfio_user_command cmd, - struct iovec *iovecs, size_t nr_iovecs, - int *send_fds, size_t fd_count, - struct vfio_user_header *hdr, - void *recv_data, size_t recv_len); +vfu_msg_iovec(int sock, uint16_t msg_id, + enum vfio_user_command cmd, + struct iovec *iovecs, size_t nr_iovecs, + int *send_fds, size_t fd_count, + struct vfio_user_header *hdr, + void *recv_data, size_t recv_len); /* * Send and receive a message to the other end. @hdr is filled with the reply * header if non-NULL. */ int -vfio_user_msg(int sock, uint16_t msg_id, - enum vfio_user_command cmd, - void *send_data, size_t send_len, - struct vfio_user_header *hdr, - void *recv_data, size_t recv_len); +vfu_msg(int sock, uint16_t msg_id, + enum vfio_user_command cmd, + void *send_data, size_t send_len, + struct vfio_user_header *hdr, + void *recv_data, size_t recv_len); -#endif /* LIB_MUSER_TRAN_SOCK_H */ +#endif /* LIB_VFIO_USER_TRAN_SOCK_H */ /* ex: set tabstop=4 shiftwidth=4 softtabstop=4 expandtab: */ |