diff options
author | marcel <marcel@FreeBSD.org> | 2003-08-25 01:39:47 +0000 |
---|---|---|
committer | marcel <marcel@FreeBSD.org> | 2003-08-25 01:39:47 +0000 |
commit | 64d376606d6eecb889a8f88bfccd4aef1ee306b9 (patch) | |
tree | d279adde804c088bd6a06de87c72099c319124c2 /sys | |
parent | 68be1eae1d7c580e2b0d4e17fa0e72eb5fd99345 (diff) | |
download | FreeBSD-src-64d376606d6eecb889a8f88bfccd4aef1ee306b9.zip FreeBSD-src-64d376606d6eecb889a8f88bfccd4aef1ee306b9.tar.gz |
Change of plans: Add ext2_bitops.h with generic and portable
implementations. Use those on platforms that don't have MD
headers. Remove the ia64 MD header. We're going to use the C
implementation there.
Suggested by: bde
Diffstat (limited to 'sys')
-rw-r--r-- | sys/gnu/ext2fs/ext2_bitops.h | 114 | ||||
-rw-r--r-- | sys/gnu/ext2fs/ext2_linux_balloc.c | 4 | ||||
-rw-r--r-- | sys/gnu/ext2fs/ext2_linux_ialloc.c | 4 | ||||
-rw-r--r-- | sys/gnu/ext2fs/ia64-bitops.h | 43 | ||||
-rw-r--r-- | sys/gnu/fs/ext2fs/ext2_bitops.h | 114 | ||||
-rw-r--r-- | sys/gnu/fs/ext2fs/ext2_linux_balloc.c | 4 | ||||
-rw-r--r-- | sys/gnu/fs/ext2fs/ext2_linux_ialloc.c | 4 |
7 files changed, 232 insertions, 55 deletions
diff --git a/sys/gnu/ext2fs/ext2_bitops.h b/sys/gnu/ext2fs/ext2_bitops.h new file mode 100644 index 0000000..cccc23c --- /dev/null +++ b/sys/gnu/ext2fs/ext2_bitops.h @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2003 Marcel Moolenaar + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _SYS_GNU_EXT2FS_EXT2_BITOPS_H_ +#define _SYS_GNU_EXT2FS_EXT2_BITOPS_H_ + +#define find_first_zero_bit(data, sz) find_next_zero_bit(data, sz, 0) + +static __inline int +clear_bit(int no, void *data) +{ + uint32_t *p; + uint32_t mask, new, old; + + p = (uint32_t*)data + (no >> 5); + mask = (1U << (no & 31)); + do { + old = *p; + new = old & ~mask; + } while (!atomic_cmpset_32(p, old, new)); + return (old & mask); +} + +static __inline int +set_bit(int no, void *data) +{ + uint32_t *p; + uint32_t mask, new, old; + + p = (uint32_t*)data + (no >> 5); + mask = (1U << (no & 31)); + do { + old = *p; + new = old | mask; + } while (!atomic_cmpset_32(p, old, new)); + return (old & mask); +} + +static __inline int +test_bit(int no, void *data) +{ + uint32_t *p; + uint32_t mask; + + p = (uint32_t*)data + (no >> 5); + mask = (1U << (no & 31)); + return (*p & mask); +} + +static __inline size_t +find_next_zero_bit(void *data, size_t sz, size_t ofs) +{ + uint32_t *p; + uint32_t mask; + int bit; + + p = (uint32_t*)data + (ofs >> 5); + if (ofs & 31) { + mask = ~0U << (ofs & 31); + bit = *p | ~mask; + if (bit != ~0U) + return (ffs(~bit) + ofs - 1); + p++; + ofs = (ofs + 31U) & ~31U; + } + while(*p == ~0U && ofs < sz) { + p++; + ofs += 32; + } + if (ofs == sz) + return (ofs); + bit = *p; + return (ffs(~bit) + ofs - 1); +} + +static __inline void * +memscan(void *data, int c, size_t sz) +{ + uint8_t *p; + + p = data; + while (sz && *p != c) { + p++; + sz--; + } + return (p); +} + +#endif /* _SYS_GNU_EXT2FS_EXT2_BITOPS_H_ */ diff --git a/sys/gnu/ext2fs/ext2_linux_balloc.c b/sys/gnu/ext2fs/ext2_linux_balloc.c index dcbd346..ed0259e 100644 --- a/sys/gnu/ext2fs/ext2_linux_balloc.c +++ b/sys/gnu/ext2fs/ext2_linux_balloc.c @@ -46,10 +46,8 @@ #include <gnu/ext2fs/alpha-bitops.h> #elif __i386__ #include <gnu/ext2fs/i386-bitops.h> -#elif __ia64__ -#include <gnu/ext2fs/ia64-bitops.h> #else -#error Provide a bitops.h file, please! +#include <gnu/ext2fs/ext2_bitops.h> #endif #define in_range(b, first, len) ((b) >= (first) && (b) <= (first) + (len) - 1) diff --git a/sys/gnu/ext2fs/ext2_linux_ialloc.c b/sys/gnu/ext2fs/ext2_linux_ialloc.c index faa0ba9..926fe7c 100644 --- a/sys/gnu/ext2fs/ext2_linux_ialloc.c +++ b/sys/gnu/ext2fs/ext2_linux_ialloc.c @@ -48,10 +48,8 @@ #include <gnu/ext2fs/alpha-bitops.h> #elif __i386__ #include <gnu/ext2fs/i386-bitops.h> -#elif __ia64__ -#include <gnu/ext2fs/ia64-bitops.h> #else -#error please provide bit operation functions +#include <gnu/ext2fs/ext2_bitops.h> #endif /* this is supposed to mark a buffer dirty on ready for delayed writing diff --git a/sys/gnu/ext2fs/ia64-bitops.h b/sys/gnu/ext2fs/ia64-bitops.h deleted file mode 100644 index c648b3f..0000000 --- a/sys/gnu/ext2fs/ia64-bitops.h +++ /dev/null @@ -1,43 +0,0 @@ -/* $FreeBSD$ */ - -#ifndef _GNU_EXT2FS_BITOPS_H_ -#define _GNU_EXT2FS_BITOPS_H_ - -#define find_first_zero_bit(addr, size) find_next_zero_bit(addr,size,0) - -static __inline int -clear_bit(int no, void *addr) -{ - panic("ext2fs: clear_bit() unimplemented"); - return (0); -} - -static __inline int -set_bit(int no, void *addr) -{ - panic("ext2fs: set_bit() unimplemented"); - return (0); -} - -static __inline int -test_bit(int no, void *addr) -{ - panic("ext2fs: clear_bit() unimplemented"); - return (0); -} - -static __inline size_t -find_next_zero_bit(void *addr, size_t size, size_t ofs) -{ - panic("ext2fs: find_next_zero_bit() unimplemented"); - return (0); -} - -static __inline void * -memscan(void *addr, int c, size_t sz) -{ - panic("ext2fs: memscan() unimplemented"); - return (addr); -} - -#endif /* _GNU_EXT2FS_BITOPS_H_ */ diff --git a/sys/gnu/fs/ext2fs/ext2_bitops.h b/sys/gnu/fs/ext2fs/ext2_bitops.h new file mode 100644 index 0000000..cccc23c --- /dev/null +++ b/sys/gnu/fs/ext2fs/ext2_bitops.h @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2003 Marcel Moolenaar + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _SYS_GNU_EXT2FS_EXT2_BITOPS_H_ +#define _SYS_GNU_EXT2FS_EXT2_BITOPS_H_ + +#define find_first_zero_bit(data, sz) find_next_zero_bit(data, sz, 0) + +static __inline int +clear_bit(int no, void *data) +{ + uint32_t *p; + uint32_t mask, new, old; + + p = (uint32_t*)data + (no >> 5); + mask = (1U << (no & 31)); + do { + old = *p; + new = old & ~mask; + } while (!atomic_cmpset_32(p, old, new)); + return (old & mask); +} + +static __inline int +set_bit(int no, void *data) +{ + uint32_t *p; + uint32_t mask, new, old; + + p = (uint32_t*)data + (no >> 5); + mask = (1U << (no & 31)); + do { + old = *p; + new = old | mask; + } while (!atomic_cmpset_32(p, old, new)); + return (old & mask); +} + +static __inline int +test_bit(int no, void *data) +{ + uint32_t *p; + uint32_t mask; + + p = (uint32_t*)data + (no >> 5); + mask = (1U << (no & 31)); + return (*p & mask); +} + +static __inline size_t +find_next_zero_bit(void *data, size_t sz, size_t ofs) +{ + uint32_t *p; + uint32_t mask; + int bit; + + p = (uint32_t*)data + (ofs >> 5); + if (ofs & 31) { + mask = ~0U << (ofs & 31); + bit = *p | ~mask; + if (bit != ~0U) + return (ffs(~bit) + ofs - 1); + p++; + ofs = (ofs + 31U) & ~31U; + } + while(*p == ~0U && ofs < sz) { + p++; + ofs += 32; + } + if (ofs == sz) + return (ofs); + bit = *p; + return (ffs(~bit) + ofs - 1); +} + +static __inline void * +memscan(void *data, int c, size_t sz) +{ + uint8_t *p; + + p = data; + while (sz && *p != c) { + p++; + sz--; + } + return (p); +} + +#endif /* _SYS_GNU_EXT2FS_EXT2_BITOPS_H_ */ diff --git a/sys/gnu/fs/ext2fs/ext2_linux_balloc.c b/sys/gnu/fs/ext2fs/ext2_linux_balloc.c index dcbd346..ed0259e 100644 --- a/sys/gnu/fs/ext2fs/ext2_linux_balloc.c +++ b/sys/gnu/fs/ext2fs/ext2_linux_balloc.c @@ -46,10 +46,8 @@ #include <gnu/ext2fs/alpha-bitops.h> #elif __i386__ #include <gnu/ext2fs/i386-bitops.h> -#elif __ia64__ -#include <gnu/ext2fs/ia64-bitops.h> #else -#error Provide a bitops.h file, please! +#include <gnu/ext2fs/ext2_bitops.h> #endif #define in_range(b, first, len) ((b) >= (first) && (b) <= (first) + (len) - 1) diff --git a/sys/gnu/fs/ext2fs/ext2_linux_ialloc.c b/sys/gnu/fs/ext2fs/ext2_linux_ialloc.c index faa0ba9..926fe7c 100644 --- a/sys/gnu/fs/ext2fs/ext2_linux_ialloc.c +++ b/sys/gnu/fs/ext2fs/ext2_linux_ialloc.c @@ -48,10 +48,8 @@ #include <gnu/ext2fs/alpha-bitops.h> #elif __i386__ #include <gnu/ext2fs/i386-bitops.h> -#elif __ia64__ -#include <gnu/ext2fs/ia64-bitops.h> #else -#error please provide bit operation functions +#include <gnu/ext2fs/ext2_bitops.h> #endif /* this is supposed to mark a buffer dirty on ready for delayed writing |