From owner-svn-soc-all@freebsd.org Fri Aug 5 14:04:05 2016 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 832CABB03CC for ; Fri, 5 Aug 2016 14:04:05 +0000 (UTC) (envelope-from vincenzo@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 681681892 for ; Fri, 5 Aug 2016 14:04:05 +0000 (UTC) (envelope-from vincenzo@FreeBSD.org) Received: from socsvn.freebsd.org ([127.0.1.124]) by socsvn.freebsd.org (8.15.2/8.15.2) with ESMTP id u75E4526097768 for ; Fri, 5 Aug 2016 14:04:05 GMT (envelope-from vincenzo@FreeBSD.org) Received: (from www@localhost) by socsvn.freebsd.org (8.15.2/8.15.2/Submit) id u75E43HR097709 for svn-soc-all@FreeBSD.org; Fri, 5 Aug 2016 14:04:03 GMT (envelope-from vincenzo@FreeBSD.org) Date: Fri, 5 Aug 2016 14:04:03 GMT Message-Id: <201608051404.u75E43HR097709@socsvn.freebsd.org> X-Authentication-Warning: socsvn.freebsd.org: www set sender to vincenzo@FreeBSD.org using -f From: vincenzo@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r307229 - soc2016/vincenzo/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.22 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: Fri, 05 Aug 2016 14:04:05 -0000 Author: vincenzo Date: Fri Aug 5 14:04:03 2016 New Revision: 307229 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=307229 Log: bhyve: ptnet: add support for ptctl (REGIF + UNREGIF) Modified: soc2016/vincenzo/head/usr.sbin/bhyve/net_backends.c soc2016/vincenzo/head/usr.sbin/bhyve/net_backends.h soc2016/vincenzo/head/usr.sbin/bhyve/pci_ptnetmap_netif.c Modified: soc2016/vincenzo/head/usr.sbin/bhyve/net_backends.c ============================================================================== --- soc2016/vincenzo/head/usr.sbin/bhyve/net_backends.c Fri Aug 5 14:03:10 2016 (r307228) +++ soc2016/vincenzo/head/usr.sbin/bhyve/net_backends.c Fri Aug 5 14:04:03 2016 (r307229) @@ -55,7 +55,6 @@ #if (NETMAP_API < 11) #error "Netmap API version must be >= 11" #endif -#include /* * The API for network backends. This might need to be exposed @@ -476,7 +475,7 @@ } int -ptnetmap_get_host_memid(struct ptnetmap_state *ptn) +ptnetmap_get_hostmemid(struct ptnetmap_state *ptn) { struct netmap_priv *priv = ptn->netmap_priv; Modified: soc2016/vincenzo/head/usr.sbin/bhyve/net_backends.h ============================================================================== --- soc2016/vincenzo/head/usr.sbin/bhyve/net_backends.h Fri Aug 5 14:03:10 2016 (r307228) +++ soc2016/vincenzo/head/usr.sbin/bhyve/net_backends.h Fri Aug 5 14:04:03 2016 (r307229) @@ -28,6 +28,8 @@ #define __NET_BACKENDS_H__ #include +#include +#include #include "mevent.h" extern int netmap_ioctl_counter; @@ -118,6 +120,9 @@ struct ptnetmap_state * get_ptnetmap(struct net_backend *be); uint32_t ptnetmap_ack_features(struct ptnetmap_state *ptn, uint32_t wanted_features); +int ptnetmap_get_hostmemid(struct ptnetmap_state *ptn); +int ptnetmap_create(struct ptnetmap_state *ptn, struct ptnetmap_cfg *cfg); +int ptnetmap_delete(struct ptnetmap_state *ptn); #include "pci_emul.h" Modified: soc2016/vincenzo/head/usr.sbin/bhyve/pci_ptnetmap_netif.c ============================================================================== --- soc2016/vincenzo/head/usr.sbin/bhyve/pci_ptnetmap_netif.c Fri Aug 5 14:03:10 2016 (r307228) +++ soc2016/vincenzo/head/usr.sbin/bhyve/pci_ptnetmap_netif.c Fri Aug 5 14:04:03 2016 (r307229) @@ -37,7 +37,11 @@ #include #include +#include +#include +#include #include +#include /* VM_LAPIC_MSI */ #include #include "bhyverun.h" @@ -89,6 +93,108 @@ return 0; } +static int +ptnet_regif(struct ptnet_softc *sc) +{ + struct pci_devinst *pi = sc->pi; + struct vmctx *vmctx = pi->pi_vmctx; + struct ptnetmap_cfg *cfg; + unsigned int kick_addr; + int ret; + int i; + + if (sc->csb == NULL) { + fprintf(stderr, "%s: Unexpected NULL CSB", __func__); + return -1; + } + + cfg = calloc(1, sizeof(*cfg) + sc->num_rings * sizeof(cfg->entries[0])); + + cfg->features = PTNETMAP_CFG_FEAT_CSB | PTNETMAP_CFG_FEAT_EVENTFD; + cfg->num_rings = sc->num_rings; + cfg->ptrings = sc->csb; + + kick_addr = pi->pi_bar[PTNETMAP_IO_PCI_BAR].addr + PTNET_IO_KICK_BASE; + + for (i = 0; i < sc->num_rings; i++, kick_addr += 4) { + struct msix_table_entry *mte; + + cfg->entries[i].irqfd = vm_get_fd(vmctx); + cfg->entries[i].ioctl.com = VM_LAPIC_MSI; + mte = &pi->pi_msix.table[i]; + cfg->entries[i].ioctl.data.msix.addr = mte->addr; + cfg->entries[i].ioctl.data.msix.msg = mte->msg_data; + + fprintf(stderr, "%s: vector %u, addr %lu, data %u, " + "kick_addr %u\n", + __func__, i, mte->addr, mte->msg_data, kick_addr); + + ret = vm_io_reg_handler(vmctx, kick_addr /* ioaddr */, + 0 /* in */, 0 /* mask_data */, + 0 /* data */, VM_IO_REGH_KWEVENTS, + (void *)sc + i /* cookie */); + if (ret) { + fprintf(stderr, "%s: vm_io_reg_handler %d\n", + __func__, ret); + } + cfg->entries[i].ioeventfd = (uint64_t) (sc + i); + } + + ret = ptnetmap_create(sc->ptbe, cfg); + free(cfg); + + return ret; +} + +static int +ptnet_unregif(struct ptnet_softc *sc) +{ + struct pci_devinst *pi = sc->pi; + struct vmctx *vmctx = pi->pi_vmctx; + unsigned int kick_addr; + int i; + + kick_addr = pi->pi_bar[PTNETMAP_IO_PCI_BAR].addr + PTNET_IO_KICK_BASE; + + for (i = 0; i < sc->num_rings; i++, kick_addr += 4) { + vm_io_reg_handler(vmctx, kick_addr, 0, 0, 0, + VM_IO_REGH_DELETE, 0); + } + + return ptnetmap_delete(sc->ptbe); +} + +static void +ptnet_ptctl(struct ptnet_softc *sc, uint64_t cmd) +{ + int ret = EINVAL; + + switch (cmd) { + case NET_PARAVIRT_PTCTL_CONFIG: + fprintf(stderr, "Ignoring deprecated CONFIG PTCTL\n"); + break; + + case NET_PARAVIRT_PTCTL_REGIF: + /* Emulate a REGIF for the guest. */ + ret = ptnet_regif(sc); + break; + + case NET_PARAVIRT_PTCTL_UNREGIF: + /* Emulate an UNREGIF for the guest. */ + ret = ptnet_unregif(sc); + break; + + case NET_PARAVIRT_PTCTL_HOSTMEMID: + ret = ptnetmap_get_hostmemid(sc->ptbe); + break; + + default: + break; + } + + sc->ioregs[PTNET_IO_PTSTS >> 2] = ret; +} + static uint64_t ptnet_bar_read(struct vmctx *ctx, int vcpu, struct pci_devinst *pi, int baridx, uint64_t offset, int size) @@ -141,6 +247,11 @@ value = ptnetmap_ack_features(sc->ptbe, value); sc->ioregs[index] = value; break; + + case PTNET_IO_PTCTL: + ptnet_ptctl(sc, value); + break; + } return; }