From owner-p4-projects@FreeBSD.ORG Sun Jun 22 15:59:11 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 350721065680; Sun, 22 Jun 2008 15:59:11 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id EA4C41065676 for ; Sun, 22 Jun 2008 15:59:10 +0000 (UTC) (envelope-from diego@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id DDB578FC1B for ; Sun, 22 Jun 2008 15:59:10 +0000 (UTC) (envelope-from diego@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id m5MFxALE061488 for ; Sun, 22 Jun 2008 15:59:10 GMT (envelope-from diego@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id m5MFxAv6061486 for perforce@freebsd.org; Sun, 22 Jun 2008 15:59:10 GMT (envelope-from diego@FreeBSD.org) Date: Sun, 22 Jun 2008 15:59:10 GMT Message-Id: <200806221559.m5MFxAv6061486@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to diego@FreeBSD.org using -f From: Diego Giagio To: Perforce Change Reviews Cc: Subject: PERFORCE change 143918 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 22 Jun 2008 15:59:11 -0000 http://perforce.freebsd.org/chv.cgi?CH=143918 Change 143918 by diego@diego_black on 2008/06/22 15:58:59 IFC Affected files ... .. //depot/projects/soc2008/diego-audit/src/sys/amd64/amd64/pmap.c#7 integrate .. //depot/projects/soc2008/diego-audit/src/sys/dev/gem/if_gem.c#2 integrate .. //depot/projects/soc2008/diego-audit/src/sys/fs/devfs/devfs_rule.c#2 integrate .. //depot/projects/soc2008/diego-audit/src/sys/netinet/libalias/alias.c#4 integrate .. //depot/projects/soc2008/diego-audit/src/sys/netinet/libalias/alias_db.c#3 integrate .. //depot/projects/soc2008/diego-audit/src/sys/netinet/libalias/alias_ftp.c#2 integrate .. //depot/projects/soc2008/diego-audit/src/sys/vm/vm_kern.c#4 integrate .. //depot/projects/soc2008/diego-audit/src/sys/vm/vm_map.c#4 integrate Differences ... ==== //depot/projects/soc2008/diego-audit/src/sys/amd64/amd64/pmap.c#7 (text+ko) ==== @@ -77,7 +77,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.622 2008/06/20 05:22:09 alc Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.623 2008/06/21 19:19:09 alc Exp $"); /* * Manages physical address maps. @@ -441,8 +441,10 @@ /* Read-only from zero to physfree */ /* XXX not fully used, underneath 2M pages */ for (i = 0; (i << PAGE_SHIFT) < *firstaddr; i++) { - ((pt_entry_t *)KPTphys)[i] = i << PAGE_SHIFT; - ((pt_entry_t *)KPTphys)[i] |= PG_RW | PG_V | PG_G; + ((pt_entry_t *)KPTphys)[(KERNBASE - VM_MIN_KERNEL_ADDRESS) / + PAGE_SIZE + i] = i << PAGE_SHIFT; + ((pt_entry_t *)KPTphys)[(KERNBASE - VM_MIN_KERNEL_ADDRESS) / + PAGE_SIZE + i] |= PG_RW | PG_V | PG_G; } /* Now map the page tables at their location within PTmap */ @@ -454,8 +456,10 @@ /* Map from zero to end of allocations under 2M pages */ /* This replaces some of the KPTphys entries above */ for (i = 0; (i << PDRSHIFT) < *firstaddr; i++) { - ((pd_entry_t *)KPDphys)[i] = i << PDRSHIFT; - ((pd_entry_t *)KPDphys)[i] |= PG_RW | PG_V | PG_PS | PG_G; + ((pd_entry_t *)KPDphys)[(KERNBASE - VM_MIN_KERNEL_ADDRESS) / + NBPDR + i] = i << PDRSHIFT; + ((pd_entry_t *)KPDphys)[(KERNBASE - VM_MIN_KERNEL_ADDRESS) / + NBPDR + i] |= PG_RW | PG_V | PG_PS | PG_G; } /* And connect up the PD to the PDP */ ==== //depot/projects/soc2008/diego-audit/src/sys/dev/gem/if_gem.c#2 (text+ko) ==== @@ -29,7 +29,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/dev/gem/if_gem.c,v 1.49 2008/03/24 17:23:53 marius Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/gem/if_gem.c,v 1.50 2008/06/22 13:54:51 marius Exp $"); /* * Driver for Apple GMAC, Sun ERI and Sun GEM Ethernet controllers @@ -127,8 +127,6 @@ static void gem_stop(struct ifnet *ifp, int disable); static void gem_tick(void *arg); static void gem_tint(struct gem_softc *sc); -static __inline void gem_txcksum(struct gem_softc *sc, struct mbuf *m, - uint64_t *cflags); static int gem_watchdog(struct gem_softc *sc); devclass_t gem_devclass; @@ -422,8 +420,7 @@ if (sc->sc_txsoft[i].txs_dmamap != NULL) bus_dmamap_destroy(sc->sc_tdmatag, sc->sc_txsoft[i].txs_dmamap); - GEM_CDSYNC(sc, BUS_DMASYNC_POSTREAD); - GEM_CDSYNC(sc, BUS_DMASYNC_POSTWRITE); + GEM_CDSYNC(sc, BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); bus_dmamap_unload(sc->sc_cdmatag, sc->sc_cddmamap); bus_dmamem_free(sc->sc_cdmatag, sc->sc_control_data, sc->sc_cddmamap); @@ -460,55 +457,6 @@ } static __inline void -gem_txcksum(struct gem_softc *sc, struct mbuf *m, uint64_t *cflags) -{ - char *p; - struct ip *ip; - struct mbuf *m0; - uint64_t offset, offset2; - - m0 = m; - offset = sizeof(struct ip) + ETHER_HDR_LEN; - for(; m && m->m_len == 0; m = m->m_next) - ; - if (m == NULL || m->m_len < ETHER_HDR_LEN) { - device_printf(sc->sc_dev, "%s: m_len < ETHER_HDR_LEN\n", - __func__); - /* Checksum will be corrupted. */ - m = m0; - goto sendit; - } - if (m->m_len < ETHER_HDR_LEN + sizeof(uint32_t)) { - if (m->m_len != ETHER_HDR_LEN) { - device_printf(sc->sc_dev, - "%s: m_len != ETHER_HDR_LEN\n", __func__); - /* Checksum will be corrupted. */ - m = m0; - goto sendit; - } - for(m = m->m_next; m && m->m_len == 0; m = m->m_next) - ; - if (m == NULL) { - /* Checksum will be corrupted. */ - m = m0; - goto sendit; - } - ip = mtod(m, struct ip *); - } else { - p = mtod(m, uint8_t *); - p += ETHER_HDR_LEN; - ip = (struct ip *)p; - } - offset = (ip->ip_hl << 2) + ETHER_HDR_LEN; - - sendit: - offset2 = m->m_pkthdr.csum_data; - *cflags = offset << GEM_TD_CXSUM_STARTSHFT; - *cflags |= ((offset + offset2) << GEM_TD_CXSUM_STUFFSHFT); - *cflags |= GEM_TD_CXSUM_ENABLE; -} - -static __inline void gem_rxcksum(struct mbuf *m, uint64_t flags) { struct ether_header *eh; @@ -645,7 +593,8 @@ /* Do a full reset. */ GEM_BANK2_WRITE_4(sc, GEM_RESET, GEM_RESET_RX | GEM_RESET_TX); - GEM_BANK2_BARRIER(sc, GEM_RESET, 4, BUS_SPACE_BARRIER_WRITE); + GEM_BANK2_BARRIER(sc, GEM_RESET, 4, + BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE); if (!GEM_BANK2_BITWAIT(sc, GEM_RESET, GEM_RESET_RX | GEM_RESET_TX, 0)) device_printf(sc->sc_dev, "cannot reset device\n"); } @@ -725,13 +674,15 @@ */ gem_disable_rx(sc); GEM_BANK1_WRITE_4(sc, GEM_RX_CONFIG, 0); - GEM_BANK1_BARRIER(sc, GEM_RX_CONFIG, 4, BUS_SPACE_BARRIER_WRITE); + GEM_BANK1_BARRIER(sc, GEM_RX_CONFIG, 4, + BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE); if (!GEM_BANK1_BITWAIT(sc, GEM_RX_CONFIG, GEM_RX_CONFIG_RXDMA_EN, 0)) device_printf(sc->sc_dev, "cannot disable RX DMA\n"); /* Finally, reset the ERX. */ GEM_BANK2_WRITE_4(sc, GEM_RESET, GEM_RESET_RX); - GEM_BANK2_BARRIER(sc, GEM_RESET, 4, BUS_SPACE_BARRIER_WRITE); + GEM_BANK2_BARRIER(sc, GEM_RESET, 4, + BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE); if (!GEM_BANK2_BITWAIT(sc, GEM_RESET, GEM_RESET_RX | GEM_RESET_TX, 0)) { device_printf(sc->sc_dev, "cannot reset receiver\n"); @@ -758,8 +709,7 @@ if (sc->sc_rxsoft[i].rxs_mbuf != NULL) GEM_UPDATE_RXDESC(sc, i); sc->sc_rxptr = 0; - GEM_CDSYNC(sc, BUS_DMASYNC_PREWRITE); - GEM_CDSYNC(sc, BUS_DMASYNC_PREREAD); + GEM_CDSYNC(sc, BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD); /* NOTE: we use only 32-bit DMA addresses here. */ GEM_BANK1_WRITE_4(sc, GEM_RX_RING_PTR_HI, 0); @@ -794,13 +744,15 @@ */ gem_disable_tx(sc); GEM_BANK1_WRITE_4(sc, GEM_TX_CONFIG, 0); - GEM_BANK1_BARRIER(sc, GEM_TX_CONFIG, 4, BUS_SPACE_BARRIER_WRITE); + GEM_BANK1_BARRIER(sc, GEM_TX_CONFIG, 4, + BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE); if (!GEM_BANK1_BITWAIT(sc, GEM_TX_CONFIG, GEM_TX_CONFIG_TXDMA_EN, 0)) device_printf(sc->sc_dev, "cannot disable TX DMA\n"); /* Finally, reset the ETX. */ GEM_BANK2_WRITE_4(sc, GEM_RESET, GEM_RESET_TX); - GEM_BANK2_BARRIER(sc, GEM_RESET, 4, BUS_SPACE_BARRIER_WRITE); + GEM_BANK2_BARRIER(sc, GEM_RESET, 4, + BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE); if (!GEM_BANK2_BITWAIT(sc, GEM_RESET, GEM_RESET_RX | GEM_RESET_TX, 0)) { device_printf(sc->sc_dev, "cannot reset transmitter\n"); @@ -815,7 +767,8 @@ GEM_BANK1_WRITE_4(sc, GEM_MAC_RX_CONFIG, GEM_BANK1_READ_4(sc, GEM_MAC_RX_CONFIG) & ~GEM_MAC_RX_ENABLE); - GEM_BANK1_BARRIER(sc, GEM_MAC_RX_CONFIG, 4, BUS_SPACE_BARRIER_WRITE); + GEM_BANK1_BARRIER(sc, GEM_MAC_RX_CONFIG, 4, + BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE); return (GEM_BANK1_BITWAIT(sc, GEM_MAC_RX_CONFIG, GEM_MAC_RX_ENABLE, 0)); } @@ -826,7 +779,8 @@ GEM_BANK1_WRITE_4(sc, GEM_MAC_TX_CONFIG, GEM_BANK1_READ_4(sc, GEM_MAC_TX_CONFIG) & ~GEM_MAC_TX_ENABLE); - GEM_BANK1_BARRIER(sc, GEM_MAC_TX_CONFIG, 4, BUS_SPACE_BARRIER_WRITE); + GEM_BANK1_BARRIER(sc, GEM_MAC_TX_CONFIG, 4, + BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE); return (GEM_BANK1_BITWAIT(sc, GEM_MAC_TX_CONFIG, GEM_MAC_TX_ENABLE, 0)); } @@ -871,8 +825,7 @@ GEM_INIT_RXDESC(sc, i); } sc->sc_rxptr = 0; - GEM_CDSYNC(sc, BUS_DMASYNC_PREWRITE); - GEM_CDSYNC(sc, BUS_DMASYNC_PREREAD); + GEM_CDSYNC(sc, BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD); return (0); } @@ -940,7 +893,7 @@ */ /* step 1 & 2. Reset the Ethernet Channel. */ - gem_stop(sc->sc_ifp, 0); + gem_stop(ifp, 0); gem_reset(sc); #ifdef GEM_DEBUG CTR2(KTR_GEM, "%s: %s: restarting", device_get_name(sc->sc_dev), @@ -997,9 +950,9 @@ /* Enable DMA. */ v = gem_ringsize(GEM_NTXDESC /* XXX */); - GEM_BANK1_WRITE_4(sc, GEM_TX_CONFIG, - v | GEM_TX_CONFIG_TXDMA_EN | - ((0x400 << 10) & GEM_TX_CONFIG_TXFIFO_TH)); + v |= ((sc->sc_variant == GEM_SUN_ERI ? 0x100 : 0x4ff) << 10) & + GEM_TX_CONFIG_TXFIFO_TH; + GEM_BANK1_WRITE_4(sc, GEM_TX_CONFIG, v | GEM_TX_CONFIG_TXDMA_EN); /* step 10. ERX Configuration */ @@ -1029,13 +982,24 @@ /* step 12. RX_MAC Configuration Register */ v = GEM_BANK1_READ_4(sc, GEM_MAC_RX_CONFIG); - v |= GEM_MAC_RX_STRIP_CRC; + v |= GEM_MAC_RX_ENABLE | GEM_MAC_RX_STRIP_CRC; GEM_BANK1_WRITE_4(sc, GEM_MAC_RX_CONFIG, 0); - GEM_BANK1_BARRIER(sc, GEM_MAC_RX_CONFIG, 4, BUS_SPACE_BARRIER_WRITE); + GEM_BANK1_BARRIER(sc, GEM_MAC_RX_CONFIG, 4, + BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE); if (!GEM_BANK1_BITWAIT(sc, GEM_MAC_RX_CONFIG, GEM_MAC_RX_ENABLE, 0)) - device_printf(sc->sc_dev, "cannot disable RX MAC\n"); + device_printf(sc->sc_dev, "cannot configure RX MAC\n"); GEM_BANK1_WRITE_4(sc, GEM_MAC_RX_CONFIG, v); + /* step 13. TX_MAC Configuration Register */ + v = GEM_BANK1_READ_4(sc, GEM_MAC_TX_CONFIG); + v |= GEM_MAC_TX_ENABLE; + GEM_BANK1_WRITE_4(sc, GEM_MAC_TX_CONFIG, 0); + GEM_BANK1_BARRIER(sc, GEM_MAC_TX_CONFIG, 4, + BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE); + if (!GEM_BANK1_BITWAIT(sc, GEM_MAC_TX_CONFIG, GEM_MAC_TX_ENABLE, 0)) + device_printf(sc->sc_dev, "cannot configure TX MAC\n"); + GEM_BANK1_WRITE_4(sc, GEM_MAC_TX_CONFIG, v); + /* step 14. Issue Transmit Pending command. */ /* step 15. Give the reciever a swift kick. */ @@ -1043,9 +1007,7 @@ ifp->if_drv_flags |= IFF_DRV_RUNNING; ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; - sc->sc_ifflags = ifp->if_flags; - sc->sc_flags &= ~GEM_LINK; mii_mediachg(sc->sc_mii); /* Start the one second timer. */ @@ -1058,15 +1020,40 @@ { bus_dma_segment_t txsegs[GEM_NTXSEGS]; struct gem_txsoft *txs; + struct ip *ip; struct mbuf *m; uint64_t cflags, flags; - int error, nexttx, nsegs, seg; + int error, nexttx, nsegs, offset, seg; /* Get a work queue entry. */ if ((txs = STAILQ_FIRST(&sc->sc_txfreeq)) == NULL) { /* Ran out of descriptors. */ return (ENOBUFS); } + + cflags = 0; + if (((*m_head)->m_pkthdr.csum_flags & sc->sc_csum_features) != 0) { + if (M_WRITABLE(*m_head) == 0) { + m = m_dup(*m_head, M_DONTWAIT); + m_freem(*m_head); + *m_head = m; + if (m == NULL) + return (ENOBUFS); + } + offset = sizeof(struct ether_header); + m = m_pullup(*m_head, offset + sizeof(struct ip)); + if (m == NULL) { + *m_head = NULL; + return (ENOBUFS); + } + ip = (struct ip *)(mtod(m, caddr_t) + offset); + offset += (ip->ip_hl << 2); + cflags = offset << GEM_TD_CXSUM_STARTSHFT | + ((offset + m->m_pkthdr.csum_data) << + GEM_TD_CXSUM_STUFFSHFT) | GEM_TD_CXSUM_ENABLE; + *m_head = m; + } + error = bus_dmamap_load_mbuf_sg(sc->sc_tdmatag, txs->txs_dmamap, *m_head, txsegs, &nsegs, BUS_DMA_NOWAIT); if (error == EFBIG) { @@ -1108,10 +1095,6 @@ return (ENOBUFS); } - flags = cflags = 0; - if (((*m_head)->m_pkthdr.csum_flags & sc->sc_csum_features) != 0) - gem_txcksum(sc, *m_head, &cflags); - txs->txs_ndescs = nsegs; txs->txs_firstdesc = sc->sc_txnext; nexttx = txs->txs_firstdesc; @@ -1302,7 +1285,7 @@ CTR3(KTR_GEM, "%s: %s: kicking TX %d", device_get_name(sc->sc_dev), __func__, sc->sc_txnext); #endif - GEM_CDSYNC(sc, BUS_DMASYNC_PREWRITE); + GEM_CDSYNC(sc, BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); GEM_BANK1_WRITE_4(sc, GEM_TX_KICK, sc->sc_txnext); BPF_MTAP(ifp, m); @@ -1426,9 +1409,7 @@ ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; sc->sc_wdog_timer = STAILQ_EMPTY(&sc->sc_txdirtyq) ? 0 : 5; - if (ifp->if_drv_flags & IFF_DRV_RUNNING && - !IFQ_DRV_IS_EMPTY(&ifp->if_snd)) - gem_start_locked(ifp); + gem_start_locked(ifp); } #ifdef GEM_DEBUG @@ -1538,7 +1519,8 @@ */ sc->sc_rxptr = GEM_NEXTRX(sc->sc_rxptr); if ((sc->sc_rxptr % 4) == 0) { - GEM_CDSYNC(sc, BUS_DMASYNC_PREWRITE); + GEM_CDSYNC(sc, + BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); GEM_BANK1_WRITE_4(sc, GEM_RX_KICK, (sc->sc_rxptr + GEM_NRXDESC - 4) & GEM_NRXDESC_MASK); @@ -1713,6 +1695,7 @@ static int gem_watchdog(struct gem_softc *sc) { + struct ifnet *ifp = sc->sc_ifp; GEM_LOCK_ASSERT(sc, MA_OWNED); @@ -1736,10 +1719,11 @@ device_printf(sc->sc_dev, "device timeout\n"); else if (bootverbose) device_printf(sc->sc_dev, "device timeout (no link)\n"); - ++sc->sc_ifp->if_oerrors; + ++ifp->if_oerrors; /* Try to get more packets going. */ gem_init_locked(sc); + gem_start_locked(ifp); return (EJUSTRETURN); } @@ -1814,6 +1798,8 @@ (reg << GEM_MIF_REG_SHIFT); GEM_BANK1_WRITE_4(sc, GEM_MIF_FRAME, v); + GEM_BANK1_BARRIER(sc, GEM_MIF_FRAME, 4, + BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE); for (n = 0; n < 100; n++) { DELAY(1); v = GEM_BANK1_READ_4(sc, GEM_MIF_FRAME); @@ -1842,12 +1828,21 @@ if ((sc->sc_flags & GEM_SERDES) != 0) { switch (reg) { - case MII_BMCR: - reg = GEM_MII_CONTROL; - break; case MII_BMSR: reg = GEM_MII_STATUS; break; + case MII_BMCR: + reg = GEM_MII_CONTROL; + if ((val & GEM_MII_CONTROL_RESET) == 0) + break; + GEM_BANK1_WRITE_4(sc, GEM_MII_CONTROL, val); + GEM_BANK1_BARRIER(sc, GEM_MII_CONTROL, 4, + BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE); + if (!GEM_BANK1_BITWAIT(sc, GEM_MII_CONTROL, + GEM_MII_CONTROL_RESET, 0)) + device_printf(sc->sc_dev, + "cannot reset PCS\n"); + /* FALLTHROUGH */ case MII_ANAR: GEM_BANK1_WRITE_4(sc, GEM_MII_CONFIG, 0); GEM_BANK1_BARRIER(sc, GEM_MII_CONFIG, 4, @@ -1877,6 +1872,8 @@ (val & GEM_MIF_FRAME_DATA); GEM_BANK1_WRITE_4(sc, GEM_MIF_FRAME, v); + GEM_BANK1_BARRIER(sc, GEM_MIF_FRAME, 4, + BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE); for (n = 0; n < 100; n++) { DELAY(1); v = GEM_BANK1_READ_4(sc, GEM_MIF_FRAME); @@ -1937,12 +1934,14 @@ txcfg |= GEM_MAC_TX_CARR_EXTEND; } GEM_BANK1_WRITE_4(sc, GEM_MAC_TX_CONFIG, 0); - GEM_BANK1_BARRIER(sc, GEM_MAC_TX_CONFIG, 4, BUS_SPACE_BARRIER_WRITE); + GEM_BANK1_BARRIER(sc, GEM_MAC_TX_CONFIG, 4, + BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE); if (!GEM_BANK1_BITWAIT(sc, GEM_MAC_TX_CONFIG, GEM_MAC_TX_ENABLE, 0)) device_printf(sc->sc_dev, "cannot disable TX MAC\n"); GEM_BANK1_WRITE_4(sc, GEM_MAC_TX_CONFIG, txcfg); GEM_BANK1_WRITE_4(sc, GEM_MAC_RX_CONFIG, 0); - GEM_BANK1_BARRIER(sc, GEM_MAC_RX_CONFIG, 4, BUS_SPACE_BARRIER_WRITE); + GEM_BANK1_BARRIER(sc, GEM_MAC_RX_CONFIG, 4, + BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE); if (!GEM_BANK1_BITWAIT(sc, GEM_MAC_RX_CONFIG, GEM_MAC_RX_ENABLE, 0)) device_printf(sc->sc_dev, "cannot disable RX MAC\n"); GEM_BANK1_WRITE_4(sc, GEM_MAC_RX_CONFIG, rxcfg); @@ -2110,7 +2109,8 @@ GEM_MAC_RX_PROMISC_GRP); GEM_BANK1_WRITE_4(sc, GEM_MAC_RX_CONFIG, v); - GEM_BANK1_BARRIER(sc, GEM_MAC_RX_CONFIG, 4, BUS_SPACE_BARRIER_WRITE); + GEM_BANK1_BARRIER(sc, GEM_MAC_RX_CONFIG, 4, + BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE); if (!GEM_BANK1_BITWAIT(sc, GEM_MAC_RX_CONFIG, GEM_MAC_RX_HASH_FILTER, 0)) device_printf(sc->sc_dev, "cannot disable RX hash filter\n"); ==== //depot/projects/soc2008/diego-audit/src/sys/fs/devfs/devfs_rule.c#2 (text+ko) ==== @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/fs/devfs/devfs_rule.c,v 1.24 2008/03/20 16:08:42 kib Exp $ + * $FreeBSD: src/sys/fs/devfs/devfs_rule.c,v 1.25 2008/06/22 14:34:38 gonzo Exp $ */ /* @@ -735,15 +735,15 @@ { struct devfs_ruleset *cds, *ds; - ds = devfs_ruleset_bynum(rsnum); - if (ds == NULL) - ds = devfs_ruleset_create(rsnum); if (dm->dm_ruleset != 0) { cds = devfs_ruleset_bynum(dm->dm_ruleset); --cds->ds_refcount; devfs_ruleset_reap(cds); } + ds = devfs_ruleset_bynum(rsnum); + if (ds == NULL) + ds = devfs_ruleset_create(rsnum); /* These should probably be made atomic somehow. */ ++ds->ds_refcount; dm->dm_ruleset = rsnum; ==== //depot/projects/soc2008/diego-audit/src/sys/netinet/libalias/alias.c#4 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/netinet/libalias/alias.c,v 1.63 2008/06/01 17:52:40 mav Exp $"); +__FBSDID("$FreeBSD: src/sys/netinet/libalias/alias.c,v 1.64 2008/06/21 20:18:57 mav Exp $"); /* Alias.c provides supervisory control for the functions of the @@ -271,7 +271,7 @@ int create); static int UdpAliasIn(struct libalias *, struct ip *); -static int UdpAliasOut(struct libalias *, struct ip *, int create); +static int UdpAliasOut(struct libalias *, struct ip *, int, int create); static int TcpAliasIn(struct libalias *, struct ip *); static int TcpAliasOut(struct libalias *, struct ip *, int, int create); @@ -717,19 +717,18 @@ struct alias_link *lnk; LIBALIAS_LOCK_ASSERT(la); -/* Return if proxy-only mode is enabled */ - if (la->packetAliasMode & PKT_ALIAS_PROXY_ONLY) - return (PKT_ALIAS_OK); ud = (struct udphdr *)ip_next(pip); lnk = FindUdpTcpIn(la, pip->ip_src, pip->ip_dst, ud->uh_sport, ud->uh_dport, - IPPROTO_UDP, 1); + IPPROTO_UDP, !(la->packetAliasMode & PKT_ALIAS_PROXY_ONLY)); if (lnk != NULL) { struct in_addr alias_address; struct in_addr original_address; + struct in_addr proxy_address; u_short alias_port; + u_short proxy_port; int accumulate; int r = 0, error; struct alias_data ad = { @@ -744,8 +743,10 @@ alias_address = GetAliasAddress(lnk); original_address = GetOriginalAddress(lnk); + proxy_address = GetProxyAddress(lnk); alias_port = ud->uh_dport; ud->uh_dport = GetOriginalPort(lnk); + proxy_port = GetProxyPort(lnk); /* Walk out chain. */ error = find_handler(IN, UDP, la, pip, &ad); @@ -757,8 +758,32 @@ accumulate -= ud->uh_dport; accumulate += twowords(&alias_address); accumulate -= twowords(&original_address); + +/* If this is a proxy packet, modify checksum because of source change.*/ + if (proxy_port != 0) { + accumulate += ud->uh_sport; + accumulate -= proxy_port; + } + + if (proxy_address.s_addr != 0) { + accumulate += twowords(&pip->ip_src); + accumulate -= twowords(&proxy_address); + } + ADJUST_CHECKSUM(accumulate, ud->uh_sum); } +/* XXX: Could the two if's below be concatenated to one ? */ +/* Restore source port and/or address in case of proxying*/ + + if (proxy_port != 0) + ud->uh_sport = proxy_port; + + if (proxy_address.s_addr != 0) { + DifferentialChecksum(&pip->ip_sum, + &proxy_address, &pip->ip_src, 2); + pip->ip_src = proxy_address; + } + /* Restore original IP address */ DifferentialChecksum(&pip->ip_sum, &original_address, &pip->ip_dst, 2); @@ -776,19 +801,50 @@ } static int -UdpAliasOut(struct libalias *la, struct ip *pip, int create) +UdpAliasOut(struct libalias *la, struct ip *pip, int maxpacketsize, int create) { struct udphdr *ud; struct alias_link *lnk; + struct in_addr dest_address; + struct in_addr proxy_server_address; + u_short dest_port; + u_short proxy_server_port; + int proxy_type; int error; LIBALIAS_LOCK_ASSERT(la); -/* Return if proxy-only mode is enabled */ - if (la->packetAliasMode & PKT_ALIAS_PROXY_ONLY) + +/* Return if proxy-only mode is enabled and not proxyrule found.*/ + ud = (struct udphdr *)ip_next(pip); + proxy_type = ProxyCheck(la, &proxy_server_address, + &proxy_server_port, pip->ip_src, pip->ip_dst, + ud->uh_dport, pip->ip_p); + if (proxy_type == 0 && (la->packetAliasMode & PKT_ALIAS_PROXY_ONLY)) return (PKT_ALIAS_OK); - ud = (struct udphdr *)ip_next(pip); +/* If this is a transparent proxy, save original destination, + * then alter the destination and adjust checksums */ + dest_port = ud->uh_dport; + dest_address = pip->ip_dst; + + if (proxy_type != 0) { + int accumulate; + + accumulate = twowords(&pip->ip_dst); + accumulate -= twowords(&proxy_server_address); + + ADJUST_CHECKSUM(accumulate, pip->ip_sum); + if (ud->uh_sum != 0) { + accumulate = twowords(&pip->ip_dst); + accumulate -= twowords(&proxy_server_address); + accumulate += ud->uh_dport; + accumulate -= proxy_server_port; + ADJUST_CHECKSUM(accumulate, ud->uh_sum); + } + pip->ip_dst = proxy_server_address; + ud->uh_dport = proxy_server_port; + } lnk = FindUdpTcpOut(la, pip->ip_src, pip->ip_dst, ud->uh_sport, ud->uh_dport, IPPROTO_UDP, create); @@ -805,6 +861,16 @@ .maxpktsize = 0 }; +/* Save original destination address, if this is a proxy packet. + * Also modify packet to include destination encoding. This may + * change the size of IP header. */ + if (proxy_type != 0) { + SetProxyPort(lnk, dest_port); + SetProxyAddress(lnk, dest_address); + ProxyModify(la, lnk, pip, maxpacketsize, proxy_type); + ud = (struct udphdr *)ip_next(pip); + } + alias_address = GetAliasAddress(lnk); alias_port = GetAliasPort(lnk); @@ -1409,7 +1475,7 @@ iresult = IcmpAliasOut(la, pip, create); break; case IPPROTO_UDP: - iresult = UdpAliasOut(la, pip, create); + iresult = UdpAliasOut(la, pip, maxpacketsize, create); break; case IPPROTO_TCP: iresult = TcpAliasOut(la, pip, maxpacketsize, create); ==== //depot/projects/soc2008/diego-audit/src/sys/netinet/libalias/alias_db.c#3 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/netinet/libalias/alias_db.c,v 1.73 2008/06/01 18:34:58 mav Exp $"); +__FBSDID("$FreeBSD: src/sys/netinet/libalias/alias_db.c,v 1.74 2008/06/22 11:39:42 mav Exp $"); /* Alias_db.c encapsulates all data structures used for storing @@ -819,8 +819,12 @@ LIBALIAS_LOCK_ASSERT(la); for (i = 0; i < LINK_TABLE_OUT_SIZE; i++) { - while ((lnk = LIST_FIRST(&la->linkTableOut[i])) != NULL) + lnk = LIST_FIRST(&la->linkTableOut[i]); + while (lnk != NULL) { + struct alias_link *link_next = LIST_NEXT(lnk, list_out); DeleteLink(lnk); + lnk = link_next; + } } la->cleanupIndex = 0; ==== //depot/projects/soc2008/diego-audit/src/sys/netinet/libalias/alias_ftp.c#2 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/netinet/libalias/alias_ftp.c,v 1.30 2008/03/06 21:50:40 piso Exp $"); +__FBSDID("$FreeBSD: src/sys/netinet/libalias/alias_ftp.c,v 1.31 2008/06/21 16:22:56 mav Exp $"); /* Alias_ftp.c performs special processing for FTP sessions under @@ -270,36 +270,14 @@ if (dlen < 18) return (0); + if (strncasecmp("PORT ", sptr, 5)) + return (0); + addr = port = octet = 0; - state = -4; - for (i = 0; i < dlen; i++) { + state = 0; + for (i = 5; i < dlen; i++) { ch = sptr[i]; switch (state) { - case -4: - if (ch == 'P') - state++; - else - return (0); - break; - case -3: - if (ch == 'O') - state++; - else - return (0); - break; - case -2: - if (ch == 'R') - state++; - else - return (0); - break; - case -1: - if (ch == 'T') - state++; - else - return (0); - break; - case 0: if (isspace(ch)) break; @@ -365,37 +343,15 @@ if (dlen < 18) return (0); + if (strncasecmp("EPRT ", sptr, 5)) + return (0); + addr = port = octet = 0; delim = '|'; /* XXX gcc -Wuninitialized */ - state = -4; - for (i = 0; i < dlen; i++) { + state = 0; + for (i = 5; i < dlen; i++) { ch = sptr[i]; switch (state) { - case -4: - if (ch == 'E') - state++; - else - return (0); - break; - case -3: - if (ch == 'P') - state++; - else - return (0); - break; - case -2: - if (ch == 'R') - state++; - else - return (0); - break; - case -1: - if (ch == 'T') - state++; - else - return (0); - break; - case 0: if (!isspace(ch)) { delim = ch; @@ -477,31 +433,15 @@ if (dlen < 17) return (0); + if (strncmp("227 ", sptr, 4)) + return (0); + addr = port = octet = 0; - state = -3; - for (i = 0; i < dlen; i++) { + state = 0; + for (i = 4; i < dlen; i++) { ch = sptr[i]; switch (state) { - case -3: - if (ch == '2') - state++; - else - return (0); - break; - case -2: - if (ch == '2') - state++; - else - return (0); - break; - case -1: - if (ch == '7') - state++; - else - return (0); - break; - case 0: if (ch == '(') state++; @@ -564,32 +504,16 @@ if (dlen < 11) return (0); + if (strncmp("229 ", sptr, 4)) + return (0); + port = 0; delim = '|'; /* XXX gcc -Wuninitialized */ - state = -3; - for (i = 0; i < dlen; i++) { + state = 0; + for (i = 4; i < dlen; i++) { ch = sptr[i]; switch (state) { - case -3: - if (ch == '2') - state++; - else - return (0); - break; - case -2: - if (ch == '2') - state++; - else - return (0); - break; - case -1: - if (ch == '9') - state++; - else - return (0); - break; - case 0: if (ch == '(') state++; @@ -689,6 +613,7 @@ alias_port = GetAliasPort(ftp_lnk); +/* Prepare new command */ switch (ftp_message_type) { case FTP_PORT_COMMAND: case FTP_227_REPLY: ==== //depot/projects/soc2008/diego-audit/src/sys/vm/vm_kern.c#4 (text+ko) ==== @@ -63,7 +63,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/vm/vm_kern.c,v 1.134 2008/05/10 21:46:20 alc Exp $"); +__FBSDID("$FreeBSD: src/sys/vm/vm_kern.c,v 1.135 2008/06/22 04:54:27 alc Exp $"); #include #include @@ -497,8 +497,12 @@ /* N.B.: cannot use kgdb to debug, starting with this assignment ... */ kernel_map = m; (void) vm_map_insert(m, NULL, (vm_ooffset_t) 0, - VM_MIN_KERNEL_ADDRESS, start, VM_PROT_ALL, VM_PROT_ALL, - MAP_NOFAULT); +#ifdef __amd64__ + KERNBASE, +#else + VM_MIN_KERNEL_ADDRESS, +#endif + start, VM_PROT_ALL, VM_PROT_ALL, MAP_NOFAULT); /* ... and ending with the completion of the above `insert' */ vm_map_unlock(m); } ==== //depot/projects/soc2008/diego-audit/src/sys/vm/vm_map.c#4 (text+ko) ==== @@ -63,7 +63,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/vm/vm_map.c,v 1.396 2008/05/10 18:55:35 alc Exp $"); +__FBSDID("$FreeBSD: src/sys/vm/vm_map.c,v 1.397 2008/06/21 21:02:13 alc Exp $"); #include #include @@ -294,7 +294,7 @@ vm_init2(void) { uma_zone_set_obj(kmapentzone, &kmapentobj, lmin(cnt.v_page_count, - (VM_MAX_KERNEL_ADDRESS - KERNBASE) / PAGE_SIZE) / 8 + + (VM_MAX_KERNEL_ADDRESS - VM_MIN_KERNEL_ADDRESS) / PAGE_SIZE) / 8 + maxproc * 2 + maxfiles); vmspace_zone = uma_zcreate("VMSPACE", sizeof(struct vmspace), NULL, #ifdef INVARIANTS