[Pkg-openmpi-maintainers] Bug#489173: Support for mips/mipsel

Thiemo Seufer ths at networkno.de
Thu Jul 3 18:01:45 UTC 2008


Package: openmpi
Version: 1.2.7~rc2-1
Tags: patch
Severity: wishlist

I believe the appended patch is sufficient to add Linux/MIPS support
to openmpi (for both the mips and mipsel variants). That said, I wasn't
able to build and test it, due to some libtool-induced trouble:

- With just this patch, ./libtool gets triggered and falls over an
  undefined CDPATH variable:

[...]
Making all in asm
make[3]: Entering directory `/srv/ths/debian/openmpi/openmpi-1.2.7~rc2/opal/asm'
depbase=`echo asm.lo | sed 's|[^/]*$|.deps/&|;s|\.lo$||'`;\
	/bin/sh ../../libtool --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I../../opal/include -I../../orte/include -I../../ompi/include   -I../..    -DNDEBUG -Wall -g -O2 -finline-functions -fno-strict-aliasing -pthread -MT asm.lo -MD -MP -MF $depbase.Tpo -c -o asm.lo asm.c &&\
	mv -f $depbase.Tpo $depbase.Plo
../../libtool: line 463: CDPATH: command not found
../../libtool: line 1266: func_opt_split: command not found
libtool: Version mismatch error.  This is libtool 2.1a, but the
libtool: definition of this LT_INIT comes from an older release.
libtool: You should recreate aclocal.m4 with macros from libtool 2.1a
libtool: and run autoconf again.
make[3]: *** [asm.lo] Error 63
make[3]: Leaving directory `/srv/ths/debian/openmpi/openmpi-1.2.7~rc2/opal/asm'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/srv/ths/debian/openmpi/openmpi-1.2.7~rc2/opal'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/srv/ths/debian/openmpi/openmpi-1.2.7~rc2'
make: *** [build] Error 2
dpkg-buildpackage: failure: debian/rules build gave error exit status 2


- The native approach of re-libtoolizing broke down in opal/libltdl,
  which does some special libtool handling I couldn't figure out.


Thiemo


Index: openmpi-1.2.7~rc2/config/ompi_config_asm.m4
===================================================================
--- openmpi-1.2.7~rc2.orig/config/ompi_config_asm.m4	2007-12-06 20:20:58.000000000 +0000
+++ openmpi-1.2.7~rc2/config/ompi_config_asm.m4	2008-07-03 18:21:34.000000000 +0100
@@ -873,6 +873,18 @@
             OMPI_GCC_INLINE_ASSIGN='"bis [$]31,[$]31,%0" : "=&r"(ret)'
             ;;
 
+        mips64*-linux-*)
+            ompi_cv_asm_arch="MIPS"
+            OMPI_ASM_SUPPORT_64BIT=1
+            OMPI_GCC_INLINE_ASSIGN='"or %0,[$]0,[$]0" : "=&r"(ret)'
+            ;;
+
+        mips*-linux-*)
+            ompi_cv_asm_arch="MIPS"
+            OMPI_ASM_SUPPORT_64BIT=0
+            OMPI_GCC_INLINE_ASSIGN='"or %0,[$]0,[$]0" : "=&r"(ret)'
+            ;;
+
         mips-*|mips64-*)
             # Should really find some way to make sure that we are on
             # a MIPS III machine (r4000 and later)
Index: openmpi-1.2.7~rc2/debian/control
===================================================================
--- openmpi-1.2.7~rc2.orig/debian/control	2008-07-03 18:21:22.000000000 +0100
+++ openmpi-1.2.7~rc2/debian/control	2008-07-03 18:21:34.000000000 +0100
@@ -12,7 +12,7 @@
 XS-Dm-Upload-Allowed: yes
 
 Package: openmpi-bin
-Architecture: alpha amd64 i386 ia64 powerpc ppc64 sparc kfreebsd-i386 kfreebsd-amd64 hurd-i386
+Architecture: alpha amd64 i386 ia64 powerpc ppc64 sparc kfreebsd-i386 kfreebsd-amd64 hurd-i386 mips mipsel
 Depends: ${shlibs:Depends}, ${misc:Depends}, openmpi-common (= ${source:Version})
 Suggests: gfortran
 Description: high performance message passing library -- binaries
@@ -40,7 +40,7 @@
 
 Package: libopenmpi-dev
 Section: libdevel
-Architecture: alpha amd64 i386 ia64 powerpc ppc64 sparc kfreebsd-i386 kfreebsd-amd64 hurd-i386
+Architecture: alpha amd64 i386 ia64 powerpc ppc64 sparc kfreebsd-i386 kfreebsd-amd64 hurd-i386 mips mipsel
 Depends: ${shlibs:Depends}, libopenmpi1 (= ${binary:Version}), openmpi-common (= ${source:Version})
 Conflicts: libopal-dev, pgapack (<= 1.0.0.1-4.2), openmpi-dev
 Replaces: openmpi-dev, openmpi-bin (<= 1.2.4-0)
@@ -57,7 +57,7 @@
 
 Package: libopenmpi1
 Section: libs
-Architecture: alpha amd64 i386 ia64 powerpc ppc64 sparc kfreebsd-i386 kfreebsd-amd64 hurd-i386
+Architecture: alpha amd64 i386 ia64 powerpc ppc64 sparc kfreebsd-i386 kfreebsd-amd64 hurd-i386 mips mipsel
 Depends: ${shlibs:Depends}, ${misc:Depends}
 Conflicts: openmpi-libs0
 Replaces: openmpi-libs0
@@ -100,7 +100,7 @@
 
 Package: libopenmpi-dbg
 Section: devel
-Architecture: alpha amd64 i386 ia64 powerpc ppc64 sparc kfreebsd-i386 kfreebsd-amd64 hurd-i386
+Architecture: alpha amd64 i386 ia64 powerpc ppc64 sparc kfreebsd-i386 kfreebsd-amd64 hurd-i386 mips mipsel
 Depends: openmpi-bin (= ${binary:Version}), libopenmpi1 (= ${binary:Version})
 Conflicts: openmpi-dbg
 Replaces: openmpi-dbg
Index: openmpi-1.2.7~rc2/opal/asm/asm-data.txt
===================================================================
--- openmpi-1.2.7~rc2.orig/opal/asm/asm-data.txt	2006-11-09 18:53:28.000000000 +0000
+++ openmpi-1.2.7~rc2/opal/asm/asm-data.txt	2008-07-03 18:21:34.000000000 +0100
@@ -126,3 +126,7 @@
 # means that we can use the same code either way.  Woo hoo!
 
 MIPS	default-.text-.globl-:--L--1-1-1-1-0	mips-irix
+MIPS	default-.text-.globl-:--L- at -1-1-1-1-1	mips64-linux
+
+# However, this doesn't hold true for 32-bit MIPS as used on Linux.
+MIPS	default-.text-.globl-:--L- at -1-1-1-0-1	mips-linux
Index: openmpi-1.2.7~rc2/opal/include/opal/sys/mips/atomic.h
===================================================================
--- openmpi-1.2.7~rc2.orig/opal/include/opal/sys/mips/atomic.h	2006-08-15 21:13:38.000000000 +0100
+++ openmpi-1.2.7~rc2/opal/include/opal/sys/mips/atomic.h	2008-07-03 18:21:34.000000000 +0100
@@ -23,10 +23,17 @@
 #if OMPI_WANT_SMP_LOCKS
 
 /* BWB - FIX ME! */
+#ifdef __linux__
+#define MB() __asm__ __volatile__(".set mips2; sync; .set mips0": : :"memory")
+#define RMB() __asm__ __volatile__(".set mips2; sync; .set mips0": : :"memory")
+#define WMB() __asm__ __volatile__(".set mips2; sync; .set mips0": : :"memory")
+#define SMP_SYNC ".set mips2; sync; .set mips0"
+#else
 #define MB() __asm__ __volatile__("sync": : :"memory")
 #define RMB() __asm__ __volatile__("sync": : :"memory")
 #define WMB() __asm__ __volatile__("sync": : :"memory")
 #define SMP_SYNC "sync"
+#endif
 
 #else
 
@@ -46,8 +53,10 @@
 #define OPAL_HAVE_ATOMIC_MEM_BARRIER 1
 
 #define OPAL_HAVE_ATOMIC_CMPSET_32 1
-#define OPAL_HAVE_ATOMIC_CMPSET_64 1
 
+#ifdef __mips64
+#define OPAL_HAVE_ATOMIC_CMPSET_64 1
+#endif
 
 /**********************************************************************
  *
@@ -92,16 +101,23 @@
     int32_t tmp;
 
    __asm__ __volatile__ ("\t"
-                         ".set noreorder        \n"
-                         "1:                \n\t"
-                         "ll     %0, %2         \n\t" /* load *addr into ret */
-                         "bne    %0, %3, 2f   \n\t" /* done if oldval != ret */
-                         "or     %5, %4, 0      \n\t" /* ret = newval */
-                         "sc     %5, %2         \n\t" /* store ret in *addr */
+                         ".set noreorder     \n"
+                         "1:                 \n\t"
+#ifdef __linux__
+                         ".set mips2         \n\t"
+#endif
+                         "ll     %0, %2      \n\t" /* load *addr into ret */
+                         "bne    %0, %3, 2f  \n\t" /* done if oldval != ret */
+                         "or     %5, %4, 0   \n\t" /* ret = newval */
+                         "sc     %5, %2      \n\t" /* store ret in *addr */
+#ifdef __linux__
+                         ".set mips0         \n\t"
+#endif
                          /* note: ret will be 0 if failed, 1 if succeeded */
 			 "bne    %5, 1, 1b   \n\t"
+			 "nop                \n"
                          "2:                 \n\t"
-                         ".set reorder          \n"
+                         ".set reorder       \n"
                          : "=&r"(ret), "=m"(*addr)
                          : "m"(*addr), "r"(oldval), "r"(newval), "r"(tmp)
                          : "cc", "memory");
@@ -133,7 +149,7 @@
     return opal_atomic_cmpset_32(addr, oldval, newval);
 }
 
-
+#ifdef OPAL_HAVE_ATOMIC_CMPSET_64
 static inline int opal_atomic_cmpset_64(volatile int64_t *addr,
                                         int64_t oldval, int64_t newval)
 {
@@ -141,16 +157,17 @@
     int64_t tmp;
 
    __asm__ __volatile__ ("\t"
-                         ".set noreorder        \n"
-                         "1:                \n\t"
-                         "lld    %0, %2         \n\t" /* load *addr into ret */
-                         "bne    %0, %3, 2f   \n\t" /* done if oldval != ret */
-                         "or     %5, %4, 0      \n\t" /* tmp = newval */
-                         "scd    %5, %2         \n\t" /* store tmp in *addr */
+                         ".set noreorder     \n"
+                         "1:                 \n\t"
+                         "lld    %0, %2      \n\t" /* load *addr into ret */
+                         "bne    %0, %3, 2f  \n\t" /* done if oldval != ret */
+                         "or     %5, %4, 0   \n\t" /* tmp = newval */
+                         "scd    %5, %2      \n\t" /* store tmp in *addr */
                          /* note: ret will be 0 if failed, 1 if succeeded */
-			 "bne    %5, 1, 1b   \n"
+			 "bne    %5, 1, 1b   \n\t"
+			 "nop                \n"
                          "2:                 \n\t"
-                         ".set reorder          \n"
+                         ".set reorder       \n"
                          : "=&r" (ret), "=m" (*addr)
                          : "m" (*addr), "r" (oldval), "r" (newval),
 			   "r"(tmp)
@@ -183,6 +200,7 @@
     opal_atomic_wmb();
     return opal_atomic_cmpset_64(addr, oldval, newval);
 }
+#endif /* OPAL_HAVE_ATOMIC_CMPSET_64 */
 
 #endif /* OMPI_GCC_INLINE_ASSEMBLY */
 
Index: openmpi-1.2.7~rc2/opal/asm/base/MIPS.asm
===================================================================
--- openmpi-1.2.7~rc2.orig/opal/asm/base/MIPS.asm	2006-08-15 21:13:33.000000000 +0100
+++ openmpi-1.2.7~rc2/opal/asm/base/MIPS.asm	2008-07-03 18:21:34.000000000 +0100
@@ -1,26 +1,48 @@
 START_FILE
 
+#ifdef __linux__
+#include <sys/asm.h>
+#else
 #include <asm.h>
+#endif
 #include <regdef.h>
 	
 	TEXT
 
 	ALIGN(8)
 LEAF(opal_atomic_mb)
-	sync
+#ifdef __linux__
+	.set mips2
+#endif
+	sync
+#ifdef __linux__
+	.set mips0
+#endif
 	j	ra
 END(opal_atomic_mb)
 
 	
 	ALIGN(8)
 LEAF(opal_atomic_rmb)
-	sync
+#ifdef __linux__
+	.set mips2
+#endif
+	sync
+#ifdef __linux__
+	.set mips0
+#endif
 	j	ra
 END(opal_atomic_rmb)
 	
 	
 LEAF(opal_atomic_wmb)
-	sync
+#ifdef __linux__
+	.set mips2
+#endif
+	sync
+#ifdef __linux__
+	.set mips0
+#endif
 	j	ra
 END(opal_atomic_wmb)
 
@@ -28,10 +50,22 @@
 LEAF(opal_atomic_cmpset_32)
 	.set noreorder        
 retry1:                
+#ifdef __linux__
+	.set mips2
+#endif
 	ll     $3, 0($4)         
+#ifdef __linux__
+	.set mips0
+#endif
 	bne    $3, $5, done1   
 	or     $2, $6, 0      
+#ifdef __linux__
+	.set mips2
+#endif
 	sc     $2, 0($4)         
+#ifdef __linux__
+	.set mips0
+#endif
 	bne    $2, 1, retry1
 done1:                 
 	.set reorder          
@@ -45,13 +79,31 @@
 LEAF(opal_atomic_cmpset_acq_32)
 	.set noreorder        
 retry2:                
+#ifdef __linux__
+	.set mips2
+#endif
 	ll     $3, 0($4)         
+#ifdef __linux__
+	.set mips0
+#endif
 	bne    $3, $5, done2   
 	or     $2, $6, 0      
+#ifdef __linux__
+	.set mips2
+#endif
 	sc     $2, 0($4)         
+#ifdef __linux__
+	.set mips0
+#endif
 	bne    $2, 1, retry2   
 done2:                 
-	sync
+#ifdef __linux__
+	.set mips2
+#endif
+	sync
+#ifdef __linux__
+	.set mips0
+#endif
 	.set reorder          
 
 	xor	$3,$3,$5
@@ -62,12 +114,30 @@
 	
 LEAF(opal_atomic_cmpset_rel_32)
 	.set noreorder        
-	sync
+#ifdef __linux__
+	.set mips2
+#endif
+	sync
+#ifdef __linux__
+	.set mips0
+#endif
 retry3:                
+#ifdef __linux__
+	.set mips2
+#endif
 	ll     $3, 0($4)         
+#ifdef __linux__
+	.set mips0
+#endif
 	bne    $3, $5, done3   
 	or     $2, $6, 0      
+#ifdef __linux__
+	.set mips2
+#endif
 	sc     $2, 0($4)         
+#ifdef __linux__
+	.set mips0
+#endif
 	bne    $2, 1, retry3   
 done3:                 
 	.set reorder          
@@ -76,8 +146,8 @@
 	j	ra
 	sltu	$2,$3,1
 END(opal_atomic_cmpset_rel_32)
-	
-	
+
+#ifdef __mips64
 LEAF(opal_atomic_cmpset_64)
 		.set noreorder        
 retry4:                
@@ -128,3 +198,4 @@
 	j	ra
 	sltu	$3,$4,1
 END(opal_atomic_cmpset_rel_64)
+#endif /* __mips64 */
Index: openmpi-1.2.7~rc2/debian/rules
===================================================================
--- openmpi-1.2.7~rc2.orig/debian/rules	2008-07-03 18:21:22.000000000 +0100
+++ openmpi-1.2.7~rc2/debian/rules	2008-07-03 18:21:34.000000000 +0100
@@ -28,7 +28,7 @@
 
 config.status: #patch-stamp
 	dh_testdir
-	CFLAGS="$(CFLAGS)" ./configure 				\
+	CFLAGS="$(CFLAGS)" CCASFLAGS="-xassembler-with-cpp" ./configure \
 			$(CROSS)				\
 			--prefix=/usr 				\
 			--mandir=\$${prefix}/share/man 		\






More information about the Pkg-openmpi-maintainers mailing list