about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPaul Pluzhnikov <ppluzhnikov@google.com>2016-03-03 09:53:49 -0800
committerPaul Pluzhnikov <ppluzhnikov@google.com>2016-03-03 09:53:49 -0800
commit5cdc3d9db02773ff9904642254edb4c0fb67c9ee (patch)
tree22515d04fb99d7cafa44153c38f13df1fd67c085
parent87a07a437656aede6f303688b55ae1834962bee2 (diff)
downloadglibc-5cdc3d9db02773ff9904642254edb4c0fb67c9ee.tar.gz
glibc-5cdc3d9db02773ff9904642254edb4c0fb67c9ee.tar.xz
glibc-5cdc3d9db02773ff9904642254edb4c0fb67c9ee.zip
2016-03-03 Paul Pluzhnikov <ppluzhnikov@google.com>
	[BZ #19490]
	* sysdeps/x86_64/_mcount.S (_mcount): Add unwind descriptor.
	(__fentry__): Likewise
-rw-r--r--ChangeLog6
-rw-r--r--sysdeps/x86_64/_mcount.S55
2 files changed, 48 insertions, 13 deletions
diff --git a/ChangeLog b/ChangeLog
index a31f95a80d..24c2b65cb0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2016-03-03  Paul Pluzhnikov  <ppluzhnikov@google.com>
+
+	[BZ #19490]
+	* sysdeps/x86_64/_mcount.S (_mcount): Add unwind descriptor.
+	(__fentry__): Likewise
+
 2016-03-03  H.J. Lu  <hongjiu.lu@intel.com>
 
 	* gmon/Makefile (noprof): Add $(sysdep_noprof).
diff --git a/sysdeps/x86_64/_mcount.S b/sysdeps/x86_64/_mcount.S
index ba13643464..a506d21dcd 100644
--- a/sysdeps/x86_64/_mcount.S
+++ b/sysdeps/x86_64/_mcount.S
@@ -24,19 +24,24 @@
 
 #include <sysdep.h>
 
-	.globl C_SYMBOL_NAME(_mcount)
-	.type C_SYMBOL_NAME(_mcount), @function
-	.align ALIGNARG(4)
-C_LABEL(_mcount)
+ENTRY(_mcount)
 	/* Allocate space for 7 registers.  */
 	subq	$56,%rsp
+	cfi_adjust_cfa_offset (56)
 	movq	%rax,(%rsp)
+	cfi_rel_offset (rax, 0)
 	movq	%rcx,8(%rsp)
+	cfi_rel_offset (rcx, 8)
 	movq	%rdx,16(%rsp)
+	cfi_rel_offset (rdx, 16)
 	movq	%rsi,24(%rsp)
+	cfi_rel_offset (rsi, 24)
 	movq	%rdi,32(%rsp)
+	cfi_rel_offset (rdi, 32)
 	movq	%r8,40(%rsp)
+	cfi_rel_offset (r8, 40)
 	movq	%r9,48(%rsp)
+	cfi_rel_offset (r9, 48)
 
 	/* Setup parameter for __mcount_internal.  */
 	/* selfpc is the return address on the stack.  */
@@ -47,33 +52,50 @@ C_LABEL(_mcount)
 	/* Pop the saved registers.  Please note that `mcount' has no
 	   return value.  */
 	movq	48(%rsp),%r9
+	cfi_restore (r9)
 	movq	40(%rsp),%r8
+	cfi_restore (r8)
 	movq	32(%rsp),%rdi
+	cfi_restore (rdi)
 	movq	24(%rsp),%rsi
+	cfi_restore (rsi)
 	movq	16(%rsp),%rdx
+	cfi_restore (rdx)
 	movq	8(%rsp),%rcx
+	cfi_restore (rcx)
 	movq	(%rsp),%rax
+	cfi_restore (rax)
 	addq	$56,%rsp
+	cfi_adjust_cfa_offset (-56)
 	ret
-
-	ASM_SIZE_DIRECTIVE(C_SYMBOL_NAME(_mcount))
+END(_mcount)
 
 #undef mcount
 weak_alias (_mcount, mcount)
 
-	.globl C_SYMBOL_NAME(__fentry__)
-	.type C_SYMBOL_NAME(__fentry__), @function
-	.align ALIGNARG(4)
-C_LABEL(__fentry__)
-	/* Allocate space for 7 registers.  */
+/* __fentry__ is different from _mcount in that it is called before
+   function prolog.  This means (among other things) that it has non-standard
+   stack alignment on entry: (%RSP & 0xF) == 0.  */
+
+ENTRY(__fentry__)
+	/* Allocate space for 7 registers
+	   (+8 bytes for proper stack alignment).  */
 	subq	$64,%rsp
+	cfi_adjust_cfa_offset (64)
 	movq	%rax,(%rsp)
+	cfi_rel_offset (rax, 0)
 	movq	%rcx,8(%rsp)
+	cfi_rel_offset (rcx, 8)
 	movq	%rdx,16(%rsp)
+	cfi_rel_offset (rdx, 16)
 	movq	%rsi,24(%rsp)
+	cfi_rel_offset (rsi, 24)
 	movq	%rdi,32(%rsp)
+	cfi_rel_offset (rdi, 32)
 	movq	%r8,40(%rsp)
+	cfi_rel_offset (r8, 40)
 	movq	%r9,48(%rsp)
+	cfi_rel_offset (r9, 48)
 
 	/* Setup parameter for __mcount_internal.  */
 	/* selfpc is the return address on the stack.  */
@@ -84,13 +106,20 @@ C_LABEL(__fentry__)
 	/* Pop the saved registers.  Please note that `__fentry__' has no
 	   return value.  */
 	movq	48(%rsp),%r9
+	cfi_restore (r9)
 	movq	40(%rsp),%r8
+	cfi_restore (r8)
 	movq	32(%rsp),%rdi
+	cfi_restore (rdi)
 	movq	24(%rsp),%rsi
+	cfi_restore (rsi)
 	movq	16(%rsp),%rdx
+	cfi_restore (rdx)
 	movq	8(%rsp),%rcx
+	cfi_restore (rcx)
 	movq	(%rsp),%rax
+	cfi_restore (rax)
 	addq	$64,%rsp
+	cfi_adjust_cfa_offset (-64)
 	ret
-
-	ASM_SIZE_DIRECTIVE(C_SYMBOL_NAME(__fentry__))
+END(__fentry__)