diff --git a/drivers/network/tcpip/include/lwip/arch/sys_arch.h b/drivers/network/tcpip/include/lwip/arch/sys_arch.h index 5844b37b8ec..848ac888fd2 100644 --- a/drivers/network/tcpip/include/lwip/arch/sys_arch.h +++ b/drivers/network/tcpip/include/lwip/arch/sys_arch.h @@ -15,7 +15,7 @@ typedef struct _sys_mbox_t int Valid; } sys_mbox_t; -typedef KIRQL sys_prot_t; +typedef u32_t sys_prot_t; typedef u32_t sys_thread_t; diff --git a/drivers/network/tcpip/ip/lwip_glue/sys_arch.c b/drivers/network/tcpip/ip/lwip_glue/sys_arch.c index 8636b22f6f3..617abb3a07d 100644 --- a/drivers/network/tcpip/ip/lwip_glue/sys_arch.c +++ b/drivers/network/tcpip/ip/lwip_glue/sys_arch.c @@ -5,6 +5,8 @@ static LIST_ENTRY ThreadListHead; static KSPIN_LOCK ThreadListLock; +static ERESOURCE GlobalLock; +static ULONG GlobalLockLevel = 0; KEVENT TerminationEvent; NPAGED_LOOKASIDE_LIST MessageLookasideList; @@ -32,14 +34,18 @@ u32_t sys_now(void) void sys_arch_protect(sys_prot_t *lev) { - /* Preempt the dispatcher */ - KeRaiseIrql(DISPATCH_LEVEL, lev); + /* Acquire the global resource to prevent other CPUs from running */ + ExEnterCriticalRegionAndAcquireResourceExclusive(&GlobalLock); + *lev = ++GlobalLockLevel; } void sys_arch_unprotect(sys_prot_t lev) { - KeLowerIrql(lev); + /* Release the global resource */ + ASSERT((GlobalLockLevel > 0) && (lev == GlobalLockLevel)); + GlobalLockLevel--; + ExReleaseResourceAndLeaveCriticalRegion(&GlobalLock); } err_t