44include AsmMacros. inc
55
66;;
7- ;; See PUSH_COOP_PINVOKE_FRAME, this macro is very similar, but also saves RAX and accepts
7+ ;; See PUSH_COOP_PINVOKE_FRAME, this macro is very similar, but also saves RAX/RCX and accepts
88;; the register bitmask
99;;
1010;; On entry:
1111;; - BITMASK: bitmask describing pushes, a volatile register
1212;; - RAX: managed function return value, may be an object or byref
13+ ;; - RCX: managed function return value (async continuation), may be an object
1314;; - preserved regs: need to stay preserved, may contain objects or byrefs
1415;;
1516;; INVARIANTS
@@ -18,8 +19,9 @@ include AsmMacros.inc
1819;;
1920PUSH_PROBE_FRAME macro threadReg , trashReg , BITMASK
2021
22+ push_vol_reg rcx ; save RCX, it might contain an objectref (async continuation)
2123 push_vol_reg rax ; save RAX, it might contain an objectref
22- lea trashReg , [ rsp + 10h ]
24+ lea trashReg , [ rsp + 18h ]
2325 push_vol_reg trashReg ; save caller's RSP
2426 push_nonvol_reg r15 ; save preserved registers
2527 push_nonvol_reg r14 ; ..
@@ -31,12 +33,12 @@ PUSH_PROBE_FRAME macro threadReg, trashReg, BITMASK
3133 push_vol_reg BITMASK ; save the register bitmask passed in by caller
3234 push_vol_reg threadReg ; Thread * (unused by stackwalker)
3335 push_nonvol_reg rbp ; save caller's RBP
34- mov trashReg , [ rsp + 12 * 8 ] ; Find the return address
36+ mov trashReg , [ rsp + 13 * 8 ] ; Find the return address
3537 push_vol_reg trashReg ; save m_RIP
3638 lea trashReg , [ rsp + 0 ] ; trashReg == address of frame
3739
3840 ;; allocate scratch space and any required alignment
39- alloc_stack 20h + 10h
41+ alloc_stack 20h + 10h + 8
4042
4143 ;; save xmm0 in case it's being used as a return value
4244 movdqa [ rsp + 20h ], xmm0
5254;;
5355POP_PROBE_FRAME macro
5456 movdqa xmm0 , [ rsp + 20h ]
55- add rsp , 20h + 10h + 8 ; deallocate stack and discard saved m_RIP
57+ add rsp , 20h + 10h + 8 + 8 ; deallocate stack and discard saved m_RIP
5658 pop rbp
5759 pop rax ; discard Thread*
5860 pop rax ; discard BITMASK
@@ -65,6 +67,7 @@ POP_PROBE_FRAME macro
6567 pop r15
6668 pop rax ; discard caller RSP
6769 pop rax
70+ pop rcx
6871endm
6972
7073;;
7679;;
7780;; Register state on exit:
7881;; RDX: thread pointer
79- ;; RAX: preserved, other volatile regs trashed
82+ ;; RAX/RCX : preserved, other volatile regs trashed
8083;;
8184FixupHijackedCallstack macro
82- ;; rdx <- GetThread(), TRASHES rcx
83- INLINE_GETTHREAD rdx , rcx
85+ ;; rdx <- GetThread(), TRASHES r8
86+ INLINE_GETTHREAD rdx , r8
8487
8588 ;; Fix the stack by pushing the original return address
86- mov rcx , [ rdx + OFFSETOF__Thread__m_pvHijackedReturnAddress ]
87- push rcx
89+ mov r8 , [ rdx + OFFSETOF__Thread__m_pvHijackedReturnAddress ]
90+ push r8
8891
8992 ;; Clear hijack state
90- xor ecx , ecx
91- mov [ rdx + OFFSETOF__Thread__m_ppvHijackedReturnAddressLocation ], rcx
92- mov [ rdx + OFFSETOF__Thread__m_pvHijackedReturnAddress ], rcx
93+ xor r8 , r8
94+ mov [ rdx + OFFSETOF__Thread__m_ppvHijackedReturnAddressLocation ], r8
95+ mov [ rdx + OFFSETOF__Thread__m_pvHijackedReturnAddress ], r8
9396endm
9497
9598;;
@@ -103,12 +106,12 @@ NESTED_ENTRY RhpGcProbeHijack, _TEXT
103106 jnz @f
104107 ret
105108@@:
106- mov ecx , DEFAULT_FRAME_SAVE_FLAGS + PTFF_SAVE_RAX + PTFF_THREAD_HIJACK
109+ mov r8d , DEFAULT_FRAME_SAVE_FLAGS + PTFF_SAVE_RAX + PTFF_SAVE_RCX + PTFF_THREAD_HIJACK
107110 jmp RhpWaitForGC
108111NESTED_END RhpGcProbeHijack , _TEXT
109112
110113NESTED_ENTRY RhpWaitForGC , _TEXT
111- PUSH_PROBE_FRAME rdx , rax , rcx
114+ PUSH_PROBE_FRAME rdx , rax , r8
112115 END_PROLOGUE
113116
114117 mov rbx , rdx
@@ -144,7 +147,7 @@ ifdef FEATURE_GC_STRESS
144147;;
145148LEAF_ENTRY RhpGcStressHijack , _TEXT
146149 FixupHijackedCallstack
147- or ecx , DEFAULT_FRAME_SAVE_FLAGS + PTFF_SAVE_RAX
150+ mov r8d , DEFAULT_FRAME_SAVE_FLAGS + PTFF_SAVE_RAX + PTFF_SAVE_RCX
148151 jmp RhpGcStressProbe
149152LEAF_END RhpGcStressHijack , _TEXT
150153
@@ -155,14 +158,14 @@ LEAF_END RhpGcStressHijack, _TEXT
155158;;
156159;; Register state on entry:
157160;; RDX: thread pointer
158- ;; RCX : register bitmask
161+ ;; R8 : register bitmask
159162;;
160163;; Register state on exit:
161- ;; Scratch registers, except for RAX, have been trashed
164+ ;; Scratch registers, except for RAX/RCX , have been trashed
162165;; All other registers restored as they were when the hijack was first reached.
163166;;
164167NESTED_ENTRY RhpGcStressProbe , _TEXT
165- PUSH_PROBE_FRAME rdx , rax , rcx
168+ PUSH_PROBE_FRAME rdx , rax , r8
166169 END_PROLOGUE
167170
168171 call RhpStressGc
0 commit comments