LCOV - code coverage report
Current view: top level - arch/x86/include/asm - bitops.h (source / functions) Hit Total Coverage
Test: btrfstest.info Lines: 13 17 76.5 %
Date: 2014-11-28 Functions: 1 1 100.0 %

          Line data    Source code
       1             : #ifndef _ASM_X86_BITOPS_H
       2             : #define _ASM_X86_BITOPS_H
       3             : 
       4             : /*
       5             :  * Copyright 1992, Linus Torvalds.
       6             :  *
       7             :  * Note: inlines with more than a single statement should be marked
       8             :  * __always_inline to avoid problems with older gcc's inlining heuristics.
       9             :  */
      10             : 
      11             : #ifndef _LINUX_BITOPS_H
      12             : #error only <linux/bitops.h> can be included directly
      13             : #endif
      14             : 
      15             : #include <linux/compiler.h>
      16             : #include <asm/alternative.h>
      17             : #include <asm/rmwcc.h>
      18             : #include <asm/barrier.h>
      19             : 
      20             : #if BITS_PER_LONG == 32
      21             : # define _BITOPS_LONG_SHIFT 5
      22             : #elif BITS_PER_LONG == 64
      23             : # define _BITOPS_LONG_SHIFT 6
      24             : #else
      25             : # error "Unexpected BITS_PER_LONG"
      26             : #endif
      27             : 
      28             : #define BIT_64(n)                       (U64_C(1) << (n))
      29             : 
      30             : /*
      31             :  * These have to be done with inline assembly: that way the bit-setting
      32             :  * is guaranteed to be atomic. All bit operations return 0 if the bit
      33             :  * was cleared before the operation and != 0 if it was not.
      34             :  *
      35             :  * bit 0 is the LSB of addr; bit 32 is the LSB of (addr+1).
      36             :  */
      37             : 
      38             : #if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 1)
      39             : /* Technically wrong, but this avoids compilation errors on some gcc
      40             :    versions. */
      41             : #define BITOP_ADDR(x) "=m" (*(volatile long *) (x))
      42             : #else
      43             : #define BITOP_ADDR(x) "+m" (*(volatile long *) (x))
      44             : #endif
      45             : 
      46             : #define ADDR                            BITOP_ADDR(addr)
      47             : 
      48             : /*
      49             :  * We do the locked ops that don't return the old value as
      50             :  * a mask operation on a byte.
      51             :  */
      52             : #define IS_IMMEDIATE(nr)                (__builtin_constant_p(nr))
      53             : #define CONST_MASK_ADDR(nr, addr)       BITOP_ADDR((void *)(addr) + ((nr)>>3))
      54             : #define CONST_MASK(nr)                  (1 << ((nr) & 7))
      55             : 
      56             : /**
      57             :  * set_bit - Atomically set a bit in memory
      58             :  * @nr: the bit to set
      59             :  * @addr: the address to start counting from
      60             :  *
      61             :  * This function is atomic and may not be reordered.  See __set_bit()
      62             :  * if you do not require the atomic guarantees.
      63             :  *
      64             :  * Note: there are no guarantees that this function will not be reordered
      65             :  * on non x86 architectures, so if you are writing portable code,
      66             :  * make sure not to rely on its reordering guarantees.
      67             :  *
      68             :  * Note that @nr may be almost arbitrarily large; this function is not
      69             :  * restricted to acting on a single-word quantity.
      70             :  */
      71             : static __always_inline void
      72             : set_bit(long nr, volatile unsigned long *addr)
      73             : {
      74        5860 :         if (IS_IMMEDIATE(nr)) {
      75     6352801 :                 asm volatile(LOCK_PREFIX "orb %1,%0"
      76     6270515 :                         : CONST_MASK_ADDR(nr, addr)
      77           0 :                         : "iq" ((u8)CONST_MASK(nr))
      78             :                         : "memory");
      79             :         } else {
      80        5860 :                 asm volatile(LOCK_PREFIX "bts %1,%0"
      81             :                         : BITOP_ADDR(addr) : "Ir" (nr) : "memory");
      82             :         }
      83             : }
      84             : 
      85             : /**
      86             :  * __set_bit - Set a bit in memory
      87             :  * @nr: the bit to set
      88             :  * @addr: the address to start counting from
      89             :  *
      90             :  * Unlike set_bit(), this function is non-atomic and may be reordered.
      91             :  * If it's called on the same region of memory simultaneously, the effect
      92             :  * may be that only one operation succeeds.
      93             :  */
      94             : static inline void __set_bit(long nr, volatile unsigned long *addr)
      95             : {
      96             :         asm volatile("bts %1,%0" : ADDR : "Ir" (nr) : "memory");
      97             : }
      98             : 
      99             : /**
     100             :  * clear_bit - Clears a bit in memory
     101             :  * @nr: Bit to clear
     102             :  * @addr: Address to start counting from
     103             :  *
     104             :  * clear_bit() is atomic and may not be reordered.  However, it does
     105             :  * not contain a memory barrier, so if it is used for locking purposes,
     106             :  * you should call smp_mb__before_atomic() and/or smp_mb__after_atomic()
     107             :  * in order to ensure changes are visible on other processors.
     108             :  */
     109             : static __always_inline void
     110             : clear_bit(long nr, volatile unsigned long *addr)
     111             : {
     112             :         if (IS_IMMEDIATE(nr)) {
     113    10966769 :                 asm volatile(LOCK_PREFIX "andb %1,%0"
     114     9386637 :                         : CONST_MASK_ADDR(nr, addr)
     115             :                         : "iq" ((u8)~CONST_MASK(nr)));
     116             :         } else {
     117             :                 asm volatile(LOCK_PREFIX "btr %1,%0"
     118             :                         : BITOP_ADDR(addr)
     119             :                         : "Ir" (nr));
     120             :         }
     121             : }
     122             : 
     123             : /*
     124             :  * clear_bit_unlock - Clears a bit in memory
     125             :  * @nr: Bit to clear
     126             :  * @addr: Address to start counting from
     127             :  *
     128             :  * clear_bit() is atomic and implies release semantics before the memory
     129             :  * operation. It can be used for an unlock.
     130             :  */
     131             : static inline void clear_bit_unlock(long nr, volatile unsigned long *addr)
     132             : {
     133             :         barrier();
     134             :         clear_bit(nr, addr);
     135             : }
     136             : 
     137             : static inline void __clear_bit(long nr, volatile unsigned long *addr)
     138             : {
     139             :         asm volatile("btr %1,%0" : ADDR : "Ir" (nr));
     140             : }
     141             : 
     142             : /*
     143             :  * __clear_bit_unlock - Clears a bit in memory
     144             :  * @nr: Bit to clear
     145             :  * @addr: Address to start counting from
     146             :  *
     147             :  * __clear_bit() is non-atomic and implies release semantics before the memory
     148             :  * operation. It can be used for an unlock if no other CPUs can concurrently
     149             :  * modify other bits in the word.
     150             :  *
     151             :  * No memory barrier is required here, because x86 cannot reorder stores past
     152             :  * older loads. Same principle as spin_unlock.
     153             :  */
     154             : static inline void __clear_bit_unlock(long nr, volatile unsigned long *addr)
     155             : {
     156             :         barrier();
     157             :         __clear_bit(nr, addr);
     158             : }
     159             : 
     160             : /**
     161             :  * __change_bit - Toggle a bit in memory
     162             :  * @nr: the bit to change
     163             :  * @addr: the address to start counting from
     164             :  *
     165             :  * Unlike change_bit(), this function is non-atomic and may be reordered.
     166             :  * If it's called on the same region of memory simultaneously, the effect
     167             :  * may be that only one operation succeeds.
     168             :  */
     169             : static inline void __change_bit(long nr, volatile unsigned long *addr)
     170             : {
     171             :         asm volatile("btc %1,%0" : ADDR : "Ir" (nr));
     172             : }
     173             : 
     174             : /**
     175             :  * change_bit - Toggle a bit in memory
     176             :  * @nr: Bit to change
     177             :  * @addr: Address to start counting from
     178             :  *
     179             :  * change_bit() is atomic and may not be reordered.
     180             :  * Note that @nr may be almost arbitrarily large; this function is not
     181             :  * restricted to acting on a single-word quantity.
     182             :  */
     183             : static inline void change_bit(long nr, volatile unsigned long *addr)
     184             : {
     185             :         if (IS_IMMEDIATE(nr)) {
     186             :                 asm volatile(LOCK_PREFIX "xorb %1,%0"
     187             :                         : CONST_MASK_ADDR(nr, addr)
     188             :                         : "iq" ((u8)CONST_MASK(nr)));
     189             :         } else {
     190             :                 asm volatile(LOCK_PREFIX "btc %1,%0"
     191             :                         : BITOP_ADDR(addr)
     192             :                         : "Ir" (nr));
     193             :         }
     194             : }
     195             : 
     196             : /**
     197             :  * test_and_set_bit - Set a bit and return its old value
     198             :  * @nr: Bit to set
     199             :  * @addr: Address to count from
     200             :  *
     201             :  * This operation is atomic and cannot be reordered.
     202             :  * It also implies a memory barrier.
     203             :  */
     204     2829409 : static inline int test_and_set_bit(long nr, volatile unsigned long *addr)
     205             : {
     206     4216768 :         GEN_BINARY_RMWcc(LOCK_PREFIX "bts", *addr, "Ir", nr, "%0", "c");
     207             : }
     208             : 
     209             : /**
     210             :  * test_and_set_bit_lock - Set a bit and return its old value for lock
     211             :  * @nr: Bit to set
     212             :  * @addr: Address to count from
     213             :  *
     214             :  * This is the same as test_and_set_bit on x86.
     215             :  */
     216             : static __always_inline int
     217             : test_and_set_bit_lock(long nr, volatile unsigned long *addr)
     218             : {
     219     2829518 :         return test_and_set_bit(nr, addr);
     220             : }
     221             : 
     222             : /**
     223             :  * __test_and_set_bit - Set a bit and return its old value
     224             :  * @nr: Bit to set
     225             :  * @addr: Address to count from
     226             :  *
     227             :  * This operation is non-atomic and can be reordered.
     228             :  * If two examples of this operation race, one can appear to succeed
     229             :  * but actually fail.  You must protect multiple accesses with a lock.
     230             :  */
     231             : static inline int __test_and_set_bit(long nr, volatile unsigned long *addr)
     232             : {
     233             :         int oldbit;
     234             : 
     235             :         asm("bts %2,%1\n\t"
     236             :             "sbb %0,%0"
     237             :             : "=r" (oldbit), ADDR
     238             :             : "Ir" (nr));
     239             :         return oldbit;
     240             : }
     241             : 
     242             : /**
     243             :  * test_and_clear_bit - Clear a bit and return its old value
     244             :  * @nr: Bit to clear
     245             :  * @addr: Address to count from
     246             :  *
     247             :  * This operation is atomic and cannot be reordered.
     248             :  * It also implies a memory barrier.
     249             :  */
     250             : static inline int test_and_clear_bit(long nr, volatile unsigned long *addr)
     251             : {
     252     2318025 :         GEN_BINARY_RMWcc(LOCK_PREFIX "btr", *addr, "Ir", nr, "%0", "c");
     253             : }
     254             : 
     255             : /**
     256             :  * __test_and_clear_bit - Clear a bit and return its old value
     257             :  * @nr: Bit to clear
     258             :  * @addr: Address to count from
     259             :  *
     260             :  * This operation is non-atomic and can be reordered.
     261             :  * If two examples of this operation race, one can appear to succeed
     262             :  * but actually fail.  You must protect multiple accesses with a lock.
     263             :  *
     264             :  * Note: the operation is performed atomically with respect to
     265             :  * the local CPU, but not other CPUs. Portable code should not
     266             :  * rely on this behaviour.
     267             :  * KVM relies on this behaviour on x86 for modifying memory that is also
     268             :  * accessed from a hypervisor on the same CPU if running in a VM: don't change
     269             :  * this without also updating arch/x86/kernel/kvm.c
     270             :  */
     271             : static inline int __test_and_clear_bit(long nr, volatile unsigned long *addr)
     272             : {
     273             :         int oldbit;
     274             : 
     275             :         asm volatile("btr %2,%1\n\t"
     276             :                      "sbb %0,%0"
     277             :                      : "=r" (oldbit), ADDR
     278             :                      : "Ir" (nr));
     279             :         return oldbit;
     280             : }
     281             : 
     282             : /* WARNING: non atomic and it can be reordered! */
     283             : static inline int __test_and_change_bit(long nr, volatile unsigned long *addr)
     284             : {
     285             :         int oldbit;
     286             : 
     287             :         asm volatile("btc %2,%1\n\t"
     288             :                      "sbb %0,%0"
     289             :                      : "=r" (oldbit), ADDR
     290             :                      : "Ir" (nr) : "memory");
     291             : 
     292             :         return oldbit;
     293             : }
     294             : 
     295             : /**
     296             :  * test_and_change_bit - Change a bit and return its old value
     297             :  * @nr: Bit to change
     298             :  * @addr: Address to count from
     299             :  *
     300             :  * This operation is atomic and cannot be reordered.
     301             :  * It also implies a memory barrier.
     302             :  */
     303             : static inline int test_and_change_bit(long nr, volatile unsigned long *addr)
     304             : {
     305             :         GEN_BINARY_RMWcc(LOCK_PREFIX "btc", *addr, "Ir", nr, "%0", "c");
     306             : }
     307             : 
     308             : static __always_inline int constant_test_bit(long nr, const volatile unsigned long *addr)
     309             : {
     310     7060892 :         return ((1UL << (nr & (BITS_PER_LONG-1))) &
     311    48013430 :                 (addr[nr >> _BITOPS_LONG_SHIFT])) != 0;
     312             : }
     313             : 
     314             : static inline int variable_test_bit(long nr, volatile const unsigned long *addr)
     315             : {
     316             :         int oldbit;
     317             : 
     318           0 :         asm volatile("bt %2,%1\n\t"
     319             :                      "sbb %0,%0"
     320             :                      : "=r" (oldbit)
     321             :                      : "m" (*(unsigned long *)addr), "Ir" (nr));
     322             : 
     323             :         return oldbit;
     324             : }
     325             : 
     326             : #if 0 /* Fool kernel-doc since it doesn't do macros yet */
     327             : /**
     328             :  * test_bit - Determine whether a bit is set
     329             :  * @nr: bit number to test
     330             :  * @addr: Address to start counting from
     331             :  */
     332             : static int test_bit(int nr, const volatile unsigned long *addr);
     333             : #endif
     334             : 
     335             : #define test_bit(nr, addr)                      \
     336             :         (__builtin_constant_p((nr))             \
     337             :          ? constant_test_bit((nr), (addr))      \
     338             :          : variable_test_bit((nr), (addr)))
     339             : 
     340             : /**
     341             :  * __ffs - find first set bit in word
     342             :  * @word: The word to search
     343             :  *
     344             :  * Undefined if no bit exists, so code should check against 0 first.
     345             :  */
     346             : static inline unsigned long __ffs(unsigned long word)
     347             : {
     348             :         asm("rep; bsf %1,%0"
     349             :                 : "=r" (word)
     350             :                 : "rm" (word));
     351             :         return word;
     352             : }
     353             : 
     354             : /**
     355             :  * ffz - find first zero bit in word
     356             :  * @word: The word to search
     357             :  *
     358             :  * Undefined if no zero exists, so code should check against ~0UL first.
     359             :  */
     360             : static inline unsigned long ffz(unsigned long word)
     361             : {
     362             :         asm("rep; bsf %1,%0"
     363             :                 : "=r" (word)
     364             :                 : "r" (~word));
     365             :         return word;
     366             : }
     367             : 
     368             : /*
     369             :  * __fls: find last set bit in word
     370             :  * @word: The word to search
     371             :  *
     372             :  * Undefined if no set bit exists, so code should check against 0 first.
     373             :  */
     374             : static inline unsigned long __fls(unsigned long word)
     375             : {
     376             :         asm("bsr %1,%0"
     377             :             : "=r" (word)
     378             :             : "rm" (word));
     379             :         return word;
     380             : }
     381             : 
     382             : #undef ADDR
     383             : 
     384             : #ifdef __KERNEL__
     385             : /**
     386             :  * ffs - find first set bit in word
     387             :  * @x: the word to search
     388             :  *
     389             :  * This is defined the same way as the libc and compiler builtin ffs
     390             :  * routines, therefore differs in spirit from the other bitops.
     391             :  *
     392             :  * ffs(value) returns 0 if value is 0 or the position of the first
     393             :  * set bit if value is nonzero. The first (least significant) bit
     394             :  * is at position 1.
     395             :  */
     396             : static inline int ffs(int x)
     397             : {
     398             :         int r;
     399             : 
     400             : #ifdef CONFIG_X86_64
     401             :         /*
     402             :          * AMD64 says BSFL won't clobber the dest reg if x==0; Intel64 says the
     403             :          * dest reg is undefined if x==0, but their CPU architect says its
     404             :          * value is written to set it to the same as before, except that the
     405             :          * top 32 bits will be cleared.
     406             :          *
     407             :          * We cannot do this on 32 bits because at the very least some
     408             :          * 486 CPUs did not behave this way.
     409             :          */
     410             :         asm("bsfl %1,%0"
     411             :             : "=r" (r)
     412             :             : "rm" (x), "0" (-1));
     413             : #elif defined(CONFIG_X86_CMOV)
     414             :         asm("bsfl %1,%0\n\t"
     415             :             "cmovzl %2,%0"
     416             :             : "=&r" (r) : "rm" (x), "r" (-1));
     417             : #else
     418             :         asm("bsfl %1,%0\n\t"
     419             :             "jnz 1f\n\t"
     420             :             "movl $-1,%0\n"
     421             :             "1:" : "=r" (r) : "rm" (x));
     422             : #endif
     423             :         return r + 1;
     424             : }
     425             : 
     426             : /**
     427             :  * fls - find last set bit in word
     428             :  * @x: the word to search
     429             :  *
     430             :  * This is defined in a similar way as the libc and compiler builtin
     431             :  * ffs, but returns the position of the most significant set bit.
     432             :  *
     433             :  * fls(value) returns 0 if value is 0 or the position of the last
     434             :  * set bit if value is nonzero. The last (most significant) bit is
     435             :  * at position 32.
     436             :  */
     437             : static inline int fls(int x)
     438             : {
     439             :         int r;
     440             : 
     441             : #ifdef CONFIG_X86_64
     442             :         /*
     443             :          * AMD64 says BSRL won't clobber the dest reg if x==0; Intel64 says the
     444             :          * dest reg is undefined if x==0, but their CPU architect says its
     445             :          * value is written to set it to the same as before, except that the
     446             :          * top 32 bits will be cleared.
     447             :          *
     448             :          * We cannot do this on 32 bits because at the very least some
     449             :          * 486 CPUs did not behave this way.
     450             :          */
     451         663 :         asm("bsrl %1,%0"
     452             :             : "=r" (r)
     453             :             : "rm" (x), "0" (-1));
     454             : #elif defined(CONFIG_X86_CMOV)
     455             :         asm("bsrl %1,%0\n\t"
     456             :             "cmovzl %2,%0"
     457             :             : "=&r" (r) : "rm" (x), "rm" (-1));
     458             : #else
     459             :         asm("bsrl %1,%0\n\t"
     460             :             "jnz 1f\n\t"
     461             :             "movl $-1,%0\n"
     462             :             "1:" : "=r" (r) : "rm" (x));
     463             : #endif
     464             :         return r + 1;
     465             : }
     466             : 
     467             : /**
     468             :  * fls64 - find last set bit in a 64-bit word
     469             :  * @x: the word to search
     470             :  *
     471             :  * This is defined in a similar way as the libc and compiler builtin
     472             :  * ffsll, but returns the position of the most significant set bit.
     473             :  *
     474             :  * fls64(value) returns 0 if value is 0 or the position of the last
     475             :  * set bit if value is nonzero. The last (most significant) bit is
     476             :  * at position 64.
     477             :  */
     478             : #ifdef CONFIG_X86_64
     479             : static __always_inline int fls64(__u64 x)
     480             : {
     481             :         int bitpos = -1;
     482             :         /*
     483             :          * AMD64 says BSRQ won't clobber the dest reg if x==0; Intel64 says the
     484             :          * dest reg is undefined if x==0, but their CPU architect says its
     485             :          * value is written to set it to the same as before.
     486             :          */
     487           0 :         asm("bsrq %1,%q0"
     488             :             : "+r" (bitpos)
     489             :             : "rm" (x));
     490           0 :         return bitpos + 1;
     491             : }
     492             : #else
     493             : #include <asm-generic/bitops/fls64.h>
     494             : #endif
     495             : 
     496             : #include <asm-generic/bitops/find.h>
     497             : 
     498             : #include <asm-generic/bitops/sched.h>
     499             : 
     500             : #include <asm/arch_hweight.h>
     501             : 
     502             : #include <asm-generic/bitops/const_hweight.h>
     503             : 
     504             : #include <asm-generic/bitops/le.h>
     505             : 
     506             : #include <asm-generic/bitops/ext2-atomic-setbit.h>
     507             : 
     508             : #endif /* __KERNEL__ */
     509             : #endif /* _ASM_X86_BITOPS_H */

Generated by: LCOV version 1.10