diff options
author | Rahul Kumar <rahku@microsoft.com> | 2016-03-21 17:45:50 -0700 |
---|---|---|
committer | Rahul Kumar <rahku@microsoft.com> | 2016-03-22 18:05:43 -0700 |
commit | a06e33b5e484fd57641329ee10ad1e98fc626359 (patch) | |
tree | 6419408295dd3fd182a2d769efa9304dbe2244e6 /src/vm/arm64/asmhelpers.asm | |
parent | fc2246d77a951ac2111f242f3bb408af39903270 (diff) | |
download | coreclr-a06e33b5e484fd57641329ee10ad1e98fc626359.tar.gz coreclr-a06e33b5e484fd57641329ee10ad1e98fc626359.tar.bz2 coreclr-a06e33b5e484fd57641329ee10ad1e98fc626359.zip |
ARM64: Implementation of Thread hijacking and thread redirection required for GCSuspension
Diffstat (limited to 'src/vm/arm64/asmhelpers.asm')
-rw-r--r-- | src/vm/arm64/asmhelpers.asm | 92 |
1 files changed, 88 insertions, 4 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 ; ------------------------------------------------------------------ |