Skip to content
This repository has been archived by the owner on Nov 1, 2020. It is now read-only.

Push proper RBP frame in PUSH_COOP_PINVOKE_FRAME #4812

Merged
merged 2 commits into from
Oct 27, 2017
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 9 additions & 10 deletions src/Native/Runtime/unix/unixasmmacrosamd64.inc
Original file line number Diff line number Diff line change
Expand Up @@ -308,7 +308,9 @@ C_FUNC(\Name):
DEFAULT_FRAME_SAVE_FLAGS = PTFF_SAVE_ALL_PRESERVED + PTFF_SAVE_RSP

.macro PUSH_COOP_PINVOKE_FRAME trashReg
lea \trashReg, [rsp + 8h]
push_nonvol_reg rbp // push RBP frame
mov rbp, rsp
lea \trashReg, [rsp + 10h]
push_register \trashReg // save caller's RSP
push_nonvol_reg r15 // save preserved registers
push_nonvol_reg r14 // ..
Expand All @@ -317,19 +319,15 @@ DEFAULT_FRAME_SAVE_FLAGS = PTFF_SAVE_ALL_PRESERVED + PTFF_SAVE_RSP
push_nonvol_reg rbx // ..
push_imm DEFAULT_FRAME_SAVE_FLAGS // save the register bitmask
push_register \trashReg // Thread * (unused by stackwalker)
push_nonvol_reg rbp // save caller's RBP
mov \trashReg, [rsp + 9*8] // Find the return address
push_register \trashReg // save m_RIP
mov \trashReg, [rsp + 8*8] // Find and save the callers RBP
push_register \trashReg
mov \trashReg, [rsp + 10*8] // Find and save the return address
push_register \trashReg
lea \trashReg, [rsp] // trashReg == address of frame

// stack alignment
alloc_stack 8
.endm

.macro POP_COOP_PINVOKE_FRAME
// Adjust for stack alignment and discard RIP
free_stack 16

pop_register r10 // discard RIP
pop_nonvol_reg rbp // restore RBP
pop_register r10 // discard thread
pop_register r10 // discard bitmask
Expand All @@ -339,4 +337,5 @@ DEFAULT_FRAME_SAVE_FLAGS = PTFF_SAVE_ALL_PRESERVED + PTFF_SAVE_RSP
pop_nonvol_reg r14
pop_nonvol_reg r15
pop_register r10 // discard caller RSP
pop_register r10 // discard RBP frame
.endm