From patchwork Mon Dec 14 16:36:11 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Manuel Bouyer X-Patchwork-Id: 11972683 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-11.7 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 56FACC3526A for ; Mon, 14 Dec 2020 18:36:05 +0000 (UTC) Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 0E3D0224D1 for ; Mon, 14 Dec 2020 18:36:05 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 0E3D0224D1 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=netbsd.org Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Received: from list by lists.xenproject.org with outflank-mailman.52397.91683 (Exim 4.92) (envelope-from ) id 1koshM-00027P-D5; Mon, 14 Dec 2020 18:35:52 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 52397.91683; Mon, 14 Dec 2020 18:35:52 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1koshL-00026r-Tk; Mon, 14 Dec 2020 18:35:51 +0000 Received: by outflank-mailman (input) for mailman id 52397; Mon, 14 Dec 2020 16:39:09 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1koqrr-0006vN-MO for xen-devel@lists.xenproject.org; Mon, 14 Dec 2020 16:38:35 +0000 Received: from isis.lip6.fr (unknown [2001:660:3302:283c::2]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id c384c0fc-48f1-4fa8-8421-2f70ab499674; Mon, 14 Dec 2020 16:36:35 +0000 (UTC) Received: from asim.lip6.fr (asim.lip6.fr [132.227.86.2]) by isis.lip6.fr (8.15.2/8.15.2) with ESMTP id 0BEGaXYK008956; Mon, 14 Dec 2020 17:36:33 +0100 (CET) Received: from borneo.soc.lip6.fr (borneo [132.227.103.47]) by asim.lip6.fr (8.15.2/8.14.4) with ESMTP id 0BEGaXQ1024496; Mon, 14 Dec 2020 17:36:33 +0100 (MET) Received: by borneo.soc.lip6.fr (Postfix, from userid 373) id 7F396AAC66; Mon, 14 Dec 2020 17:36:33 +0100 (MET) X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: c384c0fc-48f1-4fa8-8421-2f70ab499674 From: Manuel Bouyer To: xen-devel@lists.xenproject.org Cc: Manuel Bouyer Subject: [PATCH 12/24] Implement gnttab on NetBSD Date: Mon, 14 Dec 2020 17:36:11 +0100 Message-Id: <20201214163623.2127-13-bouyer@netbsd.org> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20201214163623.2127-1-bouyer@netbsd.org> References: <20201214163623.2127-1-bouyer@netbsd.org> MIME-Version: 1.0 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.4.3 (isis.lip6.fr [132.227.60.2]); Mon, 14 Dec 2020 17:36:33 +0100 (CET) X-Scanned-By: MIMEDefang 2.78 on 132.227.60.2 --- 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..2df7058cd7 --- /dev/null +++ b/tools/libs/gnttab/netbsd.c @@ -0,0 +1,267 @@ +/* + * Copyright (c) 2007-2008, D G Murray + * Copyright (c) 2016-2017, Akshay Jaggi + * + * 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 . + * + * Split out from linux.c + */ + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +#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: + */