Ensure R4 is initialized for upcall. Sort suspend naming.

Change-Id: I73eb49e1af2ced971eeaafb7c07f5d964dae1824
diff --git a/src/asm_support.h b/src/asm_support.h
index 19a930d..f81966f 100644
--- a/src/asm_support.h
+++ b/src/asm_support.h
@@ -3,11 +3,12 @@
 #ifndef ART_SRC_ASM_SUPPORT_H_
 #define ART_SRC_ASM_SUPPORT_H_
 
+#define SUSPEND_CHECK_INTERVAL (1000)
+
 #if defined(__arm__)
 #define rSUSPEND r4
 #define rSELF r9
 #define rLR r14
-#define SUSPEND_CHECK_INTERVAL (1000)
 // Offset of field Thread::suspend_count_ verified in InitCpu
 #define THREAD_SUSPEND_COUNT_OFFSET 388
 // Offset of field Thread::suspend_count_ verified in InitCpu
diff --git a/src/jni_internal_arm.cc b/src/jni_internal_arm.cc
index ba13de7..93380b1 100644
--- a/src/jni_internal_arm.cc
+++ b/src/jni_internal_arm.cc
@@ -4,6 +4,7 @@
 
 #include <algorithm>
 
+#include "asm_support.h"
 #include "assembler.h"
 #include "compiled_method.h"
 #include "object.h"
@@ -45,6 +46,9 @@
   // Move the managed thread pointer into R9.
   __ mov(R9, ShifterOperand(R2));
 
+  // Reset R4 to suspend check intercal
+  __ LoadImmediate(R4, SUSPEND_CHECK_INTERVAL);
+
   // Move frame down for arguments less 3 pushed values above
   __ AddConstant(SP, -frame_size + (3 * kPointerSize));
 
diff --git a/src/runtime_support.cc b/src/runtime_support.cc
index db6cbf0..c7a04ec 100644
--- a/src/runtime_support.cc
+++ b/src/runtime_support.cc
@@ -685,11 +685,13 @@
   DCHECK(!thread->IsExceptionPending());
 }
 
-extern "C" void artCheckSuspendFromJni(Thread* thread) {
+void CheckSuspendFromCode(Thread* thread) {
+  // Called when thread->suspend_count_ != 0
   Runtime::Current()->GetThreadList()->FullSuspendCheck(thread);
 }
 
-extern "C" void artCheckSuspendFromCode(Thread* thread, Method** sp) {
+extern "C" void artTestSuspendFromCode(Thread* thread, Method** sp) {
+  // Called when suspend count check value is 0 and thread->suspend_count_ != 0
   FinishCalleeSaveFrameSetup(thread, sp, Runtime::kRefsOnly);
   Runtime::Current()->GetThreadList()->FullSuspendCheck(thread);
 }
diff --git a/src/runtime_support.h b/src/runtime_support.h
index d05ece0..2d34f9b 100644
--- a/src/runtime_support.h
+++ b/src/runtime_support.h
@@ -10,6 +10,7 @@
 
 namespace art {
 
+extern void CheckSuspendFromCode(Thread* thread);
 extern Array* CheckAndAllocArrayFromCode(uint32_t type_idx, Method* method, int32_t component_count,
                                          Thread* self);
 extern void DebugMe(Method* method, uint32_t info);
@@ -22,7 +23,6 @@
 extern Class* InitializeTypeFromCode(uint32_t type_idx, Method* method);
 extern void ResolveMethodFromCode(Method* method, uint32_t method_idx);
 extern void LockObjectFromCode(Thread* thread, Object* obj);
-extern "C" void artCheckSuspendFromJni(Thread* thread);
 extern int64_t D2L(double d);
 extern int64_t F2L(float f);
 
diff --git a/src/runtime_support_asm.S b/src/runtime_support_asm.S
index d86d1fb..4727fcf 100644
--- a/src/runtime_support_asm.S
+++ b/src/runtime_support_asm.S
@@ -421,7 +421,7 @@
     DELIVER_PENDING_EXCEPTION
 
     .global art_test_suspend
-    .extern artCheckSuspendFromCode
+    .extern artTestSuspendFromCode
 art_test_suspend:
     ldr    r0, [rSELF, #THREAD_SUSPEND_COUNT_OFFSET]
     mov    rSUSPEND, #SUSPEND_CHECK_INTERVAL  @ reset rSUSPEND to SUSPEND_CHECK_INTERVAL
@@ -430,7 +430,7 @@
     mov    r0, rSELF
     mov    r1, sp
     SETUP_REF_ONLY_CALLEE_SAVE_FRAME          @ save callee saves for stack crawl
-    bl     artCheckSuspendFromCode            @ (Thread*, SP)
+    bl     artTestSuspendFromCode             @ (Thread*, SP)
     RESTORE_REF_ONLY_CALLEE_SAVE_FRAME_AND_RETURN
 
     .global art_shl_long
diff --git a/src/thread.cc b/src/thread.cc
index 079954b..9f7fc20 100644
--- a/src/thread.cc
+++ b/src/thread.cc
@@ -105,6 +105,7 @@
   pFmod = fmod;
   pLdivmod = __aeabi_ldivmod;
   pLmul = __aeabi_lmul;
+  pTestSuspendFromCode = art_test_suspend;
   pAllocObjectFromCode = art_alloc_object_from_code;
   pAllocArrayFromCode = art_alloc_array_from_code;
   pCanPutArrayElementFromCode = art_can_put_array_element_from_code;
@@ -120,7 +121,6 @@
   pSet32Static = art_set32_static_from_code;
   pSet64Static = art_set64_static_from_code;
   pSetObjStatic = art_set_obj_static_from_code;
-  pTestSuspendFromCode = art_test_suspend;
   pThrowArrayBoundsFromCode = art_throw_array_bounds_from_code;
   pThrowDivZeroFromCode = art_throw_div_zero_from_code;
   pThrowNegArraySizeFromCode = art_throw_neg_array_size_from_code;
@@ -131,21 +131,21 @@
   pLockObjectFromCode = art_lock_object_from_code;
   pUnlockObjectFromCode = art_unlock_object_from_code;
 #endif
-  pDeliverException = art_deliver_exception_from_code;
-  pThrowAbstractMethodErrorFromCode = ThrowAbstractMethodErrorFromCode;
-  pUnresolvedDirectMethodTrampolineFromCode = UnresolvedDirectMethodTrampolineFromCode;
   pF2l = F2L;
   pD2l = D2L;
   pMemcpy = memcpy;
-  pInitializeTypeFromCode = InitializeTypeFromCode;
-  pResolveMethodFromCode = ResolveMethodFromCode;
-  pInstanceofNonTrivialFromCode = Class::IsAssignableFromCode;
-  pCheckSuspendFromCode = artCheckSuspendFromJni;
-  pFindNativeMethod = FindNativeMethod;
-  pDecodeJObjectInThread = DecodeJObjectInThread;
-  pResolveStringFromCode = ResolveStringFromCode;
-  pObjectInit = ObjectInitFromCode;
+  pCheckSuspendFromCode = CheckSuspendFromCode;
   pDebugMe = DebugMe;
+  pDecodeJObjectInThread = DecodeJObjectInThread;
+  pDeliverException = art_deliver_exception_from_code;
+  pFindNativeMethod = FindNativeMethod;
+  pInitializeTypeFromCode = InitializeTypeFromCode;
+  pInstanceofNonTrivialFromCode = Class::IsAssignableFromCode;
+  pObjectInit = ObjectInitFromCode;
+  pResolveMethodFromCode = ResolveMethodFromCode;
+  pResolveStringFromCode = ResolveStringFromCode;
+  pThrowAbstractMethodErrorFromCode = ThrowAbstractMethodErrorFromCode;
+  pUnresolvedDirectMethodTrampolineFromCode = UnresolvedDirectMethodTrampolineFromCode;
 }
 
 void* Thread::CreateCallback(void* arg) {
diff --git a/src/thread.h b/src/thread.h
index 12302ad..0d0f107 100644
--- a/src/thread.h
+++ b/src/thread.h
@@ -116,12 +116,13 @@
   int (*pIdiv)(int, int);
   long long (*pLmul)(long long, long long);
   long long (*pLdivmod)(long long, long long);
+  void (*pCheckSuspendFromCode)(Thread*);  // Stub that is called when the suspend count is non-zero
+  void (*pTestSuspendFromCode)();  // Stub that is periodically called to test the suspend count
   void* (*pAllocObjectFromCode)(uint32_t, void*);
   void* (*pAllocArrayFromCode)(uint32_t, void*, int32_t);
   void (*pCanPutArrayElementFromCode)(void*, void*);
   void* (*pCheckAndAllocArrayFromCode)(uint32_t, void*, int32_t);
   void (*pCheckCastFromCode) (void*, void*);
-  void (*pCheckSuspendFromCode)(Thread*);
   Object* (*pDecodeJObjectInThread)(Thread* thread, jobject obj);
   void (*pDeliverException)(void*);
   void* (*pFindInstanceFieldFromCode)(uint32_t, void*);
@@ -142,7 +143,6 @@
   int (*pSet32Static)(uint32_t, void*, int32_t);
   int (*pSet64Static)(uint32_t, void*, int64_t);
   int (*pSetObjStatic)(uint32_t, void*, void*);
-  void (*pTestSuspendFromCode)();
   void (*pThrowStackOverflowFromCode)(void*);
   void (*pThrowNullPointerFromCode)();
   void (*pThrowArrayBoundsFromCode)(int32_t, int32_t);