mips: adding MIPS64LE support to Valgrind

Necessary changes to Valgrind to support MIPS64LE on Linux.
Minor cleanup/style changes embedded in the patch as well.
The change corresponds to r2687 in VEX.
Patch written by Dejan Jevtic and Petar Jovanovic.

More information about this issue:
https://bugs.kde.org/show_bug.cgi?id=313267


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@13292 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/memcheck/mc_machine.c b/memcheck/mc_machine.c
index a205b29..c6f41f4 100644
--- a/memcheck/mc_machine.c
+++ b/memcheck/mc_machine.c
@@ -81,6 +81,11 @@
 # define MC_SIZEOF_GUEST_STATE sizeof(VexGuestMIPS32State)
 #endif
 
+#if defined(VGA_mips64)
+# include "libvex_guest_mips64.h"
+# define MC_SIZEOF_GUEST_STATE sizeof(VexGuestMIPS64State)
+#endif
+
 static inline Bool host_is_big_endian ( void ) {
    UInt x = 0x11223344;
    return 0x1122 == *(UShort*)(&x);
@@ -1061,6 +1066,85 @@
 #  undef GOF
 #  undef SZB
 
+   /* --------------------- mips64 --------------------- */
+
+#  elif defined(VGA_mips64)
+
+#  define GOF(_fieldname) \
+      (offsetof(VexGuestMIPS64State,guest_##_fieldname))
+#  define SZB(_fieldname) \
+      (sizeof(((VexGuestMIPS64State*)0)->guest_##_fieldname))
+
+   Int  o     = offset;
+   Int  sz    = szB;
+   tl_assert(sz > 0);
+#if defined (VG_LITTLEENDIAN)
+   tl_assert(host_is_little_endian());
+#elif defined (VG_BIGENDIAN)
+   tl_assert(host_is_big_endian());
+#endif
+
+   if (o >= GOF(r0) && sz <= 8 && o <= (GOF(r31) + 8 - sz))
+      return GOF(r0) + ((o-GOF(r0)) & -8) ;
+
+   if (o == GOF(PC) && sz == 8) return -1;  /* slot unused */
+
+   if (o == GOF(HI) && sz == 8) return o;
+   if (o == GOF(LO) && sz == 8) return o;
+
+   if (o == GOF(FIR)  && sz == 4) return -1;  /* slot unused */
+   if (o == GOF(FCCR) && sz == 4) return -1;  /* slot unused */
+   if (o == GOF(FEXR) && sz == 4) return -1;  /* slot unused */
+   if (o == GOF(FENR) && sz == 4) return -1;  /* slot unused */
+   if (o == GOF(FCSR) && sz == 4) return -1;  /* slot unused */
+   if (o == GOF(ULR)  && sz == 8) return o;
+
+   if (o == GOF(EMNOTE)  && sz == 4) return -1;  /* slot unused */
+   if (o == GOF(TISTART) && sz == 4) return -1;  /* slot unused */
+   if (o == GOF(TILEN)   && sz == 4) return -1;  /* slot unused */
+   if (o == GOF(NRADDR)  && sz == 4) return -1;  /* slot unused */
+
+   if (o >= GOF(f0)  && o+sz <= GOF(f0) +SZB(f0))  return GOF(f0);
+   if (o >= GOF(f1)  && o+sz <= GOF(f1) +SZB(f1))  return GOF(f1);
+   if (o >= GOF(f2)  && o+sz <= GOF(f2) +SZB(f2))  return GOF(f2);
+   if (o >= GOF(f3)  && o+sz <= GOF(f3) +SZB(f3))  return GOF(f3);
+   if (o >= GOF(f4)  && o+sz <= GOF(f4) +SZB(f4))  return GOF(f4);
+   if (o >= GOF(f5)  && o+sz <= GOF(f5) +SZB(f5))  return GOF(f5);
+   if (o >= GOF(f6)  && o+sz <= GOF(f6) +SZB(f6))  return GOF(f6);
+   if (o >= GOF(f7)  && o+sz <= GOF(f7) +SZB(f7))  return GOF(f7);
+   if (o >= GOF(f8)  && o+sz <= GOF(f8) +SZB(f8))  return GOF(f8);
+   if (o >= GOF(f9)  && o+sz <= GOF(f9) +SZB(f9))  return GOF(f9);
+   if (o >= GOF(f10) && o+sz <= GOF(f10)+SZB(f10)) return GOF(f10);
+   if (o >= GOF(f11) && o+sz <= GOF(f11)+SZB(f11)) return GOF(f11);
+   if (o >= GOF(f12) && o+sz <= GOF(f12)+SZB(f12)) return GOF(f12);
+   if (o >= GOF(f13) && o+sz <= GOF(f13)+SZB(f13)) return GOF(f13);
+   if (o >= GOF(f14) && o+sz <= GOF(f14)+SZB(f14)) return GOF(f14);
+   if (o >= GOF(f15) && o+sz <= GOF(f15)+SZB(f15)) return GOF(f15);
+   if (o >= GOF(f16) && o+sz <= GOF(f16)+SZB(f16)) return GOF(f16);
+   if (o >= GOF(f17) && o+sz <= GOF(f17)+SZB(f17)) return GOF(f17);
+   if (o >= GOF(f18) && o+sz <= GOF(f18)+SZB(f18)) return GOF(f18);
+   if (o >= GOF(f19) && o+sz <= GOF(f19)+SZB(f19)) return GOF(f19);
+   if (o >= GOF(f20) && o+sz <= GOF(f20)+SZB(f20)) return GOF(f20);
+   if (o >= GOF(f21) && o+sz <= GOF(f21)+SZB(f21)) return GOF(f21);
+   if (o >= GOF(f22) && o+sz <= GOF(f22)+SZB(f22)) return GOF(f22);
+   if (o >= GOF(f23) && o+sz <= GOF(f23)+SZB(f23)) return GOF(f23);
+   if (o >= GOF(f24) && o+sz <= GOF(f24)+SZB(f24)) return GOF(f24);
+   if (o >= GOF(f25) && o+sz <= GOF(f25)+SZB(f25)) return GOF(f25);
+   if (o >= GOF(f26) && o+sz <= GOF(f26)+SZB(f26)) return GOF(f26);
+   if (o >= GOF(f27) && o+sz <= GOF(f27)+SZB(f27)) return GOF(f27);
+   if (o >= GOF(f28) && o+sz <= GOF(f28)+SZB(f28)) return GOF(f28);
+   if (o >= GOF(f29) && o+sz <= GOF(f29)+SZB(f29)) return GOF(f29);
+   if (o >= GOF(f30) && o+sz <= GOF(f30)+SZB(f30)) return GOF(f30);
+   if (o >= GOF(f31) && o+sz <= GOF(f31)+SZB(f31)) return GOF(f31);
+
+   if ((o > GOF(NRADDR)) && (o <= GOF(NRADDR) +12 )) return -1;
+
+   VG_(printf)("MC_(get_otrack_shadow_offset)(mips)(off=%d,sz=%d)\n",
+               offset,szB);
+   tl_assert(0);
+#  undef GOF
+#  undef SZB
+
 #  else
 #    error "FIXME: not implemented for this architecture"
 #  endif
@@ -1162,6 +1246,12 @@
    VG_(printf)("\n");
    tl_assert(0);
 
+   /* --------------------- mips64 --------------------- */
+#  elif defined(VGA_mips64)
+   VG_(printf)("get_reg_array_equiv_int_type(mips64): unhandled: ");
+   ppIRRegArray(arr);
+   VG_(printf)("\n");
+   tl_assert(0);
 #  else
 #    error "FIXME: not implemented for this architecture"
 #  endif