diff options
author | Jonghyun Park <parjong@gmail.com> | 2016-06-02 22:57:13 +0900 |
---|---|---|
committer | Jan Kotas <jkotas@microsoft.com> | 2016-06-02 06:57:13 -0700 |
commit | c4075441c86e1073e2f48e61be3ed5c58f6d27d0 (patch) | |
tree | 94373254790cff9ed23d4e00eb3c75711ceb86c7 /src/vm/arm | |
parent | 21751dbaa36ffb621e79b4cfeb5a7db00d397511 (diff) | |
download | coreclr-c4075441c86e1073e2f48e61be3ed5c58f6d27d0.tar.gz coreclr-c4075441c86e1073e2f48e61be3ed5c58f6d27d0.tar.bz2 coreclr-c4075441c86e1073e2f48e61be3ed5c58f6d27d0.zip |
Enable FEATURE_HIJACK for ARM (#5404)
Currently, FEATURE_HIJACK is disabled for ARM, and thus CoreCLR got
stuck if GC is invoked from JITed code.
This commit attempts to port FEATURE_HIJACK from ARM (windows) in order
to fix #5403.
Diffstat (limited to 'src/vm/arm')
-rw-r--r-- | src/vm/arm/asmhelpers.S | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/src/vm/arm/asmhelpers.S b/src/vm/arm/asmhelpers.S index 7b614e7c28..df77f1ae05 100644 --- a/src/vm/arm/asmhelpers.S +++ b/src/vm/arm/asmhelpers.S @@ -1360,3 +1360,54 @@ DelayLoad_Helper\suffix: DynamicHelper DynamicHelperFrameFlags_ObjectArg | DynamicHelperFrameFlags_ObjectArg2, _ObjObj #endif // FEATURE_READYTORUN + +#ifdef FEATURE_HIJACK + +// ------------------------------------------------------------------ +// Hijack function for functions which return a reference type + NESTED_ENTRY OnHijackObjectTripThread, _TEXT, NoHandler + PROLOG_PUSH "{r0,r4-r11,lr}" + + CHECK_STACK_ALIGNMENT + + mov r0, sp + bl OnHijackObjectWorker + + EPILOG_POP "{r0,r4-r11,pc}" + NESTED_END OnHijackObjectTripThread, _TEXT + +// ------------------------------------------------------------------ +// Hijack function for functions which return an interior pointer within an object allocated in managed heap + NESTED_ENTRY OnHijackInteriorPointerTripThread, _TEXT, NoHandler + PROLOG_PUSH "{r0,r4-r11,lr}" + + CHECK_STACK_ALIGNMENT + + mov r0, sp + bl C_FUNC(OnHijackInteriorPointerWorker) + + EPILOG_POP "{r0,r4-r11,pc}" + NESTED_END OnHijackInteriorPointerTripThread, _TEXT + +// ------------------------------------------------------------------ +// Hijack function for functions which return a value type + NESTED_ENTRY OnHijackScalarTripThread, _TEXT, NoHandler + PROLOG_PUSH "{r0,r4-r11,lr}" + + PROLOG_VPUSH "{d0-d3}" // saving as d0-d3 can have the floating point return value + PROLOG_PUSH "{r1}" // saving as r1 can have partial return value when return is > 32 bits + alloc_stack 4 // 8 byte align + + CHECK_STACK_ALIGNMENT + + add r0, sp, #40 + bl C_FUNC(OnHijackScalarWorker) + + free_stack 4 + EPILOG_POP "{r1}" + EPILOG_VPOP "{d0-d3}" + + EPILOG_POP "{r0,r4-r11,pc}" + NESTED_END OnHijackScalarTripThread, _TEXT +#endif + |