From: Manuel Bouyer <bouyer@netbsd.org>
To: xen-devel@lists.xenproject.org
Cc: Manuel Bouyer <bouyer@netbsd.org>,
Ian Jackson <iwj@xenproject.org>, Wei Liu <wl@xen.org>
Subject: [PATCH v2] libs/gnttab: implement on NetBSD
Date: Tue, 26 Jan 2021 23:47:53 +0100 [thread overview]
Message-ID: <20210126224800.1246-7-bouyer@netbsd.org> (raw)
In-Reply-To: <20210126224800.1246-1-bouyer@netbsd.org>
Implement gnttab interface on NetBSD.
The kernel interface is different from FreeBSD so we can't use the FreeBSD
version
Signed-off-by: Manuel Bouyer <bouyer@netbsd.org>
---
tools/libs/gnttab/Makefile | 2 +-
tools/libs/gnttab/netbsd.c | 267 +++++++++++++++++++++++++++++++++++++
2 files changed, 268 insertions(+), 1 deletion(-)
create mode 100644 tools/libs/gnttab/netbsd.c
diff --git a/tools/libs/gnttab/Makefile b/tools/libs/gnttab/Makefile
index d86c49d243..ae390ce60f 100644
--- a/tools/libs/gnttab/Makefile
+++ b/tools/libs/gnttab/Makefile
@@ -10,7 +10,7 @@ SRCS-GNTSHR += gntshr_core.c
SRCS-$(CONFIG_Linux) += $(SRCS-GNTTAB) $(SRCS-GNTSHR) linux.c
SRCS-$(CONFIG_MiniOS) += $(SRCS-GNTTAB) gntshr_unimp.c minios.c
SRCS-$(CONFIG_FreeBSD) += $(SRCS-GNTTAB) $(SRCS-GNTSHR) freebsd.c
+SRCS-$(CONFIG_NetBSD) += $(SRCS-GNTTAB) $(SRCS-GNTSHR) netbsd.c
SRCS-$(CONFIG_SunOS) += gnttab_unimp.c gntshr_unimp.c
-SRCS-$(CONFIG_NetBSD) += gnttab_unimp.c gntshr_unimp.c
include $(XEN_ROOT)/tools/libs/libs.mk
diff --git a/tools/libs/gnttab/netbsd.c b/tools/libs/gnttab/netbsd.c
new file mode 100644
index 0000000000..272cbd8961
--- /dev/null
+++ b/tools/libs/gnttab/netbsd.c
@@ -0,0 +1,267 @@
+/*
+ * Copyright (c) 2007-2008, D G Murray <Derek.Murray@cl.cam.ac.uk>
+ * Copyright (c) 2016-2017, Akshay Jaggi <jaggi@FreeBSD.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Split out from linux.c
+ */
+
+#include <fcntl.h>
+#include <errno.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+
+#include <sys/ioctl.h>
+#include <sys/mman.h>
+
+#include <xen/xen.h>
+#include <xen/xenio.h>
+
+#include "private.h"
+
+#define PAGE_SHIFT 12
+#define PAGE_SIZE (1UL << PAGE_SHIFT)
+#define PAGE_MASK (~(PAGE_SIZE-1))
+
+#define DEVXEN "/kern/xen/privcmd"
+
+int osdep_gnttab_open(xengnttab_handle *xgt)
+{
+ int fd = open(DEVXEN, O_RDWR|O_CLOEXEC);
+
+ if ( fd == -1 )
+ return -1;
+ xgt->fd = fd;
+
+ return 0;
+}
+
+int osdep_gnttab_close(xengnttab_handle *xgt)
+{
+ if ( xgt->fd == -1 )
+ return 0;
+
+ return close(xgt->fd);
+}
+
+int osdep_gnttab_set_max_grants(xengnttab_handle *xgt, uint32_t count)
+{
+ return 0;
+}
+
+void *osdep_gnttab_grant_map(xengnttab_handle *xgt,
+ uint32_t count, int flags, int prot,
+ uint32_t *domids, uint32_t *refs,
+ uint32_t notify_offset,
+ evtchn_port_t notify_port)
+{
+ uint32_t i;
+ int fd = xgt->fd;
+ struct ioctl_gntdev_mmap_grant_ref map;
+ void *addr = NULL;
+ int domids_stride;
+ unsigned int refs_size = count * sizeof(struct ioctl_gntdev_grant_ref);
+ int rv;
+
+ domids_stride = (flags & XENGNTTAB_GRANT_MAP_SINGLE_DOMAIN) ? 0 : 1;
+ map.refs = malloc(refs_size);
+
+ for ( i = 0; i < count; i++ )
+ {
+ map.refs[i].domid = domids[i * domids_stride];
+ map.refs[i].ref = refs[i];
+ }
+
+ map.count = count;
+ addr = mmap(NULL, count * PAGE_SIZE,
+ prot, flags | MAP_ANON | MAP_SHARED, -1, 0);
+
+ if (map.va == MAP_FAILED) {
+ GTERROR(xgt->logger, "osdep_gnttab_grant_map: mmap failed");
+ munmap((void *)map.va, count * PAGE_SIZE);
+ addr = MAP_FAILED;
+ }
+ map.va = addr;
+
+ map.notify.offset = 0;
+ map.notify.action = 0;
+ if ( notify_offset < PAGE_SIZE * count )
+ {
+ map.notify.offset = notify_offset;
+ map.notify.action |= UNMAP_NOTIFY_CLEAR_BYTE;
+ }
+ if ( notify_port != -1 )
+ {
+ map.notify.event_channel_port = notify_port;
+ map.notify.action |= UNMAP_NOTIFY_SEND_EVENT;
+ }
+
+ rv = ioctl(fd, IOCTL_GNTDEV_MMAP_GRANT_REF, &map);
+ if ( rv )
+ {
+ GTERROR(xgt->logger,
+ "ioctl IOCTL_GNTDEV_MMAP_GRANT_REF failed: %d", rv);
+ munmap(addr, count * PAGE_SIZE);
+ addr = MAP_FAILED;
+ }
+ free(map.refs);
+ return addr;
+}
+
+int osdep_gnttab_unmap(xengnttab_handle *xgt,
+ void *start_address,
+ uint32_t count)
+{
+ int rc;
+ if ( start_address == NULL )
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ /* Next, unmap the memory. */
+ rc = munmap(start_address, count * PAGE_SIZE);
+
+ return rc;
+}
+
+int osdep_gnttab_grant_copy(xengnttab_handle *xgt,
+ uint32_t count,
+ xengnttab_grant_copy_segment_t *segs)
+{
+ errno = ENOSYS;
+ return -1;
+}
+
+int osdep_gntshr_open(xengntshr_handle *xgs)
+{
+
+ int fd = open(DEVXEN, O_RDWR);
+
+ if ( fd == -1 )
+ return -1;
+ xgs->fd = fd;
+
+ return 0;
+}
+
+int osdep_gntshr_close(xengntshr_handle *xgs)
+{
+ if ( xgs->fd == -1 )
+ return 0;
+
+ return close(xgs->fd);
+}
+
+void *osdep_gntshr_share_pages(xengntshr_handle *xgs,
+ uint32_t domid, int count,
+ uint32_t *refs, int writable,
+ uint32_t notify_offset,
+ evtchn_port_t notify_port)
+{
+ int err;
+ int fd = xgs->fd;
+ void *area = NULL;
+ struct ioctl_gntdev_alloc_grant_ref alloc;
+
+ alloc.gref_ids = malloc(count * sizeof(uint32_t));
+ if ( alloc.gref_ids == NULL )
+ return NULL;
+ alloc.domid = domid;
+ alloc.flags = writable ? GNTDEV_ALLOC_FLAG_WRITABLE : 0;
+ alloc.count = count;
+ area = mmap(NULL, count * PAGE_SIZE,
+ PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, -1, 0);
+
+ if (area == MAP_FAILED) {
+ GTERROR(xgs->logger, "osdep_gnttab_grant_map: mmap failed");
+ area = MAP_FAILED;
+ goto out;
+ }
+ alloc.va = area;
+
+ alloc.notify.offset = 0;
+ alloc.notify.action = 0;
+ if ( notify_offset < PAGE_SIZE * count )
+ {
+ alloc.notify.offset = notify_offset;
+ alloc.notify.action |= UNMAP_NOTIFY_CLEAR_BYTE;
+ }
+ if ( notify_port != -1 )
+ {
+ alloc.notify.event_channel_port = notify_port;
+ alloc.notify.action |= UNMAP_NOTIFY_SEND_EVENT;
+ }
+ err = ioctl(fd, IOCTL_GNTDEV_ALLOC_GRANT_REF, &alloc);
+ if ( err )
+ {
+ GSERROR(xgs->logger, "IOCTL_GNTDEV_ALLOC_GRANT_REF failed");
+ munmap(area, count * PAGE_SIZE);
+ area = MAP_FAILED;
+ goto out;
+ }
+ memcpy(refs, alloc.gref_ids, count * sizeof(uint32_t));
+
+ out:
+ free(alloc.gref_ids);
+ return area;
+}
+
+int osdep_gntshr_unshare(xengntshr_handle *xgs,
+ void *start_address, uint32_t count)
+{
+ return munmap(start_address, count * PAGE_SIZE);
+}
+
+/*
+ * The functions below are Linux-isms that will likely never be implemented
+ * on FreeBSD unless FreeBSD also implements something akin to Linux dmabuf.
+ */
+int osdep_gnttab_dmabuf_exp_from_refs(xengnttab_handle *xgt, uint32_t domid,
+ uint32_t flags, uint32_t count,
+ const uint32_t *refs,
+ uint32_t *dmabuf_fd)
+{
+ abort();
+}
+
+int osdep_gnttab_dmabuf_exp_wait_released(xengnttab_handle *xgt,
+ uint32_t fd, uint32_t wait_to_ms)
+{
+ abort();
+}
+
+int osdep_gnttab_dmabuf_imp_to_refs(xengnttab_handle *xgt, uint32_t domid,
+ uint32_t fd, uint32_t count, uint32_t *refs)
+{
+ abort();
+}
+
+int osdep_gnttab_dmabuf_imp_release(xengnttab_handle *xgt, uint32_t fd)
+{
+ abort();
+}
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
--
2.29.2
next prev parent reply other threads:[~2021-01-26 22:49 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-01-26 22:47 [PATCH v2] Fix error: array subscript has type 'char' Manuel Bouyer
2021-01-26 22:47 ` [PATCH v2] NetBSD hotplug: Introduce locking functions Manuel Bouyer
2021-01-26 22:47 ` [PATCH v2] NetBSD hotplug: fix block unconfigure on destroy Manuel Bouyer
2021-01-28 11:45 ` Roger Pau Monné
2021-01-29 11:00 ` Manuel Bouyer
2021-01-26 22:47 ` [PATCH v2] NetBSD: use system-provided headers Manuel Bouyer
2021-01-28 11:21 ` Roger Pau Monné
2021-01-29 10:57 ` Manuel Bouyer
2021-01-26 22:47 ` [PATCH v2] libs/call: fix build on NetBSD Manuel Bouyer
2021-01-26 22:47 ` [PATCH v2] libs/foreignmemory: Implement " Manuel Bouyer
2021-01-27 20:15 ` Andrew Cooper
2021-01-28 10:48 ` Roger Pau Monné
2021-01-28 10:52 ` Andrew Cooper
2021-01-28 11:42 ` Andrew Cooper
2021-01-29 10:51 ` Manuel Bouyer
2021-01-26 22:47 ` Manuel Bouyer [this message]
2021-01-28 11:14 ` [PATCH v2] libs/gnttab: implement " Roger Pau Monné
2021-01-26 22:47 ` [PATCH v2] libs/light: Switch NetBSD to QEMU_XEN Manuel Bouyer
2021-01-26 22:47 ` [PATCH v2] libs/light: fix tv_sec printf format Manuel Bouyer
2021-01-26 22:47 ` [PATCH v2] libs/light: fix uuid on NetBSD Manuel Bouyer
2021-01-26 22:47 ` [PATCH v2] libs/light: make it build without setresuid() Manuel Bouyer
2021-01-28 11:06 ` Ian Jackson
2021-01-29 22:51 ` Andrew Cooper
2021-01-29 23:01 ` Manuel Bouyer
2021-01-29 23:05 ` Andrew Cooper
2021-01-29 23:16 ` Manuel Bouyer
2021-01-30 18:28 ` Manuel Bouyer
2021-01-26 22:47 ` [PATCH v2] libs/light: pass some infos to qemu Manuel Bouyer
2021-01-28 11:08 ` Roger Pau Monné
2021-01-29 10:46 ` Manuel Bouyer
2021-01-29 14:52 ` Roger Pau Monné
2021-01-30 23:07 ` Manuel Bouyer
2021-01-30 11:50 ` Manuel Bouyer
2021-02-01 8:06 ` Roger Pau Monné
2021-02-01 9:39 ` Manuel Bouyer
2021-02-01 10:54 ` Roger Pau Monné
2021-02-01 11:21 ` Manuel Bouyer
2021-01-26 22:47 ` [PATCH v2] libs/store: make build without PTHREAD_STACK_MIN Manuel Bouyer
2021-01-28 10:57 ` Roger Pau Monné
2021-01-28 11:08 ` Andrew Cooper
2021-01-29 10:43 ` Manuel Bouyer
2021-01-26 22:48 ` [PATCH v2] xenpmd.c: use dynamic allocation Manuel Bouyer
2021-01-28 10:34 ` Roger Pau Monné
2021-01-27 19:30 ` [PATCH v2] Fix error: array subscript has type 'char' Andrew Cooper
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210126224800.1246-7-bouyer@netbsd.org \
--to=bouyer@netbsd.org \
--cc=iwj@xenproject.org \
--cc=wl@xen.org \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).