Date: Sun, 28 Mar 2004 06:59:12 -0800 (PST) From: Robert Watson <rwatson@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 49841 for review Message-ID: <200403281459.i2SExCR4017380@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=49841 Change 49841 by rwatson@rwatson_paprika on 2004/03/28 06:58:50 Integ netperf_socket: On alpha, pin interrupt threads to a particular CPU so that PAL access is performed consistently from the same CPU. amd64 feature mask printing. Kernel stack size fixes across various platforms. libthr uses thr_wake() and thr_suspend(). More NDIS hackery. More ACPI hackery. More cpumask changes. Pipe performance optimizations. in_pcb*() accepts creds not threads. Additional IPv6 option handling. Affected files ... .. //depot/projects/netperf_socket/sys/alpha/alpha/interrupt.c#2 integrate .. //depot/projects/netperf_socket/sys/amd64/amd64/identcpu.c#3 integrate .. //depot/projects/netperf_socket/sys/amd64/amd64/vm_machdep.c#4 integrate .. //depot/projects/netperf_socket/sys/amd64/conf/GENERIC#4 integrate .. //depot/projects/netperf_socket/sys/boot/alpha/common/conf.c#2 integrate .. //depot/projects/netperf_socket/sys/boot/i386/boot0/boot0ext.s#1 branch .. //depot/projects/netperf_socket/sys/boot/i386/boot0ext/Makefile#1 branch .. //depot/projects/netperf_socket/sys/compat/freebsd32/freebsd32_proto.h#3 integrate .. //depot/projects/netperf_socket/sys/compat/freebsd32/freebsd32_syscall.h#3 integrate .. //depot/projects/netperf_socket/sys/compat/freebsd32/freebsd32_syscalls.c#3 integrate .. //depot/projects/netperf_socket/sys/compat/freebsd32/freebsd32_sysent.c#3 integrate .. //depot/projects/netperf_socket/sys/compat/freebsd32/syscalls.master#3 integrate .. //depot/projects/netperf_socket/sys/compat/ndis/kern_ndis.c#8 integrate .. //depot/projects/netperf_socket/sys/compat/ndis/subr_ndis.c#6 integrate .. //depot/projects/netperf_socket/sys/compat/ndis/subr_ntoskrnl.c#9 integrate .. //depot/projects/netperf_socket/sys/conf/files.i386#10 integrate .. //depot/projects/netperf_socket/sys/conf/files.powerpc#3 integrate .. //depot/projects/netperf_socket/sys/conf/kern.pre.mk#8 integrate .. //depot/projects/netperf_socket/sys/contrib/dev/acpica/acfreebsd.h#4 integrate .. //depot/projects/netperf_socket/sys/dev/acpica/acpi.c#8 integrate .. //depot/projects/netperf_socket/sys/dev/acpica/acpi_pcib.c#4 integrate .. //depot/projects/netperf_socket/sys/dev/firewire/firewire.c#3 integrate .. //depot/projects/netperf_socket/sys/dev/firewire/firewire.h#2 integrate .. //depot/projects/netperf_socket/sys/dev/firewire/firewirereg.h#2 integrate .. //depot/projects/netperf_socket/sys/dev/firewire/fwcrom.c#2 integrate .. //depot/projects/netperf_socket/sys/dev/firewire/fwdev.c#3 integrate .. //depot/projects/netperf_socket/sys/dev/firewire/fwdma.c#2 integrate .. //depot/projects/netperf_socket/sys/dev/firewire/fwmem.c#2 integrate .. //depot/projects/netperf_socket/sys/dev/firewire/fwohci.c#3 integrate .. //depot/projects/netperf_socket/sys/dev/firewire/fwohci_pci.c#4 integrate .. //depot/projects/netperf_socket/sys/dev/firewire/fwohcivar.h#2 integrate .. //depot/projects/netperf_socket/sys/dev/firewire/if_fwe.c#2 integrate .. //depot/projects/netperf_socket/sys/dev/firewire/sbp.c#2 integrate .. //depot/projects/netperf_socket/sys/dev/firewire/sbp_targ.c#3 integrate .. //depot/projects/netperf_socket/sys/dev/if_ndis/if_ndis.c#6 integrate .. //depot/projects/netperf_socket/sys/dev/ips/ips.h#4 integrate .. //depot/projects/netperf_socket/sys/dev/isp/isp_sbus.c#3 integrate .. //depot/projects/netperf_socket/sys/dev/pccard/pccarddevs#3 integrate .. //depot/projects/netperf_socket/sys/dev/pccard/pccarddevs.h#3 integrate .. //depot/projects/netperf_socket/sys/dev/twe/twe.c#3 integrate .. //depot/projects/netperf_socket/sys/dev/twe/twe_freebsd.c#4 integrate .. //depot/projects/netperf_socket/sys/dev/twe/twevar.h#3 integrate .. //depot/projects/netperf_socket/sys/dev/usb/ohci.c#2 integrate .. //depot/projects/netperf_socket/sys/dev/wi/if_wi_pccard.c#2 integrate .. //depot/projects/netperf_socket/sys/ia64/ia64/vm_machdep.c#3 integrate .. //depot/projects/netperf_socket/sys/kern/init_sysent.c#5 integrate .. //depot/projects/netperf_socket/sys/kern/kern_thr.c#2 integrate .. //depot/projects/netperf_socket/sys/kern/kern_umtx.c#2 integrate .. //depot/projects/netperf_socket/sys/kern/sched_ule.c#4 integrate .. //depot/projects/netperf_socket/sys/kern/subr_bus.c#3 integrate .. //depot/projects/netperf_socket/sys/kern/subr_param.c#3 integrate .. //depot/projects/netperf_socket/sys/kern/subr_smp.c#6 integrate .. //depot/projects/netperf_socket/sys/kern/subr_witness.c#3 integrate .. //depot/projects/netperf_socket/sys/kern/sys_pipe.c#3 integrate .. //depot/projects/netperf_socket/sys/kern/sys_process.c#4 integrate .. //depot/projects/netperf_socket/sys/kern/syscalls.c#5 integrate .. //depot/projects/netperf_socket/sys/kern/syscalls.master#5 integrate .. //depot/projects/netperf_socket/sys/kern/vfs_mount.c#5 integrate .. //depot/projects/netperf_socket/sys/modules/Makefile#6 integrate .. //depot/projects/netperf_socket/sys/modules/netgraph/sppp/Makefile#1 branch .. //depot/projects/netperf_socket/sys/netgraph/ng_sppp.c#1 branch .. //depot/projects/netperf_socket/sys/netgraph/ng_sppp.h#1 branch .. //depot/projects/netperf_socket/sys/netgraph/ng_tee.c#3 integrate .. //depot/projects/netperf_socket/sys/netinet/in_pcb.c#4 integrate .. //depot/projects/netperf_socket/sys/netinet/in_pcb.h#2 integrate .. //depot/projects/netperf_socket/sys/netinet/ip6.h#2 integrate .. //depot/projects/netperf_socket/sys/netinet/ip_divert.c#4 integrate .. //depot/projects/netperf_socket/sys/netinet/ip_output.c#6 integrate .. //depot/projects/netperf_socket/sys/netinet/raw_ip.c#3 integrate .. //depot/projects/netperf_socket/sys/netinet/tcp_syncache.c#5 integrate .. //depot/projects/netperf_socket/sys/netinet/tcp_usrreq.c#4 integrate .. //depot/projects/netperf_socket/sys/netinet/udp_usrreq.c#4 integrate .. //depot/projects/netperf_socket/sys/netinet6/in6_pcb.c#4 integrate .. //depot/projects/netperf_socket/sys/netinet6/in6_pcb.h#3 integrate .. //depot/projects/netperf_socket/sys/netinet6/in6_src.c#3 integrate .. //depot/projects/netperf_socket/sys/netinet6/ip6_output.c#3 integrate .. //depot/projects/netperf_socket/sys/netinet6/raw_ip6.c#3 integrate .. //depot/projects/netperf_socket/sys/netinet6/udp6_output.c#3 integrate .. //depot/projects/netperf_socket/sys/netinet6/udp6_usrreq.c#3 integrate .. //depot/projects/netperf_socket/sys/nfs4client/nfs4_dev.h#2 integrate .. //depot/projects/netperf_socket/sys/nfsclient/nfs.h#4 integrate .. //depot/projects/netperf_socket/sys/nfsclient/nfs_socket.c#4 integrate .. //depot/projects/netperf_socket/sys/nfsclient/nfs_subs.c#3 integrate .. //depot/projects/netperf_socket/sys/pc98/conf/NOTES#5 integrate .. //depot/projects/netperf_socket/sys/pc98/i386/machdep.c#2 integrate .. //depot/projects/netperf_socket/sys/pc98/pc98/fd.c#5 integrate .. //depot/projects/netperf_socket/sys/pci/if_ste.c#5 integrate .. //depot/projects/netperf_socket/sys/powerpc/powerpc/uio_machdep.c#1 branch .. //depot/projects/netperf_socket/sys/rpc/rpcclnt.c#4 integrate .. //depot/projects/netperf_socket/sys/sparc64/ebus/ebus.c#2 integrate .. //depot/projects/netperf_socket/sys/sparc64/sbus/sbus.c#2 integrate .. //depot/projects/netperf_socket/sys/sparc64/sparc64/iommu.c#2 integrate .. //depot/projects/netperf_socket/sys/sparc64/sparc64/vm_machdep.c#3 integrate .. //depot/projects/netperf_socket/sys/sys/param.h#6 integrate .. //depot/projects/netperf_socket/sys/sys/pcpu.h#3 integrate .. //depot/projects/netperf_socket/sys/sys/pipe.h#3 integrate .. //depot/projects/netperf_socket/sys/sys/proc.h#3 integrate .. //depot/projects/netperf_socket/sys/sys/smp.h#2 integrate .. //depot/projects/netperf_socket/sys/sys/syscall.h#5 integrate .. //depot/projects/netperf_socket/sys/sys/syscall.mk#5 integrate .. //depot/projects/netperf_socket/sys/sys/sysproto.h#5 integrate .. //depot/projects/netperf_socket/sys/sys/thr.h#2 integrate .. //depot/projects/netperf_socket/sys/sys/tree.h#3 integrate .. //depot/projects/netperf_socket/sys/vm/vm_map.c#4 integrate Differences ... ==== //depot/projects/netperf_socket/sys/alpha/alpha/interrupt.c#2 (text+ko) ==== @@ -35,7 +35,7 @@ #include <sys/cdefs.h> /* RCS ID & Copyright macro defns */ /* __KERNEL_RCSID(0, "$NetBSD: interrupt.c,v 1.23 1998/02/24 07:38:01 thorpej Exp $");*/ -__FBSDID("$FreeBSD: src/sys/alpha/alpha/interrupt.c,v 1.76 2003/11/17 06:10:14 peter Exp $"); +__FBSDID("$FreeBSD: src/sys/alpha/alpha/interrupt.c,v 1.77 2004/03/23 22:28:16 jhb Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -47,6 +47,7 @@ #include <sys/malloc.h> #include <sys/mutex.h> #include <sys/proc.h> +#include <sys/sched.h> #include <sys/smp.h> #include <sys/unistd.h> #include <sys/vmmeter.h> @@ -447,8 +448,16 @@ "alpha_dispatch_intr: disabling vector 0x%x", i->vector); ithd->it_disable(ithd->it_vector); } - error = ithread_schedule(ithd, 0 /* !cold */); + + /* + * It seems that we need to return from an interrupt back to PAL + * on the same CPU that received the interrupt, so pin the interrupted + * thread to the current CPU until we return from the interrupt. + */ + sched_pin(); + error = ithread_schedule(ithd, !cold); KASSERT(error == 0, ("got an impossible stray interrupt")); + sched_unpin(); } static void ==== //depot/projects/netperf_socket/sys/amd64/amd64/identcpu.c#3 (text+ko) ==== @@ -41,7 +41,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/amd64/amd64/identcpu.c,v 1.129 2004/03/06 00:51:30 peter Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/amd64/identcpu.c,v 1.130 2004/03/25 03:38:31 peter Exp $"); #include "opt_cpu.h" @@ -73,6 +73,7 @@ static void print_AMD_info(void); static void print_AMD_assoc(int i); +int cpu_feature2; /* XXX change cpu_feature to long? */ int cpu_class; u_int cpu_exthigh; /* Highest arg to extended CPUID */ char machine[] = "amd64"; @@ -218,6 +219,44 @@ "\040PBE" /* Pending Break Enable */ ); + if (cpu_feature2 != 0) { + printf("\n Features2=0x%b", cpu_feature2, + "\020" + "\001SSE3" /* SSE3 */ + "\002<b1>" + "\003RSVD2>" /* "Reserved" bit 2 */ + "\004MON" /* MONITOR/MWAIT Instructions */ + "\005DS_CPL" /* CPL Qualified Debug Store */ + "\006<b5>" /* Machine specific registers */ + "\007<b6>" /* Physical address extension */ + "\010EST" /* Enhanced SpeedStep */ + "\011TM2" /* Thermal Monitor 2 */ + "\012<b9>" + "\013CNTX-ID" /* L1 context ID available */ + "\014<b11>" + "\015<b12>" + "\016CX16" /* CMPXCHG16B Instruction */ + "\017<b14>" + "\020<b15>" + "\021<b16>" + "\022<b17>" + "\023<b18>" + "\024<b19>" + "\025<b20>" + "\026<b21>" + "\027<b22>" + "\030<b23>" + "\031<b24>" + "\032<b25>" + "\033<b26>" + "\034<b27>" + "\035<b28>" + "\036<b29>" + "\037<b30>" + "\040<b31>" + ); + } + /* * If this CPU supports hyperthreading then mention * the number of logical CPU's it contains. @@ -227,10 +266,8 @@ printf("\n Hyperthreading: %d logical CPUs", (cpu_procinfo & CPUID_HTT_CORES) >> 16); } - if (strcmp(cpu_vendor, "AuthenticAMD") == 0 && - cpu_exthigh >= 0x80000001) + if (cpu_exthigh >= 0x80000001) print_AMD_features(); - } else if (strcmp(cpu_vendor, "CyrixInstead") == 0) { } /* Avoid ugly blank lines: only print newline when we have to. */ if (*cpu_vendor || cpu_id) @@ -285,6 +322,7 @@ cpu_id = regs[0]; cpu_procinfo = regs[1]; cpu_feature = regs[3]; + cpu_feature2 = regs[2]; /* XXX */ cpu = CPU_CLAWHAMMER; @@ -339,7 +377,7 @@ * http://www.amd.com/products/cpg/athlon/techdocs/pdf/20734.pdf */ do_cpuid(0x80000001, regs); - printf("\n AMD Features=0x%b", regs[3] &~ cpu_feature, + printf("\n AMD Features=0x%b", regs[3] & ~(cpu_feature & 0x0183f3ff), "\020" /* in hex */ "\001FPU" /* Integral FPU */ "\002VME" /* Extended VM86 mode support */ @@ -356,7 +394,7 @@ "\015MTRR" /* Memory Type Range Registers */ "\016PGE" /* PG_G (global bit) support */ "\017MCA" /* Machine Check Architecture */ - "\020ICMOV" /* CMOV instruction */ + "\020CMOV" /* CMOV instruction */ "\021PAT" /* Page attributes table */ "\022PGE36" /* 36 bit address space support */ "\023RSVD" /* Reserved, unknown */ ==== //depot/projects/netperf_socket/sys/amd64/amd64/vm_machdep.c#4 (text+ko) ==== @@ -41,7 +41,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/amd64/amd64/vm_machdep.c,v 1.229 2004/03/16 19:04:27 alc Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/amd64/vm_machdep.c,v 1.230 2004/03/25 03:39:38 peter Exp $"); #include "opt_isa.h" #include "opt_kstack_pages.h" @@ -124,7 +124,8 @@ fpuexit(td1); /* Point the pcb to the top of the stack */ - pcb2 = (struct pcb *)(td2->td_kstack + KSTACK_PAGES * PAGE_SIZE) - 1; + pcb2 = (struct pcb *)(td2->td_kstack + + td2->td_kstack_pages * PAGE_SIZE) - 1; td2->td_pcb = pcb2; /* Copy p1's pcb */ @@ -247,8 +248,8 @@ cpu_thread_setup(struct thread *td) { - td->td_pcb = - (struct pcb *)(td->td_kstack + KSTACK_PAGES * PAGE_SIZE) - 1; + td->td_pcb = (struct pcb *)(td->td_kstack + + td->td_kstack_pages * PAGE_SIZE) - 1; td->td_frame = (struct trapframe *)td->td_pcb - 1; } ==== //depot/projects/netperf_socket/sys/amd64/conf/GENERIC#4 (text+ko) ==== @@ -16,7 +16,7 @@ # If you are in doubt as to the purpose or necessity of a line, check first # in NOTES. # -# $FreeBSD: src/sys/amd64/conf/GENERIC,v 1.404 2004/03/15 00:49:39 obrien Exp $ +# $FreeBSD: src/sys/amd64/conf/GENERIC,v 1.405 2004/03/25 03:19:28 obrien Exp $ machine amd64 cpu HAMMER @@ -39,6 +39,7 @@ options NFSCLIENT # Network Filesystem Client options NFSSERVER # Network Filesystem Server options NFS_ROOT # NFS usable as /, requires NFSCLIENT +options NTFS # NT File System options MSDOSFS # MSDOS Filesystem options CD9660 # ISO 9660 Filesystem options PROCFS # Process filesystem (requires PSEUDOFS) ==== //depot/projects/netperf_socket/sys/boot/alpha/common/conf.c#2 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/boot/alpha/common/conf.c,v 1.5 2004/01/04 23:21:01 obrien Exp $"); +__FBSDID("$FreeBSD: src/sys/boot/alpha/common/conf.c,v 1.6 2004/03/25 20:36:57 jhb Exp $"); #include <stand.h> #include "libalpha/libalpha.h" @@ -67,6 +67,7 @@ &nfs_fsops, #endif &gzipfs_fsops, + &splitfs_fsops, NULL }; ==== //depot/projects/netperf_socket/sys/compat/freebsd32/freebsd32_proto.h#3 (text+ko) ==== @@ -2,8 +2,8 @@ * System call prototypes. * * DO NOT EDIT-- this file is automatically generated. - * $FreeBSD: src/sys/compat/freebsd32/freebsd32_proto.h,v 1.22 2004/02/21 23:38:57 peter Exp $ - * created from FreeBSD: src/sys/compat/freebsd32/syscalls.master,v 1.35 2004/02/21 23:37:33 peter Exp + * $FreeBSD: src/sys/compat/freebsd32/freebsd32_proto.h,v 1.23 2004/03/27 14:34:17 mtm Exp $ + * created from FreeBSD: src/sys/compat/freebsd32/syscalls.master,v 1.36 2004/03/27 14:30:42 mtm Exp */ #ifndef _FREEBSD32_SYSPROTO_H_ ==== //depot/projects/netperf_socket/sys/compat/freebsd32/freebsd32_syscall.h#3 (text+ko) ==== @@ -2,8 +2,8 @@ * System call numbers. * * DO NOT EDIT-- this file is automatically generated. - * $FreeBSD: src/sys/compat/freebsd32/freebsd32_syscall.h,v 1.22 2004/02/21 23:38:57 peter Exp $ - * created from FreeBSD: src/sys/compat/freebsd32/syscalls.master,v 1.35 2004/02/21 23:37:33 peter Exp + * $FreeBSD: src/sys/compat/freebsd32/freebsd32_syscall.h,v 1.23 2004/03/27 14:34:17 mtm Exp $ + * created from FreeBSD: src/sys/compat/freebsd32/syscalls.master,v 1.36 2004/03/27 14:30:42 mtm Exp */ #define FREEBSD32_SYS_syscall 0 @@ -295,4 +295,6 @@ #define FREEBSD32_SYS__umtx_lock 434 #define FREEBSD32_SYS__umtx_unlock 435 #define FREEBSD32_SYS_jail_attach 436 -#define FREEBSD32_SYS_MAXSYSCALL 442 +#define FREEBSD32_SYS_thr_suspend 442 +#define FREEBSD32_SYS_thr_wake 443 +#define FREEBSD32_SYS_MAXSYSCALL 444 ==== //depot/projects/netperf_socket/sys/compat/freebsd32/freebsd32_syscalls.c#3 (text+ko) ==== @@ -2,8 +2,8 @@ * System call names. * * DO NOT EDIT-- this file is automatically generated. - * $FreeBSD: src/sys/compat/freebsd32/freebsd32_syscalls.c,v 1.13 2004/02/21 23:38:58 peter Exp $ - * created from FreeBSD: src/sys/compat/freebsd32/syscalls.master,v 1.35 2004/02/21 23:37:33 peter Exp + * $FreeBSD: src/sys/compat/freebsd32/freebsd32_syscalls.c,v 1.14 2004/03/27 14:34:17 mtm Exp $ + * created from FreeBSD: src/sys/compat/freebsd32/syscalls.master,v 1.36 2004/03/27 14:30:42 mtm Exp */ const char *freebsd32_syscallnames[] = { @@ -449,4 +449,6 @@ "#439", /* 439 = extattr_list_link */ "#440", /* 440 = kse_switchin */ "#441", /* 441 = ksem_timedwait */ + "thr_suspend", /* 442 = thr_suspend */ + "thr_wake", /* 443 = thr_wake */ }; ==== //depot/projects/netperf_socket/sys/compat/freebsd32/freebsd32_sysent.c#3 (text+ko) ==== @@ -2,8 +2,8 @@ * System call switch table. * * DO NOT EDIT-- this file is automatically generated. - * $FreeBSD: src/sys/compat/freebsd32/freebsd32_sysent.c,v 1.23 2004/02/21 23:38:58 peter Exp $ - * created from FreeBSD: src/sys/compat/freebsd32/syscalls.master,v 1.35 2004/02/21 23:37:33 peter Exp + * $FreeBSD: src/sys/compat/freebsd32/freebsd32_sysent.c,v 1.24 2004/03/27 14:34:17 mtm Exp $ + * created from FreeBSD: src/sys/compat/freebsd32/syscalls.master,v 1.36 2004/03/27 14:30:42 mtm Exp */ #include "opt_compat.h" @@ -467,4 +467,6 @@ { 0, (sy_call_t *)nosys }, /* 439 = extattr_list_link */ { 0, (sy_call_t *)nosys }, /* 440 = kse_switchin */ { 0, (sy_call_t *)nosys }, /* 441 = ksem_timedwait */ + { SYF_MPSAFE | AS(thr_suspend_args), (sy_call_t *)thr_suspend }, /* 442 = thr_suspend */ + { SYF_MPSAFE | AS(thr_wake_args), (sy_call_t *)thr_wake }, /* 443 = thr_wake */ }; ==== //depot/projects/netperf_socket/sys/compat/freebsd32/syscalls.master#3 (text+ko) ==== @@ -1,4 +1,4 @@ - $FreeBSD: src/sys/compat/freebsd32/syscalls.master,v 1.35 2004/02/21 23:37:33 peter Exp $ + $FreeBSD: src/sys/compat/freebsd32/syscalls.master,v 1.36 2004/03/27 14:30:42 mtm Exp $ ; from: @(#)syscalls.master 8.2 (Berkeley) 1/13/94 ; from: src/sys/kern/syscalls.master 1.107 ; @@ -604,3 +604,5 @@ 439 UNIMPL extattr_list_link 440 UNIMPL kse_switchin 441 UNIMPL ksem_timedwait +442 MNOPROTO { int thr_suspend(const struct timespec *timeout); } +443 MNOPROTO { int thr_wake(thr_id_t id); } ==== //depot/projects/netperf_socket/sys/compat/ndis/kern_ndis.c#8 (text+ko) ==== @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/compat/ndis/kern_ndis.c,v 1.44 2004/03/22 00:41:41 wpaul Exp $"); +__FBSDID("$FreeBSD: src/sys/compat/ndis/kern_ndis.c,v 1.47 2004/03/25 18:31:52 wpaul Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -150,7 +150,7 @@ case MOD_SHUTDOWN: /* stop kthreads */ ndis_destroy_kthreads(); - if (TAILQ_FIRST(&ndis_devhead) != NULL) { + if (TAILQ_FIRST(&ndis_devhead) == NULL) { /* Shut down subsystems */ ndis_libfini(); ntoskrnl_libfini(); @@ -403,6 +403,39 @@ } int +ndis_unsched(func, arg, t) + void (*func)(void *); + void *arg; + int t; +{ + struct ndis_req *r; + struct ndisqhead *q; + struct proc *p; + + if (t == NDIS_TASKQUEUE) { + q = &ndis_ttodo; + p = ndis_tproc.np_p; + } else { + q = &ndis_itodo; + p = ndis_iproc.np_p; + } + + mtx_pool_lock(ndis_mtxpool, ndis_thr_mtx); + STAILQ_FOREACH(r, q, link) { + if (r->nr_func == func && r->nr_arg == arg) { + STAILQ_REMOVE(q, r, ndis_req, link); + STAILQ_INSERT_HEAD(&ndis_free, r, link); + mtx_pool_unlock(ndis_mtxpool, ndis_thr_mtx); + return(0); + } + } + + mtx_pool_unlock(ndis_mtxpool, ndis_thr_mtx); + + return(ENOENT); +} + +int ndis_sched(func, arg, t) void (*func)(void *); void *arg; @@ -738,7 +771,9 @@ ndis_miniport_block *block; device_t dev; struct resource_list *brl; - struct resource_list_entry *brle; + struct resource_list brl_rev; + struct resource_list_entry *brle, *n; + int error = 0; sc = arg; block = &sc->ndis_block; @@ -758,7 +793,34 @@ brl = BUS_GET_RESOURCE_LIST(device_get_parent(dev), dev); if (brl != NULL) { + + /* + * We have a small problem. Some PCI devices have + * multiple I/O ranges. Windows orders them starting + * from lowest numbered BAR to highest. We discover + * them in that order too, but insert them into a singly + * linked list head first, which means when time comes + * to traverse the list, we enumerate them in reverse + * order. This screws up some drivers which expect the + * BARs to be in ascending order so that they can choose + * the "first" one as their register space. Unfortunately, + * in order to fix this, we have to create our own + * temporary list with the entries in reverse order. + */ + SLIST_INIT(&brl_rev); SLIST_FOREACH(brle, brl, link) { + n = malloc(sizeof(struct resource_list_entry), + M_TEMP, M_NOWAIT); + if (n == NULL) { + error = ENOMEM; + goto bad; + } + bcopy((char *)brle, (char *)n, + sizeof(struct resource_list_entry)); + SLIST_INSERT_HEAD(&brl_rev, n, link); + } + + SLIST_FOREACH(brle, &brl_rev, link) { switch (brle->type) { case SYS_RES_IOPORT: prd->cprd_type = CmResourceTypePort; @@ -787,7 +849,15 @@ block->nmb_rlist = rl; - return(0); +bad: + + while (!SLIST_EMPTY(&brl_rev)) { + n = SLIST_FIRST(&brl_rev); + SLIST_REMOVE_HEAD(&brl_rev, link); + free (n, M_TEMP); + } + + return(error); } /* ==== //depot/projects/netperf_socket/sys/compat/ndis/subr_ndis.c#6 (text+ko) ==== @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/compat/ndis/subr_ndis.c,v 1.52 2004/03/20 23:39:43 wpaul Exp $"); +__FBSDID("$FreeBSD: src/sys/compat/ndis/subr_ndis.c,v 1.53 2004/03/25 18:31:52 wpaul Exp $"); /* * This file implements a translation layer between the BSD networking @@ -1906,12 +1906,12 @@ ndis_event *event; { /* - * NDIS events are always synchronization + * NDIS events are always notification * events, and should be initialized to the * not signaled state. */ - ntoskrnl_init_event(&event->ne_event, EVENT_TYPE_SYNC, FALSE); + ntoskrnl_init_event(&event->ne_event, EVENT_TYPE_NOTIFY, FALSE); return; } ==== //depot/projects/netperf_socket/sys/compat/ndis/subr_ntoskrnl.c#9 (text+ko) ==== @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/compat/ndis/subr_ntoskrnl.c,v 1.30 2004/03/22 00:41:41 wpaul Exp $"); +__FBSDID("$FreeBSD: src/sys/compat/ndis/subr_ntoskrnl.c,v 1.33 2004/03/27 20:38:43 wpaul Exp $"); #include <sys/ctype.h> #include <sys/unistd.h> @@ -85,7 +85,7 @@ int64_t *, wait_block *); static void ntoskrnl_wakeup(void *); static void ntoskrnl_timercall(void *); -static void ntoskrnl_timersched(void *); +static void ntoskrnl_run_dpc(void *); __stdcall static void ntoskrnl_writereg_ushort(uint16_t *, uint16_t); __stdcall static uint16_t ntoskrnl_readreg_ushort(uint16_t *); __stdcall static void ntoskrnl_writereg_ulong(uint32_t *, uint32_t); @@ -147,6 +147,7 @@ uint32_t, uint32_t *); static int atoi (const char *); static long atol (const char *); +static int rand(void); static void ntoskrnl_time(uint64_t *); __stdcall static uint8_t ntoskrnl_wdmver(uint8_t, uint8_t); static void ntoskrnl_thrfunc(void *); @@ -1355,6 +1356,16 @@ return strtol(str, (char **)NULL, 10); } +static int +rand(void) +{ + struct timeval tv; + + microtime(&tv); + srandom(tv.tv_usec); + return((int)random()); +} + __stdcall static uint8_t ntoskrnl_wdmver(major, minor) uint8_t major; @@ -1617,7 +1628,6 @@ ntoskrnl_kth--; - mtx_lock(&Giant); kthread_exit(0); return(0); /* notreached */ } @@ -1642,31 +1652,14 @@ return; } -/* - * We run all timer callouts in the ndis swi thread to take - * advantage of its larger stack size. If we don't do this, - * the callout will run in the clock ithread context. - */ - -static void -ntoskrnl_timersched(arg) - void *arg; -{ - ndis_sched(ntoskrnl_timercall, arg, NDIS_SWI); - return; -} - static void ntoskrnl_timercall(arg) void *arg; { ktimer *timer; - __stdcall kdpc_func timerfunc; - kdpc *dpc; struct timeval tv; timer = arg; - dpc = timer->k_dpc; /* * If this is a periodic timer, re-arm it @@ -1681,14 +1674,11 @@ tv.tv_sec = 0; tv.tv_usec = timer->k_period * 1000; timer->k_handle = - timeout(ntoskrnl_timersched, timer, tvtohz(&tv)); + timeout(ntoskrnl_timercall, timer, tvtohz(&tv)); } - if (dpc != NULL) { - timerfunc = (kdpc_func)dpc->k_deferedfunc; - timerfunc(dpc, dpc->k_deferredctx, - dpc->k_sysarg1, dpc->k_sysarg2); - } + if (timer->k_dpc != NULL) + ntoskrnl_queue_dpc(timer->k_dpc, NULL, NULL); ntoskrnl_wakeup(&timer->k_header); @@ -1728,6 +1718,25 @@ return; } +/* + * This is a wrapper for Windows deferred procedure calls that + * have been placed on an NDIS thread work queue. We need it + * since the DPC could be a _stdcall function. + */ +static void +ntoskrnl_run_dpc(arg) + void *arg; +{ + __stdcall kdpc_func dpcfunc; + kdpc *dpc; + + dpc = arg; + dpcfunc = (kdpc_func)dpc->k_deferedfunc; + dpcfunc(dpc, dpc->k_deferredctx, dpc->k_sysarg1, dpc->k_sysarg2); + + return; +} + __stdcall void ntoskrnl_init_dpc(dpc, dpcfunc, dpcctx) kdpc *dpc; @@ -1744,6 +1753,30 @@ } __stdcall uint8_t +ntoskrnl_queue_dpc(dpc, sysarg1, sysarg2) + kdpc *dpc; + void *sysarg1; + void *sysarg2; +{ + dpc->k_sysarg1 = sysarg1; + dpc->k_sysarg2 = sysarg2; + if (ndis_sched(ntoskrnl_run_dpc, dpc, NDIS_SWI)) + return(FALSE); + + return(TRUE); +} + +__stdcall uint8_t +ntoskrnl_dequeue_dpc(dpc) + kdpc *dpc; +{ + if (ndis_unsched(ntoskrnl_run_dpc, dpc, NDIS_SWI)) + return(FALSE); + + return(TRUE); +} + +__stdcall uint8_t ntoskrnl_set_timer_ex(timer, duetime, period, dpc) ktimer *timer; int64_t duetime; @@ -1759,7 +1792,7 @@ if (timer->k_handle.callout != NULL && callout_pending(timer->k_handle.callout)) { - untimeout(ntoskrnl_timersched, timer, timer->k_handle); + untimeout(ntoskrnl_timercall, timer, timer->k_handle); pending = TRUE; } else pending = FALSE; @@ -1784,7 +1817,7 @@ } } - timer->k_handle = timeout(ntoskrnl_timersched, timer, tvtohz(&tv)); + timer->k_handle = timeout(ntoskrnl_timercall, timer, tvtohz(&tv)); return(pending); } @@ -1813,7 +1846,7 @@ else pending = FALSE; - untimeout(ntoskrnl_timersched, timer, timer->k_handle); + untimeout(ntoskrnl_timercall, timer, timer->k_handle); return(pending); } @@ -1886,6 +1919,7 @@ { "_aullshl", (FUNC)_aullshl }, { "atoi", (FUNC)atoi }, { "atol", (FUNC)atol }, + { "rand", (FUNC)rand }, { "WRITE_REGISTER_USHORT", (FUNC)ntoskrnl_writereg_ushort }, { "READ_REGISTER_USHORT", (FUNC)ntoskrnl_readreg_ushort }, { "WRITE_REGISTER_ULONG", (FUNC)ntoskrnl_writereg_ulong }, @@ -1926,11 +1960,13 @@ { "KeReadStateEvent", (FUNC)ntoskrnl_read_event }, { "KeInitializeTimer", (FUNC)ntoskrnl_init_timer }, { "KeInitializeTimerEx", (FUNC)ntoskrnl_init_timer_ex }, - { "KeInitializeDpc", (FUNC)ntoskrnl_init_dpc }, { "KeSetTimer", (FUNC)ntoskrnl_set_timer }, { "KeSetTimerEx", (FUNC)ntoskrnl_set_timer_ex }, { "KeCancelTimer", (FUNC)ntoskrnl_cancel_timer }, { "KeReadStateTimer", (FUNC)ntoskrnl_read_timer }, + { "KeInitializeDpc", (FUNC)ntoskrnl_init_dpc }, + { "KeInsertQueueDpc", (FUNC)ntoskrnl_queue_dpc }, + { "KeRemoveQueueDpc", (FUNC)ntoskrnl_dequeue_dpc }, { "ObReferenceObjectByHandle", (FUNC)ntoskrnl_objref }, { "ObfDereferenceObject", (FUNC)ntoskrnl_objderef }, { "ZwClose", (FUNC)ntoskrnl_zwclose }, ==== //depot/projects/netperf_socket/sys/conf/files.i386#10 (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.480 2004/03/21 20:28:36 alc Exp $ +# $FreeBSD: src/sys/conf/files.i386,v 1.481 2004/03/22 18:00:39 wpaul Exp $ # # The long compile-with and dependency lines are required because of # limitations in config: backslash-newline doesn't work in strings, and @@ -137,8 +137,9 @@ dev/fb/splash.c optional splash dev/fb/vga.c optional vga dev/fe/if_fe_isa.c optional fe isa -dev/if_ndis/if_ndis.c optional ndis pci pccard +dev/if_ndis/if_ndis.c optional ndis dev/if_ndis/if_ndis_pci.c optional ndis pci +dev/if_ndis/if_ndis_pci.c optional ndis cardbus dev/if_ndis/if_ndis_pccard.c optional ndis card dev/if_ndis/if_ndis_pccard.c optional ndis pccard dev/kbd/atkbd.c optional atkbd ==== //depot/projects/netperf_socket/sys/conf/files.powerpc#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.powerpc,v 1.36 2004/02/12 09:17:15 grehan Exp $ +# $FreeBSD: src/sys/conf/files.powerpc,v 1.37 2004/03/23 18:26:02 alc Exp $ # # The long compile-with and dependency lines are required because of # limitations in config: backslash-newline doesn't work in strings, and @@ -58,6 +58,7 @@ powerpc/powerpc/sys_machdep.c standard powerpc/powerpc/swtch.S standard powerpc/powerpc/trap.c standard +powerpc/powerpc/uio_machdep.c standard powerpc/powerpc/uma_machdep.c standard powerpc/powerpc/vm_machdep.c standard ==== //depot/projects/netperf_socket/sys/conf/kern.pre.mk#8 (text+ko) ==== @@ -1,4 +1,4 @@ -# $FreeBSD: src/sys/conf/kern.pre.mk,v 1.48 2004/03/21 05:10:34 marcel Exp $ +# $FreeBSD: src/sys/conf/kern.pre.mk,v 1.49 2004/03/25 00:02:49 obrien Exp $ # Part of a unified Makefile for building kernels. This part contains all # of the definitions that need to be before %BEFORE_DEPEND. @@ -19,7 +19,7 @@ .if ${CC} == "icc" COPTFLAGS?=-O .else -. if ${MACHINE_ARCH} == "amd64" +. if ${MACHINE_ARCH} == "amd64" || ${MACHINE_ARCH} == "sparc64" COPTFLAGS?=-O2 -frename-registers -pipe . elif ${MACHINE_ARCH} == "ia64" COPTFLAGS?=-O2 -pipe ==== //depot/projects/netperf_socket/sys/contrib/dev/acpica/acfreebsd.h#4 (text+ko) ==== @@ -119,17 +119,10 @@ /* * Some systems' ASL may have problems because they look for names - * of Microsoft operating systems. We default to "Microsoft Windows NT" - * (aka NT5 or Windows 2000) because it is most similar to our - * implementation and also most prevalent. - * - * To override this, set hw.acpi.os_name to the appropriate string. + * of Microsoft operating systems. To override this, set hw.acpi.os_name + * to the appropriate string. */ -#ifndef ACPICA_PEDANTIC -#define ACPI_OS_NAME "Microsoft Windows NT" -#else #define ACPI_OS_NAME "FreeBSD" -#endif /* FreeBSD uses GCC */ ==== //depot/projects/netperf_socket/sys/dev/acpica/acpi.c#8 (text+ko) ==== @@ -26,7 +26,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/dev/acpica/acpi.c,v 1.128 2004/03/19 07:05:01 njl Exp $ + * $FreeBSD: src/sys/dev/acpica/acpi.c,v 1.129 2004/03/27 16:26:00 takawata Exp $ */ #include "opt_acpi.h" @@ -140,7 +140,51 @@ static int acpi_supported_sleep_state_sysctl(SYSCTL_HANDLER_ARGS); static int acpi_sleep_state_sysctl(SYSCTL_HANDLER_ARGS); static int acpi_pm_func(u_long cmd, void *arg, ...); +static int acpi_child_location_str_method(device_t acdev, device_t child, + char *buf, size_t buflen); +static int acpi_child_pnpinfo_str_method(device_t acdev, device_t child, + char *buf, size_t buflen); + +int +acpi_child_location_str_method(device_t cbdev, device_t child, char *buf, + size_t buflen) +{ + struct acpi_device *dinfo= device_get_ivars(child); + + dinfo = device_get_ivars(child); + if(dinfo->ad_handle) + snprintf(buf, buflen, "path=%s", acpi_name(dinfo->ad_handle)); + else + snprintf(buf, buflen, "magic=unknown"); + return (0); +} + +int +acpi_child_pnpinfo_str_method(device_t cbdev, device_t child, char *buf, + size_t buflen) +{ + struct acpi_device *dinfo = device_get_ivars(child); + ACPI_DEVICE_INFO adinfo; + ACPI_BUFFER adbuf = {sizeof(adinfo), &adinfo}; + char * end; + int error; + + dinfo = device_get_ivars(child); + error = AcpiGetObjectInfo(dinfo->ad_handle, &adbuf); + + if(error) + snprintf(buf, buflen, "Unknown"); + else + snprintf(buf, buflen, "_HID=%s _UID=%u", + (adinfo.Valid & ACPI_VALID_HID)? + adinfo.HardwareId.Value : "UNKNOWN", + (unsigned int)((adinfo.Valid & ACPI_VALID_UID)? + strtoul(adinfo.UniqueId.Value, &end, 10):0 )); + return (0); +} + + static device_method_t acpi_methods[] = { /* Device interface */ DEVMETHOD(device_identify, acpi_identify), @@ -160,6 +204,8 @@ DEVMETHOD(bus_get_resource, acpi_get_resource), DEVMETHOD(bus_alloc_resource, acpi_alloc_resource), DEVMETHOD(bus_release_resource, acpi_release_resource), + DEVMETHOD(bus_child_pnpinfo_str, acpi_child_pnpinfo_str_method), + DEVMETHOD(bus_child_location_str, acpi_child_location_str_method), DEVMETHOD(bus_driver_added, bus_generic_driver_added), DEVMETHOD(bus_activate_resource, bus_generic_activate_resource), DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource), ==== //depot/projects/netperf_socket/sys/dev/acpica/acpi_pcib.c#4 (text+ko) ==== @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_pcib.c,v 1.38 2004/03/20 20:47:08 njl Exp $"); +__FBSDID("$FreeBSD: src/sys/dev/acpica/acpi_pcib.c,v 1.41 2004/03/22 20:39:20 njl Exp $"); #include "opt_acpi.h" #include <sys/param.h> @@ -35,7 +35,6 @@ #include <sys/kernel.h> #include "acpi.h" - #include <dev/acpica/acpivar.h> #include <dev/acpica/acpi_pcibvar.h> @@ -44,9 +43,7 @@ #include <dev/pci/pcib_private.h> #include "pcib_if.h" -/* - * Hooks for the ACPI CA debugging infrastructure - */ +/* Hooks for the ACPI CA debugging infrastructure. */ #define _COMPONENT ACPI_BUS ACPI_MODULE_NAME("PCI") @@ -68,12 +65,12 @@ return_VALUE(ENXIO); /* - * Get the PCI interrupt routing table for this bus. + * Get the PCI interrupt routing table for this bus. If we can't + * get it, this is not an error but may reduce functionality. */ prt->Length = ACPI_ALLOCATE_BUFFER; status = AcpiGetIrqRoutingTable(acpi_get_handle(dev), prt); >>> TRUNCATED FOR MAIL (1000 lines) <<<
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200403281459.i2SExCR4017380>