at v2.6.16-rc4 973 lines 24 kB view raw
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 * fls - find last bit set. 648 * @word: The word to search 649 * 650 * Returns 1..SZLONG 651 * Returns 0 if no bit exists 652 */ 653static inline unsigned long fls(unsigned long word) 654{ 655#ifdef CONFIG_32BIT 656#ifdef CONFIG_CPU_MIPS32 657 __asm__ ("clz %0, %1" : "=r" (word) : "r" (word)); 658 659 return 32 - word; 660#else 661 { 662 int r = 32, s; 663 664 if (word == 0) 665 return 0; 666 667 s = 16; if ((word & 0xffff0000)) s = 0; r -= s; word <<= s; 668 s = 8; if ((word & 0xff000000)) s = 0; r -= s; word <<= s; 669 s = 4; if ((word & 0xf0000000)) s = 0; r -= s; word <<= s; 670 s = 2; if ((word & 0xc0000000)) s = 0; r -= s; word <<= s; 671 s = 1; if ((word & 0x80000000)) s = 0; r -= s; 672 673 return r; 674 } 675#endif 676#endif /* CONFIG_32BIT */ 677 678#ifdef CONFIG_64BIT 679#ifdef CONFIG_CPU_MIPS64 680 681 __asm__ ("dclz %0, %1" : "=r" (word) : "r" (word)); 682 683 return 64 - word; 684#else 685 { 686 int r = 64, s; 687 688 if (word == 0) 689 return 0; 690 691 s = 32; if ((word & 0xffffffff00000000UL)) s = 0; r -= s; word <<= s; 692 s = 16; if ((word & 0xffff000000000000UL)) s = 0; r -= s; word <<= s; 693 s = 8; if ((word & 0xff00000000000000UL)) s = 0; r -= s; word <<= s; 694 s = 4; if ((word & 0xf000000000000000UL)) s = 0; r -= s; word <<= s; 695 s = 2; if ((word & 0xc000000000000000UL)) s = 0; r -= s; word <<= s; 696 s = 1; if ((word & 0x8000000000000000UL)) s = 0; r -= s; 697 698 return r; 699 } 700#endif 701#endif /* CONFIG_64BIT */ 702} 703 704#define fls64(x) generic_fls64(x) 705 706/* 707 * find_next_zero_bit - find the first zero bit in a memory region 708 * @addr: The address to base the search on 709 * @offset: The bitnumber to start searching at 710 * @size: The maximum size to search 711 */ 712static inline unsigned long find_next_zero_bit(const unsigned long *addr, 713 unsigned long size, unsigned long offset) 714{ 715 const unsigned long *p = addr + (offset >> SZLONG_LOG); 716 unsigned long result = offset & ~SZLONG_MASK; 717 unsigned long tmp; 718 719 if (offset >= size) 720 return size; 721 size -= result; 722 offset &= SZLONG_MASK; 723 if (offset) { 724 tmp = *(p++); 725 tmp |= ~0UL >> (_MIPS_SZLONG-offset); 726 if (size < _MIPS_SZLONG) 727 goto found_first; 728 if (~tmp) 729 goto found_middle; 730 size -= _MIPS_SZLONG; 731 result += _MIPS_SZLONG; 732 } 733 while (size & ~SZLONG_MASK) { 734 if (~(tmp = *(p++))) 735 goto found_middle; 736 result += _MIPS_SZLONG; 737 size -= _MIPS_SZLONG; 738 } 739 if (!size) 740 return result; 741 tmp = *p; 742 743found_first: 744 tmp |= ~0UL << size; 745 if (tmp == ~0UL) /* Are any bits zero? */ 746 return result + size; /* Nope. */ 747found_middle: 748 return result + ffz(tmp); 749} 750 751#define find_first_zero_bit(addr, size) \ 752 find_next_zero_bit((addr), (size), 0) 753 754/* 755 * find_next_bit - find the next set bit in a memory region 756 * @addr: The address to base the search on 757 * @offset: The bitnumber to start searching at 758 * @size: The maximum size to search 759 */ 760static inline unsigned long find_next_bit(const unsigned long *addr, 761 unsigned long size, unsigned long offset) 762{ 763 const unsigned long *p = addr + (offset >> SZLONG_LOG); 764 unsigned long result = offset & ~SZLONG_MASK; 765 unsigned long tmp; 766 767 if (offset >= size) 768 return size; 769 size -= result; 770 offset &= SZLONG_MASK; 771 if (offset) { 772 tmp = *(p++); 773 tmp &= ~0UL << offset; 774 if (size < _MIPS_SZLONG) 775 goto found_first; 776 if (tmp) 777 goto found_middle; 778 size -= _MIPS_SZLONG; 779 result += _MIPS_SZLONG; 780 } 781 while (size & ~SZLONG_MASK) { 782 if ((tmp = *(p++))) 783 goto found_middle; 784 result += _MIPS_SZLONG; 785 size -= _MIPS_SZLONG; 786 } 787 if (!size) 788 return result; 789 tmp = *p; 790 791found_first: 792 tmp &= ~0UL >> (_MIPS_SZLONG - size); 793 if (tmp == 0UL) /* Are any bits set? */ 794 return result + size; /* Nope. */ 795found_middle: 796 return result + __ffs(tmp); 797} 798 799/* 800 * find_first_bit - find the first set bit in a memory region 801 * @addr: The address to start the search at 802 * @size: The maximum size to search 803 * 804 * Returns the bit-number of the first set bit, not the number of the byte 805 * containing a bit. 806 */ 807#define find_first_bit(addr, size) \ 808 find_next_bit((addr), (size), 0) 809 810#ifdef __KERNEL__ 811 812/* 813 * Every architecture must define this function. It's the fastest 814 * way of searching a 140-bit bitmap where the first 100 bits are 815 * unlikely to be set. It's guaranteed that at least one of the 140 816 * bits is cleared. 817 */ 818static inline int sched_find_first_bit(const unsigned long *b) 819{ 820#ifdef CONFIG_32BIT 821 if (unlikely(b[0])) 822 return __ffs(b[0]); 823 if (unlikely(b[1])) 824 return __ffs(b[1]) + 32; 825 if (unlikely(b[2])) 826 return __ffs(b[2]) + 64; 827 if (b[3]) 828 return __ffs(b[3]) + 96; 829 return __ffs(b[4]) + 128; 830#endif 831#ifdef CONFIG_64BIT 832 if (unlikely(b[0])) 833 return __ffs(b[0]); 834 if (unlikely(b[1])) 835 return __ffs(b[1]) + 64; 836 return __ffs(b[2]) + 128; 837#endif 838} 839 840/* 841 * hweightN - returns the hamming weight of a N-bit word 842 * @x: the word to weigh 843 * 844 * The Hamming Weight of a number is the total number of bits set in it. 845 */ 846 847#define hweight64(x) generic_hweight64(x) 848#define hweight32(x) generic_hweight32(x) 849#define hweight16(x) generic_hweight16(x) 850#define hweight8(x) generic_hweight8(x) 851 852static inline int __test_and_set_le_bit(unsigned long nr, unsigned long *addr) 853{ 854 unsigned char *ADDR = (unsigned char *) addr; 855 int mask, retval; 856 857 ADDR += nr >> 3; 858 mask = 1 << (nr & 0x07); 859 retval = (mask & *ADDR) != 0; 860 *ADDR |= mask; 861 862 return retval; 863} 864 865static inline int __test_and_clear_le_bit(unsigned long nr, unsigned long *addr) 866{ 867 unsigned char *ADDR = (unsigned char *) addr; 868 int mask, retval; 869 870 ADDR += nr >> 3; 871 mask = 1 << (nr & 0x07); 872 retval = (mask & *ADDR) != 0; 873 *ADDR &= ~mask; 874 875 return retval; 876} 877 878static inline int test_le_bit(unsigned long nr, const unsigned long * addr) 879{ 880 const unsigned char *ADDR = (const unsigned char *) addr; 881 int mask; 882 883 ADDR += nr >> 3; 884 mask = 1 << (nr & 0x07); 885 886 return ((mask & *ADDR) != 0); 887} 888 889static inline unsigned long find_next_zero_le_bit(unsigned long *addr, 890 unsigned long size, unsigned long offset) 891{ 892 unsigned long *p = ((unsigned long *) addr) + (offset >> SZLONG_LOG); 893 unsigned long result = offset & ~SZLONG_MASK; 894 unsigned long tmp; 895 896 if (offset >= size) 897 return size; 898 size -= result; 899 offset &= SZLONG_MASK; 900 if (offset) { 901 tmp = cpu_to_lelongp(p++); 902 tmp |= ~0UL >> (_MIPS_SZLONG-offset); /* bug or feature ? */ 903 if (size < _MIPS_SZLONG) 904 goto found_first; 905 if (~tmp) 906 goto found_middle; 907 size -= _MIPS_SZLONG; 908 result += _MIPS_SZLONG; 909 } 910 while (size & ~SZLONG_MASK) { 911 if (~(tmp = cpu_to_lelongp(p++))) 912 goto found_middle; 913 result += _MIPS_SZLONG; 914 size -= _MIPS_SZLONG; 915 } 916 if (!size) 917 return result; 918 tmp = cpu_to_lelongp(p); 919 920found_first: 921 tmp |= ~0UL << size; 922 if (tmp == ~0UL) /* Are any bits zero? */ 923 return result + size; /* Nope. */ 924 925found_middle: 926 return result + ffz(tmp); 927} 928 929#define find_first_zero_le_bit(addr, size) \ 930 find_next_zero_le_bit((addr), (size), 0) 931 932#define ext2_set_bit(nr,addr) \ 933 __test_and_set_le_bit((nr),(unsigned long*)addr) 934#define ext2_clear_bit(nr, addr) \ 935 __test_and_clear_le_bit((nr),(unsigned long*)addr) 936 #define ext2_set_bit_atomic(lock, nr, addr) \ 937({ \ 938 int ret; \ 939 spin_lock(lock); \ 940 ret = ext2_set_bit((nr), (addr)); \ 941 spin_unlock(lock); \ 942 ret; \ 943}) 944 945#define ext2_clear_bit_atomic(lock, nr, addr) \ 946({ \ 947 int ret; \ 948 spin_lock(lock); \ 949 ret = ext2_clear_bit((nr), (addr)); \ 950 spin_unlock(lock); \ 951 ret; \ 952}) 953#define ext2_test_bit(nr, addr) test_le_bit((nr),(unsigned long*)addr) 954#define ext2_find_first_zero_bit(addr, size) \ 955 find_first_zero_le_bit((unsigned long*)addr, size) 956#define ext2_find_next_zero_bit(addr, size, off) \ 957 find_next_zero_le_bit((unsigned long*)addr, size, off) 958 959/* 960 * Bitmap functions for the minix filesystem. 961 * 962 * FIXME: These assume that Minix uses the native byte/bitorder. 963 * This limits the Minix filesystem's value for data exchange very much. 964 */ 965#define minix_test_and_set_bit(nr,addr) test_and_set_bit(nr,addr) 966#define minix_set_bit(nr,addr) set_bit(nr,addr) 967#define minix_test_and_clear_bit(nr,addr) test_and_clear_bit(nr,addr) 968#define minix_test_bit(nr,addr) test_bit(nr,addr) 969#define minix_find_first_zero_bit(addr,size) find_first_zero_bit(addr,size) 970 971#endif /* __KERNEL__ */ 972 973#endif /* _ASM_BITOPS_H */