aboutsummaryrefslogtreecommitdiff
path: root/sysdeps
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/generic/sysdep.h26
-rw-r--r--sysdeps/unix/sysv/linux/x86_64/sigaction.c5
-rw-r--r--sysdeps/unix/sysv/linux/x86_64/sysdep.h4
-rw-r--r--sysdeps/x86_64/dl-machine.h73
4 files changed, 75 insertions, 33 deletions
diff --git a/sysdeps/generic/sysdep.h b/sysdeps/generic/sysdep.h
index 3223c976e6..0feed3c4a8 100644
--- a/sysdeps/generic/sysdep.h
+++ b/sysdeps/generic/sysdep.h
@@ -66,5 +66,31 @@
# define cfi_offset(reg, off)
# endif
+#else /* ! ASSEMBLER */
+# ifdef HAVE_ASM_CFI_DIRECTIVES
+# define CFI_STRINGIFY(Name) CFI_STRINGIFY2 (Name)
+# define CFI_STRINGIFY2(Name) #Name
+# define CFI_STARTPROC ".cfi_startproc"
+# define CFI_ENDPROC ".cfi_endproc"
+# define CFI_DEF_CFA(reg, off) \
+ ".cfi_def_cfa " CFI_STRINGIFY(reg) "," CFI_STRINGIFY(off)
+# define CFI_DEF_CFA_REGISTER(reg) \
+ ".cfi_def_cfa_register " CFI_STRINGIFY(reg)
+# define CFI_DEF_CFA_OFFSET(off) \
+ ".cfi_def_cfa_offset " CFI_STRINGIFY(off)
+# define CFI_ADJUST_CFA_OFFSET(off) \
+ ".cfi_adjust_cfa_offset " CFI_STRINGIFY(off)
+# define CFI_OFFSET(reg, off) \
+ ".cfi_offset " CFI_STRINGIFY(reg) "," CFI_STRINGIFY(off)
+# else
+# define CFI_STARTPROC
+# define CFI_ENDPROC
+# define CFI_DEF_CFA(reg, off)
+# define CFI_DEF_CFA_REGISTER(reg)
+# define CFI_DEF_CFA_OFFSET(off)
+# define CFI_ADJUST_CFA_OFFSET(off)
+# define CFI_OFFSET(reg, off)
+# endif
#endif /* __ASSEMBLER__ */
+
diff --git a/sysdeps/unix/sysv/linux/x86_64/sigaction.c b/sysdeps/unix/sysv/linux/x86_64/sigaction.c
index 1d8ef6f34f..48cb447859 100644
--- a/sysdeps/unix/sysv/linux/x86_64/sigaction.c
+++ b/sysdeps/unix/sysv/linux/x86_64/sigaction.c
@@ -97,14 +97,15 @@ weak_alias (__libc_sigaction, sigaction)
appropriate GDB maintainer. */
#define RESTORE(name, syscall) RESTORE2 (name, syscall)
-#define RESTORE2(name, syscall) \
+# define RESTORE2(name, syscall) \
asm \
( \
".align 16\n" \
+ CFI_STARTPROC "\n" \
"__" #name ":\n" \
" movq $" #syscall ", %rax\n" \
" syscall\n" \
+ CFI_ENDPROC "\n" \
);
-
/* The return code for realtime-signals. */
RESTORE (restore_rt, __NR_rt_sigreturn)
diff --git a/sysdeps/unix/sysv/linux/x86_64/sysdep.h b/sysdeps/unix/sysv/linux/x86_64/sysdep.h
index e88c48a9e4..430ec86a5d 100644
--- a/sysdeps/unix/sysv/linux/x86_64/sysdep.h
+++ b/sysdeps/unix/sysv/linux/x86_64/sysdep.h
@@ -132,11 +132,13 @@
0: \
xorq %rdx, %rdx; \
subq %rax, %rdx; \
- pushq %rdx \
+ pushq %rdx; \
+ cfi_adjust_cfa_offset(8); \
PUSH_ERRNO_LOCATION_RETURN; \
call BP_SYM (__errno_location)@PLT; \
POP_ERRNO_LOCATION_RETURN; \
popq %rdx; \
+ cfi_adjust_cfa_offset(-8); \
movl %edx, (%rax); \
orq $-1, %rax; \
jmp L(pseudo_end);
diff --git a/sysdeps/x86_64/dl-machine.h b/sysdeps/x86_64/dl-machine.h
index c2eff579eb..964a4b422b 100644
--- a/sysdeps/x86_64/dl-machine.h
+++ b/sysdeps/x86_64/dl-machine.h
@@ -24,6 +24,7 @@
#define ELF_MACHINE_NAME "x86_64"
#include <sys/param.h>
+#include <sysdep.h>
/* Return nonzero iff ELF header is compatible with the running host. */
static inline int __attribute__ ((unused))
@@ -136,14 +137,17 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
.globl _dl_runtime_resolve\n\
.type _dl_runtime_resolve, @function\n\
.align 16\n\
+ " CFI_STARTPROC "\n\
_dl_runtime_resolve:\n\
- pushq %rax # Preserve registers otherwise clobbered.\n\
- pushq %rcx\n\
- pushq %rdx\n\
- pushq %rsi\n\
- pushq %rdi\n\
- pushq %r8\n\
- pushq %r9\n\
+ subq $56,%rsp\n\
+ " CFI_ADJUST_CFA_OFFSET(72)" # Incorporate PLT\n\
+ movq %rax,(%rsp) # Preserve registers otherwise clobbered.\n\
+ movq %rcx,8(%rsp)\n\
+ movq %rdx,16(%rsp)\n\
+ movq %rsi,24(%rsp)\n\
+ movq %rdi,32(%rsp)\n\
+ movq %r8,40(%rsp)\n\
+ movq %r9,48(%rsp)\n\
movq 64(%rsp), %rsi # Copy args pushed by PLT in register.\n\
movq %rsi,%r11 # Multiply by 24\n\
addq %r11,%rsi\n\
@@ -152,28 +156,33 @@ _dl_runtime_resolve:\n\
movq 56(%rsp), %rdi # %rdi: link_map, %rsi: reloc_offset\n\
call fixup # Call resolver.\n\
movq %rax, %r11 # Save return value\n\
- popq %r9 # Get register content back.\n\
- popq %r8\n\
- popq %rdi\n\
- popq %rsi\n\
- popq %rdx\n\
- popq %rcx\n\
- popq %rax\n\
- addq $16,%rsp # Adjust stack\n\
+ movq 48(%rsp),%r9 # Get register content back.\n\
+ movq 40(%rsp),%r8\n\
+ movq 32(%rsp),%rdi\n\
+ movq 24(%rsp),%rsi\n\
+ movq 16(%rsp),%rdx\n\
+ movq 8(%rsp),%rcx\n\
+ movq (%rsp),%rax\n\
+ addq $72,%rsp # Adjust stack(PLT did 2 pushes)\n\
+ " CFI_ADJUST_CFA_OFFSET(-72)" \n\
jmp *%r11 # Jump to function address.\n\
+ " CFI_ENDPROC "\n\
.size _dl_runtime_resolve, .-_dl_runtime_resolve\n\
\n\
.globl _dl_runtime_profile\n\
.type _dl_runtime_profile, @function\n\
.align 16\n\
+ " CFI_STARTPROC "\n\
_dl_runtime_profile:\n\
- pushq %rax # Preserve registers otherwise clobbered.\n\
- pushq %rcx\n\
- pushq %rdx\n\
- pushq %rsi\n\
- pushq %rdi\n\
- pushq %r8\n\
- pushq %r9\n\
+ subq $56,%rsp\n\
+ " CFI_ADJUST_CFA_OFFSET(72)" # Incorporate PLT\n\
+ movq %rax,(%rsp) # Preserve registers otherwise clobbered.\n\
+ movq %rcx,8(%rsp)\n\
+ movq %rdx,16(%rsp)\n\
+ movq %rsi,24(%rsp)\n\
+ movq %rdi,32(%rsp)\n\
+ movq %r8,40(%rsp)\n\
+ movq %r9,48(%rsp)\n\
movq 72(%rsp), %rdx # Load return address if needed\n\
movq 64(%rsp), %rsi # Copy args pushed by PLT in register.\n\
movq %rsi,%r11 # Multiply by 24\n\
@@ -183,15 +192,17 @@ _dl_runtime_profile:\n\
movq 56(%rsp), %rdi # %rdi: link_map, %rsi: reloc_offset\n\
call profile_fixup # Call resolver.\n\
movq %rax, %r11 # Save return value\n\
- popq %r9 # Get register content back.\n\
- popq %r8\n\
- popq %rdi\n\
- popq %rsi\n\
- popq %rdx\n\
- popq %rcx\n\
- popq %rax\n\
- addq $16,%rsp # Adjust stack\n\
+ movq 48(%rsp),%r9 # Get register content back.\n\
+ movq 40(%rsp),%r8\n\
+ movq 32(%rsp),%rdi\n\
+ movq 24(%rsp),%rsi\n\
+ movq 16(%rsp),%rdx\n\
+ movq 8(%rsp),%rcx\n\
+ movq (%rsp),%rax\n\
+ addq $72,%rsp # Adjust stack\n\
+ " CFI_ADJUST_CFA_OFFSET(-72)"\n\
jmp *%r11 # Jump to function address.\n\
+ " CFI_ENDPROC "\n\
.size _dl_runtime_profile, .-_dl_runtime_profile\n\
.previous\n\
");
@@ -203,6 +214,7 @@ _dl_runtime_profile:\n\
.type _dl_runtime_resolve, @function\n\
.type _dl_runtime_profile, @function\n\
.align 16\n\
+ " CFI_STARTPROC "\n\
_dl_runtime_resolve:\n\
_dl_runtime_profile:\n\
pushq %rax # Preserve registers otherwise clobbered.\n\
@@ -229,6 +241,7 @@ _dl_runtime_profile:\n\
popq %rax\n\
addq $16,%rsp # Adjust stack\n\
jmp *%r11 # Jump to function address.\n\
+ " CFI_ENDPROC "\n\
.size _dl_runtime_resolve, .-_dl_runtime_resolve\n\
.size _dl_runtime_profile, .-_dl_runtime_profile\n\
.previous\n\