diff options
author | Rahul Kumar <rahku@microsoft.com> | 2016-03-23 08:37:33 -0700 |
---|---|---|
committer | Rahul Kumar <rahku@microsoft.com> | 2016-03-23 08:37:33 -0700 |
commit | 50c1cafb162d4f74b253add4c079a4afff7aa057 (patch) | |
tree | d353d14d982eb4f14e2143b61d4aa85a6455ca7d | |
parent | 930a13c8afc2e4709d7c243be44340e4b61bfdfc (diff) | |
parent | a06e33b5e484fd57641329ee10ad1e98fc626359 (diff) | |
download | coreclr-50c1cafb162d4f74b253add4c079a4afff7aa057.tar.gz coreclr-50c1cafb162d4f74b253add4c079a4afff7aa057.tar.bz2 coreclr-50c1cafb162d4f74b253add4c079a4afff7aa057.zip |
Merge pull request #3853 from rahku/issue3730
ARM64: Implementation of Thread hijacking and thread redirection requires for GCSuspension
-rw-r--r-- | src/vm/arm64/asmhelpers.asm | 92 | ||||
-rw-r--r-- | src/vm/arm64/cgencpu.h | 13 | ||||
-rw-r--r-- | src/vm/arm64/stubs.cpp | 54 |
3 files changed, 100 insertions, 59 deletions
diff --git a/src/vm/arm64/asmhelpers.asm b/src/vm/arm64/asmhelpers.asm index 5384f77daa..38b034e996 100644 --- a/src/vm/arm64/asmhelpers.asm +++ b/src/vm/arm64/asmhelpers.asm @@ -30,6 +30,9 @@ IMPORT GetCurrentSavedRedirectContext IMPORT LinkFrameAndThrow IMPORT FixContextHandler + IMPORT OnHijackObjectWorker + IMPORT OnHijackInteriorPointerWorker + IMPORT OnHijackScalarWorker IMPORT g_ephemeral_low IMPORT g_ephemeral_high @@ -848,17 +851,98 @@ UM2MThunk_WrapperHelper_RegArgumentsSetup NESTED_END +#ifdef FEATURE_HIJACK +; ------------------------------------------------------------------ +; Hijack function for functions which return a reference type + NESTED_ENTRY OnHijackObjectTripThread + PROLOG_SAVE_REG_PAIR fp, lr, #-112! + ; Spill callee saved registers + PROLOG_SAVE_REG_PAIR x19, x20, #16 + PROLOG_SAVE_REG_PAIR x21, x22, #32 + PROLOG_SAVE_REG_PAIR x23, x24, #48 + PROLOG_SAVE_REG_PAIR x25, x26, #64 + PROLOG_SAVE_REG_PAIR x27, x28, #80 + + str x0, [sp, #96] + mov x0, sp + bl OnHijackObjectWorker + ldr x0, [sp, #96] + + EPILOG_RESTORE_REG_PAIR x19, x20, #16 + EPILOG_RESTORE_REG_PAIR x21, x22, #32 + EPILOG_RESTORE_REG_PAIR x23, x24, #48 + EPILOG_RESTORE_REG_PAIR x25, x26, #64 + EPILOG_RESTORE_REG_PAIR x27, x28, #80 + EPILOG_RESTORE_REG_PAIR fp, lr, #112! + EPILOG_RETURN + NESTED_END + +; ------------------------------------------------------------------ +; Hijack function for functions which return an interior pointer within an object allocated in managed heap + NESTED_ENTRY OnHijackInteriorPointerTripThread + PROLOG_SAVE_REG_PAIR fp, lr, #-112! + ; Spill callee saved registers + PROLOG_SAVE_REG_PAIR x19, x20, #16 + PROLOG_SAVE_REG_PAIR x21, x22, #32 + PROLOG_SAVE_REG_PAIR x23, x24, #48 + PROLOG_SAVE_REG_PAIR x25, x26, #64 + PROLOG_SAVE_REG_PAIR x27, x28, #80 + + str x0, [sp, #96] + mov x0, sp + bl OnHijackInteriorPointerWorker + ldr x0, [sp, #96] + + EPILOG_RESTORE_REG_PAIR x19, x20, #16 + EPILOG_RESTORE_REG_PAIR x21, x22, #32 + EPILOG_RESTORE_REG_PAIR x23, x24, #48 + EPILOG_RESTORE_REG_PAIR x25, x26, #64 + EPILOG_RESTORE_REG_PAIR x27, x28, #80 + EPILOG_RESTORE_REG_PAIR fp, lr, #112! + EPILOG_RETURN + NESTED_END + +; ------------------------------------------------------------------ +; Hijack function for functions which return a scalar type or a struct (value type) + NESTED_ENTRY OnHijackScalarTripThread + PROLOG_SAVE_REG_PAIR fp, lr, #-144! + ; Spill callee saved registers + PROLOG_SAVE_REG_PAIR x19, x20, #16 + PROLOG_SAVE_REG_PAIR x21, x22, #32 + PROLOG_SAVE_REG_PAIR x23, x24, #48 + PROLOG_SAVE_REG_PAIR x25, x26, #64 + PROLOG_SAVE_REG_PAIR x27, x28, #80 + + str x0, [sp, #96] + ; HFA return value can be in d0-d3 + stp d0, d1, [sp, #112] + stp d2, d3, [sp, #128] + mov x0, sp + bl OnHijackScalarWorker + ldr x0, [sp, #96] + ldp d0, d1, [sp, #112] + ldp d2, d3, [sp, #128] + + EPILOG_RESTORE_REG_PAIR x19, x20, #16 + EPILOG_RESTORE_REG_PAIR x21, x22, #32 + EPILOG_RESTORE_REG_PAIR x23, x24, #48 + EPILOG_RESTORE_REG_PAIR x25, x26, #64 + EPILOG_RESTORE_REG_PAIR x27, x28, #80 + EPILOG_RESTORE_REG_PAIR fp, lr, #112! + EPILOG_RETURN + NESTED_END +#endif ; FEATURE_HIJACK ;; ------------------------------------------------------------------ ;; Redirection Stub for GC in fully interruptible method -; GenerateRedirectedHandledJITCaseStub GCThreadControl + GenerateRedirectedHandledJITCaseStub GCThreadControl ;; ------------------------------------------------------------------ -; GenerateRedirectedHandledJITCaseStub DbgThreadControl + GenerateRedirectedHandledJITCaseStub DbgThreadControl ;; ------------------------------------------------------------------ -; GenerateRedirectedHandledJITCaseStub UserSuspend + GenerateRedirectedHandledJITCaseStub UserSuspend ;; ------------------------------------------------------------------ -; GenerateRedirectedHandledJITCaseStub YieldTask + GenerateRedirectedHandledJITCaseStub YieldTask #ifdef _DEBUG ; ------------------------------------------------------------------ diff --git a/src/vm/arm64/cgencpu.h b/src/vm/arm64/cgencpu.h index a57b95ae1e..0024512917 100644 --- a/src/vm/arm64/cgencpu.h +++ b/src/vm/arm64/cgencpu.h @@ -446,7 +446,18 @@ struct DECLSPEC_ALIGN(16) UMEntryThunkCode struct HijackArgs { - // ARM64:NYI + DWORD64 X29; // frame pointer + union + { + DWORD64 Lr; + size_t ReturnAddress; + }; + DWORD64 X19, X20, X21, X22, X23, X24, X25, X26, X27, X28; + union + { + DWORD64 X0; + size_t ReturnValue; + }; }; EXTERN_C VOID STDCALL PrecodeFixupThunk(); diff --git a/src/vm/arm64/stubs.cpp b/src/vm/arm64/stubs.cpp index 8125b1d317..943adb9765 100644 --- a/src/vm/arm64/stubs.cpp +++ b/src/vm/arm64/stubs.cpp @@ -1033,60 +1033,6 @@ void ExceptionHijackEnd(void) { _ASSERTE(!"ARM64:NYI"); } - -void RedirectedHandledJITCaseForGCThreadControl_Stub(void) -{ - _ASSERTE(!"ARM64:NYI"); -} -void RedirectedHandledJITCaseForDbgThreadControl_Stub(void) -{ - _ASSERTE(!"ARM64:NYI"); -} -void RedirectedHandledJITCaseForUserSuspend_Stub(void) -{ - _ASSERTE(!"ARM64:NYI"); -} -void RedirectedHandledJITCaseForYieldTask_Stub(void) -{ - _ASSERTE(!"ARM64:NYI"); -} - -void RedirectedHandledJITCaseForGCThreadControl_StubEnd() -{ - _ASSERTE(!"ARM64:NYI"); -} - -void RedirectedHandledJITCaseForDbgThreadControl_StubEnd() -{ - _ASSERTE(!"ARM64:NYI"); -} - -void RedirectedHandledJITCaseForUserSuspend_StubEnd() -{ - _ASSERTE(!"ARM64:NYI"); -} - -void RedirectedHandledJITCaseForYieldTask_StubEnd() -{ - _ASSERTE(!"ARM64:NYI"); -} - - -VOID OnHijackObjectTripThread() -{ - _ASSERTE(!"ARM64:NYI"); -} - -VOID OnHijackScalarTripThread() -{ - _ASSERTE(!"ARM64:NYI"); -} - -VOID OnHijackInteriorPointerTripThread() -{ - _ASSERTE(!"ARM64:NYI"); -} - }; #ifdef FEATURE_COMINTEROP |