summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Chris Wailes <chriswailes@google.com> 2021-05-12 17:16:50 -0700
committer Christian Wailes <chriswailes@google.com> 2021-05-25 17:47:38 +0000
commitabe7c69edb5ff8f9a4b8019d475caa2f35085aa7 (patch)
treed8d86bf8c2264897eb9f7cf35be7c523f611688e
parent571a6bea24452e9b288106f379c7510c380a7f61 (diff)
Remove stack protector from some interpreter functions
This CL removes stack protection from several functions in the interpreter to allow us to re-set the stack protector cookie when new processes fork from any of the zygotes. Test: boot Test: atest KeyboardVisibilityControlTest Bug: 168258494 Change-Id: Ie0c81f97fedfcdde7afc1b6b4befa65524724194
-rw-r--r--libartbase/base/macros.h4
-rw-r--r--runtime/arch/arm/quick_entrypoints_cc_arm.cc3
-rw-r--r--runtime/art_method.cc1
-rw-r--r--runtime/entrypoints/quick/quick_trampoline_entrypoints.cc1
-rw-r--r--runtime/interpreter/interpreter.cc2
-rw-r--r--runtime/interpreter/interpreter_common.cc2
-rw-r--r--runtime/interpreter/mterp/mterp.cc2
-rw-r--r--runtime/native/java_lang_reflect_Method.cc1
-rw-r--r--runtime/obj_ptr.h2
-rw-r--r--runtime/reflection.h1
10 files changed, 17 insertions, 2 deletions
diff --git a/libartbase/base/macros.h b/libartbase/base/macros.h
index eec73cb699..c9ad68d721 100644
--- a/libartbase/base/macros.h
+++ b/libartbase/base/macros.h
@@ -71,10 +71,12 @@ template<typename T> ART_FRIEND_TEST(test_set_name, individual_test)
#define ALWAYS_INLINE
#define FLATTEN
#else
-#define ALWAYS_INLINE __attribute__ ((always_inline))
+#define ALWAYS_INLINE __attribute__ ((always_inline, no_stack_protector))
#define FLATTEN __attribute__ ((flatten))
#endif
+#define NO_STACK_PROTECTOR __attribute__ ((no_stack_protector))
+
// clang doesn't like attributes on lambda functions. It would be nice to say:
// #define ALWAYS_INLINE_LAMBDA ALWAYS_INLINE
#define ALWAYS_INLINE_LAMBDA
diff --git a/runtime/arch/arm/quick_entrypoints_cc_arm.cc b/runtime/arch/arm/quick_entrypoints_cc_arm.cc
index 987b4590b7..d7fef6f72e 100644
--- a/runtime/arch/arm/quick_entrypoints_cc_arm.cc
+++ b/runtime/arch/arm/quick_entrypoints_cc_arm.cc
@@ -25,6 +25,7 @@ extern "C" void art_quick_invoke_stub_internal(ArtMethod*, uint32_t*, uint32_t,
uint32_t*);
template <bool kIsStatic>
+NO_STACK_PROTECTOR
static void quick_invoke_reg_setup(ArtMethod* method, uint32_t* args, uint32_t args_size,
Thread* self, JValue* result, const char* shorty) {
// Note: We do not follow aapcs ABI in quick code for both softfp and hardfp.
@@ -96,6 +97,7 @@ static void quick_invoke_reg_setup(ArtMethod* method, uint32_t* args, uint32_t a
// Called by art::ArtMethod::Invoke to do entry into a non-static method.
// TODO: migrate into an assembly implementation as with ARM64.
+NO_STACK_PROTECTOR
extern "C" void art_quick_invoke_stub(ArtMethod* method, uint32_t* args, uint32_t args_size,
Thread* self, JValue* result, const char* shorty) {
quick_invoke_reg_setup<false>(method, args, args_size, self, result, shorty);
@@ -103,6 +105,7 @@ extern "C" void art_quick_invoke_stub(ArtMethod* method, uint32_t* args, uint32_
// Called by art::ArtMethod::Invoke to do entry into a static method.
// TODO: migrate into an assembly implementation as with ARM64.
+NO_STACK_PROTECTOR
extern "C" void art_quick_invoke_static_stub(ArtMethod* method, uint32_t* args,
uint32_t args_size, Thread* self, JValue* result,
const char* shorty) {
diff --git a/runtime/art_method.cc b/runtime/art_method.cc
index 89dc93b895..eb99b5e53a 100644
--- a/runtime/art_method.cc
+++ b/runtime/art_method.cc
@@ -310,6 +310,7 @@ uint32_t ArtMethod::FindCatchBlock(Handle<mirror::Class> exception_type,
return found_dex_pc;
}
+NO_STACK_PROTECTOR
void ArtMethod::Invoke(Thread* self, uint32_t* args, uint32_t args_size, JValue* result,
const char* shorty) {
if (UNLIKELY(__builtin_frame_address(0) < self->GetStackEnd())) {
diff --git a/runtime/entrypoints/quick/quick_trampoline_entrypoints.cc b/runtime/entrypoints/quick/quick_trampoline_entrypoints.cc
index eaa9f4eebb..aed2b0b517 100644
--- a/runtime/entrypoints/quick/quick_trampoline_entrypoints.cc
+++ b/runtime/entrypoints/quick/quick_trampoline_entrypoints.cc
@@ -644,6 +644,7 @@ static void HandleDeoptimization(JValue* result,
DeoptimizationMethodType::kDefault);
}
+NO_STACK_PROTECTOR
extern "C" uint64_t artQuickToInterpreterBridge(ArtMethod* method, Thread* self, ArtMethod** sp)
REQUIRES_SHARED(Locks::mutator_lock_) {
// Ensure we don't get thread suspension until the object arguments are safely in the shadow
diff --git a/runtime/interpreter/interpreter.cc b/runtime/interpreter/interpreter.cc
index 302551f8dd..c9d2660626 100644
--- a/runtime/interpreter/interpreter.cc
+++ b/runtime/interpreter/interpreter.cc
@@ -268,6 +268,7 @@ static JValue ExecuteSwitch(Thread* self,
}
}
+NO_STACK_PROTECTOR
static inline JValue Execute(
Thread* self,
const CodeItemDataAccessor& accessor,
@@ -631,6 +632,7 @@ void EnterInterpreterFromDeoptimize(Thread* self,
ret_val->SetJ(value.GetJ());
}
+NO_STACK_PROTECTOR
JValue EnterInterpreterFromEntryPoint(Thread* self, const CodeItemDataAccessor& accessor,
ShadowFrame* shadow_frame) {
DCHECK_EQ(self, Thread::Current());
diff --git a/runtime/interpreter/interpreter_common.cc b/runtime/interpreter/interpreter_common.cc
index 4e88eda162..4ae7fb1c20 100644
--- a/runtime/interpreter/interpreter_common.cc
+++ b/runtime/interpreter/interpreter_common.cc
@@ -250,6 +250,7 @@ ALWAYS_INLINE void CopyRegisters(ShadowFrame& caller_frame,
// END DECLARATIONS.
+NO_STACK_PROTECTOR
void ArtInterpreterToCompiledCodeBridge(Thread* self,
ArtMethod* caller,
ShadowFrame* shadow_frame,
@@ -1412,6 +1413,7 @@ static inline bool DoCallCommon(ArtMethod* called_method,
}
template<bool is_range, bool do_assignability_check>
+NO_STACK_PROTECTOR
bool DoCall(ArtMethod* called_method, Thread* self, ShadowFrame& shadow_frame,
const Instruction* inst, uint16_t inst_data, JValue* result) {
// Argument word count.
diff --git a/runtime/interpreter/mterp/mterp.cc b/runtime/interpreter/mterp/mterp.cc
index ae5e4703fd..6ebe1e2fcc 100644
--- a/runtime/interpreter/mterp/mterp.cc
+++ b/runtime/interpreter/mterp/mterp.cc
@@ -160,6 +160,7 @@ bool CanUseMterp()
}
#define MTERP_INVOKE(Name) \
+NO_STACK_PROTECTOR \
extern "C" size_t MterpInvoke##Name(Thread* self, \
ShadowFrame* shadow_frame, \
uint16_t* dex_pc_ptr, \
@@ -175,6 +176,7 @@ extern "C" size_t MterpInvoke##Name(Thread* self,
self, *shadow_frame, inst, inst_data, result_register) ? 1u : 0u; \
} \
} \
+NO_STACK_PROTECTOR \
extern "C" size_t MterpInvoke##Name##Range(Thread* self, \
ShadowFrame* shadow_frame, \
uint16_t* dex_pc_ptr, \
diff --git a/runtime/native/java_lang_reflect_Method.cc b/runtime/native/java_lang_reflect_Method.cc
index 2c0dd806e1..706f1a61ba 100644
--- a/runtime/native/java_lang_reflect_Method.cc
+++ b/runtime/native/java_lang_reflect_Method.cc
@@ -80,6 +80,7 @@ static jobjectArray Method_getExceptionTypes(JNIEnv* env, jobject javaMethod) {
}
}
+NO_STACK_PROTECTOR
static jobject Method_invoke(JNIEnv* env, jobject javaMethod, jobject javaReceiver,
jobjectArray javaArgs) {
ScopedFastNativeObjectAccess soa(env);
diff --git a/runtime/obj_ptr.h b/runtime/obj_ptr.h
index a03b67bed7..c4d2a5a135 100644
--- a/runtime/obj_ptr.h
+++ b/runtime/obj_ptr.h
@@ -25,7 +25,7 @@
#include "runtime_globals.h"
// Always inline ObjPtr methods even in debug builds.
-#define OBJPTR_INLINE __attribute__ ((always_inline))
+#define OBJPTR_INLINE __attribute__ ((always_inline, no_stack_protector))
namespace art {
diff --git a/runtime/reflection.h b/runtime/reflection.h
index b0e27da321..13dc8e1466 100644
--- a/runtime/reflection.h
+++ b/runtime/reflection.h
@@ -99,6 +99,7 @@ JValue InvokeVirtualOrInterfaceWithVarArgs(const ScopedObjectAccessAlreadyRunnab
// num_frames is number of frames we look up for access check.
template<PointerSize pointer_size>
+NO_STACK_PROTECTOR
jobject InvokeMethod(const ScopedObjectAccessAlreadyRunnable& soa,
jobject method,
jobject receiver,