diff --git a/sysdeps/x86_64/_mcount.S b/sysdeps/x86_64/_mcount.S index 5d7edd2..5f186be 100644 --- a/sysdeps/x86_64/_mcount.S +++ b/sysdeps/x86_64/_mcount.S @@ -28,8 +28,10 @@ .type C_SYMBOL_NAME(_mcount), @function .align ALIGNARG(4) C_LABEL(_mcount) + cfi_startproc /* Allocate space for 7 registers. */ subq $56,%rsp + cfi_adjust_cfa_offset (56) movq %rax,(%rsp) movq %rcx,8(%rsp) movq %rdx,16(%rsp) @@ -37,6 +39,13 @@ C_LABEL(_mcount) movq %rdi,32(%rsp) movq %r8,40(%rsp) movq %r9,48(%rsp) + cfi_rel_offset (rax, 0) + cfi_rel_offset (rcx, 8) + cfi_rel_offset (rdx, 16) + cfi_rel_offset (rsi, 24) + cfi_rel_offset (rdi, 32) + cfi_rel_offset (r8, 40) + cfi_rel_offset (r9, 48) /* Setup parameter for __mcount_internal. */ /* selfpc is the return address on the stack. */ @@ -58,7 +67,16 @@ C_LABEL(_mcount) movq 8(%rsp),%rcx movq (%rsp),%rax addq $56,%rsp + cfi_restore (r9) + cfi_restore (r8) + cfi_restore (rdi) + cfi_restore (rsi) + cfi_restore (rdx) + cfi_restore (rcx) + cfi_restore (rax) + cfi_adjust_cfa_offset (-56) ret + cfi_endproc ASM_SIZE_DIRECTIVE(C_SYMBOL_NAME(_mcount)) @@ -69,8 +87,10 @@ weak_alias (_mcount, mcount) .type C_SYMBOL_NAME(__fentry__), @function .align ALIGNARG(4) C_LABEL(__fentry__) - /* Allocate space for 7 registers. */ + cfi_startproc + /* Allocate space for 7 registers (+8 for proper stack alignment). */ subq $64,%rsp + cfi_adjust_cfa_offset (64) movq %rax,(%rsp) movq %rcx,8(%rsp) movq %rdx,16(%rsp) @@ -78,6 +98,13 @@ C_LABEL(__fentry__) movq %rdi,32(%rsp) movq %r8,40(%rsp) movq %r9,48(%rsp) + cfi_rel_offset (rax, 0) + cfi_rel_offset (rcx, 8) + cfi_rel_offset (rdx, 16) + cfi_rel_offset (rsi, 24) + cfi_rel_offset (rdi, 32) + cfi_rel_offset (r8, 40) + cfi_rel_offset (r9, 48) /* Setup parameter for __mcount_internal. */ /* selfpc is the return address on the stack. */ @@ -98,7 +125,16 @@ C_LABEL(__fentry__) movq 16(%rsp),%rdx movq 8(%rsp),%rcx movq (%rsp),%rax + cfi_restore (r9) + cfi_restore (r8) + cfi_restore (rdi) + cfi_restore (rsi) + cfi_restore (rdx) + cfi_restore (rcx) + cfi_restore (rax) addq $64,%rsp + cfi_adjust_cfa_offset (-64) ret + cfi_endproc ASM_SIZE_DIRECTIVE(C_SYMBOL_NAME(__fentry__))