From owner-svn-soc-all@freebsd.org Sun Jul 19 11:50:41 2015 Return-Path: Delivered-To: svn-soc-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 128DD9A4EDD for ; Sun, 19 Jul 2015 11:50:41 +0000 (UTC) (envelope-from def@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 03EB01C45 for ; Sun, 19 Jul 2015 11:50:41 +0000 (UTC) (envelope-from def@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.15.2/8.15.2) with ESMTP id t6JBoeBL029010 for ; Sun, 19 Jul 2015 11:50:40 GMT (envelope-from def@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.15.2/8.15.2/Submit) id t6JBoeM9029007 for svn-soc-all@FreeBSD.org; Sun, 19 Jul 2015 11:50:40 GMT (envelope-from def@FreeBSD.org) Date: Sun, 19 Jul 2015 11:50:40 GMT Message-Id: <201507191150.t6JBoeM9029007@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to def@FreeBSD.org using -f From: def@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r288547 - soc2013/def/crashdump-head/sys/conf MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 19 Jul 2015 11:50:41 -0000 Author: def Date: Sun Jul 19 11:50:39 2015 New Revision: 288547 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=288547 Log: Add Rijndael as an EKCD dependency. Modified: soc2013/def/crashdump-head/sys/conf/files Modified: soc2013/def/crashdump-head/sys/conf/files ============================================================================== --- soc2013/def/crashdump-head/sys/conf/files Sun Jul 19 10:45:58 2015 (r288546) +++ soc2013/def/crashdump-head/sys/conf/files Sun Jul 19 11:50:39 2015 (r288547) @@ -516,9 +516,9 @@ crypto/des/des_ecb.c optional crypto | ipsec | netsmb crypto/des/des_setkey.c optional crypto | ipsec | netsmb crypto/rc4/rc4.c optional netgraph_mppc_encryption | kgssapi -crypto/rijndael/rijndael-alg-fst.c optional crypto | geom_bde | \ +crypto/rijndael/rijndael-alg-fst.c optional crypto | ekcd | geom_bde | \ ipsec | random | wlan_ccmp -crypto/rijndael/rijndael-api-fst.c optional geom_bde | random +crypto/rijndael/rijndael-api-fst.c optional ekcd | geom_bde | random crypto/rijndael/rijndael-api.c optional crypto | ipsec | wlan_ccmp crypto/sha1.c optional carp | crypto | ipsec | \ netgraph_mppc_encryption | sctp From owner-svn-soc-all@freebsd.org Sun Jul 19 11:51:00 2015 Return-Path: Delivered-To: svn-soc-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id C1F1C9A4EEF for ; Sun, 19 Jul 2015 11:51:00 +0000 (UTC) (envelope-from def@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id B379B1C8D for ; Sun, 19 Jul 2015 11:51:00 +0000 (UTC) (envelope-from def@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.15.2/8.15.2) with ESMTP id t6JBp0Wk029201 for ; Sun, 19 Jul 2015 11:51:00 GMT (envelope-from def@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.15.2/8.15.2/Submit) id t6JBp0qB029135 for svn-soc-all@FreeBSD.org; Sun, 19 Jul 2015 11:51:00 GMT (envelope-from def@FreeBSD.org) Date: Sun, 19 Jul 2015 11:51:00 GMT Message-Id: <201507191151.t6JBp0qB029135@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to def@FreeBSD.org using -f From: def@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r288548 - soc2013/def/crashdump-head/sys/conf MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 19 Jul 2015 11:51:00 -0000 Author: def Date: Sun Jul 19 11:50:59 2015 New Revision: 288548 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=288548 Log: Add EKCD option to NOTES. Modified: soc2013/def/crashdump-head/sys/conf/NOTES Modified: soc2013/def/crashdump-head/sys/conf/NOTES ============================================================================== --- soc2013/def/crashdump-head/sys/conf/NOTES Sun Jul 19 11:50:39 2015 (r288547) +++ soc2013/def/crashdump-head/sys/conf/NOTES Sun Jul 19 11:50:59 2015 (r288548) @@ -2982,3 +2982,6 @@ # zlib I/O stream support # This enables support for compressed core dumps. options GZIO + +# Unattended encrypted kernel crash dumps +options EKCD From owner-svn-soc-all@freebsd.org Tue Jul 21 12:55:09 2015 Return-Path: Delivered-To: svn-soc-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 69A1F9A7A64 for ; Tue, 21 Jul 2015 12:55:09 +0000 (UTC) (envelope-from stefano@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 40D061FEA for ; Tue, 21 Jul 2015 12:55:09 +0000 (UTC) (envelope-from stefano@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.15.2/8.15.2) with ESMTP id t6LCt9FC023176 for ; Tue, 21 Jul 2015 12:55:09 GMT (envelope-from stefano@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.15.2/8.15.2/Submit) id t6LCt8bm023164 for svn-soc-all@FreeBSD.org; Tue, 21 Jul 2015 12:55:08 GMT (envelope-from stefano@FreeBSD.org) Date: Tue, 21 Jul 2015 12:55:08 GMT Message-Id: <201507211255.t6LCt8bm023164@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to stefano@FreeBSD.org using -f From: stefano@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r288605 - soc2015/stefano MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 21 Jul 2015 12:55:09 -0000 Author: stefano Date: Tue Jul 21 12:55:08 2015 New Revision: 288605 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=288605 Log: update timetable in README Modified: soc2015/stefano/README Modified: soc2015/stefano/README ============================================================================== --- soc2015/stefano/README Tue Jul 21 10:52:05 2015 (r288604) +++ soc2015/stefano/README Tue Jul 21 12:55:08 2015 (r288605) @@ -48,19 +48,19 @@ but we don't know if it is possible in easy way also in bhyve. D3 (due by week 9): -implement notification mechanism in bhyve/FreeBSD. We want to have a similar -mechanism to ioeventfd and irqfd available in linux, to exchange notifications -between guest and host threads. Risk factor: We don't know how long it takes -because in linux we had eventfd already implemented. - -D4 (due by the end of project): kernel thread in netmap host adapter to implement ptnetmap on FreeBSD host. We expect to have the same performance of KVM (over 20 Mpps on VALE port; over -75 Mpps on netmap-pipe; line rate [14.88 Mpps] on Physical [10Gbps] NICs). +50 Mpps on netmap-pipe; line rate [14.88 Mpps] on Physical [10Gbps] NICs). The code that the kthread runs, is already done. We need to implement only the functions to create/delete kernel thread and to handle notifications. (~300 loc on linux). +D4 (due by the end of project): +implement notification mechanism in bhyve/FreeBSD. We want to have a similar +mechanism to ioeventfd and irqfd available in linux, to exchange notifications +between guest and host threads. Risk factor: We don't know how long it takes +because in linux we had eventfd already implemented. + ================================ Milestones ==================================== Start date: 2015/05/25 Estimated end dates: 2015/08/17-21 @@ -70,16 +70,16 @@ add ptnetmap support to virtio device driver and QEMU frontend [D1]. Week 3: --- DONE --- test, bugfix, and performance evaluation [D1]. -Week 4-5: --- STARTED --- +Week 4-5: --- DONE --- write code to map netmap host memory into the guest [D2]. -Week 6: +Week 6: --- DONE --- test and bugfix [D2]. prepare documents to mid-term evaluation. -Week 7-8: -implement notification mechanism in bhyve/freebsd [D3]. -Week 9: +Week 7-8: --- DONE --- +implement kernel thread in netmap host adapter [D3]. +Week 9: --- DONE --- test and bugfix [D3]. -Week 10: -implement kernel thread in netmap host adapter [D4]. +Week 10: --- STARTED --- +implement notification mechanism in bhyve/freebsd [D4]. Week 11: test and performance evaluation [D4]. Week 12: From owner-svn-soc-all@freebsd.org Tue Jul 21 13:41:34 2015 Return-Path: Delivered-To: svn-soc-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id B87419A5168 for ; Tue, 21 Jul 2015 13:41:34 +0000 (UTC) (envelope-from stefano@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id A920816B7 for ; Tue, 21 Jul 2015 13:41:34 +0000 (UTC) (envelope-from stefano@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.15.2/8.15.2) with ESMTP id t6LDfYJY008343 for ; Tue, 21 Jul 2015 13:41:34 GMT (envelope-from stefano@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.15.2/8.15.2/Submit) id t6LDfXl5008075 for svn-soc-all@FreeBSD.org; Tue, 21 Jul 2015 13:41:33 GMT (envelope-from stefano@FreeBSD.org) Date: Tue, 21 Jul 2015 13:41:33 GMT Message-Id: <201507211341.t6LDfXl5008075@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to stefano@FreeBSD.org using -f From: stefano@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r288610 - soc2015/stefano/ptnetmap/stable/10/sys/amd64/vmm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 21 Jul 2015 13:41:34 -0000 Author: stefano Date: Tue Jul 21 13:41:33 2015 New Revision: 288610 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=288610 Log: vmm_mem: removed unused functions Modified: soc2015/stefano/ptnetmap/stable/10/sys/amd64/vmm/vmm_mem.c soc2015/stefano/ptnetmap/stable/10/sys/amd64/vmm/vmm_mem.h Modified: soc2015/stefano/ptnetmap/stable/10/sys/amd64/vmm/vmm_mem.c ============================================================================== --- soc2015/stefano/ptnetmap/stable/10/sys/amd64/vmm/vmm_mem.c Tue Jul 21 12:53:47 2015 (r288609) +++ soc2015/stefano/ptnetmap/stable/10/sys/amd64/vmm/vmm_mem.c Tue Jul 21 13:41:33 2015 (r288610) @@ -55,57 +55,6 @@ return (0); } -static vm_object_t -vmm_mmio_alloc_sg(struct vmspace *vmspace, vm_paddr_t gpa, size_t len, - struct sglist *sg) -{ - int error; - vm_object_t obj; - - obj = vm_pager_allocate(OBJT_SG, sg, len, VM_PROT_RW, 0, NULL); - if (obj != NULL) { - error = vm_map_find(&vmspace->vm_map, obj, 0, &gpa, len, 0, - VMFS_NO_SPACE, VM_PROT_RW, VM_PROT_RW, 0); - if (error != KERN_SUCCESS) { - vm_object_deallocate(obj); - obj = NULL; - } - } - - return (obj); -} - -#define VMM_MEM_USER_NSEGS 100000 /* XXX-stefano: find a correct nsegs */ - -vm_object_t -vmm_mmio_alloc_user(struct vmspace *vmspace, vm_paddr_t gpa, size_t len, - void *buf, struct thread *td) -{ - int error; - vm_object_t obj; - struct sglist *sg; - - sg = sglist_alloc(VMM_MEM_USER_NSEGS, M_WAITOK); - error = sglist_append_user(sg, buf, len, td); - KASSERT(error == 0, ("error %d appending user-space buffer to sglist", error)); - - obj = vmm_mmio_alloc_sg(vmspace, gpa, len, sg); - /* - * Drop the reference on the sglist. - * - * If the scatter/gather object was successfully allocated then it - * has incremented the reference count on the sglist. Dropping the - * initial reference count ensures that the sglist will be freed - * when the object is deallocated. - * - * If the object could not be allocated then we end up freeing the - * sglist. - */ - sglist_free(sg); - - return (obj); -} - vm_object_t vmm_mmio_alloc(struct vmspace *vmspace, vm_paddr_t gpa, size_t len, vm_paddr_t hpa) @@ -118,21 +67,30 @@ error = sglist_append_phys(sg, hpa, len); KASSERT(error == 0, ("error %d appending physaddr to sglist", error)); - obj = vmm_mmio_alloc_sg(vmspace, gpa, len, sg); - /* - * VT-x ignores the MTRR settings when figuring out the - * memory type for translations obtained through EPT. - * - * Therefore we explicitly force the pages provided by - * this object to be mapped as uncacheable. - */ - VM_OBJECT_WLOCK(obj); - error = vm_object_set_memattr(obj, VM_MEMATTR_UNCACHEABLE); - VM_OBJECT_WUNLOCK(obj); - if (error != KERN_SUCCESS) { - panic("vmm_mmio_alloc: vm_object_set_memattr error %d", + obj = vm_pager_allocate(OBJT_SG, sg, len, VM_PROT_RW, 0, NULL); + if (obj != NULL) { + /* + * VT-x ignores the MTRR settings when figuring out the + * memory type for translations obtained through EPT. + * + * Therefore we explicitly force the pages provided by + * this object to be mapped as uncacheable. + */ + VM_OBJECT_WLOCK(obj); + error = vm_object_set_memattr(obj, VM_MEMATTR_UNCACHEABLE); + VM_OBJECT_WUNLOCK(obj); + if (error != KERN_SUCCESS) { + panic("vmm_mmio_alloc: vm_object_set_memattr error %d", error); + } + error = vm_map_find(&vmspace->vm_map, obj, 0, &gpa, len, 0, + VMFS_NO_SPACE, VM_PROT_RW, VM_PROT_RW, 0); + if (error != KERN_SUCCESS) { + vm_object_deallocate(obj); + obj = NULL; + } } + /* * Drop the reference on the sglist. * Modified: soc2015/stefano/ptnetmap/stable/10/sys/amd64/vmm/vmm_mem.h ============================================================================== --- soc2015/stefano/ptnetmap/stable/10/sys/amd64/vmm/vmm_mem.h Tue Jul 21 12:53:47 2015 (r288609) +++ soc2015/stefano/ptnetmap/stable/10/sys/amd64/vmm/vmm_mem.h Tue Jul 21 13:41:33 2015 (r288610) @@ -36,8 +36,6 @@ struct vm_object *vmm_mem_alloc(struct vmspace *, vm_paddr_t gpa, size_t size); struct vm_object *vmm_mmio_alloc(struct vmspace *, vm_paddr_t gpa, size_t len, vm_paddr_t hpa); -struct vm_object *vmm_mmio_alloc_user(struct vmspace *, vm_paddr_t gpa, - size_t len, void *buf, struct thread *td); void vmm_mem_free(struct vmspace *, vm_paddr_t gpa, size_t size); void vmm_mmio_free(struct vmspace *, vm_paddr_t gpa, size_t size); vm_paddr_t vmm_mem_maxaddr(void); From owner-svn-soc-all@freebsd.org Tue Jul 21 13:42:25 2015 Return-Path: Delivered-To: svn-soc-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 0B9069A526D for ; Tue, 21 Jul 2015 13:42:25 +0000 (UTC) (envelope-from stefano@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id F0B851883 for ; Tue, 21 Jul 2015 13:42:24 +0000 (UTC) (envelope-from stefano@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.15.2/8.15.2) with ESMTP id t6LDgOxX009401 for ; Tue, 21 Jul 2015 13:42:24 GMT (envelope-from stefano@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.15.2/8.15.2/Submit) id t6LDgOVL009389 for svn-soc-all@FreeBSD.org; Tue, 21 Jul 2015 13:42:24 GMT (envelope-from stefano@FreeBSD.org) Date: Tue, 21 Jul 2015 13:42:24 GMT Message-Id: <201507211342.t6LDgOVL009389@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to stefano@FreeBSD.org using -f From: stefano@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r288611 - soc2015/stefano/ptnetmap/stable/10/sys/amd64/vmm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 21 Jul 2015 13:42:25 -0000 Author: stefano Date: Tue Jul 21 13:42:23 2015 New Revision: 288611 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=288611 Log: fix vmm_usermem_alloc() use the offset retuned by vm_map_lookup() into vm_map_find() Modified: soc2015/stefano/ptnetmap/stable/10/sys/amd64/vmm/vmm_usermem.c Modified: soc2015/stefano/ptnetmap/stable/10/sys/amd64/vmm/vmm_usermem.c ============================================================================== --- soc2015/stefano/ptnetmap/stable/10/sys/amd64/vmm/vmm_usermem.c Tue Jul 21 13:41:33 2015 (r288610) +++ soc2015/stefano/ptnetmap/stable/10/sys/amd64/vmm/vmm_usermem.c Tue Jul 21 13:42:23 2015 (r288611) @@ -131,7 +131,7 @@ printf("---- guest MAP vm_object_t: %p vm_pindex: %ld ----\n", obj, index); /* map th vm_object in the vmspace */ if (obj != NULL) { - error = vm_map_find(&vmspace->vm_map, obj, 0, &gpa, len, 0, + error = vm_map_find(&vmspace->vm_map, obj, index, &gpa, len, 0, VMFS_NO_SPACE, VM_PROT_RW, VM_PROT_RW, 0); if (error != KERN_SUCCESS) { vm_object_deallocate(obj); From owner-svn-soc-all@freebsd.org Tue Jul 21 13:49:45 2015 Return-Path: Delivered-To: svn-soc-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id F209C9A53D0 for ; Tue, 21 Jul 2015 13:49:45 +0000 (UTC) (envelope-from stefano@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id E131C1B44 for ; Tue, 21 Jul 2015 13:49:45 +0000 (UTC) (envelope-from stefano@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.15.2/8.15.2) with ESMTP id t6LDnjDc014450 for ; Tue, 21 Jul 2015 13:49:45 GMT (envelope-from stefano@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.15.2/8.15.2/Submit) id t6LDnhDl014426 for svn-soc-all@FreeBSD.org; Tue, 21 Jul 2015 13:49:43 GMT (envelope-from stefano@FreeBSD.org) Date: Tue, 21 Jul 2015 13:49:43 GMT Message-Id: <201507211349.t6LDnhDl014426@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to stefano@FreeBSD.org using -f From: stefano@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r288612 - soc2015/stefano/ptnetmap/stable/10/usr.sbin/bhyve MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 21 Jul 2015 13:49:46 -0000 Author: stefano Date: Tue Jul 21 13:49:42 2015 New Revision: 288612 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=288612 Log: add ptnetmap backend and ptnetmap_memdev Added: soc2015/stefano/ptnetmap/stable/10/usr.sbin/bhyve/pci_ptnetmap_memdev.c soc2015/stefano/ptnetmap/stable/10/usr.sbin/bhyve/pci_virtio_ptnetmap.h soc2015/stefano/ptnetmap/stable/10/usr.sbin/bhyve/ptnetmap.h Modified: soc2015/stefano/ptnetmap/stable/10/usr.sbin/bhyve/Makefile soc2015/stefano/ptnetmap/stable/10/usr.sbin/bhyve/net_backends.c soc2015/stefano/ptnetmap/stable/10/usr.sbin/bhyve/net_backends.h soc2015/stefano/ptnetmap/stable/10/usr.sbin/bhyve/pci_virtio_net.c Modified: soc2015/stefano/ptnetmap/stable/10/usr.sbin/bhyve/Makefile ============================================================================== --- soc2015/stefano/ptnetmap/stable/10/usr.sbin/bhyve/Makefile Tue Jul 21 13:42:23 2015 (r288611) +++ soc2015/stefano/ptnetmap/stable/10/usr.sbin/bhyve/Makefile Tue Jul 21 13:49:42 2015 (r288612) @@ -27,6 +27,7 @@ pci_irq.c \ pci_lpc.c \ pci_passthru.c \ + pci_ptnetmap_memdev.c \ pci_virtio_block.c \ pci_virtio_net.c \ pci_virtio_rnd.c \ Modified: soc2015/stefano/ptnetmap/stable/10/usr.sbin/bhyve/net_backends.c ============================================================================== --- soc2015/stefano/ptnetmap/stable/10/usr.sbin/bhyve/net_backends.c Tue Jul 21 13:42:23 2015 (r288611) +++ soc2015/stefano/ptnetmap/stable/10/usr.sbin/bhyve/net_backends.c Tue Jul 21 13:49:42 2015 (r288612) @@ -109,6 +109,8 @@ */ uint64_t (*set_features)(struct net_backend *be, uint64_t features); + struct ptnetmap_state * (*get_ptnetmap)(struct net_backend *be); + struct pci_vtnet_softc *sc; int fd; void *priv; /* Pointer to backend-specific data. */ @@ -164,6 +166,12 @@ return -1; /* never called, i believe */ } +static struct ptnetmap_state * +netbe_null_get_ptnetmap(struct net_backend *be) +{ + return NULL; +} + static struct net_backend null_backend = { .name = "null", .init = netbe_null_init, @@ -172,6 +180,7 @@ .recv = netbe_null_recv, .get_features = netbe_null_get_features, .set_features = netbe_null_set_features, + .get_ptnetmap = netbe_null_get_ptnetmap, }; DATA_SET(net_backend_set, null_backend); @@ -697,6 +706,265 @@ /* + * The ptnetmap backend + */ +#include +#include "net/netmap.h" +#include "dev/netmap/netmap_virt.h" +#include "ptnetmap.h" + +struct ptnbe_priv { + struct netmap_priv up; + struct ptnetmap_state ptns; + int created; /* ptnetmap kthreads created */ + unsigned long features; /* ptnetmap features */ + unsigned long acked_features; /* ptnetmap acked features */ +}; + + + +/* The virtio-net features supported by ptnetmap. */ +#define VIRTIO_NET_F_PTNETMAP 0x2000000 /* ptnetmap available */ + +#define PTNETMAP_FEATURES VIRTIO_NET_F_PTNETMAP + +static uint64_t +ptnbe_get_features(struct net_backend *be) +{ + return PTNETMAP_FEATURES; +} + +static uint64_t +ptnbe_set_features(struct net_backend *be, uint64_t features) +{ + if (features & PTNETMAP_FEATURES) { + WPRINTF(("ptnbe_set_features\n")); + } + + return 0; +} + +#define PTNETMAP_NAME_HDR 2 + +static void ptnbe_init_ptnetmap(struct net_backend *be); + +static int +ptnbe_init(struct net_backend *be, const char *devname, + net_backend_cb_t cb, void *param) +{ + const char *ndname = "/dev/netmap"; + struct ptnbe_priv *priv = NULL; + struct netmap_priv *npriv; + struct nmreq req; + char tname[40]; + + priv = calloc(1, sizeof(struct ptnbe_priv)); + if (priv == NULL) { + WPRINTF(("Unable alloc netmap private data\n")); + return -1; + } + WPRINTF(("ptnbe_init(): devname '%s'\n", devname)); + + npriv = &priv->up; + strncpy(npriv->ifname, devname + PTNETMAP_NAME_HDR, sizeof(npriv->ifname)); + npriv->ifname[sizeof(npriv->ifname) - 1] = '\0'; + + memset(&req, 0, sizeof(req)); + req.nr_flags |= NR_PASSTHROUGH_HOST; + + npriv->nmd = nm_open(npriv->ifname, &req, NETMAP_NO_TX_POLL, NULL); + if (npriv->nmd == NULL) { + WPRINTF(("Unable to nm_open(): device '%s', " + "interface '%s', errno (%s)\n", + ndname, devname, strerror(errno))); + goto err_open; + } +#if 0 + /* check parent (nm_desc with the same allocator already mapped) */ + parent_nmd = netmap_find_parent(nmd); + /* mmap or inherit from parent */ + if (nm_mmap(nmd, parent_nmd)) { + error_report("failed to mmap %s: %s", netmap_opts->ifname, strerror(errno)); + nm_close(nmd); + return -1; + } +#endif + + + npriv->tx = NETMAP_TXRING(npriv->nmd->nifp, 0); + npriv->rx = NETMAP_RXRING(npriv->nmd->nifp, 0); + + npriv->cb = cb; + npriv->cb_param = param; + + be->fd = npriv->nmd->fd; + be->priv = priv; + + ptnbe_init_ptnetmap(be); + + return 0; + +err_open: + free(priv); + + return -1; +} + +static void +ptnbe_cleanup(struct net_backend *be) +{ + struct ptnbe_priv *priv = be->priv; + + if (priv) { + nm_close(priv->up.nmd); + } + be->fd = -1; +} + +struct ptnetmap_state * +ptnbe_get_ptnetmap(struct net_backend *be) +{ + struct ptnbe_priv *priv = be->priv; + + return &priv->ptns; +} + +static void +ptnbe_init_ptnetmap(struct net_backend *be) +{ + struct ptnbe_priv *priv = be->priv; + + ptn_memdev_attach(priv->up.nmd->mem, priv->up.nmd->memsize, priv->up.nmd->req.nr_arg2); + + priv->ptns.ptn_be = be; + priv->created = 0; + priv->features = NET_PTN_FEATURES_BASE; + priv->acked_features = 0; +} + +/* return the subset of requested features that we support */ +uint32_t +ptnetmap_get_features(struct ptnetmap_state *ptns, uint32_t features) +{ + struct ptnbe_priv *priv = ptns->ptn_be->priv; + + return priv->features & features; +} + +/* store the agreed upon features */ +void +ptnetmap_ack_features(struct ptnetmap_state *ptns, uint32_t features) +{ + struct ptnbe_priv *priv = ptns->ptn_be->priv; + + priv->acked_features |= features; +} + +int +ptnetmap_get_mem(struct ptnetmap_state *ptns) +{ + struct netmap_priv *npriv = ptns->ptn_be->priv; + + if (npriv->nmd == NULL) + return EINVAL; + + ptns->offset = npriv->nmd->req.nr_offset; + ptns->num_tx_rings = npriv->nmd->req.nr_tx_rings; + ptns->num_rx_rings = npriv->nmd->req.nr_rx_rings; + ptns->num_tx_slots = npriv->nmd->req.nr_tx_slots; + ptns->num_rx_slots = npriv->nmd->req.nr_rx_slots; + + return 0; +} + +int +ptnetmap_get_hostmemid(struct ptnetmap_state *ptns) +{ + struct netmap_priv *npriv = ptns->ptn_be->priv; + + if (npriv->nmd == NULL) + return EINVAL; + + return npriv->nmd->req.nr_arg2; +} + +int +ptnetmap_create(struct ptnetmap_state *ptns, struct ptnetmap_cfg *conf) +{ + struct ptnbe_priv *priv = ptns->ptn_be->priv; + struct nmreq req; + int err; + + if (!(priv->acked_features & NET_PTN_FEATURES_BASE)) { + printf("ptnetmap features not acked\n"); + return EFAULT; + } + + if (priv->created) + return 0; + + /* TODO: ioctl to start kthreads */ +#if 1 + memset(&req, 0, sizeof(req)); + strncpy(req.nr_name, priv->up.ifname, sizeof(req.nr_name)); + req.nr_version = NETMAP_API; + ptnetmap_write_cfg(&req, conf); + req.nr_cmd = NETMAP_PT_HOST_CREATE; + err = ioctl(priv->up.nmd->fd, NIOCREGIF, &req); + if (err) { + printf("Unable to execute NETMAP_PT_HOST_CREATE on %s: %s\n", + priv->up.ifname, strerror(errno)); + } else + priv->created = 1; +#endif + + + return err; +} + +int +ptnetmap_delete(struct ptnetmap_state *ptns) +{ + struct ptnbe_priv *priv = ptns->ptn_be->priv; + struct nmreq req; + int err; + + if (!(priv->acked_features & NET_PTN_FEATURES_BASE)) { + printf("ptnetmap features not acked\n"); + return EFAULT; + } + + if (!priv->created) + return 0; + + /* TODO: ioctl to stop kthreads */ + memset(&req, 0, sizeof(req)); + strncpy(req.nr_name, priv->up.ifname, sizeof(req.nr_name)); + req.nr_version = NETMAP_API; + req.nr_cmd = NETMAP_PT_HOST_DELETE; + err = ioctl(priv->up.nmd->fd, NIOCREGIF, &req); + if (err) { + printf("Unable to execute NETMAP_PT_HOST_DELETE on %s: %s\n", + priv->up.ifname, strerror(errno)); + } + priv->created = 0; + + return 0; +} + +static struct net_backend ptnbe_backend = { + .name = "ptnetmap|ptvale", + .init = ptnbe_init, + .cleanup = ptnbe_cleanup, + .get_features = ptnbe_get_features, + .set_features = ptnbe_set_features, + .get_ptnetmap = ptnbe_get_ptnetmap, +}; + +DATA_SET(net_backend_set, ptnbe_backend); + + +/* * make sure a backend is properly initialized */ static void @@ -734,6 +1002,11 @@ be, be->name); be->set_features = netbe_null_set_features; } + if (be->get_ptnetmap == NULL) { + /*fprintf(stderr, "missing set_features for %p %s\n", + be, be->name);*/ + be->get_ptnetmap = netbe_null_get_ptnetmap; + } } /* @@ -848,3 +1121,11 @@ return -1; return be->recv(be, iov, iovcnt, more); } + +struct ptnetmap_state * +netbe_get_ptnetmap(struct net_backend *be) +{ + if (be == NULL) + return NULL; + return be->get_ptnetmap(be); +} Modified: soc2015/stefano/ptnetmap/stable/10/usr.sbin/bhyve/net_backends.h ============================================================================== --- soc2015/stefano/ptnetmap/stable/10/usr.sbin/bhyve/net_backends.h Tue Jul 21 13:42:23 2015 (r288611) +++ soc2015/stefano/ptnetmap/stable/10/usr.sbin/bhyve/net_backends.h Tue Jul 21 13:49:42 2015 (r288612) @@ -33,6 +33,8 @@ typedef void (*net_backend_cb_t)(int, enum ev_type, void *param); +struct ptnetmap_state; + /* Interface between virtio-net and the network backend. */ struct net_backend; @@ -45,5 +47,6 @@ int iovcnt, int len, int more); int netbe_recv(struct net_backend *be, struct iovec *iov, int iovcnt, int *more); +struct ptnetmap_state *netbe_get_ptnetmap(struct net_backend *be); #endif /* __NET_BACKENDS_H__ */ Added: soc2015/stefano/ptnetmap/stable/10/usr.sbin/bhyve/pci_ptnetmap_memdev.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ soc2015/stefano/ptnetmap/stable/10/usr.sbin/bhyve/pci_ptnetmap_memdev.c Tue Jul 21 13:49:42 2015 (r288612) @@ -0,0 +1,324 @@ +#include +__FBSDID("$FreeBSD$"); + +#include +//#include +#include +#include +#include +//#include +//#include +//#include +//#include + +#include +#include +#include "bhyverun.h" +#include "pci_emul.h" +#include "ptnetmap.h" + + +/* ptnetmap memdev PCI-ID and PCI-BARS XXX-ste: remove*/ +#define PTN_MEMDEV_NAME "ptnetmap-memdev" +#define PTNETMAP_PCI_VENDOR_ID 0x3333 /* XXX-ste: set vendor_id */ +#define PTNETMAP_PCI_DEVICE_ID 0x0001 +#define PTNETMAP_IO_PCI_BAR 0 +#define PTNETMAP_MEM_PCI_BAR 1 + +/* ptnetmap memdev register */ +/* 32 bit r/o */ +#define PTNETMAP_IO_PCI_FEATURES 0 +/* 32 bit r/o */ +#define PTNETMAP_IO_PCI_MEMSIZE 4 +/* 16 bit r/o */ +#define PTNETMAP_IO_PCI_HOSTID 8 +#define PTNEMTAP_IO_SIZE 10 + +struct ptn_memdev_softc { + struct pci_devinst *pi; /* PCI device instance */ + + void *mem_ptr; /* netmap shared memory */ + uint64_t mem_size; /* netmap shared memory size */ + uint16_t mem_id; /* netmap memory allocator ID */ + + TAILQ_ENTRY(ptn_memdev_softc) next; +}; +static TAILQ_HEAD(, ptn_memdev_softc) ptn_memdevs = TAILQ_HEAD_INITIALIZER(ptn_memdevs); + +/* + * find ptn_memdev through mem_id + */ +static struct ptn_memdev_softc * +ptn_memdev_find_memid(uint16_t mem_id) +{ + struct ptn_memdev_softc *sc; + + TAILQ_FOREACH(sc, &ptn_memdevs, next) { + if (sc->mem_ptr != NULL && mem_id == sc->mem_id) { + return sc; + } + } + + return NULL; +} + +/* + * find ptn_memdev that has not memory + */ +static struct ptn_memdev_softc * +ptn_memdev_find_empty_mem() +{ + struct ptn_memdev_softc *sc; + + TAILQ_FOREACH(sc, &ptn_memdevs, next) { + if (sc->mem_ptr == NULL) { + return sc; + } + } + + return NULL; +} + +/* + * find ptn_memdev that has not PCI device istance + */ +static struct ptn_memdev_softc * +ptn_memdev_find_empty_pi() +{ + struct ptn_memdev_softc *sc; + + TAILQ_FOREACH(sc, &ptn_memdevs, next) { + if (sc->pi == NULL) { + return sc; + } + } + + return NULL; +} + +static struct ptn_memdev_softc * +ptn_memdev_create() +{ + struct ptn_memdev_softc *sc; + + sc = calloc(1, sizeof(struct ptn_memdev_softc)); + + if (sc != NULL) { + TAILQ_INSERT_TAIL(&ptn_memdevs, sc, next); + } + + return sc; +} + +static void +ptn_memdev_delete(struct ptn_memdev_softc *sc) +{ + TAILQ_REMOVE(&ptn_memdevs, sc, next); + + free(sc); +} + +static uint64_t +ptn_pci_read(struct vmctx *ctx, int vcpu, struct pci_devinst *pi, + int baridx, uint64_t offset, int size) +{ + struct ptn_memdev_softc *sc = pi->pi_arg; + uint64_t ret = 0; + + if (sc == NULL) + return 0; + + if (baridx == PTNETMAP_MEM_PCI_BAR) { + printf("ptnetmap_memdev: MEM read\n"); + printf("ptnentmap_memdev: mem_read - offset: %lx size: %d ret: %lx\n", offset, size, ret); + return 0; /* XXX */ + } + + /* XXX probably should do something better than just assert() */ + assert(baridx == PTNETMAP_IO_PCI_BAR); + + switch (offset) { + case PTNETMAP_IO_PCI_MEMSIZE: + ret = sc->mem_size; + break; + case PTNETMAP_IO_PCI_HOSTID: + ret = sc->mem_id; + break; + default: + printf("ptnentmap_memdev: read io reg unexpected\n"); + break; + } + + printf("ptnentmap_memdev: io_read - offset: %lx size: %d ret: %llu\n", offset, size,(unsigned long long)ret); + + return ret; +} + +static void +ptn_pci_write(struct vmctx *ctx, int vcpu, struct pci_devinst *pi, + int baridx, uint64_t offset, int size, uint64_t value) +{ + struct ptn_memdev_softc *sc = pi->pi_arg; + + if (sc == NULL) + return; + + if (baridx == PTNETMAP_MEM_PCI_BAR) { + printf("ptnetmap_memdev: MEM write\n"); + return; /* XXX */ + } + + /* XXX probably should do something better than just assert() */ + assert(baridx == PTNETMAP_IO_PCI_BAR); + + switch (offset) { + + default: + printf("ptnentmap_memdev: write io reg unexpected\n"); + break; + } + + + printf("ptnentmap_memdev: io_write - offset: %lx size: %d val: %lx\n", offset, size, value); +} + +static int +ptn_memdev_configure(struct ptn_memdev_softc *sc) +{ + int ret; + + printf("ptnetmap_memdev: configuring\n"); + + if (sc->pi == NULL || sc->mem_ptr == NULL) + return 0; + + + /* init iobar */ + ret = pci_emul_alloc_bar(sc->pi, PTNETMAP_IO_PCI_BAR, PCIBAR_IO, PTNEMTAP_IO_SIZE); + if (ret) { + printf("ptnetmap_memdev: iobar allocation error %d\n", ret); + return ret; + } + + + /* init membar */ + /* XXX MEM64 has MEM_PREFETCH */ + ret = pci_emul_alloc_bar(sc->pi, PTNETMAP_MEM_PCI_BAR, PCIBAR_MEM32, sc->mem_size); + if (ret) { + printf("ptnetmap_memdev: membar allocation error %d\n", ret); + return ret; + } + + printf("ptnetmap_memdev: pci_addr: %llx, mem_size: %llu, mem_ptr: %p\n", + (unsigned long long) sc->pi->pi_bar[PTNETMAP_MEM_PCI_BAR].addr, + (unsigned long long) sc->mem_size, sc->mem_ptr); + + ret = vm_map_user_buf(sc->pi->pi_vmctx, sc->pi->pi_bar[PTNETMAP_MEM_PCI_BAR].addr, + sc->mem_size, sc->mem_ptr); + if (ret) { + printf("ptnetmap_memdev: membar map error %d\n", ret); + return ret; + } + + printf("ptnetmap_memdev: configured\n"); + + return 0; +} + +static int +ptn_memdev_init(struct vmctx *ctx, struct pci_devinst *pi, char *opts) +{ + struct ptn_memdev_softc *sc; + uint64_t size; + int ret; + + printf("ptnetmap_memdev: loading\n"); + + sc = ptn_memdev_find_empty_pi(); + if (sc == NULL) { + sc = ptn_memdev_create(); + if (sc == NULL) { + printf("ptnetmap_memdev: calloc error\n"); + return (ENOMEM); + } + } + + /* link our softc in pi */ + pi->pi_arg = sc; + sc->pi = pi; + + /* initialize config space */ + pci_set_cfgdata16(pi, PCIR_VENDOR, PTNETMAP_PCI_VENDOR_ID); + pci_set_cfgdata16(pi, PCIR_DEVICE, PTNETMAP_PCI_DEVICE_ID); + pci_set_cfgdata8(pi, PCIR_CLASS, PCIC_NETWORK); + pci_set_cfgdata16(pi, PCIR_SUBDEV_0, 1); /* XXX-ste remove? */ + pci_set_cfgdata16(pi, PCIR_SUBVEND_0, PTNETMAP_PCI_VENDOR_ID); /* XXX-ste remove? */ + + ret = ptn_memdev_configure(sc); + if (ret) { + printf("ptnetmap_memdev: configure error\n"); + goto err; + } + + printf("ptnetmap_memdev: loaded\n"); + + return (0); +err: + ptn_memdev_delete(sc); + pi->pi_arg = NULL; + return ret; +} + +int +ptn_memdev_attach(void *mem_ptr, uint32_t mem_size, uint16_t mem_id) +{ + struct ptn_memdev_softc *sc; + int ret; + printf("ptnetmap_memdev: attaching\n"); + + /* if a device with the same mem_id is already attached, we are done */ + if (ptn_memdev_find_memid(mem_id)) { + printf("ptnetmap_memdev: already attched\n"); + return 0; + } + + sc = ptn_memdev_find_empty_mem(); + if (sc == NULL) { + sc = ptn_memdev_create(); + if (sc == NULL) { + printf("ptnetmap_memdev: calloc error\n"); + return (ENOMEM); + } + } + + sc->mem_ptr = mem_ptr; + sc->mem_size = mem_size; + sc->mem_id = mem_id; + + printf("ptnetmap_memdev_attach: mem_id: %u, mem_size: %lu, mem_ptr: %p\n", mem_id, + (unsigned long) mem_size, mem_ptr); + + /* TODO: configure device BARs */ + ret = ptn_memdev_configure(sc); + if (ret) { + printf("ptnetmap_memdev: configure error\n"); + goto err; + } + + printf("ptnetmap_memdev: attached\n"); + + return 0; +err: + ptn_memdev_delete(sc); + sc->pi->pi_arg = NULL; + return ret; +} + + +struct pci_devemu pci_de_ptnetmap = { + .pe_emu = PTN_MEMDEV_NAME, + .pe_init = ptn_memdev_init, + .pe_barwrite = ptn_pci_write, + .pe_barread = ptn_pci_read +}; +PCI_EMUL_SET(pci_de_ptnetmap); Modified: soc2015/stefano/ptnetmap/stable/10/usr.sbin/bhyve/pci_virtio_net.c ============================================================================== --- soc2015/stefano/ptnetmap/stable/10/usr.sbin/bhyve/pci_virtio_net.c Tue Jul 21 13:42:23 2015 (r288611) +++ soc2015/stefano/ptnetmap/stable/10/usr.sbin/bhyve/pci_virtio_net.c Tue Jul 21 13:49:42 2015 (r288612) @@ -93,6 +93,7 @@ struct virtio_net_config { uint8_t mac[6]; uint16_t status; + uint16_t max_virtqueue_pairs; } __packed; /* @@ -124,6 +125,25 @@ #define DPRINTF(params) if (pci_vtnet_debug) printf params #define WPRINTF(params) printf params + +#define BHYVE_VIRTIO_PTNETMAP +#ifdef BHYVE_VIRTIO_PTNETMAP +#include +#include +#include "net/netmap.h" +#include "dev/netmap/netmap_virt.h" + +struct pci_vtnet_ptnetmap { + struct paravirt_csb *csb; /* Communication Status Block. */ + uint32_t features; /* ptnetmap features */ + int up; /* ptnetmap up/down */ + struct ptnetmap_state *state; /* ptnetmap state (shared with backend) */ + struct ptnetmap_cfg cfg; /* ptnetmap configuration */ + + /* ptnetmap register */ + uint8_t reg[PTNEMTAP_VIRTIO_IO_SIZE]; +}; +#endif /* * Per-device softc */ @@ -149,8 +169,15 @@ pthread_mutex_t tx_mtx; pthread_cond_t tx_cond; int tx_in_progress; +#ifdef BHYVE_VIRTIO_PTNETMAP + struct pci_vtnet_ptnetmap ptn; +#endif }; +#ifdef BHYVE_VIRTIO_PTNETMAP +#include "pci_virtio_ptnetmap.h" +#endif + static void pci_vtnet_reset(void *); /* static void pci_vtnet_notify(void *, struct vqueue_info *); */ static int pci_vtnet_cfgread(void *, int, int, uint32_t *); @@ -555,6 +582,9 @@ WPRINTF(("net backend initialization failed\n")); } else { vc->vc_hv_caps |= netbe_get_features(sc->vsc_be); +#ifdef BHYVE_VIRTIO_PTNETMAP + pci_vtnet_ptnetmap_init(sc, vc); +#endif /* BHYVE_VIRTIO_PTNETMAP */ } free(devname); } @@ -633,6 +663,10 @@ */ ptr = &sc->vsc_config.mac[offset]; memcpy(ptr, &value, size); +#ifdef BHYVE_VIRTIO_PTNETMAP + } else if (offset >= PTNETMAP_VIRTIO_IO_BASE) { + pci_vtnet_ptnetmap_write(sc, offset, size, value); +#endif } else { /* silently ignore other writes */ DPRINTF(("vtnet: write to readonly reg %d\n\r", offset)); @@ -647,6 +681,12 @@ struct pci_vtnet_softc *sc = vsc; void *ptr; +#ifdef BHYVE_VIRTIO_PTNETMAP + if (offset >= PTNETMAP_VIRTIO_IO_BASE) { + pci_vtnet_ptnetmap_read(sc, offset, size, retval); + return (0); + } +#endif ptr = (uint8_t *)&sc->vsc_config + offset; memcpy(retval, ptr, size); return (0); Added: soc2015/stefano/ptnetmap/stable/10/usr.sbin/bhyve/pci_virtio_ptnetmap.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ soc2015/stefano/ptnetmap/stable/10/usr.sbin/bhyve/pci_virtio_ptnetmap.h Tue Jul 21 13:49:42 2015 (r288612) @@ -0,0 +1,255 @@ +#ifndef __PCI_VIRTIO_PTNETMAP_H__ +#define __PCI_VIRTIO_PTNETMAP_H__ + +/* XXX-ste: move in other file and split in .c .h? */ +#ifdef BHYVE_VIRTIO_PTNETMAP + +/* ptnetmap virtio register BASE */ +#define PTNETMAP_VIRTIO_IO_BASE sizeof(struct virtio_net_config) +#include "ptnetmap.h" + +static void +ptnetmap_configure_csb(struct vmctx *ctx, struct paravirt_csb** csb, uint32_t csbbal, + uint32_t csbbah) +{ + uint64_t len = 4096; + uint64_t base = ((uint64_t)csbbah << 32) | csbbal; + + /* + * We require that writes to the CSB address registers + * are in the order CSBBAH , CSBBAL so on the second one + * we have a valid 64-bit memory address. + * Any previous region is unmapped, and handlers terminated. + * The CSB is then remapped if the new pointer is != 0 + */ + if (*csb) { + /* TODO: unmap */ + *csb = NULL; + } + if (base) { + *csb = paddr_guest2host(ctx, base, len); + } + +} + +static void +pci_vtnet_ptnetmap_init(struct pci_vtnet_softc *sc, struct virtio_consts *vc) +{ + sc->ptn.up = 0; + + sc->ptn.state = netbe_get_ptnetmap(sc->vsc_be); + if (sc->ptn.state == NULL) { + printf("ptnetmap not supported by backend\n"); + sc->ptn.features = 0; + return; + } + + sc->ptn.features = ptnetmap_get_features(sc->ptn.state, NET_PTN_FEATURES_BASE); + + /* backend require ptnetmap support? */ + if (!(sc->ptn.features & NET_PTN_FEATURES_BASE)) { + printf("ptnetmap not supported/required\n"); + sc->ptn.state = NULL; + sc->ptn.features = 0; + return; + } + + /* extend cfgsize. virtio creates PCIBAR for us */ + vc->vc_cfgsize += PTNEMTAP_VIRTIO_IO_SIZE; + + printf("ptnetmap-virtio init END\n"); +} + +static int +pci_vtnet_ptnetmap_get_mem(struct pci_vtnet_softc *sc) +{ + struct ptnetmap_state *ptns = sc->ptn.state; + struct paravirt_csb *csb = sc->ptn.csb; + int ret; + + ret = ptnetmap_get_mem(ptns); + if (ret) + return ret; + + if (csb == NULL) { + printf("ERROR ptnetmap: csb not initialized\n"); + return ret; + } + csb->nifp_offset = ptns->offset; + csb->num_tx_rings = ptns->num_tx_rings; + csb->num_rx_rings = ptns->num_rx_rings; + csb->num_tx_slots = ptns->num_tx_slots; + csb->num_rx_slots = ptns->num_rx_slots; + printf("txr %u rxr %u txd %u rxd %u nifp_offset %u\n", + csb->num_tx_rings, + csb->num_rx_rings, + csb->num_tx_slots, + csb->num_rx_slots, + csb->nifp_offset); + + return ret; +} + +static int +pci_vtnet_ptnetmap_up(struct pci_vtnet_softc *sc) +{ + struct ptnetmap_state *ptns = sc->ptn.state; + struct paravirt_csb *csb = sc->ptn.csb; + int ret; + + if (sc->ptn.up) { + printf("ERROR ptnetmap: already UP\n"); + return -1; + } + + if (csb == NULL) { + printf("ERROR ptnetmap: CSB undefined\n"); + return -1; + } + + /* TODO-ste: add support for multiqueue */ + + /* TODO: Stop processing guest/host IO notifications in qemu. + * Start processing them in ptnetmap. + */ + + + /* Configure the RX ring */ + sc->ptn.cfg.rx_ring.ioeventfd = -1; + sc->ptn.cfg.rx_ring.irqfd = -1; + + /* Configure the TX ring */ + sc->ptn.cfg.tx_ring.ioeventfd = -1; + sc->ptn.cfg.tx_ring.irqfd = -1; + + /* TODO: push fake-elem in the tx/rx queue to enable interrupts */ + + /* Initialize CSB */ + sc->ptn.cfg.csb = sc->ptn.csb; + sc->ptn.csb->host_need_txkick = 1; + sc->ptn.csb->guest_need_txkick = 0; + sc->ptn.csb->guest_need_rxkick = 1; + sc->ptn.csb->host_need_rxkick = 1; + + sc->ptn.cfg.features = PTNETMAP_CFG_FEAT_CSB | PTNETMAP_CFG_FEAT_EVENTFD; + + /* Configure the net backend. */ + ret = ptnetmap_create(sc->ptn.state, &sc->ptn.cfg); + if (ret) + goto err_ptn_create; + + sc->ptn.up = 1; + + return (0); + +err_ptn_create: + return (ret); +} + +static int +pci_vtnet_ptnetmap_down(struct pci_vtnet_softc *sc) +{ + int ret; + + if (!sc->ptn.state || !sc->ptn.up) { + return (0); + } + + sc->ptn.up = 0; + /* + * TODO: Start processing guest/host IO notifications in qemu. + */ + + return (ptnetmap_delete(sc->ptn.state)); +} + +static int +pci_vtnet_ptnetmap_write(struct pci_vtnet_softc *sc, int offset, int size, uint32_t value) +{ + uint32_t *val, ret; + + if (sc->ptn.state == NULL) { + printf("ERROR ptnetmap: not supported by backend\n"); + return -1; + } + + offset -= PTNETMAP_VIRTIO_IO_BASE; + memcpy(&sc->ptn.reg[offset], &value, size); + + switch (offset) { + case PTNETMAP_VIRTIO_IO_PTFEAT: + val = (uint32_t *)(sc->ptn.reg + offset); + ret = (sc->ptn.features &= *val); + ptnetmap_ack_features(sc->ptn.state, sc->ptn.features); + printf("ptnetmap acked features: %x\n", sc->ptn.features); + + sc->ptn.reg[PTNETMAP_VIRTIO_IO_PTFEAT] = ret; + break; + case PTNETMAP_VIRTIO_IO_PTCTL: + val = (uint32_t *)(sc->ptn.reg + offset); + + ret = EINVAL; + switch(*val) { + case NET_PARAVIRT_PTCTL_CONFIG: + ret = pci_vtnet_ptnetmap_get_mem(sc); + break; + case NET_PARAVIRT_PTCTL_REGIF: + ret = pci_vtnet_ptnetmap_up(sc); + break; + case NET_PARAVIRT_PTCTL_UNREGIF: + ret = pci_vtnet_ptnetmap_down(sc); + break; + case NET_PARAVIRT_PTCTL_HOSTMEMID: + ret = ptnetmap_get_hostmemid(sc->ptn.state); + break; + case NET_PARAVIRT_PTCTL_IFNEW: + case NET_PARAVIRT_PTCTL_IFDELETE: + case NET_PARAVIRT_PTCTL_FINALIZE: + case NET_PARAVIRT_PTCTL_DEREF: + ret = 0; + break; + } + printf("PTSTS - ret %d\n", ret); + sc->ptn.reg[PTNETMAP_VIRTIO_IO_PTSTS] = ret; + break; + case PTNETMAP_VIRTIO_IO_CSBBAH: + break; + case PTNETMAP_VIRTIO_IO_CSBBAL: + ptnetmap_configure_csb(sc->vsc_vs.vs_pi->pi_vmctx, &sc->ptn.csb, *((uint32_t *)(sc->ptn.reg + PTNETMAP_VIRTIO_IO_CSBBAL)), + *((uint32_t *)(sc->ptn.reg + PTNETMAP_VIRTIO_IO_CSBBAH))); + break; + default: + break; + } + + printf("ptnentmap_vtnet: io_write - offset: %d size: %d val: %u\n", offset, size, value); + + return (0); +} + +static int +pci_vtnet_ptnetmap_read(struct pci_vtnet_softc *sc, int offset, int size, uint32_t *value) +{ + if (sc->ptn.state == NULL) { + printf("ERROR ptnetmap: not supported by backend\n"); *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-soc-all@freebsd.org Tue Jul 21 14:01:48 2015 Return-Path: Delivered-To: svn-soc-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 52F489A5D56 for ; Tue, 21 Jul 2015 14:01:48 +0000 (UTC) (envelope-from stefano@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 437BF123E for ; Tue, 21 Jul 2015 14:01:48 +0000 (UTC) (envelope-from stefano@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.15.2/8.15.2) with ESMTP id t6LE1mk3057226 for ; Tue, 21 Jul 2015 14:01:48 GMT (envelope-from stefano@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.15.2/8.15.2/Submit) id t6LE1llF056997 for svn-soc-all@FreeBSD.org; Tue, 21 Jul 2015 14:01:47 GMT (envelope-from stefano@FreeBSD.org) Date: Tue, 21 Jul 2015 14:01:47 GMT Message-Id: <201507211401.t6LE1llF056997@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to stefano@FreeBSD.org using -f From: stefano@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r288614 - in soc2015/stefano/ptnetmap/stable/10: . release/picobsd/build MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 21 Jul 2015 14:01:48 -0000 Author: stefano Date: Tue Jul 21 14:01:47 2015 New Revision: 288614 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=288614 Log: picobsd: fix iso generation Modified: soc2015/stefano/ptnetmap/stable/10/ (props changed) soc2015/stefano/ptnetmap/stable/10/release/picobsd/build/picobsd Modified: soc2015/stefano/ptnetmap/stable/10/release/picobsd/build/picobsd ============================================================================== --- soc2015/stefano/ptnetmap/stable/10/release/picobsd/build/picobsd Tue Jul 21 13:25:56 2015 (r288613) +++ soc2015/stefano/ptnetmap/stable/10/release/picobsd/build/picobsd Tue Jul 21 14:01:47 2015 (r288614) @@ -888,7 +888,7 @@ # build_iso_image # XXX not implemented yet (cd ${BUILDDIR} cp -p /boot/cdboot ${dst}/boot || fail $? no_space "copying cdboot" - mkisofs -b boot/cdboot -no-emul-boot -J -r -ldots -l -L \ + mkisofs -b boot/cdboot -no-emul-boot -J -r -ldots -l -posix-L \ -o ${c_iso} ${dst} ) fi From owner-svn-soc-all@freebsd.org Tue Jul 21 14:02:49 2015 Return-Path: Delivered-To: svn-soc-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id A10229A5D71 for ; Tue, 21 Jul 2015 14:02:49 +0000 (UTC) (envelope-from stefano@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 919D6128C for ; Tue, 21 Jul 2015 14:02:49 +0000 (UTC) (envelope-from stefano@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.15.2/8.15.2) with ESMTP id t6LE2nAH064369 for ; Tue, 21 Jul 2015 14:02:49 GMT (envelope-from stefano@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.15.2/8.15.2/Submit) id t6LE2nVZ064353 for svn-soc-all@FreeBSD.org; Tue, 21 Jul 2015 14:02:49 GMT (envelope-from stefano@FreeBSD.org) Date: Tue, 21 Jul 2015 14:02:49 GMT Message-Id: <201507211402.t6LE2nVZ064353@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to stefano@FreeBSD.org using -f From: stefano@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r288615 - in soc2015/stefano/ptnetmap/stable/10: . release/picobsd/floppy.tree/etc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 21 Jul 2015 14:02:49 -0000 Author: stefano Date: Tue Jul 21 14:02:48 2015 New Revision: 288615 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=288615 Log: picobsd: enable tcp extensions Modified: soc2015/stefano/ptnetmap/stable/10/ (props changed) soc2015/stefano/ptnetmap/stable/10/release/picobsd/floppy.tree/etc/rc.conf.defaults Modified: soc2015/stefano/ptnetmap/stable/10/release/picobsd/floppy.tree/etc/rc.conf.defaults ============================================================================== --- soc2015/stefano/ptnetmap/stable/10/release/picobsd/floppy.tree/etc/rc.conf.defaults Tue Jul 21 14:01:47 2015 (r288614) +++ soc2015/stefano/ptnetmap/stable/10/release/picobsd/floppy.tree/etc/rc.conf.defaults Tue Jul 21 14:02:48 2015 (r288615) @@ -35,7 +35,7 @@ firewall_enable="NO" firewall_quiet="NO" # be quiet if set. firewall_type="" # Standard types or absolute pathname. -tcp_extensions="NO" # Allow RFC1323 & RFC1644 extensions (or NO). +tcp_extensions="YES" # Allow RFC1323 & RFC1644 extensions (or NO). ### Overrides for some files in /etc. Leave empty if no override, ### set variable (remember to use multiple lines) to override content. From owner-svn-soc-all@freebsd.org Tue Jul 21 14:10:23 2015 Return-Path: Delivered-To: svn-soc-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id AFAF39A5E52 for ; Tue, 21 Jul 2015 14:10:23 +0000 (UTC) (envelope-from stefano@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id A07D01597 for ; Tue, 21 Jul 2015 14:10:23 +0000 (UTC) (envelope-from stefano@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.15.2/8.15.2) with ESMTP id t6LEANg9067570 for ; Tue, 21 Jul 2015 14:10:23 GMT (envelope-from stefano@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.15.2/8.15.2/Submit) id t6LEAN8O067568 for svn-soc-all@FreeBSD.org; Tue, 21 Jul 2015 14:10:23 GMT (envelope-from stefano@FreeBSD.org) Date: Tue, 21 Jul 2015 14:10:23 GMT Message-Id: <201507211410.t6LEAN8O067568@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to stefano@FreeBSD.org using -f From: stefano@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r288616 - in soc2015/stefano/ptnetmap/stable/10: . release/picobsd/build MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 21 Jul 2015 14:10:23 -0000 Author: stefano Date: Tue Jul 21 14:10:22 2015 New Revision: 288616 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=288616 Log: picobsd: fix loader.conf copy /boot/*.4th and /boot/defaults/loader.conf in the picobsd image to allow the boot loader to read the /boot/loader.conf Modified: soc2015/stefano/ptnetmap/stable/10/ (props changed) soc2015/stefano/ptnetmap/stable/10/release/picobsd/build/picobsd Modified: soc2015/stefano/ptnetmap/stable/10/release/picobsd/build/picobsd ============================================================================== --- soc2015/stefano/ptnetmap/stable/10/release/picobsd/build/picobsd Tue Jul 21 14:02:48 2015 (r288615) +++ soc2015/stefano/ptnetmap/stable/10/release/picobsd/build/picobsd Tue Jul 21 14:10:22 2015 (r288616) @@ -864,7 +864,15 @@ # XXX loader.conf does not work unless we also load the .4th files # echo "hint.acpi.0.disabled=\"1\"" > ${dst}/boot/loader.conf # echo "console=\"comconsole\"" >> ${dst}/boot/loader.conf - local blf="loader* *.4th" # loader.rc loader.4th support.4th" + + mkdir -p ${dst}/boot/defaults + cp -p /boot/*.4th ${dst}/boot/ + cp -p /boot/defaults/loader.conf ${dst}/boot/defaults/loader.conf + + echo "include /boot/loader.4th" > ${dst}/boot/loader.rc + echo "start" >> ${dst}/boot/loader.rc + echo "boot" >> ${dst}/boot/loader.rc + (cd /boot; cp -p loader ${dst}/boot) || fail $? no_space "copying bootloader" cp ${MY_TREE}/floppy.tree/boot/loader.conf ${dst}/boot || true gzip -c kernel > ${dst}/boot/kernel/kernel.gz || fail $? no_space "copying kernel" From owner-svn-soc-all@freebsd.org Tue Jul 21 14:19:08 2015 Return-Path: Delivered-To: svn-soc-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 634759A700A for ; Tue, 21 Jul 2015 14:19:08 +0000 (UTC) (envelope-from stefano@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 529D71AA0 for ; Tue, 21 Jul 2015 14:19:08 +0000 (UTC) (envelope-from stefano@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.15.2/8.15.2) with ESMTP id t6LEJ8Wn077752 for ; Tue, 21 Jul 2015 14:19:08 GMT (envelope-from stefano@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.15.2/8.15.2/Submit) id t6LEJ4Oa077713 for svn-soc-all@FreeBSD.org; Tue, 21 Jul 2015 14:19:04 GMT (envelope-from stefano@FreeBSD.org) Date: Tue, 21 Jul 2015 14:19:04 GMT Message-Id: <201507211419.t6LEJ4Oa077713@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to stefano@FreeBSD.org using -f From: stefano@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r288617 - in soc2015/stefano/ptnetmap/stable/10/sys: dev/netmap modules/netmap net MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 21 Jul 2015 14:19:08 -0000 Author: stefano Date: Tue Jul 21 14:19:04 2015 New Revision: 288617 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=288617 Log: add netmap with ptnetmap support (virtio, e1000) - add netmap_virt.h (ex paravirt.h) contains: - CSB definition (shared memory between host/guest) - ptnetmap functions declaration (host/guest) - ptnetmap-memdev ID, register and routines - add ptnetmap.c contains ptnetmap implementation - OS independent (FreeBSD/linux) Added: soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_virt.h soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/ptnetmap.c Modified: soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/if_em_netmap.h soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/if_igb_netmap.h soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/if_lem_netmap.h soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/if_re_netmap.h soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/if_vtnet_netmap.h soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/ixgbe_netmap.h soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap.c soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_freebsd.c soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_generic.c soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_kern.h soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_mem2.c soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_mem2.h soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_monitor.c soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_offloadings.c soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_pipe.c soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_vale.c soc2015/stefano/ptnetmap/stable/10/sys/modules/netmap/Makefile soc2015/stefano/ptnetmap/stable/10/sys/net/netmap.h soc2015/stefano/ptnetmap/stable/10/sys/net/netmap_user.h Modified: soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/if_em_netmap.h ============================================================================== --- soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/if_em_netmap.h Tue Jul 21 14:10:22 2015 (r288616) +++ soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/if_em_netmap.h Tue Jul 21 14:19:04 2015 (r288617) @@ -24,7 +24,7 @@ */ /* - * $FreeBSD$ + * $FreeBSD: head/sys/dev/netmap/if_em_netmap.h 238985 2012-08-02 11:59:43Z luigi $ * * netmap support for: em. * @@ -198,8 +198,6 @@ } } - nm_txsync_finalize(kring); - return 0; } @@ -217,7 +215,7 @@ u_int nic_i; /* index into the NIC ring */ u_int n; u_int const lim = kring->nkr_num_slots - 1; - u_int const head = nm_rxsync_prologue(kring); + u_int const head = kring->rhead; int force_update = (flags & NAF_FORCE_READ) || kring->nr_kflags & NKR_PENDINTR; /* device-specific */ @@ -303,9 +301,6 @@ E1000_WRITE_REG(&adapter->hw, E1000_RDT(rxr->me), nic_i); } - /* tell userspace that there might be new packets */ - nm_rxsync_finalize(kring); - return 0; ring_reset: Modified: soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/if_igb_netmap.h ============================================================================== --- soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/if_igb_netmap.h Tue Jul 21 14:10:22 2015 (r288616) +++ soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/if_igb_netmap.h Tue Jul 21 14:19:04 2015 (r288617) @@ -24,7 +24,7 @@ */ /* - * $FreeBSD$ + * $FreeBSD: head/sys/dev/netmap/if_igb_netmap.h 256200 2013-10-09 17:32:52Z jfv $ * * Netmap support for igb, partly contributed by Ahmed Kooli * For details on netmap support please see ixgbe_netmap.h @@ -180,8 +180,6 @@ kring->nr_hwtail = nm_prev(netmap_idx_n2k(kring, nic_i), lim); } - nm_txsync_finalize(kring); - return 0; } @@ -199,7 +197,7 @@ u_int nic_i; /* index into the NIC ring */ u_int n; u_int const lim = kring->nkr_num_slots - 1; - u_int const head = nm_rxsync_prologue(kring); + u_int const head = kring->rhead; int force_update = (flags & NAF_FORCE_READ) || kring->nr_kflags & NKR_PENDINTR; /* device-specific */ @@ -283,9 +281,6 @@ E1000_WRITE_REG(&adapter->hw, E1000_RDT(rxr->me), nic_i); } - /* tell userspace that there might be new packets */ - nm_rxsync_finalize(kring); - return 0; ring_reset: Modified: soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/if_lem_netmap.h ============================================================================== --- soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/if_lem_netmap.h Tue Jul 21 14:10:22 2015 (r288616) +++ soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/if_lem_netmap.h Tue Jul 21 14:19:04 2015 (r288617) @@ -25,7 +25,7 @@ /* - * $FreeBSD$ + * $FreeBSD: head/sys/dev/netmap/if_lem_netmap.h 271849 2014-09-19 03:51:26Z glebius $ * * netmap support for: lem * @@ -38,6 +38,7 @@ #include #include /* vtophys ? */ #include +#include extern int netmap_adaptive_io; @@ -302,8 +303,6 @@ kring->nr_hwtail = nm_prev(netmap_idx_n2k(kring, nic_i), lim); } - nm_txsync_finalize(kring); - return 0; } @@ -321,7 +320,7 @@ u_int nic_i; /* index into the NIC ring */ u_int n; u_int const lim = kring->nkr_num_slots - 1; - u_int const head = nm_rxsync_prologue(kring); + u_int const head = kring->rhead; int force_update = (flags & NAF_FORCE_READ) || kring->nr_kflags & NKR_PENDINTR; /* device-specific */ @@ -466,15 +465,262 @@ E1000_WRITE_REG(&adapter->hw, E1000_RDT(0), nic_i); } - /* tell userspace that there might be new packets */ - nm_rxsync_finalize(kring); - return 0; ring_reset: return netmap_ring_reinit(kring); } +#if defined (NIC_PTNETMAP) && defined (WITH_PTNETMAP_GUEST) +static uint32_t lem_netmap_ptctl(struct ifnet *, uint32_t); + +static int +lem_ptnetmap_config(struct netmap_adapter *na, + u_int *txr, u_int *txd, u_int *rxr, u_int *rxd) +{ + struct ifnet *ifp = na->ifp; + struct adapter *adapter = ifp->if_softc; + struct paravirt_csb *csb = adapter->csb; + int ret; + + if (csb == NULL) + return EINVAL; + + ret = lem_netmap_ptctl(ifp, NET_PARAVIRT_PTCTL_CONFIG); + if (ret) + return ret; + + *txr = 1; //*txr = csb->num_tx_rings; + *rxr = 1; //*rxr = csb->num_rx_rings; + *txd = csb->num_tx_slots; + *rxd = csb->num_rx_slots; + + D("txr %u rxr %u txd %u rxd %u", + *txr, *rxr, *txd, *rxd); + + return 0; +} + +static int +lem_ptnetmap_txsync(struct netmap_kring *kring, int flags) +{ + struct netmap_adapter *na = kring->na; + //u_int ring_nr = kring->ring_id; + struct ifnet *ifp = na->ifp; + struct adapter *adapter = ifp->if_softc; + struct paravirt_csb *csb = adapter->csb; + bool send_kick = false; + + /* Disable notifications */ + csb->guest_need_txkick = 0; + + /* + * First part: process new packets to send. + */ + kring->nr_hwcur = csb->tx_ring.hwcur; + ptnetmap_guest_write_kring_csb(&csb->tx_ring, kring->rcur, kring->rhead); + if (kring->rhead != kring->nr_hwcur) { + send_kick = true; + } + + /* Send kick to the host if it needs them */ + if ((send_kick && ACCESS_ONCE(csb->host_need_txkick)) || (flags & NAF_FORCE_RECLAIM)) { + csb->tx_ring.sync_flags = flags; + E1000_WRITE_REG(&adapter->hw, E1000_TDT(0), 0); + } + + /* + * Second part: reclaim buffers for completed transmissions. + */ + if (flags & NAF_FORCE_RECLAIM || nm_kr_txempty(kring)) { + ptnetmap_guest_read_kring_csb(&csb->tx_ring, &kring->nr_hwcur, &kring->nr_hwtail, kring->nkr_num_slots); + } + + /* + * Ring full. The user thread will go to sleep and + * we need a notification (interrupt) from the NIC, + * whene there is free space. + */ + if (kring->rcur == kring->nr_hwtail) { + /* Reenable notifications. */ + csb->guest_need_txkick = 1; + /* Double check */ + ptnetmap_guest_read_kring_csb(&csb->tx_ring, &kring->nr_hwcur, &kring->nr_hwtail, kring->nkr_num_slots); + /* If there is new free space, disable notifications */ + if (kring->rcur != kring->nr_hwtail) { + csb->guest_need_txkick = 0; + } + } + + ND("TX - CSB: head:%u cur:%u hwtail:%u - KRING: head:%u cur:%u", + csb->tx_ring.head, csb->tx_ring.cur, csb->tx_ring.hwtail, kring->rhead, kring->rcur); + + return 0; +} + +static int +lem_ptnetmap_rxsync(struct netmap_kring *kring, int flags) +{ + struct netmap_adapter *na = kring->na; + //u_int ring_nr = kring->ring_id; + struct ifnet *ifp = na->ifp; + struct adapter *adapter = ifp->if_softc; + struct paravirt_csb *csb = adapter->csb; + + int force_update = (flags & NAF_FORCE_READ) || kring->nr_kflags & NKR_PENDINTR; + uint32_t h_hwcur = kring->nr_hwcur, h_hwtail = kring->nr_hwtail; + + /* Disable notifications */ + csb->guest_need_rxkick = 0; + + ptnetmap_guest_read_kring_csb(&csb->rx_ring, &h_hwcur, &h_hwtail, kring->nkr_num_slots); + + /* + * First part: import newly received packets. + */ + if (netmap_no_pendintr || force_update) { + kring->nr_hwtail = h_hwtail; + kring->nr_kflags &= ~NKR_PENDINTR; + } + + /* + * Second part: skip past packets that userspace has released. + */ + kring->nr_hwcur = h_hwcur; + if (kring->rhead != kring->nr_hwcur) { + ptnetmap_guest_write_kring_csb(&csb->rx_ring, kring->rcur, kring->rhead); + /* Send kick to the host if it needs them */ + if (ACCESS_ONCE(csb->host_need_rxkick)) { + csb->rx_ring.sync_flags = flags; + E1000_WRITE_REG(&adapter->hw, E1000_RDT(0), 0); + } + } + + /* + * Ring empty. The user thread will go to sleep and + * we need a notification (interrupt) from the NIC, + * whene there are new packets. + */ + if (kring->rcur == kring->nr_hwtail) { + /* Reenable notifications. */ + csb->guest_need_rxkick = 1; + /* Double check */ + ptnetmap_guest_read_kring_csb(&csb->rx_ring, &kring->nr_hwcur, &kring->nr_hwtail, kring->nkr_num_slots); + /* If there are new packets, disable notifications */ + if (kring->rcur != kring->nr_hwtail) { + csb->guest_need_rxkick = 0; + } + } + + ND("RX - CSB: head:%u cur:%u hwtail:%u - KRING: head:%u cur:%u", + csb->rx_ring.head, csb->rx_ring.cur, csb->rx_ring.hwtail, kring->rhead, kring->rcur); + + return 0; + + +} + +static int +lem_ptnetmap_reg(struct netmap_adapter *na, int onoff) +{ + struct ifnet *ifp = na->ifp; + struct adapter *adapter = ifp->if_softc; + struct paravirt_csb *csb = adapter->csb; + struct netmap_kring *kring; + int ret; + + if (onoff) { + ret = lem_netmap_ptctl(ifp, NET_PARAVIRT_PTCTL_REGIF); + if (ret) + return ret; + + na->na_flags |= NAF_NETMAP_ON; + adapter->ptnetmap_enabled = 1; + /* + * Init ring and kring pointers + * After PARAVIRT_PTCTL_REGIF, the csb contains a snapshot of a + * host kring pointers. + * XXX This initialization is required, because we don't close the + * host port on UNREGIF. + */ + + // Init rx ring + kring = na->rx_rings; + kring->rhead = kring->ring->head = csb->rx_ring.head; + kring->rcur = kring->ring->cur = csb->rx_ring.cur; + kring->nr_hwcur = csb->rx_ring.hwcur; + kring->nr_hwtail = kring->rtail = kring->ring->tail = csb->rx_ring.hwtail; + + // Init tx ring + kring = na->tx_rings; + kring->rhead = kring->ring->head = csb->tx_ring.head; + kring->rcur = kring->ring->cur = csb->tx_ring.cur; + kring->nr_hwcur = csb->tx_ring.hwcur; + kring->nr_hwtail = kring->rtail = kring->ring->tail = csb->tx_ring.hwtail; + } else { + na->na_flags &= ~NAF_NETMAP_ON; + adapter->ptnetmap_enabled = 0; + ret = lem_netmap_ptctl(ifp, NET_PARAVIRT_PTCTL_UNREGIF); + } + + return lem_netmap_reg(na, onoff); +} + + +static int +lem_ptnetmap_bdg_attach(const char *bdg_name, struct netmap_adapter *na) +{ + return EOPNOTSUPP; +} + +static struct paravirt_csb * +lem_netmap_getcsb(struct ifnet *ifp) +{ + struct adapter *adapter = ifp->if_softc; + + return adapter->csb; +} + +static uint32_t +lem_netmap_ptctl(struct ifnet *ifp, uint32_t val) +{ + struct adapter *adapter = ifp->if_softc; + uint32_t ret; + + E1000_WRITE_REG(&adapter->hw, E1000_PTCTL, val); + ret = E1000_READ_REG(&adapter->hw, E1000_PTSTS); + D("PTSTS = %u", ret); + + return ret; +} + + + +static uint32_t +lem_ptnetmap_features(struct adapter *adapter) +{ + uint32_t features; + /* tell the device the features we support */ + E1000_WRITE_REG(&adapter->hw, E1000_PTFEAT, NET_PTN_FEATURES_BASE); + /* get back the acknowledged features */ + features = E1000_READ_REG(&adapter->hw, E1000_PTFEAT); + device_printf(adapter->dev, "netmap passthrough: %s\n", + (features & NET_PTN_FEATURES_BASE) ? "base" : + "none"); + return features; +} + +static struct netmap_pt_guest_ops lem_ptnetmap_ops = { + .nm_getcsb = lem_netmap_getcsb, + .nm_ptctl = lem_netmap_ptctl, +}; +#elif defined (NIC_PTNETMAP) +#warning "if_lem supports ptnetmap but netmap does not support it" +#warning "(configure netmap with passthrough support)" +#elif defined (WITH_PTNETMAP_GUEST) +#warning "netmap supports ptnetmap but e1000 does not support it" +#warning "(configure if_lem with passthrough support)" +#endif /* NIC_PTNETMAP && WITH_PTNETMAP_GUEST */ static void lem_netmap_attach(struct adapter *adapter) @@ -491,7 +737,19 @@ na.nm_rxsync = lem_netmap_rxsync; na.nm_register = lem_netmap_reg; na.num_tx_rings = na.num_rx_rings = 1; - netmap_attach(&na); +#if defined (NIC_PTNETMAP) && defined (WITH_PTNETMAP_GUEST) + /* XXX: check if the device support ptnetmap (now we use PARA_SUBDEV) */ + if ((adapter->hw.subsystem_device_id == E1000_PARA_SUBDEV) && + (lem_ptnetmap_features(adapter) & NET_PTN_FEATURES_BASE)) { + na.nm_config = lem_ptnetmap_config; + na.nm_register = lem_ptnetmap_reg; + na.nm_txsync = lem_ptnetmap_txsync; + na.nm_rxsync = lem_ptnetmap_rxsync; + na.nm_bdg_attach = lem_ptnetmap_bdg_attach; /* XXX */ + netmap_pt_guest_attach(&na, &lem_ptnetmap_ops); + } else +#endif /* NIC_PTNETMAP && defined WITH_PTNETMAP_GUEST */ + netmap_attach(&na); } /* end of file */ Modified: soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/if_re_netmap.h ============================================================================== --- soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/if_re_netmap.h Tue Jul 21 14:10:22 2015 (r288616) +++ soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/if_re_netmap.h Tue Jul 21 14:19:04 2015 (r288617) @@ -24,7 +24,7 @@ */ /* - * $FreeBSD$ + * $FreeBSD: head/sys/dev/netmap/if_re_netmap.h 234225 2012-04-13 15:33:12Z luigi $ * * netmap support for: re * @@ -159,8 +159,6 @@ } } - nm_txsync_finalize(kring); - return 0; } @@ -178,7 +176,7 @@ u_int nic_i; /* index into the NIC ring */ u_int n; u_int const lim = kring->nkr_num_slots - 1; - u_int const head = nm_rxsync_prologue(kring); + u_int const head = kring->rhead; int force_update = (flags & NAF_FORCE_READ) || kring->nr_kflags & NKR_PENDINTR; /* device-specific */ @@ -273,9 +271,6 @@ BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); } - /* tell userspace that there might be new packets */ - nm_rxsync_finalize(kring); - return 0; ring_reset: Modified: soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/if_vtnet_netmap.h ============================================================================== --- soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/if_vtnet_netmap.h Tue Jul 21 14:10:22 2015 (r288616) +++ soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/if_vtnet_netmap.h Tue Jul 21 14:19:04 2015 (r288617) @@ -24,7 +24,7 @@ */ /* - * $FreeBSD$ + * $FreeBSD: head/sys/dev/netmap/if_vtnet_netmap.h 270097 2014-08-17 10:25:27Z luigi $ */ #include @@ -32,6 +32,13 @@ #include #include /* vtophys ? */ #include +#ifdef WITH_PTNETMAP_GUEST +#include +static int vtnet_ptnetmap_txsync(struct netmap_kring *kring, int flags); +#define VTNET_PTNETMAP_ON(_na) ((nm_netmap_on(_na)) && ((_na)->nm_txsync == vtnet_ptnetmap_txsync)) +#else /* !WITH_PTNETMAP_GUEST */ +#define VTNET_PTNETMAP_ON(_na) 0 +#endif /* WITH_PTNETMAP_GUEST */ #define SOFTC_T vtnet_softc @@ -214,9 +221,6 @@ virtqueue_postpone_intr(vq, VQ_POSTPONE_SHORT); } -//out: - nm_txsync_finalize(kring); - return 0; } @@ -278,7 +282,7 @@ // u_int nic_i; /* index into the NIC ring */ u_int n; u_int const lim = kring->nkr_num_slots - 1; - u_int const head = nm_rxsync_prologue(kring); + u_int const head = kring->rhead; int force_update = (flags & NAF_FORCE_READ) || kring->nr_kflags & NKR_PENDINTR; /* device-specific */ @@ -340,9 +344,6 @@ vtnet_rxq_enable_intr(rxq); } - /* tell userspace that there might be new packets. */ - nm_rxsync_finalize(kring); - ND("[C] h %d c %d t %d hwcur %d hwtail %d", ring->head, ring->cur, ring->tail, kring->nr_hwcur, kring->nr_hwtail); @@ -359,6 +360,9 @@ struct netmap_adapter* na = NA(ifp); unsigned int r; + /* if ptnetmap is enabled we must not init netmap buffers */ + if (VTNET_PTNETMAP_ON(na)) + return 1; if (!nm_native_on(na)) return 0; for (r = 0; r < na->num_rx_rings; r++) { @@ -409,6 +413,367 @@ return 0; } +#ifdef WITH_PTNETMAP_GUEST +/* ptnetmap virtio register BASE */ +#define PTNETMAP_VIRTIO_IO_BASE sizeof(struct virtio_net_config) + +#ifndef VIRTIO_NET_F_PTNETMAP +#define VIRTIO_NET_F_PTNETMAP 0x1000000 /* linux/qeum 24 */ +#endif /* VIRTIO_NET_F_PTNETMAP */ + +static void inline +vtnet_ptnetmap_iowrite4(device_t dev, uint32_t addr, uint32_t val) +{ + int i; + /* virtio_pci config_set use multiple iowrite8, we need to split the call and reverse the order */ + for (i = 3; i >= 0; i--) { + virtio_write_dev_config_1(dev, PTNETMAP_VIRTIO_IO_BASE + addr + i, *(((uint8_t *)&val) + i)); + } +} + +static uint32_t inline +vtnet_ptnetmap_ioread4(device_t dev, uint32_t addr) +{ + uint32_t val; + int i; + + for (i = 0; i <= 3; i++) { + *(((uint8_t *)&val) + i) = virtio_read_dev_config_1(dev, PTNETMAP_VIRTIO_IO_BASE + addr + i); + } + return val; +} + +static int +vtnet_ptnetmap_alloc_csb(struct SOFTC_T *sc) +{ + device_t dev = sc->vtnet_dev; + struct ifnet *ifp = sc->vtnet_ifp; + struct netmap_pt_guest_adapter* ptna = (struct netmap_pt_guest_adapter *)NA(ifp); + + vm_paddr_t csb_phyaddr; + + if (ptna->csb) + return 0; + + ptna->csb = contigmalloc(NET_PARAVIRT_CSB_SIZE, M_DEVBUF, M_NOWAIT | M_ZERO, + (size_t)0, -1UL, PAGE_SIZE, 0); + if (!ptna->csb) { + D("Communication Status Block allocation failed!"); + return ENOMEM; + } + + csb_phyaddr = vtophys(ptna->csb); + + ptna->csb->guest_csb_on = 1; + + /* Tell the device the CSB physical address. */ + vtnet_ptnetmap_iowrite4(dev, PTNETMAP_VIRTIO_IO_CSBBAH, (uint32_t)(csb_phyaddr >> 32)); + vtnet_ptnetmap_iowrite4(dev, PTNETMAP_VIRTIO_IO_CSBBAL, (uint32_t)(csb_phyaddr)); + + return 0; +} + +static void +vtnet_ptnetmap_free_csb(struct SOFTC_T *sc) +{ + device_t dev = sc->vtnet_dev; + struct ifnet *ifp = sc->vtnet_ifp; + struct netmap_pt_guest_adapter* ptna = (struct netmap_pt_guest_adapter *)NA(ifp); + + if (ptna->csb) { + /* CSB deallocation protocol. */ + vtnet_ptnetmap_iowrite4(dev, PTNETMAP_VIRTIO_IO_CSBBAH, 0x0ULL); + vtnet_ptnetmap_iowrite4(dev, PTNETMAP_VIRTIO_IO_CSBBAL, 0x0ULL); + + contigfree(ptna->csb, NET_PARAVIRT_CSB_SIZE, M_DEVBUF); + ptna->csb = NULL; + } +} + +static uint32_t vtnet_ptnetmap_ptctl(struct ifnet *, uint32_t); +static int +vtnet_ptnetmap_config(struct netmap_adapter *na, + u_int *txr, u_int *txd, u_int *rxr, u_int *rxd) +{ + struct netmap_pt_guest_adapter *ptna = (struct netmap_pt_guest_adapter *)na; + struct paravirt_csb *csb = ptna->csb; + int ret; + + if (csb == NULL) + return EINVAL; + + ret = vtnet_ptnetmap_ptctl(na->ifp, NET_PARAVIRT_PTCTL_CONFIG); + if (ret) + return ret; + + *txr = 1; //*txr = csb->num_tx_rings; + *rxr = 1; //*rxr = csb->num_rx_rings; + *txd = csb->num_tx_slots; + *rxd = csb->num_rx_slots; + + D("txr %u rxr %u txd %u rxd %u", + *txr, *rxr, *txd, *rxd); + return 0; +} + +static int +vtnet_ptnetmap_txsync(struct netmap_kring *kring, int flags) +{ + struct netmap_adapter *na = kring->na; + struct netmap_pt_guest_adapter *ptna = (struct netmap_pt_guest_adapter *)na; + struct ifnet *ifp = na->ifp; + u_int ring_nr = kring->ring_id; + + /* device-specific */ + struct SOFTC_T *sc = ifp->if_softc; + struct vtnet_txq *txq = &sc->vtnet_txqs[ring_nr]; + struct virtqueue *vq = txq->vtntx_vq; + struct paravirt_csb *csb = ptna->csb; + bool send_kick = false; + + /* Disable notifications */ + csb->guest_need_txkick = 0; + + /* + * First part: process new packets to send. + */ + kring->nr_hwcur = csb->tx_ring.hwcur; + ptnetmap_guest_write_kring_csb(&csb->tx_ring, kring->rcur, kring->rhead); + if (kring->rhead != kring->nr_hwcur) { + send_kick = true; + } + + /* Send kick to the host if it needs them */ + if ((send_kick && ACCESS_ONCE(csb->host_need_txkick)) || (flags & NAF_FORCE_RECLAIM)) { + csb->tx_ring.sync_flags = flags; + virtqueue_notify(vq); + } + + /* + * Second part: reclaim buffers for completed transmissions. + */ + if (flags & NAF_FORCE_RECLAIM || nm_kr_txempty(kring)) { + ptnetmap_guest_read_kring_csb(&csb->tx_ring, &kring->nr_hwcur, &kring->nr_hwtail, kring->nkr_num_slots); + } + + /* + * Ring full. The user thread will go to sleep and + * we need a notification (interrupt) from the NIC, + * whene there is free space. + */ + if (kring->rcur == kring->nr_hwtail) { + /* Reenable notifications. */ + csb->guest_need_txkick = 1; + /* Double check */ + ptnetmap_guest_read_kring_csb(&csb->tx_ring, &kring->nr_hwcur, &kring->nr_hwtail, kring->nkr_num_slots); + /* If there is new free space, disable notifications */ + if (kring->rcur != kring->nr_hwtail) { + csb->guest_need_txkick = 0; + } + } + + + ND(1,"TX - CSB: head:%u cur:%u hwtail:%u - KRING: head:%u cur:%u tail: %u", + csb->tx_ring.head, csb->tx_ring.cur, csb->tx_ring.hwtail, kring->rhead, kring->rcur, kring->nr_hwtail); + ND("TX - vq_index: %d", vq->index); + + return 0; +} + +static int +vtnet_ptnetmap_rxsync(struct netmap_kring *kring, int flags) +{ + struct netmap_adapter *na = kring->na; + struct netmap_pt_guest_adapter *ptna = (struct netmap_pt_guest_adapter *)na; + struct ifnet *ifp = na->ifp; + u_int ring_nr = kring->ring_id; + + /* device-specific */ + struct SOFTC_T *sc = ifp->if_softc; + struct vtnet_rxq *rxq = &sc->vtnet_rxqs[ring_nr]; + struct virtqueue *vq = rxq->vtnrx_vq; + struct paravirt_csb *csb = ptna->csb; + + int force_update = (flags & NAF_FORCE_READ) || kring->nr_kflags & NKR_PENDINTR; + uint32_t h_hwcur = kring->nr_hwcur, h_hwtail = kring->nr_hwtail; + + /* Disable notifications */ + csb->guest_need_rxkick = 0; + + ptnetmap_guest_read_kring_csb(&csb->rx_ring, &h_hwcur, &h_hwtail, kring->nkr_num_slots); + + /* + * First part: import newly received packets. + */ + if (netmap_no_pendintr || force_update) { + kring->nr_hwtail = h_hwtail; + kring->nr_kflags &= ~NKR_PENDINTR; + } + + /* + * Second part: skip past packets that userspace has released. + */ + kring->nr_hwcur = h_hwcur; + if (kring->rhead != kring->nr_hwcur) { + ptnetmap_guest_write_kring_csb(&csb->rx_ring, kring->rcur, kring->rhead); + /* Send kick to the host if it needs them */ + if (ACCESS_ONCE(csb->host_need_rxkick)) { + csb->rx_ring.sync_flags = flags; + virtqueue_notify(vq); + } + } + + /* + * Ring empty. The user thread will go to sleep and + * we need a notification (interrupt) from the NIC, + * whene there are new packets. + */ + if (kring->rcur == kring->nr_hwtail) { + /* Reenable notifications. */ + csb->guest_need_rxkick = 1; + /* Double check */ + ptnetmap_guest_read_kring_csb(&csb->rx_ring, &kring->nr_hwcur, &kring->nr_hwtail, kring->nkr_num_slots); + /* If there are new packets, disable notifications */ + if (kring->rcur != kring->nr_hwtail) { + csb->guest_need_rxkick = 0; + } + } + + ND("RX - CSB: head:%u cur:%u hwtail:%u - KRING: head:%u cur:%u", + csb->rx_ring.head, csb->rx_ring.cur, csb->rx_ring.hwtail, kring->rhead, kring->rcur); + ND("RX - vq_index: %d", vq->index); + + return 0; +} + +static int +vtnet_ptnetmap_reg(struct netmap_adapter *na, int onoff) +{ + struct netmap_pt_guest_adapter *ptna = (struct netmap_pt_guest_adapter *)na; + + /* device-specific */ + struct ifnet *ifp = na->ifp; + struct SOFTC_T *sc = ifp->if_softc; + struct paravirt_csb *csb = ptna->csb; + struct netmap_kring *kring; + int ret = 0; + + if (na == NULL) + return EINVAL; + + VTNET_CORE_LOCK(sc); + /* enable or disable flags and callbacks in na and ifp */ + if (onoff) { + int i; + nm_set_native_flags(na); + /* push fake-elem in the tx queues to enable interrupts */ + for (i = 0; i < sc->vtnet_max_vq_pairs; i++) { + struct vtnet_txq *txq = &sc->vtnet_txqs[i]; + struct mbuf *m0; + m0 = m_gethdr(M_NOWAIT, MT_DATA); + m0->m_len = 64; + + if (m0) { + ret = vtnet_txq_encap(txq, &m0); + } + } + ret = vtnet_ptnetmap_ptctl(na->ifp, NET_PARAVIRT_PTCTL_REGIF); + if (ret) { + //na->na_flags &= ~NAF_NETMAP_ON; + nm_clear_native_flags(na); + goto out; + } + /* + * Init ring and kring pointers + * After PARAVIRT_PTCTL_REGIF, the csb contains a snapshot of a + * host kring pointers. + * XXX This initialization is required, because we don't close the + * host port on UNREGIF. + */ + // Init rx ring + kring = na->rx_rings; + kring->rhead = kring->ring->head = csb->rx_ring.head; + kring->rcur = kring->ring->cur = csb->rx_ring.cur; + kring->nr_hwcur = csb->rx_ring.hwcur; + kring->nr_hwtail = kring->rtail = kring->ring->tail = csb->rx_ring.hwtail; + + // Init tx ring + kring = na->tx_rings; + kring->rhead = kring->ring->head = csb->tx_ring.head; + kring->rcur = kring->ring->cur = csb->tx_ring.cur; + kring->nr_hwcur = csb->tx_ring.hwcur; + kring->nr_hwtail = kring->rtail = kring->ring->tail = csb->tx_ring.hwtail; + } else { + ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); + //na->na_flags &= ~NAF_NETMAP_ON; + nm_clear_native_flags(na); + ret = vtnet_ptnetmap_ptctl(na->ifp, NET_PARAVIRT_PTCTL_UNREGIF); + vtnet_init_locked(sc); /* also enable intr */ + } +out: + VTNET_CORE_UNLOCK(sc); + return (ifp->if_drv_flags & IFF_DRV_RUNNING ? ret : 1); +} + +static int +vtnet_ptnetmap_bdg_attach(const char *bdg_name, struct netmap_adapter *na) +{ + return EOPNOTSUPP; +} + +static struct paravirt_csb * +vtnet_ptnetmap_getcsb(struct ifnet *ifp) +{ + struct netmap_pt_guest_adapter *ptna = (struct netmap_pt_guest_adapter *)NA(ifp); + + return ptna->csb; +} + +static uint32_t +vtnet_ptnetmap_ptctl(struct ifnet *ifp, uint32_t val) +{ + struct SOFTC_T *sc = ifp->if_softc; + device_t dev = sc->vtnet_dev; + uint32_t ret; + + D("PTCTL = %u", val); + vtnet_ptnetmap_iowrite4(dev, PTNETMAP_VIRTIO_IO_PTCTL, val); + ret = vtnet_ptnetmap_ioread4(dev, PTNETMAP_VIRTIO_IO_PTSTS); + D("PTSTS = %u", ret); + + return ret; +} + +static uint32_t +vtnet_ptnetmap_features(struct SOFTC_T *sc) +{ + device_t dev = sc->vtnet_dev; + uint32_t features; + /* tell the device the features we support */ + vtnet_ptnetmap_iowrite4(dev, PTNETMAP_VIRTIO_IO_PTFEAT, NET_PTN_FEATURES_BASE); + /* get back the acknowledged features */ + features = vtnet_ptnetmap_ioread4(dev, PTNETMAP_VIRTIO_IO_PTFEAT); + D("netmap passthrough: %s\n", + (features & NET_PTN_FEATURES_BASE) ? "base" : + "none"); + return features; +} + +static void +vtnet_ptnetmap_dtor(struct netmap_adapter *na) +{ + struct ifnet *ifp = na->ifp; + struct SOFTC_T *sc = ifp->if_softc; + + vtnet_ptnetmap_free_csb(sc); +} + +static struct netmap_pt_guest_ops vtnet_ptnetmap_ops = { + .nm_getcsb = vtnet_ptnetmap_getcsb, /* TODO: remove */ + .nm_ptctl = vtnet_ptnetmap_ptctl, +}; +#endif /* WITH_PTNETMAP_GUEST */ + static void vtnet_netmap_attach(struct SOFTC_T *sc) { @@ -425,6 +790,21 @@ na.nm_config = vtnet_netmap_config; na.num_tx_rings = na.num_rx_rings = sc->vtnet_max_vq_pairs; D("max rings %d", sc->vtnet_max_vq_pairs); +#ifdef WITH_PTNETMAP_GUEST + D("check ptnetmap support"); + if (virtio_with_feature(sc->vtnet_dev, VIRTIO_NET_F_PTNETMAP) && + (vtnet_ptnetmap_features(sc) & NET_PTN_FEATURES_BASE)) { + D("ptnetmap supported"); + na.nm_config = vtnet_ptnetmap_config; + na.nm_register = vtnet_ptnetmap_reg; + na.nm_txsync = vtnet_ptnetmap_txsync; + na.nm_rxsync = vtnet_ptnetmap_rxsync; + na.nm_dtor = vtnet_ptnetmap_dtor; + na.nm_bdg_attach = vtnet_ptnetmap_bdg_attach; /* XXX */ + netmap_pt_guest_attach(&na, &vtnet_ptnetmap_ops); + vtnet_ptnetmap_alloc_csb(sc); + } else +#endif /* WITH_PTNETMAP_GUEST */ netmap_attach(&na); D("virtio attached txq=%d, txd=%d rxq=%d, rxd=%d", Modified: soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/ixgbe_netmap.h ============================================================================== --- soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/ixgbe_netmap.h Tue Jul 21 14:10:22 2015 (r288616) +++ soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/ixgbe_netmap.h Tue Jul 21 14:19:04 2015 (r288617) @@ -24,7 +24,7 @@ */ /* - * $FreeBSD$ + * $FreeBSD: head/sys/dev/netmap/ixgbe_netmap.h 244514 2012-12-20 22:26:03Z luigi $ * * netmap support for: ixgbe * @@ -61,7 +61,8 @@ * count packets that might be missed due to lost interrupts. */ SYSCTL_DECL(_dev_netmap); -static int ix_rx_miss, ix_rx_miss_bufs, ix_crcstrip; +static int ix_rx_miss, ix_rx_miss_bufs; +int ix_crcstrip; SYSCTL_INT(_dev_netmap, OID_AUTO, ix_crcstrip, CTLFLAG_RW, &ix_crcstrip, 0, "strip CRC on rx frames"); SYSCTL_INT(_dev_netmap, OID_AUTO, ix_rx_miss, @@ -321,8 +322,6 @@ } } - nm_txsync_finalize(kring); - return 0; } @@ -350,7 +349,7 @@ u_int nic_i; /* index into the NIC ring */ u_int n; u_int const lim = kring->nkr_num_slots - 1; - u_int const head = nm_rxsync_prologue(kring); + u_int const head = kring->rhead; int force_update = (flags & NAF_FORCE_READ) || kring->nr_kflags & NKR_PENDINTR; /* device-specific */ @@ -457,9 +456,6 @@ IXGBE_WRITE_REG(&adapter->hw, IXGBE_RDT(rxr->me), nic_i); } - /* tell userspace that there might be new packets */ - nm_rxsync_finalize(kring); - return 0; ring_reset: Modified: soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap.c ============================================================================== --- soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap.c Tue Jul 21 14:10:22 2015 (r288616) +++ soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap.c Tue Jul 21 14:19:04 2015 (r288617) @@ -293,7 +293,7 @@ * kring->nm_sync() == DEVICE_netmap_rxsync() * 2) device interrupt handler * na->nm_notify() == netmap_notify() - * - tx from host stack + * - rx from host stack * concurrently: * 1) host stack * netmap_transmit() @@ -313,31 +313,113 @@ * * -= SYSTEM DEVICE WITH GENERIC SUPPORT =- * + * na == NA(ifp) == generic_netmap_adapter created in generic_netmap_attach() * - * - * -= VALE PORT =- - * - * - * - * -= NETMAP PIPE =- - * - * - * - * -= SYSTEM DEVICE WITH NATIVE SUPPORT, CONNECTED TO VALE, NO HOST RINGS =- - * - * - * - * -= SYSTEM DEVICE WITH NATIVE SUPPORT, CONNECTED TO VALE, WITH HOST RINGS =- - * - * - * - * -= SYSTEM DEVICE WITH GENERIC SUPPORT, CONNECTED TO VALE, NO HOST RINGS =- - * + * - tx from netmap userspace: + * concurrently: + * 1) ioctl(NIOCTXSYNC)/netmap_poll() in process context + * kring->nm_sync() == generic_netmap_txsync() + * linux: dev_queue_xmit() with NM_MAGIC_PRIORITY_TX + * generic_ndo_start_xmit() + * orig. dev. start_xmit + * FreeBSD: na->if_transmit() == orig. dev if_transmit + * 2) generic_mbuf_destructor() + * na->nm_notify() == netmap_notify() + * - rx from netmap userspace: + * 1) ioctl(NIOCRXSYNC)/netmap_poll() in process context + * kring->nm_sync() == generic_netmap_rxsync() + * mbq_safe_dequeue() + * 2) device driver + * generic_rx_handler() + * mbq_safe_enqueue() + * na->nm_notify() == netmap_notify() + * - rx from host stack: + * concurrently: *** DIFF OUTPUT TRUNCATED AT 1000 LINES *** From owner-svn-soc-all@freebsd.org Tue Jul 21 14:19:52 2015 Return-Path: Delivered-To: svn-soc-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 67E299A7023 for ; Tue, 21 Jul 2015 14:19:52 +0000 (UTC) (envelope-from stefano@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 57BAB1AC4 for ; Tue, 21 Jul 2015 14:19:52 +0000 (UTC) (envelope-from stefano@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.15.2/8.15.2) with ESMTP id t6LEJqom078106 for ; Tue, 21 Jul 2015 14:19:52 GMT (envelope-from stefano@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.15.2/8.15.2/Submit) id t6LEJpQV078100 for svn-soc-all@FreeBSD.org; Tue, 21 Jul 2015 14:19:51 GMT (envelope-from stefano@FreeBSD.org) Date: Tue, 21 Jul 2015 14:19:51 GMT Message-Id: <201507211419.t6LEJpQV078100@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to stefano@FreeBSD.org using -f From: stefano@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r288618 - soc2015/stefano/ptnetmap/stable/10/sys/dev/virtio/network MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 21 Jul 2015 14:19:52 -0000 Author: stefano Date: Tue Jul 21 14:19:50 2015 New Revision: 288618 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=288618 Log: add ptnetmap support on virtio-net Modified: soc2015/stefano/ptnetmap/stable/10/sys/dev/virtio/network/if_vtnet.c soc2015/stefano/ptnetmap/stable/10/sys/dev/virtio/network/if_vtnetvar.h soc2015/stefano/ptnetmap/stable/10/sys/dev/virtio/network/virtio_net.h Modified: soc2015/stefano/ptnetmap/stable/10/sys/dev/virtio/network/if_vtnet.c ============================================================================== --- soc2015/stefano/ptnetmap/stable/10/sys/dev/virtio/network/if_vtnet.c Tue Jul 21 14:19:04 2015 (r288617) +++ soc2015/stefano/ptnetmap/stable/10/sys/dev/virtio/network/if_vtnet.c Tue Jul 21 14:19:50 2015 (r288618) @@ -30,6 +30,7 @@ __FBSDID("$FreeBSD$"); #include +#include #include #include #include @@ -50,6 +51,7 @@ #include #include +#include #include #include #include @@ -105,6 +107,7 @@ static int vtnet_setup_interface(struct vtnet_softc *); static int vtnet_change_mtu(struct vtnet_softc *, int); static int vtnet_ioctl(struct ifnet *, u_long, caddr_t); +static uint64_t vtnet_get_counter(struct ifnet *, ift_counter); static int vtnet_rxq_populate(struct vtnet_rxq *); static void vtnet_rxq_free_mbufs(struct vtnet_rxq *); @@ -158,11 +161,8 @@ #endif static int vtnet_watchdog(struct vtnet_txq *); -static void vtnet_rxq_accum_stats(struct vtnet_rxq *, - struct vtnet_rxq_stats *); -static void vtnet_txq_accum_stats(struct vtnet_txq *, - struct vtnet_txq_stats *); -static void vtnet_accumulate_stats(struct vtnet_softc *); +static void vtnet_accum_stats(struct vtnet_softc *, + struct vtnet_rxq_stats *, struct vtnet_txq_stats *); static void vtnet_tick(void *); static void vtnet_start_taskqueues(struct vtnet_softc *); @@ -267,6 +267,7 @@ { VIRTIO_NET_F_GUEST_ANNOUNCE, "GuestAnnounce" }, { VIRTIO_NET_F_MQ, "Multiqueue" }, { VIRTIO_NET_F_CTRL_MAC_ADDR, "SetMacAddress" }, + { VIRTIO_NET_F_PTNETMAP, "PTNetmap" }, { 0, NULL } }; @@ -289,6 +290,8 @@ #ifdef DEV_NETMAP #include +#else +#define VTNET_PTNETMAP_ON(_na) 0 #endif /* DEV_NETMAP */ static driver_t vtnet_driver = { @@ -298,6 +301,8 @@ }; static devclass_t vtnet_devclass; +DRIVER_MODULE(vtnet, virtio_mmio, vtnet_driver, vtnet_devclass, + vtnet_modevent, 0); DRIVER_MODULE(vtnet, virtio_pci, vtnet_driver, vtnet_devclass, vtnet_modevent, 0); MODULE_VERSION(vtnet, 1); @@ -916,12 +921,12 @@ } if_initname(ifp, device_get_name(dev), device_get_unit(dev)); - if_initbaudrate(ifp, IF_Gbps(10)); /* Approx. */ + ifp->if_baudrate = IF_Gbps(10); /* Approx. */ ifp->if_softc = sc; ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; ifp->if_init = vtnet_init; ifp->if_ioctl = vtnet_ioctl; - + ifp->if_get_counter = vtnet_get_counter; #ifndef VTNET_LEGACY_TX ifp->if_transmit = vtnet_txq_mq_start; ifp->if_qflush = vtnet_qflush; @@ -947,7 +952,7 @@ ifp->if_capabilities |= IFCAP_LINKSTATE; /* Tell the upper layer(s) we support long frames. */ - ifp->if_data.ifi_hdrlen = sizeof(struct ether_vlan_header); + ifp->if_hdrlen = sizeof(struct ether_vlan_header); ifp->if_capabilities |= IFCAP_JUMBO_MTU | IFCAP_VLAN_MTU; if (virtio_with_feature(dev, VIRTIO_NET_F_CSUM)) { @@ -1854,7 +1859,7 @@ } more = vtnet_rxq_eof(rxq); - if (more || vtnet_rxq_enable_intr(rxq) != 0) { + if (!VTNET_PTNETMAP_ON(NA(ifp)) && (more || vtnet_rxq_enable_intr(rxq) != 0)) { if (!more) vtnet_rxq_disable_intr(rxq); /* @@ -1891,7 +1896,7 @@ } more = vtnet_rxq_eof(rxq); - if (more || vtnet_rxq_enable_intr(rxq) != 0) { + if (!VTNET_PTNETMAP_ON(NA(ifp)) && (more || vtnet_rxq_enable_intr(rxq) != 0)) { if (!more) vtnet_rxq_disable_intr(rxq); rxq->vtnrx_stats.vrxs_rescheduled++; @@ -2573,74 +2578,62 @@ } static void -vtnet_rxq_accum_stats(struct vtnet_rxq *rxq, struct vtnet_rxq_stats *accum) +vtnet_accum_stats(struct vtnet_softc *sc, struct vtnet_rxq_stats *rxacc, + struct vtnet_txq_stats *txacc) { - struct vtnet_rxq_stats *st; - st = &rxq->vtnrx_stats; + bzero(rxacc, sizeof(struct vtnet_rxq_stats)); + bzero(txacc, sizeof(struct vtnet_txq_stats)); - accum->vrxs_ipackets += st->vrxs_ipackets; - accum->vrxs_ibytes += st->vrxs_ibytes; - accum->vrxs_iqdrops += st->vrxs_iqdrops; - accum->vrxs_csum += st->vrxs_csum; - accum->vrxs_csum_failed += st->vrxs_csum_failed; - accum->vrxs_rescheduled += st->vrxs_rescheduled; -} + for (int i = 0; i < sc->vtnet_max_vq_pairs; i++) { + struct vtnet_rxq_stats *rxst; + struct vtnet_txq_stats *txst; -static void -vtnet_txq_accum_stats(struct vtnet_txq *txq, struct vtnet_txq_stats *accum) -{ - struct vtnet_txq_stats *st; + rxst = &sc->vtnet_rxqs[i].vtnrx_stats; + rxacc->vrxs_ipackets += rxst->vrxs_ipackets; + rxacc->vrxs_ibytes += rxst->vrxs_ibytes; + rxacc->vrxs_iqdrops += rxst->vrxs_iqdrops; + rxacc->vrxs_csum += rxst->vrxs_csum; + rxacc->vrxs_csum_failed += rxst->vrxs_csum_failed; + rxacc->vrxs_rescheduled += rxst->vrxs_rescheduled; - st = &txq->vtntx_stats; - - accum->vtxs_opackets += st->vtxs_opackets; - accum->vtxs_obytes += st->vtxs_obytes; - accum->vtxs_csum += st->vtxs_csum; - accum->vtxs_tso += st->vtxs_tso; - accum->vtxs_rescheduled += st->vtxs_rescheduled; + txst = &sc->vtnet_txqs[i].vtntx_stats; + txacc->vtxs_opackets += txst->vtxs_opackets; + txacc->vtxs_obytes += txst->vtxs_obytes; + txacc->vtxs_csum += txst->vtxs_csum; + txacc->vtxs_tso += txst->vtxs_tso; + txacc->vtxs_rescheduled += txst->vtxs_rescheduled; + } } -static void -vtnet_accumulate_stats(struct vtnet_softc *sc) +static uint64_t +vtnet_get_counter(if_t ifp, ift_counter cnt) { - struct ifnet *ifp; - struct vtnet_statistics *st; + struct vtnet_softc *sc; struct vtnet_rxq_stats rxaccum; struct vtnet_txq_stats txaccum; - int i; - - ifp = sc->vtnet_ifp; - st = &sc->vtnet_stats; - bzero(&rxaccum, sizeof(struct vtnet_rxq_stats)); - bzero(&txaccum, sizeof(struct vtnet_txq_stats)); - for (i = 0; i < sc->vtnet_max_vq_pairs; i++) { - vtnet_rxq_accum_stats(&sc->vtnet_rxqs[i], &rxaccum); - vtnet_txq_accum_stats(&sc->vtnet_txqs[i], &txaccum); - } + sc = if_getsoftc(ifp); + vtnet_accum_stats(sc, &rxaccum, &txaccum); - st->rx_csum_offloaded = rxaccum.vrxs_csum; - st->rx_csum_failed = rxaccum.vrxs_csum_failed; - st->rx_task_rescheduled = rxaccum.vrxs_rescheduled; - st->tx_csum_offloaded = txaccum.vtxs_csum; - st->tx_tso_offloaded = txaccum.vtxs_tso; - st->tx_task_rescheduled = txaccum.vtxs_rescheduled; - - /* - * With the exception of if_ierrors, these ifnet statistics are - * only updated in the driver, so just set them to our accumulated - * values. if_ierrors is updated in ether_input() for malformed - * frames that we should have already discarded. - */ - ifp->if_ipackets = rxaccum.vrxs_ipackets; - ifp->if_iqdrops = rxaccum.vrxs_iqdrops; - ifp->if_ierrors = rxaccum.vrxs_ierrors; - ifp->if_opackets = txaccum.vtxs_opackets; + switch (cnt) { + case IFCOUNTER_IPACKETS: + return (rxaccum.vrxs_ipackets); + case IFCOUNTER_IQDROPS: + return (rxaccum.vrxs_iqdrops); + case IFCOUNTER_IERRORS: + return (rxaccum.vrxs_ierrors); + case IFCOUNTER_OPACKETS: + return (txaccum.vtxs_opackets); #ifndef VTNET_LEGACY_TX - ifp->if_obytes = txaccum.vtxs_obytes; - ifp->if_omcasts = txaccum.vtxs_omcasts; + case IFCOUNTER_OBYTES: + return (txaccum.vtxs_obytes); + case IFCOUNTER_OMCASTS: + return (txaccum.vtxs_omcasts); #endif + default: + return (if_get_counter_default(ifp, cnt)); + } } static void @@ -2655,7 +2648,6 @@ timedout = 0; VTNET_CORE_LOCK_ASSERT(sc); - vtnet_accumulate_stats(sc); for (i = 0; i < sc->vtnet_act_vq_pairs; i++) timedout |= vtnet_watchdog(&sc->vtnet_txqs[i]); @@ -3767,8 +3759,18 @@ struct sysctl_oid_list *child, struct vtnet_softc *sc) { struct vtnet_statistics *stats; + struct vtnet_rxq_stats rxaccum; + struct vtnet_txq_stats txaccum; + + vtnet_accum_stats(sc, &rxaccum, &txaccum); stats = &sc->vtnet_stats; + stats->rx_csum_offloaded = rxaccum.vrxs_csum; + stats->rx_csum_failed = rxaccum.vrxs_csum_failed; + stats->rx_task_rescheduled = rxaccum.vrxs_rescheduled; + stats->tx_csum_offloaded = txaccum.vtxs_csum; + stats->tx_tso_offloaded = txaccum.vtxs_tso; + stats->tx_task_rescheduled = txaccum.vtxs_rescheduled; SYSCTL_ADD_UQUAD(ctx, child, OID_AUTO, "mbuf_alloc_failed", CTLFLAG_RD, &stats->mbuf_alloc_failed, Modified: soc2015/stefano/ptnetmap/stable/10/sys/dev/virtio/network/if_vtnetvar.h ============================================================================== --- soc2015/stefano/ptnetmap/stable/10/sys/dev/virtio/network/if_vtnetvar.h Tue Jul 21 14:19:04 2015 (r288617) +++ soc2015/stefano/ptnetmap/stable/10/sys/dev/virtio/network/if_vtnetvar.h Tue Jul 21 14:19:50 2015 (r288618) @@ -285,7 +285,8 @@ VIRTIO_NET_F_MRG_RXBUF | \ VIRTIO_NET_F_MQ | \ VIRTIO_RING_F_EVENT_IDX | \ - VIRTIO_RING_F_INDIRECT_DESC) + VIRTIO_RING_F_INDIRECT_DESC | \ + VIRTIO_NET_F_PTNETMAP) /* * The VIRTIO_NET_F_HOST_TSO[46] features permit us to send the host Modified: soc2015/stefano/ptnetmap/stable/10/sys/dev/virtio/network/virtio_net.h ============================================================================== --- soc2015/stefano/ptnetmap/stable/10/sys/dev/virtio/network/virtio_net.h Tue Jul 21 14:19:04 2015 (r288617) +++ soc2015/stefano/ptnetmap/stable/10/sys/dev/virtio/network/virtio_net.h Tue Jul 21 14:19:50 2015 (r288618) @@ -53,6 +53,7 @@ #define VIRTIO_NET_F_GUEST_ANNOUNCE 0x200000 /* Announce device on network */ #define VIRTIO_NET_F_MQ 0x400000 /* Device supports RFS */ #define VIRTIO_NET_F_CTRL_MAC_ADDR 0x800000 /* Set MAC address */ +#define VIRTIO_NET_F_PTNETMAP 0x2000000 /* ptnetmap available */ #define VIRTIO_NET_S_LINK_UP 1 /* Link is up */ From owner-svn-soc-all@freebsd.org Tue Jul 21 14:21:36 2015 Return-Path: Delivered-To: svn-soc-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id A3D129A7059 for ; Tue, 21 Jul 2015 14:21:36 +0000 (UTC) (envelope-from stefano@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 938E51C3F for ; Tue, 21 Jul 2015 14:21:36 +0000 (UTC) (envelope-from stefano@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.15.2/8.15.2) with ESMTP id t6LELacF082697 for ; Tue, 21 Jul 2015 14:21:36 GMT (envelope-from stefano@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.15.2/8.15.2/Submit) id t6LELX3G082686 for svn-soc-all@FreeBSD.org; Tue, 21 Jul 2015 14:21:33 GMT (envelope-from stefano@FreeBSD.org) Date: Tue, 21 Jul 2015 14:21:33 GMT Message-Id: <201507211421.t6LELX3G082686@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to stefano@FreeBSD.org using -f From: stefano@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r288619 - in soc2015/stefano/ptnetmap/stable/10/sys: dev/netmap modules/netmap net MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 21 Jul 2015 14:21:36 -0000 Author: stefano Date: Tue Jul 21 14:21:33 2015 New Revision: 288619 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=288619 Log: add ptnetmap host and kthread support for FreeBSD Modified: soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_freebsd.c soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_kern.h soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_mem2.c soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_virt.h soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/ptnetmap.c soc2015/stefano/ptnetmap/stable/10/sys/modules/netmap/Makefile soc2015/stefano/ptnetmap/stable/10/sys/net/netmap.h Modified: soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_freebsd.c ============================================================================== --- soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_freebsd.c Tue Jul 21 14:19:50 2015 (r288618) +++ soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_freebsd.c Tue Jul 21 14:21:33 2015 (r288619) @@ -50,6 +50,10 @@ #include #include /* sockaddrs */ #include +#include /* kthread_add() */ +#include /* PROC_LOCK() */ +#include /* RFNOWAIT */ +#include /* sched_bind() */ #include #include #include /* IFT_ETHER */ @@ -535,7 +539,7 @@ *nm_paddr = rman_get_start(ptn_dev->pci_mem); *nm_addr = rman_get_virtual(ptn_dev->pci_mem); - D("=== BAR %d start %llx len %llx mem_size %x ===", + D("=== BAR %d start %lx len %lx mem_size %x ===", PTNETMAP_MEM_PCI_BAR, *nm_paddr, rman_get_size(ptn_dev->pci_mem), @@ -892,6 +896,215 @@ return 0; } +/******************** kthread wrapper ****************/ +struct nm_kthread_ctx { + void *ioevent_file; + void *irq_file; +#if 0 /* to be dane after eventfd implementation */ + /* files to exchange notifications */ + struct file *ioevent_file; /* notification from guest */ + struct file *irq_file; /* notification to guest (interrupt) */ + struct eventfd_ctx *irq_ctx; + + /* poll ioeventfd to receive notification from the guest */ + poll_table poll_table; + wait_queue_head_t *waitq_head; + wait_queue_t waitq; +#endif /* 0 */ + + /* worker function and parameter */ + nm_kthread_worker_fn_t worker_fn; + void *worker_private; + + struct nm_kthread *nmk; + + /* integer to manage multiple worker contexts (e.g., RX or TX on ptnetmap) */ + long type; +}; + +struct nm_kthread { + //struct mm_struct *mm; + struct thread *worker; + struct mtx worker_lock; + uint64_t scheduled; /* currently not used */ + struct nm_kthread_ctx worker_ctx; + int affinity; +}; + +void inline +nm_kthread_wakeup_worker(struct nm_kthread *nmk) +{ + (void)nmk; +} + +void inline +nm_kthread_send_irq(struct nm_kthread *nmk) +{ + (void)nmk; +} + +static +int is_suspended(void) +{ + struct proc *p; + struct thread *td; + int ret = 0; + + td = curthread; + p = td->td_proc; + + if ((td->td_pflags & TDP_KTHREAD) == 0) + panic("%s: curthread is not a valid kthread", __func__); + PROC_LOCK(p); + if (td->td_flags & TDF_KTH_SUSP) { + wakeup(&td->td_flags); + //msleep(&td->td_flags, &p->p_mtx, PPAUSE, "ktsusp", 0); + ret = 1; + } + PROC_UNLOCK(p); + return ret; +} + +static void +nm_kthread_worker(void *data) +{ + struct nm_kthread *nmk = data; + struct nm_kthread_ctx *ctx = &nmk->worker_ctx; + + thread_lock(curthread); + if (nmk->affinity >= 0) + sched_bind(curthread, nmk->affinity); + thread_unlock(curthread); + for (; !is_suspended();) { + if (nmk->worker == NULL) + break; + ctx->worker_fn(ctx->worker_private); /* worker_body */ + } + kthread_exit(); +} + +static int +nm_kthread_open_files(struct nm_kthread *nmk, struct nm_eventfd_cfg_ring *ring_cfg) +{ + (void)nmk; + (void)ring_cfg; + return 0; +} + +static void +nm_kthread_close_files(struct nm_kthread *nmk) +{ + (void)nmk; +} + +static void +nm_kthread_init_poll(struct nm_kthread *nmk, struct nm_kthread_ctx *ctx) +{ + (void)nmk; + (void)ctx; + return; +} + +static int +nm_kthread_start_poll(struct nm_kthread_ctx *ctx, void *file) +{ + (void)ctx; + (void)file; + return 0; +} + +static void +nm_kthread_stop_poll(struct nm_kthread_ctx *ctx) +{ + (void)ctx; +} + +void +nm_kthread_set_affinity(struct nm_kthread *nmk, int affinity) +{ + nmk->affinity = affinity; +} + +struct nm_kthread * +nm_kthread_create(struct nm_kthread_cfg *cfg) +{ + struct nm_kthread *nmk = NULL; + int error; + + nmk = malloc(sizeof(*nmk), M_DEVBUF, M_NOWAIT | M_ZERO); + if (!nmk) + return NULL; + + mtx_init(&nmk->worker_lock, "nm_kthread lock", NULL, MTX_DEF); + nmk->worker_ctx.worker_fn = cfg->worker_fn; + nmk->worker_ctx.worker_private = cfg->worker_private; + nmk->worker_ctx.type = cfg->type; + nmk->affinity = -1; + + /* open event fd */ + error = nm_kthread_open_files(nmk, &cfg->ring); + if (error) + goto err; + nm_kthread_init_poll(nmk, &nmk->worker_ctx); + + return nmk; +err: + free(nmk, M_DEVBUF); + return NULL; +} + +int +nm_kthread_start(struct nm_kthread *nmk) +{ + int error = 0; + + if (nmk->worker) { + return EBUSY; + } + + error = kthread_add(nm_kthread_worker, nmk, curproc, + &nmk->worker, RFNOWAIT /* to be checked */, 0, "nm-kthread-%ld", + nmk->worker_ctx.type); + if (error) + goto err; + D("started td 0x%p", nmk->worker); + + error = nm_kthread_start_poll(&nmk->worker_ctx, nmk->worker_ctx.ioevent_file); + if (error) + goto err_kstop; + return 0; +err_kstop: + kthread_suspend(nmk->worker, 0); +err: + nmk->worker = NULL; + return error; +} + +void +nm_kthread_stop(struct nm_kthread *nmk) +{ + if (!nmk->worker) { + return; + } + nm_kthread_stop_poll(&nmk->worker_ctx); + kthread_suspend(nmk->worker, 100); + nmk->worker = NULL; +} + +void +nm_kthread_delete(struct nm_kthread *nmk) +{ + if (!nmk) + return; + if (nmk->worker) { + nm_kthread_stop(nmk); + } + + nm_kthread_close_files(nmk); + + free(nmk, M_DEVBUF); +} + /******************** kqueue support ****************/ /* Modified: soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_kern.h ============================================================================== --- soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_kern.h Tue Jul 21 14:19:50 2015 (r288618) +++ soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_kern.h Tue Jul 21 14:21:33 2015 (r288619) @@ -62,8 +62,8 @@ #define WITH_PIPES #define WITH_MONITOR #define WITH_GENERIC -//#define WITH_PTNETMAP_HOST /* ptnetmap host not supported in FreeBSD */ -#define WITH_PTNETMAP_GUEST +#define WITH_PTNETMAP_HOST /* ptnetmap host support */ +#define WITH_PTNETMAP_GUEST /* ptnetmap guest support */ #endif @@ -1753,6 +1753,26 @@ void nm_vi_detach(struct ifnet *); void nm_vi_init_index(void); +/* + * kernel thread routines + */ +struct nm_kthread; /* OS-specific kthread - opaque */ +typedef void (*nm_kthread_worker_fn_t)(void *data); +/* kthread configuration */ +struct nm_kthread_cfg { + long type; /* kthread type */ + struct nm_eventfd_cfg_ring ring; /* ring event fd */ + nm_kthread_worker_fn_t worker_fn; /* worker function */ + void *worker_private; /* worker parameter */ +}; +/* kthread configuration */ +struct nm_kthread *nm_kthread_create(struct nm_kthread_cfg *cfg); +int nm_kthread_start(struct nm_kthread *); +void nm_kthread_stop(struct nm_kthread *); +void nm_kthread_delete(struct nm_kthread *); +void nm_kthread_wakeup_worker(struct nm_kthread *nmk); +void nm_kthread_send_irq(struct nm_kthread *); +void nm_kthread_set_affinity(struct nm_kthread *, int); #ifdef WITH_PTNETMAP_HOST /* Modified: soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_mem2.c ============================================================================== --- soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_mem2.c Tue Jul 21 14:19:50 2015 (r288618) +++ soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_mem2.c Tue Jul 21 14:21:33 2015 (r288619) @@ -1764,7 +1764,7 @@ } } - vaddr = (char *)(pv->nm_addr + nms_info->buf_pool_offset); + vaddr = (char *)(pv->nm_addr) + nms_info->buf_pool_offset; paddr = pv->nm_paddr + nms_info->buf_pool_offset; for (i = 0; i < nbuffers; i++) { @@ -1901,7 +1901,7 @@ { struct netmap_mem_ptg *pv = (struct netmap_mem_ptg *)nmd; - return vaddr - pv->nm_addr; + return (const char *)(vaddr) - (char *)(pv->nm_addr); } static void @@ -1932,7 +1932,7 @@ if (csb == NULL) return NULL; - return (struct netmap_if *)(pv->nm_addr + csb->nifp_offset); + return (struct netmap_if *)((char *)(pv->nm_addr) + csb->nifp_offset); } static void @@ -1961,7 +1961,7 @@ NMA_LOCK(na->nm_mem); /* point each kring to the corresponding backend ring */ - nifp = (struct netmap_if *)(pv->nm_addr + csb->nifp_offset); + nifp = (struct netmap_if *)((char *)pv->nm_addr + csb->nifp_offset); for (i = 0; i <= na->num_tx_rings; i++) { struct netmap_kring *kring = na->tx_rings + i; if (kring->ring) Modified: soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_virt.h ============================================================================== --- soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_virt.h Tue Jul 21 14:19:50 2015 (r288618) +++ soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/netmap_virt.h Tue Jul 21 14:21:33 2015 (r288619) @@ -179,11 +179,6 @@ /* * Structures used for ptnetmap configuration */ -struct ptnetmap_cfg_ring { - uint32_t ioeventfd; - uint32_t irqfd; -}; - /* * struct ptnetmap_cfg overlaps struct nmreq * from nr_offset field, but nr_cmd is required in netmap_ioctl() @@ -195,8 +190,8 @@ uint32_t features; #define PTNETMAP_CFG_FEAT_CSB 0x0001 #define PTNETMAP_CFG_FEAT_EVENTFD 0x0002 - struct ptnetmap_cfg_ring tx_ring; - struct ptnetmap_cfg_ring rx_ring; + struct nm_eventfd_cfg_ring tx_ring; + struct nm_eventfd_cfg_ring rx_ring; uint8_t pad[2]; /* padding to overlap strct nmreq */ uint16_t nr_cmd; /* needed in netmap_ioctl() */ void *csb; /* CSB */ @@ -275,21 +270,6 @@ #ifdef WITH_PTNETMAP_HOST /* ptnetmap kernel thread routines */ enum ptn_kthread_t { PTK_RX = 0, PTK_TX = 1 }; /* kthread type */ -struct ptn_kthread; /* ptnetmap kthread - opaque */ -typedef void (*ptn_kthread_worker_fn_t)(void *data); -/* ptnetmap kthread configuration */ -struct ptn_kthread_cfg { - enum ptn_kthread_t type; /* kthread TX or RX */ - struct ptnetmap_cfg_ring ring; /* ring event fd */ - ptn_kthread_worker_fn_t worker_fn; /* worker function */ - void *worker_private; /* worker parameter */ -}; -struct ptn_kthread *ptn_kthread_create(struct ptn_kthread_cfg *); -int ptn_kthread_start(struct ptn_kthread *); -void ptn_kthread_stop(struct ptn_kthread *); -void ptn_kthread_delete(struct ptn_kthread *); -void ptn_kthread_wakeup_worker(struct ptn_kthread *ptk); -void ptn_kthread_send_irq(struct ptn_kthread *); /* Functions to read and write CSB fields in the host */ #if defined (linux) Modified: soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/ptnetmap.c ============================================================================== --- soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/ptnetmap.c Tue Jul 21 14:19:50 2015 (r288618) +++ soc2015/stefano/ptnetmap/stable/10/sys/dev/netmap/ptnetmap.c Tue Jul 21 14:21:33 2015 (r288619) @@ -1,8 +1,23 @@ /* * common headers */ +#if defined(__FreeBSD__) +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define usleep_range(_1, _2) pause("ptnetmap-sleep", _1 * hz / 1000000) + +#elif defined(linux) #include +#endif + #include #include #include @@ -11,9 +26,10 @@ #ifdef WITH_PTNETMAP_HOST #define PTN_RX_NOWORK_CYCLE 10 /* RX cycle without receive any packets */ -#define PTN_TX_BATCH_LIM ((nkr_num_slots >> 1)) /* Limit Batch TX to half ring */ +//#define PTN_TX_BATCH_LIM ((nkr_num_slots >> 1)) /* Limit Batch TX to half ring */ #define PTN_AVOID_NM_PROLOGUE /* XXX: avoid nm_*sync_prologue() */ +#define BUSY_WAIT #define DEBUG /* Enables communication debugging. */ #ifdef DEBUG @@ -113,7 +129,7 @@ #endif /* RATE */ struct ptnetmap_state { - struct ptn_kthread *ptk_tx, *ptk_rx; /* kthreads pointers */ + struct nm_kthread *ptk_tx, *ptk_rx; /* kthreads pointers */ struct ptnetmap_cfg config; /* rings configuration */ struct paravirt_csb __user *csb; /* shared page with the guest */ @@ -129,12 +145,13 @@ static inline void ptnetmap_kring_dump(const char *title, const struct netmap_kring *kring) { - D("%s - name: %s hwcur: %d hwtail: %d rhead: %d rcur: %d rtail: %d head: %d cur: %d tail: %d", + RD(1, "%s - name: %s hwcur: %d hwtail: %d rhead: %d rcur: %d rtail: %d head: %d cur: %d tail: %d", title, kring->name, kring->nr_hwcur, kring->nr_hwtail, kring->rhead, kring->rcur, kring->rtail, kring->ring->head, kring->ring->cur, kring->ring->tail); } +#if 0 static inline void ptnetmap_ring_reinit(struct netmap_kring *kring, uint32_t g_head, uint32_t g_cur) { @@ -148,7 +165,7 @@ netmap_ring_reinit(kring); ptnetmap_kring_dump("kring reinit", kring); } - +#endif /* * TX functions to set/get and to handle host/guest kick. @@ -191,7 +208,9 @@ uint32_t g_cur, g_head, g_flags = 0; /* guest variables; init for compiler */ uint32_t nkr_num_slots; bool work = false; +#ifdef PTN_TX_BATCH_LIM int batch; +#endif IFRATE(uint32_t pre_tail;) if (unlikely(!pts)) { @@ -200,7 +219,7 @@ } if (unlikely(!pts->pth_na || pts->stopped || !pts->configured)) { - D("backend netmap is not configured or stopped"); + RD(1, "backend netmap is not configured or stopped"); goto leave; } @@ -282,13 +301,12 @@ if (unlikely(netmap_verbose & NM_VERB_TXSYNC)) ptnetmap_kring_dump("post txsync", kring); -//#define BUSY_WAIT #ifndef BUSY_WAIT /* Send kick to the guest if it needs them */ if (work && ptnetmap_tx_get_guestkick(csb)) { /* Disable guest kick to avoid sending unnecessary kicks */ ptnetmap_tx_set_guestkick(csb, 0); - ptn_kthread_send_irq(pts->ptk_tx); + nm_kthread_send_irq(pts->ptk_tx); IFRATE(pts->rate_ctx.new.htxk++); work = false; } @@ -337,7 +355,7 @@ /* Send kick to the guest if it needs them */ if (work && ptnetmap_tx_get_guestkick(csb)) { ptnetmap_tx_set_guestkick(csb, 0); - ptn_kthread_send_irq(pts->ptk_tx); + nm_kthread_send_irq(pts->ptk_tx); IFRATE(pts->rate_ctx.new.htxk++); } } @@ -380,11 +398,13 @@ * ring is full * We need to wait that the guest gets some packets from the ring and then it notifies us. */ +#ifndef BUSY_WAIT static inline int ptnetmap_kr_rxfull(struct netmap_kring *kring, uint32_t g_head) { return (ACCESS_ONCE(kring->nr_hwtail) == nm_prev(g_head, kring->nkr_num_slots - 1)); } +#endif /* !BUSY_WAIT */ /* Handle RX events: from the guest or from the backend */ static void @@ -406,7 +426,7 @@ } if (unlikely(!pts->pth_na || pts->stopped || !pts->configured)) { - D("backend netmap is not configured or stopped"); + RD(1, "backend netmap is not configured or stopped"); goto leave; } @@ -479,7 +499,7 @@ if (work && ptnetmap_rx_get_guestkick(csb)) { /* Disable guest kick to avoid sending unnecessary kicks */ ptnetmap_rx_set_guestkick(csb, 0); - ptn_kthread_send_irq(pts->ptk_rx); + nm_kthread_send_irq(pts->ptk_rx); IFRATE(pts->rate_ctx.new.hrxk++); work = false; } @@ -529,7 +549,7 @@ /* Send kick to the guest if it needs them */ if (work && ptnetmap_rx_get_guestkick(csb)) { ptnetmap_rx_set_guestkick(csb, 0); - ptn_kthread_send_irq(pts->ptk_rx); + nm_kthread_send_irq(pts->ptk_rx); IFRATE(pts->rate_ctx.new.hrxk++); } } @@ -540,7 +560,7 @@ if (unlikely(!pts)) return; ND("TX notify"); - ptn_kthread_wakeup_worker(pts->ptk_tx); + nm_kthread_wakeup_worker(pts->ptk_tx); IFRATE(pts->rate_ctx.new.btxwu++); } @@ -549,7 +569,7 @@ if (unlikely(!pts)) return; ND("RX notify"); - ptn_kthread_wakeup_worker(pts->ptk_rx); + nm_kthread_wakeup_worker(pts->ptk_rx); IFRATE(pts->rate_ctx.new.brxwu++); } @@ -614,24 +634,24 @@ static int ptnetmap_create_kthreads(struct ptnetmap_state *pts) { - struct ptn_kthread_cfg ptk_cfg; + struct nm_kthread_cfg nmk_cfg; - ptk_cfg.worker_private = pts; + nmk_cfg.worker_private = pts; /* TX kthread */ - ptk_cfg.type = PTK_TX; - ptk_cfg.ring = pts->config.tx_ring; - ptk_cfg.worker_fn = ptnetmap_tx_handler; - pts->ptk_tx = ptn_kthread_create(&ptk_cfg); + nmk_cfg.type = PTK_TX; + nmk_cfg.ring = pts->config.tx_ring; + nmk_cfg.worker_fn = ptnetmap_tx_handler; + pts->ptk_tx = nm_kthread_create(&nmk_cfg); if (pts->ptk_tx == NULL) { goto err; } /* RX kthread */ - ptk_cfg.type = PTK_RX; - ptk_cfg.ring = pts->config.rx_ring; - ptk_cfg.worker_fn = ptnetmap_rx_handler; - pts->ptk_rx = ptn_kthread_create(&ptk_cfg); + nmk_cfg.type = PTK_RX; + nmk_cfg.ring = pts->config.rx_ring; + nmk_cfg.worker_fn = ptnetmap_rx_handler; + pts->ptk_rx = nm_kthread_create(&nmk_cfg); if (pts->ptk_rx == NULL) { goto err; } @@ -639,7 +659,7 @@ return 0; err: if (pts->ptk_tx) { - ptn_kthread_delete(pts->ptk_tx); + nm_kthread_delete(pts->ptk_tx); pts->ptk_tx = NULL; } return EFAULT; @@ -659,14 +679,16 @@ pts->stopped = false; /* TX kthread */ - error = ptn_kthread_start(pts->ptk_tx); + //nm_kthread_set_affinity(pts->ptk_tx, 2); + error = nm_kthread_start(pts->ptk_tx); if (error) { return error; } /* RX kthread */ - error = ptn_kthread_start(pts->ptk_rx); + //nm_kthread_set_affinity(pts->ptk_tx, 3); + error = nm_kthread_start(pts->ptk_rx); if (error) { - ptn_kthread_stop(pts->ptk_tx); + nm_kthread_stop(pts->ptk_tx); return error; } @@ -683,9 +705,9 @@ pts->stopped = true; /* TX kthread */ - ptn_kthread_stop(pts->ptk_tx); + nm_kthread_stop(pts->ptk_tx); /* RX kthread */ - ptn_kthread_stop(pts->ptk_rx); + nm_kthread_stop(pts->ptk_rx); } static int nm_pt_host_notify(struct netmap_kring *, int); @@ -796,8 +818,8 @@ pts->configured = false; /* delete kthreads */ - ptn_kthread_delete(pts->ptk_tx); - ptn_kthread_delete(pts->ptk_rx); + nm_kthread_delete(pts->ptk_tx); + nm_kthread_delete(pts->ptk_rx); IFRATE(del_timer(&pts->rate_ctx.timer)); Modified: soc2015/stefano/ptnetmap/stable/10/sys/modules/netmap/Makefile ============================================================================== --- soc2015/stefano/ptnetmap/stable/10/sys/modules/netmap/Makefile Tue Jul 21 14:19:50 2015 (r288618) +++ soc2015/stefano/ptnetmap/stable/10/sys/modules/netmap/Makefile Tue Jul 21 14:21:33 2015 (r288619) @@ -10,7 +10,7 @@ .PATH.h: ${.CURDIR}/../../net CFLAGS += -I${.CURDIR}/../../ KMOD = netmap -SRCS = device_if.h bus_if.h opt_netmap.h +SRCS = device_if.h bus_if.h pci_if.h opt_netmap.h SRCS += netmap.c netmap.h netmap_kern.h SRCS += netmap_mem2.c netmap_mem2.h SRCS += netmap_generic.c @@ -20,7 +20,7 @@ SRCS += netmap_offloadings.c SRCS += netmap_pipe.c SRCS += netmap_monitor.c -SRCS += ptnetmap_freebsd.c +SRCS += ptnetmap.c SRCS += opt_inet.h opt_inet6.h .include Modified: soc2015/stefano/ptnetmap/stable/10/sys/net/netmap.h ============================================================================== --- soc2015/stefano/ptnetmap/stable/10/sys/net/netmap.h Tue Jul 21 14:19:50 2015 (r288618) +++ soc2015/stefano/ptnetmap/stable/10/sys/net/netmap.h Tue Jul 21 14:21:33 2015 (r288619) @@ -563,4 +563,12 @@ char nifr_name[IFNAMSIZ]; char data[NM_IFRDATA_LEN]; }; + +/* + * kernel thread config + */ +struct nm_eventfd_cfg_ring { + uint32_t ioeventfd; + uint32_t irqfd; +}; #endif /* _NET_NETMAP_H_ */ From owner-svn-soc-all@freebsd.org Tue Jul 21 18:14:11 2015 Return-Path: Delivered-To: svn-soc-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id E36FA9A7D2A for ; Tue, 21 Jul 2015 18:14:11 +0000 (UTC) (envelope-from iateaca@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id C8B781A45 for ; Tue, 21 Jul 2015 18:14:11 +0000 (UTC) (envelope-from iateaca@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.15.2/8.15.2) with ESMTP id t6LIEB1h053537 for ; Tue, 21 Jul 2015 18:14:11 GMT (envelope-from iateaca@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.15.2/8.15.2/Submit) id t6LIEBu9052842 for svn-soc-all@FreeBSD.org; Tue, 21 Jul 2015 18:14:11 GMT (envelope-from iateaca@FreeBSD.org) Date: Tue, 21 Jul 2015 18:14:11 GMT Message-Id: <201507211814.t6LIEBu9052842@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to iateaca@FreeBSD.org using -f From: iateaca@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r288633 - soc2015/iateaca/bhyve-ne2000-head/usr.sbin/bhyve MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 21 Jul 2015 18:14:12 -0000 Author: iateaca Date: Tue Jul 21 18:14:10 2015 New Revision: 288633 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=288633 Log: add support for the read-only registers in page0 and handle the monitor mode Modified: soc2015/iateaca/bhyve-ne2000-head/usr.sbin/bhyve/pci_ne2000.c Modified: soc2015/iateaca/bhyve-ne2000-head/usr.sbin/bhyve/pci_ne2000.c ============================================================================== --- soc2015/iateaca/bhyve-ne2000-head/usr.sbin/bhyve/pci_ne2000.c Tue Jul 21 17:19:03 2015 (r288632) +++ soc2015/iateaca/bhyve-ne2000-head/usr.sbin/bhyve/pci_ne2000.c Tue Jul 21 18:14:10 2015 (r288633) @@ -34,10 +34,11 @@ #define NE2000_P1 1 #define NE2000_P2 2 #define NE2000_P3 3 +#define NE2000_P0_RO 4 #define NE2000_MEM_SIZE 32768 #define NE2000_PAGE_SIZE 0x10 -#define NE2000_PAGE_COUNT 4 +#define NE2000_PAGE_COUNT 5 #define NE2000_BAR_NIC 0 #define NE2000_BAR_ASIC 1 @@ -98,7 +99,7 @@ static void ne2000_set_reg_by_offset(struct pci_ne2000_softc *sc, uint8_t page, uint8_t offset, uint8_t value); -static int +static uint8_t ne2000_get_reg_by_offset(struct pci_ne2000_softc *sc, uint8_t page, uint8_t offset); static void @@ -158,7 +159,7 @@ sc->nic_regs[page][offset] = value; } -static int +static uint8_t ne2000_get_reg_by_offset(struct pci_ne2000_softc *sc, uint8_t page, uint8_t offset) { @@ -270,11 +271,8 @@ DPRINTF("Receive Packet: from tap interface of %zd bytes", read_len); - if (!ne2000_ether_frame_is_valid(sc)) - return -1; - - if (!ne2000_receive_ring_is_valid(sc)) { - DPRINTF("Drop the packet since the ring is not valid"); + if (!ne2000_ether_frame_is_valid(sc)) { + DPRINTF("Drop the packet since the ether frame did not match"); return 0; } @@ -305,10 +303,11 @@ DPRINTF("Receive Packet: size: %d psize: %d next_curr: %d index: %d", size, psize, next_curr, index); - ne2000_set_field_by_offset(sc, NE2000_P0, ED_P0_RSR, 0xff, ED_RSR_PRX); + ne2000_set_field_by_offset(sc, NE2000_P0_RO, ED_P0_RSR, + 0xff, ED_RSR_PRX); ed_hdr = (struct ed_ring *)(sc->ram + index); - ed_hdr->rsr = ne2000_get_reg_by_offset(sc, NE2000_P0, ED_P0_RSR); + ed_hdr->rsr = ne2000_get_reg_by_offset(sc, NE2000_P0_RO, ED_P0_RSR); ed_hdr->next_packet = next_curr; ed_hdr->count = size + sizeof(struct ed_ring); @@ -383,6 +382,8 @@ uint8_t curr = 0; uint8_t bnry = 0; + assert(ne2000_receive_ring_is_valid(sc)); + pstart = ne2000_get_reg_by_offset(sc, NE2000_P0, ED_P0_PSTART); pstop = ne2000_get_reg_by_offset(sc, NE2000_P0, ED_P0_PSTOP); curr = ne2000_get_reg_by_offset(sc, NE2000_P1, ED_P1_CURR); @@ -407,10 +408,15 @@ static int ne2000_ether_frame_is_valid(struct pci_ne2000_softc *sc) { - /* - * TODO implement a better validation taking in consideration the - * Receiver Configuration Register (RCR) and maybe the frame's CRC - */ + uint8_t rcr = 0; + uint8_t broadcast_addr[] = {[0 ... (ETHER_ADDR_LEN - 1)] = 0xff}; + + rcr = ne2000_get_reg_by_offset(sc, NE2000_P0, ED_P0_RCR); + + if (rcr & ED_RCR_MON) { + DPRINTF("The NIC card is in Monitor Mode"); + return 0; + } /* is valid if the destination MAC matches the NIC's address */ if (sc->rcv_buf[0] == sc->ram[0] && @@ -422,13 +428,10 @@ return 1; /* is valid if the destination MAC is the broadcast address */ - if (sc->rcv_buf[0] == 0xff && - sc->rcv_buf[1] == 0xff && - sc->rcv_buf[2] == 0xff && - sc->rcv_buf[3] == 0xff && - sc->rcv_buf[4] == 0xff && - sc->rcv_buf[5] == 0xff) - return 1; + if (rcr & ED_RCR_AB) { + if (memcmp(sc->rcv_buf, broadcast_addr, ETHER_ADDR_LEN) == 0) + return 1; + } return 0; } @@ -771,6 +774,9 @@ ne2000_set_field_by_offset(sc, NE2000_P0, ED_P0_ISR, value, 0); pci_ne2000_update_intr(sc); break; + case ED_P0_RCR: + DPRINTF("RCR Register: %d", value); + break; } return 0; @@ -835,17 +841,41 @@ { uint8_t value = 0; - /* check is not a RTL8029 Register Defined in Page0 */ + /* + * check is either a RTL8029 Register Defined in Page0 + * or is a read-only Register Defined in Page0 + */ if (sc->page == NE2000_P0) { - if (offset == ED_RTL80X9_80X9ID0) - return ED_RTL80X9_ID0; - else if (offset == ED_RTL80X9_80X9ID1) - return ED_RTL8029_ID1; + switch (offset) { + case ED_RTL80X9_80X9ID0: + value = ED_RTL80X9_ID0; + break; + case ED_RTL80X9_80X9ID1: + value = ED_RTL8029_ID1; + break; + case ED_P0_CLDA0: + case ED_P0_CLDA1: + case ED_P0_TSR: + case ED_P0_NCR: + case ED_P0_FIFO: + case ED_P0_CRDA0: + case ED_P0_CRDA1: + case ED_P0_RSR: + case ED_P0_CNTR0: + case ED_P0_CNTR1: + case ED_P0_CNTR2: + /* read a read-only register from page 0 */ + value = ne2000_get_reg_by_offset(sc, NE2000_P0_RO, offset); + break; + default: + value = ne2000_get_reg_by_offset(sc, NE2000_P0, offset); + break; + } + } else { + /* read a general NE2000 register */ + value = ne2000_get_reg_by_offset(sc, sc->page, offset); } - /* read a general NE2000 register */ - value = ne2000_get_reg_by_offset(sc, sc->page, offset); - return value; } From owner-svn-soc-all@freebsd.org Wed Jul 22 20:17:28 2015 Return-Path: Delivered-To: svn-soc-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id F15BA9A8F7D for ; Wed, 22 Jul 2015 20:17:28 +0000 (UTC) (envelope-from clord@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id E20981E22 for ; Wed, 22 Jul 2015 20:17:28 +0000 (UTC) (envelope-from clord@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.15.2/8.15.2) with ESMTP id t6MKHSEg027419 for ; Wed, 22 Jul 2015 20:17:28 GMT (envelope-from clord@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.15.2/8.15.2/Submit) id t6MKHSXW027402 for svn-soc-all@FreeBSD.org; Wed, 22 Jul 2015 20:17:28 GMT (envelope-from clord@FreeBSD.org) Date: Wed, 22 Jul 2015 20:17:28 GMT Message-Id: <201507222017.t6MKHSXW027402@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to clord@FreeBSD.org using -f From: clord@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r288677 - soc2015/clord/head/sys/contrib/ficl MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 22 Jul 2015 20:17:29 -0000 Author: clord Date: Wed Jul 22 20:17:27 2015 New Revision: 288677 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=288677 Log: Specify type for defaultStackSize to prevent compiler warnings Modified: soc2015/clord/head/sys/contrib/ficl/compatibility.c Modified: soc2015/clord/head/sys/contrib/ficl/compatibility.c ============================================================================== --- soc2015/clord/head/sys/contrib/ficl/compatibility.c Wed Jul 22 19:58:21 2015 (r288676) +++ soc2015/clord/head/sys/contrib/ficl/compatibility.c Wed Jul 22 20:17:27 2015 (r288677) @@ -185,7 +185,7 @@ } extern ficlSystem *ficlSystemGlobal; -static defaultStackSize = FICL_DEFAULT_STACK_SIZE; +static int defaultStackSize = FICL_DEFAULT_STACK_SIZE; FICL_PLATFORM_EXTERN int ficlSetStackSize(int nStackCells) { if (defaultStackSize < nStackCells) From owner-svn-soc-all@freebsd.org Wed Jul 22 20:24:08 2015 Return-Path: Delivered-To: svn-soc-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 13FA39A8105 for ; Wed, 22 Jul 2015 20:24:08 +0000 (UTC) (envelope-from clord@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 04D9A1155 for ; Wed, 22 Jul 2015 20:24:08 +0000 (UTC) (envelope-from clord@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.15.2/8.15.2) with ESMTP id t6MKO7su035335 for ; Wed, 22 Jul 2015 20:24:07 GMT (envelope-from clord@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.15.2/8.15.2/Submit) id t6MKO7nW035332 for svn-soc-all@FreeBSD.org; Wed, 22 Jul 2015 20:24:07 GMT (envelope-from clord@FreeBSD.org) Date: Wed, 22 Jul 2015 20:24:07 GMT Message-Id: <201507222024.t6MKO7nW035332@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to clord@FreeBSD.org using -f From: clord@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r288678 - soc2015/clord/head/sys/contrib/ficl MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 22 Jul 2015 20:24:08 -0000 Author: clord Date: Wed Jul 22 20:24:06 2015 New Revision: 288678 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=288678 Log: Put #defines above where they are actually used Modified: soc2015/clord/head/sys/contrib/ficl/ficlcompatibility.h Modified: soc2015/clord/head/sys/contrib/ficl/ficlcompatibility.h ============================================================================== --- soc2015/clord/head/sys/contrib/ficl/ficlcompatibility.h Wed Jul 22 20:17:27 2015 (r288677) +++ soc2015/clord/head/sys/contrib/ficl/ficlcompatibility.h Wed Jul 22 20:24:06 2015 (r288678) @@ -139,9 +139,9 @@ #define FICL_DEFAULT_ENV FICL_DEFAULT_ENVIRONMENT_SIZE #define FICL_DEFAULT_VOCS FICL_MAX_WORDLISTS - - - +#define nName length +#define ficl_word ficlWord +#define FICL_WORD ficlWord struct vm { @@ -189,10 +189,6 @@ #define VM_ASSERT(pVM) #endif -#define nName length -#define ficl_word ficlWord -#define FICL_WORD ficlWord - #define CELLS_PER_WORD \ ( (sizeof (FICL_WORD) + nFICLNAME + sizeof (CELL)) \ / (sizeof (CELL)) ) From owner-svn-soc-all@freebsd.org Wed Jul 22 20:25:42 2015 Return-Path: Delivered-To: svn-soc-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 82B249A8120 for ; Wed, 22 Jul 2015 20:25:42 +0000 (UTC) (envelope-from clord@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 7291B1180 for ; Wed, 22 Jul 2015 20:25:42 +0000 (UTC) (envelope-from clord@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.15.2/8.15.2) with ESMTP id t6MKPgsh035902 for ; Wed, 22 Jul 2015 20:25:42 GMT (envelope-from clord@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.15.2/8.15.2/Submit) id t6MKPePT035893 for svn-soc-all@FreeBSD.org; Wed, 22 Jul 2015 20:25:40 GMT (envelope-from clord@FreeBSD.org) Date: Wed, 22 Jul 2015 20:25:40 GMT Message-Id: <201507222025.t6MKPePT035893@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to clord@FreeBSD.org using -f From: clord@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r288679 - soc2015/clord/head/sys/contrib/ficl MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 22 Jul 2015 20:25:42 -0000 Author: clord Date: Wed Jul 22 20:25:40 2015 New Revision: 288679 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=288679 Log: Add function prototypes to silence compiler warnings Added: soc2015/clord/head/sys/contrib/ficl/extern.h Modified: soc2015/clord/head/sys/contrib/ficl/loader.c soc2015/clord/head/sys/contrib/ficl/system.c soc2015/clord/head/sys/contrib/ficl/tools.c Added: soc2015/clord/head/sys/contrib/ficl/extern.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ soc2015/clord/head/sys/contrib/ficl/extern.h Wed Jul 22 20:25:40 2015 (r288679) @@ -0,0 +1,36 @@ +/*- + * Copyright (c) 2015 Colin Lord + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifdef __i386__ +int biospci_count_device_type(uint32_t devid); +int biospci_find_devclass(uint32_t class, int index, uint32_t *locator); +int biospci_find_device(uint32_t devid, int index, uint32_t *locator); +int biospci_write_config(uint32_t locator, int offset, int width, uint32_t val); +int biospci_read_config(uint32_t locator, int offset, int width, uint32_t *val); +uint32_t biospci_locator(int8_t bus, uint8_t device, uint8_t function); +#endif Modified: soc2015/clord/head/sys/contrib/ficl/loader.c ============================================================================== --- soc2015/clord/head/sys/contrib/ficl/loader.c Wed Jul 22 20:24:06 2015 (r288678) +++ soc2015/clord/head/sys/contrib/ficl/loader.c Wed Jul 22 20:25:40 2015 (r288679) @@ -46,6 +46,7 @@ #include "bootstrap.h" #include #include "ficl.h" +#include "extern.h" /* FreeBSD's loader interaction words and extras * Modified: soc2015/clord/head/sys/contrib/ficl/system.c ============================================================================== --- soc2015/clord/head/sys/contrib/ficl/system.c Wed Jul 22 20:24:06 2015 (r288678) +++ soc2015/clord/head/sys/contrib/ficl/system.c Wed Jul 22 20:25:40 2015 (r288679) @@ -81,6 +81,8 @@ ficlSystem *ficlSystemGlobal = NULL; +int sscanf(const char * restrict str, const char * restrict format, ...); + /************************************************************************** f i c l S e t V e r s i o n E n v ** Create a double ficlCell environment constant for the version ID Modified: soc2015/clord/head/sys/contrib/ficl/tools.c ============================================================================== --- soc2015/clord/head/sys/contrib/ficl/tools.c Wed Jul 22 20:24:06 2015 (r288678) +++ soc2015/clord/head/sys/contrib/ficl/tools.c Wed Jul 22 20:25:40 2015 (r288679) @@ -67,6 +67,7 @@ #include "ficl.h" +void exit(int status); static void ficlPrimitiveStepIn(ficlVm *vm); static void ficlPrimitiveStepOver(ficlVm *vm); static void ficlPrimitiveStepBreak(ficlVm *vm); From owner-svn-soc-all@freebsd.org Wed Jul 22 20:28:31 2015 Return-Path: Delivered-To: svn-soc-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id BE72D9A8168 for ; Wed, 22 Jul 2015 20:28:31 +0000 (UTC) (envelope-from clord@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id AF2A712AB for ; Wed, 22 Jul 2015 20:28:31 +0000 (UTC) (envelope-from clord@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.15.2/8.15.2) with ESMTP id t6MKSVrM036892 for ; Wed, 22 Jul 2015 20:28:31 GMT (envelope-from clord@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.15.2/8.15.2/Submit) id t6MKSV4l036890 for svn-soc-all@FreeBSD.org; Wed, 22 Jul 2015 20:28:31 GMT (envelope-from clord@FreeBSD.org) Date: Wed, 22 Jul 2015 20:28:31 GMT Message-Id: <201507222028.t6MKSV4l036890@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to clord@FreeBSD.org using -f From: clord@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r288680 - soc2015/clord/head/sys/contrib/ficl/i386 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 22 Jul 2015 20:28:31 -0000 Author: clord Date: Wed Jul 22 20:28:30 2015 New Revision: 288680 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=288680 Log: Take care of troublesome prototypes Modified: soc2015/clord/head/sys/contrib/ficl/i386/sysdep.h Modified: soc2015/clord/head/sys/contrib/ficl/i386/sysdep.h ============================================================================== --- soc2015/clord/head/sys/contrib/ficl/i386/sysdep.h Wed Jul 22 20:25:40 2015 (r288679) +++ soc2015/clord/head/sys/contrib/ficl/i386/sysdep.h Wed Jul 22 20:28:30 2015 (r288680) @@ -402,8 +402,10 @@ ** on a 32 bit CPU than in C, which usually doesn't support ** the double length result (but it should). */ +#ifndef __SYSDEP_H__ DPUNS ficlLongMul(FICL_UNS x, FICL_UNS y); UNSQR ficlLongDiv(DPUNS q, FICL_UNS y); +#endif /* From owner-svn-soc-all@freebsd.org Wed Jul 22 20:32:49 2015 Return-Path: Delivered-To: svn-soc-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 2426B9A8271 for ; Wed, 22 Jul 2015 20:32:49 +0000 (UTC) (envelope-from clord@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 0C755164A for ; Wed, 22 Jul 2015 20:32:49 +0000 (UTC) (envelope-from clord@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.15.2/8.15.2) with ESMTP id t6MKWmCV044604 for ; Wed, 22 Jul 2015 20:32:48 GMT (envelope-from clord@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.15.2/8.15.2/Submit) id t6MKWi78044582 for svn-soc-all@FreeBSD.org; Wed, 22 Jul 2015 20:32:44 GMT (envelope-from clord@FreeBSD.org) Date: Wed, 22 Jul 2015 20:32:44 GMT Message-Id: <201507222032.t6MKWi78044582@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to clord@FreeBSD.org using -f From: clord@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r288681 - soc2015/clord/head/sys/contrib/ficl/i386 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 22 Jul 2015 20:32:49 -0000 Author: clord Date: Wed Jul 22 20:32:40 2015 New Revision: 288681 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=288681 Log: Specify to Ficl that there is a locally customized ficlTextOut function to use Modified: soc2015/clord/head/sys/contrib/ficl/i386/sysdep.c soc2015/clord/head/sys/contrib/ficl/i386/sysdep.h Modified: soc2015/clord/head/sys/contrib/ficl/i386/sysdep.c ============================================================================== --- soc2015/clord/head/sys/contrib/ficl/i386/sysdep.c Wed Jul 22 20:28:30 2015 (r288680) +++ soc2015/clord/head/sys/contrib/ficl/i386/sysdep.c Wed Jul 22 20:32:40 2015 (r288681) @@ -53,12 +53,12 @@ } #endif -void ficlTextOut(FICL_VM *pVM, char *msg, int fNewline) +void ficlTextOutLocal(FICL_VM *pVM, char *text, int fNewline) { IGNORE(pVM); - while(*msg != 0) - putchar(*(msg++)); + while(*text != 0) + putchar(*(text++)); if (fNewline) putchar('\n'); Modified: soc2015/clord/head/sys/contrib/ficl/i386/sysdep.h ============================================================================== --- soc2015/clord/head/sys/contrib/ficl/i386/sysdep.h Wed Jul 22 20:28:30 2015 (r288680) +++ soc2015/clord/head/sys/contrib/ficl/i386/sysdep.h Wed Jul 22 20:32:40 2015 (r288681) @@ -370,7 +370,7 @@ ** and remainder */ struct vm; -void ficlTextOut(struct vm *pVM, char *msg, int fNewline); +void ficlTextOutLocal(struct vm *pVM, char *text, int fNewline); void *ficlMalloc (size_t size); void ficlFree (void *p); void *ficlRealloc(void *p, size_t size); From owner-svn-soc-all@freebsd.org Thu Jul 23 17:52:57 2015 Return-Path: Delivered-To: svn-soc-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id D28BF9A9CC6 for ; Thu, 23 Jul 2015 17:52:57 +0000 (UTC) (envelope-from mihai@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id C227512BC for ; Thu, 23 Jul 2015 17:52:57 +0000 (UTC) (envelope-from mihai@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.15.2/8.15.2) with ESMTP id t6NHqvmJ035002 for ; Thu, 23 Jul 2015 17:52:57 GMT (envelope-from mihai@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.15.2/8.15.2/Submit) id t6NHqtdn034983 for svn-soc-all@FreeBSD.org; Thu, 23 Jul 2015 17:52:55 GMT (envelope-from mihai@FreeBSD.org) Date: Thu, 23 Jul 2015 17:52:55 GMT Message-Id: <201507231752.t6NHqtdn034983@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to mihai@FreeBSD.org using -f From: mihai@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r288695 - in soc2015/mihai/bhyve-on-arm-head/sys/arm: include vmm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 23 Jul 2015 17:52:58 -0000 Author: mihai Date: Thu Jul 23 17:52:55 2015 New Revision: 288695 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=288695 Log: soc2015: mihai: bhyve: sys: arm: arm.c: handle stub exception and implement emulation for MMIO accesses Modified: soc2015/mihai/bhyve-on-arm-head/sys/arm/include/vmm.h soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/arm.c soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/hyp.h soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/mmu.h soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/vmm.c Modified: soc2015/mihai/bhyve-on-arm-head/sys/arm/include/vmm.h ============================================================================== --- soc2015/mihai/bhyve-on-arm-head/sys/arm/include/vmm.h Thu Jul 23 15:50:39 2015 (r288694) +++ soc2015/mihai/bhyve-on-arm-head/sys/arm/include/vmm.h Thu Jul 23 17:52:55 2015 (r288695) @@ -32,6 +32,21 @@ VM_REG_GUEST_LR, VM_REG_GUEST_PC, VM_REG_GUEST_CPSR, + VM_REG_GUEST_SP_SVC, + VM_REG_GUEST_LR_SVC, + VM_REG_GUEST_SP_ABT, + VM_REG_GUEST_LR_ABT, + VM_REG_GUEST_SP_UND, + VM_REG_GUEST_LR_UND, + VM_REG_GUEST_SP_IRQ, + VM_REG_GUEST_LR_IRQ, + VM_REG_GUEST_R8_FIQ, + VM_REG_GUEST_R9_FIQ, + VM_REG_GUEST_R10_FIQ, + VM_REG_GUEST_R11_FIQ, + VM_REG_GUEST_R12_FIQ, + VM_REG_GUEST_SP_FIQ, + VM_REG_GUEST_LR_FIQ, VM_REG_LAST }; @@ -229,6 +244,11 @@ #define VM_MAXCPU 16 /* maximum virtual cpus */ +struct vie { + uint8_t access_size:4, sign_extend:1, dir:1, unused:2; + enum vm_reg_name reg; +}; + /* * Identifiers for optional vmm capabilities */ @@ -240,16 +260,8 @@ VM_CAP_MAX }; enum vm_exitcode { - VM_EXITCODE_INOUT, - VM_EXITCODE_VMX, VM_EXITCODE_BOGUS, - VM_EXITCODE_RDMSR, - VM_EXITCODE_WRMSR, - VM_EXITCODE_HLT, - VM_EXITCODE_MTRAP, - VM_EXITCODE_PAUSE, - VM_EXITCODE_PAGING, - VM_EXITCODE_SPINUP_AP, + VM_EXITCODE_INST_EMUL, VM_EXITCODE_HYP, VM_EXITCODE_MAX }; @@ -271,7 +283,7 @@ struct vm_exit { enum vm_exitcode exitcode; - int inst_length; /* 0 means unknown */ + int inst_length; uint64_t pc; union { /* @@ -283,6 +295,7 @@ uint32_t hdfar; /* VA at a Data Abort exception */ uint32_t hifar; /* VA at a Prefetch Abort exception */ uint32_t hpfar; /* IPA[39:12] at aborts on stage 2 address translations */ + uint32_t mode; } hyp; struct { @@ -291,7 +304,7 @@ } paging; struct { uint64_t gpa; - uint64_t gla; + struct vie vie; } inst_emul; /* * VMX specific payload. Used when there is no "better" Modified: soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/arm.c ============================================================================== --- soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/arm.c Thu Jul 23 15:50:39 2015 (r288694) +++ soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/arm.c Thu Jul 23 17:52:55 2015 (r288695) @@ -214,6 +214,189 @@ return (hyp); } +static enum vm_reg_name +get_vm_reg_name(uint32_t reg_nr, uint32_t mode) +{ + switch(reg_nr) { + case 0: + return VM_REG_GUEST_R0; + case 1: + return VM_REG_GUEST_R1; + case 2: + return VM_REG_GUEST_R2; + case 3: + return VM_REG_GUEST_R3; + case 4: + return VM_REG_GUEST_R4; + case 5: + return VM_REG_GUEST_R5; + case 6: + return VM_REG_GUEST_R6; + case 7: + return VM_REG_GUEST_R7; + case 8: + if (mode == PSR_FIQ32_MODE) + return VM_REG_GUEST_R8_FIQ; + else + return VM_REG_GUEST_R8; + case 9: + if (mode == PSR_FIQ32_MODE) + return VM_REG_GUEST_R9_FIQ; + else + return VM_REG_GUEST_R9; + case 10: + if (mode == PSR_FIQ32_MODE) + return VM_REG_GUEST_R10_FIQ; + else + return VM_REG_GUEST_R10; + case 11: + if (mode == PSR_FIQ32_MODE) + return VM_REG_GUEST_R11_FIQ; + else + return VM_REG_GUEST_R11; + case 12: + if (mode == PSR_FIQ32_MODE) + return VM_REG_GUEST_R12_FIQ; + else + return VM_REG_GUEST_R12; + case 13: + if (mode == PSR_FIQ32_MODE) + return VM_REG_GUEST_SP_FIQ; + else if (mode == PSR_SVC32_MODE) + return VM_REG_GUEST_SP_SVC; + else if (mode == PSR_ABT32_MODE) + return VM_REG_GUEST_SP_ABT; + else if (mode == PSR_UND32_MODE) + return VM_REG_GUEST_SP_UND; + else if (mode == PSR_IRQ32_MODE) + return VM_REG_GUEST_SP_IRQ; + else + return VM_REG_GUEST_SP; + case 14: + if (mode == PSR_FIQ32_MODE) + return VM_REG_GUEST_LR_FIQ; + else if (mode == PSR_SVC32_MODE) + return VM_REG_GUEST_LR_SVC; + else if (mode == PSR_ABT32_MODE) + return VM_REG_GUEST_LR_ABT; + else if (mode == PSR_UND32_MODE) + return VM_REG_GUEST_LR_UND; + else if (mode == PSR_IRQ32_MODE) + return VM_REG_GUEST_LR_IRQ; + else + return VM_REG_GUEST_LR; + } + return VM_REG_LAST; +} + +static int hyp_handle_exception(struct vm_exit *vmexit) +{ + int handled; + int hsr_ec, hsr_il, hsr_iss; + + handled = UNHANDLED; + hsr_ec = HSR_EC(vmexit->u.hyp.hsr); + hsr_il = HSR_IL(vmexit->u.hyp.hsr); + hsr_iss = HSR_ISS(vmexit->u.hyp.hsr); + + switch(hsr_ec) { + case HSR_EC_UNKN: + printf("%s:%d Unknown exception\n",__func__, __LINE__); + break; + case HSR_EC_WFI_WFE: + printf("%s:%d WFI/WFE exception - unimplemented\n", + __func__, __LINE__); + break; + case HSR_EC_MCR_MRC_CP15: + printf("%s:%d MCR/MRC CP15 - unimplemented\n", + __func__, __LINE__); + break; + case HSR_EC_MCRR_MRRC_CP15: + printf("%s:%d MCRR/MRRC CP15 - unimplemented\n", + __func__, __LINE__); + break; + case HSR_EC_MCR_MRC_CP14: + printf("%s:%d MCR/MRC CP14 - unimplemented\n", + __func__, __LINE__); + break; + case HSR_EC_LDC_STC_CP14: + printf("%s:%d LDC/STC CP14 - unimplemented\n", + __func__, __LINE__); + break; + case HSR_EC_HCPTR_CP0_CP13: + printf("%s:%d MCR/MRC CP14 - unimplemented\n", + __func__, __LINE__); + break; + case HSR_EC_MRC_VMRS_CP10: + printf("%s:%d MCR/VMRS CP14 - unimplemented\n", + __func__, __LINE__); + break; + case HSR_EC_BXJ: + printf("%s:%d BXJ - unimplemented\n", + __func__, __LINE__); + break; + case HSR_EC_MRRC_CP14: + printf("%s:%d MRRC CP14 - unimplemented\n", + __func__, __LINE__); + break; + case HSR_EC_SVC: + panic("%s:%d SVC called from hyp-mode\n", + __func__, __LINE__); + break; + case HSR_EC_HVC: + printf("%s:%d HVC called from hyp-mode - unsupported\n", + __func__, __LINE__); + break; + case HSR_EC_SMC: + printf("%s:%d SMC called from hyp-mode - unsupported\n", + __func__, __LINE__); + break; + case HSR_EC_PABT: + printf("%s:%d PABT from guest at address %x - unimplemented\n", + __func__, __LINE__, vmexit->u.hyp.hifar); + break; + case HSR_EC_PABT_HYP: + printf("%s:%d PABT taken from HYP mode at %x with HSR: %x\n", + __func__, __LINE__, vmexit->u.hyp.hifar, vmexit->u.hyp.hsr); + break; + case HSR_EC_DABT: + if (HSR_ISS_ISV(hsr_iss)) { + if (LPAE_TRANSLATION_FAULT(HSR_ISS_DFSC(hsr_iss))) { + /* + * The page is not mapped and a possible MMIO access + * Build the instruction info and return to user to emulate + */ + vmexit->exitcode = VM_EXITCODE_INST_EMUL; + vmexit->u.inst_emul.gpa = vmexit->u.hyp.hdfar; + vmexit->u.inst_emul.vie.access_size = HSR_ISS_ACCESS_SIZE(HSR_ISS_SAS(hsr_iss)); + vmexit->u.inst_emul.vie.sign_extend = HSR_ISS_SSE(hsr_iss); + vmexit->u.inst_emul.vie.dir = HSR_ISS_WnR(hsr_iss); + vmexit->u.inst_emul.vie.reg = get_vm_reg_name(HSR_ISS_SRT(hsr_iss), + vmexit->u.hyp.mode); + printf("%s:%d gpa: %llx, as: %d, se: %d, dir: %d, reg: %d\n",__func__, __LINE__, + vmexit->u.inst_emul.gpa, vmexit->u.inst_emul.vie.access_size, vmexit->u.inst_emul.vie.sign_extend, + vmexit->u.inst_emul.vie.dir, vmexit->u.inst_emul.vie.reg); + + } else { + printf("%s:%d DABT from guest at address %x witho a stage-2 fault != translation\n", + __func__, __LINE__, vmexit->u.hyp.hdfar); + } + } else { + printf("%s:%d DABT from guest at address %x without a stage-2 fault translation\n", + __func__, __LINE__, vmexit->u.hyp.hdfar); + } + break; + case HSR_EC_DABT_HYP: + printf("%s:%d DABT taken from HYP mode at %x with HSR: %x\n", + __func__, __LINE__, vmexit->u.hyp.hdfar, vmexit->u.hyp.hsr); + break; + default: + printf("%s:%d Unknown HSR_EC code: %x\n",__func__, __LINE__, hsr_ec); + break; + } + return handled; +} + static int hyp_exit_process(struct hyp *hyp, int vcpu, struct vm_exit *vmexit) { @@ -237,8 +420,14 @@ case EXCEPTION_PABT: case EXCEPTION_DABT: case EXCEPTION_HVC: - printf("%s PABT/DABT/HYP unimplemented exception\n",__func__); + printf("%s PABT/DABT/HYP exception\n",__func__); + printf("%s HSR: %x, HIFAR: %x, HDFAR: %x, HPFAR: %x\n", __func__, + vmexit->u.hyp.hsr, vmexit->u.hyp.hifar, + vmexit->u.hyp.hdfar, vmexit->u.hyp.hpfar); + vmexit->exitcode = VM_EXITCODE_HYP; + handled = hyp_handle_exception(vmexit); + break; case EXCEPTION_FIQ: printf("%s FIQ unsupported exception\n",__func__); @@ -272,19 +461,26 @@ vm = hyp->vm; vmexit = vm_exitinfo(vm, vcpu); + hypctx->regs.r_pc = (uint32_t) pc; + do { handled = UNHANDLED; rc = vmm_call_hyp((void *)hyp_enter_guest, hypctx); - printf("%s rc: %d\n",__func__, rc); vmexit->pc = hypctx->regs.r_pc; - vmexit->inst_length = 4; /* TODO -> HSR[25] */ + vmexit->u.hyp.exception_nr = rc; vmexit->u.hyp.hsr = hypctx->exit_info.hsr; vmexit->u.hyp.hifar = hypctx->exit_info.hifar; vmexit->u.hyp.hdfar = hypctx->exit_info.hdfar; vmexit->u.hyp.hpfar = hypctx->exit_info.hpfar; + vmexit->u.hyp.mode = hypctx->regs.r_cpsr & PSR_MODE; + + if (HSR_IL(vmexit->u.hyp.hsr)) + vmexit->inst_length = 4; + else + vmexit->inst_length = 2; handled = hyp_exit_process(hyp, vcpu, vmexit); @@ -345,11 +541,42 @@ return (&hypctx->regs.r_pc); case VM_REG_GUEST_CPSR: return (&hypctx->regs.r_cpsr); + case VM_REG_GUEST_SP_SVC: + return (&hypctx->sp_svc); + case VM_REG_GUEST_LR_SVC: + return (&hypctx->lr_svc); + case VM_REG_GUEST_SP_ABT: + return (&hypctx->sp_abt); + case VM_REG_GUEST_LR_ABT: + return (&hypctx->lr_abt); + case VM_REG_GUEST_SP_UND: + return (&hypctx->sp_und); + case VM_REG_GUEST_LR_UND: + return (&hypctx->lr_und); + case VM_REG_GUEST_SP_IRQ: + return (&hypctx->sp_irq); + case VM_REG_GUEST_LR_IRQ: + return (&hypctx->lr_irq); + case VM_REG_GUEST_R8_FIQ: + return (&hypctx->r8_fiq); + case VM_REG_GUEST_R9_FIQ: + return (&hypctx->r9_fiq); + case VM_REG_GUEST_R10_FIQ: + return (&hypctx->r10_fiq); + case VM_REG_GUEST_R11_FIQ: + return (&hypctx->r11_fiq); + case VM_REG_GUEST_R12_FIQ: + return (&hypctx->r12_fiq); + case VM_REG_GUEST_SP_FIQ: + return (&hypctx->sp_fiq); + case VM_REG_GUEST_LR_FIQ: + return (&hypctx->lr_fiq); default: break; } return (NULL); } + static int arm_getreg(void *arg, int vcpu, int reg, uint64_t *retval) { Modified: soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/hyp.h ============================================================================== --- soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/hyp.h Thu Jul 23 15:50:39 2015 (r288694) +++ soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/hyp.h Thu Jul 23 17:52:55 2015 (r288695) @@ -11,8 +11,49 @@ #define EXCEPTION_FIQ 6 #define EXCEPTION_IRQ 7 + + #define HSR_EC_SHIFT 26 +#define HSR_IL_SHIFT 25 +#define HSR_IL_MASK (1 << HSR_IL_SHIFT) +#define HSR_ISS_MASK ((1 << 25) - 1) + +#define HSR_EC(x) (x >> HSR_EC_SHIFT) +#define HSR_IL(x) ((x & HSR_IL_MASK) >> HSR_IL_SHIFT) +#define HSR_ISS(x) (x & HSR_ISS_MASK) + +#define HSR_EC_UNKN 0x00 +#define HSR_EC_WFI_WFE 0x01 +#define HSR_EC_MCR_MRC_CP15 0x03 +#define HSR_EC_MCRR_MRRC_CP15 0x04 +#define HSR_EC_MCR_MRC_CP14 0x05 +#define HSR_EC_LDC_STC_CP14 0x06 +#define HSR_EC_HCPTR_CP0_CP13 0x07 +#define HSR_EC_MRC_VMRS_CP10 0x08 +#define HSR_EC_BXJ 0x0A +#define HSR_EC_MRRC_CP14 0x0C + +#define HSR_EC_SVC 0x11 #define HSR_EC_HVC 0x12 +#define HSR_EC_SMC 0x13 +#define HSR_EC_PABT 0x20 +#define HSR_EC_PABT_HYP 0x21 +#define HSR_EC_DABT 0x24 +#define HSR_EC_DABT_HYP 0x25 + +#define HSR_ISS_ISV(x) ((x >> 24) & 1) +#define HSR_ISS_SAS(x) ((x >> 22) & 3) +#define HSR_ISS_SSE(x) ((x >> 21) & 1) +#define HSR_ISS_SRT(x) ((x >> 16) & 0xf) +#define HSR_ISS_EA(x) ((x >> 9) & 1) +#define HSR_ISS_CM(x) ((x >> 8) & 1) +#define HSR_ISS_S1PTW(x) ((x >> 7) & 1) +#define HSR_ISS_WnR(x) ((x >> 6) & 1) +#define HSR_ISS_DFSC(x) ((x >> 0) & 0x3f) + +#define HSR_ISS_ACCESS_SIZE(x) ((x == 0) ? 1 : (x == 1) ? 2 : 4) + + #define VTTBR_VMID_SHIFT 16 #define VTTBR_VMID_MASK 0xff Modified: soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/mmu.h ============================================================================== --- soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/mmu.h Thu Jul 23 15:50:39 2015 (r288694) +++ soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/mmu.h Thu Jul 23 17:52:55 2015 (r288695) @@ -60,4 +60,9 @@ #define LPAE_AF (0x1 << 10) /* Access Flag */ +/* Table B3-24 Long-descriptor format FSR encodings */ +#define LPAE_TRANSLATION_FAULT(x) ((0b000111) & x) +#define LPAE_ACCESS_FLAG_FAULT(x) ((0b001011) & x) +#define LPAE_PERMISSION_FAULT(x) ((0b001111) & x) +#define LPAE_FAULT_LEVEL(x) (0x3 & x) #endif Modified: soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/vmm.c ============================================================================== --- soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/vmm.c Thu Jul 23 15:50:39 2015 (r288694) +++ soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/vmm.c Thu Jul 23 17:52:55 2015 (r288695) @@ -269,12 +269,15 @@ vm_run(struct vm *vm, struct vm_run *vmrun) { int error, vcpuid; + uint32_t pc; struct vcpu *vcpu; struct vm_exit *vme; bool retu; void *rptr = NULL, *sptr = NULL; vcpuid = vmrun->cpuid; + pc = vmrun->pc; + if (vcpuid < 0 || vcpuid >= VM_MAXCPU) return (EINVAL); @@ -284,12 +287,12 @@ vcpu = &vm->vcpu[vcpuid]; vme = &vcpu->exitinfo; - printf("%s vcpuid: %d, nextpc: %llx\n",__func__, vcpuid, vcpu->nextpc); + printf("%s vcpuid: %d, nextpc: %x\n",__func__, vcpuid, pc); restart: critical_enter(); - error = VMRUN(vm->cookie, vcpuid, vcpu->nextpc, NULL, rptr, sptr); + error = VMRUN(vm->cookie, vcpuid, pc, NULL, rptr, sptr); printf("%s VMRUN error: %d\n",__func__, error); @@ -297,6 +300,10 @@ if (error == 0) { switch (vme->exitcode) { + case VM_EXITCODE_INST_EMUL: + /* TODO there is no in-kernel emulation yet */ + retu = true; + break; default: retu = true; /* handled in userland */ break; @@ -305,10 +312,9 @@ if (error == 0 && retu == false) goto restart; - printf("%s before bhcopy\n",__func__); + /* copy the exit information */ bcopy(vme, &vmrun->vm_exit, sizeof(struct vm_exit)); - printf("%s after bhcopy\n",__func__); return (error); } From owner-svn-soc-all@freebsd.org Thu Jul 23 17:53:57 2015 Return-Path: Delivered-To: svn-soc-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 1E1479A9CFF for ; Thu, 23 Jul 2015 17:53:57 +0000 (UTC) (envelope-from mihai@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 01EF712ED for ; Thu, 23 Jul 2015 17:53:57 +0000 (UTC) (envelope-from mihai@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.15.2/8.15.2) with ESMTP id t6NHru92035448 for ; Thu, 23 Jul 2015 17:53:56 GMT (envelope-from mihai@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.15.2/8.15.2/Submit) id t6NHrube035443 for svn-soc-all@FreeBSD.org; Thu, 23 Jul 2015 17:53:56 GMT (envelope-from mihai@FreeBSD.org) Date: Thu, 23 Jul 2015 17:53:56 GMT Message-Id: <201507231753.t6NHrube035443@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to mihai@FreeBSD.org using -f From: mihai@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r288696 - in soc2015/mihai/bhyve-on-arm-head/sys/arm: include vmm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 23 Jul 2015 17:53:57 -0000 Author: mihai Date: Thu Jul 23 17:53:55 2015 New Revision: 288696 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=288696 Log: soc2015: mihai: bhyve: sys: arm: vmm: add vmm_instruction_emul Added: soc2015/mihai/bhyve-on-arm-head/sys/arm/include/vmm_instruction_emul.h soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/vmm_instruction_emul.c Added: soc2015/mihai/bhyve-on-arm-head/sys/arm/include/vmm_instruction_emul.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ soc2015/mihai/bhyve-on-arm-head/sys/arm/include/vmm_instruction_emul.h Thu Jul 23 17:53:55 2015 (r288696) @@ -0,0 +1,29 @@ +#ifndef _VMM_INSTRUCTION_EMUL_H_ +#define _VMM_INSTRUCTION_EMUL_H_ + +#include + +/* + * Callback functions to read and write memory regions. + */ +typedef int (*mem_region_read_t)(void *vm, int cpuid, uint64_t gpa, + uint64_t *rval, int rsize, void *arg); + +typedef int (*mem_region_write_t)(void *vm, int cpuid, uint64_t gpa, + uint64_t wval, int wsize, void *arg); + +/* + * Emulate the decoded 'vie' instruction. + * + * The callbacks 'mrr' and 'mrw' emulate reads and writes to the memory region + * containing 'gpa'. 'mrarg' is an opaque argument that is passed into the + * callback functions. + * + * 'void *vm' should be 'struct vm *' when called from kernel context and + * 'struct vmctx *' when called from user context. + * s + */ +int vmm_emulate_instruction(void *vm, int cpuid, uint64_t gpa, struct vie *vie, + mem_region_read_t mrr, mem_region_write_t mrw, void *mrarg); + +#endif /* _VMM_INSTRUCTION_EMUL_H_ */ Added: soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/vmm_instruction_emul.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/vmm_instruction_emul.c Thu Jul 23 17:53:55 2015 (r288696) @@ -0,0 +1,50 @@ +#ifdef _KERNEL +#include +#include +#include +#include + +#include + +#include + +#else +#include +#include +#include +#include +#include + +#include + +#include +#include +#endif + +#include + +int +vmm_emulate_instruction(void *vm, int vcpuid, uint64_t gpa, struct vie *vie, + mem_region_read_t memread, mem_region_write_t memwrite, void *memarg) +{ + int error; + uint64_t val; + + if(vie->dir) { + printf("%s write\n",__func__); + error = vm_get_register(vm, vcpuid, vie->reg, &val); + if (error) + goto out; + + error = memwrite(vm, vcpuid, gpa, val, vie->access_size, memarg); + } else { + printf("%s read\n",__func__); + + error = memread(vm, vcpuid, gpa, &val, vie->access_size, memarg); + if (error) + goto out; + error = vm_set_register(vm, vcpuid, vie->reg, val); + } +out: + return (error); +} From owner-svn-soc-all@freebsd.org Thu Jul 23 17:54:43 2015 Return-Path: Delivered-To: svn-soc-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 1DF8F9A9D31 for ; Thu, 23 Jul 2015 17:54:43 +0000 (UTC) (envelope-from mihai@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 0E9FF142B for ; Thu, 23 Jul 2015 17:54:43 +0000 (UTC) (envelope-from mihai@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.15.2/8.15.2) with ESMTP id t6NHsgQv035782 for ; Thu, 23 Jul 2015 17:54:42 GMT (envelope-from mihai@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.15.2/8.15.2/Submit) id t6NHsgxx035750 for svn-soc-all@FreeBSD.org; Thu, 23 Jul 2015 17:54:42 GMT (envelope-from mihai@FreeBSD.org) Date: Thu, 23 Jul 2015 17:54:42 GMT Message-Id: <201507231754.t6NHsgxx035750@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to mihai@FreeBSD.org using -f From: mihai@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r288697 - soc2015/mihai/bhyve-on-arm-head/usr.sbin/bhyvearm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 23 Jul 2015 17:54:43 -0000 Author: mihai Date: Thu Jul 23 17:54:41 2015 New Revision: 288697 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=288697 Log: soc2015: mihai: bhyve: sys: arm: vmm: mem.c: call vmm_instruction_emul when emulate a memory access Modified: soc2015/mihai/bhyve-on-arm-head/usr.sbin/bhyvearm/mem.c soc2015/mihai/bhyve-on-arm-head/usr.sbin/bhyvearm/mem.h Modified: soc2015/mihai/bhyve-on-arm-head/usr.sbin/bhyvearm/mem.c ============================================================================== --- soc2015/mihai/bhyve-on-arm-head/usr.sbin/bhyvearm/mem.c Thu Jul 23 17:53:55 2015 (r288696) +++ soc2015/mihai/bhyve-on-arm-head/usr.sbin/bhyvearm/mem.c Thu Jul 23 17:54:41 2015 (r288697) @@ -39,6 +39,7 @@ #include #include #include +#include #include #include @@ -184,10 +185,11 @@ assert(entry != NULL); assert(NULL == NULL); -// err = vmm_emulate_instruction(ctx, vcpu, paddr, vie, -// mem_read, mem_write, &entry->mr_param); + err = vmm_emulate_instruction(ctx, vcpu, paddr, vie, + mem_read, mem_write, &entry->mr_param); + pthread_rwlock_unlock(&mmio_rwlock); - + return (err); } Modified: soc2015/mihai/bhyve-on-arm-head/usr.sbin/bhyvearm/mem.h ============================================================================== --- soc2015/mihai/bhyve-on-arm-head/usr.sbin/bhyvearm/mem.h Thu Jul 23 17:53:55 2015 (r288696) +++ soc2015/mihai/bhyve-on-arm-head/usr.sbin/bhyvearm/mem.h Thu Jul 23 17:54:41 2015 (r288697) @@ -56,4 +56,5 @@ int register_mem_fallback(struct mem_range *memp); int unregister_mem(struct mem_range *memp); +void init_bvmcons(void); #endif /* _MEM_H_ */ From owner-svn-soc-all@freebsd.org Thu Jul 23 17:55:45 2015 Return-Path: Delivered-To: svn-soc-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 675C99A9D61 for ; Thu, 23 Jul 2015 17:55:45 +0000 (UTC) (envelope-from mihai@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 3F03D14E5 for ; Thu, 23 Jul 2015 17:55:45 +0000 (UTC) (envelope-from mihai@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.15.2/8.15.2) with ESMTP id t6NHtjIj036258 for ; Thu, 23 Jul 2015 17:55:45 GMT (envelope-from mihai@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.15.2/8.15.2/Submit) id t6NHtiGU036242 for svn-soc-all@FreeBSD.org; Thu, 23 Jul 2015 17:55:44 GMT (envelope-from mihai@FreeBSD.org) Date: Thu, 23 Jul 2015 17:55:44 GMT Message-Id: <201507231755.t6NHtiGU036242@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to mihai@FreeBSD.org using -f From: mihai@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r288698 - in soc2015/mihai/bhyve-on-arm-head/sys: conf dev/bvm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 23 Jul 2015 17:55:45 -0000 Author: mihai Date: Thu Jul 23 17:55:43 2015 New Revision: 288698 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=288698 Log: soc2015: mihai: bhyve: sys: dev: bvm: bvm_console.c: modify paravit console to use MMIO for ARM instead of port Modified: soc2015/mihai/bhyve-on-arm-head/sys/conf/files.arm soc2015/mihai/bhyve-on-arm-head/sys/dev/bvm/bvm_console.c Modified: soc2015/mihai/bhyve-on-arm-head/sys/conf/files.arm ============================================================================== --- soc2015/mihai/bhyve-on-arm-head/sys/conf/files.arm Thu Jul 23 17:54:41 2015 (r288697) +++ soc2015/mihai/bhyve-on-arm-head/sys/conf/files.arm Thu Jul 23 17:55:43 2015 (r288698) @@ -122,3 +122,7 @@ libkern/ucmpdi2.c standard libkern/udivdi3.c standard libkern/umoddi3.c standard +# +# bvm console +# +dev/bvm/bvm_console.c optional bvmconsole Modified: soc2015/mihai/bhyve-on-arm-head/sys/dev/bvm/bvm_console.c ============================================================================== --- soc2015/mihai/bhyve-on-arm-head/sys/dev/bvm/bvm_console.c Thu Jul 23 17:54:41 2015 (r288697) +++ soc2015/mihai/bhyve-on-arm-head/sys/dev/bvm/bvm_console.c Thu Jul 23 17:55:43 2015 (r288698) @@ -64,9 +64,13 @@ static int alt_break_state; #endif +#if defined(__i386__) || defined(__amd64__) #define BVM_CONS_PORT 0x220 -static int bvm_cons_port = BVM_CONS_PORT; +#elif defined(__arm__) +#define BVM_CONS_PORT 0x220 +#endif +static int bvm_cons_port = BVM_CONS_PORT; #define BVM_CONS_SIG ('b' << 8 | 'v') static void bvm_timeout(void *); @@ -85,8 +89,11 @@ bvm_rcons(u_char *ch) { int c; - +#if defined(__i386__) || defined(__amd64__) c = inl(bvm_cons_port); +#elif defined(__arm__) + c = (*(int *)bvm_cons_port); +#endif if (c != -1) { *ch = (u_char)c; return (0); @@ -97,10 +104,19 @@ static void bvm_wcons(u_char ch) { - +#if defined(__i386__) || defined(__amd64__) outl(bvm_cons_port, ch); +#elif defined(__arm__) + (*(int *)bvm_cons_port) = ch; +#endif } +#if defined(__arm__) +#ifdef EARLY_PRINTF +early_putc_t * early_putc = (early_putc_t *) bvm_wcons; +#endif +#endif + static void cn_drvinit(void *unused) { @@ -178,8 +194,11 @@ if (!disabled) { if (resource_int_value("bvmconsole", 0, "port", &port) == 0) bvm_cons_port = port; - +#if defined(__i386__) || defined(__amd64__) if (inw(bvm_cons_port) == BVM_CONS_SIG) +#elif defined(__arm__) + if ((*(short *)bvm_cons_port) == BVM_CONS_SIG) +#endif cp->cn_pri = CN_REMOTE; } } From owner-svn-soc-all@freebsd.org Thu Jul 23 17:56:53 2015 Return-Path: Delivered-To: svn-soc-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 8E2ED9A9E16 for ; Thu, 23 Jul 2015 17:56:53 +0000 (UTC) (envelope-from mihai@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 64CA318FE for ; Thu, 23 Jul 2015 17:56:53 +0000 (UTC) (envelope-from mihai@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.15.2/8.15.2) with ESMTP id t6NHur5v036665 for ; Thu, 23 Jul 2015 17:56:53 GMT (envelope-from mihai@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.15.2/8.15.2/Submit) id t6NHuqKj036663 for svn-soc-all@FreeBSD.org; Thu, 23 Jul 2015 17:56:52 GMT (envelope-from mihai@FreeBSD.org) Date: Thu, 23 Jul 2015 17:56:52 GMT Message-Id: <201507231756.t6NHuqKj036663@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to mihai@FreeBSD.org using -f From: mihai@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r288699 - soc2015/mihai/bhyve-on-arm-head/usr.sbin/bhyvearm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 23 Jul 2015 17:56:53 -0000 Author: mihai Date: Thu Jul 23 17:56:52 2015 New Revision: 288699 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=288699 Log: soc2015: mihai: bhyve: usr.sbin: bhyvearm: consport.c: added emulation for console port [bvm] using memory Added: soc2015/mihai/bhyve-on-arm-head/usr.sbin/bhyvearm/consport.c Added: soc2015/mihai/bhyve-on-arm-head/usr.sbin/bhyvearm/consport.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ soc2015/mihai/bhyve-on-arm-head/usr.sbin/bhyvearm/consport.c Thu Jul 23 17:56:52 2015 (r288699) @@ -0,0 +1,118 @@ +#include +#include + +#include +#include +#include +#include +#include + +#include "mem.h" + +#define BVM_CONSOLE_PORT 0x220 +#define BVM_CONS_SIG ('b' << 8 | 'v') + +static struct termios tio_orig, tio_new; + +static void +ttyclose(void) +{ + tcsetattr(STDIN_FILENO, TCSANOW, &tio_orig); +} + +static void +ttyopen(void) +{ + tcgetattr(STDIN_FILENO, &tio_orig); + + cfmakeraw(&tio_new); + tcsetattr(STDIN_FILENO, TCSANOW, &tio_new); + + atexit(ttyclose); +} + +static bool +tty_char_available(void) +{ + fd_set rfds; + struct timeval tv; + + FD_ZERO(&rfds); + FD_SET(STDIN_FILENO, &rfds); + tv.tv_sec = 0; + tv.tv_usec = 0; + if (select(STDIN_FILENO + 1, &rfds, NULL, NULL, &tv) > 0) { + return (true); + } else { + return (false); + } +} + +static int +ttyread(void) +{ + char rb; + + if (tty_char_available()) { + read(STDIN_FILENO, &rb, 1); + return (rb & 0xff); + } else { + return (-1); + } +} + +static void +ttywrite(unsigned char wb) +{ + (void) write(STDOUT_FILENO, &wb, 1); +} + +static int +console_handler(struct vmctx *ctx, int vcpu, int dir, uint64_t addr, int size, uint64_t *val, void *arg1, long arg2) +{ + static int opened; + + if (size == 2 && dir == MEM_F_READ) { + *val = BVM_CONS_SIG; + return (0); + } + + /* + * Guests might probe this port to look for old ISA devices + * using single-byte reads. Return 0xff for those. + */ + if (size == 1 && dir == MEM_F_READ) { + *val = 0xff; + return (0); + } + + if (size != 4) + return (-1); + + if (!opened) { + ttyopen(); + opened = 1; + } + + if (dir == MEM_F_READ) + *val = ttyread(); + else + ttywrite(*val); + return (0); +} + +struct mem_range consport ={ + "bvmcons", + MEM_F_RW, + console_handler, + NULL, + 0, + BVM_CONSOLE_PORT, + sizeof(int) +}; + +void +init_bvmcons(void) +{ + register_mem(&consport); +} From owner-svn-soc-all@freebsd.org Thu Jul 23 17:57:54 2015 Return-Path: Delivered-To: svn-soc-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id CFD959A9E39 for ; Thu, 23 Jul 2015 17:57:54 +0000 (UTC) (envelope-from mihai@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id B24CB1924 for ; Thu, 23 Jul 2015 17:57:54 +0000 (UTC) (envelope-from mihai@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.15.2/8.15.2) with ESMTP id t6NHvsfG037056 for ; Thu, 23 Jul 2015 17:57:54 GMT (envelope-from mihai@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.15.2/8.15.2/Submit) id t6NHvrZc037041 for svn-soc-all@FreeBSD.org; Thu, 23 Jul 2015 17:57:53 GMT (envelope-from mihai@FreeBSD.org) Date: Thu, 23 Jul 2015 17:57:53 GMT Message-Id: <201507231757.t6NHvrZc037041@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to mihai@FreeBSD.org using -f From: mihai@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r288700 - soc2015/mihai/bhyve-on-arm-head/usr.sbin/bhyvearm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 23 Jul 2015 17:57:55 -0000 Author: mihai Date: Thu Jul 23 17:57:53 2015 New Revision: 288700 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=288700 Log: soc2015: mihai: bhyve: usr.sbin: bhyvearm: bhyverun.c : added support for instruction emulation Modified: soc2015/mihai/bhyve-on-arm-head/usr.sbin/bhyvearm/Makefile soc2015/mihai/bhyve-on-arm-head/usr.sbin/bhyvearm/bhyverun.c Modified: soc2015/mihai/bhyve-on-arm-head/usr.sbin/bhyvearm/Makefile ============================================================================== --- soc2015/mihai/bhyve-on-arm-head/usr.sbin/bhyvearm/Makefile Thu Jul 23 17:56:52 2015 (r288699) +++ soc2015/mihai/bhyve-on-arm-head/usr.sbin/bhyvearm/Makefile Thu Jul 23 17:57:53 2015 (r288700) @@ -6,12 +6,15 @@ DEBUG_FLAGS= -g -O0 -SRCS= bhyverun.c block_if.c mem.c mevent.c +SRCS= bhyverun.c block_if.c mem.c mevent.c consport.c .PATH: ${.CURDIR}/../../sys/arm/vmm NO_MAN= +.PATH: ${.CURDIR}/../../sys/arm/vmm +SRCS+= vmm_instruction_emul.c + DPADD= ${LIBVMMAPIARM} ${LIBMD} ${LIBPTHREAD} LDADD= -lvmmapiarm -lmd -lpthread Modified: soc2015/mihai/bhyve-on-arm-head/usr.sbin/bhyvearm/bhyverun.c ============================================================================== --- soc2015/mihai/bhyve-on-arm-head/usr.sbin/bhyvearm/bhyverun.c Thu Jul 23 17:56:52 2015 (r288699) +++ soc2015/mihai/bhyve-on-arm-head/usr.sbin/bhyvearm/bhyverun.c Thu Jul 23 17:57:53 2015 (r288700) @@ -82,14 +82,7 @@ struct bhyvestats { uint64_t vmexit_bogus; - uint64_t vmexit_bogus_switch; - uint64_t vmexit_hlt; - uint64_t vmexit_pause; - uint64_t vmexit_mtrap; - uint64_t vmexit_paging; - uint64_t cpu_switch_rotate; - uint64_t cpu_switch_direct; - int io_reset; + uint64_t vmexit_inst_emul; } stats; struct mt_vmm_info { @@ -103,13 +96,11 @@ { fprintf(stderr, - "Usage: %s [-aehAHIP][-g ][-s ][-S ]" - "[-c vcpus][-p pincpu]" + "Usage: %s [-b] [-c vcpus][-p pincpu]" " \n" + " -b: use bvmconsole" " -c: # cpus (default 1)\n" " -p: pin vcpu 'n' to host cpu 'pincpu + n'\n" - " -H: vmexit from the guest on hlt\n" - " -P: vmexit from the guest on pause\n" " -h: help\n", progname); @@ -203,25 +194,6 @@ } static int -vmexit_catch_reset(void) -{ - stats.io_reset++; - return (VMEXIT_RESET); -} - -static int -vmexit_handle_notify(struct vmctx *ctx, struct vm_exit *vme, int *pvcpu, - uint32_t eax) -{ -#if BHYVE_DEBUG - /* - * put guest-driven debug here - */ -#endif - return (VMEXIT_CONTINUE); -} - -static int vmexit_hyp(struct vmctx *ctx, struct vm_exit *vmexit, int *pvcpu) { @@ -243,67 +215,33 @@ } static int -vmexit_hlt(struct vmctx *ctx, struct vm_exit *vmexit, int *pvcpu) -{ - - stats.vmexit_hlt++; - - /* - * Just continue execution with the next instruction. We use - * the HLT VM exit as a way to be friendly with the host - * scheduler. - */ - return (VMEXIT_CONTINUE); -} - -static int -vmexit_pause(struct vmctx *ctx, struct vm_exit *vmexit, int *pvcpu) -{ - - stats.vmexit_pause++; - - return (VMEXIT_CONTINUE); -} - -static int -vmexit_mtrap(struct vmctx *ctx, struct vm_exit *vmexit, int *pvcpu) -{ - - stats.vmexit_mtrap++; - - return (VMEXIT_RESTART); -} - -static int -vmexit_paging(struct vmctx *ctx, struct vm_exit *vmexit, int *pvcpu) +vmexit_inst_emul(struct vmctx *ctx, struct vm_exit *vmexit, int *pvcpu) { int err; - stats.vmexit_paging++; + struct vie *vie; + + stats.vmexit_inst_emul++; - err = emulate_mem(ctx, *pvcpu, vmexit->u.paging.gpa, NULL); -// &vmexit->u.paging.vie); + vie = &vmexit->u.inst_emul.vie; + err = emulate_mem(ctx, *pvcpu, vmexit->u.inst_emul.gpa, vie); if (err) { - if (err == EINVAL) { - fprintf(stderr, - "Failed to emulate instruction at 0x%llx\n", - vmexit->pc); - } else if (err == ESRCH) { + if (err == ESRCH) { fprintf(stderr, "Unhandled memory access to 0x%llx\n", - vmexit->u.paging.gpa); + vmexit->u.inst_emul.gpa); } + fprintf(stderr, "Failed to emulate instruction at 0x%llx\n", vmexit->pc); return (VMEXIT_ABORT); } - return (VMEXIT_CONTINUE); } + static vmexit_handler_t handler[VM_EXITCODE_MAX] = { [VM_EXITCODE_HYP] = vmexit_hyp, [VM_EXITCODE_BOGUS] = vmexit_bogus, - [VM_EXITCODE_MTRAP] = vmexit_mtrap, - [VM_EXITCODE_PAGING] = vmexit_paging, + [VM_EXITCODE_INST_EMUL] = vmexit_inst_emul, }; static void @@ -378,18 +316,22 @@ int main(int argc, char *argv[]) { - int c, error, tmp, err; + int c, error, bvmcons; int max_vcpus; struct vmctx *ctx; uint64_t pc; size_t memsize; + bvmcons = 0; progname = basename(argv[0]); guest_ncpus = 1; memsize = 256 * MB; while ((c = getopt(argc, argv, "abehAHIPp:g:c:s:S:m:")) != -1) { switch (c) { + case 'b': + bvmcons = 1; + break; case 'p': pincpu = atoi(optarg); break; @@ -429,33 +371,11 @@ exit(1); } - if (fbsdrun_vmexit_on_hlt()) { - err = vm_get_capability(ctx, BSP, VM_CAP_HALT_EXIT, &tmp); - if (err < 0) { - fprintf(stderr, "VM exit on HLT not supported\n"); - exit(1); - } - vm_set_capability(ctx, BSP, VM_CAP_HALT_EXIT, 1); - handler[VM_EXITCODE_HLT] = vmexit_hlt; - } - - if (fbsdrun_vmexit_on_pause()) { - /* - * pause exit support required for this mode - */ - err = vm_get_capability(ctx, BSP, VM_CAP_PAUSE_EXIT, &tmp); - if (err < 0) { - fprintf(stderr, - "SMP mux requested, no pause support\n"); - exit(1); - } - vm_set_capability(ctx, BSP, VM_CAP_PAUSE_EXIT, 1); - handler[VM_EXITCODE_PAUSE] = vmexit_pause; - } - - init_mem(); + if (bvmcons) + init_bvmcons(); + error = vm_get_register(ctx, BSP, VM_REG_GUEST_PC, &pc); assert(error == 0); printf("%s pc: %llx\n",__func__, pc); From owner-svn-soc-all@freebsd.org Thu Jul 23 17:59:01 2015 Return-Path: Delivered-To: svn-soc-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id E38C89A9E4E for ; Thu, 23 Jul 2015 17:59:01 +0000 (UTC) (envelope-from mihai@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id D465D1943 for ; Thu, 23 Jul 2015 17:59:01 +0000 (UTC) (envelope-from mihai@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.15.2/8.15.2) with ESMTP id t6NHx1kr037496 for ; Thu, 23 Jul 2015 17:59:01 GMT (envelope-from mihai@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.15.2/8.15.2/Submit) id t6NHx1BP037493 for svn-soc-all@FreeBSD.org; Thu, 23 Jul 2015 17:59:01 GMT (envelope-from mihai@FreeBSD.org) Date: Thu, 23 Jul 2015 17:59:01 GMT Message-Id: <201507231759.t6NHx1BP037493@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to mihai@FreeBSD.org using -f From: mihai@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r288701 - soc2015/mihai/bhyve-on-arm-head/sys/modules/vmm-arm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 23 Jul 2015 17:59:02 -0000 Author: mihai Date: Thu Jul 23 17:59:00 2015 New Revision: 288701 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=288701 Log: soc2015: mihai: bhyve: sys: modules: vmm-arm: Makefile: add vmm_instruction_emul to the module Modified: soc2015/mihai/bhyve-on-arm-head/sys/modules/vmm-arm/Makefile Modified: soc2015/mihai/bhyve-on-arm-head/sys/modules/vmm-arm/Makefile ============================================================================== --- soc2015/mihai/bhyve-on-arm-head/sys/modules/vmm-arm/Makefile Thu Jul 23 17:57:53 2015 (r288700) +++ soc2015/mihai/bhyve-on-arm-head/sys/modules/vmm-arm/Makefile Thu Jul 23 17:59:00 2015 (r288701) @@ -11,6 +11,7 @@ .PATH: ${.CURDIR}/../../arm/vmm SRCS+= vmm.c \ vmm_dev.c \ + vmm_instruction_emul.c \ vmm_mem.c \ mmu.c \ vmm_stat.c \ From owner-svn-soc-all@freebsd.org Thu Jul 23 18:08:11 2015 Return-Path: Delivered-To: svn-soc-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 9AC069A9FC9 for ; Thu, 23 Jul 2015 18:08:11 +0000 (UTC) (envelope-from mihai@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 7EABF1CFC for ; Thu, 23 Jul 2015 18:08:11 +0000 (UTC) (envelope-from mihai@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.15.2/8.15.2) with ESMTP id t6NI8Bt1071607 for ; Thu, 23 Jul 2015 18:08:11 GMT (envelope-from mihai@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.15.2/8.15.2/Submit) id t6NI8Awr070389 for svn-soc-all@FreeBSD.org; Thu, 23 Jul 2015 18:08:10 GMT (envelope-from mihai@FreeBSD.org) Date: Thu, 23 Jul 2015 18:08:10 GMT Message-Id: <201507231808.t6NI8Awr070389@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to mihai@FreeBSD.org using -f From: mihai@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r288703 - in soc2015/mihai/bhyve-on-arm-head/sys/arm: conf fvp_ve-cortex_a15x1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 23 Jul 2015 18:08:11 -0000 Author: mihai Date: Thu Jul 23 18:08:09 2015 New Revision: 288703 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=288703 Log: soc2015: mihai: bhyve: sys: arm: conf: created special config for a GUEST which is using the bvmconsole Added: soc2015/mihai/bhyve-on-arm-head/sys/arm/conf/FVP_VE_CORTEX_A15x1_GUEST soc2015/mihai/bhyve-on-arm-head/sys/arm/fvp_ve-cortex_a15x1/files.fvp_ve-cortex_a15x1_guest soc2015/mihai/bhyve-on-arm-head/sys/arm/fvp_ve-cortex_a15x1/fvp_ve-cortex_a15x1_machdep_guest.c Added: soc2015/mihai/bhyve-on-arm-head/sys/arm/conf/FVP_VE_CORTEX_A15x1_GUEST ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ soc2015/mihai/bhyve-on-arm-head/sys/arm/conf/FVP_VE_CORTEX_A15x1_GUEST Thu Jul 23 18:08:09 2015 (r288703) @@ -0,0 +1,76 @@ +# +# FVP_VE_CORTEX_A15x1 - custom configuration +# + +ident FVP_VE_CORTEX_A15x1 + +makeoption ARM_LITTLE_ENDIAN + +cpu CPU_CORTEXA +machine arm armv6 +makeoptions CONF_CFLAGS="-mcpu=cortex-a15" + +include "std.armv6" + +files "../fvp_ve-cortex_a15x1/files.fvp_ve-cortex_a15x1_guest" + +options KERNVIRTADDR=0xc0200000 +makeoptions KERNVIRTADDR=0xc0200000 +options KERNPHYSADDR=0xc0200000 +makeoptions KERNPHYSADDR=0xc0200000 +options PHYSADDR=0xc0000000 + +options HZ=100 +options SCHED_ULE # ULE scheduler +#options PLATFORM +#options SMP # Enable multiple cores + +nooptions FREEBSD_BOOT_LOADER + +# Debugging for use in -current +makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols +options BREAK_TO_DEBUGGER +options DEBUG +options EARLY_PRINTF +#options VERBOSE_SYSINIT # Enable verbose sysinit messages +options KDB # Enable kernel debugger support +# For minimum debugger support (stable branch) use: +options KDB_TRACE # Print a stack trace for a panic +# For full debugger support use this instead: +options DDB # Enable the kernel debugger +options INVARIANTS # Enable calls of extra sanity checking +options INVARIANT_SUPPORT # Extra sanity checks of internal structures, required by INVARIANTS +#options WITNESS # Enable checks to detect deadlocks and cycles +#options WITNESS_SKIPSPIN # Don't run witness on spinlocks for speed +#options DIAGNOSTIC + +#options ROOTDEVNAME=\"ufs:/dev/da0\" +options MD_ROOT +options MD_ROOT_SIZE=12288 +makeoptions MFS_IMAGE=/root/soc2015/mihai/ramdisk/ramdisk.img +options ROOTDEVNAME=\"ffs:/dev/md0\" + +# Pseudo devices + +device loop +device ether +device random +device pty +device md +device bpf + +# Serial ports +device bvmconsole + +# GIC +device gic + + +# GPIO +device gpio + + +# Flattened Device Tree +options FDT # Configure using FDT/DTB data +options FDT_DTB_STATIC +makeoptions FDT_DTS_FILE=fvp_ve-cortex_a15x1.dts Added: soc2015/mihai/bhyve-on-arm-head/sys/arm/fvp_ve-cortex_a15x1/files.fvp_ve-cortex_a15x1_guest ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ soc2015/mihai/bhyve-on-arm-head/sys/arm/fvp_ve-cortex_a15x1/files.fvp_ve-cortex_a15x1_guest Thu Jul 23 18:08:09 2015 (r288703) @@ -0,0 +1,9 @@ +kern/kern_clocksource.c standard + +arm/arm/bus_space_base.c standard +arm/arm/bus_space_generic.c standard +arm/arm/bus_space_asm_generic.S standard + +arm/arm/generic_timer.c standard +arm/fvp_ve-cortex_a15x1/fvp_ve-cortex_a15x1_common.c standard +arm/fvp_ve-cortex_a15x1/fvp_ve-cortex_a15x1_machdep_guest.c standard Added: soc2015/mihai/bhyve-on-arm-head/sys/arm/fvp_ve-cortex_a15x1/fvp_ve-cortex_a15x1_machdep_guest.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ soc2015/mihai/bhyve-on-arm-head/sys/arm/fvp_ve-cortex_a15x1/fvp_ve-cortex_a15x1_machdep_guest.c Thu Jul 23 18:08:09 2015 (r288703) @@ -0,0 +1,73 @@ +#include "opt_ddb.h" +#include "opt_platform.h" + +#include + +#define _ARM32_BUS_DMA_PRIVATE +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + +#include + +vm_offset_t +platform_lastaddr(void) +{ + + return (arm_devmap_lastaddr()); +} + +void +platform_probe_and_attach(void) +{ + +} + +void +platform_gpio_init(void) +{ + +} + +void +platform_late_init(void) +{ + +} + +int +platform_devmap_init(void) +{ + return (0); +} + + + +struct arm32_dma_range * +bus_dma_get_range(void) +{ + return (NULL); +} + +int +bus_dma_get_range_nb(void) +{ + + return (0); +} + +void +cpu_reset() +{ + printf("cpu_reset\n"); + while (1); +} + From owner-svn-soc-all@freebsd.org Thu Jul 23 18:22:30 2015 Return-Path: Delivered-To: svn-soc-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id B15429A9292 for ; Thu, 23 Jul 2015 18:22:30 +0000 (UTC) (envelope-from mihai@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 8C51816E2 for ; Thu, 23 Jul 2015 18:22:30 +0000 (UTC) (envelope-from mihai@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.15.2/8.15.2) with ESMTP id t6NIMUGT059846 for ; Thu, 23 Jul 2015 18:22:30 GMT (envelope-from mihai@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.15.2/8.15.2/Submit) id t6NIMSLe059823 for svn-soc-all@FreeBSD.org; Thu, 23 Jul 2015 18:22:28 GMT (envelope-from mihai@FreeBSD.org) Date: Thu, 23 Jul 2015 18:22:28 GMT Message-Id: <201507231822.t6NIMSLe059823@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to mihai@FreeBSD.org using -f From: mihai@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r288704 - in soc2015/mihai/bhyve-on-arm-head: sys/arm/vmm usr.sbin/bhyvearm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 23 Jul 2015 18:22:30 -0000 Author: mihai Date: Thu Jul 23 18:22:28 2015 New Revision: 288704 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=288704 Log: soc2015: mihai: bhyve: remove some debug printfs Modified: soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/arm.c soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/vmm.c soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/vmm_instruction_emul.c soc2015/mihai/bhyve-on-arm-head/usr.sbin/bhyvearm/bhyverun.c Modified: soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/arm.c ============================================================================== --- soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/arm.c Thu Jul 23 18:08:09 2015 (r288703) +++ soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/arm.c Thu Jul 23 18:22:28 2015 (r288704) @@ -373,9 +373,9 @@ vmexit->u.inst_emul.vie.dir = HSR_ISS_WnR(hsr_iss); vmexit->u.inst_emul.vie.reg = get_vm_reg_name(HSR_ISS_SRT(hsr_iss), vmexit->u.hyp.mode); - printf("%s:%d gpa: %llx, as: %d, se: %d, dir: %d, reg: %d\n",__func__, __LINE__, - vmexit->u.inst_emul.gpa, vmexit->u.inst_emul.vie.access_size, vmexit->u.inst_emul.vie.sign_extend, - vmexit->u.inst_emul.vie.dir, vmexit->u.inst_emul.vie.reg); +// printf("%s:%d gpa: %llx, as: %d, se: %d, dir: %d, reg: %d\n",__func__, __LINE__, +// vmexit->u.inst_emul.gpa, vmexit->u.inst_emul.vie.access_size, vmexit->u.inst_emul.vie.sign_extend, +// vmexit->u.inst_emul.vie.dir, vmexit->u.inst_emul.vie.reg); } else { printf("%s:%d DABT from guest at address %x witho a stage-2 fault != translation\n", @@ -420,10 +420,10 @@ case EXCEPTION_PABT: case EXCEPTION_DABT: case EXCEPTION_HVC: - printf("%s PABT/DABT/HYP exception\n",__func__); - printf("%s HSR: %x, HIFAR: %x, HDFAR: %x, HPFAR: %x\n", __func__, - vmexit->u.hyp.hsr, vmexit->u.hyp.hifar, - vmexit->u.hyp.hdfar, vmexit->u.hyp.hpfar); +// printf("%s PABT/DABT/HYP exception\n",__func__); +// printf("%s HSR: %x, HIFAR: %x, HDFAR: %x, HPFAR: %x\n", __func__, +// vmexit->u.hyp.hsr, vmexit->u.hyp.hifar, +// vmexit->u.hyp.hdfar, vmexit->u.hyp.hpfar); vmexit->exitcode = VM_EXITCODE_HYP; handled = hyp_handle_exception(vmexit); @@ -471,17 +471,14 @@ vmexit->pc = hypctx->regs.r_pc; vmexit->u.hyp.exception_nr = rc; + vmexit->inst_length = HSR_IL(hypctx->exit_info.hsr) ? 4 : 2; + vmexit->u.hyp.hsr = hypctx->exit_info.hsr; vmexit->u.hyp.hifar = hypctx->exit_info.hifar; vmexit->u.hyp.hdfar = hypctx->exit_info.hdfar; vmexit->u.hyp.hpfar = hypctx->exit_info.hpfar; vmexit->u.hyp.mode = hypctx->regs.r_cpsr & PSR_MODE; - if (HSR_IL(vmexit->u.hyp.hsr)) - vmexit->inst_length = 4; - else - vmexit->inst_length = 2; - handled = hyp_exit_process(hyp, vcpu, vmexit); } while(handled); Modified: soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/vmm.c ============================================================================== --- soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/vmm.c Thu Jul 23 18:08:09 2015 (r288703) +++ soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/vmm.c Thu Jul 23 18:22:28 2015 (r288704) @@ -287,14 +287,14 @@ vcpu = &vm->vcpu[vcpuid]; vme = &vcpu->exitinfo; - printf("%s vcpuid: %d, nextpc: %x\n",__func__, vcpuid, pc); +// printf("%s vcpuid: %d, nextpc: %x\n",__func__, vcpuid, pc); restart: critical_enter(); error = VMRUN(vm->cookie, vcpuid, pc, NULL, rptr, sptr); - printf("%s VMRUN error: %d\n",__func__, error); +// printf("%s VMRUN error: %d\n",__func__, error); critical_exit(); Modified: soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/vmm_instruction_emul.c ============================================================================== --- soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/vmm_instruction_emul.c Thu Jul 23 18:08:09 2015 (r288703) +++ soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/vmm_instruction_emul.c Thu Jul 23 18:22:28 2015 (r288704) @@ -31,15 +31,12 @@ uint64_t val; if(vie->dir) { - printf("%s write\n",__func__); error = vm_get_register(vm, vcpuid, vie->reg, &val); if (error) goto out; error = memwrite(vm, vcpuid, gpa, val, vie->access_size, memarg); } else { - printf("%s read\n",__func__); - error = memread(vm, vcpuid, gpa, &val, vie->access_size, memarg); if (error) goto out; Modified: soc2015/mihai/bhyve-on-arm-head/usr.sbin/bhyvearm/bhyverun.c ============================================================================== --- soc2015/mihai/bhyve-on-arm-head/usr.sbin/bhyvearm/bhyverun.c Thu Jul 23 18:08:09 2015 (r288703) +++ soc2015/mihai/bhyve-on-arm-head/usr.sbin/bhyvearm/bhyverun.c Thu Jul 23 18:22:28 2015 (r288704) @@ -67,7 +67,6 @@ int guest_ncpus; static int pincpu = -1; -static int guest_vmexit_on_hlt, guest_vmexit_on_pause; static int foundcpus; @@ -114,20 +113,6 @@ return (vm_map_gpa(ctx, gaddr, len)); } -int -fbsdrun_vmexit_on_pause(void) -{ - - return (guest_vmexit_on_pause); -} - -int -fbsdrun_vmexit_on_hlt(void) -{ - - return (guest_vmexit_on_hlt); -} - static void * fbsdrun_start_thread(void *param) { @@ -141,10 +126,7 @@ snprintf(tname, sizeof(tname), "%s vcpu %d", vmname, vcpu); pthread_set_name_np(mtp->mt_thr, tname); - printf("%s %s\n",__func__, tname); - vm_loop(mtp->mt_ctx, vcpu, vmexit[vcpu].pc); - printf("%s %s aftervm_loop\n",__func__, tname); /* not reached */ exit(1); @@ -258,12 +240,9 @@ sizeof(mask), &mask); assert(error == 0); } - printf("%s\n",__func__); while (1) { - printf("%s 2\n",__func__); error = vm_run(ctx, vcpu, pc, &vmexit[vcpu]); - printf("%s 3\n",__func__); if (error != 0) { /* @@ -338,12 +317,6 @@ case 'c': guest_ncpus = atoi(optarg); break; - case 'H': - guest_vmexit_on_hlt = 1; - break; - case 'P': - guest_vmexit_on_pause = 1; - break; case 'h': usage(0); default: @@ -378,7 +351,6 @@ error = vm_get_register(ctx, BSP, VM_REG_GUEST_PC, &pc); assert(error == 0); - printf("%s pc: %llx\n",__func__, pc); /* * Add CPU 0 */ From owner-svn-soc-all@freebsd.org Thu Jul 23 18:37:26 2015 Return-Path: Delivered-To: svn-soc-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id C77CB9A94A7 for ; Thu, 23 Jul 2015 18:37:26 +0000 (UTC) (envelope-from mihai@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id B7FA91D8E for ; Thu, 23 Jul 2015 18:37:26 +0000 (UTC) (envelope-from mihai@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.15.2/8.15.2) with ESMTP id t6NIbQQO072866 for ; Thu, 23 Jul 2015 18:37:26 GMT (envelope-from mihai@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.15.2/8.15.2/Submit) id t6NIbQ4H072864 for svn-soc-all@FreeBSD.org; Thu, 23 Jul 2015 18:37:26 GMT (envelope-from mihai@FreeBSD.org) Date: Thu, 23 Jul 2015 18:37:26 GMT Message-Id: <201507231837.t6NIbQ4H072864@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to mihai@FreeBSD.org using -f From: mihai@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r288705 - soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 23 Jul 2015 18:37:26 -0000 Author: mihai Date: Thu Jul 23 18:37:25 2015 New Revision: 288705 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=288705 Log: soc2015: mihai: bhyve: sys: arm: vmm: vmm_dev.c: remove debug printfs Modified: soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/vmm_dev.c Modified: soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/vmm_dev.c ============================================================================== --- soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/vmm_dev.c Thu Jul 23 18:22:28 2015 (r288704) +++ soc2015/mihai/bhyve-on-arm-head/sys/arm/vmm/vmm_dev.c Thu Jul 23 18:37:25 2015 (r288705) @@ -142,7 +142,6 @@ case VM_RUN: vmrun = (struct vm_run *)data; error = vm_run(sc->vm, vmrun); - printf("%s VM_RUN returned error: %d\n", __func__, error); break; case VM_MAP_MEMORY: seg = (struct vm_memory_segment *)data; From owner-svn-soc-all@freebsd.org Thu Jul 23 19:14:33 2015 Return-Path: Delivered-To: svn-soc-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id E943D9A9BB0 for ; Thu, 23 Jul 2015 19:14:33 +0000 (UTC) (envelope-from clord@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id D9BB7113E for ; Thu, 23 Jul 2015 19:14:33 +0000 (UTC) (envelope-from clord@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.15.2/8.15.2) with ESMTP id t6NJEXqO048883 for ; Thu, 23 Jul 2015 19:14:33 GMT (envelope-from clord@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.15.2/8.15.2/Submit) id t6NJEXY4048870 for svn-soc-all@FreeBSD.org; Thu, 23 Jul 2015 19:14:33 GMT (envelope-from clord@FreeBSD.org) Date: Thu, 23 Jul 2015 19:14:33 GMT Message-Id: <201507231914.t6NJEXY4048870@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to clord@FreeBSD.org using -f From: clord@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r288707 - soc2015/clord/head/sys/contrib/ficl MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 23 Jul 2015 19:14:34 -0000 Author: clord Date: Thu Jul 23 19:14:32 2015 New Revision: 288707 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=288707 Log: Remove default ficlCompilePlatform definition in favor of FreeBSD's version Modified: soc2015/clord/head/sys/contrib/ficl/compatibility.c Modified: soc2015/clord/head/sys/contrib/ficl/compatibility.c ============================================================================== --- soc2015/clord/head/sys/contrib/ficl/compatibility.c Thu Jul 23 18:11:52 2015 (r288706) +++ soc2015/clord/head/sys/contrib/ficl/compatibility.c Thu Jul 23 19:14:32 2015 (r288707) @@ -269,9 +269,6 @@ FICL_PLATFORM_EXTERN void ficlCompileFloat(ficlSystem *system) { ficlSystemCompileFloat(system); } FICL_PLATFORM_EXTERN int ficlParseFloatNumber( ficlVm *vm, ficlString string) { return ficlVmParseFloatNumber(vm, string); } #endif -#if FICL_WANT_PLATFORM -FICL_PLATFORM_EXTERN void ficlCompilePlatform(ficlSystem *system) { ficlSystemCompilePlatform(system); } -#endif FICL_PLATFORM_EXTERN int ficlParsePrefix(ficlVm *vm, ficlString string) { return ficlVmParsePrefix(vm, string); } FICL_PLATFORM_EXTERN int ficlParseNumber(ficlVm *vm, ficlString string) { return ficlVmParseNumber(vm, string); } From owner-svn-soc-all@freebsd.org Thu Jul 23 19:20:02 2015 Return-Path: Delivered-To: svn-soc-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 2145A9A9C32 for ; Thu, 23 Jul 2015 19:20:02 +0000 (UTC) (envelope-from clord@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 0469C11EB for ; Thu, 23 Jul 2015 19:20:02 +0000 (UTC) (envelope-from clord@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.15.2/8.15.2) with ESMTP id t6NJK1IU052141 for ; Thu, 23 Jul 2015 19:20:01 GMT (envelope-from clord@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.15.2/8.15.2/Submit) id t6NJK02i052018 for svn-soc-all@FreeBSD.org; Thu, 23 Jul 2015 19:20:00 GMT (envelope-from clord@FreeBSD.org) Date: Thu, 23 Jul 2015 19:20:00 GMT Message-Id: <201507231920.t6NJK02i052018@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to clord@FreeBSD.org using -f From: clord@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r288708 - soc2015/clord/head/sys/contrib/ficl MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 23 Jul 2015 19:20:02 -0000 Author: clord Date: Thu Jul 23 19:19:59 2015 New Revision: 288708 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=288708 Log: Add the ficlDictionaryCheckThreshold function into Ficl 4 source. Was previously named dictCheckThreshold, but the name, as well as some of the types, were renamed to match the Ficl 4 sources better. Modified: soc2015/clord/head/sys/contrib/ficl/dictionary.c soc2015/clord/head/sys/contrib/ficl/ficl.h soc2015/clord/head/sys/contrib/ficl/ficlcompatibility.h soc2015/clord/head/sys/contrib/ficl/primitives.c Modified: soc2015/clord/head/sys/contrib/ficl/dictionary.c ============================================================================== --- soc2015/clord/head/sys/contrib/ficl/dictionary.c Thu Jul 23 19:14:32 2015 (r288707) +++ soc2015/clord/head/sys/contrib/ficl/dictionary.c Thu Jul 23 19:19:59 2015 (r288708) @@ -64,6 +64,10 @@ #define FICL_SAFE_SYSTEM_FROM_DICTIONARY(dictionary) (((dictionary) != NULL) ? (dictionary)->system : NULL) #define FICL_DICTIONARY_ASSERT(dictionary, expression) FICL_SYSTEM_ASSERT(FICL_SAFE_SYSTEM_FROM_DICTIONARY(dictionary), expression) +/* Dictionary on-demand resizing control variables */ +CELL dictThreshold; +CELL dictIncrease; + /************************************************************************** d i c t A b o r t D e f i n i t i o n ** Abort a definition in process: reclaim its memory and unlink it @@ -627,6 +631,24 @@ /************************************************************************** + d i c t C h e c k T h r e s h o l d +** Verify if an increase in the dictionary size is warranted, and do it if +** so. +**************************************************************************/ + +void ficlDictionaryCheckThreshold(ficlDictionary *dictionary) +{ + if( dictCellsAvail(dictionary) < dictThreshold.u ) { + dictionary->base = ficlMalloc( dictIncrease.u * sizeof (CELL) ); + assert(dictionary->base); + dictionary->here = dictionary->base; + dictionary->size = dictIncrease.u; + dictAlign(dictionary); + } +} + + +/************************************************************************** s e e ** TOOLS ( "name" -- ) ** Display a human-readable representation of the named word's definition. Modified: soc2015/clord/head/sys/contrib/ficl/ficl.h ============================================================================== --- soc2015/clord/head/sys/contrib/ficl/ficl.h Thu Jul 23 19:14:32 2015 (r288707) +++ soc2015/clord/head/sys/contrib/ficl/ficl.h Thu Jul 23 19:19:59 2015 (r288708) @@ -1423,7 +1423,7 @@ int wordlistCount; unsigned size; /* Number of cells in dictionary (total)*/ ficlSystem *system; /* used for debugging */ - ficlCell base[1]; /* Base of dictionary memory */ + ficlCell *base; /* Base of dictionary memory */ }; FICL_PLATFORM_EXTERN void ficlDictionaryAbortDefinition(ficlDictionary *dictionary); @@ -1484,6 +1484,7 @@ FICL_PLATFORM_EXTERN int ficlDictionaryCellsAvailable (ficlDictionary *dictionary); FICL_PLATFORM_EXTERN int ficlDictionaryCellsUsed (ficlDictionary *dictionary); +FICL_PLATFORM_EXTERN void ficlDictionaryCheckThreshold(ficlDictionary *dictionary); FICL_PLATFORM_EXTERN ficlDictionary *ficlDictionaryCreate(ficlSystem *system, unsigned nCELLS); FICL_PLATFORM_EXTERN ficlDictionary *ficlDictionaryCreateHashed(ficlSystem *system, unsigned nCells, unsigned nHash); FICL_PLATFORM_EXTERN ficlHash *ficlDictionaryCreateWordlist(ficlDictionary *dictionary, int nBuckets); Modified: soc2015/clord/head/sys/contrib/ficl/ficlcompatibility.h ============================================================================== --- soc2015/clord/head/sys/contrib/ficl/ficlcompatibility.h Thu Jul 23 19:14:32 2015 (r288707) +++ soc2015/clord/head/sys/contrib/ficl/ficlcompatibility.h Thu Jul 23 19:19:59 2015 (r288708) @@ -312,7 +312,7 @@ int nLists; unsigned size; /* Number of cells in dict (total)*/ ficlSystem *system; - CELL dict[1]; /* Base of dictionary memory */ + CELL *dict; /* Base of dictionary memory */ }; void *alignPtr(void *ptr); Modified: soc2015/clord/head/sys/contrib/ficl/primitives.c ============================================================================== --- soc2015/clord/head/sys/contrib/ficl/primitives.c Thu Jul 23 19:14:32 2015 (r288707) +++ soc2015/clord/head/sys/contrib/ficl/primitives.c Thu Jul 23 19:19:59 2015 (r288708) @@ -189,6 +189,8 @@ ficlDictionary *dictionary = ficlVmGetDictionary(vm); ficlString name = ficlVmGetWord(vm); + ficlDictionaryCheckThreshold(dictionary); + vm->state = FICL_VM_STATE_COMPILE; markControlTag(vm, colonTag); ficlDictionaryAppendWord(dictionary, name, (ficlPrimitive)ficlInstructionColonParen, FICL_WORD_DEFAULT | FICL_WORD_SMUDGED); @@ -1493,6 +1495,8 @@ ficlDictionary *dictionary = ficlVmGetDictionary(vm); ficlString name = ficlVmGetWord(vm); + ficlDictionaryCheckThreshold(dictionary); + ficlDictionaryAppendWord(dictionary, name, (ficlPrimitive)ficlInstructionCreateParen, FICL_WORD_DEFAULT); ficlVmDictionaryAllotCells(vm, dictionary, 1); return; From owner-svn-soc-all@freebsd.org Thu Jul 23 20:22:51 2015 Return-Path: Delivered-To: svn-soc-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 6323A9A9A8E for ; Thu, 23 Jul 2015 20:22:51 +0000 (UTC) (envelope-from clord@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 4C3B11035 for ; Thu, 23 Jul 2015 20:22:51 +0000 (UTC) (envelope-from clord@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.15.2/8.15.2) with ESMTP id t6NKMpXU059702 for ; Thu, 23 Jul 2015 20:22:51 GMT (envelope-from clord@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.15.2/8.15.2/Submit) id t6NKMovo059699 for svn-soc-all@FreeBSD.org; Thu, 23 Jul 2015 20:22:50 GMT (envelope-from clord@FreeBSD.org) Date: Thu, 23 Jul 2015 20:22:50 GMT Message-Id: <201507232022.t6NKMovo059699@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to clord@FreeBSD.org using -f From: clord@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r288716 - soc2015/clord/head/sys/boot/ficl MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 23 Jul 2015 20:22:51 -0000 Author: clord Date: Thu Jul 23 20:22:50 2015 New Revision: 288716 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=288716 Log: Add compatibility.c to list of sources Modified: soc2015/clord/head/sys/boot/ficl/Makefile Modified: soc2015/clord/head/sys/boot/ficl/Makefile ============================================================================== --- soc2015/clord/head/sys/boot/ficl/Makefile Thu Jul 23 19:58:56 2015 (r288715) +++ soc2015/clord/head/sys/boot/ficl/Makefile Thu Jul 23 20:22:50 2015 (r288716) @@ -10,9 +10,9 @@ .else .PATH: ${FICLDIR}/${MACHINE_CPUARCH} .endif -BASE_SRCS= dictionary.c system.c fileaccess.c float.c double.c prefix.c \ - search.c stack.c tools.c vm.c primitives.c bit.c \ - lzuncompress.c utility.c hash.c callback.c word.c extras.c loader.c +BASE_SRCS= bit.c callback.c compatibility.c dictionary.c double.c extras.c \ + fileaccess.c float.c hash.c loader.c lzuncompress.c prefix.c \ + primitives.c search.c stack.c system.c tools.c utility.c vm.c word.c SRCS= ${BASE_SRCS} sysdep.c softcore.c CLEANFILES= softcore.c main main.o @@ -80,7 +80,7 @@ -I${FICLDIR}/../../boot/common softcore.c: ${SOFTWORDS} softcore.awk - (cd ${FICLDIR}/softwords; cat ${SOFTWORDS} \ + (cd ${FICLDIR}/softcore; cat ${SOFTWORDS} \ | awk -f softcore.awk -v datestamp="`LC_ALL=C date`") > ${.TARGET} .if ${MACHINE_CPUARCH} == "amd64" && defined(FICL32) From owner-svn-soc-all@freebsd.org Sat Jul 25 17:28:25 2015 Return-Path: Delivered-To: svn-soc-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 19A6B9AB310 for ; Sat, 25 Jul 2015 17:28:25 +0000 (UTC) (envelope-from iateaca@FreeBSD.org) Received: from socsvn.freebsd.org (socsvn.freebsd.org [IPv6:2001:1900:2254:206a::50:2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id DB993164D for ; Sat, 25 Jul 2015 17:28:24 +0000 (UTC) (envelope-from iateaca@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.15.2/8.15.2) with ESMTP id t6PHSOES022014 for ; Sat, 25 Jul 2015 17:28:24 GMT (envelope-from iateaca@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.15.2/8.15.2/Submit) id t6PHSOsc022012 for svn-soc-all@FreeBSD.org; Sat, 25 Jul 2015 17:28:24 GMT (envelope-from iateaca@FreeBSD.org) Date: Sat, 25 Jul 2015 17:28:24 GMT Message-Id: <201507251728.t6PHSOsc022012@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to iateaca@FreeBSD.org using -f From: iateaca@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r288767 - soc2015/iateaca/bhyve-ne2000-head/usr.sbin/bhyve MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 25 Jul 2015 17:28:25 -0000 Author: iateaca Date: Sat Jul 25 17:28:23 2015 New Revision: 288767 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=288767 Log: lock the reception flow with the .pe_barwrite and .pe_barwrite flows Modified: soc2015/iateaca/bhyve-ne2000-head/usr.sbin/bhyve/pci_ne2000.c Modified: soc2015/iateaca/bhyve-ne2000-head/usr.sbin/bhyve/pci_ne2000.c ============================================================================== --- soc2015/iateaca/bhyve-ne2000-head/usr.sbin/bhyve/pci_ne2000.c Sat Jul 25 16:20:04 2015 (r288766) +++ soc2015/iateaca/bhyve-ne2000-head/usr.sbin/bhyve/pci_ne2000.c Sat Jul 25 17:28:23 2015 (r288767) @@ -7,6 +7,7 @@ #include #include #include +#include #include @@ -63,6 +64,12 @@ struct pci_ne2000_softc { struct pci_devinst *asc_pi; + /* + * one single mutex used to lock the reception flow with + * the .pe_barwrite and .pe_barwrite flows + */ + pthread_mutex_t mtx; + /* NIC registers */ uint8_t nic_regs[NE2000_PAGE_COUNT][NE2000_PAGE_SIZE]; @@ -337,9 +344,15 @@ struct pci_ne2000_softc *sc = (struct pci_ne2000_softc *)param; assert(sc != NULL); + err = pthread_mutex_lock(&sc->mtx); + assert(err == 0); + err = ne2000_tap_rx(sc); assert(err == 0); + err = pthread_mutex_unlock(&sc->mtx); + assert(err == 0); + return; } @@ -507,6 +520,9 @@ return 1; } + err = pthread_mutex_init(&sc->mtx, NULL); + assert(err == 0); + err = ne2000_tap_init(sc, tap_name); assert(err == 0); @@ -548,6 +564,9 @@ assert(sc != NULL); assert(offset <= 0x0f); + err = pthread_mutex_lock(&sc->mtx); + assert(err == 0); + switch (baridx) { case NE2000_BAR_NIC: assert(size == 1); @@ -564,6 +583,9 @@ assert(err == 0); + err = pthread_mutex_unlock(&sc->mtx); + assert(err == 0); + return; } @@ -816,10 +838,14 @@ { struct pci_ne2000_softc *sc = pi->pi_arg; uint64_t value = 0; + int err; assert(sc != NULL); assert(offset <= 0x0f); + err = pthread_mutex_lock(&sc->mtx); + assert(err == 0); + switch (baridx) { case NE2000_BAR_NIC: assert(size == 1); @@ -833,6 +859,9 @@ assert(0); } + err = pthread_mutex_unlock(&sc->mtx); + assert(err == 0); + return value; }