Fix JNI thread state transitions.

Thread state transitions need correct fencing. This change introduces
the fences and makes the behaviour match that of Thread::SetState.

Change-Id: Ia0ff68e2493ae153cf24d251e610b02b3f39d93e
diff --git a/src/assembler_x86.cc b/src/assembler_x86.cc
index e126d88..2aae7de 100644
--- a/src/assembler_x86.cc
+++ b/src/assembler_x86.cc
@@ -1585,6 +1585,14 @@
   }
 }
 
+void X86Assembler::MemoryBarrier(ManagedRegister) {
+#if ANDROID_SMP != 0
+  EmitUint8(0x0F);  // mfence
+  EmitUint8(0xAE);
+  EmitOperand(0, Operand(EAX));  // EAX is unused
+#endif
+}
+
 void X86Assembler::CreateSirtEntry(ManagedRegister mout_reg,
                                    FrameOffset sirt_offset,
                                    ManagedRegister min_reg, bool null_allowed) {
@@ -1699,9 +1707,9 @@
   __ Bind(&entry_);
   // Save return value
   __ Store(return_save_location_, return_register_, return_size_);
-  // Pass top of stack as argument
-  __ pushl(ESP);
-  __ fs()->call(Address::Absolute(Thread::SuspendCountEntryPointOffset()));
+  // Pass Thread::Current as argument
+  __ fs()->pushl(Address::Absolute(Thread::SelfOffset()));
+  __ fs()->call(Address::Absolute(OFFSETOF_MEMBER(Thread, pCheckSuspendFromCode)));
   // Release argument
   __ addl(ESP, Immediate(kPointerSize));
   // Reload return value