forked from dotnet/runtime
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPInvoke.asm
More file actions
121 lines (94 loc) · 3.74 KB
/
PInvoke.asm
File metadata and controls
121 lines (94 loc) · 3.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
;; Licensed to the .NET Foundation under one or more agreements.
;; The .NET Foundation licenses this file to you under the MIT license.
#include "AsmMacros.h"
TEXTAREA
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; RhpWaitForSuspend -- rare path for RhpPInvoke and RhpReversePInvokeReturn
;;
;;
;; INPUT: none
;;
;; TRASHES: none
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
NESTED_ENTRY RhpWaitForSuspend
PROLOG_PUSH {r0-r4,lr} ; Need to save argument registers r0-r3 and lr, r4 is just for alignment
PROLOG_VPUSH {d0-d7} ; Save float argument registers as well since they're volatile
bl RhpWaitForSuspend2
EPILOG_VPOP {d0-d7}
EPILOG_POP {r0-r4,pc}
NESTED_END RhpWaitForSuspend
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; RhpWaitForGCNoAbort
;;
;;
;; INPUT: r2: transition frame
;;
;; OUTPUT:
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
NESTED_ENTRY RhpWaitForGCNoAbort
PROLOG_PUSH {r0-r6,lr} ; Even number of registers to maintain 8-byte stack alignment
PROLOG_VPUSH {d0-d3} ; Save float return value registers as well
ldr r5, [r2, #OFFSETOF__PInvokeTransitionFrame__m_pThread]
ldr r0, [r5, #OFFSETOF__Thread__m_ThreadStateFlags]
tst r0, #TSF_DoNotTriggerGc
bne Done
mov r0, r2 ; passing transition frame in r0
bl RhpWaitForGC2
Done
EPILOG_VPOP {d0-d3}
EPILOG_POP {r0-r6,pc}
NESTED_END RhpWaitForGCNoAbort
EXTERN RhpThrowHwEx
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; RhpWaitForGC
;;
;;
;; INPUT: r2: transition frame
;;
;; OUTPUT:
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
NESTED_ENTRY RhpWaitForGC
PROLOG_PUSH {r0,lr}
ldr r0, =RhpTrapThreads
ldr r0, [r0]
tst r0, #TrapThreadsFlags_TrapThreads
beq NoWait
bl RhpWaitForGCNoAbort
NoWait
tst r0, #TrapThreadsFlags_AbortInProgress
beq NoAbort
ldr r0, [r2, #OFFSETOF__PInvokeTransitionFrame__m_Flags]
tst r0, #PTFF_THREAD_ABORT
beq NoAbort
EPILOG_POP {r0,r1} ; hijack target address as exception PC
EPILOG_NOP mov r0, #STATUS_REDHAWK_THREAD_ABORT
EPILOG_BRANCH RhpThrowHwEx
NoAbort
EPILOG_POP {r0,pc}
NESTED_END RhpWaitForGC
INLINE_GETTHREAD_CONSTANT_POOL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; RhpReversePInvokeAttachOrTrapThread -- rare path for RhpPInvoke
;;
;;
;; INPUT: r4: address of reverse pinvoke frame
;;
;; TRASHES: none
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
NESTED_ENTRY RhpReversePInvokeAttachOrTrapThread
PROLOG_PUSH {r0-r4,lr} ; Need to save argument registers r0-r3 and lr, r4 is just for alignment
PROLOG_VPUSH {d0-d7} ; Save float argument registers as well since they're volatile
mov r0, r4 ; passing reverse pinvoke frame pointer in r0
bl RhpReversePInvokeAttachOrTrapThread2
EPILOG_VPOP {d0-d7}
EPILOG_POP {r0-r4,pc}
NESTED_END RhpReversePInvokeTrapThread
end