forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
tools lib: Move asm-generic/bitops/find.h code to tools/include and t…
…ools/lib To match the Linux kernel source code structure from where this code came from. Cc: Adrian Hunter <[email protected]> Cc: Borislav Petkov <[email protected]> Cc: David Ahern <[email protected]> Cc: Don Zickus <[email protected]> Cc: Frederic Weisbecker <[email protected]> Cc: Jiri Olsa <[email protected]> Cc: Mike Galbraith <[email protected]> Cc: Namhyung Kim <[email protected]> Cc: Paul Mackerras <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Stephane Eranian <[email protected]> Link: http://lkml.kernel.org/n/[email protected] Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
- Loading branch information
Showing
5 changed files
with
131 additions
and
72 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
#ifndef _TOOLS_LINUX_ASM_GENERIC_BITOPS_FIND_H_ | ||
#define _TOOLS_LINUX_ASM_GENERIC_BITOPS_FIND_H_ | ||
|
||
#ifndef find_next_bit | ||
/** | ||
* find_next_bit - find the next set bit in a memory region | ||
* @addr: The address to base the search on | ||
* @offset: The bitnumber to start searching at | ||
* @size: The bitmap size in bits | ||
* | ||
* Returns the bit number for the next set bit | ||
* If no bits are set, returns @size. | ||
*/ | ||
extern unsigned long find_next_bit(const unsigned long *addr, unsigned long | ||
size, unsigned long offset); | ||
#endif | ||
|
||
#ifndef find_first_bit | ||
|
||
/** | ||
* find_first_bit - find the first set bit in a memory region | ||
* @addr: The address to start the search at | ||
* @size: The maximum number of bits to search | ||
* | ||
* Returns the bit number of the first set bit. | ||
* If no bits are set, returns @size. | ||
*/ | ||
extern unsigned long find_first_bit(const unsigned long *addr, | ||
unsigned long size); | ||
|
||
#endif /* find_first_bit */ | ||
|
||
#endif /*_TOOLS_LINUX_ASM_GENERIC_BITOPS_FIND_H_ */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
/* find_next_bit.c: fallback find next bit implementation | ||
* | ||
* Copied from lib/find_next_bit.c to tools/lib/next_bit.c | ||
* | ||
* Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. | ||
* Written by David Howells ([email protected]) | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU General Public License | ||
* as published by the Free Software Foundation; either version | ||
* 2 of the License, or (at your option) any later version. | ||
*/ | ||
|
||
#include <linux/bitops.h> | ||
#include <asm/types.h> | ||
#include <asm/byteorder.h> | ||
|
||
#define BITOP_WORD(nr) ((nr) / BITS_PER_LONG) | ||
|
||
#ifndef find_next_bit | ||
/* | ||
* Find the next set bit in a memory region. | ||
*/ | ||
unsigned long find_next_bit(const unsigned long *addr, unsigned long size, | ||
unsigned long offset) | ||
{ | ||
const unsigned long *p = addr + BITOP_WORD(offset); | ||
unsigned long result = offset & ~(BITS_PER_LONG-1); | ||
unsigned long tmp; | ||
|
||
if (offset >= size) | ||
return size; | ||
size -= result; | ||
offset %= BITS_PER_LONG; | ||
if (offset) { | ||
tmp = *(p++); | ||
tmp &= (~0UL << offset); | ||
if (size < BITS_PER_LONG) | ||
goto found_first; | ||
if (tmp) | ||
goto found_middle; | ||
size -= BITS_PER_LONG; | ||
result += BITS_PER_LONG; | ||
} | ||
while (size & ~(BITS_PER_LONG-1)) { | ||
if ((tmp = *(p++))) | ||
goto found_middle; | ||
result += BITS_PER_LONG; | ||
size -= BITS_PER_LONG; | ||
} | ||
if (!size) | ||
return result; | ||
tmp = *p; | ||
|
||
found_first: | ||
tmp &= (~0UL >> (BITS_PER_LONG - size)); | ||
if (tmp == 0UL) /* Are any bits set? */ | ||
return result + size; /* Nope. */ | ||
found_middle: | ||
return result + __ffs(tmp); | ||
} | ||
#endif | ||
|
||
#ifndef find_first_bit | ||
/* | ||
* Find the first set bit in a memory region. | ||
*/ | ||
unsigned long find_first_bit(const unsigned long *addr, unsigned long size) | ||
{ | ||
const unsigned long *p = addr; | ||
unsigned long result = 0; | ||
unsigned long tmp; | ||
|
||
while (size & ~(BITS_PER_LONG-1)) { | ||
if ((tmp = *(p++))) | ||
goto found; | ||
result += BITS_PER_LONG; | ||
size -= BITS_PER_LONG; | ||
} | ||
if (!size) | ||
return result; | ||
|
||
tmp = (*p) & (~0UL >> (BITS_PER_LONG - size)); | ||
if (tmp == 0UL) /* Are any bits set? */ | ||
return result + size; /* Nope. */ | ||
found: | ||
return result + __ffs(tmp); | ||
} | ||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters