From: Stefano Garzarella <[email protected]> The vhost-user protocol is not really Linux-specific so let's enable libvhost-user for any POSIX system.
Compiling it on macOS and FreeBSD some problems came up: - avoid to include linux/vhost.h which is available only on Linux (vhost_types.h contains many of the things we need) - macOS doesn't provide sys/endian.h, so let's define them (note: libvhost-user doesn't include QEMU's headers, so we can't use use "qemu/bswap.h") - copy SEAL defines from include/qemu/memfd.h to make the code works on FreeBSD where MFD_ALLOW_SEALING is defined - define MAP_NORESERVE if it's not defined (e.g. on FreeBSD) Reviewed-by: Philippe Mathieu-Daudé <[email protected]> Tested-by: Philippe Mathieu-Daudé <[email protected]> Acked-by: Stefan Hajnoczi <[email protected]> Signed-off-by: Stefano Garzarella <[email protected]> Signed-off-by: Tim Pambor <[email protected]> --- meson.build | 2 +- subprojects/libvhost-user/libvhost-user.c | 42 ++++++++++++++++++++++++++++++- subprojects/libvhost-user/libvhost-user.h | 2 +- 3 files changed, 43 insertions(+), 3 deletions(-) diff --git a/meson.build b/meson.build index eb296346a8..4f4068e7a7 100644 --- a/meson.build +++ b/meson.build @@ -3468,7 +3468,7 @@ if have_system and vfio_user_server_allowed endif vhost_user = not_found -if host_os == 'linux' and have_vhost_user +if have_vhost_user libvhost_user = subproject('libvhost-user') vhost_user = libvhost_user.get_variable('vhost_user_dep') endif diff --git a/subprojects/libvhost-user/libvhost-user.c b/subprojects/libvhost-user/libvhost-user.c index 5f649a3d52..7c5b89dc0b 100644 --- a/subprojects/libvhost-user/libvhost-user.c +++ b/subprojects/libvhost-user/libvhost-user.c @@ -29,7 +29,6 @@ #include <sys/types.h> #include <sys/socket.h> #include <sys/mman.h> -#include <endian.h> /* Necessary to provide VIRTIO_F_VERSION_1 on system * with older linux headers. Must appear before @@ -38,6 +37,7 @@ #include "standard-headers/linux/virtio_config.h" #if defined(__linux__) +#include <endian.h> #include <sys/syscall.h> #include <fcntl.h> #include <sys/ioctl.h> @@ -51,6 +51,24 @@ #endif +#if defined(__APPLE__) && (__MACH__) +#include <libkern/OSByteOrder.h> +#define htobe16(x) OSSwapHostToBigInt16(x) +#define htole16(x) OSSwapHostToLittleInt16(x) +#define be16toh(x) OSSwapBigToHostInt16(x) +#define le16toh(x) OSSwapLittleToHostInt16(x) + +#define htobe32(x) OSSwapHostToBigInt32(x) +#define htole32(x) OSSwapHostToLittleInt32(x) +#define be32toh(x) OSSwapBigToHostInt32(x) +#define le32toh(x) OSSwapLittleToHostInt32(x) + +#define htobe64(x) OSSwapHostToBigInt64(x) +#define htole64(x) OSSwapHostToLittleInt64(x) +#define be64toh(x) OSSwapBigToHostInt64(x) +#define le64toh(x) OSSwapLittleToHostInt64(x) +#endif + #ifdef CONFIG_EVENTFD #include <sys/eventfd.h> #else @@ -67,6 +85,28 @@ int eventfd_read(int fd, eventfd_t *value) } #endif +#ifdef CONFIG_MEMFD +#include <fcntl.h> + +#ifndef F_LINUX_SPECIFIC_BASE +#define F_LINUX_SPECIFIC_BASE 1024 +#endif + +#ifndef F_ADD_SEALS +#define F_ADD_SEALS (F_LINUX_SPECIFIC_BASE + 9) +#define F_GET_SEALS (F_LINUX_SPECIFIC_BASE + 10) + +#define F_SEAL_SEAL 0x0001 /* prevent further seals from being set */ +#define F_SEAL_SHRINK 0x0002 /* prevent file from shrinking */ +#define F_SEAL_GROW 0x0004 /* prevent file from growing */ +#define F_SEAL_WRITE 0x0008 /* prevent writes */ +#endif +#endif + +#ifndef MAP_NORESERVE +#define MAP_NORESERVE 0 +#endif + #include "include/atomic.h" #include "libvhost-user.h" diff --git a/subprojects/libvhost-user/libvhost-user.h b/subprojects/libvhost-user/libvhost-user.h index aedb1da96d..a2f0add832 100644 --- a/subprojects/libvhost-user/libvhost-user.h +++ b/subprojects/libvhost-user/libvhost-user.h @@ -18,9 +18,9 @@ #include <stdbool.h> #include <stddef.h> #include <poll.h> -#include <linux/vhost.h> #include <pthread.h> #include "standard-headers/linux/virtio_ring.h" +#include "standard-headers/linux/vhost_types.h" /* Based on qemu/hw/virtio/vhost-user.c */ #define VHOST_USER_F_PROTOCOL_FEATURES 30 -- 2.55.0
