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