diff options
Diffstat (limited to 'arch/m68k/include/asm/bitops_mm.h')
-rw-r--r-- | arch/m68k/include/asm/bitops_mm.h | 102 |
1 files changed, 51 insertions, 51 deletions
diff --git a/arch/m68k/include/asm/bitops_mm.h b/arch/m68k/include/asm/bitops_mm.h index b4ecdaada520..9d69f6e62365 100644 --- a/arch/m68k/include/asm/bitops_mm.h +++ b/arch/m68k/include/asm/bitops_mm.h | |||
@@ -325,58 +325,45 @@ static inline int __fls(int x) | |||
325 | #include <asm-generic/bitops/hweight.h> | 325 | #include <asm-generic/bitops/hweight.h> |
326 | #include <asm-generic/bitops/lock.h> | 326 | #include <asm-generic/bitops/lock.h> |
327 | 327 | ||
328 | /* Bitmap functions for the minix filesystem */ | 328 | /* Bitmap functions for the little endian bitmap. */ |
329 | 329 | ||
330 | static inline int minix_find_first_zero_bit(const void *vaddr, unsigned size) | 330 | static inline void __set_bit_le(int nr, void *addr) |
331 | { | 331 | { |
332 | const unsigned short *p = vaddr, *addr = vaddr; | 332 | __set_bit(nr ^ 24, addr); |
333 | int res; | 333 | } |
334 | unsigned short num; | ||
335 | |||
336 | if (!size) | ||
337 | return 0; | ||
338 | |||
339 | size = (size >> 4) + ((size & 15) > 0); | ||
340 | while (*p++ == 0xffff) | ||
341 | { | ||
342 | if (--size == 0) | ||
343 | return (p - addr) << 4; | ||
344 | } | ||
345 | 334 | ||
346 | num = ~*--p; | 335 | static inline void __clear_bit_le(int nr, void *addr) |
347 | __asm__ __volatile__ ("bfffo %1{#16,#16},%0" | 336 | { |
348 | : "=d" (res) : "d" (num & -num)); | 337 | __clear_bit(nr ^ 24, addr); |
349 | return ((p - addr) << 4) + (res ^ 31); | ||
350 | } | 338 | } |
351 | 339 | ||
352 | #define minix_test_and_set_bit(nr, addr) __test_and_set_bit((nr) ^ 16, (unsigned long *)(addr)) | 340 | static inline int __test_and_set_bit_le(int nr, void *addr) |
353 | #define minix_set_bit(nr,addr) __set_bit((nr) ^ 16, (unsigned long *)(addr)) | 341 | { |
354 | #define minix_test_and_clear_bit(nr, addr) __test_and_clear_bit((nr) ^ 16, (unsigned long *)(addr)) | 342 | return __test_and_set_bit(nr ^ 24, addr); |
343 | } | ||
355 | 344 | ||
356 | static inline int minix_test_bit(int nr, const void *vaddr) | 345 | static inline int test_and_set_bit_le(int nr, void *addr) |
357 | { | 346 | { |
358 | const unsigned short *p = vaddr; | 347 | return test_and_set_bit(nr ^ 24, addr); |
359 | return (p[nr >> 4] & (1U << (nr & 15))) != 0; | ||
360 | } | 348 | } |
361 | 349 | ||
362 | /* Bitmap functions for the ext2 filesystem. */ | 350 | static inline int __test_and_clear_bit_le(int nr, void *addr) |
351 | { | ||
352 | return __test_and_clear_bit(nr ^ 24, addr); | ||
353 | } | ||
363 | 354 | ||
364 | #define ext2_set_bit(nr, addr) __test_and_set_bit((nr) ^ 24, (unsigned long *)(addr)) | 355 | static inline int test_and_clear_bit_le(int nr, void *addr) |
365 | #define ext2_set_bit_atomic(lock, nr, addr) test_and_set_bit((nr) ^ 24, (unsigned long *)(addr)) | 356 | { |
366 | #define ext2_clear_bit(nr, addr) __test_and_clear_bit((nr) ^ 24, (unsigned long *)(addr)) | 357 | return test_and_clear_bit(nr ^ 24, addr); |
367 | #define ext2_clear_bit_atomic(lock, nr, addr) test_and_clear_bit((nr) ^ 24, (unsigned long *)(addr)) | 358 | } |
368 | #define ext2_find_next_zero_bit(addr, size, offset) \ | ||
369 | generic_find_next_zero_le_bit((unsigned long *)addr, size, offset) | ||
370 | #define ext2_find_next_bit(addr, size, offset) \ | ||
371 | generic_find_next_le_bit((unsigned long *)addr, size, offset) | ||
372 | 359 | ||
373 | static inline int ext2_test_bit(int nr, const void *vaddr) | 360 | static inline int test_bit_le(int nr, const void *vaddr) |
374 | { | 361 | { |
375 | const unsigned char *p = vaddr; | 362 | const unsigned char *p = vaddr; |
376 | return (p[nr >> 3] & (1U << (nr & 7))) != 0; | 363 | return (p[nr >> 3] & (1U << (nr & 7))) != 0; |
377 | } | 364 | } |
378 | 365 | ||
379 | static inline int ext2_find_first_zero_bit(const void *vaddr, unsigned size) | 366 | static inline int find_first_zero_bit_le(const void *vaddr, unsigned size) |
380 | { | 367 | { |
381 | const unsigned long *p = vaddr, *addr = vaddr; | 368 | const unsigned long *p = vaddr, *addr = vaddr; |
382 | int res; | 369 | int res; |
@@ -393,33 +380,36 @@ static inline int ext2_find_first_zero_bit(const void *vaddr, unsigned size) | |||
393 | 380 | ||
394 | --p; | 381 | --p; |
395 | for (res = 0; res < 32; res++) | 382 | for (res = 0; res < 32; res++) |
396 | if (!ext2_test_bit (res, p)) | 383 | if (!test_bit_le(res, p)) |
397 | break; | 384 | break; |
398 | return (p - addr) * 32 + res; | 385 | return (p - addr) * 32 + res; |
399 | } | 386 | } |
400 | 387 | ||
401 | static inline unsigned long generic_find_next_zero_le_bit(const unsigned long *addr, | 388 | static inline unsigned long find_next_zero_bit_le(const void *addr, |
402 | unsigned long size, unsigned long offset) | 389 | unsigned long size, unsigned long offset) |
403 | { | 390 | { |
404 | const unsigned long *p = addr + (offset >> 5); | 391 | const unsigned long *p = addr; |
405 | int bit = offset & 31UL, res; | 392 | int bit = offset & 31UL, res; |
406 | 393 | ||
407 | if (offset >= size) | 394 | if (offset >= size) |
408 | return size; | 395 | return size; |
409 | 396 | ||
397 | p += offset >> 5; | ||
398 | |||
410 | if (bit) { | 399 | if (bit) { |
400 | offset -= bit; | ||
411 | /* Look for zero in first longword */ | 401 | /* Look for zero in first longword */ |
412 | for (res = bit; res < 32; res++) | 402 | for (res = bit; res < 32; res++) |
413 | if (!ext2_test_bit (res, p)) | 403 | if (!test_bit_le(res, p)) |
414 | return (p - addr) * 32 + res; | 404 | return offset + res; |
415 | p++; | 405 | p++; |
406 | offset += 32; | ||
416 | } | 407 | } |
417 | /* No zero yet, search remaining full bytes for a zero */ | 408 | /* No zero yet, search remaining full bytes for a zero */ |
418 | res = ext2_find_first_zero_bit (p, size - 32 * (p - addr)); | 409 | return offset + find_first_zero_bit_le(p, size - offset); |
419 | return (p - addr) * 32 + res; | ||
420 | } | 410 | } |
421 | 411 | ||
422 | static inline int ext2_find_first_bit(const void *vaddr, unsigned size) | 412 | static inline int find_first_bit_le(const void *vaddr, unsigned size) |
423 | { | 413 | { |
424 | const unsigned long *p = vaddr, *addr = vaddr; | 414 | const unsigned long *p = vaddr, *addr = vaddr; |
425 | int res; | 415 | int res; |
@@ -435,32 +425,42 @@ static inline int ext2_find_first_bit(const void *vaddr, unsigned size) | |||
435 | 425 | ||
436 | --p; | 426 | --p; |
437 | for (res = 0; res < 32; res++) | 427 | for (res = 0; res < 32; res++) |
438 | if (ext2_test_bit(res, p)) | 428 | if (test_bit_le(res, p)) |
439 | break; | 429 | break; |
440 | return (p - addr) * 32 + res; | 430 | return (p - addr) * 32 + res; |
441 | } | 431 | } |
442 | 432 | ||
443 | static inline unsigned long generic_find_next_le_bit(const unsigned long *addr, | 433 | static inline unsigned long find_next_bit_le(const void *addr, |
444 | unsigned long size, unsigned long offset) | 434 | unsigned long size, unsigned long offset) |
445 | { | 435 | { |
446 | const unsigned long *p = addr + (offset >> 5); | 436 | const unsigned long *p = addr; |
447 | int bit = offset & 31UL, res; | 437 | int bit = offset & 31UL, res; |
448 | 438 | ||
449 | if (offset >= size) | 439 | if (offset >= size) |
450 | return size; | 440 | return size; |
451 | 441 | ||
442 | p += offset >> 5; | ||
443 | |||
452 | if (bit) { | 444 | if (bit) { |
445 | offset -= bit; | ||
453 | /* Look for one in first longword */ | 446 | /* Look for one in first longword */ |
454 | for (res = bit; res < 32; res++) | 447 | for (res = bit; res < 32; res++) |
455 | if (ext2_test_bit(res, p)) | 448 | if (test_bit_le(res, p)) |
456 | return (p - addr) * 32 + res; | 449 | return offset + res; |
457 | p++; | 450 | p++; |
451 | offset += 32; | ||
458 | } | 452 | } |
459 | /* No set bit yet, search remaining full bytes for a set bit */ | 453 | /* No set bit yet, search remaining full bytes for a set bit */ |
460 | res = ext2_find_first_bit(p, size - 32 * (p - addr)); | 454 | return offset + find_first_bit_le(p, size - offset); |
461 | return (p - addr) * 32 + res; | ||
462 | } | 455 | } |
463 | 456 | ||
457 | /* Bitmap functions for the ext2 filesystem. */ | ||
458 | |||
459 | #define ext2_set_bit_atomic(lock, nr, addr) \ | ||
460 | test_and_set_bit_le(nr, addr) | ||
461 | #define ext2_clear_bit_atomic(lock, nr, addr) \ | ||
462 | test_and_clear_bit_le(nr, addr) | ||
463 | |||
464 | #endif /* __KERNEL__ */ | 464 | #endif /* __KERNEL__ */ |
465 | 465 | ||
466 | #endif /* _M68K_BITOPS_H */ | 466 | #endif /* _M68K_BITOPS_H */ |