Refresh Valgrind to 3.8.1

Disable Android.mk for now until Android-specific changes are submitted later.

Change-Id: I0673f9b4edbbfacf5f52868c9735272e4bf811de
diff --git a/main/coregrind/m_gdbserver/32bit-core-valgrind-s1.xml b/main/coregrind/m_gdbserver/32bit-core-valgrind-s1.xml
index 9a0582f..a29701f 100644
--- a/main/coregrind/m_gdbserver/32bit-core-valgrind-s1.xml
+++ b/main/coregrind/m_gdbserver/32bit-core-valgrind-s1.xml
@@ -27,6 +27,11 @@
     <field name="ID" start="21" end="21"/>
   </flags>
 
+  <struct id="i387_ext_s">
+    <field name="b64" type="uint64"/>
+    <field name="b16" type="uint16"/>
+  </struct>
+
   <reg name="eaxs1" bitsize="32" type="int32"/>
   <reg name="ecxs1" bitsize="32" type="int32"/>
   <reg name="edxs1" bitsize="32" type="int32"/>
@@ -45,14 +50,14 @@
   <reg name="fss1" bitsize="32" type="int32"/>
   <reg name="gss1" bitsize="32" type="int32"/>
 
-  <reg name="st0s1" bitsize="80" type="i387_ext"/>
-  <reg name="st1s1" bitsize="80" type="i387_ext"/>
-  <reg name="st2s1" bitsize="80" type="i387_ext"/>
-  <reg name="st3s1" bitsize="80" type="i387_ext"/>
-  <reg name="st4s1" bitsize="80" type="i387_ext"/>
-  <reg name="st5s1" bitsize="80" type="i387_ext"/>
-  <reg name="st6s1" bitsize="80" type="i387_ext"/>
-  <reg name="st7s1" bitsize="80" type="i387_ext"/>
+  <reg name="st0s1" bitsize="80" type="i387_ext_s"/>
+  <reg name="st1s1" bitsize="80" type="i387_ext_s"/>
+  <reg name="st2s1" bitsize="80" type="i387_ext_s"/>
+  <reg name="st3s1" bitsize="80" type="i387_ext_s"/>
+  <reg name="st4s1" bitsize="80" type="i387_ext_s"/>
+  <reg name="st5s1" bitsize="80" type="i387_ext_s"/>
+  <reg name="st6s1" bitsize="80" type="i387_ext_s"/>
+  <reg name="st7s1" bitsize="80" type="i387_ext_s"/>
 
   <reg name="fctrls1" bitsize="32" type="int" group="float"/>
   <reg name="fstats1" bitsize="32" type="int" group="float"/>
diff --git a/main/coregrind/m_gdbserver/32bit-core-valgrind-s2.xml b/main/coregrind/m_gdbserver/32bit-core-valgrind-s2.xml
index 1b272c5..7ea1482 100644
--- a/main/coregrind/m_gdbserver/32bit-core-valgrind-s2.xml
+++ b/main/coregrind/m_gdbserver/32bit-core-valgrind-s2.xml
@@ -27,6 +27,11 @@
     <field name="ID" start="21" end="21"/>
   </flags>
 
+  <struct id="i387_ext_s">
+    <field name="b64" type="uint64"/>
+    <field name="b16" type="uint16"/>
+  </struct>
+
   <reg name="eaxs2" bitsize="32" type="int32"/>
   <reg name="ecxs2" bitsize="32" type="int32"/>
   <reg name="edxs2" bitsize="32" type="int32"/>
@@ -45,14 +50,14 @@
   <reg name="fss2" bitsize="32" type="int32"/>
   <reg name="gss2" bitsize="32" type="int32"/>
 
-  <reg name="st0s2" bitsize="80" type="i387_ext"/>
-  <reg name="st1s2" bitsize="80" type="i387_ext"/>
-  <reg name="st2s2" bitsize="80" type="i387_ext"/>
-  <reg name="st3s2" bitsize="80" type="i387_ext"/>
-  <reg name="st4s2" bitsize="80" type="i387_ext"/>
-  <reg name="st5s2" bitsize="80" type="i387_ext"/>
-  <reg name="st6s2" bitsize="80" type="i387_ext"/>
-  <reg name="st7s2" bitsize="80" type="i387_ext"/>
+  <reg name="st0s2" bitsize="80" type="i387_ext_s"/>
+  <reg name="st1s2" bitsize="80" type="i387_ext_s"/>
+  <reg name="st2s2" bitsize="80" type="i387_ext_s"/>
+  <reg name="st3s2" bitsize="80" type="i387_ext_s"/>
+  <reg name="st4s2" bitsize="80" type="i387_ext_s"/>
+  <reg name="st5s2" bitsize="80" type="i387_ext_s"/>
+  <reg name="st6s2" bitsize="80" type="i387_ext_s"/>
+  <reg name="st7s2" bitsize="80" type="i387_ext_s"/>
 
   <reg name="fctrls2" bitsize="32" type="int" group="float"/>
   <reg name="fstats2" bitsize="32" type="int" group="float"/>
diff --git a/main/coregrind/m_gdbserver/32bit-sse-valgrind-s1.xml b/main/coregrind/m_gdbserver/32bit-sse-valgrind-s1.xml
index 1a368c4..a650b16 100644
--- a/main/coregrind/m_gdbserver/32bit-sse-valgrind-s1.xml
+++ b/main/coregrind/m_gdbserver/32bit-sse-valgrind-s1.xml
@@ -7,15 +7,15 @@
 
 <!DOCTYPE feature SYSTEM "gdb-target.dtd">
 <feature name="org.gnu.gdb.i386.sse.valgrind.s1">
-  <vector id="v4f" type="ieee_single" count="4"/>
-  <vector id="v2d" type="ieee_double" count="2"/>
+  <vector id="v4f_s" type="uint32" count="4"/>
+  <vector id="v2d_s" type="uint64" count="2"/>
   <vector id="v16i8" type="int8" count="16"/>
   <vector id="v8i16" type="int16" count="8"/>
   <vector id="v4i32" type="int32" count="4"/>
   <vector id="v2i64" type="int64" count="2"/>
-  <union id="vec128">
-    <field name="v4_float" type="v4f"/>
-    <field name="v2_double" type="v2d"/>
+  <union id="vec128_s">
+    <field name="v4_float" type="v4f_s"/>
+    <field name="v2_double" type="v2d_s"/>
     <field name="v16_int8" type="v16i8"/>
     <field name="v8_int16" type="v8i16"/>
     <field name="v4_int32" type="v4i32"/>
@@ -39,14 +39,14 @@
     <field name="FZ" start="15" end="15"/>
   </flags>
 
-  <reg name="xmm0s1" bitsize="128" type="vec128"/>
-  <reg name="xmm1s1" bitsize="128" type="vec128"/>
-  <reg name="xmm2s1" bitsize="128" type="vec128"/>
-  <reg name="xmm3s1" bitsize="128" type="vec128"/>
-  <reg name="xmm4s1" bitsize="128" type="vec128"/>
-  <reg name="xmm5s1" bitsize="128" type="vec128"/>
-  <reg name="xmm6s1" bitsize="128" type="vec128"/>
-  <reg name="xmm7s1" bitsize="128" type="vec128"/>
+  <reg name="xmm0s1" bitsize="128" type="vec128_s"/>
+  <reg name="xmm1s1" bitsize="128" type="vec128_s"/>
+  <reg name="xmm2s1" bitsize="128" type="vec128_s"/>
+  <reg name="xmm3s1" bitsize="128" type="vec128_s"/>
+  <reg name="xmm4s1" bitsize="128" type="vec128_s"/>
+  <reg name="xmm5s1" bitsize="128" type="vec128_s"/>
+  <reg name="xmm6s1" bitsize="128" type="vec128_s"/>
+  <reg name="xmm7s1" bitsize="128" type="vec128_s"/>
 
   <reg name="mxcsrs1" bitsize="32" type="i386_mxcsr" group="vector"/>
 </feature>
diff --git a/main/coregrind/m_gdbserver/32bit-sse-valgrind-s2.xml b/main/coregrind/m_gdbserver/32bit-sse-valgrind-s2.xml
index c69da70..b3b1ac4 100644
--- a/main/coregrind/m_gdbserver/32bit-sse-valgrind-s2.xml
+++ b/main/coregrind/m_gdbserver/32bit-sse-valgrind-s2.xml
@@ -7,15 +7,15 @@
 
 <!DOCTYPE feature SYSTEM "gdb-target.dtd">
 <feature name="org.gnu.gdb.i386.sse.valgrind.s2">
-  <vector id="v4f" type="ieee_single" count="4"/>
-  <vector id="v2d" type="ieee_double" count="2"/>
+  <vector id="v4f_s" type="uint32" count="4"/>
+  <vector id="v2d_s" type="uint64" count="2"/>
   <vector id="v16i8" type="int8" count="16"/>
   <vector id="v8i16" type="int16" count="8"/>
   <vector id="v4i32" type="int32" count="4"/>
   <vector id="v2i64" type="int64" count="2"/>
-  <union id="vec128">
-    <field name="v4_float" type="v4f"/>
-    <field name="v2_double" type="v2d"/>
+  <union id="vec128_s">
+    <field name="v4_float" type="v4f_s"/>
+    <field name="v2_double" type="v2d_s"/>
     <field name="v16_int8" type="v16i8"/>
     <field name="v8_int16" type="v8i16"/>
     <field name="v4_int32" type="v4i32"/>
@@ -39,14 +39,14 @@
     <field name="FZ" start="15" end="15"/>
   </flags>
 
-  <reg name="xmm0s2" bitsize="128" type="vec128"/>
-  <reg name="xmm1s2" bitsize="128" type="vec128"/>
-  <reg name="xmm2s2" bitsize="128" type="vec128"/>
-  <reg name="xmm3s2" bitsize="128" type="vec128"/>
-  <reg name="xmm4s2" bitsize="128" type="vec128"/>
-  <reg name="xmm5s2" bitsize="128" type="vec128"/>
-  <reg name="xmm6s2" bitsize="128" type="vec128"/>
-  <reg name="xmm7s2" bitsize="128" type="vec128"/>
+  <reg name="xmm0s2" bitsize="128" type="vec128_s"/>
+  <reg name="xmm1s2" bitsize="128" type="vec128_s"/>
+  <reg name="xmm2s2" bitsize="128" type="vec128_s"/>
+  <reg name="xmm3s2" bitsize="128" type="vec128_s"/>
+  <reg name="xmm4s2" bitsize="128" type="vec128_s"/>
+  <reg name="xmm5s2" bitsize="128" type="vec128_s"/>
+  <reg name="xmm6s2" bitsize="128" type="vec128_s"/>
+  <reg name="xmm7s2" bitsize="128" type="vec128_s"/>
 
   <reg name="mxcsrs2" bitsize="32" type="i386_mxcsr" group="vector"/>
 </feature>
diff --git a/main/coregrind/m_gdbserver/64bit-avx-valgrind-s1.xml b/main/coregrind/m_gdbserver/64bit-avx-valgrind-s1.xml
new file mode 100644
index 0000000..cc2bb59
--- /dev/null
+++ b/main/coregrind/m_gdbserver/64bit-avx-valgrind-s1.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2010-2012 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.i386.avx.valgrind.s1">
+  <reg name="ymm0hs1" bitsize="128" type="uint128"/>
+  <reg name="ymm1hs1" bitsize="128" type="uint128"/>
+  <reg name="ymm2hs1" bitsize="128" type="uint128"/>
+  <reg name="ymm3hs1" bitsize="128" type="uint128"/>
+  <reg name="ymm4hs1" bitsize="128" type="uint128"/>
+  <reg name="ymm5hs1" bitsize="128" type="uint128"/>
+  <reg name="ymm6hs1" bitsize="128" type="uint128"/>
+  <reg name="ymm7hs1" bitsize="128" type="uint128"/>
+  <reg name="ymm8hs1" bitsize="128" type="uint128"/>
+  <reg name="ymm9hs1" bitsize="128" type="uint128"/>
+  <reg name="ymm10hs1" bitsize="128" type="uint128"/>
+  <reg name="ymm11hs1" bitsize="128" type="uint128"/>
+  <reg name="ymm12hs1" bitsize="128" type="uint128"/>
+  <reg name="ymm13hs1" bitsize="128" type="uint128"/>
+  <reg name="ymm14hs1" bitsize="128" type="uint128"/>
+  <reg name="ymm15hs1" bitsize="128" type="uint128"/>
+</feature>
diff --git a/main/coregrind/m_gdbserver/64bit-avx-valgrind-s2.xml b/main/coregrind/m_gdbserver/64bit-avx-valgrind-s2.xml
new file mode 100644
index 0000000..f82cb16
--- /dev/null
+++ b/main/coregrind/m_gdbserver/64bit-avx-valgrind-s2.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2010-2012 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.i386.avx.valgrind.s2">
+  <reg name="ymm0hs2" bitsize="128" type="uint128"/>
+  <reg name="ymm1hs2" bitsize="128" type="uint128"/>
+  <reg name="ymm2hs2" bitsize="128" type="uint128"/>
+  <reg name="ymm3hs2" bitsize="128" type="uint128"/>
+  <reg name="ymm4hs2" bitsize="128" type="uint128"/>
+  <reg name="ymm5hs2" bitsize="128" type="uint128"/>
+  <reg name="ymm6hs2" bitsize="128" type="uint128"/>
+  <reg name="ymm7hs2" bitsize="128" type="uint128"/>
+  <reg name="ymm8hs2" bitsize="128" type="uint128"/>
+  <reg name="ymm9hs2" bitsize="128" type="uint128"/>
+  <reg name="ymm10hs2" bitsize="128" type="uint128"/>
+  <reg name="ymm11hs2" bitsize="128" type="uint128"/>
+  <reg name="ymm12hs2" bitsize="128" type="uint128"/>
+  <reg name="ymm13hs2" bitsize="128" type="uint128"/>
+  <reg name="ymm14hs2" bitsize="128" type="uint128"/>
+  <reg name="ymm15hs2" bitsize="128" type="uint128"/>
+</feature>
diff --git a/main/coregrind/m_gdbserver/64bit-avx.xml b/main/coregrind/m_gdbserver/64bit-avx.xml
new file mode 100644
index 0000000..838bd6a
--- /dev/null
+++ b/main/coregrind/m_gdbserver/64bit-avx.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2010-2012 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.i386.avx">
+  <reg name="ymm0h" bitsize="128" type="uint128"/>
+  <reg name="ymm1h" bitsize="128" type="uint128"/>
+  <reg name="ymm2h" bitsize="128" type="uint128"/>
+  <reg name="ymm3h" bitsize="128" type="uint128"/>
+  <reg name="ymm4h" bitsize="128" type="uint128"/>
+  <reg name="ymm5h" bitsize="128" type="uint128"/>
+  <reg name="ymm6h" bitsize="128" type="uint128"/>
+  <reg name="ymm7h" bitsize="128" type="uint128"/>
+  <reg name="ymm8h" bitsize="128" type="uint128"/>
+  <reg name="ymm9h" bitsize="128" type="uint128"/>
+  <reg name="ymm10h" bitsize="128" type="uint128"/>
+  <reg name="ymm11h" bitsize="128" type="uint128"/>
+  <reg name="ymm12h" bitsize="128" type="uint128"/>
+  <reg name="ymm13h" bitsize="128" type="uint128"/>
+  <reg name="ymm14h" bitsize="128" type="uint128"/>
+  <reg name="ymm15h" bitsize="128" type="uint128"/>
+</feature>
diff --git a/main/coregrind/m_gdbserver/64bit-core-valgrind-s1.xml b/main/coregrind/m_gdbserver/64bit-core-valgrind-s1.xml
index 67b497f..8c3b504 100644
--- a/main/coregrind/m_gdbserver/64bit-core-valgrind-s1.xml
+++ b/main/coregrind/m_gdbserver/64bit-core-valgrind-s1.xml
@@ -27,6 +27,11 @@
     <field name="ID" start="21" end="21"/>
   </flags>
 
+  <struct id="i387_ext_s">
+    <field name="b64" type="uint64"/>
+    <field name="b16" type="uint16"/>
+  </struct>
+
   <reg name="raxs1" bitsize="64" type="int64"/>
   <reg name="rbxs1" bitsize="64" type="int64"/>
   <reg name="rcxs1" bitsize="64" type="int64"/>
@@ -53,14 +58,14 @@
   <reg name="fss1" bitsize="32" type="int32"/>
   <reg name="gss1" bitsize="32" type="int32"/>
 
-  <reg name="st0s1" bitsize="80" type="i387_ext"/>
-  <reg name="st1s1" bitsize="80" type="i387_ext"/>
-  <reg name="st2s1" bitsize="80" type="i387_ext"/>
-  <reg name="st3s1" bitsize="80" type="i387_ext"/>
-  <reg name="st4s1" bitsize="80" type="i387_ext"/>
-  <reg name="st5s1" bitsize="80" type="i387_ext"/>
-  <reg name="st6s1" bitsize="80" type="i387_ext"/>
-  <reg name="st7s1" bitsize="80" type="i387_ext"/>
+  <reg name="st0s1" bitsize="80" type="i387_ext_s"/>
+  <reg name="st1s1" bitsize="80" type="i387_ext_s"/>
+  <reg name="st2s1" bitsize="80" type="i387_ext_s"/>
+  <reg name="st3s1" bitsize="80" type="i387_ext_s"/>
+  <reg name="st4s1" bitsize="80" type="i387_ext_s"/>
+  <reg name="st5s1" bitsize="80" type="i387_ext_s"/>
+  <reg name="st6s1" bitsize="80" type="i387_ext_s"/>
+  <reg name="st7s1" bitsize="80" type="i387_ext_s"/>
 
   <reg name="fctrls1" bitsize="32" type="int" group="float"/>
   <reg name="fstats1" bitsize="32" type="int" group="float"/>
diff --git a/main/coregrind/m_gdbserver/64bit-core-valgrind-s2.xml b/main/coregrind/m_gdbserver/64bit-core-valgrind-s2.xml
index 14f2726..b1bcba8 100644
--- a/main/coregrind/m_gdbserver/64bit-core-valgrind-s2.xml
+++ b/main/coregrind/m_gdbserver/64bit-core-valgrind-s2.xml
@@ -27,6 +27,11 @@
     <field name="ID" start="21" end="21"/>
   </flags>
 
+  <struct id="i387_ext_s">
+    <field name="b64" type="uint64"/>
+    <field name="b16" type="uint16"/>
+  </struct>
+
   <reg name="raxs2" bitsize="64" type="int64"/>
   <reg name="rbxs2" bitsize="64" type="int64"/>
   <reg name="rcxs2" bitsize="64" type="int64"/>
@@ -53,14 +58,14 @@
   <reg name="fss2" bitsize="32" type="int32"/>
   <reg name="gss2" bitsize="32" type="int32"/>
 
-  <reg name="st0s2" bitsize="80" type="i387_ext"/>
-  <reg name="st1s2" bitsize="80" type="i387_ext"/>
-  <reg name="st2s2" bitsize="80" type="i387_ext"/>
-  <reg name="st3s2" bitsize="80" type="i387_ext"/>
-  <reg name="st4s2" bitsize="80" type="i387_ext"/>
-  <reg name="st5s2" bitsize="80" type="i387_ext"/>
-  <reg name="st6s2" bitsize="80" type="i387_ext"/>
-  <reg name="st7s2" bitsize="80" type="i387_ext"/>
+  <reg name="st0s2" bitsize="80" type="i387_ext_s"/>
+  <reg name="st1s2" bitsize="80" type="i387_ext_s"/>
+  <reg name="st2s2" bitsize="80" type="i387_ext_s"/>
+  <reg name="st3s2" bitsize="80" type="i387_ext_s"/>
+  <reg name="st4s2" bitsize="80" type="i387_ext_s"/>
+  <reg name="st5s2" bitsize="80" type="i387_ext_s"/>
+  <reg name="st6s2" bitsize="80" type="i387_ext_s"/>
+  <reg name="st7s2" bitsize="80" type="i387_ext_s"/>
 
   <reg name="fctrls2" bitsize="32" type="int" group="float"/>
   <reg name="fstats2" bitsize="32" type="int" group="float"/>
diff --git a/main/coregrind/m_gdbserver/64bit-sse-valgrind-s1.xml b/main/coregrind/m_gdbserver/64bit-sse-valgrind-s1.xml
index 9db6c74..eb01261 100644
--- a/main/coregrind/m_gdbserver/64bit-sse-valgrind-s1.xml
+++ b/main/coregrind/m_gdbserver/64bit-sse-valgrind-s1.xml
@@ -7,15 +7,15 @@
 
 <!DOCTYPE feature SYSTEM "gdb-target.dtd">
 <feature name="org.gnu.gdb.i386.sse.valgrind.s1">
-  <vector id="v4f" type="ieee_single" count="4"/>
-  <vector id="v2d" type="ieee_double" count="2"/>
+  <vector id="v4f_s" type="uint32" count="4"/>
+  <vector id="v2d_s" type="uint64" count="2"/>
   <vector id="v16i8" type="int8" count="16"/>
   <vector id="v8i16" type="int16" count="8"/>
   <vector id="v4i32" type="int32" count="4"/>
   <vector id="v2i64" type="int64" count="2"/>
-  <union id="vec128">
-    <field name="v4_float" type="v4f"/>
-    <field name="v2_double" type="v2d"/>
+  <union id="vec128_s">
+    <field name="v4_float" type="v4f_s"/>
+    <field name="v2_double" type="v2d_s"/>
     <field name="v16_int8" type="v16i8"/>
     <field name="v8_int16" type="v8i16"/>
     <field name="v4_int32" type="v4i32"/>
@@ -39,22 +39,22 @@
     <field name="FZ" start="15" end="15"/>
   </flags>
 
-  <reg name="xmm0s1" bitsize="128" type="vec128"/>
-  <reg name="xmm1s1" bitsize="128" type="vec128"/>
-  <reg name="xmm2s1" bitsize="128" type="vec128"/>
-  <reg name="xmm3s1" bitsize="128" type="vec128"/>
-  <reg name="xmm4s1" bitsize="128" type="vec128"/>
-  <reg name="xmm5s1" bitsize="128" type="vec128"/>
-  <reg name="xmm6s1" bitsize="128" type="vec128"/>
-  <reg name="xmm7s1" bitsize="128" type="vec128"/>
-  <reg name="xmm8s1" bitsize="128" type="vec128"/>
-  <reg name="xmm9s1" bitsize="128" type="vec128"/>
-  <reg name="xmm10s1" bitsize="128" type="vec128"/>
-  <reg name="xmm11s1" bitsize="128" type="vec128"/>
-  <reg name="xmm12s1" bitsize="128" type="vec128"/>
-  <reg name="xmm13s1" bitsize="128" type="vec128"/>
-  <reg name="xmm14s1" bitsize="128" type="vec128"/>
-  <reg name="xmm15s1" bitsize="128" type="vec128"/>
+  <reg name="xmm0s1" bitsize="128" type="vec128_s"/>
+  <reg name="xmm1s1" bitsize="128" type="vec128_s"/>
+  <reg name="xmm2s1" bitsize="128" type="vec128_s"/>
+  <reg name="xmm3s1" bitsize="128" type="vec128_s"/>
+  <reg name="xmm4s1" bitsize="128" type="vec128_s"/>
+  <reg name="xmm5s1" bitsize="128" type="vec128_s"/>
+  <reg name="xmm6s1" bitsize="128" type="vec128_s"/>
+  <reg name="xmm7s1" bitsize="128" type="vec128_s"/>
+  <reg name="xmm8s1" bitsize="128" type="vec128_s"/>
+  <reg name="xmm9s1" bitsize="128" type="vec128_s"/>
+  <reg name="xmm10s1" bitsize="128" type="vec128_s"/>
+  <reg name="xmm11s1" bitsize="128" type="vec128_s"/>
+  <reg name="xmm12s1" bitsize="128" type="vec128_s"/>
+  <reg name="xmm13s1" bitsize="128" type="vec128_s"/>
+  <reg name="xmm14s1" bitsize="128" type="vec128_s"/>
+  <reg name="xmm15s1" bitsize="128" type="vec128_s"/>
 
   <reg name="mxcsrs1" bitsize="32" type="i386_mxcsr" group="vector"/>
 </feature>
diff --git a/main/coregrind/m_gdbserver/64bit-sse-valgrind-s2.xml b/main/coregrind/m_gdbserver/64bit-sse-valgrind-s2.xml
index 189910e..c4a66f1 100644
--- a/main/coregrind/m_gdbserver/64bit-sse-valgrind-s2.xml
+++ b/main/coregrind/m_gdbserver/64bit-sse-valgrind-s2.xml
@@ -7,15 +7,15 @@
 
 <!DOCTYPE feature SYSTEM "gdb-target.dtd">
 <feature name="org.gnu.gdb.i386.sse.valgrind.s2">
-  <vector id="v4f" type="ieee_single" count="4"/>
-  <vector id="v2d" type="ieee_double" count="2"/>
+  <vector id="v4f_s" type="uint32" count="4"/>
+  <vector id="v2d_s" type="uint64" count="2"/>
   <vector id="v16i8" type="int8" count="16"/>
   <vector id="v8i16" type="int16" count="8"/>
   <vector id="v4i32" type="int32" count="4"/>
   <vector id="v2i64" type="int64" count="2"/>
-  <union id="vec128">
-    <field name="v4_float" type="v4f"/>
-    <field name="v2_double" type="v2d"/>
+  <union id="vec128_s">
+    <field name="v4_float" type="v4f_s"/>
+    <field name="v2_double" type="v2d_s"/>
     <field name="v16_int8" type="v16i8"/>
     <field name="v8_int16" type="v8i16"/>
     <field name="v4_int32" type="v4i32"/>
@@ -39,22 +39,22 @@
     <field name="FZ" start="15" end="15"/>
   </flags>
 
-  <reg name="xmm0s2" bitsize="128" type="vec128"/>
-  <reg name="xmm1s2" bitsize="128" type="vec128"/>
-  <reg name="xmm2s2" bitsize="128" type="vec128"/>
-  <reg name="xmm3s2" bitsize="128" type="vec128"/>
-  <reg name="xmm4s2" bitsize="128" type="vec128"/>
-  <reg name="xmm5s2" bitsize="128" type="vec128"/>
-  <reg name="xmm6s2" bitsize="128" type="vec128"/>
-  <reg name="xmm7s2" bitsize="128" type="vec128"/>
-  <reg name="xmm8s2" bitsize="128" type="vec128"/>
-  <reg name="xmm9s2" bitsize="128" type="vec128"/>
-  <reg name="xmm10s2" bitsize="128" type="vec128"/>
-  <reg name="xmm11s2" bitsize="128" type="vec128"/>
-  <reg name="xmm12s2" bitsize="128" type="vec128"/>
-  <reg name="xmm13s2" bitsize="128" type="vec128"/>
-  <reg name="xmm14s2" bitsize="128" type="vec128"/>
-  <reg name="xmm15s2" bitsize="128" type="vec128"/>
+  <reg name="xmm0s2" bitsize="128" type="vec128_s"/>
+  <reg name="xmm1s2" bitsize="128" type="vec128_s"/>
+  <reg name="xmm2s2" bitsize="128" type="vec128_s"/>
+  <reg name="xmm3s2" bitsize="128" type="vec128_s"/>
+  <reg name="xmm4s2" bitsize="128" type="vec128_s"/>
+  <reg name="xmm5s2" bitsize="128" type="vec128_s"/>
+  <reg name="xmm6s2" bitsize="128" type="vec128_s"/>
+  <reg name="xmm7s2" bitsize="128" type="vec128_s"/>
+  <reg name="xmm8s2" bitsize="128" type="vec128_s"/>
+  <reg name="xmm9s2" bitsize="128" type="vec128_s"/>
+  <reg name="xmm10s2" bitsize="128" type="vec128_s"/>
+  <reg name="xmm11s2" bitsize="128" type="vec128_s"/>
+  <reg name="xmm12s2" bitsize="128" type="vec128_s"/>
+  <reg name="xmm13s2" bitsize="128" type="vec128_s"/>
+  <reg name="xmm14s2" bitsize="128" type="vec128_s"/>
+  <reg name="xmm15s2" bitsize="128" type="vec128_s"/>
 
   <reg name="mxcsrs2" bitsize="32" type="i386_mxcsr" group="vector"/>
 </feature>
diff --git a/main/coregrind/m_gdbserver/README_DEVELOPERS b/main/coregrind/m_gdbserver/README_DEVELOPERS
index 153660f..3cf740f 100644
--- a/main/coregrind/m_gdbserver/README_DEVELOPERS
+++ b/main/coregrind/m_gdbserver/README_DEVELOPERS
@@ -193,7 +193,7 @@
 and select are working ok and red-hat 5.3 (an old kernel), everything
 works properly.
 
-Need to investigate if darwin and/or AIX can similarly do syscall
+Need to investigate if darwin can similarly do syscall
 restart with ptrace.
 
 The vgdb argument --max-invoke-ms=xxx allows to control the nr of
@@ -219,7 +219,7 @@
 This code had to be changed to integrate properly within valgrind
 (e.g. no libc usage).  Some of these changes have been ensured by
 using the preprocessor to replace calls by valgrind equivalent,
-e.g. #define memcpy(...) VG_(memcpy) (...).
+e.g. #define strcmp(...) VG_(strcmp) (...).
 
 Some "control flow" changes are due to the fact that gdbserver inside
 valgrind must return the control to valgrind when the 'debugged'
@@ -246,7 +246,7 @@
 ---------------------------
 Automatic Valgrind gdbserver tests are in the directory
 $(top_srcdir)/gdbserver_tests.
-Read $(top_srcdir)/gdbserver_tests/README_DEVELOPPERS for more
+Read $(top_srcdir)/gdbserver_tests/README_DEVELOPERS for more
 info about testing.
 
 How to integrate support for a new architecture xxx?
@@ -295,16 +295,9 @@
 
 Modify coregrind/Makefile.am:
     add valgrind-low-hal9000.c
-    If you have target xml description, also add them in pkglib_DATA 
+    If you have target xml description, also add them to GDBSERVER_XML_FILES
 
 
-A not handled comment given by Julian at FOSDEM.
-------------------------------------------------
-* the check for vgdb-poll in scheduler.c could/should be moved to another place:
-    instead of having it in run_thread_for_a_while
-    the vgdb poll check could be in VG_(scheduler).
-  (not clear to me why one is better than the other ???)
-
 TODO and/or additional nice things to have
 ------------------------------------------
 * many options can be changed on-line without problems.
@@ -312,11 +305,9 @@
   its arguments like the  startup options of m_main.c and tool clo processing.
 
 * have a memcheck monitor command
-  who_points_at <address> | <loss_record_nr>
-    that would describe the addresses where a pointer is found
-    to address (or address leaked at loss_record_nr>)
-  This would allow to interactively searching who is "keeping" a piece
-  of memory.
+  show_dangling_pointers [last_n_recently_released_blocks]
+  showing which of the n last recently released blocks are still
+  referenced. These references are (potential) dangling pointers.
 
 * some GDBTD in the code 
 
@@ -330,24 +321,6 @@
   of these architectures might complete this 
   (see the GDBTD in valgrind-low-*.c)
 
-* "hardware" watchpoint (read/write/access watchpoints) are implemented 
-  but can't persuade gdb to insert a hw watchpoint of what valgrind
-  supports (i.e. of whatever length).
-  The reason why gdb does not accept a hardware watch of let's say
-  10 bytes is:
-default_region_ok_for_hw_watchpoint (addr=134520360, len=10) at target.c:2738
-2738	  return (len <= gdbarch_ptr_bit (target_gdbarch) / TARGET_CHAR_BIT);
-#0  default_region_ok_for_hw_watchpoint (addr=134520360, len=10)
-    at target.c:2738
-2738	  return (len <= gdbarch_ptr_bit (target_gdbarch) / TARGET_CHAR_BIT);
-#1  0x08132e65 in can_use_hardware_watchpoint (v=0x85a8ef0)
-    at breakpoint.c:8300
-8300		  if (!target_region_ok_for_hw_watchpoint (vaddr, len))
-#2  0x0813bd17 in watch_command_1 (arg=0x84169f0 "", accessflag=2, 
-    from_tty=<value optimized out>) at breakpoint.c:8140
-  A small patch in gdb remote.c allowed to control the remote target watchpoint
-  length limit. This patch is to be submitted.
-
 * Currently, at least on recent linux kernel, vgdb can properly wake
   up a valgrind process which is blocked in system calls. Maybe we
   need to see till which kernel version the ptrace + syscall restart
diff --git a/main/coregrind/m_gdbserver/amd64-avx-coresse-valgrind.xml b/main/coregrind/m_gdbserver/amd64-avx-coresse-valgrind.xml
new file mode 100644
index 0000000..2b75715
--- /dev/null
+++ b/main/coregrind/m_gdbserver/amd64-avx-coresse-valgrind.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2010 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!-- AMD64 - core and sse.  -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<target>
+  <architecture>i386:x86-64</architecture>
+  <xi:include href="64bit-core.xml"/>
+  <xi:include href="64bit-sse.xml"/>
+  <xi:include href="64bit-avx.xml"/>
+  <xi:include href="64bit-core-valgrind-s1.xml"/>
+  <xi:include href="64bit-sse-valgrind-s1.xml"/>
+  <xi:include href="64bit-avx-valgrind-s1.xml"/>
+  <xi:include href="64bit-core-valgrind-s2.xml"/>
+  <xi:include href="64bit-sse-valgrind-s2.xml"/>
+  <xi:include href="64bit-avx-valgrind-s2.xml"/>
+</target>
diff --git a/main/coregrind/m_gdbserver/amd64-avx-coresse.xml b/main/coregrind/m_gdbserver/amd64-avx-coresse.xml
new file mode 100644
index 0000000..c46b318
--- /dev/null
+++ b/main/coregrind/m_gdbserver/amd64-avx-coresse.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2010 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!-- AMD64 - core and sse and avx.  -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<target>
+  <architecture>i386:x86-64</architecture>
+  <xi:include href="64bit-core.xml"/>
+  <xi:include href="64bit-sse.xml"/>
+  <xi:include href="64bit-avx.xml"/>
+</target>
diff --git a/main/coregrind/m_gdbserver/amd64-avx-linux-valgrind.xml b/main/coregrind/m_gdbserver/amd64-avx-linux-valgrind.xml
new file mode 100644
index 0000000..d692664
--- /dev/null
+++ b/main/coregrind/m_gdbserver/amd64-avx-linux-valgrind.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2010 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!-- AMD64 with avx - Includes Linux-only special "register".  -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<target>
+  <architecture>i386:x86-64</architecture>
+  <osabi>GNU/Linux</osabi>
+  <xi:include href="64bit-core.xml"/>
+  <xi:include href="64bit-sse.xml"/>
+  <xi:include href="64bit-linux.xml"/>
+  <xi:include href="64bit-avx.xml"/>
+  <xi:include href="64bit-core-valgrind-s1.xml"/>
+  <xi:include href="64bit-sse-valgrind-s1.xml"/>
+  <xi:include href="64bit-linux-valgrind-s1.xml"/>
+  <xi:include href="64bit-avx-valgrind-s1.xml"/>
+  <xi:include href="64bit-core-valgrind-s2.xml"/>
+  <xi:include href="64bit-sse-valgrind-s2.xml"/>
+  <xi:include href="64bit-linux-valgrind-s2.xml"/>
+  <xi:include href="64bit-avx-valgrind-s2.xml"/>
+</target>
diff --git a/main/coregrind/m_gdbserver/amd64-avx-linux.xml b/main/coregrind/m_gdbserver/amd64-avx-linux.xml
new file mode 100644
index 0000000..3fea2e4
--- /dev/null
+++ b/main/coregrind/m_gdbserver/amd64-avx-linux.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2010 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!-- AMD64 with avx - Includes Linux-only special "register".  -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<target>
+  <architecture>i386:x86-64</architecture>
+  <osabi>GNU/Linux</osabi>
+  <xi:include href="64bit-core.xml"/>
+  <xi:include href="64bit-sse.xml"/>
+  <xi:include href="64bit-linux.xml"/>
+  <xi:include href="64bit-avx.xml"/>
+</target>
diff --git a/main/coregrind/m_gdbserver/arm-vfpv3-valgrind-s1.xml b/main/coregrind/m_gdbserver/arm-vfpv3-valgrind-s1.xml
index 619f73f..c91f9c1 100644
--- a/main/coregrind/m_gdbserver/arm-vfpv3-valgrind-s1.xml
+++ b/main/coregrind/m_gdbserver/arm-vfpv3-valgrind-s1.xml
@@ -7,38 +7,38 @@
 
 <!DOCTYPE feature SYSTEM "gdb-target.dtd">
 <feature name="org.gnu.gdb.arm.vfp.valgrind.s1">
-  <reg name="d0s1" bitsize="64" type="ieee_double"/>
-  <reg name="d1s1" bitsize="64" type="ieee_double"/>
-  <reg name="d2s1" bitsize="64" type="ieee_double"/>
-  <reg name="d3s1" bitsize="64" type="ieee_double"/>
-  <reg name="d4s1" bitsize="64" type="ieee_double"/>
-  <reg name="d5s1" bitsize="64" type="ieee_double"/>
-  <reg name="d6s1" bitsize="64" type="ieee_double"/>
-  <reg name="d7s1" bitsize="64" type="ieee_double"/>
-  <reg name="d8s1" bitsize="64" type="ieee_double"/>
-  <reg name="d9s1" bitsize="64" type="ieee_double"/>
-  <reg name="d10s1" bitsize="64" type="ieee_double"/>
-  <reg name="d11s1" bitsize="64" type="ieee_double"/>
-  <reg name="d12s1" bitsize="64" type="ieee_double"/>
-  <reg name="d13s1" bitsize="64" type="ieee_double"/>
-  <reg name="d14s1" bitsize="64" type="ieee_double"/>
-  <reg name="d15s1" bitsize="64" type="ieee_double"/>
-  <reg name="d16s1" bitsize="64" type="ieee_double"/>
-  <reg name="d17s1" bitsize="64" type="ieee_double"/>
-  <reg name="d18s1" bitsize="64" type="ieee_double"/>
-  <reg name="d19s1" bitsize="64" type="ieee_double"/>
-  <reg name="d20s1" bitsize="64" type="ieee_double"/>
-  <reg name="d21s1" bitsize="64" type="ieee_double"/>
-  <reg name="d22s1" bitsize="64" type="ieee_double"/>
-  <reg name="d23s1" bitsize="64" type="ieee_double"/>
-  <reg name="d24s1" bitsize="64" type="ieee_double"/>
-  <reg name="d25s1" bitsize="64" type="ieee_double"/>
-  <reg name="d26s1" bitsize="64" type="ieee_double"/>
-  <reg name="d27s1" bitsize="64" type="ieee_double"/>
-  <reg name="d28s1" bitsize="64" type="ieee_double"/>
-  <reg name="d29s1" bitsize="64" type="ieee_double"/>
-  <reg name="d30s1" bitsize="64" type="ieee_double"/>
-  <reg name="d31s1" bitsize="64" type="ieee_double"/>
+  <reg name="d0s1" bitsize="64" type="uint64"/>
+  <reg name="d1s1" bitsize="64" type="uint64"/>
+  <reg name="d2s1" bitsize="64" type="uint64"/>
+  <reg name="d3s1" bitsize="64" type="uint64"/>
+  <reg name="d4s1" bitsize="64" type="uint64"/>
+  <reg name="d5s1" bitsize="64" type="uint64"/>
+  <reg name="d6s1" bitsize="64" type="uint64"/>
+  <reg name="d7s1" bitsize="64" type="uint64"/>
+  <reg name="d8s1" bitsize="64" type="uint64"/>
+  <reg name="d9s1" bitsize="64" type="uint64"/>
+  <reg name="d10s1" bitsize="64" type="uint64"/>
+  <reg name="d11s1" bitsize="64" type="uint64"/>
+  <reg name="d12s1" bitsize="64" type="uint64"/>
+  <reg name="d13s1" bitsize="64" type="uint64"/>
+  <reg name="d14s1" bitsize="64" type="uint64"/>
+  <reg name="d15s1" bitsize="64" type="uint64"/>
+  <reg name="d16s1" bitsize="64" type="uint64"/>
+  <reg name="d17s1" bitsize="64" type="uint64"/>
+  <reg name="d18s1" bitsize="64" type="uint64"/>
+  <reg name="d19s1" bitsize="64" type="uint64"/>
+  <reg name="d20s1" bitsize="64" type="uint64"/>
+  <reg name="d21s1" bitsize="64" type="uint64"/>
+  <reg name="d22s1" bitsize="64" type="uint64"/>
+  <reg name="d23s1" bitsize="64" type="uint64"/>
+  <reg name="d24s1" bitsize="64" type="uint64"/>
+  <reg name="d25s1" bitsize="64" type="uint64"/>
+  <reg name="d26s1" bitsize="64" type="uint64"/>
+  <reg name="d27s1" bitsize="64" type="uint64"/>
+  <reg name="d28s1" bitsize="64" type="uint64"/>
+  <reg name="d29s1" bitsize="64" type="uint64"/>
+  <reg name="d30s1" bitsize="64" type="uint64"/>
+  <reg name="d31s1" bitsize="64" type="uint64"/>
 
   <reg name="fpscrs1" bitsize="32" type="int" group="float"/>
 </feature>
diff --git a/main/coregrind/m_gdbserver/arm-vfpv3-valgrind-s2.xml b/main/coregrind/m_gdbserver/arm-vfpv3-valgrind-s2.xml
index c0e8677..9c0bc7a 100644
--- a/main/coregrind/m_gdbserver/arm-vfpv3-valgrind-s2.xml
+++ b/main/coregrind/m_gdbserver/arm-vfpv3-valgrind-s2.xml
@@ -7,38 +7,38 @@
 
 <!DOCTYPE feature SYSTEM "gdb-target.dtd">
 <feature name="org.gnu.gdb.arm.vfp.valgrind.s2">
-  <reg name="d0s2" bitsize="64" type="ieee_double"/>
-  <reg name="d1s2" bitsize="64" type="ieee_double"/>
-  <reg name="d2s2" bitsize="64" type="ieee_double"/>
-  <reg name="d3s2" bitsize="64" type="ieee_double"/>
-  <reg name="d4s2" bitsize="64" type="ieee_double"/>
-  <reg name="d5s2" bitsize="64" type="ieee_double"/>
-  <reg name="d6s2" bitsize="64" type="ieee_double"/>
-  <reg name="d7s2" bitsize="64" type="ieee_double"/>
-  <reg name="d8s2" bitsize="64" type="ieee_double"/>
-  <reg name="d9s2" bitsize="64" type="ieee_double"/>
-  <reg name="d10s2" bitsize="64" type="ieee_double"/>
-  <reg name="d11s2" bitsize="64" type="ieee_double"/>
-  <reg name="d12s2" bitsize="64" type="ieee_double"/>
-  <reg name="d13s2" bitsize="64" type="ieee_double"/>
-  <reg name="d14s2" bitsize="64" type="ieee_double"/>
-  <reg name="d15s2" bitsize="64" type="ieee_double"/>
-  <reg name="d16s2" bitsize="64" type="ieee_double"/>
-  <reg name="d17s2" bitsize="64" type="ieee_double"/>
-  <reg name="d18s2" bitsize="64" type="ieee_double"/>
-  <reg name="d19s2" bitsize="64" type="ieee_double"/>
-  <reg name="d20s2" bitsize="64" type="ieee_double"/>
-  <reg name="d21s2" bitsize="64" type="ieee_double"/>
-  <reg name="d22s2" bitsize="64" type="ieee_double"/>
-  <reg name="d23s2" bitsize="64" type="ieee_double"/>
-  <reg name="d24s2" bitsize="64" type="ieee_double"/>
-  <reg name="d25s2" bitsize="64" type="ieee_double"/>
-  <reg name="d26s2" bitsize="64" type="ieee_double"/>
-  <reg name="d27s2" bitsize="64" type="ieee_double"/>
-  <reg name="d28s2" bitsize="64" type="ieee_double"/>
-  <reg name="d29s2" bitsize="64" type="ieee_double"/>
-  <reg name="d30s2" bitsize="64" type="ieee_double"/>
-  <reg name="d31s2" bitsize="64" type="ieee_double"/>
+  <reg name="d0s2" bitsize="64" type="uint64"/>
+  <reg name="d1s2" bitsize="64" type="uint64"/>
+  <reg name="d2s2" bitsize="64" type="uint64"/>
+  <reg name="d3s2" bitsize="64" type="uint64"/>
+  <reg name="d4s2" bitsize="64" type="uint64"/>
+  <reg name="d5s2" bitsize="64" type="uint64"/>
+  <reg name="d6s2" bitsize="64" type="uint64"/>
+  <reg name="d7s2" bitsize="64" type="uint64"/>
+  <reg name="d8s2" bitsize="64" type="uint64"/>
+  <reg name="d9s2" bitsize="64" type="uint64"/>
+  <reg name="d10s2" bitsize="64" type="uint64"/>
+  <reg name="d11s2" bitsize="64" type="uint64"/>
+  <reg name="d12s2" bitsize="64" type="uint64"/>
+  <reg name="d13s2" bitsize="64" type="uint64"/>
+  <reg name="d14s2" bitsize="64" type="uint64"/>
+  <reg name="d15s2" bitsize="64" type="uint64"/>
+  <reg name="d16s2" bitsize="64" type="uint64"/>
+  <reg name="d17s2" bitsize="64" type="uint64"/>
+  <reg name="d18s2" bitsize="64" type="uint64"/>
+  <reg name="d19s2" bitsize="64" type="uint64"/>
+  <reg name="d20s2" bitsize="64" type="uint64"/>
+  <reg name="d21s2" bitsize="64" type="uint64"/>
+  <reg name="d22s2" bitsize="64" type="uint64"/>
+  <reg name="d23s2" bitsize="64" type="uint64"/>
+  <reg name="d24s2" bitsize="64" type="uint64"/>
+  <reg name="d25s2" bitsize="64" type="uint64"/>
+  <reg name="d26s2" bitsize="64" type="uint64"/>
+  <reg name="d27s2" bitsize="64" type="uint64"/>
+  <reg name="d28s2" bitsize="64" type="uint64"/>
+  <reg name="d29s2" bitsize="64" type="uint64"/>
+  <reg name="d30s2" bitsize="64" type="uint64"/>
+  <reg name="d31s2" bitsize="64" type="uint64"/>
 
   <reg name="fpscrs2" bitsize="32" type="int" group="float"/>
 </feature>
diff --git a/main/coregrind/m_gdbserver/m_gdbserver.c b/main/coregrind/m_gdbserver/m_gdbserver.c
index 6a0a196..bdc0b4c 100644
--- a/main/coregrind/m_gdbserver/m_gdbserver.c
+++ b/main/coregrind/m_gdbserver/m_gdbserver.c
@@ -7,7 +7,7 @@
    This file is part of Valgrind, a dynamic binary instrumentation
    framework.
 
-   Copyright (C) 2011-2011 Philippe Waroquiers
+   Copyright (C) 2011-2012 Philippe Waroquiers
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License as
@@ -39,9 +39,11 @@
 #include "pub_core_threadstate.h"
 #include "pub_core_transtab.h"
 #include "pub_tool_hashtable.h"
+#include "pub_tool_xarray.h"
 #include "pub_core_libcassert.h"
 #include "pub_tool_libcbase.h"
 #include "pub_core_libcsignal.h"
+#include "pub_core_signals.h"
 #include "pub_tool_machine.h"     // VG_(fnptr_to_fnentry)
 #include "pub_tool_debuginfo.h"
 #include "pub_core_scheduler.h"
@@ -129,13 +131,6 @@
 
 static void call_gdbserver ( ThreadId tid , CallReason reason);
 
-/* convert from CORE_ADDR to void* */
-static
-void* C2v(CORE_ADDR addr)
-{
-   return (void*) addr;
-}
-
 /* Describes the address addr (for debugging/printing purposes).
    Last two results are kept. A third call will replace the
    oldest result. */
@@ -145,6 +140,7 @@
    static int w = 0;
    PtrdiffT offset;
    if (w == 2) w = 0;
+   buf[w][0] = '\0';
    if (is_code) {
       VG_(describe_IP) (addr, buf[w], 200);
    } else {
@@ -158,6 +154,18 @@
 static int gdbserver_called = 0;
 static int gdbserver_exited = 0;
 
+/* alloc and free functions for xarray and similar. */
+static void* gs_alloc (HChar* cc, SizeT sz)
+{
+   void* res = VG_(arena_malloc)(VG_AR_CORE, cc, sz);
+   vg_assert (res);
+   return res;
+}
+static void gs_free (void* ptr)
+{
+   VG_(arena_free)(VG_AR_CORE, ptr);
+}
+
 typedef
    enum {
      GS_break,
@@ -227,21 +235,52 @@
    case write_watchpoint:    return "write_watchpoint";
    case read_watchpoint:     return "read_watchpoint";
    case access_watchpoint:   return "access_watchpoint";
-   default: vg_assert(0);
+   default:                  return "???wrong PointKind";
    }
 }
 
 typedef
    struct _GS_Watch {
-      struct _GS_Watch* next;
       Addr    addr;
       SizeT   len;
       PointKind kind;
    }
    GS_Watch;
 
-/* gs_watches contains a list of all addresses+len that are being watched. */
-static VgHashTable gs_watches = NULL;
+/* gs_watches contains a list of all addresses+len+kind that are being
+   watched. */
+static XArray* gs_watches = NULL;
+
+static inline GS_Watch* index_gs_watches(Word i)
+{
+   return *(GS_Watch **) VG_(indexXA) (gs_watches, i);
+}
+
+/* Returns the GS_Watch matching addr/len/kind and sets *g_ix to its
+   position in gs_watches.
+   If no matching GS_Watch is found, returns NULL and sets g_ix to -1. */
+static GS_Watch* lookup_gs_watch (Addr addr, SizeT len, PointKind kind,
+                                  Word* g_ix)
+{
+   const Word n_elems = VG_(sizeXA) (gs_watches);
+   Word i;
+   GS_Watch *g;
+
+   /* Linear search. If we have many watches, this might be optimised
+      by having the array sorted and using VG_(lookupXA) */
+   for (i = 0; i < n_elems; i++) {
+      g = index_gs_watches(i);
+      if (g->addr == addr && g->len == len && g->kind == kind) {
+         // Found.
+         *g_ix = i;
+         return g;
+      }
+   }
+
+   // Not found.
+   *g_ix = -1;
+   return NULL;
+}
 
 
 /* protocol spec tells the below must be idempotent. */
@@ -296,6 +335,7 @@
 {
    Bool res;
    GS_Watch *g;
+   Word g_ix;
    Bool is_code = kind == software_breakpoint || kind == hardware_breakpoint;
 
    dlog(1, "%s %s at addr %p %s\n",
@@ -320,7 +360,10 @@
    if (!res) 
       return False; /* error or unsupported */
 
-   g = VG_(HT_lookup) (gs_watches, (UWord)addr);
+   // Protocol says insert/remove must be idempotent.
+   // So, we just ignore double insert or (supposed) double delete.
+
+   g = lookup_gs_watch (addr, len, kind, &g_ix);
    if (insert) {
       if (g == NULL) {
          g = VG_(arena_malloc)(VG_AR_CORE, "gdbserver_point watchpoint",
@@ -328,27 +371,38 @@
          g->addr = addr;
          g->len  = len;
          g->kind = kind;
-         VG_(HT_add_node)(gs_watches, g);
+         VG_(addToXA)(gs_watches, &g);
       } else {
-         g->kind = kind;
+         dlog(1, 
+              "VG_(gdbserver_point) addr %p len %d kind %s already inserted\n",
+               C2v(addr), len, VG_(ppPointKind) (kind));
       }
    } else {
-      vg_assert (g != NULL);
-      VG_(HT_remove) (gs_watches, g->addr);
-      VG_(arena_free) (VG_AR_CORE, g);
+      if (g != NULL) {
+         VG_(removeIndexXA) (gs_watches, g_ix);
+         VG_(arena_free) (VG_AR_CORE, g);
+      } else {
+         dlog(1, 
+              "VG_(gdbserver_point) addr %p len %d kind %s already deleted?\n",
+              C2v(addr), len, VG_(ppPointKind) (kind));
+      }
    }  
    return True;
 }
 
 Bool VG_(is_watched)(PointKind kind, Addr addr, Int szB)
 {
+   Word n_elems;
    GS_Watch* g;
+   Word i;
    Bool watched = False;
    const ThreadId tid = VG_(running_tid);
 
    if (!gdbserver_called)
       return False;
 
+   n_elems = VG_(sizeXA) (gs_watches);
+
    Addr to = addr + szB; // semi-open interval [addr, to[
 
    vg_assert (kind == access_watchpoint 
@@ -356,8 +410,9 @@
               || kind == write_watchpoint);
    dlog(1, "tid %d VG_(is_watched) %s addr %p szB %d\n",
         tid, VG_(ppPointKind) (kind), C2v(addr), szB);
-   VG_(HT_ResetIter) (gs_watches);
-   while ((g = VG_(HT_Next) (gs_watches))) {
+
+   for (i = 0; i < n_elems; i++) {
+      g = index_gs_watches(i);
       switch (g->kind) {
       case software_breakpoint:
       case hardware_breakpoint:
@@ -479,26 +534,29 @@
    VG_(free) (ag);
 }
 
-// Clear watched addressed in gs_watches
+// Clear watched addressed in gs_watches, delete gs_watches.
 static void clear_watched_addresses(void)
 {
-   GS_Watch** ag;
-   UInt n_elems;
-   int i;
+   GS_Watch* g;
+   const Word n_elems = VG_(sizeXA) (gs_watches);
+   Word i;
 
    dlog(1,
-        "clear_watched_addresses: scanning hash table nodes %d\n", 
-        VG_(HT_count_nodes) (gs_watches));
-   ag = (GS_Watch**) VG_(HT_to_array) (gs_watches, &n_elems);
+        "clear_watched_addresses: %ld elements\n", 
+        n_elems);
+   
    for (i = 0; i < n_elems; i++) {
-      if (!VG_(gdbserver_point) (ag[i]->kind,
+      g = index_gs_watches(i);
+      if (!VG_(gdbserver_point) (g->kind,
                                  /* insert */ False,
-                                 ag[i]->addr,
-                                 ag[i]->len)) {
+                                 g->addr,
+                                 g->len)) {
          vg_assert (0);
       }
    }
-   VG_(free) (ag);
+
+   VG_(deleteXA) (gs_watches);
+   gs_watches = NULL;
 }
 
 static void invalidate_if_jump_not_yet_gdbserved (Addr addr, char* from)
@@ -549,11 +607,9 @@
       vg_assert (gs_addresses != NULL);
       vg_assert (gs_watches != NULL);
       clear_gdbserved_addresses(/* clear only jumps */ False);
-      VG_(HT_destruct) (gs_addresses);
+      VG_(HT_destruct) (gs_addresses, VG_(free));
       gs_addresses = NULL;
       clear_watched_addresses();
-      VG_(HT_destruct) (gs_watches);
-      gs_watches = NULL;
    } else {
       vg_assert (gs_addresses == NULL);
       vg_assert (gs_watches == NULL);
@@ -598,7 +654,10 @@
       vg_assert (gs_addresses == NULL);
       vg_assert (gs_watches == NULL);
       gs_addresses = VG_(HT_construct)( "gdbserved_addresses" );
-      gs_watches = VG_(HT_construct)( "gdbserved_watches" );
+      gs_watches = VG_(newXA)(gs_alloc,
+                              "gdbserved_watches",
+                              gs_free,
+                              sizeof(GS_Watch*));
       VG_(atfork)(NULL, NULL, gdbserver_cleanup_in_child_after_fork);
    }
    vg_assert (gs_addresses != NULL);
@@ -835,9 +894,14 @@
    return ret;
 }
 
-Bool VG_(gdbserver_report_signal) (Int sigNo, ThreadId tid)
+Bool VG_(gdbserver_report_signal) (Int vki_sigNo, ThreadId tid)
 {
-   dlog(1, "signal %d tid %d\n", sigNo, tid);
+   dlog(1, "VG core calling VG_(gdbserver_report_signal) "
+        "vki_nr %d %s gdb_nr %d %s tid %d\n", 
+        vki_sigNo, VG_(signame)(vki_sigNo),
+        target_signal_from_host (vki_sigNo),
+        target_signal_to_name(target_signal_from_host (vki_sigNo)), 
+        tid);
 
    /* if gdbserver is currently not connected, then signal
       is to be given to the process */
@@ -848,19 +912,19 @@
    /* if gdb has informed gdbserver that this signal can be
       passed directly without informing gdb, then signal is
       to be given to the process. */
-   if (pass_signals[sigNo]) {
+   if (pass_signals[target_signal_from_host(vki_sigNo)]) {
       dlog(1, "pass_signals => pass\n");
       return True;
    }
    
    /* indicate to gdbserver that there is a signal */
-   gdbserver_signal_encountered (sigNo);
+   gdbserver_signal_encountered (vki_sigNo);
 
    /* let gdbserver do some work, e.g. show the signal to the user */
    call_gdbserver (tid, signal_reason);
    
    /* ask gdbserver what is the final decision */
-   if (gdbserver_deliver_signal (sigNo)) {
+   if (gdbserver_deliver_signal (vki_sigNo)) {
       dlog(1, "gdbserver deliver signal\n");
       return True;
    } else {
@@ -1023,12 +1087,16 @@
       gdb interactions. */
    
    di->nFxState = 2;
-   di->fxState[0].fx     = Ifx_Read;
-   di->fxState[0].offset = layout->offset_SP;
-   di->fxState[0].size   = layout->sizeof_SP;
-   di->fxState[1].fx     = Ifx_Modify;
-   di->fxState[1].offset = layout->offset_IP;
-   di->fxState[1].size   = layout->sizeof_IP;
+   di->fxState[0].fx        = Ifx_Read;
+   di->fxState[0].offset    = layout->offset_SP;
+   di->fxState[0].size      = layout->sizeof_SP;
+   di->fxState[0].nRepeats  = 0;
+   di->fxState[0].repeatLen = 0;
+   di->fxState[1].fx        = Ifx_Modify;
+   di->fxState[1].offset    = layout->offset_IP;
+   di->fxState[1].size      = layout->sizeof_IP;
+   di->fxState[1].nRepeats  = 0;
+   di->fxState[1].repeatLen = 0;
 
    addStmtToIRSB(irsb, IRStmt_Dirty(di));
 
@@ -1323,7 +1391,7 @@
    const int nr_gdbserved_addresses 
       = (gs_addresses == NULL ? -1 : VG_(HT_count_nodes) (gs_addresses));
    const int nr_watchpoints
-      = (gs_watches == NULL ? -1 : VG_(HT_count_nodes) (gs_watches));
+      = (gs_watches == NULL ? -1 : (int) VG_(sizeXA) (gs_watches));
    remote_utils_output_status();
    VG_(umsg)
       ("nr of calls to gdbserver: %d\n"
diff --git a/main/coregrind/m_gdbserver/mips-cp0-valgrind-s1.xml b/main/coregrind/m_gdbserver/mips-cp0-valgrind-s1.xml
new file mode 100644
index 0000000..b775194
--- /dev/null
+++ b/main/coregrind/m_gdbserver/mips-cp0-valgrind-s1.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.mips.cp0.valgrind.s1">
+  <reg name="statuss1" bitsize="32" regnum="32"/>
+  <reg name="badvaddrs1" bitsize="32" regnum="35"/>
+  <reg name="causes1" bitsize="32" regnum="36"/>
+</feature>
diff --git a/main/coregrind/m_gdbserver/mips-cp0-valgrind-s2.xml b/main/coregrind/m_gdbserver/mips-cp0-valgrind-s2.xml
new file mode 100644
index 0000000..fc57afa
--- /dev/null
+++ b/main/coregrind/m_gdbserver/mips-cp0-valgrind-s2.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.mips.cp0.valgrind.s2">
+  <reg name="statuss2" bitsize="32" regnum="32"/>
+  <reg name="badvaddrs2" bitsize="32" regnum="35"/>
+  <reg name="causes2" bitsize="32" regnum="36"/>
+</feature>
diff --git a/main/coregrind/m_gdbserver/mips-cp0.xml b/main/coregrind/m_gdbserver/mips-cp0.xml
new file mode 100644
index 0000000..2555b1d
--- /dev/null
+++ b/main/coregrind/m_gdbserver/mips-cp0.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.mips.cp0">
+  <reg name="status" bitsize="32" regnum="32"/>
+  <reg name="badvaddr" bitsize="32" regnum="35"/>
+  <reg name="cause" bitsize="32" regnum="36"/>
+</feature>
diff --git a/main/coregrind/m_gdbserver/mips-cpu-valgrind-s1.xml b/main/coregrind/m_gdbserver/mips-cpu-valgrind-s1.xml
new file mode 100644
index 0000000..3404b43
--- /dev/null
+++ b/main/coregrind/m_gdbserver/mips-cpu-valgrind-s1.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.mips.cpu.valgrind.s1">
+  <reg name="r0s1" bitsize="32" regnum="0"/>
+  <reg name="r1s1" bitsize="32"/>
+  <reg name="r2s1" bitsize="32"/>
+  <reg name="r3s1" bitsize="32"/>
+  <reg name="r4s1" bitsize="32"/>
+  <reg name="r5s1" bitsize="32"/>
+  <reg name="r6s1" bitsize="32"/>
+  <reg name="r7s1" bitsize="32"/>
+  <reg name="r8s1" bitsize="32"/>
+  <reg name="r9s1" bitsize="32"/>
+  <reg name="r10s1" bitsize="32"/>
+  <reg name="r11s1" bitsize="32"/>
+  <reg name="r12s1" bitsize="32"/>
+  <reg name="r13s1" bitsize="32"/>
+  <reg name="r14s1" bitsize="32"/>
+  <reg name="r15s1" bitsize="32"/>
+  <reg name="r16s1" bitsize="32"/>
+  <reg name="r17s1" bitsize="32"/>
+  <reg name="r18s1" bitsize="32"/>
+  <reg name="r19s1" bitsize="32"/>
+  <reg name="r20s1" bitsize="32"/>
+  <reg name="r21s1" bitsize="32"/>
+  <reg name="r22s1" bitsize="32"/>
+  <reg name="r23s1" bitsize="32"/>
+  <reg name="r24s1" bitsize="32"/>
+  <reg name="r25s1" bitsize="32"/>
+  <reg name="r26s1" bitsize="32"/>
+  <reg name="r27s1" bitsize="32"/>
+  <reg name="r28s1" bitsize="32"/>
+  <reg name="r29s1" bitsize="32"/>
+  <reg name="r30s1" bitsize="32"/>
+  <reg name="r31s1" bitsize="32"/>
+
+  <reg name="los1" bitsize="32" regnum="33"/>
+  <reg name="his1" bitsize="32" regnum="34"/>
+  <reg name="pcs1" bitsize="32" regnum="37"/>
+</feature>
diff --git a/main/coregrind/m_gdbserver/mips-cpu-valgrind-s2.xml b/main/coregrind/m_gdbserver/mips-cpu-valgrind-s2.xml
new file mode 100644
index 0000000..13b1640
--- /dev/null
+++ b/main/coregrind/m_gdbserver/mips-cpu-valgrind-s2.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.mips.cpu.valgrind.s2">
+  <reg name="r0s2" bitsize="32" regnum="0"/>
+  <reg name="r1s2" bitsize="32"/>
+  <reg name="r2s2" bitsize="32"/>
+  <reg name="r3s2" bitsize="32"/>
+  <reg name="r4s2" bitsize="32"/>
+  <reg name="r5s2" bitsize="32"/>
+  <reg name="r6s2" bitsize="32"/>
+  <reg name="r7s2" bitsize="32"/>
+  <reg name="r8s2" bitsize="32"/>
+  <reg name="r9s2" bitsize="32"/>
+  <reg name="r10s2" bitsize="32"/>
+  <reg name="r11s2" bitsize="32"/>
+  <reg name="r12s2" bitsize="32"/>
+  <reg name="r13s2" bitsize="32"/>
+  <reg name="r14s2" bitsize="32"/>
+  <reg name="r15s2" bitsize="32"/>
+  <reg name="r16s2" bitsize="32"/>
+  <reg name="r17s2" bitsize="32"/>
+  <reg name="r18s2" bitsize="32"/>
+  <reg name="r19s2" bitsize="32"/>
+  <reg name="r20s2" bitsize="32"/>
+  <reg name="r21s2" bitsize="32"/>
+  <reg name="r22s2" bitsize="32"/>
+  <reg name="r23s2" bitsize="32"/>
+  <reg name="r24s2" bitsize="32"/>
+  <reg name="r25s2" bitsize="32"/>
+  <reg name="r26s2" bitsize="32"/>
+  <reg name="r27s2" bitsize="32"/>
+  <reg name="r28s2" bitsize="32"/>
+  <reg name="r29s2" bitsize="32"/>
+  <reg name="r30s2" bitsize="32"/>
+  <reg name="r31s2" bitsize="32"/>
+
+  <reg name="los2" bitsize="32" regnum="33"/>
+  <reg name="his2" bitsize="32" regnum="34"/>
+  <reg name="pcs2" bitsize="32" regnum="37"/>
+</feature>
diff --git a/main/coregrind/m_gdbserver/mips-cpu.xml b/main/coregrind/m_gdbserver/mips-cpu.xml
new file mode 100644
index 0000000..62bfe03
--- /dev/null
+++ b/main/coregrind/m_gdbserver/mips-cpu.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.mips.cpu">
+  <reg name="r0" bitsize="32" regnum="0"/>
+  <reg name="r1" bitsize="32"/>
+  <reg name="r2" bitsize="32"/>
+  <reg name="r3" bitsize="32"/>
+  <reg name="r4" bitsize="32"/>
+  <reg name="r5" bitsize="32"/>
+  <reg name="r6" bitsize="32"/>
+  <reg name="r7" bitsize="32"/>
+  <reg name="r8" bitsize="32"/>
+  <reg name="r9" bitsize="32"/>
+  <reg name="r10" bitsize="32"/>
+  <reg name="r11" bitsize="32"/>
+  <reg name="r12" bitsize="32"/>
+  <reg name="r13" bitsize="32"/>
+  <reg name="r14" bitsize="32"/>
+  <reg name="r15" bitsize="32"/>
+  <reg name="r16" bitsize="32"/>
+  <reg name="r17" bitsize="32"/>
+  <reg name="r18" bitsize="32"/>
+  <reg name="r19" bitsize="32"/>
+  <reg name="r20" bitsize="32"/>
+  <reg name="r21" bitsize="32"/>
+  <reg name="r22" bitsize="32"/>
+  <reg name="r23" bitsize="32"/>
+  <reg name="r24" bitsize="32"/>
+  <reg name="r25" bitsize="32"/>
+  <reg name="r26" bitsize="32"/>
+  <reg name="r27" bitsize="32"/>
+  <reg name="r28" bitsize="32"/>
+  <reg name="r29" bitsize="32"/>
+  <reg name="r30" bitsize="32"/>
+  <reg name="r31" bitsize="32"/>
+
+  <reg name="lo" bitsize="32" regnum="33"/>
+  <reg name="hi" bitsize="32" regnum="34"/>
+  <reg name="pc" bitsize="32" regnum="37"/>
+</feature>
diff --git a/main/coregrind/m_gdbserver/mips-fpu-valgrind-s1.xml b/main/coregrind/m_gdbserver/mips-fpu-valgrind-s1.xml
new file mode 100644
index 0000000..3c84e9d
--- /dev/null
+++ b/main/coregrind/m_gdbserver/mips-fpu-valgrind-s1.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.mips.fpu.valgrind.s1">
+  <reg name="f0s1" bitsize="32" type="ieee_single" regnum="38"/>
+  <reg name="f1s1" bitsize="32" type="ieee_single"/>
+  <reg name="f2s1" bitsize="32" type="ieee_single"/>
+  <reg name="f3s1" bitsize="32" type="ieee_single"/>
+  <reg name="f4s1" bitsize="32" type="ieee_single"/>
+  <reg name="f5s1" bitsize="32" type="ieee_single"/>
+  <reg name="f6s1" bitsize="32" type="ieee_single"/>
+  <reg name="f7s1" bitsize="32" type="ieee_single"/>
+  <reg name="f8s1" bitsize="32" type="ieee_single"/>
+  <reg name="f9s1" bitsize="32" type="ieee_single"/>
+  <reg name="f10s1" bitsize="32" type="ieee_single"/>
+  <reg name="f11s1" bitsize="32" type="ieee_single"/>
+  <reg name="f12s1" bitsize="32" type="ieee_single"/>
+  <reg name="f13s1" bitsize="32" type="ieee_single"/>
+  <reg name="f14s1" bitsize="32" type="ieee_single"/>
+  <reg name="f15s1" bitsize="32" type="ieee_single"/>
+  <reg name="f16s1" bitsize="32" type="ieee_single"/>
+  <reg name="f17s1" bitsize="32" type="ieee_single"/>
+  <reg name="f18s1" bitsize="32" type="ieee_single"/>
+  <reg name="f19s1" bitsize="32" type="ieee_single"/>
+  <reg name="f20s1" bitsize="32" type="ieee_single"/>
+  <reg name="f21s1" bitsize="32" type="ieee_single"/>
+  <reg name="f22s1" bitsize="32" type="ieee_single"/>
+  <reg name="f23s1" bitsize="32" type="ieee_single"/>
+  <reg name="f24s1" bitsize="32" type="ieee_single"/>
+  <reg name="f25s1" bitsize="32" type="ieee_single"/>
+  <reg name="f26s1" bitsize="32" type="ieee_single"/>
+  <reg name="f27s1" bitsize="32" type="ieee_single"/>
+  <reg name="f28s1" bitsize="32" type="ieee_single"/>
+  <reg name="f29s1" bitsize="32" type="ieee_single"/>
+  <reg name="f30s1" bitsize="32" type="ieee_single"/>
+  <reg name="f31s1" bitsize="32" type="ieee_single"/>
+
+  <reg name="fcsrs1" bitsize="32" group="float"/>
+  <reg name="firs1" bitsize="32" group="float"/>
+</feature>
diff --git a/main/coregrind/m_gdbserver/mips-fpu-valgrind-s2.xml b/main/coregrind/m_gdbserver/mips-fpu-valgrind-s2.xml
new file mode 100644
index 0000000..3a50143
--- /dev/null
+++ b/main/coregrind/m_gdbserver/mips-fpu-valgrind-s2.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.mips.fpu.valgrind.s2">
+  <reg name="f0s2" bitsize="32" type="ieee_single" regnum="38"/>
+  <reg name="f1s2" bitsize="32" type="ieee_single"/>
+  <reg name="f2s2" bitsize="32" type="ieee_single"/>
+  <reg name="f3s2" bitsize="32" type="ieee_single"/>
+  <reg name="f4s2" bitsize="32" type="ieee_single"/>
+  <reg name="f5s2" bitsize="32" type="ieee_single"/>
+  <reg name="f6s2" bitsize="32" type="ieee_single"/>
+  <reg name="f7s2" bitsize="32" type="ieee_single"/>
+  <reg name="f8s2" bitsize="32" type="ieee_single"/>
+  <reg name="f9s2" bitsize="32" type="ieee_single"/>
+  <reg name="f10s2" bitsize="32" type="ieee_single"/>
+  <reg name="f11s2" bitsize="32" type="ieee_single"/>
+  <reg name="f12s2" bitsize="32" type="ieee_single"/>
+  <reg name="f13s2" bitsize="32" type="ieee_single"/>
+  <reg name="f14s2" bitsize="32" type="ieee_single"/>
+  <reg name="f15s2" bitsize="32" type="ieee_single"/>
+  <reg name="f16s2" bitsize="32" type="ieee_single"/>
+  <reg name="f17s2" bitsize="32" type="ieee_single"/>
+  <reg name="f18s2" bitsize="32" type="ieee_single"/>
+  <reg name="f19s2" bitsize="32" type="ieee_single"/>
+  <reg name="f20s2" bitsize="32" type="ieee_single"/>
+  <reg name="f21s2" bitsize="32" type="ieee_single"/>
+  <reg name="f22s2" bitsize="32" type="ieee_single"/>
+  <reg name="f23s2" bitsize="32" type="ieee_single"/>
+  <reg name="f24s2" bitsize="32" type="ieee_single"/>
+  <reg name="f25s2" bitsize="32" type="ieee_single"/>
+  <reg name="f26s2" bitsize="32" type="ieee_single"/>
+  <reg name="f27s2" bitsize="32" type="ieee_single"/>
+  <reg name="f28s2" bitsize="32" type="ieee_single"/>
+  <reg name="f29s2" bitsize="32" type="ieee_single"/>
+  <reg name="f30s2" bitsize="32" type="ieee_single"/>
+  <reg name="f31s2" bitsize="32" type="ieee_single"/>
+
+  <reg name="fcsrs2" bitsize="32" group="float"/>
+  <reg name="firs2" bitsize="32" group="float"/>
+</feature>
diff --git a/main/coregrind/m_gdbserver/mips-fpu.xml b/main/coregrind/m_gdbserver/mips-fpu.xml
new file mode 100644
index 0000000..fc371c6
--- /dev/null
+++ b/main/coregrind/m_gdbserver/mips-fpu.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.mips.fpu">
+  <reg name="f0" bitsize="32" type="ieee_single" regnum="38"/>
+  <reg name="f1" bitsize="32" type="ieee_single"/>
+  <reg name="f2" bitsize="32" type="ieee_single"/>
+  <reg name="f3" bitsize="32" type="ieee_single"/>
+  <reg name="f4" bitsize="32" type="ieee_single"/>
+  <reg name="f5" bitsize="32" type="ieee_single"/>
+  <reg name="f6" bitsize="32" type="ieee_single"/>
+  <reg name="f7" bitsize="32" type="ieee_single"/>
+  <reg name="f8" bitsize="32" type="ieee_single"/>
+  <reg name="f9" bitsize="32" type="ieee_single"/>
+  <reg name="f10" bitsize="32" type="ieee_single"/>
+  <reg name="f11" bitsize="32" type="ieee_single"/>
+  <reg name="f12" bitsize="32" type="ieee_single"/>
+  <reg name="f13" bitsize="32" type="ieee_single"/>
+  <reg name="f14" bitsize="32" type="ieee_single"/>
+  <reg name="f15" bitsize="32" type="ieee_single"/>
+  <reg name="f16" bitsize="32" type="ieee_single"/>
+  <reg name="f17" bitsize="32" type="ieee_single"/>
+  <reg name="f18" bitsize="32" type="ieee_single"/>
+  <reg name="f19" bitsize="32" type="ieee_single"/>
+  <reg name="f20" bitsize="32" type="ieee_single"/>
+  <reg name="f21" bitsize="32" type="ieee_single"/>
+  <reg name="f22" bitsize="32" type="ieee_single"/>
+  <reg name="f23" bitsize="32" type="ieee_single"/>
+  <reg name="f24" bitsize="32" type="ieee_single"/>
+  <reg name="f25" bitsize="32" type="ieee_single"/>
+  <reg name="f26" bitsize="32" type="ieee_single"/>
+  <reg name="f27" bitsize="32" type="ieee_single"/>
+  <reg name="f28" bitsize="32" type="ieee_single"/>
+  <reg name="f29" bitsize="32" type="ieee_single"/>
+  <reg name="f30" bitsize="32" type="ieee_single"/>
+  <reg name="f31" bitsize="32" type="ieee_single"/>
+
+  <reg name="fcsr" bitsize="32" group="float"/>
+  <reg name="fir" bitsize="32" group="float"/>
+</feature>
diff --git a/main/coregrind/m_gdbserver/mips-linux-valgrind.xml b/main/coregrind/m_gdbserver/mips-linux-valgrind.xml
new file mode 100644
index 0000000..b18c623
--- /dev/null
+++ b/main/coregrind/m_gdbserver/mips-linux-valgrind.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<target>
+  <architecture>mips</architecture>
+  <osabi>GNU/Linux</osabi>
+  <xi:include href="mips-cpu.xml"/>
+  <xi:include href="mips-cp0.xml"/>
+  <xi:include href="mips-fpu.xml"/>
+  <xi:include href="mips-cpu-valgrind-s1.xml"/>
+  <xi:include href="mips-cp0-valgrind-s1.xml"/>
+  <xi:include href="mips-fpu-valgrind-s1.xml"/>
+  <xi:include href="mips-cpu-valgrind-s2.xml"/>
+  <xi:include href="mips-cp0-valgrind-s2.xml"/>
+  <xi:include href="mips-fpu-valgrind-s2.xml"/>
+
+  <feature name="org.gnu.gdb.mips.linux">
+    <reg name="restart" bitsize="32" group="system"/>
+  </feature>
+</target>
diff --git a/main/coregrind/m_gdbserver/mips-linux.xml b/main/coregrind/m_gdbserver/mips-linux.xml
new file mode 100644
index 0000000..73fb432
--- /dev/null
+++ b/main/coregrind/m_gdbserver/mips-linux.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<target>
+  <architecture>mips</architecture>
+  <osabi>GNU/Linux</osabi>
+  <xi:include href="mips-cpu.xml"/>
+  <xi:include href="mips-cp0.xml"/>
+  <xi:include href="mips-fpu.xml"/>
+
+  <feature name="org.gnu.gdb.mips.linux">
+    <reg name="restart" bitsize="32" group="system"/>
+  </feature>
+</target>
diff --git a/main/coregrind/m_gdbserver/power-core-valgrind-s1.xml b/main/coregrind/m_gdbserver/power-core-valgrind-s1.xml
new file mode 100644
index 0000000..b667df8
--- /dev/null
+++ b/main/coregrind/m_gdbserver/power-core-valgrind-s1.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.power.core-valgrind-s1">
+  <reg name="r0s1" bitsize="32" type="uint32"/>
+  <reg name="r1s1" bitsize="32" type="uint32"/>
+  <reg name="r2s1" bitsize="32" type="uint32"/>
+  <reg name="r3s1" bitsize="32" type="uint32"/>
+  <reg name="r4s1" bitsize="32" type="uint32"/>
+  <reg name="r5s1" bitsize="32" type="uint32"/>
+  <reg name="r6s1" bitsize="32" type="uint32"/>
+  <reg name="r7s1" bitsize="32" type="uint32"/>
+  <reg name="r8s1" bitsize="32" type="uint32"/>
+  <reg name="r9s1" bitsize="32" type="uint32"/>
+  <reg name="r10s1" bitsize="32" type="uint32"/>
+  <reg name="r11s1" bitsize="32" type="uint32"/>
+  <reg name="r12s1" bitsize="32" type="uint32"/>
+  <reg name="r13s1" bitsize="32" type="uint32"/>
+  <reg name="r14s1" bitsize="32" type="uint32"/>
+  <reg name="r15s1" bitsize="32" type="uint32"/>
+  <reg name="r16s1" bitsize="32" type="uint32"/>
+  <reg name="r17s1" bitsize="32" type="uint32"/>
+  <reg name="r18s1" bitsize="32" type="uint32"/>
+  <reg name="r19s1" bitsize="32" type="uint32"/>
+  <reg name="r20s1" bitsize="32" type="uint32"/>
+  <reg name="r21s1" bitsize="32" type="uint32"/>
+  <reg name="r22s1" bitsize="32" type="uint32"/>
+  <reg name="r23s1" bitsize="32" type="uint32"/>
+  <reg name="r24s1" bitsize="32" type="uint32"/>
+  <reg name="r25s1" bitsize="32" type="uint32"/>
+  <reg name="r26s1" bitsize="32" type="uint32"/>
+  <reg name="r27s1" bitsize="32" type="uint32"/>
+  <reg name="r28s1" bitsize="32" type="uint32"/>
+  <reg name="r29s1" bitsize="32" type="uint32"/>
+  <reg name="r30s1" bitsize="32" type="uint32"/>
+  <reg name="r31s1" bitsize="32" type="uint32"/>
+
+  <reg name="pcs1" bitsize="32" type="code_ptr" regnum="64"/>
+  <reg name="msrs1" bitsize="32" type="uint32"/>
+  <reg name="crs1" bitsize="32" type="uint32"/>
+  <reg name="lrs1" bitsize="32" type="code_ptr"/>
+  <reg name="ctrs1" bitsize="32" type="uint32"/>
+  <reg name="xers1" bitsize="32" type="uint32"/>
+</feature>
diff --git a/main/coregrind/m_gdbserver/power-core-valgrind-s2.xml b/main/coregrind/m_gdbserver/power-core-valgrind-s2.xml
new file mode 100644
index 0000000..c361117
--- /dev/null
+++ b/main/coregrind/m_gdbserver/power-core-valgrind-s2.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.power.core-valgrind-s2">
+  <reg name="r0s2" bitsize="32" type="uint32"/>
+  <reg name="r1s2" bitsize="32" type="uint32"/>
+  <reg name="r2s2" bitsize="32" type="uint32"/>
+  <reg name="r3s2" bitsize="32" type="uint32"/>
+  <reg name="r4s2" bitsize="32" type="uint32"/>
+  <reg name="r5s2" bitsize="32" type="uint32"/>
+  <reg name="r6s2" bitsize="32" type="uint32"/>
+  <reg name="r7s2" bitsize="32" type="uint32"/>
+  <reg name="r8s2" bitsize="32" type="uint32"/>
+  <reg name="r9s2" bitsize="32" type="uint32"/>
+  <reg name="r10s2" bitsize="32" type="uint32"/>
+  <reg name="r11s2" bitsize="32" type="uint32"/>
+  <reg name="r12s2" bitsize="32" type="uint32"/>
+  <reg name="r13s2" bitsize="32" type="uint32"/>
+  <reg name="r14s2" bitsize="32" type="uint32"/>
+  <reg name="r15s2" bitsize="32" type="uint32"/>
+  <reg name="r16s2" bitsize="32" type="uint32"/>
+  <reg name="r17s2" bitsize="32" type="uint32"/>
+  <reg name="r18s2" bitsize="32" type="uint32"/>
+  <reg name="r19s2" bitsize="32" type="uint32"/>
+  <reg name="r20s2" bitsize="32" type="uint32"/>
+  <reg name="r21s2" bitsize="32" type="uint32"/>
+  <reg name="r22s2" bitsize="32" type="uint32"/>
+  <reg name="r23s2" bitsize="32" type="uint32"/>
+  <reg name="r24s2" bitsize="32" type="uint32"/>
+  <reg name="r25s2" bitsize="32" type="uint32"/>
+  <reg name="r26s2" bitsize="32" type="uint32"/>
+  <reg name="r27s2" bitsize="32" type="uint32"/>
+  <reg name="r28s2" bitsize="32" type="uint32"/>
+  <reg name="r29s2" bitsize="32" type="uint32"/>
+  <reg name="r30s2" bitsize="32" type="uint32"/>
+  <reg name="r31s2" bitsize="32" type="uint32"/>
+
+  <reg name="pcs2" bitsize="32" type="code_ptr" regnum="64"/>
+  <reg name="msrs2" bitsize="32" type="uint32"/>
+  <reg name="crs2" bitsize="32" type="uint32"/>
+  <reg name="lrs2" bitsize="32" type="code_ptr"/>
+  <reg name="ctrs2" bitsize="32" type="uint32"/>
+  <reg name="xers2" bitsize="32" type="uint32"/>
+</feature>
diff --git a/main/coregrind/m_gdbserver/power-fpu-valgrind-s1.xml b/main/coregrind/m_gdbserver/power-fpu-valgrind-s1.xml
index 01b852e..00d9108 100644
--- a/main/coregrind/m_gdbserver/power-fpu-valgrind-s1.xml
+++ b/main/coregrind/m_gdbserver/power-fpu-valgrind-s1.xml
@@ -7,38 +7,38 @@
 
 <!DOCTYPE feature SYSTEM "gdb-target.dtd">
 <feature name="org.gnu.gdb.power.fpu-valgrind-s1">
-  <reg name="f0s1" bitsize="64" type="ieee_double" regnum="32"/>
-  <reg name="f1s1" bitsize="64" type="ieee_double"/>
-  <reg name="f2s1" bitsize="64" type="ieee_double"/>
-  <reg name="f3s1" bitsize="64" type="ieee_double"/>
-  <reg name="f4s1" bitsize="64" type="ieee_double"/>
-  <reg name="f5s1" bitsize="64" type="ieee_double"/>
-  <reg name="f6s1" bitsize="64" type="ieee_double"/>
-  <reg name="f7s1" bitsize="64" type="ieee_double"/>
-  <reg name="f8s1" bitsize="64" type="ieee_double"/>
-  <reg name="f9s1" bitsize="64" type="ieee_double"/>
-  <reg name="f10s1" bitsize="64" type="ieee_double"/>
-  <reg name="f11s1" bitsize="64" type="ieee_double"/>
-  <reg name="f12s1" bitsize="64" type="ieee_double"/>
-  <reg name="f13s1" bitsize="64" type="ieee_double"/>
-  <reg name="f14s1" bitsize="64" type="ieee_double"/>
-  <reg name="f15s1" bitsize="64" type="ieee_double"/>
-  <reg name="f16s1" bitsize="64" type="ieee_double"/>
-  <reg name="f17s1" bitsize="64" type="ieee_double"/>
-  <reg name="f18s1" bitsize="64" type="ieee_double"/>
-  <reg name="f19s1" bitsize="64" type="ieee_double"/>
-  <reg name="f20s1" bitsize="64" type="ieee_double"/>
-  <reg name="f21s1" bitsize="64" type="ieee_double"/>
-  <reg name="f22s1" bitsize="64" type="ieee_double"/>
-  <reg name="f23s1" bitsize="64" type="ieee_double"/>
-  <reg name="f24s1" bitsize="64" type="ieee_double"/>
-  <reg name="f25s1" bitsize="64" type="ieee_double"/>
-  <reg name="f26s1" bitsize="64" type="ieee_double"/>
-  <reg name="f27s1" bitsize="64" type="ieee_double"/>
-  <reg name="f28s1" bitsize="64" type="ieee_double"/>
-  <reg name="f29s1" bitsize="64" type="ieee_double"/>
-  <reg name="f30s1" bitsize="64" type="ieee_double"/>
-  <reg name="f31s1" bitsize="64" type="ieee_double"/>
+  <reg name="f0s1" bitsize="64" type="uint64" regnum="32"/>
+  <reg name="f1s1" bitsize="64" type="uint64"/>
+  <reg name="f2s1" bitsize="64" type="uint64"/>
+  <reg name="f3s1" bitsize="64" type="uint64"/>
+  <reg name="f4s1" bitsize="64" type="uint64"/>
+  <reg name="f5s1" bitsize="64" type="uint64"/>
+  <reg name="f6s1" bitsize="64" type="uint64"/>
+  <reg name="f7s1" bitsize="64" type="uint64"/>
+  <reg name="f8s1" bitsize="64" type="uint64"/>
+  <reg name="f9s1" bitsize="64" type="uint64"/>
+  <reg name="f10s1" bitsize="64" type="uint64"/>
+  <reg name="f11s1" bitsize="64" type="uint64"/>
+  <reg name="f12s1" bitsize="64" type="uint64"/>
+  <reg name="f13s1" bitsize="64" type="uint64"/>
+  <reg name="f14s1" bitsize="64" type="uint64"/>
+  <reg name="f15s1" bitsize="64" type="uint64"/>
+  <reg name="f16s1" bitsize="64" type="uint64"/>
+  <reg name="f17s1" bitsize="64" type="uint64"/>
+  <reg name="f18s1" bitsize="64" type="uint64"/>
+  <reg name="f19s1" bitsize="64" type="uint64"/>
+  <reg name="f20s1" bitsize="64" type="uint64"/>
+  <reg name="f21s1" bitsize="64" type="uint64"/>
+  <reg name="f22s1" bitsize="64" type="uint64"/>
+  <reg name="f23s1" bitsize="64" type="uint64"/>
+  <reg name="f24s1" bitsize="64" type="uint64"/>
+  <reg name="f25s1" bitsize="64" type="uint64"/>
+  <reg name="f26s1" bitsize="64" type="uint64"/>
+  <reg name="f27s1" bitsize="64" type="uint64"/>
+  <reg name="f28s1" bitsize="64" type="uint64"/>
+  <reg name="f29s1" bitsize="64" type="uint64"/>
+  <reg name="f30s1" bitsize="64" type="uint64"/>
+  <reg name="f31s1" bitsize="64" type="uint64"/>
 
   <reg name="fpscrs1" bitsize="32" group="float" regnum="70"/>
 </feature>
diff --git a/main/coregrind/m_gdbserver/power-fpu-valgrind-s2.xml b/main/coregrind/m_gdbserver/power-fpu-valgrind-s2.xml
index 2db1a4a..a12fa6e 100644
--- a/main/coregrind/m_gdbserver/power-fpu-valgrind-s2.xml
+++ b/main/coregrind/m_gdbserver/power-fpu-valgrind-s2.xml
@@ -7,38 +7,38 @@
 
 <!DOCTYPE feature SYSTEM "gdb-target.dtd">
 <feature name="org.gnu.gdb.power.fpu-valgrind-s2">
-  <reg name="f0s2" bitsize="64" type="ieee_double" regnum="32"/>
-  <reg name="f1s2" bitsize="64" type="ieee_double"/>
-  <reg name="f2s2" bitsize="64" type="ieee_double"/>
-  <reg name="f3s2" bitsize="64" type="ieee_double"/>
-  <reg name="f4s2" bitsize="64" type="ieee_double"/>
-  <reg name="f5s2" bitsize="64" type="ieee_double"/>
-  <reg name="f6s2" bitsize="64" type="ieee_double"/>
-  <reg name="f7s2" bitsize="64" type="ieee_double"/>
-  <reg name="f8s2" bitsize="64" type="ieee_double"/>
-  <reg name="f9s2" bitsize="64" type="ieee_double"/>
-  <reg name="f10s2" bitsize="64" type="ieee_double"/>
-  <reg name="f11s2" bitsize="64" type="ieee_double"/>
-  <reg name="f12s2" bitsize="64" type="ieee_double"/>
-  <reg name="f13s2" bitsize="64" type="ieee_double"/>
-  <reg name="f14s2" bitsize="64" type="ieee_double"/>
-  <reg name="f15s2" bitsize="64" type="ieee_double"/>
-  <reg name="f16s2" bitsize="64" type="ieee_double"/>
-  <reg name="f17s2" bitsize="64" type="ieee_double"/>
-  <reg name="f18s2" bitsize="64" type="ieee_double"/>
-  <reg name="f19s2" bitsize="64" type="ieee_double"/>
-  <reg name="f20s2" bitsize="64" type="ieee_double"/>
-  <reg name="f21s2" bitsize="64" type="ieee_double"/>
-  <reg name="f22s2" bitsize="64" type="ieee_double"/>
-  <reg name="f23s2" bitsize="64" type="ieee_double"/>
-  <reg name="f24s2" bitsize="64" type="ieee_double"/>
-  <reg name="f25s2" bitsize="64" type="ieee_double"/>
-  <reg name="f26s2" bitsize="64" type="ieee_double"/>
-  <reg name="f27s2" bitsize="64" type="ieee_double"/>
-  <reg name="f28s2" bitsize="64" type="ieee_double"/>
-  <reg name="f29s2" bitsize="64" type="ieee_double"/>
-  <reg name="f30s2" bitsize="64" type="ieee_double"/>
-  <reg name="f31s2" bitsize="64" type="ieee_double"/>
+  <reg name="f0s2" bitsize="64" type="uint64" regnum="32"/>
+  <reg name="f1s2" bitsize="64" type="uint64"/>
+  <reg name="f2s2" bitsize="64" type="uint64"/>
+  <reg name="f3s2" bitsize="64" type="uint64"/>
+  <reg name="f4s2" bitsize="64" type="uint64"/>
+  <reg name="f5s2" bitsize="64" type="uint64"/>
+  <reg name="f6s2" bitsize="64" type="uint64"/>
+  <reg name="f7s2" bitsize="64" type="uint64"/>
+  <reg name="f8s2" bitsize="64" type="uint64"/>
+  <reg name="f9s2" bitsize="64" type="uint64"/>
+  <reg name="f10s2" bitsize="64" type="uint64"/>
+  <reg name="f11s2" bitsize="64" type="uint64"/>
+  <reg name="f12s2" bitsize="64" type="uint64"/>
+  <reg name="f13s2" bitsize="64" type="uint64"/>
+  <reg name="f14s2" bitsize="64" type="uint64"/>
+  <reg name="f15s2" bitsize="64" type="uint64"/>
+  <reg name="f16s2" bitsize="64" type="uint64"/>
+  <reg name="f17s2" bitsize="64" type="uint64"/>
+  <reg name="f18s2" bitsize="64" type="uint64"/>
+  <reg name="f19s2" bitsize="64" type="uint64"/>
+  <reg name="f20s2" bitsize="64" type="uint64"/>
+  <reg name="f21s2" bitsize="64" type="uint64"/>
+  <reg name="f22s2" bitsize="64" type="uint64"/>
+  <reg name="f23s2" bitsize="64" type="uint64"/>
+  <reg name="f24s2" bitsize="64" type="uint64"/>
+  <reg name="f25s2" bitsize="64" type="uint64"/>
+  <reg name="f26s2" bitsize="64" type="uint64"/>
+  <reg name="f27s2" bitsize="64" type="uint64"/>
+  <reg name="f28s2" bitsize="64" type="uint64"/>
+  <reg name="f29s2" bitsize="64" type="uint64"/>
+  <reg name="f30s2" bitsize="64" type="uint64"/>
+  <reg name="f31s2" bitsize="64" type="uint64"/>
 
   <reg name="fpscrs2" bitsize="32" group="float" regnum="70"/>
 </feature>
diff --git a/main/coregrind/m_gdbserver/regcache.c b/main/coregrind/m_gdbserver/regcache.c
index a920231..477c208 100644
--- a/main/coregrind/m_gdbserver/regcache.c
+++ b/main/coregrind/m_gdbserver/regcache.c
@@ -54,7 +54,7 @@
 
    /* FIXME - fetch registers for INF */
    if (fetch && regcache->registers_valid == 0) {
-      fetch_inferior_registers (0);
+      valgrind_fetch_registers (0);
       regcache->registers_valid = 1;
    }
 
@@ -72,7 +72,7 @@
       struct thread_info *saved_inferior = current_inferior;
 
       current_inferior = thread;
-      store_inferior_registers (-1);
+      valgrind_store_registers (-1);
       current_inferior = saved_inferior;
    }
 
diff --git a/main/coregrind/m_gdbserver/remote-utils.c b/main/coregrind/m_gdbserver/remote-utils.c
index d1ae548..009f327 100644
--- a/main/coregrind/m_gdbserver/remote-utils.c
+++ b/main/coregrind/m_gdbserver/remote-utils.c
@@ -196,7 +196,7 @@
 void safe_mknod (char *nod)
 {
    SysRes m;
-   m = VG_(mknod) (nod, VKI_S_IFIFO|0666, 0);
+   m = VG_(mknod) (nod, VKI_S_IFIFO|0600, 0);
    if (sr_isError (m)) {
       if (sr_Err (m) == VKI_EEXIST) {
          if (VG_(clo_verbosity) > 1) {
@@ -224,10 +224,11 @@
    const HChar *user, *host;
    int save_fcntl_flags, len;
    VgdbShared vgdbinit = 
-      {0, 0, 0, (Addr) VG_(invoke_gdbserver),
+      {0, 0, (Addr) VG_(invoke_gdbserver),
        (Addr) VG_(threads), sizeof(ThreadState), 
        offsetof(ThreadState, status),
-       offsetof(ThreadState, os_state) + offsetof(ThreadOSstate, lwpid)};
+       offsetof(ThreadState, os_state) + offsetof(ThreadOSstate, lwpid),
+       0};
    const int pid = VG_(getpid)();
    const int name_default = strcmp(name, VG_(vgdb_prefix_default)()) == 0;
    Addr addr_shared;
@@ -269,7 +270,7 @@
                 "don't want to do, unless you know exactly what you're doing,\n"
                 "or are doing some strange experiment):\n"
                 "  %s/../../bin/vgdb --pid=%d%s%s ...command...\n",
-                VG_LIBDIR,
+                VG_(libdir),
                 pid, (name_default ? "" : " --vgdb-prefix="),
                 (name_default ? "" : name));
    }
@@ -282,7 +283,7 @@
          "and then give GDB the following command\n"
          "  target remote | %s/../../bin/vgdb --pid=%d%s%s\n",
          VG_(args_the_exename),
-         VG_LIBDIR,
+         VG_(libdir),
          pid, (name_default ? "" : " --vgdb-prefix="), 
          (name_default ? "" : name)
       );
@@ -306,7 +307,7 @@
 
       pid_from_to_creator = pid;
       
-      o = VG_(open) (shared_mem, VKI_O_CREAT|VKI_O_RDWR, 0666);
+      o = VG_(open) (shared_mem, VKI_O_CREAT|VKI_O_RDWR, 0600);
       if (sr_isError (o)) {
          sr_perror(o, "cannot create shared_mem file %s\n", shared_mem);
          fatal("");
@@ -541,6 +542,29 @@
   return i;
 }
 
+/* builds an image of bin according to byte order of the architecture 
+   Useful for register and int image */
+char* heximage (char *buf, char *bin, int count)
+{
+#if defined(VGA_x86) || defined(VGA_amd64)
+   char rev[count]; 
+   /* note: no need for trailing \0, length is known with count */
+  int i;
+  for (i = 0; i < count; i++)
+    rev[i] = bin[count - i - 1];
+  hexify (buf, rev, count);
+#else
+  hexify (buf, bin, count);
+#endif
+  return buf;
+}
+
+void* C2v(CORE_ADDR addr)
+{
+   return (void*) addr;
+}
+
+
 /* Convert BUFFER, binary data at least LEN bytes long, into escaped
    binary data in OUT_BUF.  Set *OUT_LEN to the length of the data
    encoded in OUT_BUF, and return the number of bytes in OUT_BUF
@@ -728,7 +752,7 @@
 
       /* Check for an input interrupt while we're here.  */
       if (cc == '\003')
-         (*the_target->send_signal) (VKI_SIGINT);
+         dlog(1, "Received 0x03 character (SIGINT)\n");
    }
    while (cc != '+');
 
@@ -961,15 +985,14 @@
    if (status == 'T') {
       const char **regp = gdbserver_expedite_regs;
       
-      if (the_target->stopped_by_watchpoint != NULL
-	  && (*the_target->stopped_by_watchpoint) ()) {
+      if (valgrind_stopped_by_watchpoint()) {
          CORE_ADDR addr;
          int i;
 
          strncpy (buf, "watch:", 6);
          buf += 6;
 
-         addr = (*the_target->stopped_data_address) ();
+         addr = valgrind_stopped_data_address ();
 
          /* Convert each byte of the address into two hexadecimal chars.
             Note that we take sizeof (void *) instead of sizeof (addr);
@@ -1079,13 +1102,13 @@
 HChar *
 VG_(vgdb_prefix_default)(void)
 {
-   const HChar *tmpdir;
-   HChar *prefix;
+   static HChar *prefix;
    
-   tmpdir = VG_(tmpdir)();
-   prefix = malloc(strlen(tmpdir) + strlen("/vgdb-pipe") + 1);
-   strcpy(prefix, tmpdir);
-   strcat(prefix, "/vgdb-pipe");
-
+   if (prefix == NULL) {
+     const HChar *tmpdir = VG_(tmpdir)();
+     prefix = malloc(strlen(tmpdir) + strlen("/vgdb-pipe") + 1);
+     strcpy(prefix, tmpdir);
+     strcat(prefix, "/vgdb-pipe");
+   }
    return prefix;
 }
diff --git a/main/coregrind/m_gdbserver/s390-acr-valgrind-s1.xml b/main/coregrind/m_gdbserver/s390-acr-valgrind-s1.xml
new file mode 100644
index 0000000..77b63b1
--- /dev/null
+++ b/main/coregrind/m_gdbserver/s390-acr-valgrind-s1.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2010-2012 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.s390.acr-valgrind-s1">
+  <reg name="acr0s1" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr1s1" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr2s1" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr3s1" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr4s1" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr5s1" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr6s1" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr7s1" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr8s1" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr9s1" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr10s1" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr11s1" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr12s1" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr13s1" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr14s1" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr15s1" bitsize="32" type="uint32" group="access"/>
+</feature>
diff --git a/main/coregrind/m_gdbserver/s390-acr-valgrind-s2.xml b/main/coregrind/m_gdbserver/s390-acr-valgrind-s2.xml
new file mode 100644
index 0000000..5124e48
--- /dev/null
+++ b/main/coregrind/m_gdbserver/s390-acr-valgrind-s2.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2010-2012 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.s390.acr-valgrind-s2">
+  <reg name="acr0s2" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr1s2" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr2s2" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr3s2" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr4s2" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr5s2" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr6s2" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr7s2" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr8s2" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr9s2" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr10s2" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr11s2" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr12s2" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr13s2" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr14s2" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr15s2" bitsize="32" type="uint32" group="access"/>
+</feature>
diff --git a/main/coregrind/m_gdbserver/s390-acr.xml b/main/coregrind/m_gdbserver/s390-acr.xml
new file mode 100644
index 0000000..a7e9a17
--- /dev/null
+++ b/main/coregrind/m_gdbserver/s390-acr.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2010-2012 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.s390.acr">
+  <reg name="acr0" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr1" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr2" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr3" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr4" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr5" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr6" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr7" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr8" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr9" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr10" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr11" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr12" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr13" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr14" bitsize="32" type="uint32" group="access"/>
+  <reg name="acr15" bitsize="32" type="uint32" group="access"/>
+</feature>
diff --git a/main/coregrind/m_gdbserver/s390-fpr-valgrind-s1.xml b/main/coregrind/m_gdbserver/s390-fpr-valgrind-s1.xml
new file mode 100644
index 0000000..afc2b95
--- /dev/null
+++ b/main/coregrind/m_gdbserver/s390-fpr-valgrind-s1.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2010-2012 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.s390.fpr-valgrind-s1">
+  <reg name="fpcs1" bitsize="32" type="uint32" group="float"/>
+  <reg name="f0s1" bitsize="64" type="uint64" group="float"/>
+  <reg name="f1s1" bitsize="64" type="uint64" group="float"/>
+  <reg name="f2s1" bitsize="64" type="uint64" group="float"/>
+  <reg name="f3s1" bitsize="64" type="uint64" group="float"/>
+  <reg name="f4s1" bitsize="64" type="uint64" group="float"/>
+  <reg name="f5s1" bitsize="64" type="uint64" group="float"/>
+  <reg name="f6s1" bitsize="64" type="uint64" group="float"/>
+  <reg name="f7s1" bitsize="64" type="uint64" group="float"/>
+  <reg name="f8s1" bitsize="64" type="uint64" group="float"/>
+  <reg name="f9s1" bitsize="64" type="uint64" group="float"/>
+  <reg name="f10s1" bitsize="64" type="uint64" group="float"/>
+  <reg name="f11s1" bitsize="64" type="uint64" group="float"/>
+  <reg name="f12s1" bitsize="64" type="uint64" group="float"/>
+  <reg name="f13s1" bitsize="64" type="uint64" group="float"/>
+  <reg name="f14s1" bitsize="64" type="uint64" group="float"/>
+  <reg name="f15s1" bitsize="64" type="uint64" group="float"/>
+</feature>
diff --git a/main/coregrind/m_gdbserver/s390-fpr-valgrind-s2.xml b/main/coregrind/m_gdbserver/s390-fpr-valgrind-s2.xml
new file mode 100644
index 0000000..7a74ce6
--- /dev/null
+++ b/main/coregrind/m_gdbserver/s390-fpr-valgrind-s2.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2010-2012 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.s390.fpr-valgrind-s2">
+  <reg name="fpcs2" bitsize="32" type="uint32" group="float"/>
+  <reg name="f0s2" bitsize="64" type="uint64" group="float"/>
+  <reg name="f1s2" bitsize="64" type="uint64" group="float"/>
+  <reg name="f2s2" bitsize="64" type="uint64" group="float"/>
+  <reg name="f3s2" bitsize="64" type="uint64" group="float"/>
+  <reg name="f4s2" bitsize="64" type="uint64" group="float"/>
+  <reg name="f5s2" bitsize="64" type="uint64" group="float"/>
+  <reg name="f6s2" bitsize="64" type="uint64" group="float"/>
+  <reg name="f7s2" bitsize="64" type="uint64" group="float"/>
+  <reg name="f8s2" bitsize="64" type="uint64" group="float"/>
+  <reg name="f9s2" bitsize="64" type="uint64" group="float"/>
+  <reg name="f10s2" bitsize="64" type="uint64" group="float"/>
+  <reg name="f11s2" bitsize="64" type="uint64" group="float"/>
+  <reg name="f12s2" bitsize="64" type="uint64" group="float"/>
+  <reg name="f13s2" bitsize="64" type="uint64" group="float"/>
+  <reg name="f14s2" bitsize="64" type="uint64" group="float"/>
+  <reg name="f15s2" bitsize="64" type="uint64" group="float"/>
+</feature>
diff --git a/main/coregrind/m_gdbserver/s390-fpr.xml b/main/coregrind/m_gdbserver/s390-fpr.xml
new file mode 100644
index 0000000..1919b60
--- /dev/null
+++ b/main/coregrind/m_gdbserver/s390-fpr.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2010-2012 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.s390.fpr">
+  <reg name="fpc" bitsize="32" type="uint32" group="float"/>
+  <reg name="f0" bitsize="64" type="ieee_double" group="float"/>
+  <reg name="f1" bitsize="64" type="ieee_double" group="float"/>
+  <reg name="f2" bitsize="64" type="ieee_double" group="float"/>
+  <reg name="f3" bitsize="64" type="ieee_double" group="float"/>
+  <reg name="f4" bitsize="64" type="ieee_double" group="float"/>
+  <reg name="f5" bitsize="64" type="ieee_double" group="float"/>
+  <reg name="f6" bitsize="64" type="ieee_double" group="float"/>
+  <reg name="f7" bitsize="64" type="ieee_double" group="float"/>
+  <reg name="f8" bitsize="64" type="ieee_double" group="float"/>
+  <reg name="f9" bitsize="64" type="ieee_double" group="float"/>
+  <reg name="f10" bitsize="64" type="ieee_double" group="float"/>
+  <reg name="f11" bitsize="64" type="ieee_double" group="float"/>
+  <reg name="f12" bitsize="64" type="ieee_double" group="float"/>
+  <reg name="f13" bitsize="64" type="ieee_double" group="float"/>
+  <reg name="f14" bitsize="64" type="ieee_double" group="float"/>
+  <reg name="f15" bitsize="64" type="ieee_double" group="float"/>
+</feature>
diff --git a/main/coregrind/m_gdbserver/s390x-core64-valgrind-s1.xml b/main/coregrind/m_gdbserver/s390x-core64-valgrind-s1.xml
new file mode 100644
index 0000000..ee19b13
--- /dev/null
+++ b/main/coregrind/m_gdbserver/s390x-core64-valgrind-s1.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2010-2012 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.s390.core-valgrind-s1">
+  <reg name="pswms1" bitsize="64" type="uint64" group="psw"/>
+  <reg name="pswas1" bitsize="64" type="uint64" group="psw"/>
+  <reg name="r0s1" bitsize="64" type="uint64" group="general"/>
+  <reg name="r1s1" bitsize="64" type="uint64" group="general"/>
+  <reg name="r2s1" bitsize="64" type="uint64" group="general"/>
+  <reg name="r3s1" bitsize="64" type="uint64" group="general"/>
+  <reg name="r4s1" bitsize="64" type="uint64" group="general"/>
+  <reg name="r5s1" bitsize="64" type="uint64" group="general"/>
+  <reg name="r6s1" bitsize="64" type="uint64" group="general"/>
+  <reg name="r7s1" bitsize="64" type="uint64" group="general"/>
+  <reg name="r8s1" bitsize="64" type="uint64" group="general"/>
+  <reg name="r9s1" bitsize="64" type="uint64" group="general"/>
+  <reg name="r10s1" bitsize="64" type="uint64" group="general"/>
+  <reg name="r11s1" bitsize="64" type="uint64" group="general"/>
+  <reg name="r12s1" bitsize="64" type="uint64" group="general"/>
+  <reg name="r13s1" bitsize="64" type="uint64" group="general"/>
+  <reg name="r14s1" bitsize="64" type="uint64" group="general"/>
+  <reg name="r15s1" bitsize="64" type="uint64" group="general"/>
+</feature>
diff --git a/main/coregrind/m_gdbserver/s390x-core64-valgrind-s2.xml b/main/coregrind/m_gdbserver/s390x-core64-valgrind-s2.xml
new file mode 100644
index 0000000..90b373b
--- /dev/null
+++ b/main/coregrind/m_gdbserver/s390x-core64-valgrind-s2.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2010-2012 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.s390.core-valgrind-s2">
+  <reg name="pswms2" bitsize="64" type="uint64" group="psw"/>
+  <reg name="pswas2" bitsize="64" type="uint64" group="psw"/>
+  <reg name="r0s2" bitsize="64" type="uint64" group="general"/>
+  <reg name="r1s2" bitsize="64" type="uint64" group="general"/>
+  <reg name="r2s2" bitsize="64" type="uint64" group="general"/>
+  <reg name="r3s2" bitsize="64" type="uint64" group="general"/>
+  <reg name="r4s2" bitsize="64" type="uint64" group="general"/>
+  <reg name="r5s2" bitsize="64" type="uint64" group="general"/>
+  <reg name="r6s2" bitsize="64" type="uint64" group="general"/>
+  <reg name="r7s2" bitsize="64" type="uint64" group="general"/>
+  <reg name="r8s2" bitsize="64" type="uint64" group="general"/>
+  <reg name="r9s2" bitsize="64" type="uint64" group="general"/>
+  <reg name="r10s2" bitsize="64" type="uint64" group="general"/>
+  <reg name="r11s2" bitsize="64" type="uint64" group="general"/>
+  <reg name="r12s2" bitsize="64" type="uint64" group="general"/>
+  <reg name="r13s2" bitsize="64" type="uint64" group="general"/>
+  <reg name="r14s2" bitsize="64" type="uint64" group="general"/>
+  <reg name="r15s2" bitsize="64" type="uint64" group="general"/>
+</feature>
diff --git a/main/coregrind/m_gdbserver/s390x-core64.xml b/main/coregrind/m_gdbserver/s390x-core64.xml
new file mode 100644
index 0000000..06f786c
--- /dev/null
+++ b/main/coregrind/m_gdbserver/s390x-core64.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2010-2012 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.s390.core">
+  <reg name="pswm" bitsize="64" type="uint64" group="psw"/>
+  <reg name="pswa" bitsize="64" type="uint64" group="psw"/>
+  <reg name="r0" bitsize="64" type="uint64" group="general"/>
+  <reg name="r1" bitsize="64" type="uint64" group="general"/>
+  <reg name="r2" bitsize="64" type="uint64" group="general"/>
+  <reg name="r3" bitsize="64" type="uint64" group="general"/>
+  <reg name="r4" bitsize="64" type="uint64" group="general"/>
+  <reg name="r5" bitsize="64" type="uint64" group="general"/>
+  <reg name="r6" bitsize="64" type="uint64" group="general"/>
+  <reg name="r7" bitsize="64" type="uint64" group="general"/>
+  <reg name="r8" bitsize="64" type="uint64" group="general"/>
+  <reg name="r9" bitsize="64" type="uint64" group="general"/>
+  <reg name="r10" bitsize="64" type="uint64" group="general"/>
+  <reg name="r11" bitsize="64" type="uint64" group="general"/>
+  <reg name="r12" bitsize="64" type="uint64" group="general"/>
+  <reg name="r13" bitsize="64" type="uint64" group="general"/>
+  <reg name="r14" bitsize="64" type="uint64" group="general"/>
+  <reg name="r15" bitsize="64" type="uint64" group="general"/>
+</feature>
diff --git a/main/coregrind/m_gdbserver/s390x-generic-valgrind.xml b/main/coregrind/m_gdbserver/s390x-generic-valgrind.xml
new file mode 100644
index 0000000..6457582
--- /dev/null
+++ b/main/coregrind/m_gdbserver/s390x-generic-valgrind.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2010-2012 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!-- S/390 64-bit user-level code.  -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<target>
+  <architecture>s390:64-bit</architecture>
+  <xi:include href="s390x-core64.xml"/>
+  <xi:include href="s390-acr.xml"/>
+  <xi:include href="s390-fpr.xml"/>
+  <xi:include href="s390x-linux64.xml"/>
+  <xi:include href="s390x-core64-valgrind-s1.xml"/>
+  <xi:include href="s390-acr-valgrind-s1.xml"/>
+  <xi:include href="s390-fpr-valgrind-s1.xml"/>
+  <xi:include href="s390x-linux64-valgrind-s1.xml"/>
+  <xi:include href="s390x-core64-valgrind-s2.xml"/>
+  <xi:include href="s390-acr-valgrind-s2.xml"/>
+  <xi:include href="s390-fpr-valgrind-s2.xml"/>
+  <xi:include href="s390x-linux64-valgrind-s2.xml"/>
+</target>
diff --git a/main/coregrind/m_gdbserver/s390x-generic.xml b/main/coregrind/m_gdbserver/s390x-generic.xml
new file mode 100644
index 0000000..c005a3b
--- /dev/null
+++ b/main/coregrind/m_gdbserver/s390x-generic.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2010-2012 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!-- S/390 64-bit user-level code.  -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<target>
+  <architecture>s390:64-bit</architecture>
+  <xi:include href="s390x-core64.xml"/>
+  <xi:include href="s390-acr.xml"/>
+  <xi:include href="s390-fpr.xml"/>
+  <xi:include href="s390x-linux64.xml"/>
+</target>
diff --git a/main/coregrind/m_gdbserver/s390x-linux64-valgrind-s1.xml b/main/coregrind/m_gdbserver/s390x-linux64-valgrind-s1.xml
new file mode 100644
index 0000000..23eed21
--- /dev/null
+++ b/main/coregrind/m_gdbserver/s390x-linux64-valgrind-s1.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2010-2012 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!-- S/390 64-bit user-level code.  -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.s390.linux-valgrind-s1">
+  <reg name="orig_r2s1" bitsize="64" type="uint64" group="system"/>
+</feature>
diff --git a/main/coregrind/m_gdbserver/s390x-linux64-valgrind-s2.xml b/main/coregrind/m_gdbserver/s390x-linux64-valgrind-s2.xml
new file mode 100644
index 0000000..22ac591
--- /dev/null
+++ b/main/coregrind/m_gdbserver/s390x-linux64-valgrind-s2.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2010-2012 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!-- S/390 64-bit user-level code.  -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.s390.linux-valgrind-s2">
+  <reg name="orig_r2s2" bitsize="64" type="uint64" group="system"/>
+</feature>
diff --git a/main/coregrind/m_gdbserver/s390x-linux64.xml b/main/coregrind/m_gdbserver/s390x-linux64.xml
new file mode 100644
index 0000000..7e2ec89
--- /dev/null
+++ b/main/coregrind/m_gdbserver/s390x-linux64.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2010-2012 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!-- S/390 64-bit user-level code.  -->
+
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.s390.linux">
+  <reg name="orig_r2" bitsize="64" type="uint64" group="system"/>
+</feature>
diff --git a/main/coregrind/m_gdbserver/server.c b/main/coregrind/m_gdbserver/server.c
index a1a2608..661041e 100644
--- a/main/coregrind/m_gdbserver/server.c
+++ b/main/coregrind/m_gdbserver/server.c
@@ -34,15 +34,17 @@
 unsigned long thread_from_wait;
 unsigned long old_thread_from_wait;
 
-int pass_signals[TARGET_SIGNAL_LAST];
+int pass_signals[TARGET_SIGNAL_LAST]; /* indexed by gdb signal nr */
 
 /* for a gdbserver integrated in valgrind, resuming the process consists
    in returning the control to valgrind.
+   The guess process resumes its execution.
    Then at the next error or break or ..., valgrind calls gdbserver again.
-   A resume packet must then be built.
-   resume_packet_needed records the fact that the next call to gdbserver
+   A resume reply packet must then be built to inform GDB that the
+   resume request is finished.
+   resume_reply_packet_needed records the fact that the next call to gdbserver
    must send a resume packet to gdb. */
-static Bool resume_packet_needed = False;
+static Bool resume_reply_packet_needed = False;
 
 VG_MINIMAL_JMP_BUF(toplevel);
 
@@ -171,7 +173,8 @@
       if (int_value) { VG_(gdb_printf) (
 "debugging valgrind internals monitor commands:\n"
 "  v.info gdbserver_status : show gdbserver status\n"
-"  v.info memory           : show valgrind heap memory stats\n"
+"  v.info memory [aspacemgr] : show valgrind heap memory stats\n"
+"     (with aspacemgr arg, also shows valgrind segments on log ouput)\n"
 "  v.info scheduler        : show valgrind thread state and stacktrace\n"
 "  v.set debuglog <level>  : set valgrind debug log level to <level>\n"
 "  v.translate <addr> [<traceflags>]  : debug translation of <addr> with <traceflags>\n"
@@ -246,8 +249,9 @@
          VG_(show_all_errors)(/* verbosity */ 2, /* xml */ False);
          break;
       case  1: // n_errs_found
-         VG_(gdb_printf) ("n_errs_found %d (vgdb-error %d)\n", 
+         VG_(gdb_printf) ("n_errs_found %d n_errs_shown %d (vgdb-error %d)\n", 
                           VG_(get_n_errs_found) (),
+                          VG_(get_n_errs_shown) (),
                           VG_(dyn_vgdb_error));
          break;
       case 2: // last_error
@@ -260,6 +264,18 @@
          VG_(print_all_arena_stats) ();
          if (VG_(clo_profile_heap))
             VG_(print_arena_cc_analysis) ();
+         wcmd = strtok_r (NULL, " ", &ssaveptr);
+         if (wcmd != NULL) {
+            switch (VG_(keyword_id) ("aspacemgr", wcmd, kwd_report_all)) {
+            case -2:
+            case -1: break;
+            case  0: 
+               VG_(am_show_nsegments) (0, "gdbserver v.info memory aspacemgr");
+               break;
+            default: tl_assert (0);
+            }
+         }
+
          ret = 1;
          break;
       case  5: /* scheduler */
@@ -411,7 +427,8 @@
          if (to == NULL) to = end;
          decode_address (&sig, from, to - from);
          pass_signals[(int)sig] = 1;
-         dlog(1, "pass_signal %d\n", (int)sig);
+         dlog(1, "pass_signal gdb_nr %d %s\n",
+              (int)sig, target_signal_to_name(sig));
          from = to;
          if (*from == ';') from++;
       }
@@ -515,8 +532,7 @@
       }
    }
 
-   if ( ((*the_target->target_xml)() != NULL 
-         || (*the_target->shadow_target_xml)() != NULL)
+   if (valgrind_target_xml(VG_(clo_vgdb_shadow_registers)) != NULL
         && strncmp ("qXfer:features:read:", arg_own_buf, 20) == 0) {
       CORE_ADDR ofs;
       unsigned int len, doc_len;
@@ -532,19 +548,11 @@
       }
       
       if (strcmp (annex, "target.xml") == 0) {
-         annex = NULL; // to replace it by the corresponding filename.
-
-         /* If VG_(clo_vgdb_shadow_registers), try to use
-            shadow_target_xml. Fallback to target_xml
-            if not defined. */
-         if (VG_(clo_vgdb_shadow_registers)) {
-            annex = (*the_target->shadow_target_xml)();
-            if (annex != NULL)
-               /* Ensure the shadow registers are initialized. */
-               initialize_shadow_low(True);
+         annex = valgrind_target_xml(VG_(clo_vgdb_shadow_registers));
+         if (annex != NULL && VG_(clo_vgdb_shadow_registers)) {
+            /* Ensure the shadow registers are initialized. */
+            initialize_shadow_low(True);
          }
-         if (annex == NULL)
-            annex = (*the_target->target_xml)();
          if (annex == NULL) {
             strcpy (arg_own_buf, "E00");
             return;
@@ -552,7 +560,7 @@
       }
 
       {
-         char doc[VG_(strlen)(VG_(libdir)) + 1 + VG_(strlen)(annex)];
+         char doc[VG_(strlen)(VG_(libdir)) + 1 + VG_(strlen)(annex) + 1];
          struct vg_stat stat_doc;
          char toread[len];
          int len_read;
@@ -652,8 +660,7 @@
       if (VG_(client_auxv))
          strcat (arg_own_buf, ";qXfer:auxv:read+");
 
-      if ((*the_target->target_xml)() != NULL
-          || (*the_target->shadow_target_xml)() != NULL) {
+      if (valgrind_target_xml(VG_(clo_vgdb_shadow_registers)) != NULL) {
          strcat (arg_own_buf, ";qXfer:features:read+");
          /* if a new gdb connects to us, we have to reset the register
             set to the normal register sets to allow this new gdb to
@@ -692,21 +699,16 @@
    struct thread_resume resume_info[2];
    int n = 0;
 
-   if (step || sig || (cont_thread != 0 && cont_thread != -1)) {
-      resume_info[0].thread
-         = ((struct inferior_list_entry *) current_inferior)->id;
+   if (step || sig) {
       resume_info[0].step = step;
       resume_info[0].sig = sig;
-      resume_info[0].leave_stopped = 0;
       n++;
    }
-   resume_info[n].thread = -1;
    resume_info[n].step = 0;
    resume_info[n].sig = 0;
-   resume_info[n].leave_stopped = (cont_thread != 0 && cont_thread != -1);
 
-   resume_packet_needed = True;
-   (*the_target->resume) (resume_info);
+   resume_reply_packet_needed = True;
+   valgrind_resume (resume_info);
 }
 
 /* server_main global variables */
@@ -717,9 +719,13 @@
 {
    dlog(1, "gdbserver_init gdbserver embedded in valgrind: %s\n", version);
    noack_mode = False;
-   initialize_low ();
-   own_buf = malloc (PBUFSIZ);
-   mem_buf = malloc (PBUFSIZ);
+   valgrind_initialize_target ();
+   // After a fork, gdbserver_init can be called again.
+   // We do not have to re-malloc the buffers in such a case.
+   if (own_buf == NULL)
+      own_buf = malloc (PBUFSIZ);
+   if (mem_buf == NULL)
+      mem_buf = malloc (PBUFSIZ);
 }
 
 void gdbserver_terminate (void)
@@ -742,7 +748,7 @@
    unsigned int len;
    CORE_ADDR mem_addr;
 
-   zignal = mywait (&status);
+   zignal = valgrind_wait (&status);
    if (VG_MINIMAL_SETJMP(toplevel)) {
       dlog(0, "error caused VG_MINIMAL_LONGJMP to server_main\n");
    }
@@ -751,8 +757,10 @@
       int packet_len;
       int new_packet_len = -1;
       
-      if (resume_packet_needed) {
-         resume_packet_needed = False;
+      if (resume_reply_packet_needed) {
+         /* Send the resume reply to reply to last GDB resume
+            request. */
+         resume_reply_packet_needed = False;
          prepare_resume_reply (own_buf, status, zignal);
          putpkt (own_buf);
       }
@@ -785,7 +793,7 @@
          remote_finish (reset_after_error);
          remote_open (VG_(clo_vgdb_prefix));
          myresume (0, 0);
-         resume_packet_needed = False;
+         resume_reply_packet_needed = False;
          return;
       case '!':
          /* We can not use the extended protocol with valgrind,
@@ -871,14 +879,14 @@
       }
       case 'm':
          decode_m_packet (&own_buf[1], &mem_addr, &len);
-         if (read_inferior_memory (mem_addr, mem_buf, len) == 0)
+         if (valgrind_read_memory (mem_addr, mem_buf, len) == 0)
             convert_int_to_ascii (mem_buf, own_buf, len);
          else
             write_enn (own_buf);
          break;
       case 'M':
          decode_M_packet (&own_buf[1], &mem_addr, &len, mem_buf);
-         if (write_inferior_memory (mem_addr, mem_buf, len) == 0)
+         if (valgrind_write_memory (mem_addr, mem_buf, len) == 0)
             write_ok (own_buf);
          else
             write_enn (own_buf);
@@ -886,7 +894,7 @@
       case 'X':
          if (decode_X_packet (&own_buf[1], packet_len - 1,
                               &mem_addr, &len, mem_buf) < 0
-             || write_inferior_memory (mem_addr, mem_buf, len) != 0)
+             || valgrind_write_memory (mem_addr, mem_buf, len) != 0)
             write_enn (own_buf);
          else
             write_ok (own_buf);
@@ -924,15 +932,13 @@
          int zlen = strtol (lenptr + 1, &dataptr, 16);
          char type = own_buf[1];
          
-         if (the_target->insert_watchpoint == NULL
-             || (type < '0' || type > '4')) {
-            /* No watchpoint support or not a watchpoint command;
-               unrecognized either way.  */
+         if (type < '0' || type > '4') {
+            /* Watchpoint command type unrecognized. */
             own_buf[0] = '\0';
          } else {
             int res;
             
-            res = (*the_target->insert_watchpoint) (type, addr, zlen);
+            res = valgrind_insert_watchpoint (type, addr, zlen);
             if (res == 0)
                write_ok (own_buf);
             else if (res == 1)
@@ -950,15 +956,13 @@
          int zlen = strtol (lenptr + 1, &dataptr, 16);
          char type = own_buf[1];
          
-         if (the_target->remove_watchpoint == NULL
-             || (type < '0' || type > '4')) {
-            /* No watchpoint support or not a watchpoint command;
-               unrecognized either way.  */
+         if (type < '0' || type > '4') {
+            /* Watchpoint command type unrecognized. */
             own_buf[0] = '\0';
          } else {
             int res;
             
-            res = (*the_target->remove_watchpoint) (type, addr, zlen);
+            res = valgrind_remove_watchpoint (type, addr, zlen);
             if (res == 0)
                write_ok (own_buf);
             else if (res == 1)
@@ -982,7 +986,7 @@
             break;
          }
 
-         if (mythread_alive (thread_id))
+         if (valgrind_thread_alive (thread_id))
             write_ok (own_buf);
          else
             write_enn (own_buf);
@@ -1036,6 +1040,6 @@
    remote_finish (reset_after_error);
    remote_open (VG_(clo_vgdb_prefix)); 
    myresume (0, 0);
-   resume_packet_needed = False;
+   resume_reply_packet_needed = False;
    return;
 }
diff --git a/main/coregrind/m_gdbserver/server.h b/main/coregrind/m_gdbserver/server.h
index dc1b128..077a658 100644
--- a/main/coregrind/m_gdbserver/server.h
+++ b/main/coregrind/m_gdbserver/server.h
@@ -107,34 +107,6 @@
    If debug info not found for this pc, assumes arm */
 extern Addr thumb_pc (Addr pc);
 
-/* True if gdbserver is single stepping the valgrind process */
-extern Bool valgrind_single_stepping(void);
-
-/* Set Valgrind in single stepping mode or not according to Bool. */
-extern void valgrind_set_single_stepping(Bool);
-
-/* gets the addr at which a (possible) break must be ignored once.
-   If there is no such break to be ignored once, 0 is returned.
-   This is needed for the following case:
-   The user sets a break at address AAA.
-   The break is encountered. Then the user does stepi 
-   (i.e. step one instruction).
-   In such a case, the already encountered break must be ignored
-   to ensure the stepi will advance by one instruction: a "break"
-   is implemented in valgrind by some helper code just after the
-   instruction mark at which the break is set. This helper code
-   verifies if either there is a break at the current PC
-   or if we are in stepping mode. If we are in stepping mode,
-   the already encountered break must be ignored once to advance
-   to the next instruction.
-   ??? need to check if this is *really* needed. */
-extern Addr valgrind_get_ignore_break_once(void);
-
-/* When addr > 0, ensures the next stop reply packet informs
-   gdb about the encountered watchpoint.
-   Use addr 0x0 to reset. */
-extern void VG_(set_watchpoint_stop_address) (Addr addr);
-
 /* when invoked by vgdb using ptrace, contains the tid chosen
    by vgdb (if vgdb gives a tid different of 0: a 0 tid by
    vgdb means use the running_tid if there is one running
@@ -230,32 +202,25 @@
    gdbserver by calling call_gdbserver.
    On return, call gdbserver_deliver_signal to effectively
    deliver the signal or not. */
-extern void gdbserver_signal_encountered (Int sigNo);
+extern void gdbserver_signal_encountered (Int vki_sigNo);
 /* between these two calls, call call_gdbserver */
 /* If gdbserver_deliver_signal True, then gdb did not ask
    to ignore the signal, so signal can be delivered to the guest. */
-extern Bool gdbserver_deliver_signal (Int sigNo);
+extern Bool gdbserver_deliver_signal (Int vki_sigNo);
 
 /* To optimise signal handling, gdb can instruct gdbserver to
-   not stop on some signals. In the below, a 1 indicates the signal
+   not stop on some signals. In the below, a 1 indicates the gdb_nr signal
    has to be passed directly to the guest, without asking gdb.
    A 0 indicates gdb has to be consulted to see if signal has
    or has not to be passed. The gdb consultation is to
    be done using the above two functions. */
-extern int pass_signals[];
+extern int pass_signals[]; /* indexed by gdb signal nr */
 
 
 #include "target.h"
 
 /* Target-specific functions */
 
-void initialize_low (void);
-
-/* initialize or re-initialize the register set of the low target.
-   if shadow_mode, then (re-)define the normal and valgrind shadow registers
-   else (re-)define only the normal registers. */
-void initialize_shadow_low (Bool shadow_mode);
-
 /* From inferiors.c.  */
 
 extern struct inferior_list all_threads;
@@ -323,6 +288,14 @@
 
 int unhexify (char *bin, const char *hex, int count);
 int hexify (char *hex, const char *bin, int count);
+/* heximage builds an image of bin according to byte order of the architecture 
+   Useful for register and int image */
+char* heximage (char *buf, char *bin, int count);
+
+/* convert from CORE_ADDR to void* */
+void* C2v(CORE_ADDR addr);
+
+
 int remote_escape_output (const gdb_byte *buffer, int len,
 			  gdb_byte *out_buf, int *out_len,
 			  int out_maxlen);
diff --git a/main/coregrind/m_gdbserver/signals.c b/main/coregrind/m_gdbserver/signals.c
index 07b0c24..ee60ccd 100644
--- a/main/coregrind/m_gdbserver/signals.c
+++ b/main/coregrind/m_gdbserver/signals.c
@@ -466,6 +466,22 @@
       return TARGET_SIGNAL_INFO;
 #endif
 
+#if defined (VKI_SIGRTMIN)
+   if (hostsig >= VKI_SIGRTMIN && hostsig < VKI_SIGRTMAX) {
+      /* This block of TARGET_SIGNAL_REALTIME value is in order.  */
+      if (33 <= hostsig && hostsig <= 63)
+         return (enum target_signal)
+            (hostsig - 33 + (int) TARGET_SIGNAL_REALTIME_33);
+      else if (hostsig == 32)
+         return TARGET_SIGNAL_REALTIME_32;
+      else if (64 <= hostsig && hostsig <= 127)
+         return (enum target_signal)
+            (hostsig - 64 + (int) TARGET_SIGNAL_REALTIME_64);
+   }
+#endif
+
+   error ("Valgrind GDBSERVER bug: (target_signal_from_host):"
+          " unrecognized vki signal %d\n", hostsig);
    return TARGET_SIGNAL_UNKNOWN;
 }
 
@@ -476,7 +492,7 @@
 
 static
 int do_target_signal_to_host (enum target_signal oursig,
-			  int *oursig_ok)
+                              int *oursig_ok)
 {
    *oursig_ok = 1;
    switch (oursig) {
@@ -700,6 +716,32 @@
 #endif
 
    default:
+#if defined (VKI_SIGRTMIN)
+      {
+         int retsig = 0;
+
+         if (oursig >= TARGET_SIGNAL_REALTIME_33
+             && oursig <= TARGET_SIGNAL_REALTIME_63) {
+            /* This block of signals is continuous, and
+               TARGET_SIGNAL_REALTIME_33 is 33 by definition.  */
+            retsig = (int) oursig - (int) TARGET_SIGNAL_REALTIME_33 + 33;
+         } else if (oursig == TARGET_SIGNAL_REALTIME_32) {
+            /* TARGET_SIGNAL_REALTIME_32 isn't contiguous with
+               TARGET_SIGNAL_REALTIME_33.  It is 32 by definition.  */
+            retsig = 32;
+         } else if (oursig >= TARGET_SIGNAL_REALTIME_64
+                    && oursig <= TARGET_SIGNAL_REALTIME_127) {
+            /* This block of signals is continuous, and
+               TARGET_SIGNAL_REALTIME_64 is 64 by definition.  */
+            retsig = (int) oursig - (int) TARGET_SIGNAL_REALTIME_64 + 64;
+         }
+         
+         if (retsig >= VKI_SIGRTMIN && retsig < VKI_SIGRTMAX)
+            return retsig;
+      }
+#endif
+      error ("Valgrind GDBSERVER bug: (do_target_signal_to_host):"
+             " unrecognized target signal %d\n", oursig);
       *oursig_ok = 0;
       return 0;
    }
diff --git a/main/coregrind/m_gdbserver/target.c b/main/coregrind/m_gdbserver/target.c
index ae61c94..165a717 100644
--- a/main/coregrind/m_gdbserver/target.c
+++ b/main/coregrind/m_gdbserver/target.c
@@ -23,8 +23,524 @@
    Boston, MA 02110-1301, USA.  */
 
 #include "server.h"
+#include "target.h"
+#include "regdef.h"
+#include "regcache.h"
+#include "valgrind_low.h"
+#include "gdb/signals.h"
+#include "pub_core_aspacemgr.h"
+#include "pub_tool_machine.h"
+#include "pub_core_threadstate.h"
+#include "pub_core_transtab.h"
+#include "pub_core_gdbserver.h" 
+#include "pub_tool_debuginfo.h"
 
-struct target_ops *the_target;
+
+/* the_low_target defines the architecture specific aspects depending
+   on the cpu */
+static struct valgrind_target_ops the_low_target;
+
+static
+char *image_ptid(unsigned long ptid)
+{
+  static char result[100];
+  VG_(sprintf) (result, "id %ld", ptid);
+  return result;
+}
+#define get_thread(inf) ((struct thread_info *)(inf))
+static
+void remove_thread_if_not_in_vg_threads (struct inferior_list_entry *inf)
+{
+  struct thread_info *thread = get_thread (inf);
+  if (!VG_(lwpid_to_vgtid)(thread_to_gdb_id(thread))) {
+     dlog(1, "removing gdb ptid %s\n", 
+          image_ptid(thread_to_gdb_id(thread)));
+     remove_thread (thread);
+  }
+}
+
+/* synchronize threads known by valgrind and threads known by gdbserver */
+static
+void valgrind_update_threads (int pid)
+{
+  ThreadId tid;
+  ThreadState *ts;
+  unsigned long ptid;
+  struct thread_info *ti;
+
+  /* call remove_thread for all gdb threads not in valgrind threads */
+  for_each_inferior (&all_threads, remove_thread_if_not_in_vg_threads);
+  
+  /* call add_thread for all valgrind threads not known in gdb all_threads */
+  for (tid = 1; tid < VG_N_THREADS; tid++) {
+
+#define LOCAL_THREAD_TRACE " ti* %p vgtid %d status %s as gdb ptid %s lwpid %d\n", \
+        ti, tid, VG_(name_of_ThreadStatus) (ts->status), \
+        image_ptid (ptid), ts->os_state.lwpid
+
+     if (VG_(is_valid_tid) (tid)) {
+        ts = VG_(get_ThreadState) (tid);
+        ptid = ts->os_state.lwpid;
+        ti = gdb_id_to_thread (ptid);
+        if (!ti) {
+           /* we do not report the threads which are not yet fully
+              initialized otherwise this creates duplicated threads
+              in gdb: once with pid xxx lwpid 0, then after that
+              with pid xxx lwpid yyy. */
+           if (ts->status != VgTs_Init) {
+              dlog(1, "adding_thread" LOCAL_THREAD_TRACE);
+              add_thread (ptid, ts, ptid);
+           }
+        } else {
+           dlog(2, "(known thread)" LOCAL_THREAD_TRACE);
+        }
+     }
+#undef LOCAL_THREAD_TRACE
+  }
+}
+
+static
+struct reg* build_shadow_arch (struct reg *reg_defs, int n) {
+   int i, r;
+   static char *postfix[3] = { "", "s1", "s2" };
+   struct reg *new_regs = malloc(3 * n * sizeof(reg_defs[0]));
+   int reg_set_len = reg_defs[n-1].offset + reg_defs[n-1].size;
+
+   for (i = 0; i < 3; i++) {
+      for (r = 0; r < n; r++) {
+         new_regs[i*n + r].name = malloc(strlen(reg_defs[r].name) 
+                                         + strlen (postfix[i]) + 1);
+         strcpy (new_regs[i*n + r].name, reg_defs[r].name);
+         strcat (new_regs[i*n + r].name, postfix[i]);
+         new_regs[i*n + r].offset = i*reg_set_len + reg_defs[r].offset;
+         new_regs[i*n + r].size = reg_defs[r].size;
+         dlog(1,
+              "%10s Nr %d offset(bit) %d offset(byte) %d  size(bit) %d\n",
+              new_regs[i*n + r].name, i*n + r, new_regs[i*n + r].offset,
+              (new_regs[i*n + r].offset) / 8, new_regs[i*n + r].size);
+      }  
+   }
+
+   return new_regs;
+}
+
+
+static CORE_ADDR stopped_data_address = 0;
+void VG_(set_watchpoint_stop_address) (Addr addr)
+{
+   stopped_data_address = addr;
+}
+
+int valgrind_stopped_by_watchpoint (void)
+{
+   return stopped_data_address != 0;
+}
+
+CORE_ADDR valgrind_stopped_data_address (void)
+{
+   return stopped_data_address;
+}
+
+/* pc at which we last stopped */
+static CORE_ADDR stop_pc;
+
+/* pc at which we resume. 
+   If stop_pc != resume_pc, it means
+      gdb/gdbserver has changed the pc so as to have either
+      a    "continue by jumping at that address"
+      or a "continue at that address to call some code from gdb".
+*/
+static CORE_ADDR resume_pc;
+
+static int vki_signal_to_report;
+
+void gdbserver_signal_encountered (Int vki_sigNo)
+{
+   vki_signal_to_report = vki_sigNo;
+}
+
+static int vki_signal_to_deliver;
+Bool gdbserver_deliver_signal (Int vki_sigNo)
+{
+   return vki_sigNo == vki_signal_to_deliver;
+}
+
+static
+char* sym (Addr addr)
+{
+   static char buf[200];
+   VG_(describe_IP) (addr, buf, 200);
+   return buf;
+}
+
+ThreadId vgdb_interrupted_tid = 0;
+
+/* 0 => not single stepping.
+   1 => single stepping asked by gdb
+   2 => single stepping asked by valgrind (watchpoint) */
+static int stepping = 0;
+
+Addr valgrind_get_ignore_break_once(void)
+{
+   if (valgrind_single_stepping())
+      return resume_pc;
+   else
+      return 0;
+}
+
+void valgrind_set_single_stepping(Bool set)
+{
+   if (set)
+      stepping = 2;
+   else
+      stepping = 0;
+}
+
+Bool valgrind_single_stepping(void)
+{
+   if (stepping)
+      return True;
+   else
+      return False;
+}
+
+int valgrind_thread_alive (unsigned long tid)
+{
+  struct thread_info *ti =  gdb_id_to_thread(tid);
+  ThreadState *tst;
+
+  if (ti != NULL) {
+     tst = (ThreadState *) inferior_target_data (ti);
+     return tst->status != VgTs_Zombie;
+  }
+  else {
+    return 0;
+  }
+}
+
+void valgrind_resume (struct thread_resume *resume_info)
+{
+   dlog(1,
+        "resume_info step %d sig %d stepping %d\n", 
+        resume_info->step,
+        resume_info->sig,
+        stepping);
+   if (valgrind_stopped_by_watchpoint()) {
+      dlog(1, "clearing watchpoint stopped_data_address %p\n",
+           C2v(stopped_data_address));
+      VG_(set_watchpoint_stop_address) ((Addr) 0);
+   }
+   vki_signal_to_deliver = resume_info->sig;
+   
+   stepping = resume_info->step;
+   resume_pc = (*the_low_target.get_pc) ();
+   if (resume_pc != stop_pc) {
+      dlog(1,
+           "stop_pc %p changed to be resume_pc %s\n",
+           C2v(stop_pc), sym(resume_pc));
+   }
+   regcache_invalidate();
+}
+
+unsigned char valgrind_wait (char *ourstatus)
+{
+   int pid;
+   unsigned long wptid;
+   ThreadState *tst;
+   enum target_signal sig;
+
+   pid = VG_(getpid) ();
+   dlog(1, "enter valgrind_wait pid %d\n", pid);
+
+   regcache_invalidate();
+   valgrind_update_threads(pid);
+
+   /* in valgrind, we consider that a wait always succeeds with STOPPED 'T' 
+      and with a signal TRAP (i.e. a breakpoint), unless there is
+      a signal to report. */
+   *ourstatus = 'T';
+   if (vki_signal_to_report == 0)
+      sig = TARGET_SIGNAL_TRAP;
+   else {
+      sig = target_signal_from_host(vki_signal_to_report);
+      vki_signal_to_report = 0;
+   }
+   
+   if (vgdb_interrupted_tid != 0)
+      tst = VG_(get_ThreadState) (vgdb_interrupted_tid);
+   else
+      tst = VG_(get_ThreadState) (VG_(running_tid));
+   wptid = tst->os_state.lwpid;
+   /* we can only change the current_inferior when the wptid references
+      an existing thread. Otherwise, we are still in the init phase.
+      (hack similar to main thread hack in valgrind_update_threads) */
+   if (tst->os_state.lwpid)
+      current_inferior = gdb_id_to_thread (wptid);
+   stop_pc = (*the_low_target.get_pc) ();
+   
+   dlog(1,
+        "exit valgrind_wait returns ptid %s stop_pc %s signal %d\n", 
+        image_ptid (wptid), sym (stop_pc), sig);
+   return sig;
+}
+
+/* Fetch one register from valgrind VEX guest state.  */
+static
+void fetch_register (int regno)
+{
+   int size;
+   ThreadState *tst = (ThreadState *) inferior_target_data (current_inferior);
+   ThreadId tid = tst->tid;
+
+   if (regno >= the_low_target.num_regs) {
+      dlog(0, "error fetch_register regno %d max %d\n",
+           regno, the_low_target.num_regs);
+      return;
+   }
+   size = register_size (regno);
+   if (size > 0) {
+      Bool mod;
+      char buf [size];
+      VG_(memset) (buf, 0, size); // registers not fetched will be seen as 0.
+      (*the_low_target.transfer_register) (tid, regno, buf,
+                                           valgrind_to_gdbserver, size, &mod);
+      // Note: the *mod received from transfer_register is not interesting.
+      // We are interested to see if the register data in the register cache is modified.
+      supply_register (regno, buf, &mod);
+      if (mod && VG_(debugLog_getLevel)() > 1) {
+         char bufimage [2*size + 1];
+         heximage (bufimage, buf, size);
+         dlog(2, "fetched register %d size %d name %s value %s tid %d status %s\n", 
+              regno, size, the_low_target.reg_defs[regno].name, bufimage, 
+              tid, VG_(name_of_ThreadStatus) (tst->status));
+      }
+   }
+}
+
+/* Fetch all registers, or just one, from the child process.  */
+static
+void usr_fetch_inferior_registers (int regno)
+{
+   if (regno == -1 || regno == 0)
+      for (regno = 0; regno < the_low_target.num_regs; regno++)
+         fetch_register (regno);
+   else
+      fetch_register (regno);
+}
+
+/* Store our register values back into the inferior.
+   If REGNO is -1, do this for all registers.
+   Otherwise, REGNO specifies which register (so we can save time).  */
+static
+void usr_store_inferior_registers (int regno)
+{
+   int size;
+   ThreadState *tst = (ThreadState *) inferior_target_data (current_inferior);
+   ThreadId tid = tst->tid;
+   
+   if (regno >= 0) {
+
+      if (regno >= the_low_target.num_regs) {
+         dlog(0, "error store_register regno %d max %d\n",
+              regno, the_low_target.num_regs);
+         return;
+      }
+      
+      size = register_size (regno);
+      if (size > 0) {
+         Bool mod;
+         Addr old_SP, new_SP;
+         char buf[size];
+
+         if (regno == the_low_target.stack_pointer_regno) {
+            /* When the stack pointer register is changed such that
+               the stack is extended, we better inform the tool of the
+               stack increase.  This is needed in particular to avoid
+               spurious Memcheck errors during Inferior calls. So, we
+               save in old_SP the SP before the change. A change of
+               stack pointer is also assumed to have initialised this
+               new stack space. For the typical example of an inferior
+               call, gdb writes arguments on the stack, and then
+               changes the stack pointer. As the stack increase tool
+               function might mark it as undefined, we have to call it
+               at the good moment. */
+            VG_(memset) ((void *) &old_SP, 0, size);
+            (*the_low_target.transfer_register) (tid, regno, (void *) &old_SP, 
+                                                 valgrind_to_gdbserver, size, &mod);
+         }
+
+         VG_(memset) (buf, 0, size);
+         collect_register (regno, buf);
+         (*the_low_target.transfer_register) (tid, regno, buf, 
+                                              gdbserver_to_valgrind, size, &mod);
+         if (mod && VG_(debugLog_getLevel)() > 1) {
+            char bufimage [2*size + 1];
+            heximage (bufimage, buf, size);
+            dlog(2, 
+                 "stored register %d size %d name %s value %s "
+                 "tid %d status %s\n", 
+                 regno, size, the_low_target.reg_defs[regno].name, bufimage, 
+                 tid, VG_(name_of_ThreadStatus) (tst->status));
+         }
+         if (regno == the_low_target.stack_pointer_regno) {
+            VG_(memcpy) (&new_SP, buf, size);
+            if (old_SP > new_SP) {
+               Word delta  = (Word)new_SP - (Word)old_SP;
+               dlog(1, 
+                    "   stack increase by stack pointer changed from %p to %p "
+                    "delta %ld\n",
+                    (void*) old_SP, (void *) new_SP,
+                    delta);
+               VG_TRACK( new_mem_stack_w_ECU, new_SP, -delta, 0 );
+               VG_TRACK( new_mem_stack,       new_SP, -delta );
+               VG_TRACK( post_mem_write, Vg_CoreClientReq, tid,
+                         new_SP, -delta);
+            }
+         }
+      }
+   }
+   else {
+      for (regno = 0; regno < the_low_target.num_regs; regno++)
+         usr_store_inferior_registers (regno);
+   }
+}
+
+void valgrind_fetch_registers (int regno)
+{
+   usr_fetch_inferior_registers (regno);
+}
+
+void valgrind_store_registers (int regno)
+{
+   usr_store_inferior_registers (regno);
+}
+
+int valgrind_read_memory (CORE_ADDR memaddr, unsigned char *myaddr, int len)
+{
+   const void *sourceaddr = C2v (memaddr);
+   dlog(2, "reading memory %p size %d\n", sourceaddr, len);
+   if (!VG_(am_is_valid_for_client_or_free_or_resvn) ((Addr) sourceaddr, 
+                                                      len, VKI_PROT_READ)) {
+      dlog(1, "error reading memory %p size %d\n", sourceaddr, len);
+      return -1;
+   }
+   VG_(memcpy) (myaddr, sourceaddr, len);
+   return 0;
+}
+
+int valgrind_write_memory (CORE_ADDR memaddr, const unsigned char *myaddr, int len)
+{
+   void *targetaddr = C2v (memaddr);
+   dlog(2, "writing memory %p size %d\n", targetaddr, len);
+   if (!VG_(am_is_valid_for_client_or_free_or_resvn) ((Addr)targetaddr, 
+                                                      len, VKI_PROT_WRITE)) {
+      dlog(1, "error writing memory %p size %d\n", targetaddr, len);
+      return -1;
+   }
+   if (len > 0) {
+      VG_(memcpy) (targetaddr, myaddr, len);
+      if (VG_(tdict).track_post_mem_write) {
+         /* Inform the tool of the post memwrite.  Note that we do the
+            minimum necessary to avoid complains from e.g.
+            memcheck. The idea is that the debugger is as least
+            intrusive as possible.  So, we do not inform of the pre
+            mem write (and in any case, this would cause problems with
+            memcheck that does not like our CorePart in
+            pre_mem_write. */
+         ThreadState *tst = 
+            (ThreadState *) inferior_target_data (current_inferior);
+         ThreadId tid = tst->tid;
+         VG_(tdict).track_post_mem_write( Vg_CoreClientReq, tid,
+                                          (Addr) targetaddr, len );
+      }
+   }
+   return 0;
+}
+
+/* insert or remove a breakpoint */
+static
+int valgrind_point (Bool insert, char type, CORE_ADDR addr, int len)
+{
+   PointKind kind;
+   switch (type) {
+   case '0': /* implemented by inserting checks at each instruction in sb */
+      kind = software_breakpoint;
+      break;
+   case '1': /* hw breakpoint, same implementation as sw breakpoint */
+      kind = hardware_breakpoint;
+      break;
+   case '2':
+      kind = write_watchpoint;
+      break;
+   case '3':
+      kind = read_watchpoint;
+      break;
+   case '4':
+      kind = access_watchpoint;
+      break;
+   default:
+      vg_assert (0);
+   }
+
+   /* Attention: gdbserver convention differs: 0 means ok; 1 means not ok */
+   if (VG_(gdbserver_point) (kind, insert, addr, len))
+      return 0;
+   else
+      return 1; /* error or unsupported */
+}
+
+char* valgrind_target_xml (Bool shadow_mode)
+{
+   return (*the_low_target.target_xml) (shadow_mode);
+}
+
+int valgrind_insert_watchpoint (char type, CORE_ADDR addr, int len)
+{
+   return valgrind_point (/* insert */ True, type, addr, len);
+}
+
+int valgrind_remove_watchpoint (char type, CORE_ADDR addr, int len)
+{
+   return valgrind_point (/* insert*/ False, type, addr, len);
+}
+
+/* returns a pointer to the architecture state corresponding to
+   the provided register set: 0 => normal guest registers,
+                              1 => shadow1
+                              2 => shadow2
+*/
+VexGuestArchState* get_arch (int set, ThreadState* tst) 
+{
+  switch (set) {
+  case 0: return &tst->arch.vex;
+  case 1: return &tst->arch.vex_shadow1;
+  case 2: return &tst->arch.vex_shadow2;
+  default: vg_assert(0);
+  }
+}
+
+static int non_shadow_num_regs = 0;
+static struct reg *non_shadow_reg_defs = NULL;
+void initialize_shadow_low(Bool shadow_mode)
+{
+  if (non_shadow_reg_defs == NULL) {
+    non_shadow_reg_defs = the_low_target.reg_defs;
+    non_shadow_num_regs = the_low_target.num_regs;
+  }
+
+  regcache_invalidate();
+  if (the_low_target.reg_defs != non_shadow_reg_defs) {
+     free (the_low_target.reg_defs);
+  }
+  if (shadow_mode) {
+    the_low_target.num_regs = 3 * non_shadow_num_regs;
+    the_low_target.reg_defs = build_shadow_arch (non_shadow_reg_defs, non_shadow_num_regs);
+  } else {
+    the_low_target.num_regs = non_shadow_num_regs;
+    the_low_target.reg_defs = non_shadow_reg_defs;
+  }
+  set_register_cache (the_low_target.reg_defs, the_low_target.num_regs);
+}
 
 void set_desired_inferior (int use_general)
 {
@@ -61,40 +577,6 @@
   }
 }
 
-int read_inferior_memory (CORE_ADDR memaddr, unsigned char *myaddr, int len)
-{
-   int res;
-   res = (*the_target->read_memory) (memaddr, myaddr, len);
-   return res;
-}
-
-int write_inferior_memory (CORE_ADDR memaddr, const unsigned char *myaddr,
-                           int len)
-{
-   /* Lacking cleanups, there is some potential for a memory leak if the
-      write fails and we go through error().  Make sure that no more than
-      one buffer is ever pending by making BUFFER static.  */
-   static unsigned char *buffer = 0;
-   int res;
-
-   if (buffer != NULL)
-      free (buffer);
-
-   buffer = malloc (len);
-   VG_(memcpy) (buffer, myaddr, len);
-   res = (*the_target->write_memory) (memaddr, buffer, len);
-   free (buffer);
-   buffer = NULL;
-
-   return res;
-}
-
-void set_target_ops (struct target_ops *target)
-{
-   the_target = (struct target_ops *) malloc (sizeof (*the_target));
-   VG_(memcpy) (the_target, target, sizeof (*the_target));
-}
-
 void* VG_(dmemcpy) ( void *d, const void *s, SizeT sz, Bool *mod )
 {
    if (VG_(memcmp) (d, s, sz)) {
@@ -119,3 +601,24 @@
    else
       vg_assert (0);
 }
+
+void valgrind_initialize_target(void)
+{
+#if defined(VGA_x86)
+   x86_init_architecture(&the_low_target);
+#elif defined(VGA_amd64)
+   amd64_init_architecture(&the_low_target);
+#elif defined(VGA_arm)
+   arm_init_architecture(&the_low_target);
+#elif defined(VGA_ppc32)
+   ppc32_init_architecture(&the_low_target);
+#elif defined(VGA_ppc64)
+   ppc64_init_architecture(&the_low_target);
+#elif defined(VGA_s390x)
+   s390x_init_architecture(&the_low_target);
+#elif defined(VGA_mips32)
+   mips32_init_architecture(&the_low_target);
+#else
+   architecture missing in target.c valgrind_initialize_target
+#endif
+}
diff --git a/main/coregrind/m_gdbserver/target.h b/main/coregrind/m_gdbserver/target.h
index d657438..2cd41fd 100644
--- a/main/coregrind/m_gdbserver/target.h
+++ b/main/coregrind/m_gdbserver/target.h
@@ -1,6 +1,7 @@
-/* Target operations for the remote server for GDB.
-   Copyright (C) 2002, 2003, 2004, 2005
+/* Target operations for the Valgrind remote server for GDB.
+   Copyright (C) 2002, 2003, 2004, 2005, 2012
    Free Software Foundation, Inc.
+   Philippe Waroquiers.
 
    Contributed by MontaVista Software.
 
@@ -25,18 +26,54 @@
 #ifndef TARGET_H
 #define TARGET_H
 
-/* This structure describes how to resume a particular thread (or
-   all threads) based on the client's request.  If thread is -1, then
-   this entry applies to all threads.  These are generally passed around
-   as an array, and terminated by a thread == -1 entry.  */
+/* This file defines the architecture independent Valgrind gdbserver
+   high level operations such as read memory, get/set registers, ...
 
+   These high level operations are called by the gdbserver
+   protocol implementation (e.g. typically server.c).
+   
+   For some of these high level operations, target.c will call
+   low level operations dependent on the architecture.
+   
+   For example, getting or setting the registers will work on a
+   register cache. The exact details of the registers (how much,
+   their size, etc) is not defined by target.c or the register cache.
+
+   Such architecture dependent information is defined by
+   valgrind_low.h/valgrind-low-xxxxx.c providing 'low level operations'
+   specific to the xxxxx architecture (for example,
+   valgrind-low-x86.c, valgrind-low-armc.c). */
+        
+/* -------------------------------------------------------------------------- */
+/* ------------------------ Initialisation ---------------------------------- */
+/* -------------------------------------------------------------------------- */
+
+/* Initialize the Valgrind high target. This will in turn
+   initialise the low (architecture specific) target. */
+extern void valgrind_initialize_target(void);
+
+/* initialize or re-initialize the register set of the low target.
+   if shadow_mode, then (re-)define the normal and valgrind shadow registers
+   else (re-)define only the normal registers. */
+extern void initialize_shadow_low (Bool shadow_mode);
+
+/* Returns the name of the xml target description file. 
+   returns NULL if no xml target description available.
+   if shadow_mode, then returns the xml target description
+   with the shadow registers
+   else returns the xml target description only for
+   the normal registers. */
+extern char* valgrind_target_xml (Bool shadow_mode);
+
+
+/* -------------------------------------------------------------------------- */
+/* --------------------------- Execution control ---------------------------- */
+/* -------------------------------------------------------------------------- */
+
+/* This structure describes how to resume the execution.
+   Currently, there is no way to resume only a specific thread.  */
 struct thread_resume
 {
-  unsigned long thread;
-
-  /* If non-zero, leave this thread stopped.  */
-  int leave_stopped;
-
   /* If non-zero, we want to single-step.  */
   int step;
 
@@ -44,114 +81,133 @@
   int sig;
 };
 
-struct target_ops
-{
-  /* Return 1 iff the thread with process ID PID is alive.  */
+/* Prepare to Resume (i.e. restart) the guest.
+   The resume info indicates how the resume will be done. 
+   In case GDB has changed the program counter, valgrind_resume
+   will also ensure that the execution will be resumed at this
+   new program counter.
+   The Resume is really only executed once the gdbserver
+   returns (giving back the control to Valgrind). */
+extern void valgrind_resume (struct thread_resume *resume_info);
 
-  int (*thread_alive) (unsigned long pid);
+/* When Valgrind gets the control, it will execute the guest
+   process till there is a reason to call the gdbserver
+   again (e.g. because a breakpoint is encountered or the
+   tool reports an error).
+   In such case, the executionof guest code  stops, and the
+   control is given to gdbserver. Gdbserver will send a resume
+   reply packet to GDB.
 
-  /* Resume the inferior process.  */
+   valgrind_wait gets from Valgrind data structures the
+   information needed produce the resume reply for GDB:
+   a.o. OURSTATUS will be filled in with a response code to send to GDB.
 
-  void (*resume) (struct thread_resume *resume_info);
+   Returns the signal which caused the process to stop, in the
+   remote protocol numbering (e.g. TARGET_SIGNAL_STOP), or the
+   exit code as an integer if *OURSTATUS is 'W'.  */
+extern unsigned char valgrind_wait (char *outstatus);
 
-  /* Wait for the inferior process to change state.
+/* When execution is stopped and gdbserver has control, more
+   info about the stop reason can be retrieved using the following
+   functions. */
 
-     STATUS will be filled in with a response code to send to GDB.
+/* gets the addr at which a (possible) break must be ignored once.
+   If there is no such break to be ignored once, 0 is returned.
+   This is needed for the following case:
+   The user sets a break at address AAA.
+   The break is encountered. Then the user does stepi 
+   (i.e. step one instruction).
+   In such a case, the already encountered break must be ignored
+   to ensure the stepi will advance by one instruction: a "break"
+   is implemented in valgrind by some helper code just after the
+   instruction mark at which the break is set. This helper code
+   verifies if either there is a break at the current PC
+   or if we are in stepping mode. If we are in stepping mode,
+   the already encountered break must be ignored once to advance
+   to the next instruction.
+   ??? need to check if this is *really* needed. */
+extern Addr valgrind_get_ignore_break_once(void);
 
-     Returns the signal which caused the process to stop, in the
-     remote protocol numbering (e.g. TARGET_SIGNAL_STOP), or the
-     exit code as an integer if *STATUS is 'W'.  */
+/* When addr > 0, ensures the next resume reply packet informs
+   gdb about the encountered watchpoint.
+   valgrind_stopped_by_watchpoint() will return 1 till reset.
+   Use addr 0x0 to reset. */
+extern void VG_(set_watchpoint_stop_address) (Addr addr);
 
-  unsigned char (*wait) (char *status);
+/* Returns 1 if target was stopped due to a watchpoint hit, 0 otherwise.  */
+extern int valgrind_stopped_by_watchpoint (void);
 
-  /* Fetch registers from the inferior process.
+/* Returns the address associated with the watchpoint that hit, if any;  
+   returns 0 otherwise.  */
+extern CORE_ADDR valgrind_stopped_data_address (void);
 
-     If REGNO is -1, fetch all registers; otherwise, fetch at least REGNO.  */
+/* True if gdbserver is single stepping the valgrind process */
+extern Bool valgrind_single_stepping(void);
 
-  void (*fetch_registers) (int regno);
+/* Set Valgrind in single stepping mode or not according to Bool. */
+extern void valgrind_set_single_stepping(Bool);
 
-  /* Store registers to the inferior process.
+/* -------------------------------------------------------------------------- */
+/* ----------------- Examining/modifying data while stopped ----------------- */
+/* -------------------------------------------------------------------------- */
 
-     If REGNO is -1, store all registers; otherwise, store at least REGNO.  */
+/* Return 1 iff the thread with ID tid is alive.  */
+extern int valgrind_thread_alive (unsigned long tid);
 
-  void (*store_registers) (int regno);
+/* Allows to controls the thread (current_inferior) used for following
+   valgrind_(fetch|store)_registers calls.
+   If USE_GENERAL,
+     current_inferior is set to general_thread
+   else
+     current_inferior is set to step_thread or else cont_thread.
+   If the above gives no valid thread, then current_inferior is
+   set to the first valid thread. */
+extern void set_desired_inferior (int use_general);
 
-  /* Read memory from the inferior process.  This should generally be
-     called through read_inferior_memory, which handles breakpoint shadowing.
+/* Fetch registers from the current_inferior thread.
+   If REGNO is -1, fetch all registers; otherwise, fetch at least REGNO.  */
+extern void valgrind_fetch_registers (int regno);
 
-     Read LEN bytes at MEMADDR into a buffer at MYADDR.
-  
-     Returns 0 on success and errno on failure.  */
+/* Store registers to the current_inferior thread.
+   If REGNO is -1, store all registers; otherwise, store at least REGNO.  */
+extern void valgrind_store_registers (int regno);
 
-  int (*read_memory) (CORE_ADDR memaddr, unsigned char *myaddr, int len);
 
-  /* Write memory to the inferior process.  This should generally be
-     called through write_inferior_memory, which handles breakpoint shadowing.
 
-     Write LEN bytes from the buffer at MYADDR to MEMADDR.
+/* Read memory from the inferior process.
+   Read LEN bytes at MEMADDR into a buffer at MYADDR.
+   Returns 0 on success and errno on failure.  */
+extern int valgrind_read_memory (CORE_ADDR memaddr,
+                                 unsigned char *myaddr, int len);
 
-     Returns 0 on success and errno on failure.  */
+/* Write memory to the inferior process.
+   Write LEN bytes from the buffer at MYADDR to MEMADDR.
+   Returns 0 on success and errno on failure.  */
+extern int valgrind_write_memory (CORE_ADDR memaddr,
+                                  const unsigned char *myaddr, int len);
 
-  int (*write_memory) (CORE_ADDR memaddr, const unsigned char *myaddr,
-		       int len);
 
-  /* Send a signal to the inferior process, however is appropriate.  */
-  void (*send_signal) (int);
+/* Insert and remove a hardware watchpoint.
+   Returns 0 on success, -1 on failure and 1 on unsupported.  
+   The type is coded as follows:
+   2 = write watchpoint
+   3 = read watchpoint
+   4 = access watchpoint
+*/
+extern int valgrind_insert_watchpoint (char type, CORE_ADDR addr, int len);
+extern int valgrind_remove_watchpoint (char type, CORE_ADDR addr, int len);
 
-  /* Returns the name of the xml target description file. 
-     returns NULL if no xml target description available. */
-  char* (*target_xml)(void);
 
-  /* Same but describes also the shadow registers. */
-  char* (*shadow_target_xml)(void);
+/* -------------------------------------------------------------------------- */
+/* ----------- Utils functions for low level arch specific files ------------ */
+/* -------------------------------------------------------------------------- */
 
-  /* Insert and remove a hardware watchpoint.
-     Returns 0 on success, -1 on failure and 1 on unsupported.  
-     The type is coded as follows:
-       2 = write watchpoint
-       3 = read watchpoint
-       4 = access watchpoint
-  */
-
-  int (*insert_watchpoint) (char type, CORE_ADDR addr, int len);
-  int (*remove_watchpoint) (char type, CORE_ADDR addr, int len);
-
-  /* Returns 1 if target was stopped due to a watchpoint hit, 0 otherwise.  */
-
-  int (*stopped_by_watchpoint) (void);
-
-  /* Returns the address associated with the watchpoint that hit, if any;  
-     returns 0 otherwise.  */
-
-  CORE_ADDR (*stopped_data_address) (void);
-
-};
-
-extern struct target_ops *the_target;
-
-void set_target_ops (struct target_ops *);
-
-#define detach_inferior() \
-  (*the_target->detach) ()
-
-#define mythread_alive(pid) \
-  (*the_target->thread_alive) (pid)
-
-#define fetch_inferior_registers(regno) \
-  (*the_target->fetch_registers) (regno)
-
-#define store_inferior_registers(regno) \
-  (*the_target->store_registers) (regno)
-
-#define mywait(statusp) \
-  (*the_target->wait) (statusp)
-
-int read_inferior_memory (CORE_ADDR memaddr, unsigned char *myaddr, int len);
-
-int write_inferior_memory (CORE_ADDR memaddr, const unsigned char *myaddr,
-			   int len);
-
-void set_desired_inferior (int id);
+/* returns a pointer to the architecture state corresponding to
+   the provided register set: 0 => normal guest registers,
+                              1 => shadow1
+                              2 => shadow2
+*/
+extern VexGuestArchState* get_arch (int set, ThreadState* tst);
 
 /* like memcpy but first check if content of destination and source
    differs. If no difference, no copy is done, *mod set to False.
@@ -173,4 +229,6 @@
                             SizeT sz,
                             Bool *mod);
 
+
+
 #endif /* TARGET_H */
diff --git a/main/coregrind/m_gdbserver/valgrind-low-amd64.c b/main/coregrind/m_gdbserver/valgrind-low-amd64.c
index 0dc0382..7de55a0 100644
--- a/main/coregrind/m_gdbserver/valgrind-low-amd64.c
+++ b/main/coregrind/m_gdbserver/valgrind-low-amd64.c
@@ -27,7 +27,7 @@
 #include "regcache.h"
 
 #include "pub_core_aspacemgr.h"
-#include "pub_tool_machine.h"
+#include "pub_core_machine.h"
 #include "pub_core_threadstate.h"
 #include "pub_core_transtab.h"
 #include "pub_core_gdbserver.h" 
@@ -41,7 +41,7 @@
 
 /* below loosely inspired from file generated with gdb regdat.sh */
 
-struct reg regs[] = {
+static struct reg regs[] = {
   { "rax", 0, 64 },
   { "rbx", 64, 64 },
   { "rcx", 128, 64 },
@@ -100,11 +100,29 @@
   { "xmm15", 4128, 128 },
   { "mxcsr", 4256, 32  },
 #if defined(VGO_linux)
-  { "orig_rax", 4288, 64 }
+  { "orig_rax", 4288, 64 },
 #endif
+  { "ymm0h", 4352, 128 }, // The ymm?h registers only to be given to GDB
+  { "ymm1h", 4480, 128 }, // if Valgrind is running with AVX instructions.
+  { "ymm2h", 4608, 128 },
+  { "ymm3h", 4736, 128 },
+  { "ymm4h", 4864, 128 },
+  { "ymm5h", 4992, 128 },
+  { "ymm6h", 5120, 128 },
+  { "ymm7h", 5248, 128 },
+  { "ymm8h", 5376, 128 },
+  { "ymm9h", 5504, 128 },
+  { "ymm10h", 5632, 128 },
+  { "ymm11h", 5760, 128 },
+  { "ymm12h", 5888, 128 },
+  { "ymm13h", 6016, 128 },
+  { "ymm14h", 6144, 128 },
+  { "ymm15h", 6272, 128 }
 };
 static const char *expedite_regs[] = { "rbp", "rsp", "rip", 0 };
-#define num_regs (sizeof (regs) / sizeof (regs[0]))
+#define max_num_regs (sizeof (regs) / sizeof (regs[0]))
+static int dyn_num_regs; // if no AVX, we have to give less registers to gdb.
+
 
 static
 CORE_ADDR get_pc (void)
@@ -135,8 +153,8 @@
                         transfer_direction dir, int size, Bool *mod)
 {
    ThreadState* tst = VG_(get_ThreadState)(tid);
-   int set = abs_regno / num_regs;
-   int regno = abs_regno % num_regs;
+   int set = abs_regno / dyn_num_regs;
+   int regno = abs_regno % dyn_num_regs;
    *mod = False;
 
    VexGuestAMD64State* amd64 = (VexGuestAMD64State*) get_arch (set, tst);
@@ -160,16 +178,7 @@
    case 13: VG_(transfer) (&amd64->guest_R13, buf, dir, size, mod); break;
    case 14: VG_(transfer) (&amd64->guest_R14, buf, dir, size, mod); break;
    case 15: VG_(transfer) (&amd64->guest_R15, buf, dir, size, mod); break;
-   case 16: 
-      VG_(transfer) (&amd64->guest_RIP, buf, dir, size, mod);
-      if (*mod && VG_(debugLog_getLevel)() > 2) {
-         char bufimage [2*sizeof(amd64->guest_IP_AT_SYSCALL) + 1];
-         heximage (bufimage, 
-                   (char *) &amd64->guest_IP_AT_SYSCALL, 
-                   sizeof(amd64->guest_IP_AT_SYSCALL));
-         dlog(3, "guest_IP_AT_SYSCALL %s\n", bufimage);
-      }
-      break;
+   case 16: VG_(transfer) (&amd64->guest_RIP, buf, dir, size, mod); break;
    case 17: 
       if (dir == valgrind_to_gdbserver) {
          ULong rflags;
@@ -251,22 +260,22 @@
    case 37: *mod = False; break; // GDBTD ??? equivalent of foseg
    case 38: *mod = False; break; // GDBTD ??? equivalent of fooff
    case 39: *mod = False; break; // GDBTD ??? equivalent of fop
-   case 40: VG_(transfer) (&amd64->guest_XMM0,  buf, dir, size, mod); break;
-   case 41: VG_(transfer) (&amd64->guest_XMM1,  buf, dir, size, mod); break;
-   case 42: VG_(transfer) (&amd64->guest_XMM2,  buf, dir, size, mod); break;
-   case 43: VG_(transfer) (&amd64->guest_XMM3,  buf, dir, size, mod); break;
-   case 44: VG_(transfer) (&amd64->guest_XMM4,  buf, dir, size, mod); break;
-   case 45: VG_(transfer) (&amd64->guest_XMM5,  buf, dir, size, mod); break;
-   case 46: VG_(transfer) (&amd64->guest_XMM6,  buf, dir, size, mod); break;
-   case 47: VG_(transfer) (&amd64->guest_XMM7,  buf, dir, size, mod); break;
-   case 48: VG_(transfer) (&amd64->guest_XMM8,  buf, dir, size, mod); break;
-   case 49: VG_(transfer) (&amd64->guest_XMM9,  buf, dir, size, mod); break;
-   case 50: VG_(transfer) (&amd64->guest_XMM10, buf, dir, size, mod); break;
-   case 51: VG_(transfer) (&amd64->guest_XMM11, buf, dir, size, mod); break;
-   case 52: VG_(transfer) (&amd64->guest_XMM12, buf, dir, size, mod); break;
-   case 53: VG_(transfer) (&amd64->guest_XMM13, buf, dir, size, mod); break;
-   case 54: VG_(transfer) (&amd64->guest_XMM14, buf, dir, size, mod); break;
-   case 55: VG_(transfer) (&amd64->guest_XMM15, buf, dir, size, mod); break;
+   case 40: VG_(transfer) (&amd64->guest_YMM0[0],  buf, dir, size, mod); break;
+   case 41: VG_(transfer) (&amd64->guest_YMM1[0],  buf, dir, size, mod); break;
+   case 42: VG_(transfer) (&amd64->guest_YMM2[0],  buf, dir, size, mod); break;
+   case 43: VG_(transfer) (&amd64->guest_YMM3[0],  buf, dir, size, mod); break;
+   case 44: VG_(transfer) (&amd64->guest_YMM4[0],  buf, dir, size, mod); break;
+   case 45: VG_(transfer) (&amd64->guest_YMM5[0],  buf, dir, size, mod); break;
+   case 46: VG_(transfer) (&amd64->guest_YMM6[0],  buf, dir, size, mod); break;
+   case 47: VG_(transfer) (&amd64->guest_YMM7[0],  buf, dir, size, mod); break;
+   case 48: VG_(transfer) (&amd64->guest_YMM8[0],  buf, dir, size, mod); break;
+   case 49: VG_(transfer) (&amd64->guest_YMM9[0],  buf, dir, size, mod); break;
+   case 50: VG_(transfer) (&amd64->guest_YMM10[0], buf, dir, size, mod); break;
+   case 51: VG_(transfer) (&amd64->guest_YMM11[0], buf, dir, size, mod); break;
+   case 52: VG_(transfer) (&amd64->guest_YMM12[0], buf, dir, size, mod); break;
+   case 53: VG_(transfer) (&amd64->guest_YMM13[0], buf, dir, size, mod); break;
+   case 54: VG_(transfer) (&amd64->guest_YMM14[0], buf, dir, size, mod); break;
+   case 55: VG_(transfer) (&amd64->guest_YMM15[0], buf, dir, size, mod); break;
    case 56: 
       if (dir == valgrind_to_gdbserver) {
          // vex only models the rounding bits (see libvex_guest_x86.h)
@@ -278,29 +287,83 @@
       }
       break;
    case 57: *mod = False; break; // GDBTD???? VEX equivalent { "orig_rax"},
+   case 58: VG_(transfer) (&amd64->guest_YMM0[4],  buf, dir, size, mod); break;
+   case 59: VG_(transfer) (&amd64->guest_YMM1[4],  buf, dir, size, mod); break;
+   case 60: VG_(transfer) (&amd64->guest_YMM2[4],  buf, dir, size, mod); break;
+   case 61: VG_(transfer) (&amd64->guest_YMM3[4],  buf, dir, size, mod); break;
+   case 62: VG_(transfer) (&amd64->guest_YMM4[4],  buf, dir, size, mod); break;
+   case 63: VG_(transfer) (&amd64->guest_YMM5[4],  buf, dir, size, mod); break;
+   case 64: VG_(transfer) (&amd64->guest_YMM6[4],  buf, dir, size, mod); break;
+   case 65: VG_(transfer) (&amd64->guest_YMM7[4],  buf, dir, size, mod); break;
+   case 66: VG_(transfer) (&amd64->guest_YMM8[4],  buf, dir, size, mod); break;
+   case 67: VG_(transfer) (&amd64->guest_YMM9[4],  buf, dir, size, mod); break;
+   case 68: VG_(transfer) (&amd64->guest_YMM10[4], buf, dir, size, mod); break;
+   case 69: VG_(transfer) (&amd64->guest_YMM11[4], buf, dir, size, mod); break;
+   case 70: VG_(transfer) (&amd64->guest_YMM12[4], buf, dir, size, mod); break;
+   case 71: VG_(transfer) (&amd64->guest_YMM13[4], buf, dir, size, mod); break;
+   case 72: VG_(transfer) (&amd64->guest_YMM14[4], buf, dir, size, mod); break;
+   case 73: VG_(transfer) (&amd64->guest_YMM15[4], buf, dir, size, mod); break;
    default: vg_assert(0);
    }
 }
 
+static
+Bool have_avx(void)
+{
+   VexArch va;
+   VexArchInfo vai;
+   VG_(machine_get_VexArchInfo) (&va, &vai);
+   return (vai.hwcaps & VEX_HWCAPS_AMD64_AVX ? True : False);
+}
+static
+char* target_xml (Bool shadow_mode)
+{
+   if (shadow_mode) {
+#if defined(VGO_linux)
+      if (have_avx())
+         return "amd64-avx-linux-valgrind.xml";
+      else
+         return "amd64-linux-valgrind.xml";
+#else
+      if (have_avx())
+         return "amd64-avx-coresse-valgrind.xml";
+      else
+         return "amd64-coresse-valgrind.xml";
+#endif
+   } else {
+#if defined(VGO_linux)
+      if (have_avx())
+         return "amd64-avx-linux.xml";
+      else
+         return NULL;
+#else
+      if (have_avx())
+         return "amd64-avx-coresse.xml";
+      else
+         return NULL;
+#endif
+   }  
+}
+
 static struct valgrind_target_ops low_target = {
-   num_regs,
+   -1, // Must be computed at init time.
    regs,
    7, //RSP
    transfer_register,
    get_pc,
    set_pc,
    "amd64",
-   NULL, // target_xml not needed.
-#if defined(VGO_linux)
-   "amd64-linux-valgrind.xml"
-#else
-   "amd64-coresse-valgrind.xml"
-#endif
+   target_xml
 };
 
 void amd64_init_architecture (struct valgrind_target_ops *target)
 {
    *target = low_target;
-   set_register_cache (regs, num_regs);
+   if (have_avx())
+      dyn_num_regs = max_num_regs;
+   else
+      dyn_num_regs = max_num_regs - 16; // remove the AVX "high" registers.
+   target->num_regs = dyn_num_regs;
+   set_register_cache (regs, dyn_num_regs);
    gdbserver_expedite_regs = expedite_regs;
 }
diff --git a/main/coregrind/m_gdbserver/valgrind-low-arm.c b/main/coregrind/m_gdbserver/valgrind-low-arm.c
index 5767793..a3ea36f 100644
--- a/main/coregrind/m_gdbserver/valgrind-low-arm.c
+++ b/main/coregrind/m_gdbserver/valgrind-low-arm.c
@@ -37,7 +37,7 @@
 
 #include "libvex_guest_arm.h"
 
-struct reg regs[] = {
+static struct reg regs[] = {
   { "r0", 0, 32 },
   { "r1", 32, 32 },
   { "r2", 64, 32 },
@@ -277,6 +277,16 @@
    }
 }
 
+static
+char* target_xml (Bool shadow_mode)
+{
+   if (shadow_mode) {
+      return "arm-with-vfpv3-valgrind.xml";
+   } else {
+      return "arm-with-vfpv3.xml";
+   }  
+}
+
 static struct valgrind_target_ops low_target = {
    num_regs,
    regs,
@@ -285,8 +295,7 @@
    get_pc,
    set_pc,
    "arm",
-   "arm-with-vfpv3.xml",
-   "arm-with-vfpv3-valgrind.xml"
+   target_xml
 };
 
 void arm_init_architecture (struct valgrind_target_ops *target)
diff --git a/main/coregrind/m_gdbserver/valgrind-low-mips32.c b/main/coregrind/m_gdbserver/valgrind-low-mips32.c
new file mode 100644
index 0000000..cf2d603
--- /dev/null
+++ b/main/coregrind/m_gdbserver/valgrind-low-mips32.c
@@ -0,0 +1,258 @@
+/* Low level interface to valgrind, for the remote server for GDB integrated
+   in valgrind.
+   Copyright (C) 2012
+   Free Software Foundation, Inc.
+
+   This file is part of VALGRIND.
+   It has been inspired from a file from gdbserver in gdb 6.6.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
+
+#include "server.h"
+#include "target.h"
+#include "regdef.h"
+#include "regcache.h"
+
+#include "pub_core_aspacemgr.h"
+#include "pub_tool_machine.h"
+#include "pub_core_threadstate.h"
+#include "pub_core_transtab.h"
+#include "pub_core_gdbserver.h" 
+
+#include "valgrind_low.h"
+
+#include "libvex_guest_mips32.h"
+
+static struct reg regs[] = {
+  { "r0", 0, 32 },
+  { "r1", 32, 32 },
+  { "r2", 64, 32 },
+  { "r3", 96, 32 },
+  { "r4", 128, 32 },
+  { "r5", 160, 32 },
+  { "r6", 192, 32 },
+  { "r7", 224, 32 },
+  { "r8", 256, 32 },
+  { "r9", 288, 32 },
+  { "r10", 320, 32 },
+  { "r11", 352, 32 },
+  { "r12", 384, 32 },
+  { "r13", 416, 32 },
+  { "r14", 448, 32 },
+  { "r15", 480, 32 },
+  { "r16", 512, 32 },
+  { "r17", 544, 32 },
+  { "r18", 576, 32 },
+  { "r19", 608, 32 },
+  { "r20", 640, 32 },
+  { "r21", 672, 32 },
+  { "r22", 704, 32 },
+  { "r23", 736, 32 },
+  { "r24", 768, 32 },
+  { "r25", 800, 32 },
+  { "r26", 832, 32 },
+  { "r27", 864, 32 },
+  { "r28", 896, 32 },
+  { "r29", 928, 32 },
+  { "r30", 960, 32 },
+  { "r31", 992, 32 },
+  { "status", 1024, 32 },
+  { "lo", 1056, 32 },
+  { "hi", 1088, 32 },
+  { "badvaddr", 1120, 32 },
+  { "cause", 1152, 32 },
+  { "pc", 1184, 32 },
+  { "f0", 1216, 32 },
+  { "f1", 1248, 32 },
+  { "f2", 1280, 32 },
+  { "f3", 1312, 32 },
+  { "f4", 1344, 32 },
+  { "f5", 1376, 32 },
+  { "f6", 1408, 32 },
+  { "f7", 1440, 32 },
+  { "f8", 1472, 32 },
+  { "f9", 1504, 32 },
+  { "f10", 1536, 32 },
+  { "f11", 1568, 32 },
+  { "f12", 1600, 32 },
+  { "f13", 1632, 32 },
+  { "f14", 1664, 32 },
+  { "f15", 1696, 32 },
+  { "f16", 1728, 32 },
+  { "f17", 1760, 32 },
+  { "f18", 1792, 32 },
+  { "f19", 1824, 32 },
+  { "f20", 1856, 32 },
+  { "f21", 1888, 32 },
+  { "f22", 1920, 32 },
+  { "f23", 1952, 32 },
+  { "f24", 1984, 32 },
+  { "f25", 2016, 32 },
+  { "f26", 2048, 32 },
+  { "f27", 2080, 32 },
+  { "f28", 2112, 32 },
+  { "f29", 2144, 32 },
+  { "f30", 2176, 32 },
+  { "f31", 2208, 32 },
+  { "fcsr", 2240, 32 },
+  { "fir", 2272, 32 },
+  { "restart", 2304, 32 },
+};
+
+#define num_regs (sizeof (regs) / sizeof (regs[0]))
+
+static const char *expedite_regs[] = { "r29", "pc", 0 };
+
+static
+CORE_ADDR get_pc (void)
+{
+   unsigned long pc;
+
+   collect_register_by_name ("pc", &pc);
+
+   dlog(1, "stop pc is %p\n", (void *) pc);
+   return pc;
+}
+
+static
+void set_pc (CORE_ADDR newpc)
+{
+   Bool mod;
+   supply_register_by_name ("pc", &newpc, &mod);
+   if (mod)
+      dlog(1, "set pc to %p\n", C2v (newpc));
+   else
+      dlog(1, "set pc not changed %p\n", C2v (newpc));
+}
+
+/* store registers in the guest state (gdbserver_to_valgrind)
+   or fetch register from the guest state (valgrind_to_gdbserver). */
+static
+void transfer_register (ThreadId tid, int abs_regno, void * buf,
+                        transfer_direction dir, int size, Bool *mod)
+{
+   ThreadState* tst = VG_(get_ThreadState)(tid);
+   int set = abs_regno / num_regs;
+   int regno = abs_regno % num_regs;
+   *mod = False;
+
+   VexGuestMIPS32State* mips1 = (VexGuestMIPS32State*) get_arch (set, tst);
+
+   switch (regno) { 
+   case 0:  VG_(transfer) (&mips1->guest_r0,  buf, dir, size, mod); break;
+   case 1:  VG_(transfer) (&mips1->guest_r1,  buf, dir, size, mod); break;
+   case 2:  VG_(transfer) (&mips1->guest_r2,  buf, dir, size, mod); break;
+   case 3:  VG_(transfer) (&mips1->guest_r3,  buf, dir, size, mod); break;
+   case 4:  VG_(transfer) (&mips1->guest_r4,  buf, dir, size, mod); break;
+   case 5:  VG_(transfer) (&mips1->guest_r5,  buf, dir, size, mod); break;
+   case 6:  VG_(transfer) (&mips1->guest_r6,  buf, dir, size, mod); break;
+   case 7:  VG_(transfer) (&mips1->guest_r7,  buf, dir, size, mod); break;
+   case 8:  VG_(transfer) (&mips1->guest_r8,  buf, dir, size, mod); break;
+   case 9:  VG_(transfer) (&mips1->guest_r9,  buf, dir, size, mod); break;
+   case 10: VG_(transfer) (&mips1->guest_r10,  buf, dir, size, mod); break;
+   case 11: VG_(transfer) (&mips1->guest_r11,  buf, dir, size, mod); break;
+   case 12: VG_(transfer) (&mips1->guest_r12, buf, dir, size, mod); break;
+   case 13: VG_(transfer) (&mips1->guest_r13, buf, dir, size, mod); break;
+   case 14: VG_(transfer) (&mips1->guest_r14, buf, dir, size, mod); break;
+   case 15: VG_(transfer) (&mips1->guest_r15, buf, dir, size, mod); break;
+   case 16: VG_(transfer) (&mips1->guest_r16, buf, dir, size, mod); break;
+   case 17: VG_(transfer) (&mips1->guest_r17, buf, dir, size, mod); break;
+   case 18: VG_(transfer) (&mips1->guest_r18,  buf, dir, size, mod); break;
+   case 19: VG_(transfer) (&mips1->guest_r19,  buf, dir, size, mod); break;
+   case 20: VG_(transfer) (&mips1->guest_r20,  buf, dir, size, mod); break;
+   case 21: VG_(transfer) (&mips1->guest_r21,  buf, dir, size, mod); break;
+   case 22: VG_(transfer) (&mips1->guest_r22,  buf, dir, size, mod); break;
+   case 23: VG_(transfer) (&mips1->guest_r23,  buf, dir, size, mod); break;
+   case 24: VG_(transfer) (&mips1->guest_r24,  buf, dir, size, mod); break;
+   case 25: VG_(transfer) (&mips1->guest_r25,  buf, dir, size, mod); break;
+   case 26: VG_(transfer) (&mips1->guest_r26,  buf, dir, size, mod); break;
+   case 27: VG_(transfer) (&mips1->guest_r27,  buf, dir, size, mod); break;
+   case 28: VG_(transfer) (&mips1->guest_r28, buf, dir, size, mod); break;
+   case 29: VG_(transfer) (&mips1->guest_r29, buf, dir, size, mod); break;
+   case 30: VG_(transfer) (&mips1->guest_r30, buf, dir, size, mod); break;
+   case 31: VG_(transfer) (&mips1->guest_r31, buf, dir, size, mod); break;
+   case 32: *mod = False; break; // GDBTD???? VEX { "status", 1024, 32 },
+   case 33: VG_(transfer) (&mips1->guest_LO, buf, dir, size, mod); break;
+   case 34: VG_(transfer) (&mips1->guest_HI, buf, dir, size, mod); break;
+   case 35: *mod = False; break; // GDBTD???? VEX { "badvaddr", 1120, 32 },
+   case 36: *mod = False; break; // GDBTD???? VEX { "cause", 1152, 32 },
+   case 37: VG_(transfer) (&mips1->guest_PC,  buf, dir, size, mod); break;
+   case 38: VG_(transfer) (&mips1->guest_f0,  buf, dir, size, mod); break;
+   case 39: VG_(transfer) (&mips1->guest_f1,  buf, dir, size, mod); break;
+   case 40: VG_(transfer) (&mips1->guest_f2,  buf, dir, size, mod); break;
+   case 41: VG_(transfer) (&mips1->guest_f3,  buf, dir, size, mod); break;
+   case 42: VG_(transfer) (&mips1->guest_f4,  buf, dir, size, mod); break;
+   case 43: VG_(transfer) (&mips1->guest_f5,  buf, dir, size, mod); break;
+   case 44: VG_(transfer) (&mips1->guest_f6,  buf, dir, size, mod); break;
+   case 45: VG_(transfer) (&mips1->guest_f7, buf, dir, size, mod); break;
+   case 46: VG_(transfer) (&mips1->guest_f8, buf, dir, size, mod); break;
+   case 47: VG_(transfer) (&mips1->guest_f9, buf, dir, size, mod); break;
+   case 48: VG_(transfer) (&mips1->guest_f10, buf, dir, size, mod); break;
+   case 49: VG_(transfer) (&mips1->guest_f11, buf, dir, size, mod); break;
+   case 50: VG_(transfer) (&mips1->guest_f12, buf, dir, size, mod); break;
+   case 51: VG_(transfer) (&mips1->guest_f13,  buf, dir, size, mod); break;
+   case 52: VG_(transfer) (&mips1->guest_f14,  buf, dir, size, mod); break;
+   case 53: VG_(transfer) (&mips1->guest_f15,  buf, dir, size, mod); break;
+   case 54: VG_(transfer) (&mips1->guest_f16,  buf, dir, size, mod); break;
+   case 55: VG_(transfer) (&mips1->guest_f17,  buf, dir, size, mod); break;
+   case 56: VG_(transfer) (&mips1->guest_f18,  buf, dir, size, mod); break;
+   case 57: VG_(transfer) (&mips1->guest_f19, buf, dir, size, mod); break;
+   case 58: VG_(transfer) (&mips1->guest_f20, buf, dir, size, mod); break;
+   case 59: VG_(transfer) (&mips1->guest_f21, buf, dir, size, mod); break;
+   case 60: VG_(transfer) (&mips1->guest_f22, buf, dir, size, mod); break;
+   case 61: VG_(transfer) (&mips1->guest_f23, buf, dir, size, mod); break;
+   case 62: VG_(transfer) (&mips1->guest_f24,  buf, dir, size, mod); break;
+   case 63: VG_(transfer) (&mips1->guest_f25,  buf, dir, size, mod); break;
+   case 64: VG_(transfer) (&mips1->guest_f26,  buf, dir, size, mod); break;
+   case 65: VG_(transfer) (&mips1->guest_f27,  buf, dir, size, mod); break;
+   case 66: VG_(transfer) (&mips1->guest_f28,  buf, dir, size, mod); break;
+   case 67: VG_(transfer) (&mips1->guest_f29,  buf, dir, size, mod); break;
+   case 68: VG_(transfer) (&mips1->guest_f30, buf, dir, size, mod); break;
+   case 69: VG_(transfer) (&mips1->guest_f31, buf, dir, size, mod); break;
+   case 70: VG_(transfer) (&mips1->guest_FCSR, buf, dir, size, mod); break;
+   case 71: VG_(transfer) (&mips1->guest_FIR, buf, dir, size, mod); break;
+   case 72: *mod = False; break; // GDBTD???? VEX{ "restart", 2304, 32 },
+   default: VG_(printf)("regno: %d\n", regno); vg_assert(0);
+   }
+}
+
+static
+char* target_xml (Bool shadow_mode)
+{
+   if (shadow_mode) {
+      return "mips-linux-valgrind.xml";
+   } else {
+      return "mips-linux.xml";
+   }  
+}
+
+static struct valgrind_target_ops low_target = {
+   num_regs,
+   regs,
+   29, //sp = r29, which is register offset 29 in regs
+   transfer_register,
+   get_pc,
+   set_pc,
+   "mips",
+   target_xml
+};
+
+void mips32_init_architecture (struct valgrind_target_ops *target)
+{
+   *target = low_target;
+   set_register_cache (regs, num_regs);
+   gdbserver_expedite_regs = expedite_regs;
+}
diff --git a/main/coregrind/m_gdbserver/valgrind-low-ppc32.c b/main/coregrind/m_gdbserver/valgrind-low-ppc32.c
index a7e282e..9f2f36e 100644
--- a/main/coregrind/m_gdbserver/valgrind-low-ppc32.c
+++ b/main/coregrind/m_gdbserver/valgrind-low-ppc32.c
@@ -39,7 +39,7 @@
 /* this is only the basic set of registers.
    Need to look at what is the exact ppc32 model to support.
 */
-struct reg regs[] = {
+static struct reg regs[] = {
   { "r0", 0, 32 },
   { "r1", 32, 32 },
   { "r2", 64, 32 },
@@ -322,6 +322,16 @@
    }
 }
 
+static
+char* target_xml (Bool shadow_mode)
+{
+   if (shadow_mode) {
+      return "powerpc-altivec32l-valgrind.xml";
+   } else {
+      return "powerpc-altivec32l.xml";
+   }  
+}
+
 static struct valgrind_target_ops low_target = {
    num_regs,
    regs,
@@ -330,8 +340,7 @@
    get_pc,
    set_pc,
    "ppc32",
-   "powerpc-altivec32l.xml",
-   "powerpc-altivec32l-valgrind.xml"
+   target_xml
 };
 
 void ppc32_init_architecture (struct valgrind_target_ops *target)
diff --git a/main/coregrind/m_gdbserver/valgrind-low-ppc64.c b/main/coregrind/m_gdbserver/valgrind-low-ppc64.c
index f2fdbec..9b1a358 100644
--- a/main/coregrind/m_gdbserver/valgrind-low-ppc64.c
+++ b/main/coregrind/m_gdbserver/valgrind-low-ppc64.c
@@ -36,7 +36,7 @@
 
 #include "libvex_guest_ppc64.h"
 
-struct reg regs[] = {
+static struct reg regs[] = {
   { "r0", 0, 64 },
   { "r1", 64, 64 },
   { "r2", 128, 64 },
@@ -319,6 +319,16 @@
    }
 }
 
+static
+char* target_xml (Bool shadow_mode)
+{
+   if (shadow_mode) {
+      return "powerpc-altivec64l-valgrind.xml";
+   } else {
+      return "powerpc-altivec64l.xml";
+   }  
+}
+
 static struct valgrind_target_ops low_target = {
    num_regs,
    regs,
@@ -327,8 +337,7 @@
    get_pc,
    set_pc,
    "ppc64",
-   "powerpc-altivec64l.xml",
-   "powerpc-altivec64l-valgrind.xml"
+   target_xml
 };
 
 void ppc64_init_architecture (struct valgrind_target_ops *target)
diff --git a/main/coregrind/m_gdbserver/valgrind-low-s390x.c b/main/coregrind/m_gdbserver/valgrind-low-s390x.c
index baa3ffc..017a402 100644
--- a/main/coregrind/m_gdbserver/valgrind-low-s390x.c
+++ b/main/coregrind/m_gdbserver/valgrind-low-s390x.c
@@ -36,7 +36,7 @@
 
 #include "libvex_guest_s390x.h"
 
-struct reg regs[] = {
+static struct reg regs[] = {
   { "pswm", 0, 64 },
   { "pswa", 64, 64 },
   { "r0", 128, 64 },
@@ -88,6 +88,7 @@
   { "f13", 2528, 64 },
   { "f14", 2592, 64 },
   { "f15", 2656, 64 },
+  { "orig_r2", 2720, 64 },
 };
 static const char *expedite_regs[] = { "r14", "r15", "pswa", 0 };
 #define num_regs (sizeof (regs) / sizeof (regs[0]))
@@ -181,10 +182,21 @@
    case 48: VG_(transfer) (&s390x->guest_f13, buf, dir, size, mod); break;
    case 49: VG_(transfer) (&s390x->guest_f14, buf, dir, size, mod); break;
    case 50: VG_(transfer) (&s390x->guest_f15, buf, dir, size, mod); break;
+   case 51:  *mod = False; break; //GDBTD??? { "orig_r2", 0, 64 },  
    default: vg_assert(0);
    }
 }
 
+static
+char* target_xml (Bool shadow_mode)
+{
+   if (shadow_mode) {
+      return "s390x-generic-valgrind.xml";
+   } else {
+      return "s390x-generic.xml";
+   }  
+}
+
 static struct valgrind_target_ops low_target = {
    num_regs,
    regs,
@@ -193,8 +205,7 @@
    get_pc,
    set_pc,
    "s390x",
-   NULL, // target_xml not needed.
-   NULL // no xml shadow target description (yet?)
+   target_xml
 };
 
 void s390x_init_architecture (struct valgrind_target_ops *target)
diff --git a/main/coregrind/m_gdbserver/valgrind-low-x86.c b/main/coregrind/m_gdbserver/valgrind-low-x86.c
index 89ef329..50d3193 100644
--- a/main/coregrind/m_gdbserver/valgrind-low-x86.c
+++ b/main/coregrind/m_gdbserver/valgrind-low-x86.c
@@ -137,16 +137,7 @@
    case 5:  VG_(transfer) (&x86->guest_EBP, buf, dir, size, mod); break;
    case 6:  VG_(transfer) (&x86->guest_ESI, buf, dir, size, mod); break;
    case 7:  VG_(transfer) (&x86->guest_EDI, buf, dir, size, mod); break;
-   case 8:  
-      VG_(transfer) (&x86->guest_EIP, buf, dir, size, mod); 
-      if (*mod && VG_(debugLog_getLevel)() > 2) {
-         char bufimage [2*sizeof(x86->guest_IP_AT_SYSCALL) + 1];
-         heximage (bufimage, 
-                   (char *) &x86->guest_IP_AT_SYSCALL, 
-                   sizeof(x86->guest_IP_AT_SYSCALL));
-         dlog(3, "guest_IP_AT_SYSCALL %s\n", bufimage);
-      }
-      break;
+   case 8:  VG_(transfer) (&x86->guest_EIP, buf, dir, size, mod); break;
    case 9:  
       if (dir == valgrind_to_gdbserver) {
          UInt eflags;
@@ -252,6 +243,20 @@
    }
 }
 
+static
+char* target_xml (Bool shadow_mode)
+{
+   if (shadow_mode) {
+#if defined(VGO_linux)
+   return "i386-linux-valgrind.xml";
+#else
+   return "i386-coresse-valgrind.xml";
+#endif
+   } else {
+      return NULL;
+   }  
+}
+
 static struct valgrind_target_ops low_target = {
    num_regs,
    regs,
@@ -260,12 +265,7 @@
    get_pc,
    set_pc,
    "i386",
-   NULL, // target_xml not needed.
-#if defined(VGO_linux)
-   "i386-linux-valgrind.xml"
-#else
-   "i386-coresse-valgrind.xml"
-#endif
+   target_xml
 };
 
 void x86_init_architecture (struct valgrind_target_ops *target)
diff --git a/main/coregrind/m_gdbserver/valgrind-low.c b/main/coregrind/m_gdbserver/valgrind-low.c
deleted file mode 100644
index 5d3f708..0000000
--- a/main/coregrind/m_gdbserver/valgrind-low.c
+++ /dev/null
@@ -1,639 +0,0 @@
-/* Low level interface to valgrind, for the remote server for GDB integrated
-   in valgrind.
-   Copyright (C) 2011
-   Free Software Foundation, Inc.
-
-   This file is part of VALGRIND.
-   It has been inspired from a file from gdbserver in gdb 6.6.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-#include "server.h"
-#include "target.h"
-#include "regdef.h"
-#include "regcache.h"
-#include "valgrind_low.h"
-#include "gdb/signals.h"
-#include "pub_core_aspacemgr.h"
-#include "pub_tool_machine.h"
-#include "pub_core_threadstate.h"
-#include "pub_core_transtab.h"
-#include "pub_core_gdbserver.h" 
-#include "pub_tool_debuginfo.h"
-
-/* the_low_target defines the architecture specific aspects depending
-   on the cpu */
-static struct valgrind_target_ops the_low_target;
-
-/* builds an image of bin according to byte order of the architecture 
-   Useful for register and int image */
-char* heximage (char *buf, char *bin, int count)
-{
-#if defined(VGA_x86) || defined(VGA_amd64)
-   char rev[count]; 
-   /* note: no need for trailing \0, length is known with count */
-  int i;
-  for (i = 0; i < count; i++)
-    rev[i] = bin[count - i - 1];
-  hexify (buf, rev, count);
-#else
-  hexify (buf, bin, count);
-#endif
-  return buf;
-}
-
-void* C2v(CORE_ADDR addr)
-{
-   return (void*) addr;
-}
-
-static
-char *image_ptid(unsigned long ptid)
-{
-  static char result[100];
-  VG_(sprintf) (result, "id %ld", ptid);
-  return result;
-}
-#define get_thread(inf) ((struct thread_info *)(inf))
-static
-void remove_thread_if_not_in_vg_threads (struct inferior_list_entry *inf)
-{
-  struct thread_info *thread = get_thread (inf);
-  if (!VG_(lwpid_to_vgtid)(thread_to_gdb_id(thread))) {
-     dlog(1, "removing gdb ptid %s\n", 
-          image_ptid(thread_to_gdb_id(thread)));
-     remove_thread (thread);
-  }
-}
-
-/* synchronize threads known by valgrind and threads known by gdbserver */
-static
-void valgrind_update_threads (int pid)
-{
-  ThreadId tid;
-  ThreadState *ts;
-  unsigned long ptid;
-  struct thread_info *ti;
-
-  /* call remove_thread for all gdb threads not in valgrind threads */
-  for_each_inferior (&all_threads, remove_thread_if_not_in_vg_threads);
-  
-  /* call add_thread for all valgrind threads not known in gdb all_threads */
-  for (tid = 1; tid < VG_N_THREADS; tid++) {
-
-#define LOCAL_THREAD_TRACE " ti* %p vgtid %d status %s as gdb ptid %s lwpid %d\n", \
-        ti, tid, VG_(name_of_ThreadStatus) (ts->status), \
-        image_ptid (ptid), ts->os_state.lwpid
-
-     if (VG_(is_valid_tid) (tid)) {
-        ts = VG_(get_ThreadState) (tid);
-        ptid = ts->os_state.lwpid;
-        ti = gdb_id_to_thread (ptid);
-        if (!ti) {
-           /* we do not report the threads which are not yet fully
-              initialized otherwise this creates duplicated threads
-              in gdb: once with pid xxx lwpid 0, then after that
-              with pid xxx lwpid yyy. */
-           if (ts->status != VgTs_Init) {
-              dlog(1, "adding_thread" LOCAL_THREAD_TRACE);
-              add_thread (ptid, ts, ptid);
-           }
-        } else {
-           dlog(2, "(known thread)" LOCAL_THREAD_TRACE);
-        }
-     }
-#undef LOCAL_THREAD_TRACE
-  }
-}
-
-/* Return nonzero if the given thread is still alive.  */
-static
-int valgrind_thread_alive (unsigned long tid)
-{
-  struct thread_info *ti =  gdb_id_to_thread(tid);
-  ThreadState *tst;
-
-  if (ti != NULL) {
-     tst = (ThreadState *) inferior_target_data (ti);
-     return tst->status != VgTs_Zombie;
-  }
-  else {
-    return 0;
-  }
-}
-
-/* allocate and build a register structure containing the shadow registers.
-   reg_defs is the normal registers, n is their numbers */
-static
-struct reg* build_shadow_arch (struct reg *reg_defs, int n) {
-   int i, r;
-   static char *postfix[3] = { "", "s1", "s2" };
-   struct reg *new_regs = malloc(3 * n * sizeof(reg_defs[0]));
-   int reg_set_len = reg_defs[n-1].offset + reg_defs[n-1].size;
-
-   for (i = 0; i < 3; i++) {
-      for (r = 0; r < n; r++) {
-         new_regs[i*n + r].name = malloc(strlen(reg_defs[r].name) 
-                                         + strlen (postfix[i]) + 1);
-         strcpy (new_regs[i*n + r].name, reg_defs[r].name);
-         strcat (new_regs[i*n + r].name, postfix[i]);
-         new_regs[i*n + r].offset = i*reg_set_len + reg_defs[r].offset;
-         new_regs[i*n + r].size = reg_defs[r].size;
-         dlog(1,
-              "%10s Nr %d offset(bit) %d offset(byte) %d  size(bit) %d\n",
-              new_regs[i*n + r].name, i*n + r, new_regs[i*n + r].offset,
-              (new_regs[i*n + r].offset) / 8, new_regs[i*n + r].size);
-      }  
-   }
-
-   return new_regs;
-}
-
-/* Fetch one register from valgrind VEX guest state.  */
-static
-void fetch_register (int regno)
-{
-   int size;
-   ThreadState *tst = (ThreadState *) inferior_target_data (current_inferior);
-   ThreadId tid = tst->tid;
-
-   if (regno >= the_low_target.num_regs) {
-      dlog(0, "error fetch_register regno %d max %d\n",
-           regno, the_low_target.num_regs);
-      return;
-   }
-   size = register_size (regno);
-   if (size > 0) {
-      Bool mod;
-      char buf [size];
-      VG_(memset) (buf, 0, size); // registers not fetched will be seen as 0.
-      (*the_low_target.transfer_register) (tid, regno, buf,
-                                           valgrind_to_gdbserver, size, &mod);
-      // Note: the *mod received from transfer_register is not interesting.
-      // We are interested to see if the register data in the register cache is modified.
-      supply_register (regno, buf, &mod);
-      if (mod && VG_(debugLog_getLevel)() > 1) {
-         char bufimage [2*size + 1];
-         heximage (bufimage, buf, size);
-         dlog(2, "fetched register %d size %d name %s value %s tid %d status %s\n", 
-              regno, size, the_low_target.reg_defs[regno].name, bufimage, 
-              tid, VG_(name_of_ThreadStatus) (tst->status));
-      }
-   }
-}
-
-/* Fetch all registers, or just one, from the child process.  */
-static
-void usr_fetch_inferior_registers (int regno)
-{
-   if (regno == -1 || regno == 0)
-      for (regno = 0; regno < the_low_target.num_regs; regno++)
-         fetch_register (regno);
-   else
-      fetch_register (regno);
-}
-
-/* Store our register values back into the inferior.
-   If REGNO is -1, do this for all registers.
-   Otherwise, REGNO specifies which register (so we can save time).  */
-static
-void usr_store_inferior_registers (int regno)
-{
-   int size;
-   ThreadState *tst = (ThreadState *) inferior_target_data (current_inferior);
-   ThreadId tid = tst->tid;
-   
-   if (regno >= 0) {
-
-      if (regno >= the_low_target.num_regs) {
-         dlog(0, "error store_register regno %d max %d\n",
-              regno, the_low_target.num_regs);
-         return;
-      }
-      
-      size = register_size (regno);
-      if (size > 0) {
-         Bool mod;
-         Addr old_SP, new_SP;
-         char buf[size];
-
-         if (regno == the_low_target.stack_pointer_regno) {
-            /* When the stack pointer register is changed such that
-               the stack is extended, we better inform the tool of the
-               stack increase.  This is needed in particular to avoid
-               spurious Memcheck errors during Inferior calls. So, we
-               save in old_SP the SP before the change. A change of
-               stack pointer is also assumed to have initialised this
-               new stack space. For the typical example of an inferior
-               call, gdb writes arguments on the stack, and then
-               changes the stack pointer. As the stack increase tool
-               function might mark it as undefined, we have to call it
-               at the good moment. */
-            VG_(memset) ((void *) &old_SP, 0, size);
-            (*the_low_target.transfer_register) (tid, regno, (void *) &old_SP, 
-                                                 valgrind_to_gdbserver, size, &mod);
-         }
-
-         VG_(memset) (buf, 0, size);
-         collect_register (regno, buf);
-         (*the_low_target.transfer_register) (tid, regno, buf, 
-                                              gdbserver_to_valgrind, size, &mod);
-         if (mod && VG_(debugLog_getLevel)() > 1) {
-            char bufimage [2*size + 1];
-            heximage (bufimage, buf, size);
-            dlog(2, 
-                 "stored register %d size %d name %s value %s "
-                 "tid %d status %s\n", 
-                 regno, size, the_low_target.reg_defs[regno].name, bufimage, 
-                 tid, VG_(name_of_ThreadStatus) (tst->status));
-         }
-         if (regno == the_low_target.stack_pointer_regno) {
-            VG_(memcpy) (&new_SP, buf, size);
-            if (old_SP > new_SP) {
-               Word delta  = (Word)new_SP - (Word)old_SP;
-               dlog(1, 
-                    "   stack increase by stack pointer changed from %p to %p "
-                    "delta %ld\n",
-                    (void*) old_SP, (void *) new_SP,
-                    delta);
-               VG_TRACK( new_mem_stack_w_ECU, new_SP, -delta, 0 );
-               VG_TRACK( new_mem_stack,       new_SP, -delta );
-               if (VG_(tdict).track_post_mem_write) {
-                  VG_(tdict).track_post_mem_write( Vg_CoreClientReq, tid, 
-                                                   new_SP, -delta);
-               }
-            }
-         }
-      }
-   }
-   else {
-      for (regno = 0; regno < the_low_target.num_regs; regno++)
-         usr_store_inferior_registers (regno);
-   }
-}
-
-static
-void valgrind_fetch_registers (int regno)
-{
-   usr_fetch_inferior_registers (regno);
-}
-
-static
-void valgrind_store_registers (int regno)
-{
-   usr_store_inferior_registers (regno);
-}
-
-/* Copy LEN bytes from inferior's memory starting at MEMADDR
-   to debugger memory starting at MYADDR.  */
-
-static
-int valgrind_read_memory (CORE_ADDR memaddr, unsigned char *myaddr, int len)
-{
-   const void *sourceaddr = C2v (memaddr);
-   dlog(2, "reading memory %p size %d\n", sourceaddr, len);
-   if (!VG_(am_is_valid_for_client_or_free_or_resvn) ((Addr) sourceaddr, 
-                                                      len, VKI_PROT_READ)) {
-      dlog(1, "error reading memory %p size %d\n", sourceaddr, len);
-      return -1;
-   }
-   VG_(memcpy) (myaddr, sourceaddr, len);
-   return 0;
-}
-
-/* Copy LEN bytes of data from debugger memory at MYADDR
-   to inferior's memory at MEMADDR.
-   On failure (cannot write the inferior)
-   returns the value of errno.  */
-
-static
-int valgrind_write_memory (CORE_ADDR memaddr, const unsigned char *myaddr, int len)
-{
-   void *targetaddr = C2v (memaddr);
-   dlog(2, "writing memory %p size %d\n", targetaddr, len);
-   if (!VG_(am_is_valid_for_client_or_free_or_resvn) ((Addr)targetaddr, 
-                                                      len, VKI_PROT_WRITE)) {
-      dlog(1, "error writing memory %p size %d\n", targetaddr, len);
-      return -1;
-   }
-   if (len > 0) {
-      VG_(memcpy) (targetaddr, myaddr, len);
-      if (VG_(tdict).track_post_mem_write) {
-         /* Inform the tool of the post memwrite.  Note that we do the
-            minimum necessary to avoid complains from e.g.
-            memcheck. The idea is that the debugger is as least
-            intrusive as possible.  So, we do not inform of the pre
-            mem write (and in any case, this would cause problems with
-            memcheck that does not like our CorePart in
-            pre_mem_write. */
-         ThreadState *tst = (ThreadState *) inferior_target_data (current_inferior);
-         ThreadId tid = tst->tid;
-         VG_(tdict).track_post_mem_write( Vg_CoreClientReq, tid, (Addr) targetaddr, len );
-      }
-   }
-   return 0;
-}
-
-/* insert or remove a breakpoint */
-static
-int valgrind_point (Bool insert, char type, CORE_ADDR addr, int len)
-{
-   PointKind kind;
-   switch (type) {
-   case '0': /* implemented by inserting checks at each instruction in sb */
-      kind = software_breakpoint;
-      break;
-   case '1': /* hw breakpoint, same implementation as sw breakpoint */
-      kind = hardware_breakpoint;
-      break;
-   case '2':
-      kind = write_watchpoint;
-      break;
-   case '3':
-      kind = read_watchpoint;
-      break;
-   case '4':
-      kind = access_watchpoint;
-      break;
-   default:
-      vg_assert (0);
-   }
-
-   /* Attention: gdbserver convention differs: 0 means ok; 1 means not ok */
-   if (VG_(gdbserver_point) (kind, insert, addr, len))
-      return 0;
-   else
-      return 1; /* error or unsupported */
-}
-
-static
-void valgrind_send_signal (int sig)
-{
-   dlog(1, "valgrind_send_signal %d called ????\n", sig); 
-}
-
-static
-char* valgrind_target_xml (void)
-{
-   return (char *) the_low_target.target_xml;
-}
-
-static
-char* valgrind_shadow_target_xml (void)
-{
-   return (char *) the_low_target.shadow_target_xml;
-}
-
-static
-int valgrind_insert_point (char type, CORE_ADDR addr, int len)
-{
-   return valgrind_point (/* insert */ True, type, addr, len);
-}
-
-static
-int valgrind_remove_point (char type, CORE_ADDR addr, int len)
-{
-   return valgrind_point (/* insert*/ False, type, addr, len);
-}
-
-static CORE_ADDR stopped_data_address = 0;
-void VG_(set_watchpoint_stop_address) (Addr addr)
-{
-   stopped_data_address = addr;
-}
-
-static
-int valgrind_stopped_by_watchpoint (void)
-{
-   return stopped_data_address != 0;
-}
-
-static
-CORE_ADDR valgrind_stopped_data_address (void)
-{
-   return stopped_data_address;
-}
-
-/* pc at which we last stopped */
-static CORE_ADDR stop_pc;
-
-/* pc at which we resume. 
-   If stop_pc != resume_pc, it means
-      gdb/gdbserver has changed the pc so as to have either
-      a    "continue by jumping at that address"
-      or a "continue at that address to call some code from gdb".
-*/
-static CORE_ADDR resume_pc;
-
-static int signal_to_report;
-
-void gdbserver_signal_encountered (Int sigNo)
-{
-   signal_to_report = sigNo;
-}
-
-static int signal_to_deliver;
-Bool gdbserver_deliver_signal (Int sigNo)
-{
-   return sigNo == signal_to_deliver;
-}
-
-static
-char* sym (Addr addr)
-{
-   static char buf[200];
-   VG_(describe_IP) (addr, buf, 200);
-   return buf;
-}
-
-ThreadId vgdb_interrupted_tid = 0;
-/* called to wait for the process to stop */
-static
-unsigned char valgrind_wait (char *ourstatus)
-{
-   int pid;
-   unsigned long wptid;
-   ThreadState *tst;
-   enum target_signal sig;
-
-   pid = VG_(getpid) ();
-   dlog(1, "enter valgrind_wait pid %d\n", pid);
-
-   regcache_invalidate();
-   valgrind_update_threads(pid);
-
-   /* in valgrind, we consider that a wait always succeeds with STOPPED 'T' 
-      and with a signal TRAP (i.e. a breakpoint), unless there is
-      a signal to report. */
-   *ourstatus = 'T';
-   if (signal_to_report == 0)
-      sig = TARGET_SIGNAL_TRAP;
-   else
-      sig = target_signal_from_host(signal_to_report);
-   
-   if (vgdb_interrupted_tid != 0)
-      tst = VG_(get_ThreadState) (vgdb_interrupted_tid);
-   else
-      tst = VG_(get_ThreadState) (VG_(running_tid));
-   wptid = tst->os_state.lwpid;
-   /* we can only change the current_inferior when the wptid references
-      an existing thread. Otherwise, we are still in the init phase.
-      (hack similar to main thread hack in valgrind_update_threads) */
-   if (tst->os_state.lwpid)
-      current_inferior = gdb_id_to_thread (wptid);
-   stop_pc = (*the_low_target.get_pc) ();
-   
-   dlog(1,
-        "exit valgrind_wait returns ptid %s stop_pc %s signal %d\n", 
-        image_ptid (wptid), sym (stop_pc), sig);
-   return sig;
-}
-
-/* 0 => not single stepping.
-   1 => single stepping asked by gdb
-   2 => single stepping asked by valgrind (watchpoint) */
-static int stepping = 0;
-
-/* called when the process is to be resumed */
-static
-void valgrind_resume (struct thread_resume *resume_info)
-{
-   dlog(1,
-        "resume_info thread %ld leave_stopped %d step %d sig %d stepping %d\n", 
-        resume_info->thread,
-        resume_info->leave_stopped,
-        resume_info->step,
-        resume_info->sig,
-        stepping);
-   if (valgrind_stopped_by_watchpoint()) {
-      dlog(1, "clearing watchpoint stopped_data_address %p\n",
-           C2v(stopped_data_address));
-      VG_(set_watchpoint_stop_address) ((Addr) 0);
-   }
-   signal_to_deliver = resume_info->sig;
-   
-   stepping = resume_info->step;
-   resume_pc = (*the_low_target.get_pc) ();
-   if (resume_pc != stop_pc) {
-      dlog(1,
-           "stop_pc %p changed to be resume_pc %s\n",
-           C2v(stop_pc), sym(resume_pc));
-   }
-   regcache_invalidate();
-}
-
-Addr valgrind_get_ignore_break_once(void)
-{
-   if (valgrind_single_stepping())
-      return resume_pc;
-   else
-      return 0;
-}
-
-
-void valgrind_set_single_stepping(Bool set)
-{
-   if (set)
-      stepping = 2;
-   else
-      stepping = 0;
-}
-
-Bool valgrind_single_stepping(void)
-{
-   if (stepping)
-      return True;
-   else
-      return False;
-}
-
-static struct target_ops valgrind_target_ops = {
-   valgrind_thread_alive,
-   valgrind_resume,
-   valgrind_wait,
-   valgrind_fetch_registers,
-   valgrind_store_registers,
-   valgrind_read_memory,
-   valgrind_write_memory,
-   valgrind_send_signal,
-   valgrind_target_xml,
-   valgrind_shadow_target_xml,
-   valgrind_insert_point,
-   valgrind_remove_point,
-   valgrind_stopped_by_watchpoint,
-   valgrind_stopped_data_address,
-};
-
-
-/* returns a pointer to the architecture state corresponding to
-   the provided register set: 0 => normal guest registers,
-                              1 => shadow1
-                              2 => shadow2
-*/
-VexGuestArchState* get_arch (int set, ThreadState* tst) 
-{
-  switch (set) {
-  case 0: return &tst->arch.vex;
-  case 1: return &tst->arch.vex_shadow1;
-  case 2: return &tst->arch.vex_shadow2;
-  default: vg_assert(0);
-  }
-}
-
-static int non_shadow_num_regs = 0;
-static struct reg *non_shadow_reg_defs = NULL;
-void initialize_shadow_low(Bool shadow_mode)
-{
-  if (non_shadow_reg_defs == NULL) {
-    non_shadow_reg_defs = the_low_target.reg_defs;
-    non_shadow_num_regs = the_low_target.num_regs;
-  }
-
-  regcache_invalidate();
-  if (the_low_target.reg_defs != non_shadow_reg_defs) {
-     free (the_low_target.reg_defs);
-  }
-  if (shadow_mode) {
-    the_low_target.num_regs = 3 * non_shadow_num_regs;
-    the_low_target.reg_defs = build_shadow_arch (non_shadow_reg_defs, non_shadow_num_regs);
-  } else {
-    the_low_target.num_regs = non_shadow_num_regs;
-    the_low_target.reg_defs = non_shadow_reg_defs;
-  }
-  set_register_cache (the_low_target.reg_defs, the_low_target.num_regs);
-}
-
-void initialize_low(void)
-{
-   set_target_ops (&valgrind_target_ops);
-
-#if defined(VGA_x86)
-   x86_init_architecture(&the_low_target);
-#elif defined(VGA_amd64)
-   amd64_init_architecture(&the_low_target);
-#elif defined(VGA_arm)
-   arm_init_architecture(&the_low_target);
-#elif defined(VGA_ppc32)
-   ppc32_init_architecture(&the_low_target);
-#elif defined(VGA_ppc64)
-   ppc64_init_architecture(&the_low_target);
-#elif defined(VGA_s390x)
-   s390x_init_architecture(&the_low_target);
-#else
-   architecture missing in valgrind-low.c
-#endif
-
-}
diff --git a/main/coregrind/m_gdbserver/valgrind_low.h b/main/coregrind/m_gdbserver/valgrind_low.h
index 6817110..0348895 100644
--- a/main/coregrind/m_gdbserver/valgrind_low.h
+++ b/main/coregrind/m_gdbserver/valgrind_low.h
@@ -54,38 +54,25 @@
       or NULL not to answer.  */
    const char *arch_string;
    
-   /* Description of the set of registers.
+   /* Returns the target xml description of the set of registers.
       For some architectures (e.g. arm), it is mandatory
       to give a description of the registers, otherwise
       gdb does not understand the reply to the 'g' packet
-      (which is used to get the registers). */
-   const char *target_xml;
+      (which is used to get the registers).
+      If shadow_mode, returns a target xml description
+      including the two shadow registers sets.
+      This is mandatory to use the option --vgdb-shadow-registers=yes. 
+      Returns NULL if there is no target xml file*/
+   char* (*target_xml) (Bool shadow_mode);
 
-   /* Same as target_xml, but describes also the two shadow
-      registers set.
-      This is mandatory to use the option --vgdb-shadow-registers=yes. */
-   const char *shadow_target_xml;
 };
 
-
-/* convert from CORE_ADDR to void* */
-extern void* C2v(CORE_ADDR addr);
-
-/* builds an image of bin according to byte order of the architecture 
-   Useful for register and int image */
-extern char* heximage (char *buf, char *bin, int count);
-
-/* returns a pointer to the architecture state corresponding to
-   the provided register set: 0 => normal guest registers,
-                              1 => shadow1
-                              2 => shadow2 */
-VexGuestArchState* get_arch (int set, ThreadState* tst);
-
 extern void x86_init_architecture (struct valgrind_target_ops *target);
 extern void amd64_init_architecture (struct valgrind_target_ops *target);
 extern void arm_init_architecture (struct valgrind_target_ops *target);
 extern void ppc32_init_architecture (struct valgrind_target_ops *target);
 extern void ppc64_init_architecture (struct valgrind_target_ops *target);
 extern void s390x_init_architecture (struct valgrind_target_ops *target);
+extern void mips32_init_architecture (struct valgrind_target_ops *target);
 
 #endif