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);