PERFORCE change 49425 for review

Marcel Moolenaar marcel at FreeBSD.org
Sat Mar 20 18:27:30 PST 2004


http://perforce.freebsd.org/chv.cgi?CH=49425

Change 49425 by marcel at marcel_nfs on 2004/03/20 18:27:05

	IFC @49421

Affected files ...

.. //depot/projects/gdb/contrib/sort/Makefile#2 delete
.. //depot/projects/gdb/contrib/sort/append.c#2 delete
.. //depot/projects/gdb/contrib/sort/extern.h#2 delete
.. //depot/projects/gdb/contrib/sort/fields.c#2 delete
.. //depot/projects/gdb/contrib/sort/files.c#2 delete
.. //depot/projects/gdb/contrib/sort/fsort.c#2 delete
.. //depot/projects/gdb/contrib/sort/fsort.h#2 delete
.. //depot/projects/gdb/contrib/sort/init.c#2 delete
.. //depot/projects/gdb/contrib/sort/msort.c#2 delete
.. //depot/projects/gdb/contrib/sort/pathnames.h#2 delete
.. //depot/projects/gdb/contrib/sort/regress/Makefile#2 delete
.. //depot/projects/gdb/contrib/sort/regress/stests#2 delete
.. //depot/projects/gdb/contrib/sort/sort.1#2 delete
.. //depot/projects/gdb/contrib/sort/sort.c#2 delete
.. //depot/projects/gdb/contrib/sort/sort.h#2 delete
.. //depot/projects/gdb/contrib/sort/tmp.c#2 delete
.. //depot/projects/gdb/lib/csu/amd64/crti.S#2 integrate
.. //depot/projects/gdb/lib/csu/amd64/crtn.S#2 integrate
.. //depot/projects/gdb/libexec/rtld-elf/Makefile#2 integrate
.. //depot/projects/gdb/libexec/rtld-elf/amd64/rtld_start.S#2 integrate
.. //depot/projects/gdb/libexec/rtld-elf/debug.h#2 integrate
.. //depot/projects/gdb/libexec/rtld-elf/libmap.c#3 integrate
.. //depot/projects/gdb/libexec/rtld-elf/libmap.h#2 integrate
.. //depot/projects/gdb/libexec/rtld-elf/rtld.c#3 integrate
.. //depot/projects/gdb/libexec/rtld-elf/rtld.h#2 integrate
.. //depot/projects/gdb/sbin/ldconfig/ldconfig.c#3 integrate
.. //depot/projects/gdb/sys/compat/ia32/ia32_sysvec.c#3 integrate
.. //depot/projects/gdb/sys/compat/ndis/kern_ndis.c#5 integrate
.. //depot/projects/gdb/sys/compat/ndis/ndis_var.h#3 integrate
.. //depot/projects/gdb/sys/compat/ndis/ntoskrnl_var.h#4 integrate
.. //depot/projects/gdb/sys/compat/ndis/subr_ndis.c#6 integrate
.. //depot/projects/gdb/sys/compat/ndis/subr_ntoskrnl.c#7 integrate
.. //depot/projects/gdb/sys/dev/if_ndis/if_ndis.c#6 integrate
.. //depot/projects/gdb/sys/ia64/include/cpufunc.h#2 integrate

Differences ...

==== //depot/projects/gdb/lib/csu/amd64/crti.S#2 (text+ko) ====

@@ -28,12 +28,14 @@
 	.globl	_init
 	.type	_init, at function
 _init:
+	subq	$8,%rsp
 
 	.section .fini,"ax", at progbits
 	.align	4
 	.globl	_fini
 	.type	_fini, at function
 _fini:
+	subq	$8,%rsp
 
 	.section .rodata
-.ascii "$FreeBSD: src/lib/csu/amd64/crti.S,v 1.6 2002/05/15 04:19:49 obrien Exp $\0"
+.ascii "$FreeBSD: src/lib/csu/amd64/crti.S,v 1.7 2004/03/21 01:39:01 peter Exp $\0"

==== //depot/projects/gdb/lib/csu/amd64/crtn.S#2 (text+ko) ====

@@ -24,10 +24,12 @@
  */
 
 	.section .init,"ax", at progbits
+	addq	$8,%rsp
 	ret
 
 	.section .fini,"ax", at progbits
+	addq	$8,%rsp
 	ret
 
 	.section .rodata
-.ascii "$FreeBSD: src/lib/csu/amd64/crtn.S,v 1.5 2002/05/15 04:19:49 obrien Exp $\0"
+.ascii "$FreeBSD: src/lib/csu/amd64/crtn.S,v 1.6 2004/03/21 01:39:01 peter Exp $\0"

==== //depot/projects/gdb/libexec/rtld-elf/Makefile#2 (text+ko) ====

@@ -1,6 +1,6 @@
-# $FreeBSD: src/libexec/rtld-elf/Makefile,v 1.25 2003/09/13 21:50:35 mdodd Exp $
+# $FreeBSD: src/libexec/rtld-elf/Makefile,v 1.26 2004/03/21 01:21:26 peter Exp $
 
-PROG=		ld-elf.so.1
+PROG?=		ld-elf.so.1
 SRCS=		rtld_start.S rtld.c rtld_lock.c map_object.c malloc.c \
 		xmalloc.c debug.c reloc.c libmap.c
 MAN=		rtld.1

==== //depot/projects/gdb/libexec/rtld-elf/amd64/rtld_start.S#2 (text+ko) ====

@@ -22,7 +22,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/libexec/rtld-elf/amd64/rtld_start.S,v 1.4 2003/05/24 17:37:51 peter Exp $
+ * $FreeBSD: src/libexec/rtld-elf/amd64/rtld_start.S,v 1.5 2004/03/21 01:43:39 peter Exp $
  */
 
 	.text
@@ -31,14 +31,13 @@
 	.type	.rtld_start, at function
 .rtld_start:
 	xorq	%rbp,%rbp		# Clear frame pointer for good form
-	subq	$16,%rsp		# A place to store exit procedure addr
+	subq	$24,%rsp		# A place to store exit procedure addr
 	movq	%rdi,%r12
 	movq	%rsp,%rsi		# save address of exit proc
 	movq	%rsp,%rdx		# construct address of obj_main
 	addq	$8,%rdx
 	call	_rtld at PLT		# Call rtld(sp); returns entry point
 	popq	%rsi			# Get exit procedure address
-	addq	$8,%rsp			# Ignore obj_main
 	movq	%r12,%rdi		# *ap
 /*
  * At this point, %rax contains the entry point of the main program, and
@@ -62,8 +61,9 @@
  * assembly-language code that is not ABI-compliant.
  *
  * Stack map:
- * reloff       0x58
- * obj          0x50
+ * reloff       0x60
+ * obj          0x58
+ * spare	0x50
  * rflags       0x48
  * rax          0x40
  * rdx          0x38
@@ -79,6 +79,7 @@
 	.globl	_rtld_bind_start
 	.type	_rtld_bind_start, at function
 _rtld_bind_start:
+	subq	$8,%rsp
 	pushfq				# Save rflags
 	pushq	%rax			# Save %rax
 	pushq	%rdx			# Save %rdx
@@ -90,15 +91,15 @@
 	pushq	%r10			# Save %r10
 	pushq	%r11			# Save %r11
 
-	movq	0x50(%rsp),%rdi		# Fetch obj argument
-	movq	0x58(%rsp),%rsi		# Fetch reloff argument
+	movq	0x58(%rsp),%rdi		# Fetch obj argument
+	movq	0x60(%rsp),%rsi		# Fetch reloff argument
 	leaq	(%rsi,%rsi,2),%rsi	# multiply by 3
 	leaq	(,%rsi,8),%rsi		# now 8, for 24 (sizeof Elf_Rela)
 
 	call	_rtld_bind at PLT		# Transfer control to the binder
 	/* Now %rax contains the entry point of the function being called. */
 
-	movq	%rax,0x58(%rsp)		# Store target over reloff argument
+	movq	%rax,0x60(%rsp)		# Store target over reloff argument
 	popq	%r11			# Restore %r11
 	popq	%r10			# Restore %r10
 	popq	%r9			# Restore %r9
@@ -109,5 +110,5 @@
 	popq	%rdx			# Restore %rdx
 	popq	%rax			# Restore %rax
 	popfq				# Restore rflags
-	leaq	8(%rsp),%rsp		# Discard obj, do not change rflags
+	leaq	16(%rsp),%rsp		# Discard spare, obj, do not change rflags
 	ret				# "Return" to target address

==== //depot/projects/gdb/libexec/rtld-elf/debug.h#2 (text+ko) ====

@@ -22,7 +22,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/libexec/rtld-elf/debug.h,v 1.5 2001/07/26 11:02:32 sheldonh Exp $
+ * $FreeBSD: src/libexec/rtld-elf/debug.h,v 1.6 2004/03/21 01:21:26 peter Exp $
  */
 
 /*
@@ -50,10 +50,17 @@
 #define dbg(format, args...)	((void) 0)
 #endif
 
+#ifndef COMPAT_32BIT
+#define _MYNAME	"ld-elf.so.1"
+#else
+#define _MYNAME	"ld-elf32.so.1"
+#endif
+
 #define assert(cond)	((cond) ? (void) 0 :		\
-    (msg("ld-elf.so.1: assert failed: " __FILE__ ":"	\
+    (msg(_MYNAME ": assert failed: " __FILE__ ":"	\
       __XSTRING(__LINE__) "\n"), abort()))
 #define msg(s)		write(STDOUT_FILENO, s, strlen(s))
-#define trace()		msg("ld-elf.so.1: " __XSTRING(__LINE__) "\n")
+#define trace()		msg(_MYNAME ": " __XSTRING(__LINE__) "\n")
+
 
 #endif /* DEBUG_H */

==== //depot/projects/gdb/libexec/rtld-elf/libmap.c#3 (text+ko) ====

@@ -1,5 +1,5 @@
 /*
- * $FreeBSD: src/libexec/rtld-elf/libmap.c,v 1.10 2004/02/03 18:53:40 fjoe Exp $
+ * $FreeBSD: src/libexec/rtld-elf/libmap.c,v 1.11 2004/03/21 01:21:26 peter Exp $
  */
 
 #include <stdio.h>
@@ -17,6 +17,11 @@
 #define	_PATH_LIBMAP_CONF	"/etc/libmap.conf"
 #endif
 
+#ifdef COMPAT_32BIT
+#undef _PATH_LIBMAP_CONF
+#define	_PATH_LIBMAP_CONF	"/etc/libmap32.conf"
+#endif
+
 TAILQ_HEAD(lm_list, lm);
 struct lm {
 	char *f;
@@ -211,6 +216,27 @@
 		return (NULL);
 }
 
+#ifdef COMPAT_32BIT
+char *
+lm_findn (const char *p, const char *f, const int n)
+{
+	char pathbuf[64], *s, *t;
+
+	if (n < sizeof(pathbuf) - 1) {
+		memcpy(pathbuf, f, n);
+		pathbuf[n] = '\0';
+		s = pathbuf;
+	} else {
+		s = xmalloc(n + 1);
+		strcpy(s, f);
+	}
+	t = lm_find(p, s);
+	if (s != pathbuf)
+		free(s);
+	return (t);
+}
+#endif
+
 static char *
 lml_find (struct lm_list *lmh, const char *f)
 {
@@ -219,8 +245,7 @@
 	dbg("%s(%p, \"%s\")", __func__, lmh, f);
 
 	TAILQ_FOREACH(lm, lmh, lm_link)
-		if ((strncmp(f, lm->f, strlen(lm->f)) == 0) &&
-		    (strlen(f) == strlen(lm->f)))
+		if (strcmp(f, lm->f) == 0)
 			return (lm->t);
 	return NULL;
 }
@@ -233,8 +258,7 @@
 	dbg("%s(\"%s\")", __func__, n);
 
 	TAILQ_FOREACH(lmp, &lmp_head, lmp_link)
-		if ((strncmp(n, lmp->p, strlen(lmp->p)) == 0) &&
-		    (strlen(n) == strlen(lmp->p)))
+		if (strcmp(n, lmp->p) == 0)
 			return (&lmp->lml);
 	return (NULL);
 }

==== //depot/projects/gdb/libexec/rtld-elf/libmap.h#2 (text+ko) ====

@@ -1,7 +1,10 @@
 /*
- * $FreeBSD: src/libexec/rtld-elf/libmap.h,v 1.2 2003/09/13 21:43:08 mdodd Exp $
+ * $FreeBSD: src/libexec/rtld-elf/libmap.h,v 1.3 2004/03/21 01:21:26 peter Exp $
  */
 
 int	lm_init (void);
 void	lm_fini (void);
 char *	lm_find (const char *, const char *);
+#ifdef COMPAT_32BIT
+char *	lm_findn (const char *, const char *, const int);
+#endif

==== //depot/projects/gdb/libexec/rtld-elf/rtld.c#3 (text+ko) ====

@@ -23,7 +23,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/libexec/rtld-elf/rtld.c,v 1.93 2004/03/05 08:10:18 markm Exp $
+ * $FreeBSD: src/libexec/rtld-elf/rtld.c,v 1.94 2004/03/21 01:21:26 peter Exp $
  */
 
 /*
@@ -54,7 +54,11 @@
 #include "rtld.h"
 #include "libmap.h"
 
+#ifndef COMPAT_32BIT
 #define PATH_RTLD	"/libexec/ld-elf.so.1"
+#else
+#define PATH_RTLD	"/libexec/ld-elf32.so.1"
+#endif
 
 /* Types. */
 typedef void (*func_ptr_type)();
@@ -261,14 +265,14 @@
 
     trust = !issetugid();
 
-    ld_bind_now = getenv("LD_BIND_NOW");
+    ld_bind_now = getenv(LD_ "BIND_NOW");
     if (trust) {
-	ld_debug = getenv("LD_DEBUG");
-	libmap_disable = getenv("LD_LIBMAP_DISABLE") != NULL;
-	ld_library_path = getenv("LD_LIBRARY_PATH");
-	ld_preload = getenv("LD_PRELOAD");
+	ld_debug = getenv(LD_ "DEBUG");
+	libmap_disable = getenv(LD_ "LIBMAP_DISABLE") != NULL;
+	ld_library_path = getenv(LD_ "LIBRARY_PATH");
+	ld_preload = getenv(LD_ "PRELOAD");
     }
-    ld_tracing = getenv("LD_TRACE_LOADED_OBJECTS");
+    ld_tracing = getenv(LD_ "TRACE_LOADED_OBJECTS");
 
     if (ld_debug != NULL && *ld_debug != '\0')
 	debug = 1;
@@ -360,7 +364,7 @@
 	exit(0);
     }
 
-    if (getenv("LD_DUMP_REL_PRE") != NULL) {
+    if (getenv(LD_ "DUMP_REL_PRE") != NULL) {
        dump_relocations(obj_main);
        exit (0);
     }
@@ -373,7 +377,7 @@
     if (do_copy_relocations(obj_main) == -1)
 	die();
 
-    if (getenv("LD_DUMP_REL_POST") != NULL) {
+    if (getenv(LD_ "DUMP_REL_POST") != NULL) {
        dump_relocations(obj_main);
        exit (0);
     }
@@ -1460,6 +1464,9 @@
 static void *
 path_enumerate(const char *path, path_enum_proc callback, void *arg)
 {
+#ifdef COMPAT_32BIT
+    const char *trans;
+#endif
     if (path == NULL)
 	return (NULL);
 
@@ -1469,6 +1476,12 @@
 	char  *res;
 
 	len = strcspn(path, ":;");
+#ifdef COMPAT_32BIT
+	trans = lm_findn(NULL, path, len);
+	if (trans)
+	    res = callback(trans, strlen(trans), arg);
+	else
+#endif
 	res = callback(path, len, arg);
 
 	if (res != NULL)
@@ -2259,16 +2272,16 @@
     char	*fmt1, *fmt2, *fmt, *main_local, *list_containers;
     int		c;
 
-    if ((main_local = getenv("LD_TRACE_LOADED_OBJECTS_PROGNAME")) == NULL)
+    if ((main_local = getenv(LD_ "TRACE_LOADED_OBJECTS_PROGNAME")) == NULL)
 	main_local = "";
 
-    if ((fmt1 = getenv("LD_TRACE_LOADED_OBJECTS_FMT1")) == NULL)
+    if ((fmt1 = getenv(LD_ "TRACE_LOADED_OBJECTS_FMT1")) == NULL)
 	fmt1 = "\t%o => %p (%x)\n";
 
-    if ((fmt2 = getenv("LD_TRACE_LOADED_OBJECTS_FMT2")) == NULL)
+    if ((fmt2 = getenv(LD_ "TRACE_LOADED_OBJECTS_FMT2")) == NULL)
 	fmt2 = "\t%o (%x)\n";
 
-    list_containers = getenv("LD_TRACE_LOADED_OBJECTS_ALL");
+    list_containers = getenv(LD_ "TRACE_LOADED_OBJECTS_ALL");
 
     for (; obj; obj = obj->next) {
 	Needed_Entry		*needed;

==== //depot/projects/gdb/libexec/rtld-elf/rtld.h#2 (text+ko) ====

@@ -22,7 +22,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/libexec/rtld-elf/rtld.h,v 1.32 2003/08/17 07:55:17 gordon Exp $
+ * $FreeBSD: src/libexec/rtld-elf/rtld.h,v 1.33 2004/03/21 01:21:26 peter Exp $
  */
 
 #ifndef RTLD_H /* { */
@@ -39,9 +39,21 @@
 #include "rtld_lock.h"
 #include "rtld_machdep.h"
 
+#ifdef COMPAT_32BIT
+#undef STANDARD_LIBRARY_PATH
+#undef _PATH_ELF_HINTS
+#define	_PATH_ELF_HINTS		"/var/run/ld-elf32.so.hints"
+/* For running 32 bit binaries  */
+#define	STANDARD_LIBRARY_PATH	"/lib32:/usr/lib32"
+#define LD_ "LD_32_"
+#endif
+
 #ifndef STANDARD_LIBRARY_PATH
 #define STANDARD_LIBRARY_PATH	"/lib:/usr/lib"
 #endif
+#ifndef LD_
+#define LD_ "LD_"
+#endif
 
 #define NEW(type)	((type *) xmalloc(sizeof(type)))
 #define CNEW(type)	((type *) xcalloc(sizeof(type)))

==== //depot/projects/gdb/sbin/ldconfig/ldconfig.c#3 (text+ko) ====

@@ -30,7 +30,7 @@
 
 #ifndef lint
 static const char rcsid[] =
-  "$FreeBSD: src/sbin/ldconfig/ldconfig.c,v 1.39 2004/03/13 00:11:05 cperciva Exp $";
+  "$FreeBSD: src/sbin/ldconfig/ldconfig.c,v 1.40 2004/03/21 01:21:26 peter Exp $";
 #endif /* not lint */
 
 #include <sys/param.h>
@@ -63,6 +63,9 @@
 #define _PATH_ELF_HINTS		"./ld-elf.so.hints"
 #endif
 
+#define	_PATH_LD32_HINTS	"/var/run/ld32.so.hints"
+#define	_PATH_ELF32_HINTS	"/var/run/ld-elf32.so.hints"
+
 #undef major
 #undef minor
 
@@ -102,20 +105,31 @@
 {
 	int		i, c;
 	int		rval = 0;
-	int		is_aout;
+	int		is_aout = 0;
+	int		is_32 = 0;
 
-	is_aout = 0;
-	if (argc > 1 && strcmp(argv[1], "-aout") == 0) {
-		is_aout = 1;
-		argc--;
-		argv++;
-	} else if (argc > 1 && strcmp(argv[1], "-elf") == 0) {
-		/* skip over legacy -elf arg */
-		argc--;
-		argv++;
+	while (argc > 1) {
+		if (strcmp(argv[1], "-aout") == 0) {
+			is_aout = 1;
+			argc--;
+			argv++;
+		} else if (strcmp(argv[1], "-elf") == 0) {
+			is_aout = 0;
+			argc--;
+			argv++;
+		} else if (strcmp(argv[1], "-32") == 0) {
+			is_32 = 1;
+			argc--;
+			argv++;
+		} else {
+			break;
+		}
 	}
 
-	hints_file = is_aout ? _PATH_LD_HINTS : _PATH_ELF_HINTS;
+	if (is_32)
+		hints_file = is_aout ? _PATH_LD32_HINTS : _PATH_ELF32_HINTS;
+	else
+		hints_file = is_aout ? _PATH_LD_HINTS : _PATH_ELF_HINTS;
 	if (argc == 1)
 		rescan = 1;
 	else while((c = getopt(argc, argv, "Rf:imrsv")) != -1) {

==== //depot/projects/gdb/sys/compat/ia32/ia32_sysvec.c#3 (text+ko) ====

@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/compat/ia32/ia32_sysvec.c,v 1.16 2004/02/04 21:52:52 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/compat/ia32/ia32_sysvec.c,v 1.17 2004/03/21 01:22:24 peter Exp $");
 
 #include "opt_compat.h"
 
@@ -136,7 +136,7 @@
 						NULL,
 						"/libexec/ld-elf.so.1",
 						&ia32_freebsd_sysvec,
-						"/libexec/ld-elf-32.so.1",
+						"/libexec/ld-elf32.so.1",
 					  };
 
 SYSINIT(ia32, SI_SUB_EXEC, SI_ORDER_ANY,
@@ -150,7 +150,7 @@
 						NULL,
 						"/usr/libexec/ld-elf.so.1",
 						&ia32_freebsd_sysvec,
-						"/usr/libexec/ld-elf-32.so.1",
+						"/usr/libexec/ld-elf32.so.1",
 					  };
 
 SYSINIT(oia32, SI_SUB_EXEC, SI_ORDER_ANY,

==== //depot/projects/gdb/sys/compat/ndis/kern_ndis.c#5 (text+ko) ====

@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/compat/ndis/kern_ndis.c,v 1.42 2004/03/11 09:50:00 wpaul Exp $");
+__FBSDID("$FreeBSD: src/sys/compat/ndis/kern_ndis.c,v 1.43 2004/03/20 23:39:43 wpaul Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -1152,7 +1152,6 @@
 	ndis_handle		adapter;
 	__stdcall ndis_halt_handler	haltfunc;
 	struct ifnet		*ifp;
-	struct ndis_timer_entry	*ne;
 
 	sc = arg;
 	ifp = &sc->arpcom.ac_if;
@@ -1178,14 +1177,6 @@
 	NDIS_LOCK(sc);
 	sc->ndis_block.nmb_miniportadapterctx = NULL;
 	NDIS_UNLOCK(sc);
-	/* Clobber all the timers in case the driver left one running. */
-
-	while (!TAILQ_EMPTY(&sc->ndis_block.nmb_timerlist)) {
-		ne = TAILQ_FIRST(&sc->ndis_block.nmb_timerlist);
-		TAILQ_REMOVE(&sc->ndis_block.nmb_timerlist, ne, link);
-		callout_stop(&ne->nte_ch);
-		free(ne, M_DEVBUF);
-	}
 
 	return(0);
 }

==== //depot/projects/gdb/sys/compat/ndis/ndis_var.h#3 (text+ko) ====

@@ -29,7 +29,7 @@
  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/compat/ndis/ndis_var.h,v 1.21 2004/02/14 20:57:32 wpaul Exp $
+ * $FreeBSD: src/sys/compat/ndis/ndis_var.h,v 1.22 2004/03/20 23:39:43 wpaul Exp $
  */
 
 #ifndef _NDIS_VAR_H_
@@ -835,7 +835,7 @@
 };
 
 struct ndis_event {
-	struct ndis_kevent	ne_event;
+	struct nt_kevent	ne_event;
 };
 
 typedef struct ndis_event ndis_event;
@@ -858,8 +858,8 @@
 };
 
 struct ndis_timer {
-	struct ndis_ktimer	nt_timer;
-	struct ndis_kdpc	nt_dpc;
+	struct ktimer		nt_ktimer;
+	struct kdpc		nt_kdpc;
 };
 
 typedef struct ndis_timer ndis_timer;
@@ -867,10 +867,11 @@
 typedef void (*ndis_timer_function)(void *, void *, void *, void *);
 
 struct ndis_miniport_timer {
-	struct ndis_ktimer	nmt_ktimer;
-	struct ndis_kdpc	nmt_dpc;
+	struct ktimer		nmt_ktimer;
+	struct kdpc		nmt_kdpc;
 	ndis_timer_function	nmt_timerfunc;
 	void			*nmt_timerctx;
+	ndis_miniport_block	*nmt_block;
 	struct ndis_miniport_timer	*nmt_nexttimer;
 };
 

==== //depot/projects/gdb/sys/compat/ndis/ntoskrnl_var.h#4 (text+ko) ====

@@ -29,7 +29,7 @@
  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/compat/ndis/ntoskrnl_var.h,v 1.9 2004/03/04 23:04:02 wpaul Exp $
+ * $FreeBSD: src/sys/compat/ndis/ntoskrnl_var.h,v 1.10 2004/03/20 23:39:43 wpaul Exp $
  */
 
 #ifndef _NTOSKRNL_VAR_H_
@@ -472,7 +472,21 @@
 __BEGIN_DECLS
 extern int ntoskrnl_libinit(void);
 extern int ntoskrnl_libfini(void);
-extern void ntoskrnl_wakeup(void *);
+__stdcall extern void ntoskrnl_init_dpc(kdpc *, void *, void *);
+__stdcall extern void ntoskrnl_init_timer(ktimer *);
+__stdcall extern void ntoskrnl_init_timer_ex(ktimer *, uint32_t);
+__stdcall extern uint8_t ntoskrnl_set_timer(ktimer *, int64_t, kdpc *);  
+__stdcall extern uint8_t ntoskrnl_set_timer_ex(ktimer *, int64_t,
+	uint32_t, kdpc *);
+__stdcall extern uint8_t ntoskrnl_cancel_timer(ktimer *);
+__stdcall extern uint8_t ntoskrnl_read_timer(ktimer *);
+__stdcall uint32_t ntoskrnl_waitforobj(nt_dispatch_header *, uint32_t,
+	uint32_t, uint8_t, int64_t *);
+__stdcall void ntoskrnl_init_event(nt_kevent *, uint32_t, uint8_t);
+__stdcall void ntoskrnl_clear_event(nt_kevent *);
+__stdcall uint32_t ntoskrnl_read_event(nt_kevent *);
+__stdcall uint32_t ntoskrnl_set_event(nt_kevent *, uint32_t, uint8_t);
+__stdcall uint32_t ntoskrnl_reset_event(nt_kevent *);
 __END_DECLS
 
 #endif /* _NTOSKRNL_VAR_H_ */

==== //depot/projects/gdb/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.51 2004/03/11 09:40:00 wpaul Exp $");
+__FBSDID("$FreeBSD: src/sys/compat/ndis/subr_ndis.c,v 1.52 2004/03/20 23:39:43 wpaul Exp $");
 
 /*
  * This file implements a translation layer between the BSD networking
@@ -148,15 +148,13 @@
 __stdcall static void ndis_vtophys_load(ndis_handle, ndis_buffer *,
 	uint32_t, uint8_t, ndis_paddr_unit *, uint32_t *);
 __stdcall static void ndis_vtophys_unload(ndis_handle, ndis_buffer *, uint32_t);
-__stdcall static void ndis_create_timer(ndis_miniport_timer *, ndis_handle *,
+__stdcall static void ndis_create_timer(ndis_miniport_timer *, ndis_handle,
 	ndis_timer_function, void *);
 __stdcall static void ndis_init_timer(ndis_timer *,
 	ndis_timer_function, void *);
-static void ndis_timercall(void *);
-__stdcall static void ndis_set_timer(ndis_miniport_timer *, uint32_t);
-static void ndis_tick(void *);
+__stdcall static void ndis_set_timer(ndis_timer *, uint32_t);
 __stdcall static void ndis_set_periodic_timer(ndis_miniport_timer *, uint32_t);
-__stdcall static void ndis_cancel_timer(ndis_miniport_timer *, uint8_t *);
+__stdcall static void ndis_cancel_timer(ndis_timer *, uint8_t *);
 __stdcall static void ndis_query_resources(ndis_status *, ndis_handle,
 	ndis_resource_list *, uint32_t *);
 __stdcall static ndis_status ndis_register_ioport(void **,
@@ -521,6 +519,7 @@
 {
 	uint16_t		*unicode;
 	ndis_unicode_string	*ustr;
+	int			base = 0;
 
 	unicode = (uint16_t *)&block->nmb_dummybuf;
 
@@ -533,14 +532,22 @@
 		ustr->nus_buf = unicode;
 		break;
 	case ndis_parm_int:
+		if (strncmp((char *)oid->oid_arg1, "0x", 2) == 0)
+			base = 16;
+		else
+			base = 10;
 		(*parm)->ncp_type = ndis_parm_int;
 		(*parm)->ncp_parmdata.ncp_intdata =
-		    strtol((char *)oid->oid_arg1, NULL, 10);
+		    strtol((char *)oid->oid_arg1, NULL, base);
 		break;
 	case ndis_parm_hexint:
+		if (strncmp((char *)oid->oid_arg1, "0x", 2) == 0)
+			base = 16;
+		else
+			base = 10;
 		(*parm)->ncp_type = ndis_parm_hexint;
 		(*parm)->ncp_parmdata.ncp_intdata =
-		    strtoul((char *)oid->oid_arg1, NULL, 16);
+		    strtoul((char *)oid->oid_arg1, NULL, base);
 		break;
 	default:
 		return(NDIS_STATUS_FAILURE);
@@ -936,166 +943,74 @@
 	ndis_timer_function	func;
 	void			*ctx;
 {
-	struct ndis_timer_entry	*ne = NULL;
-	ndis_miniport_block	*block = NULL;
+	ntoskrnl_init_timer(&timer->nt_ktimer);
+	ntoskrnl_init_dpc(&timer->nt_kdpc, func, ctx);
 
-	TAILQ_FOREACH(block, &ndis_devhead, link) {
-		if (block->nmb_miniportadapterctx == ctx)
-			break;
-	}
-
-	if (block->nmb_miniportadapterctx != ctx)
-		panic("NDIS driver timer context didn't "
-		    "match any adapter contexts");
-
-	ne = malloc(sizeof(struct ndis_timer_entry), M_DEVBUF, M_NOWAIT);
-	callout_init(&ne->nte_ch, CALLOUT_MPSAFE);
-	TAILQ_INSERT_TAIL(&block->nmb_timerlist, ne, link);
-	ne->nte_timer = (ndis_miniport_timer *)timer;
-
-	INIT_LIST_HEAD((&timer->nt_timer.nk_header.dh_waitlisthead));
-	timer->nt_timer.nk_header.dh_sigstate = FALSE;
-	timer->nt_timer.nk_header.dh_type = EVENT_TYPE_NOTIFY;
-	timer->nt_timer.nk_header.dh_size = OTYPE_TIMER;
-	timer->nt_dpc.nk_sysarg1 = &ne->nte_ch;
-	timer->nt_dpc.nk_deferedfunc = (ndis_kdpc_func)func;
-	timer->nt_dpc.nk_deferredctx = ctx;
-
 	return;
 }
 
 __stdcall static void
 ndis_create_timer(timer, handle, func, ctx)
 	ndis_miniport_timer	*timer;
-	ndis_handle		*handle;
+	ndis_handle		handle;
 	ndis_timer_function	func;
 	void			*ctx;
 {
-	struct ndis_timer_entry	*ne = NULL;
-	ndis_miniport_block	*block;
-	block = (ndis_miniport_block *)handle;
+	/* Save the funcptr and context */
 
-	ne = malloc(sizeof(struct ndis_timer_entry), M_DEVBUF, M_NOWAIT);
-	callout_init(&ne->nte_ch, CALLOUT_MPSAFE);
-	TAILQ_INSERT_TAIL(&block->nmb_timerlist, ne, link);
-	ne->nte_timer = timer;
+	timer->nmt_timerfunc = func;
+	timer->nmt_timerctx = ctx;
+	timer->nmt_block = handle;
 
-	INIT_LIST_HEAD((&timer->nmt_ktimer.nk_header.dh_waitlisthead));
-	timer->nmt_ktimer.nk_header.dh_sigstate = FALSE;
-	timer->nmt_ktimer.nk_header.dh_type = EVENT_TYPE_NOTIFY;
-	timer->nmt_ktimer.nk_header.dh_size = OTYPE_TIMER;
-	timer->nmt_dpc.nk_sysarg1 = &ne->nte_ch;
-	timer->nmt_dpc.nk_deferedfunc = (ndis_kdpc_func)func;
-	timer->nmt_dpc.nk_deferredctx = ctx;
+	ntoskrnl_init_timer(&timer->nmt_ktimer);
+	ntoskrnl_init_dpc(&timer->nmt_kdpc, func, ctx);
 
 	return;
 }
 
 /*
- * The driver's timer callout is __stdcall function, so we need this
- * intermediate step.
- */
-
-static void
-ndis_timercall(arg)
-	void		*arg;
-{
-	ndis_miniport_timer	*timer;
-	__stdcall ndis_timer_function	timerfunc;
-
-	timer = arg;
-
-	timerfunc = (ndis_timer_function)timer->nmt_dpc.nk_deferedfunc;
-	timerfunc(NULL, timer->nmt_dpc.nk_deferredctx, NULL, NULL);
-	ntoskrnl_wakeup(&timer->nmt_ktimer.nk_header);
-
-	return;
-}
-
-/*
- * Windows specifies timeouts in milliseconds. We specify timeouts
- * in hz, so some conversion is required.
+ * In Windows, there's both an NdisMSetTimer() and an NdisSetTimer(),
+ * but the former is just a macro wrapper around the latter.
  */
 __stdcall static void
 ndis_set_timer(timer, msecs)
-	ndis_miniport_timer	*timer;
+	ndis_timer		*timer;
 	uint32_t		msecs;
 {
-	struct callout		*ch;
-	struct timeval		tv;
-
-	tv.tv_sec = 0;
-	tv.tv_usec = msecs * 1000;
-
-	ch = timer->nmt_dpc.nk_sysarg1;
-	timer->nmt_dpc.nk_sysarg2 = ndis_timercall;
-	timer->nmt_ktimer.nk_header.dh_sigstate = FALSE;
-	callout_reset(ch, tvtohz(&tv), timer->nmt_dpc.nk_sysarg2, timer);
+	/*
+	 * KeSetTimer() wants the period in
+	 * hundred nanosecond intervals.
+	 */
+	ntoskrnl_set_timer(&timer->nt_ktimer,
+	    ((int64_t)msecs * -10000), &timer->nt_kdpc);
 
 	return;
 }
 
-static void
-ndis_tick(arg)
-	void			*arg;
-{
-	ndis_miniport_timer	*timer;
-	struct callout		*ch;
-	__stdcall ndis_timer_function	timerfunc;
-	struct timeval		tv;
-
-	timer = arg;
-
-	/* Automatically reload timer. */
-
-	tv.tv_sec = 0;
-	tv.tv_usec = timer->nmt_ktimer.nk_period * 1000;
-	ch = timer->nmt_dpc.nk_sysarg1;
-	timer->nmt_ktimer.nk_header.dh_sigstate = FALSE;
-	timer->nmt_dpc.nk_sysarg2 = ndis_tick;
-	callout_reset(ch, tvtohz(&tv), timer->nmt_dpc.nk_sysarg2, timer);
-
-	timerfunc = (ndis_timer_function)timer->nmt_dpc.nk_deferedfunc;
-	timerfunc(NULL, timer->nmt_dpc.nk_deferredctx, NULL, NULL);
-	ntoskrnl_wakeup(&timer->nmt_ktimer.nk_header);
-
-	return;
-}
-
 __stdcall static void
 ndis_set_periodic_timer(timer, msecs)
 	ndis_miniport_timer	*timer;
 	uint32_t		msecs;
 {
-	struct callout		*ch;
-	struct timeval		tv;
-
-	tv.tv_sec = 0;
-	tv.tv_usec = msecs * 1000;
-
-	timer->nmt_ktimer.nk_period = msecs;
-	ch = timer->nmt_dpc.nk_sysarg1;
-	timer->nmt_dpc.nk_sysarg2 = ndis_tick;
-	timer->nmt_ktimer.nk_header.dh_sigstate = FALSE;
-	callout_reset(ch, tvtohz(&tv), timer->nmt_dpc.nk_sysarg2, timer);
+	ntoskrnl_set_timer_ex(&timer->nmt_ktimer,
+	    ((int64_t)msecs * -10000), msecs, &timer->nmt_kdpc);
 
 	return;
 }
 
+/*
+ * Technically, this is really NdisCancelTimer(), but we also
+ * (ab)use it for NdisMCancelTimer(), since in our implementation
+ * we don't need the extra info in the ndis_miniport_timer
+ * structure.
+ */
+
 __stdcall static void
 ndis_cancel_timer(timer, cancelled)
-	ndis_miniport_timer	*timer;
+	ndis_timer		*timer;
 	uint8_t			*cancelled;
 {
-	struct callout		*ch;
-
-	if (timer == NULL)
-		return;
-	ch = timer->nmt_dpc.nk_sysarg1;
-	if (ch == NULL)
-		return;
-	callout_stop(ch);
-	*cancelled = timer->nmt_ktimer.nk_header.dh_sigstate;
+	*cancelled = ntoskrnl_cancel_timer(&timer->nt_ktimer);
 
 	return;
 }
@@ -1990,10 +1905,13 @@
 ndis_init_event(event)
 	ndis_event		*event;
 {
-	event->ne_event.nk_header.dh_sigstate = FALSE;
-	event->ne_event.nk_header.dh_size = OTYPE_EVENT;
-	event->ne_event.nk_header.dh_type = EVENT_TYPE_NOTIFY;
-	INIT_LIST_HEAD((&event->ne_event.nk_header.dh_waitlisthead));
+	/*
+	 * NDIS events are always synchronization
+	 * events, and should be initialized to the
+	 * not signaled state.
+	 */
+ 
+	ntoskrnl_init_event(&event->ne_event, EVENT_TYPE_SYNC, FALSE);
 	return;
 }
 
@@ -2001,7 +1919,7 @@
 ndis_set_event(event)
 	ndis_event		*event;
 {
-	ntoskrnl_wakeup(event);
+	ntoskrnl_set_event(&event->ne_event, 0, 0);
 	return;
 }
 
@@ -2009,56 +1927,27 @@
 ndis_reset_event(event)
 	ndis_event		*event;
 {
-	event->ne_event.nk_header.dh_sigstate = FALSE;
+	ntoskrnl_reset_event(&event->ne_event);
 	return;
 }
 
-/*
- * This is a stripped-down version of KeWaitForSingleObject().
- * Maybe it ought to just call ntoskrnl_waitforobj() to reduce
- * code duplication.
- */
-
 __stdcall static uint8_t
 ndis_wait_event(event, msecs)
 	ndis_event		*event;
 	uint32_t		msecs;
 {
-	int			error;
-	struct timeval		tv;
-	wait_block		w;
-	struct thread		*td = curthread;
+	int64_t			duetime;
+	uint32_t		rval;
 
-	mtx_pool_lock(ndis_mtxpool, ntoskrnl_dispatchlock);
+	duetime = ((int64_t)msecs * -10000);
 
-	if (event->ne_event.nk_header.dh_sigstate == TRUE) {
-		mtx_pool_unlock(ndis_mtxpool, ntoskrnl_dispatchlock);
-		return(TRUE);
-	}
+	rval = ntoskrnl_waitforobj((nt_dispatch_header *)event,
+	    0, 0, TRUE, msecs ? &duetime : NULL);
 
-	INSERT_LIST_TAIL((&event->ne_event.nk_header.dh_waitlisthead),
-	    (&w.wb_waitlist));
+	if (rval == STATUS_TIMEOUT)
+		return(FALSE);
 
-	tv.tv_sec = 0;
-	tv.tv_usec = msecs * 1000;
-
-	w.wb_kthread = td;
-	w.wb_object = &event->ne_event.nk_header;
-
-	mtx_pool_unlock(ndis_mtxpool, ntoskrnl_dispatchlock);
-
-	if (td->td_proc->p_flag & P_KTHREAD)
-		error = kthread_suspend(td->td_proc, tvtohz(&tv));
-	else
-		error = tsleep(td, PPAUSE|PCATCH, "ndiswe", tvtohz(&tv));
-
-	mtx_pool_lock(ndis_mtxpool, ntoskrnl_dispatchlock);
-
-	REMOVE_LIST_ENTRY((&w.wb_waitlist));
-
-	mtx_pool_unlock(ndis_mtxpool, ntoskrnl_dispatchlock);
-
-	return(event->ne_event.nk_header.dh_sigstate);
+	return(TRUE);
 }
 
 __stdcall static ndis_status

==== //depot/projects/gdb/sys/compat/ndis/subr_ntoskrnl.c#7 (text+ko) ====

@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/compat/ndis/subr_ntoskrnl.c,v 1.28 2004/03/15 16:39:03 wpaul Exp $");
+__FBSDID("$FreeBSD: src/sys/compat/ndis/subr_ntoskrnl.c,v 1.29 2004/03/20 23:39:43 wpaul Exp $");
 
 #include <sys/ctype.h>
 #include <sys/unistd.h>
@@ -81,25 +81,11 @@
 	void *, uint32_t, uint32_t *, void *, void *);

>>> TRUNCATED FOR MAIL (1000 lines) <<<


More information about the p4-projects mailing list