Date: Thu, 1 Sep 2005 18:04:34 GMT From: Robert Watson <rwatson@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 82970 for review Message-ID: <200509011804.j81I4YGg043291@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=82970 Change 82970 by rwatson@rwatson_zoo on 2005/09/01 18:03:35 Integrate netsmp: - amd64 NMI fixes - amd64 pmap fixes - linux ifioctl fixes to avoid holding mutex over uiomove - De-MT_HEADER - De-if_el - g_label_ntfs - if_ed locking fixes, MPSAFEty - md_mtx - if_txp fixes - more KTR_GEOM - various gvinum fixes - m_demote(), m_sanity() - m_bcopyxxx(), m_copymdata() - much if_de general fixage, locking fixes, - if_ste locking fixes Affected files ... .. //depot/projects/netsmp/src/sys/amd64/amd64/db_trace.c#3 integrate .. //depot/projects/netsmp/src/sys/amd64/amd64/exception.S#2 integrate .. //depot/projects/netsmp/src/sys/amd64/amd64/genassym.c#2 integrate .. //depot/projects/netsmp/src/sys/amd64/amd64/pmap.c#5 integrate .. //depot/projects/netsmp/src/sys/amd64/amd64/trap.c#2 integrate .. //depot/projects/netsmp/src/sys/boot/forth/loader.conf#5 integrate .. //depot/projects/netsmp/src/sys/compat/linux/linux_ioctl.c#4 integrate .. //depot/projects/netsmp/src/sys/compat/ndis/kern_ndis.c#2 integrate .. //depot/projects/netsmp/src/sys/conf/files#7 integrate .. //depot/projects/netsmp/src/sys/conf/files.i386#3 integrate .. //depot/projects/netsmp/src/sys/dev/acpica/acpi_thermal.c#5 integrate .. //depot/projects/netsmp/src/sys/dev/ata/ata-all.c#4 integrate .. //depot/projects/netsmp/src/sys/dev/ata/ata-chipset.c#5 integrate .. //depot/projects/netsmp/src/sys/dev/ata/ata-pci.h#5 integrate .. //depot/projects/netsmp/src/sys/dev/ed/if_ed.c#6 integrate .. //depot/projects/netsmp/src/sys/dev/ed/if_ed_3c503.c#2 integrate .. //depot/projects/netsmp/src/sys/dev/ed/if_ed_cbus.c#2 integrate .. //depot/projects/netsmp/src/sys/dev/ed/if_ed_hpp.c#2 integrate .. //depot/projects/netsmp/src/sys/dev/ed/if_ed_isa.c#2 integrate .. //depot/projects/netsmp/src/sys/dev/ed/if_ed_novell.c#2 integrate .. //depot/projects/netsmp/src/sys/dev/ed/if_ed_pccard.c#2 integrate .. //depot/projects/netsmp/src/sys/dev/ed/if_ed_pci.c#2 integrate .. //depot/projects/netsmp/src/sys/dev/ed/if_ed_sic.c#2 integrate .. //depot/projects/netsmp/src/sys/dev/ed/if_ed_wd80x3.c#2 integrate .. //depot/projects/netsmp/src/sys/dev/ed/if_edvar.h#2 integrate .. //depot/projects/netsmp/src/sys/dev/ep/if_ep_eisa.c#2 integrate .. //depot/projects/netsmp/src/sys/dev/fdc/fdc.c#2 integrate .. //depot/projects/netsmp/src/sys/dev/gem/if_gem.c#8 integrate .. //depot/projects/netsmp/src/sys/dev/hwpmc/hwpmc_amd.c#3 integrate .. //depot/projects/netsmp/src/sys/dev/md/md.c#3 integrate .. //depot/projects/netsmp/src/sys/dev/pccard/pccarddevs#2 integrate .. //depot/projects/netsmp/src/sys/dev/pci/pci.c#2 integrate .. //depot/projects/netsmp/src/sys/dev/pci/pci_pci.c#2 integrate .. //depot/projects/netsmp/src/sys/dev/pci/pci_user.c#2 integrate .. //depot/projects/netsmp/src/sys/dev/syscons/scmouse.c#2 integrate .. //depot/projects/netsmp/src/sys/dev/syscons/scvesactl.c#2 integrate .. //depot/projects/netsmp/src/sys/dev/syscons/scvidctl.c#2 integrate .. //depot/projects/netsmp/src/sys/dev/syscons/syscons.c#2 integrate .. //depot/projects/netsmp/src/sys/dev/syscons/syscons.h#2 integrate .. //depot/projects/netsmp/src/sys/dev/txp/if_txp.c#6 integrate .. //depot/projects/netsmp/src/sys/dev/wi/if_wi.c#10 integrate .. //depot/projects/netsmp/src/sys/fs/devfs/devfs_vnops.c#5 integrate .. //depot/projects/netsmp/src/sys/geom/geom_io.c#3 integrate .. //depot/projects/netsmp/src/sys/geom/label/g_label.c#4 integrate .. //depot/projects/netsmp/src/sys/geom/label/g_label.h#3 integrate .. //depot/projects/netsmp/src/sys/geom/label/g_label_iso9660.c#2 integrate .. //depot/projects/netsmp/src/sys/geom/label/g_label_ntfs.c#1 branch .. //depot/projects/netsmp/src/sys/geom/vinum/geom_vinum_drive.c#3 integrate .. //depot/projects/netsmp/src/sys/geom/vinum/geom_vinum_init.c#2 integrate .. //depot/projects/netsmp/src/sys/i386/conf/NOTES#4 integrate .. //depot/projects/netsmp/src/sys/i386/i386/pmap.c#6 integrate .. //depot/projects/netsmp/src/sys/i386/isa/if_el.c#5 delete .. //depot/projects/netsmp/src/sys/i386/isa/if_elreg.h#2 delete .. //depot/projects/netsmp/src/sys/kern/kern_cpu.c#4 integrate .. //depot/projects/netsmp/src/sys/kern/kern_descrip.c#2 integrate .. //depot/projects/netsmp/src/sys/kern/kern_lock.c#3 integrate .. //depot/projects/netsmp/src/sys/kern/link_elf.c#2 integrate .. //depot/projects/netsmp/src/sys/kern/link_elf_obj.c#2 integrate .. //depot/projects/netsmp/src/sys/kern/subr_stack.c#2 integrate .. //depot/projects/netsmp/src/sys/kern/uipc_mbuf.c#3 integrate .. //depot/projects/netsmp/src/sys/kern/vfs_subr.c#7 integrate .. //depot/projects/netsmp/src/sys/modules/Makefile#3 integrate .. //depot/projects/netsmp/src/sys/modules/de/Makefile#3 integrate .. //depot/projects/netsmp/src/sys/modules/el/Makefile#2 delete .. //depot/projects/netsmp/src/sys/modules/geom/geom_label/Makefile#3 integrate .. //depot/projects/netsmp/src/sys/modules/geom/geom_vinum/Makefile#2 integrate .. //depot/projects/netsmp/src/sys/net/if_bridge.c#8 integrate .. //depot/projects/netsmp/src/sys/net/if_vlan.c#8 integrate .. //depot/projects/netsmp/src/sys/net/if_vlan_var.h#2 integrate .. //depot/projects/netsmp/src/sys/net80211/ieee80211_ioctl.c#8 integrate .. //depot/projects/netsmp/src/sys/netatalk/ddp_output.c#2 integrate .. //depot/projects/netsmp/src/sys/netgraph/bluetooth/include/ng_l2cap.h#2 integrate .. //depot/projects/netsmp/src/sys/netgraph/bluetooth/l2cap/ng_l2cap_cmds.c#2 integrate .. //depot/projects/netsmp/src/sys/netgraph/bluetooth/l2cap/ng_l2cap_misc.c#3 integrate .. //depot/projects/netsmp/src/sys/netgraph/netgraph.h#5 integrate .. //depot/projects/netsmp/src/sys/netgraph/ng_base.c#4 integrate .. //depot/projects/netsmp/src/sys/netgraph/ng_fec.c#5 integrate .. //depot/projects/netsmp/src/sys/netgraph/ng_pptpgre.c#2 integrate .. //depot/projects/netsmp/src/sys/netgraph/ng_split.c#2 integrate .. //depot/projects/netsmp/src/sys/netinet/if_atm.c#3 integrate .. //depot/projects/netsmp/src/sys/netinet/ip_input.c#4 integrate .. //depot/projects/netsmp/src/sys/netinet/ip_output.c#8 integrate .. //depot/projects/netsmp/src/sys/netinet/tcp_subr.c#3 integrate .. //depot/projects/netsmp/src/sys/netinet/tcp_syncache.c#2 integrate .. //depot/projects/netsmp/src/sys/netinet6/ip6_output.c#5 integrate .. //depot/projects/netsmp/src/sys/pci/if_dc.c#8 integrate .. //depot/projects/netsmp/src/sys/pci/if_de.c#10 integrate .. //depot/projects/netsmp/src/sys/pci/if_devar.h#5 integrate .. //depot/projects/netsmp/src/sys/pci/if_pcn.c#9 integrate .. //depot/projects/netsmp/src/sys/pci/if_ste.c#7 integrate .. //depot/projects/netsmp/src/sys/pci/if_stereg.h#3 integrate .. //depot/projects/netsmp/src/sys/pci/if_wb.c#6 integrate .. //depot/projects/netsmp/src/sys/pci/if_wbreg.h#2 integrate .. //depot/projects/netsmp/src/sys/sys/mbuf.h#3 integrate .. //depot/projects/netsmp/src/sys/sys/param.h#4 integrate .. //depot/projects/netsmp/src/sys/sys/stack.h#2 integrate Differences ... ==== //depot/projects/netsmp/src/sys/amd64/amd64/db_trace.c#3 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/amd64/amd64/db_trace.c,v 1.68 2005/08/03 04:33:48 jeff Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/amd64/db_trace.c,v 1.69 2005/08/27 16:03:39 jkoshy Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -317,7 +317,8 @@ db_symbol_values(sym, &name, NULL); if (name != NULL) { if (strcmp(name, "calltrap") == 0 || - strcmp(name, "fork_trampoline") == 0) + strcmp(name, "fork_trampoline") == 0 || + strcmp(name, "nmi_calltrap") == 0) frame_type = TRAP; else if (strncmp(name, "Xatpic_intr", 11) == 0 || strncmp(name, "Xatpic_fastintr", 15) == 0 || ==== //depot/projects/netsmp/src/sys/amd64/amd64/exception.S#2 (text+ko) ==== @@ -27,7 +27,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/amd64/amd64/exception.S,v 1.125 2005/06/30 00:26:54 peter Exp $ + * $FreeBSD: src/sys/amd64/amd64/exception.S,v 1.127 2005/08/27 16:03:40 jkoshy Exp $ */ #include "opt_atpic.h" @@ -93,8 +93,6 @@ jmp alltraps IDTVEC(div) TRAP(T_DIVIDE) -IDTVEC(nmi) - TRAP(T_NMI) IDTVEC(ofl) TRAP(T_OFLOW) IDTVEC(bnd) @@ -313,6 +311,82 @@ IDTVEC(fast_syscall32) sysret +/* + * NMI handling is special. + * + * First, NMIs do not respect the state of the processor's RFLAGS.IF + * bit and the NMI handler may be invoked at any time, including when + * the processor is in a critical section with RFLAGS.IF == 0. In + * particular, this means that the processor's GS.base values could be + * inconsistent on entry to the handler, and so we need to read + * MSR_GSBASE to determine if a 'swapgs' is needed. We use '%ebx', a + * C-preserved register, to remember whether to swap GS back on the + * exit path. + * + * Second, the processor treats NMIs specially, blocking further NMIs + * until an 'iretq' instruction is executed. We therefore need to + * execute the NMI handler with interrupts disabled to prevent a + * nested interrupt from executing an 'iretq' instruction and + * inadvertently taking the processor out of NMI mode. + */ + +IDTVEC(nmi) + subq $TF_RIP,%rsp + movq $(T_NMI),TF_TRAPNO(%rsp) + movq $0,TF_ADDR(%rsp) + movq $0,TF_ERR(%rsp) + movq %rdi,TF_RDI(%rsp) + movq %rsi,TF_RSI(%rsp) + movq %rdx,TF_RDX(%rsp) + movq %rcx,TF_RCX(%rsp) + movq %r8,TF_R8(%rsp) + movq %r9,TF_R9(%rsp) + movq %rax,TF_RAX(%rsp) + movq %rbx,TF_RBX(%rsp) + movq %rbp,TF_RBP(%rsp) + movq %r10,TF_R10(%rsp) + movq %r11,TF_R11(%rsp) + movq %r12,TF_R12(%rsp) + movq %r13,TF_R13(%rsp) + movq %r14,TF_R14(%rsp) + movq %r15,TF_R15(%rsp) + xorl %ebx,%ebx + testb $SEL_RPL_MASK,TF_CS(%rsp) + jnz nmi_needswapgs /* we came from userland */ + movl $MSR_GSBASE,%ecx + rdmsr + cmpl $VM_MAXUSER_ADDRESS >> 32,%edx + jae nmi_calltrap /* GS.base holds a kernel VA */ +nmi_needswapgs: + incl %ebx + swapgs +/* Note: this label is also used by ddb and gdb: */ +nmi_calltrap: + FAKE_MCOUNT(TF_RIP(%rsp)) + call trap + MEXITCOUNT + testl %ebx,%ebx + jz nmi_restoreregs + swapgs +nmi_restoreregs: + movq TF_RDI(%rsp),%rdi + movq TF_RSI(%rsp),%rsi + movq TF_RDX(%rsp),%rdx + movq TF_RCX(%rsp),%rcx + movq TF_R8(%rsp),%r8 + movq TF_R9(%rsp),%r9 + movq TF_RAX(%rsp),%rax + movq TF_RBX(%rsp),%rbx + movq TF_RBP(%rsp),%rbp + movq TF_R10(%rsp),%r10 + movq TF_R11(%rsp),%r11 + movq TF_R12(%rsp),%r12 + movq TF_R13(%rsp),%r13 + movq TF_R14(%rsp),%r14 + movq TF_R15(%rsp),%r15 + addq $TF_RIP,%rsp + iretq + ENTRY(fork_trampoline) movq %r12, %rdi /* function */ movq %rbx, %rsi /* arg1 */ ==== //depot/projects/netsmp/src/sys/amd64/amd64/genassym.c#2 (text+ko) ==== @@ -33,7 +33,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/amd64/amd64/genassym.c,v 1.155 2004/11/20 02:30:59 das Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/amd64/genassym.c,v 1.156 2005/08/27 16:03:40 jkoshy Exp $"); #include "opt_compat.h" #include "opt_kstack_pages.h" @@ -209,3 +209,5 @@ ASSYM(MTX_LOCK, offsetof(struct mtx, mtx_lock)); ASSYM(MTX_RECURSECNT, offsetof(struct mtx, mtx_recurse)); + +ASSYM(MSR_GSBASE, MSR_GSBASE); ==== //depot/projects/netsmp/src/sys/amd64/amd64/pmap.c#5 (text+ko) ==== @@ -7,6 +7,8 @@ * All rights reserved. * Copyright (c) 2003 Peter Wemm * All rights reserved. + * Copyright (c) 2005 Alan L. Cox <alc@cs.rice.edu> + * All rights reserved. * * This code is derived from software contributed to Berkeley by * the Systems Programming Group of the University of Utah Computer @@ -75,7 +77,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.525 2005/08/22 20:02:40 alc Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.526 2005/08/26 05:18:46 alc Exp $"); /* * Manages physical address maps. @@ -210,6 +212,7 @@ vm_offset_t va); static void pmap_insert_entry(pmap_t pmap, vm_offset_t va, vm_page_t m); +static vm_page_t pmap_allocpde(pmap_t pmap, vm_offset_t va, int flags); static vm_page_t pmap_allocpte(pmap_t pmap, vm_offset_t va, int flags); static vm_page_t _pmap_allocpte(pmap_t pmap, vm_pindex_t ptepindex, int flags); @@ -1242,6 +1245,33 @@ } static vm_page_t +pmap_allocpde(pmap_t pmap, vm_offset_t va, int flags) +{ + vm_pindex_t pdpindex, ptepindex; + pdp_entry_t *pdpe; + vm_page_t pdpg; + + KASSERT((flags & (M_NOWAIT | M_WAITOK)) == M_NOWAIT || + (flags & (M_NOWAIT | M_WAITOK)) == M_WAITOK, + ("pmap_allocpde: flags is neither M_NOWAIT nor M_WAITOK")); +retry: + pdpe = pmap_pdpe(pmap, va); + if (pdpe != NULL && (*pdpe & PG_V) != 0) { + /* Add a reference to the pd page. */ + pdpg = PHYS_TO_VM_PAGE(*pdpe & PG_FRAME); + pdpg->wire_count++; + } else { + /* Allocate a pd page. */ + ptepindex = pmap_pde_pindex(va); + pdpindex = ptepindex >> NPDPEPGSHIFT; + pdpg = _pmap_allocpte(pmap, NUPDE + pdpindex, flags); + if (pdpg == NULL && (flags & M_WAITOK)) + goto retry; + } + return (pdpg); +} + +static vm_page_t pmap_allocpte(pmap_t pmap, vm_offset_t va, int flags) { vm_pindex_t ptepindex; @@ -1269,6 +1299,8 @@ if (pd != 0 && (*pd & (PG_PS | PG_V)) == (PG_PS | PG_V)) { *pd = 0; pd = 0; + pmap->pm_stats.resident_count -= NBPDR / PAGE_SIZE; + pmap_unuse_pt(pmap, va, *pmap_pdpe(pmap, va)); pmap_invalidate_all(kernel_pmap); } @@ -1621,6 +1653,7 @@ if ((ptpaddr & PG_PS) != 0) { *pde = 0; pmap->pm_stats.resident_count -= NBPDR / PAGE_SIZE; + pmap_unuse_pt(pmap, sva, *pdpe); anyvalid = 1; continue; } @@ -2135,15 +2168,14 @@ vm_object_t object, vm_pindex_t pindex, vm_size_t size) { - vm_page_t p; + vm_offset_t va; + vm_page_t p, pdpg; VM_OBJECT_LOCK_ASSERT(object, MA_OWNED); KASSERT(object->type == OBJT_DEVICE, ("pmap_object_init_pt: non-device object")); if (((addr & (NBPDR - 1)) == 0) && ((size & (NBPDR - 1)) == 0)) { - int i; vm_page_t m[1]; - int npdes; pd_entry_t ptepa, *pde; PMAP_LOCK(pmap); @@ -2183,12 +2215,35 @@ p->valid = VM_PAGE_BITS_ALL; PMAP_LOCK(pmap); - pmap->pm_stats.resident_count += size >> PAGE_SHIFT; - npdes = size >> PDRSHIFT; - for(i = 0; i < npdes; i++) { - pde_store(pde, ptepa | PG_U | PG_RW | PG_V | PG_PS); + for (va = addr; va < addr + size; va += NBPDR) { + while ((pdpg = + pmap_allocpde(pmap, va, M_NOWAIT)) == NULL) { + PMAP_UNLOCK(pmap); + vm_page_lock_queues(); + vm_page_busy(p); + vm_page_unlock_queues(); + VM_OBJECT_UNLOCK(object); + VM_WAIT; + VM_OBJECT_LOCK(object); + vm_page_lock_queues(); + vm_page_wakeup(p); + vm_page_unlock_queues(); + PMAP_LOCK(pmap); + } + pde = (pd_entry_t *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS(pdpg)); + pde = &pde[pmap_pde_index(va)]; + if ((*pde & PG_V) == 0) { + pde_store(pde, ptepa | PG_PS | PG_M | PG_A | + PG_U | PG_RW | PG_V); + pmap->pm_stats.resident_count += + NBPDR / PAGE_SIZE; + } else { + pdpg->wire_count--; + KASSERT(pdpg->wire_count > 0, + ("pmap_object_init_pt: missing reference " + "to page directory page, va: 0x%lx", va)); + } ptepa += NBPDR; - pde++; } pmap_invalidate_all(pmap); out: @@ -2262,7 +2317,7 @@ } for (addr = src_addr; addr < end_addr; addr = va_next) { pt_entry_t *src_pte, *dst_pte; - vm_page_t dstmpte, srcmpte; + vm_page_t dstmpde, dstmpte, srcmpte; pml4_entry_t *pml4e; pdp_entry_t *pdpe; pd_entry_t srcptepaddr, *pde; @@ -2299,19 +2354,18 @@ continue; if (srcptepaddr & PG_PS) { - pde = pmap_pde(dst_pmap, addr); - if (pde == 0) { - /* - * XXX should do an allocpte here to - * instantiate the pde - */ - continue; - } + dstmpde = pmap_allocpde(dst_pmap, addr, M_NOWAIT); + if (dstmpde == NULL) + break; + pde = (pd_entry_t *) + PHYS_TO_DMAP(VM_PAGE_TO_PHYS(dstmpde)); + pde = &pde[pmap_pde_index(addr)]; if (*pde == 0) { *pde = srcptepaddr; dst_pmap->pm_stats.resident_count += NBPDR / PAGE_SIZE; - } + } else + pmap_unwire_pte_hold(dst_pmap, addr, dstmpde); continue; } ==== //depot/projects/netsmp/src/sys/amd64/amd64/trap.c#2 (text+ko) ==== @@ -38,7 +38,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/amd64/amd64/trap.c,v 1.289 2005/06/29 23:23:16 peter Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/amd64/trap.c,v 1.290 2005/08/27 16:03:40 jkoshy Exp $"); /* * AMD64 Trap and System call handling @@ -210,7 +210,8 @@ printf( "pid %ld (%s): trap %d with interrupts disabled\n", (long)curproc->p_pid, curproc->p_comm, type); - else if (type != T_BPTFLT && type != T_TRCTRAP) { + else if (type != T_NMI && type != T_BPTFLT && + type != T_TRCTRAP) { /* * XXX not quite right, since this may be for a * multiple fault in user mode. ==== //depot/projects/netsmp/src/sys/boot/forth/loader.conf#5 (text+ko) ==== @@ -6,7 +6,7 @@ # # All arguments must be in double quotes. # -# $FreeBSD: src/sys/boot/forth/loader.conf,v 1.99 2005/08/18 01:39:43 iedowse Exp $ +# $FreeBSD: src/sys/boot/forth/loader.conf,v 1.100 2005/08/31 10:51:55 glebius Exp $ ############################################################## ### Basic configuration options ############################ @@ -108,7 +108,6 @@ #debug.ktr.mask="0x1200" # Bitmask of KTR events to enable #debug.ktr.verbose="1" # Enable console dump of KTR events #net.graph.maxalloc="128" # Maximum number of queue items to allocate -#net.graph.ngqfreemax="64" # Maximum number of free queue items to cache ############################################################## ==== //depot/projects/netsmp/src/sys/compat/linux/linux_ioctl.c#4 (text+ko) ==== @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/compat/linux/linux_ioctl.c,v 1.128 2005/08/09 10:19:41 rwatson Exp $"); +__FBSDID("$FreeBSD: src/sys/compat/linux/linux_ioctl.c,v 1.130 2005/08/28 13:11:08 delphij Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -46,6 +46,7 @@ #include <sys/linker_set.h> #include <sys/malloc.h> #include <sys/proc.h> +#include <sys/sbuf.h> #include <sys/socket.h> #include <sys/sockio.h> #include <sys/soundcard.h> @@ -2130,14 +2131,15 @@ struct l_ifreq ifr; struct ifnet *ifp; struct ifaddr *ifa; - struct iovec iov; - struct uio uio; - int error, ethno; + struct sbuf *sb; + int error, ethno, full = 0, valid_len, max_len; error = copyin(uifc, &ifc, sizeof(ifc)); if (error != 0) return (error); + max_len = MAXPHYS - 1; + /* handle the 'request buffer size' case */ if (ifc.ifc_buf == PTROUT(NULL)) { ifc.ifc_len = 0; @@ -2152,25 +2154,24 @@ return (error); } - /* much easier to use uiomove than keep track ourselves */ - iov.iov_base = PTRIN(ifc.ifc_buf); - iov.iov_len = ifc.ifc_len; - uio.uio_iov = &iov; - uio.uio_iovcnt = 1; - uio.uio_offset = 0; - uio.uio_resid = ifc.ifc_len; - uio.uio_segflg = UIO_USERSPACE; - uio.uio_rw = UIO_READ; - uio.uio_td = td; + if (ifc.ifc_len <= 0) + return (EINVAL); +again: /* Keep track of eth interfaces */ ethno = 0; + if (ifc.ifc_len <= max_len) { + max_len = ifc.ifc_len; + full = 1; + } + sb = sbuf_new(NULL, NULL, max_len + 1, SBUF_FIXEDLEN); + max_len = 0; + valid_len = 0; /* Return all AF_INET addresses of all interfaces */ IFNET_RLOCK(); /* could sleep XXX */ TAILQ_FOREACH(ifp, &ifnet, if_link) { - if (uio.uio_resid <= 0) - break; + int addrs = 0; bzero(&ifr, sizeof(ifr)); if (IFP_IS_ETH(ifp)) @@ -2183,26 +2184,39 @@ TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) { struct sockaddr *sa = ifa->ifa_addr; - if (uio.uio_resid <= 0) - break; - if (sa->sa_family == AF_INET) { ifr.ifr_addr.sa_family = LINUX_AF_INET; memcpy(ifr.ifr_addr.sa_data, sa->sa_data, sizeof(ifr.ifr_addr.sa_data)); + sbuf_bcat(sb, &ifr, sizeof(ifr)); + max_len += sizeof(ifr); + addrs++; + } - error = uiomove(&ifr, sizeof(ifr), &uio); - if (error != 0) { - IFNET_RUNLOCK(); - return (error); - } - } + if (!sbuf_overflowed(sb)) + valid_len = sbuf_len(sb); + } + if (addrs == 0) { + bzero((caddr_t)&ifr.ifr_addr, sizeof(ifr.ifr_addr)); + sbuf_bcat(sb, &ifr, sizeof(ifr)); + max_len += sizeof(ifr); + + if (!sbuf_overflowed(sb)) + valid_len = sbuf_len(sb); } } IFNET_RUNLOCK(); - ifc.ifc_len -= uio.uio_resid; + if (valid_len != max_len && !full) { + sbuf_delete(sb); + goto again; + } + + ifc.ifc_len = valid_len; + sbuf_finish(sb); + memcpy(PTRIN(ifc.ifc_buf), sbuf_data(sb), ifc.ifc_len); error = copyout(&ifc, uifc, sizeof(ifc)); + sbuf_delete(sb); return (error); } ==== //depot/projects/netsmp/src/sys/compat/ndis/kern_ndis.c#2 (text+ko) ==== @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/compat/ndis/kern_ndis.c,v 1.84 2005/06/10 16:49:02 brooks Exp $"); +__FBSDID("$FreeBSD: src/sys/compat/ndis/kern_ndis.c,v 1.85 2005/08/30 16:21:51 andre Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -719,7 +719,7 @@ p, 0, EXT_NDIS); p->np_refcnt++; totlen += m->m_len; - if (m->m_flags & MT_HEADER) + if (m->m_flags & M_PKTHDR) *m0 = m; else prev->m_next = m; ==== //depot/projects/netsmp/src/sys/conf/files#7 (text+ko) ==== @@ -1,4 +1,4 @@ -# $FreeBSD: src/sys/conf/files,v 1.1041 2005/08/12 00:27:44 pjd Exp $ +# $FreeBSD: src/sys/conf/files,v 1.1042 2005/08/26 12:48:34 takawata Exp $ # # The long compile-with and dependency lines are required because of # limitations in config: backslash-newline doesn't work in strings, and @@ -1063,6 +1063,7 @@ geom/label/g_label_ext2fs.c optional geom_label geom/label/g_label_iso9660.c optional geom_label geom/label/g_label_msdosfs.c optional geom_label +geom/label/g_label_ntfs.c optional geom_label geom/label/g_label_reiserfs.c optional geom_label geom/label/g_label_ufs.c optional geom_label geom/mirror/g_mirror.c optional geom_mirror ==== //depot/projects/netsmp/src/sys/conf/files.i386#3 (text+ko) ==== @@ -1,7 +1,7 @@ # This file tells config what files go into building a kernel, # files marked standard are always included. # -# $FreeBSD: src/sys/conf/files.i386,v 1.539 2005/08/18 00:30:22 pjd Exp $ +# $FreeBSD: src/sys/conf/files.i386,v 1.540 2005/08/26 13:42:03 jhb Exp $ # # The long compile-with and dependency lines are required because of # limitations in config: backslash-newline doesn't work in strings, and @@ -321,7 +321,6 @@ i386/isa/elcr.c standard i386/isa/elink.c optional ep i386/isa/elink.c optional ie -i386/isa/if_el.c optional el i386/isa/isa.c optional isa i386/isa/isa_dma.c optional isa i386/isa/nmi.c standard ==== //depot/projects/netsmp/src/sys/dev/acpica/acpi_thermal.c#5 (text+ko) ==== @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_thermal.c,v 1.58 2005/08/25 11:31:30 ume Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_thermal.c,v 1.59 2005/08/26 02:21:02 kan Exp $"); #include "opt_acpi.h" #include <sys/param.h> @@ -423,6 +423,8 @@ int temp; ACPI_STATUS status; + ACPI_FUNCTION_NAME ("acpi_tz_get_temperature"); + status = acpi_GetInteger(sc->tz_handle, "_TMP", &temp); if (ACPI_FAILURE(status)) { ACPI_VPRINT(sc->tz_dev, acpi_device_get_parent_softc(sc->tz_dev), ==== //depot/projects/netsmp/src/sys/dev/ata/ata-all.c#4 (text+ko) ==== @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/dev/ata/ata-all.c,v 1.254 2005/08/17 15:00:33 sos Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/ata/ata-all.c,v 1.256 2005/08/29 18:19:06 sos Exp $"); #include "opt_ata.h" #include <sys/param.h> @@ -615,7 +615,9 @@ atadev->mode = ATA_DMA_MAX; } else { - if (ata_dma && ch->dma) + if (ata_dma && ch->dma && + (ata_umode(&atadev->param) > 0 || + ata_wmode(&atadev->param) > 0)) atadev->mode = ATA_DMA_MAX; } } @@ -794,6 +796,7 @@ ata_mode2str(int mode) { switch (mode) { + case -1: return "UNSUPPORTED"; case ATA_PIO0: return "PIO0"; case ATA_PIO1: return "PIO1"; case ATA_PIO2: return "PIO2"; ==== //depot/projects/netsmp/src/sys/dev/ata/ata-chipset.c#5 (text+ko) ==== @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/dev/ata/ata-chipset.c,v 1.131 2005/08/23 08:53:01 sos Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/ata/ata-chipset.c,v 1.132 2005/08/29 09:01:57 sos Exp $"); #include "opt_ata.h" #include <sys/param.h> @@ -3941,7 +3941,7 @@ static struct ata_chip_id new_ids[] = {{ ATA_VIA6410, 0x00, 0, 0x00, ATA_UDMA6, "VIA 6410" }, { ATA_VIA6420, 0x00, 7, 0x00, ATA_SA150, "VIA 6420" }, - { ATA_VIA6421, 0x00, 6, 0x00, ATA_SA150, "VIA 6421" }, + { ATA_VIA6421, 0x00, 6, VIABAR, ATA_SA150, "VIA 6421" }, { 0, 0, 0, 0, 0, 0 }}; char buffer[64]; @@ -4016,8 +4016,34 @@ struct ata_pci_controller *ctlr = device_get_softc(device_get_parent(dev)); struct ata_channel *ch = device_get_softc(dev); - /* setup the usual register normal pci style */ - ata_pci_allocate(dev); + + /* newer SATA chips has resources in one BAR for each channel */ + if (ctlr->chip->cfg2 & VIABAR) { + struct resource *r_io; + int i, rid; + + rid = PCIR_BAR(ch->unit); + if (!(r_io = bus_alloc_resource_any(device_get_parent(dev), + SYS_RES_IOPORT, + &rid, RF_ACTIVE))) + return ENXIO; + + for (i = ATA_DATA; i <= ATA_COMMAND; i ++) { + ch->r_io[i].res = r_io; + ch->r_io[i].offset = i; + } + ch->r_io[ATA_CONTROL].res = r_io; + ch->r_io[ATA_CONTROL].offset = 2 + ATA_IOSIZE; + ch->r_io[ATA_IDX_ADDR].res = r_io; + ata_default_registers(dev); + for (i = ATA_BMCMD_PORT; i <= ATA_BMDTP_PORT; i++) { + ch->r_io[i].res = ctlr->r_res1; + ch->r_io[i].offset = i - ATA_BMCMD_PORT; + } + ata_generic_hw(dev); + } + else + ata_pci_allocate(dev); ch->r_io[ATA_SSTATUS].res = ctlr->r_res2; ch->r_io[ATA_SSTATUS].offset = (ch->unit << ctlr->chip->cfg1); ==== //depot/projects/netsmp/src/sys/dev/ata/ata-pci.h#5 (text+ko) ==== @@ -25,7 +25,7 @@ * (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: src/sys/dev/ata/ata-pci.h,v 1.52 2005/08/23 08:53:01 sos Exp $ + * $FreeBSD: src/sys/dev/ata/ata-pci.h,v 1.53 2005/08/29 09:01:57 sos Exp $ */ /* structure holding chipset config info */ @@ -355,6 +355,7 @@ #define NV4OFF 0x08 #define VIACLK 0x10 #define VIABUG 0x20 +#define VIABAR 0x40 /* global prototypes ata-pci.c */ ==== //depot/projects/netsmp/src/sys/dev/ed/if_ed.c#6 (text+ko) ==== @@ -26,7 +26,12 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/dev/ed/if_ed.c,v 1.256 2005/08/09 10:19:45 rwatson Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/ed/if_ed.c,v 1.257 2005/08/28 23:56:25 imp Exp $"); + +/* + * TODO: + * o lock MII + */ /* * Device driver for National Semiconductor DS8390/WD83C690 based ethernet @@ -71,12 +76,15 @@ #include <dev/ed/if_edreg.h> #include <dev/ed/if_edvar.h> +#include <sys/kdb.h> devclass_t ed_devclass; static void ed_init(void *); +static void ed_init_locked(struct ed_softc *); static int ed_ioctl(struct ifnet *, u_long, caddr_t); static void ed_start(struct ifnet *); +static void ed_start_locked(struct ifnet *); static void ed_reset(struct ifnet *); static void ed_watchdog(struct ifnet *); #ifndef ED_NO_MIIBUS @@ -85,12 +93,15 @@ static void ed_ds_getmcaf(struct ed_softc *, uint32_t *); -static void ed_get_packet(struct ed_softc *, char *, u_short); +static void ed_get_packet(struct ed_softc *, bus_size_t, u_short); +static void ed_stop_hw(struct ed_softc *sc); -static __inline void ed_rint(struct ed_softc *); -static __inline void ed_xmit(struct ed_softc *); -static __inline char *ed_ring_copy(struct ed_softc *, char *, char *, u_short); -static u_short ed_pio_write_mbufs(struct ed_softc *, struct mbuf *, long); +static __inline void ed_rint(struct ed_softc *); +static __inline void ed_xmit(struct ed_softc *); +static __inline void ed_ring_copy(struct ed_softc *, bus_size_t, char *, + u_short); +static u_short ed_pio_write_mbufs(struct ed_softc *, struct mbuf *, + bus_size_t); static void ed_setrcr(struct ed_softc *); @@ -257,17 +268,31 @@ struct ed_softc *sc = device_get_softc(dev); struct ifnet *ifp; + sc->dev = dev; + ED_LOCK_INIT(sc); ifp = sc->ifp = if_alloc(IFT_ETHER); if (ifp == NULL) { device_printf(dev, "can not if_alloc()\n"); + ED_LOCK_DESTROY(sc); return (ENOSPC); } - callout_handle_init(&sc->tick_ch); + if (sc->readmem == NULL) { + if (sc->mem_shared) { + if (sc->isa16bit) + sc->readmem = ed_shmem_readmem16; + else + sc->readmem = ed_shmem_readmem8; + } else { + sc->readmem = ed_pio_readmem; + } + } + + callout_init_mtx(&sc->tick_ch, ED_MUTEX(sc), 0); /* * Set interface to stopped condition (reset) */ - ed_stop(sc); + ed_stop_hw(sc); /* * Initialize ifnet structure @@ -298,15 +323,11 @@ /* * Set default state for ALTPHYS flag (used to disable the - * tranceiver for AUI operation), based on compile-time - * config option. + * tranceiver for AUI operation), based on config option. */ + ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; if (device_get_flags(dev) & ED_FLAGS_DISABLE_TRANCEIVER) - ifp->if_flags = (IFF_BROADCAST | IFF_SIMPLEX | - IFF_MULTICAST | IFF_ALTPHYS | IFF_NEEDSGIANT); - else - ifp->if_flags = (IFF_BROADCAST | IFF_SIMPLEX | - IFF_MULTICAST | IFF_NEEDSGIANT); + ifp->if_flags |= IFF_ALTPHYS; /* * Attach the interface @@ -331,7 +352,7 @@ printf("%s ", sc->isa16bit ? "(16 bit)" : "(8 bit)"); #if defined(ED_HPP) || defined(ED_3C503) - printf("%s\n", (((sc->vendor == ED_VENDOR_3COM) || + printf("%s", (((sc->vendor == ED_VENDOR_3COM) || (sc->vendor == ED_VENDOR_HP)) && (ifp->if_flags & IFF_ALTPHYS)) ? " tranceiver disabled" : ""); @@ -350,15 +371,18 @@ struct ed_softc *sc = device_get_softc(dev); struct ifnet *ifp = sc->ifp; - if (sc->gone) - return (0); - ed_stop(sc); + ED_ASSERT_UNLOCKED(sc); + ED_LOCK(sc); + if (bus_child_present(dev)) + ed_stop(sc); ifp->if_drv_flags &= ~IFF_DRV_RUNNING; + ED_UNLOCK(sc); + callout_drain(&sc->tick_ch); ether_ifdetach(ifp); if_free(ifp); - sc->gone = 1; bus_teardown_intr(dev, sc->irq_res, sc->irq_handle); ed_release_resources(dev); + ED_LOCK_DESTROY(sc); return (0); } @@ -369,35 +393,20 @@ ed_reset(struct ifnet *ifp) { struct ed_softc *sc = ifp->if_softc; - int s; - if (sc->gone) - return; - s = splimp(); - + ED_ASSERT_LOCKED(sc); /* * Stop interface and re-initialize. */ ed_stop(sc); - ed_init(sc); - - (void) splx(s); + ed_init_locked(sc); } -/* - * Take interface offline. - */ -void -ed_stop(struct ed_softc *sc) +static void +ed_stop_hw(struct ed_softc *sc) { int n = 5000; -#ifndef ED_NO_MIIBUS - untimeout(ed_tick, sc, sc->tick_ch); - callout_handle_init(&sc->tick_ch); -#endif - if (sc->gone) - return; /* * Stop everything on the interface, and select page 0 registers. */ @@ -414,6 +423,19 @@ } /* + * Take interface offline. + */ +void +ed_stop(struct ed_softc *sc) +{ + ED_ASSERT_LOCKED(sc); +#ifndef ED_NO_MIIBUS + callout_stop(&sc->tick_ch); +#endif + ed_stop_hw(sc); +} + +/* * Device timeout/watchdog routine. Entered if the device neglects to * generate an interrupt after a transmit has been started on it. */ @@ -422,12 +444,12 @@ { struct ed_softc *sc = ifp->if_softc; - if (sc->gone) >>> TRUNCATED FOR MAIL (1000 lines) <<<
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200509011804.j81I4YGg043291>