summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRahul Kumar <rahku@microsoft.com>2016-03-23 08:37:33 -0700
committerRahul Kumar <rahku@microsoft.com>2016-03-23 08:37:33 -0700
commit50c1cafb162d4f74b253add4c079a4afff7aa057 (patch)
treed353d14d982eb4f14e2143b61d4aa85a6455ca7d
parent930a13c8afc2e4709d7c243be44340e4b61bfdfc (diff)
parenta06e33b5e484fd57641329ee10ad1e98fc626359 (diff)
downloadcoreclr-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.asm92
-rw-r--r--src/vm/arm64/cgencpu.h13
-rw-r--r--src/vm/arm64/stubs.cpp54
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