Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 12 Dec 2003 23:41:12 -0800 (PST)
From:      Bill Paul <wpaul@FreeBSD.org>
To:        src-committers@FreeBSD.org, cvs-src@FreeBSD.org, cvs-all@FreeBSD.org
Subject:   cvs commit: src/sys/compat/ndis ntoskrnl_var.h subr_ndis.c subr_ntoskrnl.c
Message-ID:  <200312130741.hBD7fCDk002934@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
wpaul       2003/12/12 23:41:12 PST

  FreeBSD src repository

  Modified files:
    sys/compat/ndis      ntoskrnl_var.h subr_ndis.c 
                         subr_ntoskrnl.c 
  Log:
  subr_ndis.c:
  - fix ndis_time() so that it returns a time based on the proper
    epoch (wacky though it may be)
  - implement NdisInitializeString() and NdisFreeString(), and add
    stub for NdisMRemoveMiniport()
  
  ntoskrnl_var.h:
  - add missing member to the general_lookaside struct (gl_listentry)
  
  subr_ntoskrnl.c:
  - Fix arguments to the interlocked push/pop routines: 'head' is an
    slist_header *, not an slist_entry *
  - Kludge up _fastcall support for the push/pop routines. The _fastcall
    convention is similar to _stdcall, except the first two available
    DWORD-sized arguments are passed in %ecx and %edx, respectively.
    One kludge for this __attribute__ ((regparm(3))), however this
    isn't entirely right, as it assumes %eax, %ecx and %edx will be
    used (regparm(2) assumes %eax and %edx). Another kludge is to
    declare the two fastcall-ed args as local register variables and
    explicitly assign them to %ecx and %edx, but experimentation showed
    that gcc would not guard %ecx and %edx against being clobbered.
    Thus, I came up with a 3rd kludge, which is to use some inline
    assembly of the form:
  
          void            *arg1;
          void            *arg2;
  
          __asm__("movl %%ecx, %%ecx" : "=c" (arg1));
          __asm__("movl %%edx, %%edx" : "=d" (arg2));
  
    This lets gcc know that we're going to reference %ecx and %edx and
    that it should make an effort not to let it get trampled. This wastes
    an instruction (movl %reg, %reg is a no-op) but insures proper
    behavior. It's possible there's a better way to do this though:
    this is the first time I've used inline assembler in this fashion.
  
  The above fixes to ntoskrnl_var.h an subr_ntoskrnl.c make lookaside
  lists work for the two drivers I have that use them, one of which
  is an NDIS 5.0 miniport and another which is 5.1.
  
  Revision  Changes    Path
  1.2       +8 -0      src/sys/compat/ndis/ntoskrnl_var.h
  1.4       +46 -1     src/sys/compat/ndis/subr_ndis.c
  1.3       +49 -32    src/sys/compat/ndis/subr_ntoskrnl.c



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200312130741.hBD7fCDk002934>