Date: Tue, 11 Sep 2012 16:34:51 GMT From: Chris Radek <chris@timeguy.com> To: freebsd-gnats-submit@FreeBSD.org Subject: kern/171550: patch: "no match for InterlockedCompareExchange" and then kernel panic upon kldload ndisgen module for RTL8188/8192CU Message-ID: <201209111634.q8BGYpU9003318@red.freebsd.org> Resent-Message-ID: <201209111640.q8BGe745063973@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>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 root@tiny.timeguy.com:/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:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201209111634.q8BGYpU9003318>