http://caml.inria.fr/mantis/view.php?id=4849

diff -bur ocaml-3.11.1/asmcomp/mips/arch.ml my_ocaml/asmcomp/mips/arch.ml
--- asmcomp/mips/arch.ml	2002-11-29 16:03:36.000000000 +0100
+++ asmcomp/mips/arch.ml	2009-08-09 23:18:31.000000000 +0200
@@ -35,7 +35,7 @@
 
 let big_endian =
   match Config.system with
-    "ultrix" -> false
+    "ultrix" | "gnu" -> false
   | "irix" -> true
   | _ -> fatal_error "Arch_mips.big_endian"
 
diff -bur ocaml-3.11.1/asmcomp/mips/emit.mlp my_ocaml/asmcomp/mips/emit.mlp
--- asmcomp/mips/emit.mlp	2004-01-05 21:25:56.000000000 +0100
+++ asmcomp/mips/emit.mlp	2009-08-23 12:11:58.000000000 +0200
@@ -58,7 +58,7 @@
     !stack_offset +
     4 * num_stack_slots.(0) + 8 * num_stack_slots.(1) +
     (if !contains_calls then if !uses_gp then 8 else 4 else 0) in
-  Misc.align size 16
+  Misc.align size 16	(* n32 require quadword alignment *)
 
 let slot_offset loc cl =
   match loc with
@@ -252,7 +252,7 @@
     | Lop(Icall_ind) ->
         `	move	$25, {emit_reg i.arg.(0)}\n`;
         liveregs i live_25;
-        `	jal	{emit_reg i.arg.(0)}\n`;
+        `	jal	$25\n`; (* {emit_reg i.arg.(0)}\n; Equivalent but avoids "Warning: MIPS PIC call to register other than $25" on GNU as *)
         `{record_frame i.live}\n`
     | Lop(Icall_imm s) ->
         liveregs i 0;
@@ -269,7 +269,7 @@
         liveregs i 0;
         `	move	$25, {emit_reg i.arg.(0)}\n`;
         liveregs i live_25;
-        `	j	{emit_reg i.arg.(0)}\n`
+        `	j	$25\n`
     | Lop(Itailcall_imm s) ->
         if s = !function_name then begin
           `	b	{emit_label !tailrec_entry_point}\n`
@@ -277,11 +277,11 @@
           let n = frame_size() in
           if !contains_calls then
             `	lw	$31, {emit_int(n - 4)}($sp)\n`;
+          `	la	$25, {emit_symbol s}\n`;	(* Rxd: put before gp restore *)
           if !uses_gp then
             `	lw	$gp, {emit_int(n - 8)}($sp)\n`;
           if n > 0 then
             `	addu	$sp, $sp, {emit_int n}\n`;
-          `	la	$25, {emit_symbol s}\n`;
           liveregs i live_25;
           `	j	$25\n`
         end
@@ -305,8 +305,13 @@
         begin match chunk with
           Double_u ->
             (* Destination is not 8-aligned, hence cannot use l.d *)
+            if big_endian then begin
             `	ldl	$24, {emit_addressing addr i.arg 0}\n`;
-            `	ldr	$24, {emit_addressing (offset_addressing addr 7) i.arg 0}\n`;
+              `	ldr	$24, {emit_addressing (offset_addressing addr 7) i.arg 0}\n`
+            end else begin
+              `	ldl	$24, {emit_addressing (offset_addressing addr 7) i.arg 0}\n`;
+              `	ldr	$24, {emit_addressing addr i.arg 0}\n`
+            end;
             `	dmtc1	$24, {emit_reg dest}\n`
         | Single ->
             `	l.s	{emit_reg dest}, {emit_addressing addr i.arg 0}\n`;
@@ -328,8 +333,13 @@
           Double_u ->
             (* Destination is not 8-aligned, hence cannot use l.d *)
             `	dmfc1	$24, {emit_reg src}\n`;
+            if big_endian then begin
             `	sdl	$24, {emit_addressing addr i.arg 1}\n`;
             `	sdr	$24, {emit_addressing (offset_addressing addr 7) i.arg 1}\n`
+            end else begin
+              `	sdl	$24, {emit_addressing (offset_addressing addr 7) i.arg 1}\n`;
+              `	sdr	$24, {emit_addressing addr i.arg 1}\n`
+            end
         | Single ->
             `	cvt.s.d	$f31, {emit_reg src}\n`;
             `	s.s	$f31, {emit_addressing addr i.arg 1}\n`
@@ -552,6 +562,7 @@
   (* There are really two groups of registers:
       $sp and $30 always point to stack locations
       $2 - $21 never point to stack locations. *)
+  if Config.system = "irix" then begin
   `	.noalias $2,$sp;  .noalias $2,$30;  .noalias $3,$sp;  .noalias $3,$30\n`;
   `	.noalias $4,$sp;  .noalias $4,$30;  .noalias $5,$sp;  .noalias $5,$30\n`;
   `	.noalias $6,$sp;  .noalias $6,$30;  .noalias $7,$sp;  .noalias $7,$30\n`;
@@ -561,7 +572,8 @@
   `	.noalias $14,$sp; .noalias $14,$30; .noalias $15,$sp; .noalias $15,$30\n`;
   `	.noalias $16,$sp; .noalias $16,$30; .noalias $17,$sp; .noalias $17,$30\n`;
   `	.noalias $18,$sp; .noalias $18,$30; .noalias $19,$sp; .noalias $19,$30\n`;
-  `	.noalias $20,$sp; .noalias $20,$30; .noalias $21,$sp; .noalias $21,$30\n\n`;
+    `	.noalias $20,$sp; .noalias $20,$30; .noalias $21,$sp; .noalias $21,$30\n\n`
+  end;
   let lbl_begin = Compilenv.make_symbol (Some "data_begin") in
   `	.data\n`;
   `	.globl	{emit_symbol lbl_begin}\n`;
diff -bur ocaml-3.11.1/asmrun/mips.s my_ocaml/asmrun/mips.s
--- asmrun/mips.s	2004-07-13 14:18:53.000000000 +0200
+++ asmrun/mips.s	2009-08-20 09:34:36.000000000 +0200
@@ -187,7 +187,7 @@
         sw      $30, caml_exception_pointer
     /* Call C function */
         move    $25, $24
-        jal     $24
+        jal     $25	/* Rxd: $24 replaced by $25 to avoid this "Warning: MIPS PIC call to register other than $25" ? */
     /* Reload return address, alloc ptr, alloc limit */
         lw      $31, 0($16)     /* caml_last_return_address */
         lw      $22, 0($17)     /* caml_young_ptr */
@@ -254,7 +254,7 @@
         sw      $0, caml_last_return_address
     /* Call the Caml code */
         move    $25, $24
-        jal     $24
+        jal     $25	/* Rxd: 24 replaced by 25 */
 $104:
     /* Pop the trap frame, restoring caml_exception_pointer */
         lw      $24, 0($sp)
@@ -384,3 +384,8 @@
         .word   $104            /* return address into callback */
         .half   -1              /* negative frame size => use callback link */
         .half   0               /* no roots here */
+
+#if defined(SYS_linux)
+    /* Mark stack as non-executable, PR#4564 */
+        .section .note.GNU-stack,"",%progbits
+#endif
diff -bur ocaml-3.11.1/configure my_ocaml/configure
--- configure	2009-05-20 17:33:09.000000000 +0200
+++ configure	2009-08-23 10:55:44.000000000 +0200
@@ -40,7 +40,7 @@
 verbose=no
 withcurses=yes
 withsharedlibs=yes
-gcc_warnings="-Wall"
+gcc_warnings="-W -Wall"
 partialld="ld -r"
 
 # Try to turn internationalization off, can cause config.guess to malfunction!
@@ -292,6 +292,9 @@
     # (For those who want to force "cc -64")
     # Turn off warning "unused library"
     bytecclinkopts="-Wl,-woff,84";;
+  gcc*,mips64el-*)
+    bytecccompopts=""
+    bytecclinkopts="-fno-defer-pop $gcc_warnings -Wl,-O1 -Wl,--as-needed";;
   *,alpha*-*-unicos*)
     # For the Cray T3E
     bytecccompopts="-DUMK";;
@@ -468,6 +471,8 @@
         echo "64-bit integers must be doubleword-aligned."
         echo "#define ARCH_ALIGN_INT64" >> m.h
       fi;;
+    mips64el-*)
+    	echo "#define ARCH_ALIGN_INT64" >> m.h;;
     *)
       sh ./runtest int64align.c
       case $? in
@@ -636,6 +641,7 @@
                                 fi;;
   i[3456]86-*-gnu*)             arch=i386; system=gnu;;
   mips-*-irix6*)                arch=mips; system=irix;;
+  mips*-gnu*)                   arch=mips; system=gnu;;
   hppa1.1-*-hpux*)              arch=hppa; system=hpux;;
   hppa2.0*-*-hpux*)             arch=hppa; system=hpux;;
   hppa*-*-linux*)               arch=hppa; system=linux;;
@@ -672,7 +678,7 @@
 if test -z "$ccoption"; then
   case "$arch,$system,$cc" in
     alpha,digital,gcc*) nativecc=cc;;
-    mips,*,gcc*) nativecc=cc;;
+    mips,irix,gcc*) nativecc=cc;;
     *) nativecc="$bytecc";;
   esac
 else
@@ -687,6 +693,9 @@
   alpha,cc*,digital,*) nativecccompopts=-std1;;
   mips,cc*,irix,*)     nativecccompopts=-n32
                        nativecclinkopts="-n32 -Wl,-woff,84";;
+  mips,gcc*,gnu,mips64el-*)
+                       nativecccompopts="$gcc_warnings -fPIC"
+                       nativecclinkopts="--as-needed";;
   *,*,nextstep,*)      nativecccompopts="$gcc_warnings -U__GNUC__ -posix"
                        nativecclinkopts="-posix";;
   *,*,rhapsody,*darwin[1-5].*)
@@ -725,6 +734,8 @@
                     aspp='gcc -c -Wa,-xexplicit';;
   mips,*,irix)      as='as -n32 -O2 -nocpp -g0'
                     aspp='as -n32 -O2';;
+  mips,*,gnu)       as='as -KPIC'
+                    aspp='gcc -c -fPIC';;	# got bus error without fPIC ?
   power,*,elf)      as='as -u -m ppc'
                     aspp='gcc -c';;
   power,*,bsd)      as='as'
@@ -756,6 +767,7 @@
     case "$nativecc" in gcc*) ;; *) cc_profile='-xpg';; esac;;
   amd64,*,linux) profiling='prof';;
   amd64,*,gnu) profiling='prof';;
+  mips,*,gnu) profiling='prof';;
   *) profiling='noprof';;
 esac
 
diff -bur ocaml-3.11.1/asmcomp/mips/proc.ml my_ocaml/asmcomp/mips/proc.ml
--- asmcomp/mips/proc.ml	2007-10-30 13:37:16.000000000 +0100
+++ asmcomp/mips/proc.ml	2010-03-18 08:08:06.000000000 +0100
@@ -114,7 +114,7 @@
           incr int
         end else begin
           loc.(i) <- stack_slot (make_stack !ofs) ty;
-          ofs := !ofs + size_int
+          ofs := !ofs + 8
         end
     | Float ->
         if !float <= last_float then begin
@@ -143,7 +143,7 @@
    or float regs $f12...$f19.  Each argument "consumes" both one slot
    in the int register file and one slot in the float register file.
    Extra arguments are passed on stack, in a 64-bits slot, right-justified
-   (i.e. at +4 from natural address). *)   
+   (i.e. at +4 from natural address for big endians). *)   
 
 let loc_external_arguments arg =
   let loc = Array.create (Array.length arg) Reg.dummy in
@@ -158,7 +158,7 @@
     end else begin
       begin match arg.(i).typ with
         Float -> loc.(i) <- stack_slot (Outgoing !ofs) Float
-      | ty    -> loc.(i) <- stack_slot (Outgoing (!ofs + 4)) ty
+      | ty    -> loc.(i) <- stack_slot (Outgoing (!ofs + (if big_endian then 4 else 0))) ty
       end;
       ofs := !ofs + 8
     end
 
