Date: Sat, 20 Mar 2004 18:27:29 -0800 (PST) From: Marcel Moolenaar <marcel@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 49425 for review Message-ID: <200403210227.i2L2RTlj015571@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=49425 Change 49425 by marcel@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,@function _init: + subq $8,%rsp .section .fini,"ax",@progbits .align 4 .globl _fini .type _fini,@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",@progbits + addq $8,%rsp ret .section .fini,"ax",@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,@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@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,@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@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) <<<
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200403210227.i2L2RTlj015571>