[Ocfs2-tools-commits] manish commits r860 - trunk/libocfs2

svn-commits at oss.oracle.com svn-commits at oss.oracle.com
Thu Apr 28 16:51:44 CDT 2005


Author: manish
Date: 2005-04-28 16:51:43 -0500 (Thu, 28 Apr 2005)
New Revision: 860

Modified:
   trunk/libocfs2/bitops.c
Log:
Implement bitops ugliness for s390 as well


Modified: trunk/libocfs2/bitops.c
===================================================================
--- trunk/libocfs2/bitops.c	2005-04-28 21:02:16 UTC (rev 859)
+++ trunk/libocfs2/bitops.c	2005-04-28 21:51:43 UTC (rev 860)
@@ -31,6 +31,12 @@
 
 #include "bitops.h"
 
+/*
+ * XXX: We're not endian safe at all, and have just hacked in big endian
+ * bitops for the arches we want to test on (ppc32 and s390x userland).
+ * Post-1.0, we have to revisit this.
+ */
+
 #ifndef _OCFS2_HAVE_ASM_BITOPS_
 
 /*
@@ -43,7 +49,7 @@
  * systems, as well as non-32 bit systems.
  */
 
-#ifdef __powerpc__
+#if defined(__powerpc__)
 int ocfs2_set_bit(int nr,void * addr)
 {
 	unsigned long mask = 1 << (nr & 0x1f);
@@ -53,6 +59,16 @@
 	*p = old | mask;
 	return (old & mask) != 0;
 }
+#elif defined(__s390x__)
+int ocfs2_set_bit(int nr,void * addr)
+{
+	unsigned long mask = 1UL << (nr & 0x3f);
+	unsigned long *p = ((unsigned long *)addr) + (nr >> 6);
+	unsigned long old = *p;
+
+	*p = old | mask;
+	return (old & mask) != 0;
+}
 #else
 int ocfs2_set_bit(int nr,void * addr)
 {
@@ -67,7 +83,7 @@
 }
 #endif
 
-#ifdef __powerpc__
+#if defined(__powerpc__)
 int ocfs2_clear_bit(int nr, void * addr)
 {
 	unsigned long mask = 1 << (nr & 0x1f);
@@ -77,6 +93,16 @@
 	*p = old & ~mask;
 	return (old & mask) != 0;
 }
+#elif defined(__s390x__)
+int ocfs2_clear_bit(int nr, void * addr)
+{
+	unsigned long mask = 1UL << (nr & 0x3f);
+	unsigned long *p = ((unsigned long *)addr) + (nr >> 6);
+	unsigned long old = *p;
+
+	*p = old & ~mask;
+	return (old & mask) != 0;
+}
 #else
 int ocfs2_clear_bit(int nr, void * addr)
 {
@@ -91,13 +117,20 @@
 }
 #endif
 
-#ifdef __powerpc__
+#if defined(__powerpc__)
 int ocfs2_test_bit(int nr, const void * addr)
 {
 	const unsigned int *p = (const unsigned int *) addr;
 
 	return ((p[nr >> 5] >> (nr & 0x1f)) & 1) != 0;
 }
+#elif defined(__s390x__)
+int ocfs2_test_bit(int nr, const void * addr)
+{
+	const unsigned long *p = (const unsigned long *) addr;
+
+	return ((p[nr >> 6] >> (nr & 0x3f)) & 1UL) != 0;
+}
 #else
 int ocfs2_test_bit(int nr, const void * addr)
 {
@@ -115,7 +148,7 @@
 #if !defined(_OCFS2_HAVE_ASM_FINDBIT_)
 #include <strings.h>
 
-#ifdef __powerpc__
+#if defined(__powerpc__)
 static inline int __ilog2(unsigned long x)
 {
         int lz;
@@ -123,20 +156,97 @@
         asm ("cntlzw %0,%1" : "=r" (lz) : "r" (x));
         return 31 - lz;
 }
-                                                                                                                                                         
+
 static inline int ffz(unsigned int x)
 {
         if ((x = ~x) == 0)
                 return 32;
         return __ilog2(x & -x);
 }
-                                                                                                                                                         
+
 static inline int __ffs(unsigned long x)
 {
-        return __ilog2(x & -x);
+	return __ilog2(x & -x);
 }
-#endif	/* __powerpc__ */
+#elif defined(__s390x__)
 
+static const char const _zb_findmap[] = {
+	0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,
+	0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,
+	0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,
+	0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,
+	0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,
+	0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,
+	0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,
+	0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,
+	0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,
+	0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,
+	0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,
+	0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,
+	0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,
+	0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,
+	0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,
+	0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,8
+};
+
+static const char const _sb_findmap[] = {
+	8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
+	4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
+	5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
+	4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
+	6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
+	4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
+	5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
+	4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
+	7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
+	4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
+	5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
+	4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
+	6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
+	4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
+	5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
+	4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0
+};
+
+static inline int ffz(unsigned long word)
+{
+	int bit = 0;
+
+	if ((word & 0xffffffff) == 0xffffffff) {
+		word >>= 32;
+		bit += 32;
+	}
+	if ((word & 0xffff) == 0xffff) {
+		word >>= 16;
+		bit += 16;
+	}
+	if ((word & 0xff) == 0xff) {
+		word >>= 8;
+		bit += 8;
+	}
+	return bit + _zb_findmap[word & 0xff];
+}
+
+static inline int __ffs(unsigned long word)
+{
+	int bit = 0;
+
+	if ((word & 0xffffffff) == 0) {
+		word >>= 32;
+		bit += 32;
+	}
+	if ((word & 0xffff) == 0) {
+		word >>= 16;
+		bit += 16;
+	}
+	if ((word & 0xff) == 0) {
+		word >>= 8;
+		bit += 8;
+	}
+	return bit + _sb_findmap[word & 0xff];
+}
+#endif
+
 int ocfs2_find_first_bit_set(void *addr, int size)
 {
 	return ocfs2_find_next_bit_set(addr, size, 0);
@@ -147,7 +257,7 @@
 	return ocfs2_find_next_bit_clear(addr, size, 0);
 }
 
-#ifdef __powerpc__
+#if defined(__powerpc__)
 int ocfs2_find_next_bit_set(void *addr, int size, int offset)
 {
 	unsigned int *p = ((unsigned int *) addr) + (offset >> 5);
@@ -185,6 +295,44 @@
 found_middle:
 	return result + __ffs(tmp);
 }
+#elif defined(__s390x__)
+int ocfs2_find_next_bit_set(void *addr, int size, int offset)
+{
+	unsigned long *p = ((unsigned long *) addr) + (offset >> 6);
+	unsigned long result = offset & ~63UL;
+	unsigned long tmp;
+
+	if (offset >= size)
+		return size;
+	size -= result;
+	offset &= 63UL;
+	if (offset) {
+		tmp = *p++;
+		tmp &= ~0UL << offset;
+		if (size < 64)
+			goto found_first;
+		if (tmp)
+			goto found_middle;
+		size -= 64;
+		result += 64;
+	}
+	while (size & ~63UL) {
+		if ((tmp = *p++) != 0)
+			goto found_middle;
+		result += 64;
+		size -= 64;
+	}
+	if (!size)
+		return result;
+	tmp = *p;
+
+found_first:
+	tmp &= ~0UL >> (64 - size);
+	if (tmp == 0UL)        /* Are any bits set? */
+		return result + size; /* Nope. */
+found_middle:
+	return result + __ffs(tmp);
+}
 #else
 int ocfs2_find_next_bit_set(void *addr, int size, int offset)
 {
@@ -223,9 +371,9 @@
 
 	return (res + d0 - 1);
 }
-#endif	/* __powerpc__ */
+#endif
 
-#ifdef __powerpc__
+#if defined(__powerpc__)
 int ocfs2_find_next_bit_clear(void *addr, int size, int offset)
 {
 	unsigned int * p = ((unsigned int *) addr) + (offset >> 5);
@@ -262,6 +410,43 @@
 found_middle:
 	return result + ffz(tmp);
 }
+#elif defined(__s390x__)
+int ocfs2_find_next_bit_clear(void *addr, int size, int offset)
+{
+	unsigned long * p = ((unsigned long *) addr) + (offset >> 6);
+	unsigned long result = offset & ~63UL;
+	unsigned long tmp;
+
+	if (offset >= size)
+		return size;
+	size -= result;
+	offset &= 63UL;
+	if (offset) {
+		tmp = *p++;
+		tmp |= ~0UL >> (64-offset);
+		if (size < 64)
+			goto found_first;
+		if (~tmp)
+			goto found_middle;
+		size -= 64;
+		result += 64;
+	}
+	while (size & ~63UL) {
+		if (~(tmp = *p++))
+			goto found_middle;
+		result += 64;
+		size -= 64;
+	}
+	if (!size)
+		return result;
+	tmp = *p;
+found_first:
+	tmp |= ~0UL << size;
+	if (tmp == ~0UL)        /* Are any bits zero? */
+		return result + size; /* Nope. */
+found_middle:
+	return result + ffz(tmp);
+}
 #else
 int ocfs2_find_next_bit_clear(void *addr, int size, int offset)
 {
@@ -299,7 +484,7 @@
 
 	return (res + d0 - 1);
 }
-#endif	/* __powerpc__ */
+#endif
 
 #endif	
 



More information about the Ocfs2-tools-commits mailing list