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) 2000 Silicon Graphics, Inc. 8 */ 9 #ifndef _ASM_BITOPS_H 10 #define _ASM_BITOPS_H 11 12 #include <linux/types.h> 13 #include <asm/byteorder.h> /* sigh ... */ 14 15 #ifdef __KERNEL__ 16 17 #include <asm/sgidefs.h> 18 #include <asm/system.h> 19 20 /* 21 * clear_bit() doesn't provide any barrier for the compiler. 22 */ 23 #define smp_mb__before_clear_bit() barrier() 24 #define smp_mb__after_clear_bit() barrier() 25 26 /* 27 * Only disable interrupt for kernel mode stuff to keep usermode stuff 28 * that dares to use kernel include files alive. 29 */ 30 #define __bi_flags unsigned long flags 31 #define __bi_cli() __cli() 32 #define __bi_save_flags(x) __save_flags(x) 33 #define __bi_save_and_cli(x) __save_and_cli(x) 34 #define __bi_restore_flags(x) __restore_flags(x) 35 #else 36 #define __bi_flags 37 #define __bi_cli() 38 #define __bi_save_flags(x) 39 #define __bi_save_and_cli(x) 40 #define __bi_restore_flags(x) 41 #endif /* __KERNEL__ */ 42 43 #ifdef CONFIG_CPU_HAS_LLSC 44 45 #include <asm/mipsregs.h> 46 47 /* 48 * These functions for MIPS ISA > 1 are interrupt and SMP proof and 49 * interrupt friendly 50 */ 51 52 /* 53 * set_bit - Atomically set a bit in memory 54 * @nr: the bit to set 55 * @addr: the address to start counting from 56 * 57 * This function is atomic and may not be reordered. See __set_bit() 58 * if you do not require the atomic guarantees. 59 * Note that @nr may be almost arbitrarily large; this function is not 60 * restricted to acting on a single-word quantity. 61 */ 62 static __inline__ void 63 set_bit(int nr, volatile void *addr) 64 { 65 unsigned long *m = ((unsigned long *) addr) + (nr >> 5); 66 unsigned long temp; 67 68 __asm__ __volatile__( 69 "1:\tll\t%0, %1\t\t# set_bit\n\t" 70 "or\t%0, %2\n\t" 71 "sc\t%0, %1\n\t" 72 "beqz\t%0, 1b" 73 : "=&r" (temp), "=m" (*m) 74 : "ir" (1UL << (nr & 0x1f)), "m" (*m)); 75 } 76 77 /* 78 * __set_bit - Set a bit in memory 79 * @nr: the bit to set 80 * @addr: the address to start counting from 81 * 82 * Unlike set_bit(), this function is non-atomic and may be reordered. 83 * If it's called on the same region of memory simultaneously, the effect 84 * may be that only one operation succeeds. 85 */ 86 static __inline__ void __set_bit(int nr, volatile void * addr) 87 { 88 unsigned long * m = ((unsigned long *) addr) + (nr >> 5); 89 90 *m |= 1UL << (nr & 31); 91 } 92 #define PLATFORM__SET_BIT 93 94 /* 95 * clear_bit - Clears a bit in memory 96 * @nr: Bit to clear 97 * @addr: Address to start counting from 98 * 99 * clear_bit() is atomic and may not be reordered. However, it does 100 * not contain a memory barrier, so if it is used for locking purposes, 101 * you should call smp_mb__before_clear_bit() and/or smp_mb__after_clear_bit() 102 * in order to ensure changes are visible on other processors. 103 */ 104 static __inline__ void 105 clear_bit(int nr, volatile void *addr) 106 { 107 unsigned long *m = ((unsigned long *) addr) + (nr >> 5); 108 unsigned long temp; 109 110 __asm__ __volatile__( 111 "1:\tll\t%0, %1\t\t# clear_bit\n\t" 112 "and\t%0, %2\n\t" 113 "sc\t%0, %1\n\t" 114 "beqz\t%0, 1b\n\t" 115 : "=&r" (temp), "=m" (*m) 116 : "ir" (~(1UL << (nr & 0x1f))), "m" (*m)); 117 } 118 119 /* 120 * change_bit - Toggle a bit in memory 121 * @nr: Bit to clear 122 * @addr: Address to start counting from 123 * 124 * change_bit() is atomic and may not be reordered. 125 * Note that @nr may be almost arbitrarily large; this function is not 126 * restricted to acting on a single-word quantity. 127 */ 128 static __inline__ void 129 change_bit(int nr, volatile void *addr) 130 { 131 unsigned long *m = ((unsigned long *) addr) + (nr >> 5); 132 unsigned long temp; 133 134 __asm__ __volatile__( 135 "1:\tll\t%0, %1\t\t# change_bit\n\t" 136 "xor\t%0, %2\n\t" 137 "sc\t%0, %1\n\t" 138 "beqz\t%0, 1b" 139 : "=&r" (temp), "=m" (*m) 140 : "ir" (1UL << (nr & 0x1f)), "m" (*m)); 141 } 142 143 /* 144 * __change_bit - Toggle a bit in memory 145 * @nr: the bit to set 146 * @addr: the address to start counting from 147 * 148 * Unlike change_bit(), this function is non-atomic and may be reordered. 149 * If it's called on the same region of memory simultaneously, the effect 150 * may be that only one operation succeeds. 151 */ 152 static __inline__ void __change_bit(int nr, volatile void * addr) 153 { 154 unsigned long * m = ((unsigned long *) addr) + (nr >> 5); 155 156 *m ^= 1UL << (nr & 31); 157 } 158 159 /* 160 * test_and_set_bit - Set a bit and return its old value 161 * @nr: Bit to set 162 * @addr: Address to count from 163 * 164 * This operation is atomic and cannot be reordered. 165 * It also implies a memory barrier. 166 */ 167 static __inline__ int 168 test_and_set_bit(int nr, volatile void *addr) 169 { 170 unsigned long *m = ((unsigned long *) addr) + (nr >> 5); 171 unsigned long temp, res; 172 173 __asm__ __volatile__( 174 ".set\tnoreorder\t\t# test_and_set_bit\n" 175 "1:\tll\t%0, %1\n\t" 176 "or\t%2, %0, %3\n\t" 177 "sc\t%2, %1\n\t" 178 "beqz\t%2, 1b\n\t" 179 " and\t%2, %0, %3\n\t" 180 ".set\treorder" 181 : "=&r" (temp), "=m" (*m), "=&r" (res) 182 : "r" (1UL << (nr & 0x1f)), "m" (*m) 183 : "memory"); 184 185 return res != 0; 186 } 187 188 /* 189 * __test_and_set_bit - Set a bit and return its old value 190 * @nr: Bit to set 191 * @addr: Address to count from 192 * 193 * This operation is non-atomic and can be reordered. 194 * If two examples of this operation race, one can appear to succeed 195 * but actually fail. You must protect multiple accesses with a lock. 196 */ 197 static __inline__ int __test_and_set_bit(int nr, volatile void * addr) 198 { 199 int mask, retval; 200 volatile int *a = addr; 201 202 a += nr >> 5; 203 mask = 1 << (nr & 0x1f); 204 retval = (mask & *a) != 0; 205 *a |= mask; 206 207 return retval; 208 } 209 210 /* 211 * test_and_clear_bit - Clear a bit and return its old value 212 * @nr: Bit to set 213 * @addr: Address to count from 214 * 215 * This operation is atomic and cannot be reordered. 216 * It also implies a memory barrier. 217 */ 218 static __inline__ int 219 test_and_clear_bit(int nr, volatile void *addr) 220 { 221 unsigned long *m = ((unsigned long *) addr) + (nr >> 5); 222 unsigned long temp, res; 223 224 __asm__ __volatile__( 225 ".set\tnoreorder\t\t# test_and_clear_bit\n" 226 "1:\tll\t%0, %1\n\t" 227 "or\t%2, %0, %3\n\t" 228 "xor\t%2, %3\n\t" 229 "sc\t%2, %1\n\t" 230 "beqz\t%2, 1b\n\t" 231 " and\t%2, %0, %3\n\t" 232 ".set\treorder" 233 : "=&r" (temp), "=m" (*m), "=&r" (res) 234 : "r" (1UL << (nr & 0x1f)), "m" (*m) 235 : "memory"); 236 237 return res != 0; 238 } 239 240 /* 241 * __test_and_clear_bit - Clear a bit and return its old value 242 * @nr: Bit to set 243 * @addr: Address to count from 244 * 245 * This operation is non-atomic and can be reordered. 246 * If two examples of this operation race, one can appear to succeed 247 * but actually fail. You must protect multiple accesses with a lock. 248 */ 249 static __inline__ int __test_and_clear_bit(int nr, volatile void * addr) 250 { 251 int mask, retval; 252 volatile int *a = addr; 253 254 a += nr >> 5; 255 mask = 1 << (nr & 0x1f); 256 retval = (mask & *a) != 0; 257 *a &= ~mask; 258 259 return retval; 260 } 261 262 /* 263 * test_and_change_bit - Change a bit and return its new value 264 * @nr: Bit to set 265 * @addr: Address to count from 266 * 267 * This operation is atomic and cannot be reordered. 268 * It also implies a memory barrier. 269 */ 270 static __inline__ int 271 test_and_change_bit(int nr, volatile void *addr) 272 { 273 unsigned long *m = ((unsigned long *) addr) + (nr >> 5); 274 unsigned long temp, res; 275 276 __asm__ __volatile__( 277 ".set\tnoreorder\t\t# test_and_change_bit\n" 278 "1:\tll\t%0, %1\n\t" 279 "xor\t%2, %0, %3\n\t" 280 "sc\t%2, %1\n\t" 281 "beqz\t%2, 1b\n\t" 282 " and\t%2, %0, %3\n\t" 283 ".set\treorder" 284 : "=&r" (temp), "=m" (*m), "=&r" (res) 285 : "r" (1UL << (nr & 0x1f)), "m" (*m) 286 : "memory"); 287 288 return res != 0; 289 } 290 291 /* 292 * __test_and_change_bit - Change a bit and return its old value 293 * @nr: Bit to set 294 * @addr: Address to count from 295 * 296 * This operation is non-atomic and can be reordered. 297 * If two examples of this operation race, one can appear to succeed 298 * but actually fail. You must protect multiple accesses with a lock. 299 */ 300 static __inline__ int __test_and_change_bit(int nr, volatile void * addr) 301 { 302 int mask, retval; 303 volatile int *a = addr; 304 305 a += nr >> 5; 306 mask = 1 << (nr & 0x1f); 307 retval = (mask & *a) != 0; 308 *a ^= mask; 309 310 return retval; 311 } 312 313 #else /* MIPS I */ 314 315 /* 316 * set_bit - Atomically set a bit in memory 317 * @nr: the bit to set 318 * @addr: the address to start counting from 319 * 320 * This function is atomic and may not be reordered. See __set_bit() 321 * if you do not require the atomic guarantees. 322 * Note that @nr may be almost arbitrarily large; this function is not 323 * restricted to acting on a single-word quantity. 324 */ 325 static __inline__ void set_bit(int nr, volatile void * addr) 326 { 327 int mask; 328 volatile int *a = addr; 329 __bi_flags; 330 331 a += nr >> 5; 332 mask = 1 << (nr & 0x1f); 333 __bi_save_and_cli(flags); 334 *a |= mask; 335 __bi_restore_flags(flags); 336 } 337 338 /* 339 * __set_bit - Set a bit in memory 340 * @nr: the bit to set 341 * @addr: the address to start counting from 342 * 343 * Unlike set_bit(), this function is non-atomic and may be reordered. 344 * If it's called on the same region of memory simultaneously, the effect 345 * may be that only one operation succeeds. 346 */ 347 static __inline__ void __set_bit(int nr, volatile void * addr) 348 { 349 int mask; 350 volatile int *a = addr; 351 352 a += nr >> 5; 353 mask = 1 << (nr & 0x1f); 354 *a |= mask; 355 } 356 357 /* 358 * clear_bit - Clears a bit in memory 359 * @nr: Bit to clear 360 * @addr: Address to start counting from 361 * 362 * clear_bit() is atomic and may not be reordered. However, it does 363 * not contain a memory barrier, so if it is used for locking purposes, 364 * you should call smp_mb__before_clear_bit() and/or smp_mb__after_clear_bit() 365 * in order to ensure changes are visible on other processors. 366 */ 367 static __inline__ void clear_bit(int nr, volatile void * addr) 368 { 369 int mask; 370 volatile int *a = addr; 371 __bi_flags; 372 373 a += nr >> 5; 374 mask = 1 << (nr & 0x1f); 375 __bi_save_and_cli(flags); 376 *a &= ~mask; 377 __bi_restore_flags(flags); 378 } 379 380 /* 381 * change_bit - Toggle a bit in memory 382 * @nr: Bit to clear 383 * @addr: Address to start counting from 384 * 385 * change_bit() is atomic and may not be reordered. 386 * Note that @nr may be almost arbitrarily large; this function is not 387 * restricted to acting on a single-word quantity. 388 */ 389 static __inline__ void change_bit(int nr, volatile void * addr) 390 { 391 int mask; 392 volatile int *a = addr; 393 __bi_flags; 394 395 a += nr >> 5; 396 mask = 1 << (nr & 0x1f); 397 __bi_save_and_cli(flags); 398 *a ^= mask; 399 __bi_restore_flags(flags); 400 } 401 402 /* 403 * __change_bit - Toggle a bit in memory 404 * @nr: the bit to set 405 * @addr: the address to start counting from 406 * 407 * Unlike change_bit(), this function is non-atomic and may be reordered. 408 * If it's called on the same region of memory simultaneously, the effect 409 * may be that only one operation succeeds. 410 */ 411 static __inline__ void __change_bit(int nr, volatile void * addr) 412 { 413 unsigned long * m = ((unsigned long *) addr) + (nr >> 5); 414 415 *m ^= 1UL << (nr & 31); 416 } 417 418 /* 419 * test_and_set_bit - Set a bit and return its old value 420 * @nr: Bit to set 421 * @addr: Address to count from 422 * 423 * This operation is atomic and cannot be reordered. 424 * It also implies a memory barrier. 425 */ 426 static __inline__ int test_and_set_bit(int nr, volatile void * addr) 427 { 428 int mask, retval; 429 volatile int *a = addr; 430 __bi_flags; 431 432 a += nr >> 5; 433 mask = 1 << (nr & 0x1f); 434 __bi_save_and_cli(flags); 435 retval = (mask & *a) != 0; 436 *a |= mask; 437 __bi_restore_flags(flags); 438 439 return retval; 440 } 441 442 /* 443 * __test_and_set_bit - Set a bit and return its old value 444 * @nr: Bit to set 445 * @addr: Address to count from 446 * 447 * This operation is non-atomic and can be reordered. 448 * If two examples of this operation race, one can appear to succeed 449 * but actually fail. You must protect multiple accesses with a lock. 450 */ 451 static __inline__ int __test_and_set_bit(int nr, volatile void * addr) 452 { 453 int mask, retval; 454 volatile int *a = addr; 455 456 a += nr >> 5; 457 mask = 1 << (nr & 0x1f); 458 retval = (mask & *a) != 0; 459 *a |= mask; 460 461 return retval; 462 } 463 464 /* 465 * test_and_clear_bit - Clear a bit and return its old value 466 * @nr: Bit to set 467 * @addr: Address to count from 468 * 469 * This operation is atomic and cannot be reordered. 470 * It also implies a memory barrier. 471 */ 472 static __inline__ int test_and_clear_bit(int nr, volatile void * addr) 473 { 474 int mask, retval; 475 volatile int *a = addr; 476 __bi_flags; 477 478 a += nr >> 5; 479 mask = 1 << (nr & 0x1f); 480 __bi_save_and_cli(flags); 481 retval = (mask & *a) != 0; 482 *a &= ~mask; 483 __bi_restore_flags(flags); 484 485 return retval; 486 } 487 488 /* 489 * __test_and_clear_bit - Clear a bit and return its old value 490 * @nr: Bit to set 491 * @addr: Address to count from 492 * 493 * This operation is non-atomic and can be reordered. 494 * If two examples of this operation race, one can appear to succeed 495 * but actually fail. You must protect multiple accesses with a lock. 496 */ 497 static __inline__ int __test_and_clear_bit(int nr, volatile void * addr) 498 { 499 int mask, retval; 500 volatile int *a = addr; 501 502 a += nr >> 5; 503 mask = 1 << (nr & 0x1f); 504 retval = (mask & *a) != 0; 505 *a &= ~mask; 506 507 return retval; 508 } 509 510 /* 511 * test_and_change_bit - Change a bit and return its new value 512 * @nr: Bit to set 513 * @addr: Address to count from 514 * 515 * This operation is atomic and cannot be reordered. 516 * It also implies a memory barrier. 517 */ 518 static __inline__ int test_and_change_bit(int nr, volatile void * addr) 519 { 520 int mask, retval; 521 volatile int *a = addr; 522 __bi_flags; 523 524 a += nr >> 5; 525 mask = 1 << (nr & 0x1f); 526 __bi_save_and_cli(flags); 527 retval = (mask & *a) != 0; 528 *a ^= mask; 529 __bi_restore_flags(flags); 530 531 return retval; 532 } 533 534 /* 535 * __test_and_change_bit - Change a bit and return its old value 536 * @nr: Bit to set 537 * @addr: Address to count from 538 * 539 * This operation is non-atomic and can be reordered. 540 * If two examples of this operation race, one can appear to succeed 541 * but actually fail. You must protect multiple accesses with a lock. 542 */ 543 static __inline__ int __test_and_change_bit(int nr, volatile void * addr) 544 { 545 int mask, retval; 546 volatile int *a = addr; 547 548 a += nr >> 5; 549 mask = 1 << (nr & 0x1f); 550 retval = (mask & *a) != 0; 551 *a ^= mask; 552 553 return retval; 554 } 555 556 #undef __bi_flags 557 #undef __bi_cli 558 #undef __bi_save_flags 559 #undef __bi_restore_flags 560 561 #endif /* MIPS I */ 562 563 /* 564 * test_bit - Determine whether a bit is set 565 * @nr: bit number to test 566 * @addr: Address to start counting from 567 */ 568 static __inline__ int test_bit(int nr, const volatile void *addr) 569 { 570 return ((1UL << (nr & 31)) & (((const unsigned int *) addr)[nr >> 5])) != 0; 571 } 572 573 #ifndef __MIPSEB__ 574 575 /* Little endian versions. */ 576 577 /* 578 * find_first_zero_bit - find the first zero bit in a memory region 579 * @addr: The address to start the search at 580 * @size: The maximum size to search 581 * 582 * Returns the bit-number of the first zero bit, not the number of the byte 583 * containing a bit. 584 */ 585 static __inline__ int find_first_zero_bit (void *addr, unsigned size) 586 { 587 unsigned long dummy; 588 int res; 589 590 if (!size) 591 return 0; 592 593 __asm__ (".set\tnoreorder\n\t" 594 ".set\tnoat\n" 595 "1:\tsubu\t$1,%6,%0\n\t" 596 "blez\t$1,2f\n\t" 597 "lw\t$1,(%5)\n\t" 598 "addiu\t%5,4\n\t" 599 #if (_MIPS_ISA == _MIPS_ISA_MIPS2 ) || (_MIPS_ISA == _MIPS_ISA_MIPS3 ) || \ 600 (_MIPS_ISA == _MIPS_ISA_MIPS4 ) || (_MIPS_ISA == _MIPS_ISA_MIPS5 ) || \ 601 (_MIPS_ISA == _MIPS_ISA_MIPS32) || (_MIPS_ISA == _MIPS_ISA_MIPS64) 602 "beql\t%1,$1,1b\n\t" 603 "addiu\t%0,32\n\t" 604 #else 605 "addiu\t%0,32\n\t" 606 "beq\t%1,$1,1b\n\t" 607 "nop\n\t" 608 "subu\t%0,32\n\t" 609 #endif 610 #ifdef __MIPSEB__ 611 #error "Fix this for big endian" 612 #endif /* __MIPSEB__ */ 613 "li\t%1,1\n" 614 "1:\tand\t%2,$1,%1\n\t" 615 "beqz\t%2,2f\n\t" 616 "sll\t%1,%1,1\n\t" 617 "bnez\t%1,1b\n\t" 618 "add\t%0,%0,1\n\t" 619 ".set\tat\n\t" 620 ".set\treorder\n" 621 "2:" 622 : "=r" (res), "=r" (dummy), "=r" (addr) 623 : "0" ((signed int) 0), "1" ((unsigned int) 0xffffffff), 624 "2" (addr), "r" (size) 625 : "$1"); 626 627 return res; 628 } 629 630 /* 631 * find_next_zero_bit - find the first zero bit in a memory region 632 * @addr: The address to base the search on 633 * @offset: The bitnumber to start searching at 634 * @size: The maximum size to search 635 */ 636 static __inline__ int find_next_zero_bit (void * addr, int size, int offset) 637 { 638 unsigned int *p = ((unsigned int *) addr) + (offset >> 5); 639 int set = 0, bit = offset & 31, res; 640 unsigned long dummy; 641 642 if (bit) { 643 /* 644 * Look for zero in first byte 645 */ 646 #ifdef __MIPSEB__ 647 #error "Fix this for big endian byte order" 648 #endif 649 __asm__(".set\tnoreorder\n\t" 650 ".set\tnoat\n" 651 "1:\tand\t$1,%4,%1\n\t" 652 "beqz\t$1,1f\n\t" 653 "sll\t%1,%1,1\n\t" 654 "bnez\t%1,1b\n\t" 655 "addiu\t%0,1\n\t" 656 ".set\tat\n\t" 657 ".set\treorder\n" 658 "1:" 659 : "=r" (set), "=r" (dummy) 660 : "0" (0), "1" (1 << bit), "r" (*p) 661 : "$1"); 662 if (set < (32 - bit)) 663 return set + offset; 664 set = 32 - bit; 665 p++; 666 } 667 /* 668 * No zero yet, search remaining full bytes for a zero 669 */ 670 res = find_first_zero_bit(p, size - 32 * (p - (unsigned int *) addr)); 671 return offset + set + res; 672 } 673 674 #endif /* !(__MIPSEB__) */ 675 676 /* 677 * ffz - find first zero in word. 678 * @word: The word to search 679 * 680 * Undefined if no zero exists, so code should check against ~0UL first. 681 */ 682 static __inline__ unsigned long ffz(unsigned long word) 683 { 684 unsigned int __res; 685 unsigned int mask = 1; 686 687 __asm__ ( 688 ".set\tnoreorder\n\t" 689 ".set\tnoat\n\t" 690 "move\t%0,$0\n" 691 "1:\tand\t$1,%2,%1\n\t" 692 "beqz\t$1,2f\n\t" 693 "sll\t%1,1\n\t" 694 "bnez\t%1,1b\n\t" 695 "addiu\t%0,1\n\t" 696 ".set\tat\n\t" 697 ".set\treorder\n" 698 "2:\n\t" 699 : "=&r" (__res), "=r" (mask) 700 : "r" (word), "1" (mask) 701 : "$1"); 702 703 return __res; 704 } 705 706 #ifdef __KERNEL__ 707 708 /* 709 * hweightN - returns the hamming weight of a N-bit word 710 * @x: the word to weigh 711 * 712 * The Hamming Weight of a number is the total number of bits set in it. 713 */ 714 715 #define hweight32(x) generic_hweight32(x) 716 #define hweight16(x) generic_hweight16(x) 717 #define hweight8(x) generic_hweight8(x) 718 719 #endif /* __KERNEL__ */ 720 721 #ifdef __MIPSEB__ 722 /* 723 * find_next_zero_bit - find the first zero bit in a memory region 724 * @addr: The address to base the search on 725 * @offset: The bitnumber to start searching at 726 * @size: The maximum size to search 727 */ 728 static __inline__ int find_next_zero_bit(void *addr, int size, int offset) 729 { 730 unsigned long *p = ((unsigned long *) addr) + (offset >> 5); 731 unsigned long result = offset & ~31UL; 732 unsigned long tmp; 733 734 if (offset >= size) 735 return size; 736 size -= result; 737 offset &= 31UL; 738 if (offset) { 739 tmp = *(p++); 740 tmp |= ~0UL >> (32-offset); 741 if (size < 32) 742 goto found_first; 743 if (~tmp) 744 goto found_middle; 745 size -= 32; 746 result += 32; 747 } 748 while (size & ~31UL) { 749 if (~(tmp = *(p++))) 750 goto found_middle; 751 result += 32; 752 size -= 32; 753 } 754 if (!size) 755 return result; 756 tmp = *p; 757 758 found_first: 759 tmp |= ~0UL << size; 760 found_middle: 761 return result + ffz(tmp); 762 } 763 764 /* Linus sez that gcc can optimize the following correctly, we'll see if this 765 * holds on the Sparc as it does for the ALPHA. 766 */ 767 768 #if 0 /* Fool kernel-doc since it doesn't do macros yet */ 769 /* 770 * find_first_zero_bit - find the first zero bit in a memory region 771 * @addr: The address to start the search at 772 * @size: The maximum size to search 773 * 774 * Returns the bit-number of the first zero bit, not the number of the byte 775 * containing a bit. 776 */ 777 static int find_first_zero_bit (void *addr, unsigned size); 778 #endif 779 780 #define find_first_zero_bit(addr, size) \ 781 find_next_zero_bit((addr), (size), 0) 782 783 #endif /* (__MIPSEB__) */ 784 785 /* Now for the ext2 filesystem bit operations and helper routines. */ 786 787 #ifdef __MIPSEB__ 788 static __inline__ int ext2_set_bit(int nr, void * addr) 789 { 790 int mask, retval, flags; 791 unsigned char *ADDR = (unsigned char *) addr; 792 793 ADDR += nr >> 3; 794 mask = 1 << (nr & 0x07); 795 save_and_cli(flags); 796 retval = (mask & *ADDR) != 0; 797 *ADDR |= mask; 798 restore_flags(flags); 799 return retval; 800 } 801 802 static __inline__ int ext2_clear_bit(int nr, void * addr) 803 { 804 int mask, retval, flags; 805 unsigned char *ADDR = (unsigned char *) addr; 806 807 ADDR += nr >> 3; 808 mask = 1 << (nr & 0x07); 809 save_and_cli(flags); 810 retval = (mask & *ADDR) != 0; 811 *ADDR &= ~mask; 812 restore_flags(flags); 813 return retval; 814 } 815 816 static __inline__ int ext2_test_bit(int nr, const void * addr) 817 { 818 int mask; 819 const unsigned char *ADDR = (const unsigned char *) addr; 820 821 ADDR += nr >> 3; 822 mask = 1 << (nr & 0x07); 823 return ((mask & *ADDR) != 0); 824 } 825 826 #define ext2_find_first_zero_bit(addr, size) \ 827 ext2_find_next_zero_bit((addr), (size), 0) 828 829 static __inline__ unsigned long ext2_find_next_zero_bit(void *addr, unsigned long size, unsigned long offset) 830 { 831 unsigned long *p = ((unsigned long *) addr) + (offset >> 5); 832 unsigned long result = offset & ~31UL; 833 unsigned long tmp; 834 835 if (offset >= size) 836 return size; 837 size -= result; 838 offset &= 31UL; 839 if(offset) { 840 /* We hold the little endian value in tmp, but then the 841 * shift is illegal. So we could keep a big endian value 842 * in tmp, like this: 843 * 844 * tmp = __swab32(*(p++)); 845 * tmp |= ~0UL >> (32-offset); 846 * 847 * but this would decrease preformance, so we change the 848 * shift: 849 */ 850 tmp = *(p++); 851 tmp |= __swab32(~0UL >> (32-offset)); 852 if(size < 32) 853 goto found_first; 854 if(~tmp) 855 goto found_middle; 856 size -= 32; 857 result += 32; 858 } 859 while(size & ~31UL) { 860 if(~(tmp = *(p++))) 861 goto found_middle; 862 result += 32; 863 size -= 32; 864 } 865 if(!size) 866 return result; 867 tmp = *p; 868 869 found_first: 870 /* tmp is little endian, so we would have to swab the shift, 871 * see above. But then we have to swab tmp below for ffz, so 872 * we might as well do this here. 873 */ 874 return result + ffz(__swab32(tmp) | (~0UL << size)); 875 found_middle: 876 return result + ffz(__swab32(tmp)); 877 } 878 #else /* !(__MIPSEB__) */ 879 880 /* Native ext2 byte ordering, just collapse using defines. */ 881 #define ext2_set_bit(nr, addr) test_and_set_bit((nr), (addr)) 882 #define ext2_clear_bit(nr, addr) test_and_clear_bit((nr), (addr)) 883 #define ext2_test_bit(nr, addr) test_bit((nr), (addr)) 884 #define ext2_find_first_zero_bit(addr, size) find_first_zero_bit((addr), (size)) 885 #define ext2_find_next_zero_bit(addr, size, offset) \ 886 find_next_zero_bit((addr), (size), (offset)) 887 888 #endif /* !(__MIPSEB__) */ 889 890 /* 891 * Bitmap functions for the minix filesystem. 892 * FIXME: These assume that Minix uses the native byte/bitorder. 893 * This limits the Minix filesystem's value for data exchange very much. 894 */ 895 #define minix_test_and_set_bit(nr,addr) test_and_set_bit(nr,addr) 896 #define minix_set_bit(nr,addr) set_bit(nr,addr) 897 #define minix_test_and_clear_bit(nr,addr) test_and_clear_bit(nr,addr) 898 #define minix_test_bit(nr,addr) test_bit(nr,addr) 899 #define minix_find_first_zero_bit(addr,size) find_first_zero_bit(addr,size) 900 901 #endif /* _ASM_BITOPS_H */ 902