Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/external/bsd/drm2/include/linux Add non-atomic Linux tes...



details:   https://anonhg.NetBSD.org/src/rev/bd9b177e8d37
branches:  trunk
changeset: 330669:bd9b177e8d37
user:      riastradh <riastradh%NetBSD.org@localhost>
date:      Thu Jul 17 14:28:28 2014 +0000

description:
Add non-atomic Linux test-and-set operations.

diffstat:

 sys/external/bsd/drm2/include/linux/bitops.h |  44 +++++++++++++++++++++++++++-
 1 files changed, 43 insertions(+), 1 deletions(-)

diffs (58 lines):

diff -r 4e5ee4f0e050 -r bd9b177e8d37 sys/external/bsd/drm2/include/linux/bitops.h
--- a/sys/external/bsd/drm2/include/linux/bitops.h      Thu Jul 17 14:07:44 2014 +0000
+++ b/sys/external/bsd/drm2/include/linux/bitops.h      Thu Jul 17 14:28:28 2014 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: bitops.h,v 1.4 2014/07/16 20:59:58 riastradh Exp $     */
+/*     $NetBSD: bitops.h,v 1.5 2014/07/17 14:28:28 riastradh Exp $     */
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -97,6 +97,48 @@
 }
 
 static inline unsigned long
+__test_and_set_bit(unsigned int bit, volatile unsigned long *ptr)
+{
+       const unsigned int units = (sizeof(*ptr) * CHAR_BIT);
+       volatile unsigned long *const p = &ptr[bit / units];
+       const unsigned long mask = (1UL << (bit % units));
+       unsigned long v;
+
+       v = *p;
+       *p |= mask;
+
+       return (v & mask);
+}
+
+static inline unsigned long
+__test_and_clear_bit(unsigned int bit, volatile unsigned long *ptr)
+{
+       const unsigned int units = (sizeof(*ptr) * CHAR_BIT);
+       volatile unsigned long *const p = &ptr[bit / units];
+       const unsigned long mask = (1UL << (bit % units));
+       unsigned long v;
+
+       v = *p;
+       *p &= ~mask;
+
+       return (v & mask);
+}
+
+static inline unsigned long
+__test_and_change_bit(unsigned int bit, volatile unsigned long *ptr)
+{
+       const unsigned int units = (sizeof(*ptr) * CHAR_BIT);
+       volatile unsigned long *const p = &ptr[bit / units];
+       const unsigned long mask = (1UL << (bit % units));
+       unsigned long v;
+
+       v = *p;
+       *p ^= mask;
+
+       return (v & mask);
+}
+
+static inline unsigned long
 find_first_zero_bit(const unsigned long *ptr, unsigned long nbits)
 {
        const size_t bpl = (CHAR_BIT * sizeof(*ptr));



Home | Main Index | Thread Index | Old Index