1/* 2 * This file is subject to the terms and conditions of the GNU General Public 3 * License. See the file "COPYING" in the main directory of this archive 4 * for more details. 5 * 6 * Copyright (c) 1994 - 1997, 1999, 2000 Ralf Baechle (ralf@gnu.org) 7 * Copyright (c) 1999, 2000 Silicon Graphics, Inc. 8 */ 9#ifndef _ASM_BITOPS_H 10#define _ASM_BITOPS_H 11 12#include <linux/config.h> 13#include <linux/compiler.h> 14#include <linux/types.h> 15#include <asm/bug.h> 16#include <asm/byteorder.h> /* sigh ... */ 17#include <asm/cpu-features.h> 18 19#if (_MIPS_SZLONG == 32) 20#define SZLONG_LOG 5 21#define SZLONG_MASK 31UL 22#define __LL "ll " 23#define __SC "sc " 24#define cpu_to_lelongp(x) cpu_to_le32p((__u32 *) (x)) 25#elif (_MIPS_SZLONG == 64) 26#define SZLONG_LOG 6 27#define SZLONG_MASK 63UL 28#define __LL "lld " 29#define __SC "scd " 30#define cpu_to_lelongp(x) cpu_to_le64p((__u64 *) (x)) 31#endif 32 33#ifdef __KERNEL__ 34 35#include <asm/interrupt.h> 36#include <asm/sgidefs.h> 37#include <asm/war.h> 38 39/* 40 * clear_bit() doesn't provide any barrier for the compiler. 41 */ 42#define smp_mb__before_clear_bit() smp_mb() 43#define smp_mb__after_clear_bit() smp_mb() 44 45/* 46 * Only disable interrupt for kernel mode stuff to keep usermode stuff 47 * that dares to use kernel include files alive. 48 */ 49 50#define __bi_flags unsigned long flags 51#define __bi_local_irq_save(x) local_irq_save(x) 52#define __bi_local_irq_restore(x) local_irq_restore(x) 53#else 54#define __bi_flags 55#define __bi_local_irq_save(x) 56#define __bi_local_irq_restore(x) 57#endif /* __KERNEL__ */ 58 59/* 60 * set_bit - Atomically set a bit in memory 61 * @nr: the bit to set 62 * @addr: the address to start counting from 63 * 64 * This function is atomic and may not be reordered. See __set_bit() 65 * if you do not require the atomic guarantees. 66 * Note that @nr may be almost arbitrarily large; this function is not 67 * restricted to acting on a single-word quantity. 68 */ 69static inline void set_bit(unsigned long nr, volatile unsigned long *addr) 70{ 71 unsigned long *m = ((unsigned long *) addr) + (nr >> SZLONG_LOG); 72 unsigned long temp; 73 74 if (cpu_has_llsc && R10000_LLSC_WAR) { 75 __asm__ __volatile__( 76 " .set mips3 \n" 77 "1: " __LL "%0, %1 # set_bit \n" 78 " or %0, %2 \n" 79 " " __SC "%0, %1 \n" 80 " beqzl %0, 1b \n" 81 " .set mips0 \n" 82 : "=&r" (temp), "=m" (*m) 83 : "ir" (1UL << (nr & SZLONG_MASK)), "m" (*m)); 84 } else if (cpu_has_llsc) { 85 __asm__ __volatile__( 86 " .set mips3 \n" 87 "1: " __LL "%0, %1 # set_bit \n" 88 " or %0, %2 \n" 89 " " __SC "%0, %1 \n" 90 " beqz %0, 1b \n" 91 " .set mips0 \n" 92 : "=&r" (temp), "=m" (*m) 93 : "ir" (1UL << (nr & SZLONG_MASK)), "m" (*m)); 94 } else { 95 volatile unsigned long *a = addr; 96 unsigned long mask; 97 __bi_flags; 98 99 a += nr >> SZLONG_LOG; 100 mask = 1UL << (nr & SZLONG_MASK); 101 __bi_local_irq_save(flags); 102 *a |= mask; 103 __bi_local_irq_restore(flags); 104 } 105} 106 107/* 108 * __set_bit - Set a bit in memory 109 * @nr: the bit to set 110 * @addr: the address to start counting from 111 * 112 * Unlike set_bit(), this function is non-atomic and may be reordered. 113 * If it's called on the same region of memory simultaneously, the effect 114 * may be that only one operation succeeds. 115 */ 116static inline void __set_bit(unsigned long nr, volatile unsigned long * addr) 117{ 118 unsigned long * m = ((unsigned long *) addr) + (nr >> SZLONG_LOG); 119 120 *m |= 1UL << (nr & SZLONG_MASK); 121} 122 123/* 124 * clear_bit - Clears a bit in memory 125 * @nr: Bit to clear 126 * @addr: Address to start counting from 127 * 128 * clear_bit() is atomic and may not be reordered. However, it does 129 * not contain a memory barrier, so if it is used for locking purposes, 130 * you should call smp_mb__before_clear_bit() and/or smp_mb__after_clear_bit() 131 * in order to ensure changes are visible on other processors. 132 */ 133static inline void clear_bit(unsigned long nr, volatile unsigned long *addr) 134{ 135 unsigned long *m = ((unsigned long *) addr) + (nr >> SZLONG_LOG); 136 unsigned long temp; 137 138 if (cpu_has_llsc && R10000_LLSC_WAR) { 139 __asm__ __volatile__( 140 " .set mips3 \n" 141 "1: " __LL "%0, %1 # clear_bit \n" 142 " and %0, %2 \n" 143 " " __SC "%0, %1 \n" 144 " beqzl %0, 1b \n" 145 " .set mips0 \n" 146 : "=&r" (temp), "=m" (*m) 147 : "ir" (~(1UL << (nr & SZLONG_MASK))), "m" (*m)); 148 } else if (cpu_has_llsc) { 149 __asm__ __volatile__( 150 " .set mips3 \n" 151 "1: " __LL "%0, %1 # clear_bit \n" 152 " and %0, %2 \n" 153 " " __SC "%0, %1 \n" 154 " beqz %0, 1b \n" 155 " .set mips0 \n" 156 : "=&r" (temp), "=m" (*m) 157 : "ir" (~(1UL << (nr & SZLONG_MASK))), "m" (*m)); 158 } else { 159 volatile unsigned long *a = addr; 160 unsigned long mask; 161 __bi_flags; 162 163 a += nr >> SZLONG_LOG; 164 mask = 1UL << (nr & SZLONG_MASK); 165 __bi_local_irq_save(flags); 166 *a &= ~mask; 167 __bi_local_irq_restore(flags); 168 } 169} 170 171/* 172 * __clear_bit - Clears a bit in memory 173 * @nr: Bit to clear 174 * @addr: Address to start counting from 175 * 176 * Unlike clear_bit(), this function is non-atomic and may be reordered. 177 * If it's called on the same region of memory simultaneously, the effect 178 * may be that only one operation succeeds. 179 */ 180static inline void __clear_bit(unsigned long nr, volatile unsigned long * addr) 181{ 182 unsigned long * m = ((unsigned long *) addr) + (nr >> SZLONG_LOG); 183 184 *m &= ~(1UL << (nr & SZLONG_MASK)); 185} 186 187/* 188 * change_bit - Toggle a bit in memory 189 * @nr: Bit to change 190 * @addr: Address to start counting from 191 * 192 * change_bit() is atomic and may not be reordered. 193 * Note that @nr may be almost arbitrarily large; this function is not 194 * restricted to acting on a single-word quantity. 195 */ 196static inline void change_bit(unsigned long nr, volatile unsigned long *addr) 197{ 198 if (cpu_has_llsc && R10000_LLSC_WAR) { 199 unsigned long *m = ((unsigned long *) addr) + (nr >> SZLONG_LOG); 200 unsigned long temp; 201 202 __asm__ __volatile__( 203 " .set mips3 \n" 204 "1: " __LL "%0, %1 # change_bit \n" 205 " xor %0, %2 \n" 206 " " __SC "%0, %1 \n" 207 " beqzl %0, 1b \n" 208 " .set mips0 \n" 209 : "=&r" (temp), "=m" (*m) 210 : "ir" (1UL << (nr & SZLONG_MASK)), "m" (*m)); 211 } else if (cpu_has_llsc) { 212 unsigned long *m = ((unsigned long *) addr) + (nr >> SZLONG_LOG); 213 unsigned long temp; 214 215 __asm__ __volatile__( 216 " .set mips3 \n" 217 "1: " __LL "%0, %1 # change_bit \n" 218 " xor %0, %2 \n" 219 " " __SC "%0, %1 \n" 220 " beqz %0, 1b \n" 221 " .set mips0 \n" 222 : "=&r" (temp), "=m" (*m) 223 : "ir" (1UL << (nr & SZLONG_MASK)), "m" (*m)); 224 } else { 225 volatile unsigned long *a = addr; 226 unsigned long mask; 227 __bi_flags; 228 229 a += nr >> SZLONG_LOG; 230 mask = 1UL << (nr & SZLONG_MASK); 231 __bi_local_irq_save(flags); 232 *a ^= mask; 233 __bi_local_irq_restore(flags); 234 } 235} 236 237/* 238 * __change_bit - Toggle a bit in memory 239 * @nr: the bit to change 240 * @addr: the address to start counting from 241 * 242 * Unlike change_bit(), this function is non-atomic and may be reordered. 243 * If it's called on the same region of memory simultaneously, the effect 244 * may be that only one operation succeeds. 245 */ 246static inline void __change_bit(unsigned long nr, volatile unsigned long * addr) 247{ 248 unsigned long * m = ((unsigned long *) addr) + (nr >> SZLONG_LOG); 249 250 *m ^= 1UL << (nr & SZLONG_MASK); 251} 252 253/* 254 * test_and_set_bit - Set a bit and return its old value 255 * @nr: Bit to set 256 * @addr: Address to count from 257 * 258 * This operation is atomic and cannot be reordered. 259 * It also implies a memory barrier. 260 */ 261static inline int test_and_set_bit(unsigned long nr, 262 volatile unsigned long *addr) 263{ 264 if (cpu_has_llsc && R10000_LLSC_WAR) { 265 unsigned long *m = ((unsigned long *) addr) + (nr >> SZLONG_LOG); 266 unsigned long temp, res; 267 268 __asm__ __volatile__( 269 " .set mips3 \n" 270 "1: " __LL "%0, %1 # test_and_set_bit \n" 271 " or %2, %0, %3 \n" 272 " " __SC "%2, %1 \n" 273 " beqzl %2, 1b \n" 274 " and %2, %0, %3 \n" 275#ifdef CONFIG_SMP 276 " sync \n" 277#endif 278 " .set mips0 \n" 279 : "=&r" (temp), "=m" (*m), "=&r" (res) 280 : "r" (1UL << (nr & SZLONG_MASK)), "m" (*m) 281 : "memory"); 282 283 return res != 0; 284 } else if (cpu_has_llsc) { 285 unsigned long *m = ((unsigned long *) addr) + (nr >> SZLONG_LOG); 286 unsigned long temp, res; 287 288 __asm__ __volatile__( 289 " .set push \n" 290 " .set noreorder \n" 291 " .set mips3 \n" 292 "1: " __LL "%0, %1 # test_and_set_bit \n" 293 " or %2, %0, %3 \n" 294 " " __SC "%2, %1 \n" 295 " beqz %2, 1b \n" 296 " and %2, %0, %3 \n" 297#ifdef CONFIG_SMP 298 " sync \n" 299#endif 300 " .set pop \n" 301 : "=&r" (temp), "=m" (*m), "=&r" (res) 302 : "r" (1UL << (nr & SZLONG_MASK)), "m" (*m) 303 : "memory"); 304 305 return res != 0; 306 } else { 307 volatile unsigned long *a = addr; 308 unsigned long mask; 309 int retval; 310 __bi_flags; 311 312 a += nr >> SZLONG_LOG; 313 mask = 1UL << (nr & SZLONG_MASK); 314 __bi_local_irq_save(flags); 315 retval = (mask & *a) != 0; 316 *a |= mask; 317 __bi_local_irq_restore(flags); 318 319 return retval; 320 } 321} 322 323/* 324 * __test_and_set_bit - Set a bit and return its old value 325 * @nr: Bit to set 326 * @addr: Address to count from 327 * 328 * This operation is non-atomic and can be reordered. 329 * If two examples of this operation race, one can appear to succeed 330 * but actually fail. You must protect multiple accesses with a lock. 331 */ 332static inline int __test_and_set_bit(unsigned long nr, 333 volatile unsigned long *addr) 334{ 335 volatile unsigned long *a = addr; 336 unsigned long mask; 337 int retval; 338 339 a += nr >> SZLONG_LOG; 340 mask = 1UL << (nr & SZLONG_MASK); 341 retval = (mask & *a) != 0; 342 *a |= mask; 343 344 return retval; 345} 346 347/* 348 * test_and_clear_bit - Clear a bit and return its old value 349 * @nr: Bit to clear 350 * @addr: Address to count from 351 * 352 * This operation is atomic and cannot be reordered. 353 * It also implies a memory barrier. 354 */ 355static inline int test_and_clear_bit(unsigned long nr, 356 volatile unsigned long *addr) 357{ 358 if (cpu_has_llsc && R10000_LLSC_WAR) { 359 unsigned long *m = ((unsigned long *) addr) + (nr >> SZLONG_LOG); 360 unsigned long temp, res; 361 362 __asm__ __volatile__( 363 " .set mips3 \n" 364 "1: " __LL "%0, %1 # test_and_clear_bit \n" 365 " or %2, %0, %3 \n" 366 " xor %2, %3 \n" 367 " " __SC "%2, %1 \n" 368 " beqzl %2, 1b \n" 369 " and %2, %0, %3 \n" 370#ifdef CONFIG_SMP 371 " sync \n" 372#endif 373 " .set mips0 \n" 374 : "=&r" (temp), "=m" (*m), "=&r" (res) 375 : "r" (1UL << (nr & SZLONG_MASK)), "m" (*m) 376 : "memory"); 377 378 return res != 0; 379 } else if (cpu_has_llsc) { 380 unsigned long *m = ((unsigned long *) addr) + (nr >> SZLONG_LOG); 381 unsigned long temp, res; 382 383 __asm__ __volatile__( 384 " .set push \n" 385 " .set noreorder \n" 386 " .set mips3 \n" 387 "1: " __LL "%0, %1 # test_and_clear_bit \n" 388 " or %2, %0, %3 \n" 389 " xor %2, %3 \n" 390 " " __SC "%2, %1 \n" 391 " beqz %2, 1b \n" 392 " and %2, %0, %3 \n" 393#ifdef CONFIG_SMP 394 " sync \n" 395#endif 396 " .set pop \n" 397 : "=&r" (temp), "=m" (*m), "=&r" (res) 398 : "r" (1UL << (nr & SZLONG_MASK)), "m" (*m) 399 : "memory"); 400 401 return res != 0; 402 } else { 403 volatile unsigned long *a = addr; 404 unsigned long mask; 405 int retval; 406 __bi_flags; 407 408 a += nr >> SZLONG_LOG; 409 mask = 1UL << (nr & SZLONG_MASK); 410 __bi_local_irq_save(flags); 411 retval = (mask & *a) != 0; 412 *a &= ~mask; 413 __bi_local_irq_restore(flags); 414 415 return retval; 416 } 417} 418 419/* 420 * __test_and_clear_bit - Clear a bit and return its old value 421 * @nr: Bit to clear 422 * @addr: Address to count from 423 * 424 * This operation is non-atomic and can be reordered. 425 * If two examples of this operation race, one can appear to succeed 426 * but actually fail. You must protect multiple accesses with a lock. 427 */ 428static inline int __test_and_clear_bit(unsigned long nr, 429 volatile unsigned long * addr) 430{ 431 volatile unsigned long *a = addr; 432 unsigned long mask; 433 int retval; 434 435 a += (nr >> SZLONG_LOG); 436 mask = 1UL << (nr & SZLONG_MASK); 437 retval = ((mask & *a) != 0); 438 *a &= ~mask; 439 440 return retval; 441} 442 443/* 444 * test_and_change_bit - Change a bit and return its old value 445 * @nr: Bit to change 446 * @addr: Address to count from 447 * 448 * This operation is atomic and cannot be reordered. 449 * It also implies a memory barrier. 450 */ 451static inline int test_and_change_bit(unsigned long nr, 452 volatile unsigned long *addr) 453{ 454 if (cpu_has_llsc && R10000_LLSC_WAR) { 455 unsigned long *m = ((unsigned long *) addr) + (nr >> SZLONG_LOG); 456 unsigned long temp, res; 457 458 __asm__ __volatile__( 459 " .set mips3 \n" 460 "1: " __LL "%0, %1 # test_and_change_bit \n" 461 " xor %2, %0, %3 \n" 462 " " __SC "%2, %1 \n" 463 " beqzl %2, 1b \n" 464 " and %2, %0, %3 \n" 465#ifdef CONFIG_SMP 466 " sync \n" 467#endif 468 " .set mips0 \n" 469 : "=&r" (temp), "=m" (*m), "=&r" (res) 470 : "r" (1UL << (nr & SZLONG_MASK)), "m" (*m) 471 : "memory"); 472 473 return res != 0; 474 } else if (cpu_has_llsc) { 475 unsigned long *m = ((unsigned long *) addr) + (nr >> SZLONG_LOG); 476 unsigned long temp, res; 477 478 __asm__ __volatile__( 479 " .set push \n" 480 " .set noreorder \n" 481 " .set mips3 \n" 482 "1: " __LL "%0, %1 # test_and_change_bit \n" 483 " xor %2, %0, %3 \n" 484 " " __SC "\t%2, %1 \n" 485 " beqz %2, 1b \n" 486 " and %2, %0, %3 \n" 487#ifdef CONFIG_SMP 488 " sync \n" 489#endif 490 " .set pop \n" 491 : "=&r" (temp), "=m" (*m), "=&r" (res) 492 : "r" (1UL << (nr & SZLONG_MASK)), "m" (*m) 493 : "memory"); 494 495 return res != 0; 496 } else { 497 volatile unsigned long *a = addr; 498 unsigned long mask, retval; 499 __bi_flags; 500 501 a += nr >> SZLONG_LOG; 502 mask = 1UL << (nr & SZLONG_MASK); 503 __bi_local_irq_save(flags); 504 retval = (mask & *a) != 0; 505 *a ^= mask; 506 __bi_local_irq_restore(flags); 507 508 return retval; 509 } 510} 511 512/* 513 * __test_and_change_bit - Change a bit and return its old value 514 * @nr: Bit to change 515 * @addr: Address to count from 516 * 517 * This operation is non-atomic and can be reordered. 518 * If two examples of this operation race, one can appear to succeed 519 * but actually fail. You must protect multiple accesses with a lock. 520 */ 521static inline int __test_and_change_bit(unsigned long nr, 522 volatile unsigned long *addr) 523{ 524 volatile unsigned long *a = addr; 525 unsigned long mask; 526 int retval; 527 528 a += (nr >> SZLONG_LOG); 529 mask = 1UL << (nr & SZLONG_MASK); 530 retval = ((mask & *a) != 0); 531 *a ^= mask; 532 533 return retval; 534} 535 536#undef __bi_flags 537#undef __bi_local_irq_save 538#undef __bi_local_irq_restore 539 540/* 541 * test_bit - Determine whether a bit is set 542 * @nr: bit number to test 543 * @addr: Address to start counting from 544 */ 545static inline int test_bit(unsigned long nr, const volatile unsigned long *addr) 546{ 547 return 1UL & (addr[nr >> SZLONG_LOG] >> (nr & SZLONG_MASK)); 548} 549 550/* 551 * Return the bit position (0..63) of the most significant 1 bit in a word 552 * Returns -1 if no 1 bit exists 553 */ 554static inline int __ilog2(unsigned long x) 555{ 556 int lz; 557 558 if (sizeof(x) == 4) { 559 __asm__ ( 560 " .set push \n" 561 " .set mips32 \n" 562 " clz %0, %1 \n" 563 " .set pop \n" 564 : "=r" (lz) 565 : "r" (x)); 566 567 return 31 - lz; 568 } 569 570 BUG_ON(sizeof(x) != 8); 571 572 __asm__ ( 573 " .set push \n" 574 " .set mips64 \n" 575 " dclz %0, %1 \n" 576 " .set pop \n" 577 : "=r" (lz) 578 : "r" (x)); 579 580 return 63 - lz; 581} 582 583/* 584 * __ffs - find first bit in word. 585 * @word: The word to search 586 * 587 * Returns 0..SZLONG-1 588 * Undefined if no bit exists, so code should check against 0 first. 589 */ 590static inline unsigned long __ffs(unsigned long word) 591{ 592#if defined(CONFIG_CPU_MIPS32) || defined(CONFIG_CPU_MIPS64) 593 return __ilog2(word & -word); 594#else 595 int b = 0, s; 596 597#ifdef CONFIG_32BIT 598 s = 16; if (word << 16 != 0) s = 0; b += s; word >>= s; 599 s = 8; if (word << 24 != 0) s = 0; b += s; word >>= s; 600 s = 4; if (word << 28 != 0) s = 0; b += s; word >>= s; 601 s = 2; if (word << 30 != 0) s = 0; b += s; word >>= s; 602 s = 1; if (word << 31 != 0) s = 0; b += s; 603 604 return b; 605#endif 606#ifdef CONFIG_64BIT 607 s = 32; if (word << 32 != 0) s = 0; b += s; word >>= s; 608 s = 16; if (word << 48 != 0) s = 0; b += s; word >>= s; 609 s = 8; if (word << 56 != 0) s = 0; b += s; word >>= s; 610 s = 4; if (word << 60 != 0) s = 0; b += s; word >>= s; 611 s = 2; if (word << 62 != 0) s = 0; b += s; word >>= s; 612 s = 1; if (word << 63 != 0) s = 0; b += s; 613 614 return b; 615#endif 616#endif 617} 618 619/* 620 * ffs - find first bit set. 621 * @word: The word to search 622 * 623 * Returns 1..SZLONG 624 * Returns 0 if no bit exists 625 */ 626 627static inline unsigned long ffs(unsigned long word) 628{ 629 if (!word) 630 return 0; 631 632 return __ffs(word) + 1; 633} 634 635/* 636 * ffz - find first zero in word. 637 * @word: The word to search 638 * 639 * Undefined if no zero exists, so code should check against ~0UL first. 640 */ 641static inline unsigned long ffz(unsigned long word) 642{ 643 return __ffs (~word); 644} 645 646/* 647 * flz - find last zero in word. 648 * @word: The word to search 649 * 650 * Returns 0..SZLONG-1 651 * Undefined if no zero exists, so code should check against ~0UL first. 652 */ 653static inline unsigned long flz(unsigned long word) 654{ 655#if defined(CONFIG_CPU_MIPS32) || defined(CONFIG_CPU_MIPS64) 656 return __ilog2(~word); 657#else 658#ifdef CONFIG_32BIT 659 int r = 31, s; 660 word = ~word; 661 s = 16; if ((word & 0xffff0000)) s = 0; r -= s; word <<= s; 662 s = 8; if ((word & 0xff000000)) s = 0; r -= s; word <<= s; 663 s = 4; if ((word & 0xf0000000)) s = 0; r -= s; word <<= s; 664 s = 2; if ((word & 0xc0000000)) s = 0; r -= s; word <<= s; 665 s = 1; if ((word & 0x80000000)) s = 0; r -= s; 666 667 return r; 668#endif 669#ifdef CONFIG_64BIT 670 int r = 63, s; 671 word = ~word; 672 s = 32; if ((word & 0xffffffff00000000UL)) s = 0; r -= s; word <<= s; 673 s = 16; if ((word & 0xffff000000000000UL)) s = 0; r -= s; word <<= s; 674 s = 8; if ((word & 0xff00000000000000UL)) s = 0; r -= s; word <<= s; 675 s = 4; if ((word & 0xf000000000000000UL)) s = 0; r -= s; word <<= s; 676 s = 2; if ((word & 0xc000000000000000UL)) s = 0; r -= s; word <<= s; 677 s = 1; if ((word & 0x8000000000000000UL)) s = 0; r -= s; 678 679 return r; 680#endif 681#endif 682} 683 684/* 685 * fls - find last bit set. 686 * @word: The word to search 687 * 688 * Returns 1..SZLONG 689 * Returns 0 if no bit exists 690 */ 691static inline unsigned long fls(unsigned long word) 692{ 693 if (word == 0) 694 return 0; 695 696 return flz(~word) + 1; 697} 698 699 700/* 701 * find_next_zero_bit - find the first zero bit in a memory region 702 * @addr: The address to base the search on 703 * @offset: The bitnumber to start searching at 704 * @size: The maximum size to search 705 */ 706static inline unsigned long find_next_zero_bit(const unsigned long *addr, 707 unsigned long size, unsigned long offset) 708{ 709 const unsigned long *p = addr + (offset >> SZLONG_LOG); 710 unsigned long result = offset & ~SZLONG_MASK; 711 unsigned long tmp; 712 713 if (offset >= size) 714 return size; 715 size -= result; 716 offset &= SZLONG_MASK; 717 if (offset) { 718 tmp = *(p++); 719 tmp |= ~0UL >> (_MIPS_SZLONG-offset); 720 if (size < _MIPS_SZLONG) 721 goto found_first; 722 if (~tmp) 723 goto found_middle; 724 size -= _MIPS_SZLONG; 725 result += _MIPS_SZLONG; 726 } 727 while (size & ~SZLONG_MASK) { 728 if (~(tmp = *(p++))) 729 goto found_middle; 730 result += _MIPS_SZLONG; 731 size -= _MIPS_SZLONG; 732 } 733 if (!size) 734 return result; 735 tmp = *p; 736 737found_first: 738 tmp |= ~0UL << size; 739 if (tmp == ~0UL) /* Are any bits zero? */ 740 return result + size; /* Nope. */ 741found_middle: 742 return result + ffz(tmp); 743} 744 745#define find_first_zero_bit(addr, size) \ 746 find_next_zero_bit((addr), (size), 0) 747 748/* 749 * find_next_bit - find the next set bit in a memory region 750 * @addr: The address to base the search on 751 * @offset: The bitnumber to start searching at 752 * @size: The maximum size to search 753 */ 754static inline unsigned long find_next_bit(const unsigned long *addr, 755 unsigned long size, unsigned long offset) 756{ 757 const unsigned long *p = addr + (offset >> SZLONG_LOG); 758 unsigned long result = offset & ~SZLONG_MASK; 759 unsigned long tmp; 760 761 if (offset >= size) 762 return size; 763 size -= result; 764 offset &= SZLONG_MASK; 765 if (offset) { 766 tmp = *(p++); 767 tmp &= ~0UL << offset; 768 if (size < _MIPS_SZLONG) 769 goto found_first; 770 if (tmp) 771 goto found_middle; 772 size -= _MIPS_SZLONG; 773 result += _MIPS_SZLONG; 774 } 775 while (size & ~SZLONG_MASK) { 776 if ((tmp = *(p++))) 777 goto found_middle; 778 result += _MIPS_SZLONG; 779 size -= _MIPS_SZLONG; 780 } 781 if (!size) 782 return result; 783 tmp = *p; 784 785found_first: 786 tmp &= ~0UL >> (_MIPS_SZLONG - size); 787 if (tmp == 0UL) /* Are any bits set? */ 788 return result + size; /* Nope. */ 789found_middle: 790 return result + __ffs(tmp); 791} 792 793/* 794 * find_first_bit - find the first set bit in a memory region 795 * @addr: The address to start the search at 796 * @size: The maximum size to search 797 * 798 * Returns the bit-number of the first set bit, not the number of the byte 799 * containing a bit. 800 */ 801#define find_first_bit(addr, size) \ 802 find_next_bit((addr), (size), 0) 803 804#ifdef __KERNEL__ 805 806/* 807 * Every architecture must define this function. It's the fastest 808 * way of searching a 140-bit bitmap where the first 100 bits are 809 * unlikely to be set. It's guaranteed that at least one of the 140 810 * bits is cleared. 811 */ 812static inline int sched_find_first_bit(const unsigned long *b) 813{ 814#ifdef CONFIG_32BIT 815 if (unlikely(b[0])) 816 return __ffs(b[0]); 817 if (unlikely(b[1])) 818 return __ffs(b[1]) + 32; 819 if (unlikely(b[2])) 820 return __ffs(b[2]) + 64; 821 if (b[3]) 822 return __ffs(b[3]) + 96; 823 return __ffs(b[4]) + 128; 824#endif 825#ifdef CONFIG_64BIT 826 if (unlikely(b[0])) 827 return __ffs(b[0]); 828 if (unlikely(b[1])) 829 return __ffs(b[1]) + 64; 830 return __ffs(b[2]) + 128; 831#endif 832} 833 834/* 835 * hweightN - returns the hamming weight of a N-bit word 836 * @x: the word to weigh 837 * 838 * The Hamming Weight of a number is the total number of bits set in it. 839 */ 840 841#define hweight64(x) generic_hweight64(x) 842#define hweight32(x) generic_hweight32(x) 843#define hweight16(x) generic_hweight16(x) 844#define hweight8(x) generic_hweight8(x) 845 846static inline int __test_and_set_le_bit(unsigned long nr, unsigned long *addr) 847{ 848 unsigned char *ADDR = (unsigned char *) addr; 849 int mask, retval; 850 851 ADDR += nr >> 3; 852 mask = 1 << (nr & 0x07); 853 retval = (mask & *ADDR) != 0; 854 *ADDR |= mask; 855 856 return retval; 857} 858 859static inline int __test_and_clear_le_bit(unsigned long nr, unsigned long *addr) 860{ 861 unsigned char *ADDR = (unsigned char *) addr; 862 int mask, retval; 863 864 ADDR += nr >> 3; 865 mask = 1 << (nr & 0x07); 866 retval = (mask & *ADDR) != 0; 867 *ADDR &= ~mask; 868 869 return retval; 870} 871 872static inline int test_le_bit(unsigned long nr, const unsigned long * addr) 873{ 874 const unsigned char *ADDR = (const unsigned char *) addr; 875 int mask; 876 877 ADDR += nr >> 3; 878 mask = 1 << (nr & 0x07); 879 880 return ((mask & *ADDR) != 0); 881} 882 883static inline unsigned long find_next_zero_le_bit(unsigned long *addr, 884 unsigned long size, unsigned long offset) 885{ 886 unsigned long *p = ((unsigned long *) addr) + (offset >> SZLONG_LOG); 887 unsigned long result = offset & ~SZLONG_MASK; 888 unsigned long tmp; 889 890 if (offset >= size) 891 return size; 892 size -= result; 893 offset &= SZLONG_MASK; 894 if (offset) { 895 tmp = cpu_to_lelongp(p++); 896 tmp |= ~0UL >> (_MIPS_SZLONG-offset); /* bug or feature ? */ 897 if (size < _MIPS_SZLONG) 898 goto found_first; 899 if (~tmp) 900 goto found_middle; 901 size -= _MIPS_SZLONG; 902 result += _MIPS_SZLONG; 903 } 904 while (size & ~SZLONG_MASK) { 905 if (~(tmp = cpu_to_lelongp(p++))) 906 goto found_middle; 907 result += _MIPS_SZLONG; 908 size -= _MIPS_SZLONG; 909 } 910 if (!size) 911 return result; 912 tmp = cpu_to_lelongp(p); 913 914found_first: 915 tmp |= ~0UL << size; 916 if (tmp == ~0UL) /* Are any bits zero? */ 917 return result + size; /* Nope. */ 918 919found_middle: 920 return result + ffz(tmp); 921} 922 923#define find_first_zero_le_bit(addr, size) \ 924 find_next_zero_le_bit((addr), (size), 0) 925 926#define ext2_set_bit(nr,addr) \ 927 __test_and_set_le_bit((nr),(unsigned long*)addr) 928#define ext2_clear_bit(nr, addr) \ 929 __test_and_clear_le_bit((nr),(unsigned long*)addr) 930 #define ext2_set_bit_atomic(lock, nr, addr) \ 931({ \ 932 int ret; \ 933 spin_lock(lock); \ 934 ret = ext2_set_bit((nr), (addr)); \ 935 spin_unlock(lock); \ 936 ret; \ 937}) 938 939#define ext2_clear_bit_atomic(lock, nr, addr) \ 940({ \ 941 int ret; \ 942 spin_lock(lock); \ 943 ret = ext2_clear_bit((nr), (addr)); \ 944 spin_unlock(lock); \ 945 ret; \ 946}) 947#define ext2_test_bit(nr, addr) test_le_bit((nr),(unsigned long*)addr) 948#define ext2_find_first_zero_bit(addr, size) \ 949 find_first_zero_le_bit((unsigned long*)addr, size) 950#define ext2_find_next_zero_bit(addr, size, off) \ 951 find_next_zero_le_bit((unsigned long*)addr, size, off) 952 953/* 954 * Bitmap functions for the minix filesystem. 955 * 956 * FIXME: These assume that Minix uses the native byte/bitorder. 957 * This limits the Minix filesystem's value for data exchange very much. 958 */ 959#define minix_test_and_set_bit(nr,addr) test_and_set_bit(nr,addr) 960#define minix_set_bit(nr,addr) set_bit(nr,addr) 961#define minix_test_and_clear_bit(nr,addr) test_and_clear_bit(nr,addr) 962#define minix_test_bit(nr,addr) test_bit(nr,addr) 963#define minix_find_first_zero_bit(addr,size) find_first_zero_bit(addr,size) 964 965#endif /* __KERNEL__ */ 966 967#endif /* _ASM_BITOPS_H */