bitops.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. #ifndef __ASM_SH_BITOPS_H
  2. #define __ASM_SH_BITOPS_H
  3. #ifdef __KERNEL__
  4. #ifndef _LINUX_BITOPS_H
  5. #error only <linux/bitops.h> can be included directly
  6. #endif
  7. #include <asm/system.h>
  8. /* For __swab32 */
  9. #include <asm/byteorder.h>
  10. static inline void set_bit(int nr, volatile void * addr)
  11. {
  12. int mask;
  13. volatile unsigned int *a = addr;
  14. unsigned long flags;
  15. a += nr >> 5;
  16. mask = 1 << (nr & 0x1f);
  17. local_irq_save(flags);
  18. *a |= mask;
  19. local_irq_restore(flags);
  20. }
  21. /*
  22. * clear_bit() doesn't provide any barrier for the compiler.
  23. */
  24. #define smp_mb__before_clear_bit() barrier()
  25. #define smp_mb__after_clear_bit() barrier()
  26. static inline void clear_bit(int nr, volatile void * addr)
  27. {
  28. int mask;
  29. volatile unsigned int *a = addr;
  30. unsigned long flags;
  31. a += nr >> 5;
  32. mask = 1 << (nr & 0x1f);
  33. local_irq_save(flags);
  34. *a &= ~mask;
  35. local_irq_restore(flags);
  36. }
  37. static inline void change_bit(int nr, volatile void * addr)
  38. {
  39. int mask;
  40. volatile unsigned int *a = addr;
  41. unsigned long flags;
  42. a += nr >> 5;
  43. mask = 1 << (nr & 0x1f);
  44. local_irq_save(flags);
  45. *a ^= mask;
  46. local_irq_restore(flags);
  47. }
  48. static inline int test_and_set_bit(int nr, volatile void * addr)
  49. {
  50. int mask, retval;
  51. volatile unsigned int *a = addr;
  52. unsigned long flags;
  53. a += nr >> 5;
  54. mask = 1 << (nr & 0x1f);
  55. local_irq_save(flags);
  56. retval = (mask & *a) != 0;
  57. *a |= mask;
  58. local_irq_restore(flags);
  59. return retval;
  60. }
  61. static inline int test_and_clear_bit(int nr, volatile void * addr)
  62. {
  63. int mask, retval;
  64. volatile unsigned int *a = addr;
  65. unsigned long flags;
  66. a += nr >> 5;
  67. mask = 1 << (nr & 0x1f);
  68. local_irq_save(flags);
  69. retval = (mask & *a) != 0;
  70. *a &= ~mask;
  71. local_irq_restore(flags);
  72. return retval;
  73. }
  74. static inline int test_and_change_bit(int nr, volatile void * addr)
  75. {
  76. int mask, retval;
  77. volatile unsigned int *a = addr;
  78. unsigned long flags;
  79. a += nr >> 5;
  80. mask = 1 << (nr & 0x1f);
  81. local_irq_save(flags);
  82. retval = (mask & *a) != 0;
  83. *a ^= mask;
  84. local_irq_restore(flags);
  85. return retval;
  86. }
  87. #include <asm-generic/bitops/non-atomic.h>
  88. static inline unsigned long ffz(unsigned long word)
  89. {
  90. unsigned long result;
  91. __asm__("1:\n\t"
  92. "shlr %1\n\t"
  93. "bt/s 1b\n\t"
  94. " add #1, %0"
  95. : "=r" (result), "=r" (word)
  96. : "0" (~0L), "1" (word)
  97. : "t");
  98. return result;
  99. }
  100. /**
  101. * __ffs - find first bit in word.
  102. * @word: The word to search
  103. *
  104. * Undefined if no bit exists, so code should check against 0 first.
  105. */
  106. static inline unsigned long __ffs(unsigned long word)
  107. {
  108. unsigned long result;
  109. __asm__("1:\n\t"
  110. "shlr %1\n\t"
  111. "bf/s 1b\n\t"
  112. " add #1, %0"
  113. : "=r" (result), "=r" (word)
  114. : "0" (~0L), "1" (word)
  115. : "t");
  116. return result;
  117. }
  118. #include <asm-generic/bitops/find.h>
  119. #include <asm-generic/bitops/ffs.h>
  120. #include <asm-generic/bitops/hweight.h>
  121. #include <asm-generic/bitops/lock.h>
  122. #include <asm-generic/bitops/sched.h>
  123. #include <asm-generic/bitops/ext2-non-atomic.h>
  124. #include <asm-generic/bitops/ext2-atomic.h>
  125. #include <asm-generic/bitops/minix.h>
  126. #include <asm-generic/bitops/fls.h>
  127. #include <asm-generic/bitops/fls64.h>
  128. #endif /* __KERNEL__ */
  129. #endif /* __ASM_SH_BITOPS_H */