From nobody Fri May 3 16:27:11 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 ARC-Seal: i=1; a=rsa-sha256; t=1611701346; cv=none; d=zohomail.com; s=zohoarc; b=W92DwxsnuNt4u6DSBpfbF2X85wLn0KXzzWBe0f0h9ALoGx5e5hwVNI0vhyBqXxisWQKmcQUOUELjOV8IlF3wa/r3czOcCaII/gxYZYDngzpgAzvfJiGA6xTCwvZKr74qTIBUDDrvG9ljY4ua4TtajWNf8BQOGRos2JhP4fxvV7M= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1611701346; 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=ne6oj03OBFYb80eJ4rFIwh4ZUU3d0GoT2uwjzZ0ofP8=; b=KOc0ymmKilhzpRmysOa+6Ez9Q+xdu1i21KPhfJ2kkKtYrk5spPzHDVKx4zeQLoE1/dwFncTPe05heNxvVTvUf8czECgUjwq90OdDsGfvsIzE0QYeWvOX78OZHrt8EnPY3zMyL/ZAI2B1NEM9YBMQxrMF2KrFdxWLx1rZTfBe0Dw= 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 Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 161170134696282.46028725637677; Tue, 26 Jan 2021 14:49:06 -0800 (PST) Received: from list by lists.xenproject.org with outflank-mailman.75601.136145 (Exim 4.92) (envelope-from ) id 1l4X8m-0001cz-7N; Tue, 26 Jan 2021 22:48:52 +0000 Received: by outflank-mailman (output) from mailman id 75601.136145; Tue, 26 Jan 2021 22:48: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 1l4X8m-0001cp-3K; Tue, 26 Jan 2021 22:48:52 +0000 Received: by outflank-mailman (input) for mailman id 75601; Tue, 26 Jan 2021 22:48:50 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1l4X8k-0001QY-NP for xen-devel@lists.xenproject.org; Tue, 26 Jan 2021 22:48:50 +0000 Received: from isis.lip6.fr (unknown [2001:660:3302:283c::2]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id 03fa0d26-272d-4c3f-b521-af8f094b4934; Tue, 26 Jan 2021 22:48:34 +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 10QMmXip010400; Tue, 26 Jan 2021 23:48: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 10QMmXFk000884; Tue, 26 Jan 2021 23:48:33 +0100 (MET) Received: by borneo.soc.lip6.fr (Postfix, from userid 373) id 27D57AA8C1; Tue, 26 Jan 2021 23:48:33 +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: 03fa0d26-272d-4c3f-b521-af8f094b4934 From: Manuel Bouyer To: xen-devel@lists.xenproject.org Cc: Manuel Bouyer , Ian Jackson , Wei Liu Subject: [PATCH v2] libs/gnttab: implement on NetBSD Date: Tue, 26 Jan 2021 23:47:53 +0100 Message-Id: <20210126224800.1246-7-bouyer@netbsd.org> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210126224800.1246-1-bouyer@netbsd.org> References: <20210126224800.1246-1-bouyer@netbsd.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, 26 Jan 2021 23:48:33 +0100 (CET) X-Scanned-By: MIMEDefang 2.78 on 132.227.60.2 Content-Type: text/plain; charset="utf-8" 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 Reviewed-by: Roger Pau Monn=C3=A9 --- 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..272cbd8961 --- /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