Package: openmpi
Version: 1.6.5-5
Tags: patch
Severity: important

Hello,


I have attached patches that enable building of package openmpi_1.6.5-5 
on following architectures: mips, mipsel, mips64, mips64el.

First, these architectures have to be supported, added to debian/control file.
File debian/control is patched with the following patch:

diff -upNr openmpi-1.6.5-orig/debian/control openmpi-1.6.5/debian/control
--- openmpi-1.6.5-orig/debian/control   2013-08-28 06:52:24.000000000 +0000
+++ openmpi-1.6.5/debian/control        2013-12-11 16:38:26.000000000 +0000
@@ -16,7 +16,7 @@ Vcs-Svn: svn://svn.debian.org/svn/pkg-op
 Vcs-Browser: http://svn.debian.org/wsvn/pkg-openmpi/openmpi/trunk/

 Package: openmpi-bin
-Architecture: alpha amd64 armel armhf i386 ia64 powerpc powerpcspe ppc64 sparc 
sparc64 kfreebsd-i386 kfreebsd-amd64 hurd-i386
+Architecture: alpha amd64 armel armhf i386 ia64 powerpc powerpcspe ppc64 sparc 
sparc64 kfreebsd-i386 kfreebsd-amd64 hurd-i386 mips mipsel mips64 mips64el
 Depends: ${shlibs:Depends}, ${misc:Depends}, openmpi-common (= 
${source:Version})
 Conflicts: openmpi-bin
 Suggests: gfortran, openmpi-checkpoint [amd64 armel armhf i386 powerpc]
@@ -45,7 +45,7 @@ Description: high performance message pa

 Package: libopenmpi-dev
 Section: libdevel
-Architecture: alpha amd64 armel armhf i386 ia64 powerpc powerpcspe ppc64 sparc 
sparc64 kfreebsd-i386 kfreebsd-amd64 hurd-i386
+Architecture: alpha amd64 armel armhf i386 ia64 powerpc powerpcspe ppc64 sparc 
sparc64 kfreebsd-i386 kfreebsd-amd64 hurd-i386 mips mipsel mips64 mips64el
 Depends: ${shlibs:Depends}, ${misc:Depends}, libopenmpi1.6 (= 
${binary:Version}), openmpi-common (= ${source:Version}), libibverbs-dev 
[!kfreebsd-i386 !kfreebsd-amd64 !hurd-i386], libhwloc-dev
 Conflicts: openmpi-dev, libopenmpi-dev, openmpi-bin (<= 1.2.4-0)
 Description: high performance message passing library -- header files
@@ -60,7 +60,7 @@ Description: high performance message pa

 Package: libopenmpi1.6
 Section: libs
-Architecture: alpha amd64 armel armhf i386 ia64 powerpc powerpcspe ppc64 sparc 
sparc64 kfreebsd-i386 kfreebsd-amd64 hurd-i386
+Architecture: alpha amd64 armel armhf i386 ia64 powerpc powerpcspe ppc64 sparc 
sparc64 kfreebsd-i386 kfreebsd-amd64 hurd-i386 mips mipsel mips64 mips64el
 Depends: ${shlibs:Depends}, ${misc:Depends}
 Conflicts: openmpi-libs0, libopenmpi1, libopenmpi1.3, libopenmpi2
 Description: high performance message passing library -- shared library
@@ -104,7 +104,7 @@ Description: high performance message pa

 Package: libopenmpi1.6-dbg
 Section: debug
-Architecture: alpha amd64 armel armhf i386 ia64 powerpc powerpcspe ppc64 sparc 
sparc64 kfreebsd-i386 kfreebsd-amd64 hurd-i386
+Architecture: alpha amd64 armel armhf i386 ia64 powerpc powerpcspe ppc64 sparc 
sparc64 kfreebsd-i386 kfreebsd-amd64 hurd-i386 mips mipsel mips64 mips64el
 Depends: ${misc:Depends}, openmpi-bin (= ${binary:Version}), libopenmpi1.6 (= 
${binary:Version})
 Conflicts: openmpi-dbg, libopenmpi-dbg
 Description: high performance message passing library -- debug library




Next, there are 3 patches (in attachment):
mips-support-upstream-1.7.3.diff             - patches MIPS.asm and 
mips/atomic.h files to a latest 1.7.3 version of source
mips-support-fix.diff                                 - resolve issue of 
misinterpretation of assembler code from MIPS.asm  and fix mips64(el) assembler 
code.                        
mips-detection.diff                                    - support detection of 
mips, mipsel, mips64, mips64el architectures

Package openmpi for mips, mipsel, mips64 and mips64el is successfully built 
after applying these patches.


Misinterpretation of assembler code from MIPS.asm explained:

this is part of code from original MIPS.asm source file:
< LEAF(opal_atomic_cmpset_32)
<         .set noreorder
< retry1:
<         ll     $3, 0($4)
<         bne    $3, $5, done1
<         or     $2, $6, 0
<         sc     $2, 0($4)
<         beqz   $2, retry1
< done1:
<         .set reorder
< 
<         xor     $3,$3,$5
<         j       ra
<         sltu    $2,$3,1
< END(opal_atomic_cmpset_32)

this is a part of code from a patched MIPS.asm source file:
< LEAF(opal_atomic_cmpset_32)
<         .set noreorder
< retry1:
<         ll     $3, 0($4)
<         bne    $3, $5, done1
<         or     $2, $6, 0
<         sc     $2, 0($4)
<         beqz   $2, retry1
< done1:
<         .set reorder
< 
<         xor     $3,$3,$5
<         j       ra
<         sltu    $2,$3,1
<         .set reorder
< END(opal_atomic_cmpset_32)

without a patch, resulting code is:
< Dump of assembler code for function opal_atomic_cmpset_32:
<    0x00400ce8 <+0>:     ll      v1,0(a0)
<    0x00400cec <+4>:     bne     v1,a1,0x400cfc <done1>
<    0x00400cf0 <+8>:     ori     v0,a2,0x0
<    0x00400cf4 <+12>:    sc      v0,0(a0)
<    0x00400cf8 <+16>:    beqz    v0,0x400ce8 <opal_atomic_cmpset_32>
<    0x00400cfc <+0>:     xor     v1,v1,a1
< => 0x00400d00 <+4>:     jr      ra
<    0x00400d04 <+8>:     move    at,at
<    0x00400d08 <+12>:    sltiu   v0,v1,1
< End of assembler dump.

with a patch, resulting code is:
< Dump of assembler code for function opal_atomic_cmpset_32:
<    0x00400ce8 <+0>:     ll      v1,0(a0)
<    0x00400cec <+4>:     bne     v1,a1,0x400cfc <done1>
<    0x00400cf0 <+8>:     ori     v0,a2,0x0
<    0x00400cf4 <+12>:    sc      v0,0(a0)
<    0x00400cf8 <+16>:    beqz    v0,0x400ce8 <opal_atomic_cmpset_32>
<    0x00400cfc <+0>:     xor     v1,v1,a1
< => 0x00400d00 <+4>:     jr      ra
<    0x00400d04 <+8>:     sltiu   v0,v1,1
< End of assembler dump.

Note the lines 0x00400d00 and 0x00400d04.
Without a patch line  "sltiu   v0,v1,1"     is never executed 
because after a line  "jr      ra"
instruction                  "move    at,at"     is inserted in a delay slot of 
a "jr" instruction. 


We would be happy to provide more information if needed.


Thanks!
Jurica
Description: Patches MIPS.asm and mips/atomic.h files to a 1.7.3 version of source
Author: Jurica Stanojkovic <[email protected]>

--- openmpi-1.6.5.orig/opal/asm/base/MIPS.asm
+++ openmpi-1.6.5/opal/asm/base/MIPS.asm
@@ -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 @@ END(opal_atomic_wmb)
 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
 	beqz   $2, retry1
 done1:                 
 	.set reorder          
@@ -45,13 +79,31 @@ END(opal_atomic_cmpset_32)
 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
 	beqz   $2, retry2   
 done2:                 
-	sync
+#ifdef __linux__
+	.set mips2
+#endif
+	sync
+#ifdef __linux__
+	.set mips0
+#endif
 	.set reorder          
 
 	xor	$3,$3,$5
@@ -62,12 +114,30 @@ END(opal_atomic_cmpset_acq_32)
 	
 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
 	beqz   $2, retry3   
 done3:                 
 	.set reorder          
@@ -77,7 +147,7 @@ done3:
 	sltu	$2,$3,1
 END(opal_atomic_cmpset_rel_32)
 	
-	
+#ifdef __mips64	
 LEAF(opal_atomic_cmpset_64)
 		.set noreorder        
 retry4:                
@@ -128,3 +198,4 @@ done6:
 	j	ra
 	sltu	$3,$4,1
 END(opal_atomic_cmpset_rel_64)
+#endif /* __mips64 */
--- openmpi-1.6.5.orig/opal/include/opal/sys/mips/atomic.h
+++ openmpi-1.6.5/opal/include/opal/sys/mips/atomic.h
@@ -23,10 +23,17 @@
 #if OPAL_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
 
 /**********************************************************************
  *
@@ -93,10 +102,16 @@ static inline int opal_atomic_cmpset_32(
    __asm__ __volatile__ (".set noreorder        \n"
                          ".set noat             \n"
                          "1:                    \n"
+#ifdef __linux__
+                         ".set mips2         \n\t"
+#endif
                          "ll     %0, %2         \n" /* load *addr into ret */
                          "bne    %0, %z3, 2f    \n" /* done if oldval != ret */
                          "or     $1, %z4, 0     \n" /* tmp = newval (delay slot) */
                          "sc     $1, %2         \n" /* store tmp in *addr */
+#ifdef __linux__
+                         ".set mips0         \n\t"
+#endif
                          /* note: ret will be 0 if failed, 1 if succeeded */
                          "beqz   $1, 1b         \n" /* if 0 jump back to 1b */
 			 "nop                   \n" /* fill delay slots */
@@ -133,7 +148,7 @@ static inline int opal_atomic_cmpset_rel
     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)
 {
@@ -182,6 +197,7 @@ static inline int opal_atomic_cmpset_rel
     opal_atomic_wmb();
     return opal_atomic_cmpset_64(addr, oldval, newval);
 }
+#endif /* OPAL_HAVE_ATOMIC_CMPSET_64 */
 
 #endif /* OMPI_GCC_INLINE_ASSEMBLY */
 
Description:  Patch resolve issue of misinterpretation of assembler code from MIPS.asm
 and fix mips64(el) assembler code.
Author: Jurica Stanojkovic <[email protected]>

--- openmpi-1.6.5.orig/opal/asm/base/MIPS.asm
+++ openmpi-1.6.5/opal/asm/base/MIPS.asm
@@ -68,11 +68,11 @@ retry1:
 #endif
 	beqz   $2, retry1
 done1:                 
-	.set reorder          
 
 	xor	$3,$3,$5
 	j	ra
 	sltu	$2,$3,1
+        .set reorder
 END(opal_atomic_cmpset_32)
 
 
@@ -104,11 +104,11 @@ done2:
 #ifdef __linux__
 	.set mips0
 #endif
-	.set reorder          
 
 	xor	$3,$3,$5
 	j	ra
 	sltu	$2,$3,1
+	.set reorder
 END(opal_atomic_cmpset_acq_32)
 
 	
@@ -140,16 +140,16 @@ retry3:
 #endif
 	beqz   $2, retry3   
 done3:                 
-	.set reorder          
 
 	xor	$3,$3,$5
 	j	ra
 	sltu	$2,$3,1
+	.set reorder
 END(opal_atomic_cmpset_rel_32)
 	
 #ifdef __mips64	
 LEAF(opal_atomic_cmpset_64)
-		.set noreorder        
+	.set noreorder        
 retry4:                
 	lld    $3, 0($4)         
 	bne    $3, $5, done4   
@@ -157,11 +157,11 @@ retry4:
 	scd    $2, 0($4)         
 	beqz   $2, retry4   
 done4:                 
-	.set reorder          
 
-	xor	$4,$3,$5
+	xor	$3,$3,$5
 	j	ra
-	sltu	$3,$4,1
+	sltu	$2,$3,1
+	.set reorder
 END(opal_atomic_cmpset_64)
 
 
@@ -174,11 +174,11 @@ retry5:
 	scd    $2, 0($4)         
 	beqz   $2, retry5   
 done5:                 
-	.set reorder          
 	sync
-	xor	$4,$3,$5
+	xor	$3,$3,$5
 	j	ra
-	sltu	$3,$4,1
+	sltu	$2,$3,1
+	.set reorder
 END(opal_atomic_cmpset_acq_64)
 
 
@@ -192,10 +192,10 @@ retry6:
 	scd    $2, 0($4)         
 	beqz   $2, retry6   
 done6:                 
-	.set reorder          
 
-	xor	$4,$3,$5
+	xor	$3,$3,$5
 	j	ra
-	sltu	$3,$4,1
+	sltu	$2,$3,1
+	.set reorder
 END(opal_atomic_cmpset_rel_64)
 #endif /* __mips64 */
Description: Support detection of mips, mipsel, mips64, mips64el architectures
Author: Jurica Stanojkovic <[email protected]>

--- openmpi-1.6.5.orig/configure
+++ openmpi-1.6.5/configure
@@ -27231,8 +27231,13 @@ _ACEOF
             OMPI_GCC_INLINE_ASSIGN='"mov %0, #0" : "=&r"(ret)'
             ;;
 
-        mips-*|mips64*)
-            # Should really find some way to make sure that we are on
+        mips-*|mipsel-*)
+            ompi_cv_asm_arch="MIPS"
+            OPAL_ASM_SUPPORT_64BIT=0
+            OMPI_GCC_INLINE_ASSIGN='"or %0,$0,$0" : "=&r"(ret)'
+            ;;
+	
+	mips64-*|mips64el-*)
             # a MIPS III machine (r4000 and later)
             ompi_cv_asm_arch="MIPS"
             OPAL_ASM_SUPPORT_64BIT=1
--- openmpi-1.6.5.orig/opal/config/opal_config_asm.m4
+++ openmpi-1.6.5/opal/config/opal_config_asm.m4
@@ -930,8 +930,13 @@ AC_DEFUN([OMPI_CONFIG_ASM],[
             OMPI_GCC_INLINE_ASSIGN='"mov %0, #0" : "=&r"(ret)'
             ;;
 
-        mips-*|mips64*)
-            # Should really find some way to make sure that we are on
+        mips-*|mipsel-*)
+            ompi_cv_asm_arch="MIPS"
+            OPAL_ASM_SUPPORT_64BIT=0
+            OMPI_GCC_INLINE_ASSIGN='"or %0,[$]0,[$]0" : "=&r"(ret)'
+            ;;
+	
+	mips64-*|mips64el-*)
             # a MIPS III machine (r4000 and later)
             ompi_cv_asm_arch="MIPS"
             OPAL_ASM_SUPPORT_64BIT=1

Reply via email to