[3/4] C-SKY: mark lr as undefined to stop unwinding

Message ID 52cd01f3630c1c06c0d526e30acd6f4a0a3c3f4f.1551922357.git.han_mao@c-sky.com
State Committed
Headers

Commit Message

毛晗 March 7, 2019, 1:34 a.m. UTC
  Mark the lr register as undefined at the start of execution, so unwind
will stop at this frame. run-backtrace-*.sh from elfutils testsuite will
fail without this patch.

	* sysdeps/csky/abiv2/start.S: Likewise.
	* sysdeps/unix/sysv/linux/csky/abiv1/setcontext.S: Likewise.
	* sysdeps/unix/sysv/linux/csky/abiv2/setcontext.S: Likewise.
---
 ChangeLog                                       | 6 ++++++
 sysdeps/csky/abiv2/start.S                      | 4 ++++
 sysdeps/unix/sysv/linux/csky/abiv2/clone.S      | 7 +++++--
 sysdeps/unix/sysv/linux/csky/abiv2/setcontext.S | 2 ++
 4 files changed, 17 insertions(+), 2 deletions(-)
  

Patch

diff --git a/ChangeLog b/ChangeLog
index 713e512..c95dfbc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@ 
 2019-02-15  Mao Han  <han_mao@c-sky.com>
 
+	* sysdeps/csky/abiv2/start.S: Likewise.
+	* sysdeps/unix/sysv/linux/csky/abiv2/clone.S: Likewise.
+	* sysdeps/unix/sysv/linux/csky/abiv2/setcontext.S: Likewise.
+
+2019-02-13  Mao Han  <han_mao@c-sky.com>
+
 	* sysdeps/unix/sysv/linux/csky/sys/procfs.h: Use linux definition
 	directly.
 	* sysdeps/unix/sysv/linux/csky/sys/user.h: Remove user_regs
diff --git a/sysdeps/csky/abiv2/start.S b/sysdeps/csky/abiv2/start.S
index 324ed69..b1e6152 100644
--- a/sysdeps/csky/abiv2/start.S
+++ b/sysdeps/csky/abiv2/start.S
@@ -46,6 +46,9 @@ 
 	.type _start,@function;
 	.align 4;
 _start:
+	cfi_startproc
+	.cfi_label .Ldummy
+	cfi_undefined (lr)
 	subi	sp, 8
 	/* Clear the link register since this is the outermost frame.  */
 	movi	lr, 0
@@ -96,6 +99,7 @@  _start:
 	/* Should never get here.  */
 	jsri	abort
 #endif	/* !SHARED */
+	cfi_endproc
 	.size _start,.-_start
 
 
diff --git a/sysdeps/unix/sysv/linux/csky/abiv2/clone.S b/sysdeps/unix/sysv/linux/csky/abiv2/clone.S
index 3e7328a..c1352ee 100644
--- a/sysdeps/unix/sysv/linux/csky/abiv2/clone.S
+++ b/sysdeps/unix/sysv/linux/csky/abiv2/clone.S
@@ -54,7 +54,7 @@  ENTRY (__clone)
 	btsti	a0, 31		/* Check if return is less than zero.  */
 	bt	__do_syscall_error
 	cmpnei	a0, 0
-	bf	__child
+	bf	__thread_start
 	rts
 
 __error_arg:
@@ -81,7 +81,9 @@  __do_syscall_error:
 	rts
 PSEUDO_END (__clone)
 
-__child:
+ENTRY (__thread_start)
+	.cfi_label .Ldummy
+	cfi_undefined (lr)
 	ldw	a0, (sp, 4)	/* Restore args from new sp.  */
 	ldw	a1, (sp, 0)	/* Restore function from new sp.  */
 	addi	sp, 8
@@ -90,6 +92,7 @@  __child:
 	/* exit */
 	lrw	r7, __NR_exit
 	trap	0
+END (__thread_start)
 
 libc_hidden_def (__clone)
 weak_alias (__clone, clone)
diff --git a/sysdeps/unix/sysv/linux/csky/abiv2/setcontext.S b/sysdeps/unix/sysv/linux/csky/abiv2/setcontext.S
index 6d3f04f..34de6e3 100644
--- a/sysdeps/unix/sysv/linux/csky/abiv2/setcontext.S
+++ b/sysdeps/unix/sysv/linux/csky/abiv2/setcontext.S
@@ -62,6 +62,8 @@  END (setcontext)
 weak_alias (__setcontext, setcontext)
 
 ENTRY (__startcontext)
+	.cfi_label .Ldummy
+	cfi_undefined (lr)
 	mov	a0, r9
 	cmpnei	r9, 0	/* r9 was set in makecontext.  */
 	bf	1f	/* null, then exit.  */