>Number:         171550
>Category:       kern
>Synopsis:       patch: "no match for InterlockedCompareExchange" and then 
>kernel panic upon kldload ndisgen module for RTL8188/8192CU
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Tue Sep 11 16:40:07 UTC 2012
>Closed-Date:
>Last-Modified:
>Originator:     Chris Radek
>Release:        9.0-RELEASE-p4
>Organization:
>Environment:
FreeBSD tiny.timeguy.com 9.0-RELEASE-p4 FreeBSD 9.0-RELEASE-p4 #1: Fri Aug 24 
17:13:08 CDT 2012     [email protected]:/usr/obj/usr/src/sys/TINY  i386
>Description:
One of the things I tried to get my Airlink101 AWLL5099 (usb wifi) working was 
wrapping various related drivers with ndisgen.  This patch fixes a kernel panic 
upon loading the resulting .ko file, and eliminates the warning "no match for 
InterlockedCompareExchange".

The driver still didn't work, and I have moved on, but google searches tell me 
that other drivers may also need this call so I figure the patch might be 
helpful.

In my case, the remaining failure is "no match for PoRequestPowerIrp" and I 
don't understand that one well enough to fix it.
>How-To-Repeat:
Use ndisgen to wrap a windows driver that uses InterlockedCompareExchange.  For 
example, the one found at: 
http://www.airlink101.com/support/index.php?cmd=files&id=202

Or apparently others:
http://lists.freebsd.org/pipermail/freebsd-current/2006-January/059723.html
>Fix:
Attached patch

Patch attached with submission follows:

diff --recursive -u usrsrc9.orig/sys/compat/ndis/ntoskrnl_var.h 
usrsrc9/sys/compat/ndis/ntoskrnl_var.h
--- usrsrc9.orig/sys/compat/ndis/ntoskrnl_var.h 2012-09-08 17:30:39.673644663 
-0500
+++ usrsrc9/sys/compat/ndis/ntoskrnl_var.h      2012-09-08 17:31:21.248566542 
-0500
@@ -1460,6 +1460,8 @@
 extern uint8_t KeSynchronizeExecution(kinterrupt *, void *, void *);
 extern uintptr_t InterlockedExchange(volatile uint32_t *,
        uintptr_t);
+extern uintptr_t InterlockedCompareExchange(volatile uint32_t *,
+       uintptr_t, uintptr_t);
 extern void *ExAllocatePoolWithTag(uint32_t, size_t, uint32_t);
 extern void ExFreePool(void *);
 extern uint32_t IoConnectInterrupt(kinterrupt **, void *, void *,
diff --recursive -u usrsrc9.orig/sys/compat/ndis/subr_ntoskrnl.c 
usrsrc9/sys/compat/ndis/subr_ntoskrnl.c
--- usrsrc9.orig/sys/compat/ndis/subr_ntoskrnl.c        2012-09-08 
17:30:27.011560031 -0500
+++ usrsrc9/sys/compat/ndis/subr_ntoskrnl.c     2012-09-08 17:31:21.249568664 
-0500
@@ -2361,6 +2361,22 @@
        return (r);
 }
 
+uintptr_t
+InterlockedCompareExchange(dst, exc, com)
+       volatile uint32_t       *dst;
+       uintptr_t               exc;
+       uintptr_t               com;
+{
+       uintptr_t               r;
+
+       mtx_lock_spin(&ntoskrnl_interlock);
+       r = *dst;
+       if(*dst == com) *dst = exc;
+       mtx_unlock_spin(&ntoskrnl_interlock);
+
+       return (r);
+}
+
 static uint32_t
 InterlockedIncrement(addend)
        volatile uint32_t       *addend;
@@ -4381,6 +4397,7 @@
        IMPORT_FFUNC(InterlockedIncrement, 1),
        IMPORT_FFUNC(InterlockedDecrement, 1),
        IMPORT_FFUNC(InterlockedExchange, 2),
+       IMPORT_FFUNC(InterlockedCompareExchange, 3),
        IMPORT_FFUNC(ExInterlockedAddLargeStatistic, 2),
        IMPORT_SFUNC(IoAllocateMdl, 5),
        IMPORT_SFUNC(IoFreeMdl, 1),


>Release-Note:
>Audit-Trail:
>Unformatted:
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-bugs
To unsubscribe, send any mail to "[email protected]"

Reply via email to