From nobody Fri Mar 29 09:01:00 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=fail(p=none dis=none) header.from=antioche.eu.org ARC-Seal: i=1; a=rsa-sha256; t=1610475564; cv=none; d=zohomail.com; s=zohoarc; b=IfhMy1yXuUu8vd7FfzoyrdWXHp+KOP9+aY1sjCageosQv2ahMRdk/6dmHJJQZo9opO3+kspVHFmLwmvVauhnLBwxtHKh1s6mUpuUf4ljBul1Zw/XVQGbVPPyxNZy7rWGij+wFrIcxL1jRwCML7J5w43IIU6svazxf+8q1R4OFXw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1610475564; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=FBBv+gFjQFAehQXn3OeWQbaUxKv6/QA/ItM1Bha1hnY=; b=CiCwBydIggM3shnTO7BM5+URKe4i44eEb50yMXIm/2EFoM2DlVjPlNnwjDvCPcuNPfk++ezZnCbBds8GG0aSAwF/2cZe/qE/L3eYl8pQXqJd8zJIfb/XMJiX+8hWl2CAt1VQ2QZk5mi9Jh+yjAx5BwC9Qa2Wy4f0oduX3yyf9pc= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1610475564577409.56310416218935; Tue, 12 Jan 2021 10:19:24 -0800 (PST) Received: from list by lists.xenproject.org with outflank-mailman.65864.116750 (Exim 4.92) (envelope-from ) id 1kzOG2-0004hQ-9H; Tue, 12 Jan 2021 18:19:06 +0000 Received: by outflank-mailman (output) from mailman id 65864.116750; Tue, 12 Jan 2021 18:19:06 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1kzOG2-0004hF-4v; Tue, 12 Jan 2021 18:19:06 +0000 Received: by outflank-mailman (input) for mailman id 65864; Tue, 12 Jan 2021 18:19:04 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1kzOCA-0003Yo-0h for xen-devel@lists.xenproject.org; Tue, 12 Jan 2021 18:15:06 +0000 Received: from isis.lip6.fr (unknown [2001:660:3302:283c::2]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id 243d1dc2-abf6-4014-aa4c-2e95776522e6; Tue, 12 Jan 2021 18:13:46 +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 10CIDiPl027677; Tue, 12 Jan 2021 19:13:44 +0100 (CET) Received: from armandeche.soc.lip6.fr (armandeche [132.227.63.133]) by asim.lip6.fr (8.15.2/8.14.4) with ESMTP id 10CIDZUf000344; Tue, 12 Jan 2021 19:13:35 +0100 (MET) Received: by armandeche.soc.lip6.fr (Postfix, from userid 20331) id 818487218; Tue, 12 Jan 2021 19:13:35 +0100 (MET) X-Outflank-Mailman: Message body and most headers restored to incoming version 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: 243d1dc2-abf6-4014-aa4c-2e95776522e6 From: Manuel Bouyer To: xen-devel@lists.xenproject.org Cc: Manuel Bouyer , Ian Jackson , Wei Liu Subject: [PATCH] libs/gnttab: implement on NetBSD Date: Tue, 12 Jan 2021 19:12:32 +0100 Message-Id: <20210112181242.1570-12-bouyer@antioche.eu.org> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20210112181242.1570-1-bouyer@antioche.eu.org> References: <20210112181242.1570-1-bouyer@antioche.eu.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.4.3 (isis.lip6.fr [132.227.60.2]); Tue, 12 Jan 2021 19:13:44 +0100 (CET) X-Scanned-By: MIMEDefang 2.78 on 132.227.60.2 Content-Type: text/plain; charset="utf-8" From: Manuel Bouyer 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 --- 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 +=3D gntshr_core.c SRCS-$(CONFIG_Linux) +=3D $(SRCS-GNTTAB) $(SRCS-GNTSHR) linux.c SRCS-$(CONFIG_MiniOS) +=3D $(SRCS-GNTTAB) gntshr_unimp.c minios.c SRCS-$(CONFIG_FreeBSD) +=3D $(SRCS-GNTTAB) $(SRCS-GNTSHR) freebsd.c +SRCS-$(CONFIG_NetBSD) +=3D $(SRCS-GNTTAB) $(SRCS-GNTSHR) netbsd.c SRCS-$(CONFIG_SunOS) +=3D gnttab_unimp.c gntshr_unimp.c -SRCS-$(CONFIG_NetBSD) +=3D gnttab_unimp.c gntshr_unimp.c =20 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 =3D open(DEVXEN, O_RDWR|O_CLOEXEC); + + if ( fd =3D=3D -1 ) + return -1; + xgt->fd =3D fd; + + return 0; +} + +int osdep_gnttab_close(xengnttab_handle *xgt) +{ + if ( xgt->fd =3D=3D -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 =3D xgt->fd; + struct ioctl_gntdev_mmap_grant_ref map; + void *addr =3D NULL; + int domids_stride; + unsigned int refs_size =3D count * sizeof(struct ioctl_gntdev_grant_re= f); + int rv; + + domids_stride =3D (flags & XENGNTTAB_GRANT_MAP_SINGLE_DOMAIN) ? 0 : 1; + map.refs =3D malloc(refs_size); + + for ( i =3D 0; i < count; i++ ) + { + map.refs[i].domid =3D domids[i * domids_stride]; + map.refs[i].ref =3D refs[i]; + } + + map.count =3D count; + addr =3D mmap(NULL, count * PAGE_SIZE, + prot, flags | MAP_ANON | MAP_SHARED, -1, 0); + + if (map.va =3D=3D MAP_FAILED) { + GTERROR(xgt->logger, "osdep_gnttab_grant_map: mmap failed"); + munmap((void *)map.va, count * PAGE_SIZE); + addr =3D MAP_FAILED; + } + map.va =3D addr; + + map.notify.offset =3D 0; + map.notify.action =3D 0; + if ( notify_offset < PAGE_SIZE * count ) + { + map.notify.offset =3D notify_offset; + map.notify.action |=3D UNMAP_NOTIFY_CLEAR_BYTE; + } + if ( notify_port !=3D -1 ) + { + map.notify.event_channel_port =3D notify_port; + map.notify.action |=3D UNMAP_NOTIFY_SEND_EVENT; + } + + rv =3D 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 =3D 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 =3D=3D NULL ) + { + errno =3D EINVAL; + return -1; + } + + /* Next, unmap the memory. */ + rc =3D 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 =3D ENOSYS; + return -1; +} + +int osdep_gntshr_open(xengntshr_handle *xgs) +{ + + int fd =3D open(DEVXEN, O_RDWR); + + if ( fd =3D=3D -1 ) + return -1; + xgs->fd =3D fd; + + return 0; +} + +int osdep_gntshr_close(xengntshr_handle *xgs) +{ + if ( xgs->fd =3D=3D -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 =3D xgs->fd; + void *area =3D NULL; + struct ioctl_gntdev_alloc_grant_ref alloc; + + alloc.gref_ids =3D malloc(count * sizeof(uint32_t)); + if ( alloc.gref_ids =3D=3D NULL ) + return NULL; + alloc.domid =3D domid; + alloc.flags =3D writable ? GNTDEV_ALLOC_FLAG_WRITABLE : 0; + alloc.count =3D count; + area =3D mmap(NULL, count * PAGE_SIZE, + PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, -1, 0); + + if (area =3D=3D MAP_FAILED) { + GTERROR(xgs->logger, "osdep_gnttab_grant_map: mmap failed"); + area =3D MAP_FAILED; + goto out; + } + alloc.va =3D area; + + alloc.notify.offset =3D 0; + alloc.notify.action =3D 0; + if ( notify_offset < PAGE_SIZE * count ) + { + alloc.notify.offset =3D notify_offset; + alloc.notify.action |=3D UNMAP_NOTIFY_CLEAR_BYTE; + } + if ( notify_port !=3D -1 ) + { + alloc.notify.event_channel_port =3D notify_port; + alloc.notify.action |=3D UNMAP_NOTIFY_SEND_EVENT; + } + err =3D 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 =3D 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 dmabu= f. + */ +int osdep_gnttab_dmabuf_exp_from_refs(xengnttab_handle *xgt, uint32_t domi= d, + 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: + */ --=20 2.29.2