From owner-dev-commits-src-all@freebsd.org Mon Jan 11 15:36:08 2021 Return-Path: Delivered-To: dev-commits-src-all@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 5F6AB4DCDC0; Mon, 11 Jan 2021 15:36:08 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4DDyV01hlTz3r4K; Mon, 11 Jan 2021 15:36:08 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 2A3411CFC5; Mon, 11 Jan 2021 15:36:08 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 10BFa7hL026625; Mon, 11 Jan 2021 15:36:07 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 10BFa76D026624; Mon, 11 Jan 2021 15:36:07 GMT (envelope-from git) Date: Mon, 11 Jan 2021 15:36:07 GMT Message-Id: <202101111536.10BFa76D026624@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Roger Pau Monné Subject: git: 147e593921d7 - main - xen/privcmd: split setup of virtual address range into helper MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: royger X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 147e593921d7b9a6697a92a512ab7bd777f9a6b1 Auto-Submitted: auto-generated X-BeenThere: dev-commits-src-all@freebsd.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Commit messages for all branches of the src repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 11 Jan 2021 15:36:09 -0000 The branch main has been updated by royger: URL: https://cgit.FreeBSD.org/src/commit/?id=147e593921d7b9a6697a92a512ab7bd777f9a6b1 commit 147e593921d7b9a6697a92a512ab7bd777f9a6b1 Author: Roger Pau Monné AuthorDate: 2021-01-04 17:59:14 +0000 Commit: Roger Pau Monné CommitDate: 2021-01-11 15:14:59 +0000 xen/privcmd: split setup of virtual address range into helper Preparatory change for further additions that will also make use of the same code. No functional change. Sponsored by: Citrix Systems R&D --- sys/dev/xen/privcmd/privcmd.c | 69 ++++++++++++++++++++++--------------------- 1 file changed, 36 insertions(+), 33 deletions(-) diff --git a/sys/dev/xen/privcmd/privcmd.c b/sys/dev/xen/privcmd/privcmd.c index 24bce97e9b3d..78fb32444931 100644 --- a/sys/dev/xen/privcmd/privcmd.c +++ b/sys/dev/xen/privcmd/privcmd.c @@ -217,6 +217,40 @@ privcmd_mmap_single(struct cdev *cdev, vm_ooffset_t *offset, vm_size_t size, return (0); } +static struct privcmd_map * +setup_virtual_area(struct thread *td, unsigned long addr, unsigned long num) +{ + vm_map_t map; + vm_map_entry_t entry; + vm_object_t mem; + vm_pindex_t pindex; + vm_prot_t prot; + boolean_t wired; + struct privcmd_map *umap; + int error; + + if ((num == 0) || ((addr & PAGE_MASK) != 0)) + return NULL; + + map = &td->td_proc->p_vmspace->vm_map; + error = vm_map_lookup(&map, addr, VM_PROT_NONE, &entry, &mem, &pindex, + &prot, &wired); + if (error != KERN_SUCCESS || (entry->start != addr) || + (entry->end != addr + (num * PAGE_SIZE))) + return NULL; + + vm_map_lookup_done(map, entry); + if ((mem->type != OBJT_MGTDEVICE) || + (mem->un_pager.devp.ops != &privcmd_pg_ops)) + return NULL; + + umap = mem->handle; + /* Allocate a bitset to store broken page mappings. */ + umap->err = BITSET_ALLOC(num, M_PRIVCMD, M_WAITOK | M_ZERO); + + return umap; +} + static int privcmd_ioctl(struct cdev *dev, unsigned long cmd, caddr_t arg, int mode, struct thread *td) @@ -255,12 +289,6 @@ privcmd_ioctl(struct cdev *dev, unsigned long cmd, caddr_t arg, } case IOCTL_PRIVCMD_MMAPBATCH: { struct ioctl_privcmd_mmapbatch *mmap; - vm_map_t map; - vm_map_entry_t entry; - vm_object_t mem; - vm_pindex_t pindex; - vm_prot_t prot; - boolean_t wired; struct xen_add_to_physmap_range add; xen_ulong_t *idxs; xen_pfn_t *gpfns; @@ -271,33 +299,12 @@ privcmd_ioctl(struct cdev *dev, unsigned long cmd, caddr_t arg, mmap = (struct ioctl_privcmd_mmapbatch *)arg; - if ((mmap->num == 0) || - ((mmap->addr & PAGE_MASK) != 0)) { + umap = setup_virtual_area(td, mmap->addr, mmap->num); + if (umap == NULL) { error = EINVAL; break; } - map = &td->td_proc->p_vmspace->vm_map; - error = vm_map_lookup(&map, mmap->addr, VM_PROT_NONE, &entry, - &mem, &pindex, &prot, &wired); - if (error != KERN_SUCCESS) { - error = EINVAL; - break; - } - if ((entry->start != mmap->addr) || - (entry->end != mmap->addr + (mmap->num * PAGE_SIZE))) { - vm_map_lookup_done(map, entry); - error = EINVAL; - break; - } - vm_map_lookup_done(map, entry); - if ((mem->type != OBJT_MGTDEVICE) || - (mem->un_pager.devp.ops != &privcmd_pg_ops)) { - error = EINVAL; - break; - } - umap = mem->handle; - add.domid = DOMID_SELF; add.space = XENMAPSPACE_gmfn_foreign; add.foreign_domid = mmap->dom; @@ -316,10 +323,6 @@ privcmd_ioctl(struct cdev *dev, unsigned long cmd, caddr_t arg, set_xen_guest_handle(add.gpfns, gpfns); set_xen_guest_handle(add.errs, errs); - /* Allocate a bitset to store broken page mappings. */ - umap->err = BITSET_ALLOC(mmap->num, M_PRIVCMD, - M_WAITOK | M_ZERO); - for (index = 0; index < mmap->num; index += num) { num = MIN(mmap->num - index, UINT16_MAX); add.size = num;