diff options
author | bde <bde@FreeBSD.org> | 1995-05-11 07:24:35 +0000 |
---|---|---|
committer | bde <bde@FreeBSD.org> | 1995-05-11 07:24:35 +0000 |
commit | 6b36fe2f86aca870f4fcd055248ca4c2968544f3 (patch) | |
tree | 24af9852d5a39bfeb996cd7f588e0bd786d35375 /sys | |
parent | 25bef3eb9db61fffd6208d9c478868aef3808426 (diff) | |
download | FreeBSD-src-6b36fe2f86aca870f4fcd055248ca4c2968544f3.zip FreeBSD-src-6b36fe2f86aca870f4fcd055248ca4c2968544f3.tar.gz |
Add loadandclear(). It atomically loads a value from memory, clears the
value in memory and returns the original value.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/amd64/include/cpufunc.h | 13 | ||||
-rw-r--r-- | sys/i386/include/cpufunc.h | 13 |
2 files changed, 24 insertions, 2 deletions
diff --git a/sys/amd64/include/cpufunc.h b/sys/amd64/include/cpufunc.h index 5ea6be2..3e60a08 100644 --- a/sys/amd64/include/cpufunc.h +++ b/sys/amd64/include/cpufunc.h @@ -30,7 +30,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: cpufunc.h,v 1.33 1995/02/16 13:21:47 bde Exp $ + * $Id: cpufunc.h,v 1.34 1995/03/03 22:14:42 davidg Exp $ */ /* @@ -189,6 +189,16 @@ inw(u_int port) return (data); } +static __inline unsigned +loadandclear(u_int *addr) +{ + u_int result; + + __asm __volatile("xorl %0,%0; xchgl %1,%0" + : "=r" (result) : "m" (*addr)); + return (result); +} + static __inline void outbv(u_int port, u_char data) { @@ -319,6 +329,7 @@ void insb __P((u_int port, void *addr, size_t cnt)); void insl __P((u_int port, void *addr, size_t cnt)); void insw __P((u_int port, void *addr, size_t cnt)); u_short inw __P((u_int port)); +u_int loadandclear __P((u_int *addr)); void outb __P((u_int port, u_char data)); void outl __P((u_int port, u_long data)); void outsb __P((u_int port, void *addr, size_t cnt)); diff --git a/sys/i386/include/cpufunc.h b/sys/i386/include/cpufunc.h index 5ea6be2..3e60a08 100644 --- a/sys/i386/include/cpufunc.h +++ b/sys/i386/include/cpufunc.h @@ -30,7 +30,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: cpufunc.h,v 1.33 1995/02/16 13:21:47 bde Exp $ + * $Id: cpufunc.h,v 1.34 1995/03/03 22:14:42 davidg Exp $ */ /* @@ -189,6 +189,16 @@ inw(u_int port) return (data); } +static __inline unsigned +loadandclear(u_int *addr) +{ + u_int result; + + __asm __volatile("xorl %0,%0; xchgl %1,%0" + : "=r" (result) : "m" (*addr)); + return (result); +} + static __inline void outbv(u_int port, u_char data) { @@ -319,6 +329,7 @@ void insb __P((u_int port, void *addr, size_t cnt)); void insl __P((u_int port, void *addr, size_t cnt)); void insw __P((u_int port, void *addr, size_t cnt)); u_short inw __P((u_int port)); +u_int loadandclear __P((u_int *addr)); void outb __P((u_int port, u_char data)); void outl __P((u_int port, u_long data)); void outsb __P((u_int port, void *addr, size_t cnt)); |