From 6fc51f62c75357e072ce2af9d32932da756d5d23 Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Thu, 29 Jul 2004 20:31:13 +0000 Subject: [PATCH] Add a test-and-set and release poll function. This is really just a hack to support NDIS emulation. --- sys/cpu/i386/include/atomic.h | 36 +++++++++++++++++++++++++++++++++-- sys/i386/include/atomic.h | 36 +++++++++++++++++++++++++++++++++-- 2 files changed, 68 insertions(+), 4 deletions(-) diff --git a/sys/cpu/i386/include/atomic.h b/sys/cpu/i386/include/atomic.h index 6045d80150..022aa93392 100644 --- a/sys/cpu/i386/include/atomic.h +++ b/sys/cpu/i386/include/atomic.h @@ -24,7 +24,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/i386/include/atomic.h,v 1.9.2.1 2000/07/07 00:38:47 obrien Exp $ - * $DragonFly: src/sys/cpu/i386/include/atomic.h,v 1.7 2004/02/14 22:26:43 dillon Exp $ + * $DragonFly: src/sys/cpu/i386/include/atomic.h,v 1.8 2004/07/29 20:31:13 dillon Exp $ */ #ifndef _MACHINE_ATOMIC_H_ #define _MACHINE_ATOMIC_H_ @@ -66,7 +66,6 @@ #define ATOMIC_ASM(NAME, TYPE, OP, V) \ extern void atomic_##NAME##_##TYPE(volatile u_##TYPE *p, u_##TYPE v); \ extern void atomic_##NAME##_##TYPE##_nonlocked(volatile u_##TYPE *p, u_##TYPE v); - #else /* !KLD_MODULE */ #if defined(SMP) #define MPLOCKED "lock ; " @@ -127,4 +126,37 @@ ATOMIC_ASM(clear, long, "andl %1,%0", ~v) ATOMIC_ASM(add, long, "addl %1,%0", v) ATOMIC_ASM(subtract, long, "subl %1,%0", v) +/* + * atomic_poll_acquire_int(P) Returns non-zero on success, 0 on failure + * atomic_poll_release_int(P) + * + * Currently these are hacks just to support the NDIS driver. + */ + +#if defined(KLD_MODULE) + +extern int atomic_poll_acquire_int(volatile u_int *p); +extern void atomic_poll_release_int(volatile u_int *p); + +#else + +static __inline +int +atomic_poll_acquire_int(volatile u_int *p) +{ + u_int data; + + __asm __volatile(MPLOCKED "btsl $0,%0; setnc %%al; andl $255,%%eax" : "+m" (*p), "=a" (data)); + return(data); +} + +static __inline +void +atomic_poll_release_int(volatile u_int *p) +{ + __asm __volatile("movl $0,%0" : "+m" (*p)); +} + +#endif + #endif /* ! _MACHINE_ATOMIC_H_ */ diff --git a/sys/i386/include/atomic.h b/sys/i386/include/atomic.h index 23651c9ebb..1fd60c8ad2 100644 --- a/sys/i386/include/atomic.h +++ b/sys/i386/include/atomic.h @@ -24,7 +24,7 @@ * SUCH DAMAGE. * * $FreeBSD: src/sys/i386/include/atomic.h,v 1.9.2.1 2000/07/07 00:38:47 obrien Exp $ - * $DragonFly: src/sys/i386/include/Attic/atomic.h,v 1.7 2004/02/14 22:26:43 dillon Exp $ + * $DragonFly: src/sys/i386/include/Attic/atomic.h,v 1.8 2004/07/29 20:31:13 dillon Exp $ */ #ifndef _MACHINE_ATOMIC_H_ #define _MACHINE_ATOMIC_H_ @@ -66,7 +66,6 @@ #define ATOMIC_ASM(NAME, TYPE, OP, V) \ extern void atomic_##NAME##_##TYPE(volatile u_##TYPE *p, u_##TYPE v); \ extern void atomic_##NAME##_##TYPE##_nonlocked(volatile u_##TYPE *p, u_##TYPE v); - #else /* !KLD_MODULE */ #if defined(SMP) #define MPLOCKED "lock ; " @@ -127,4 +126,37 @@ ATOMIC_ASM(clear, long, "andl %1,%0", ~v) ATOMIC_ASM(add, long, "addl %1,%0", v) ATOMIC_ASM(subtract, long, "subl %1,%0", v) +/* + * atomic_poll_acquire_int(P) Returns non-zero on success, 0 on failure + * atomic_poll_release_int(P) + * + * Currently these are hacks just to support the NDIS driver. + */ + +#if defined(KLD_MODULE) + +extern int atomic_poll_acquire_int(volatile u_int *p); +extern void atomic_poll_release_int(volatile u_int *p); + +#else + +static __inline +int +atomic_poll_acquire_int(volatile u_int *p) +{ + u_int data; + + __asm __volatile(MPLOCKED "btsl $0,%0; setnc %%al; andl $255,%%eax" : "+m" (*p), "=a" (data)); + return(data); +} + +static __inline +void +atomic_poll_release_int(volatile u_int *p) +{ + __asm __volatile("movl $0,%0" : "+m" (*p)); +} + +#endif + #endif /* ! _MACHINE_ATOMIC_H_ */ -- 2.41.0