[RFC 6/6] ARC: Fix several testsuite failures related to unwinding

Vineet Gupta Vineet.Gupta1 at synopsys.com
Tue Jun 27 01:00:54 PDT 2017


From: Cupertino Miranda <cmiranda at synopsys.com>

1. Add BLINK clobber to syscall wrappers allowing unwinding off of
   sleeping syscalls
   (this is arguably excessive, give it is not needed except for a
   handful of slow syscalls such as read/write/nanosleep...)

2. Rework sigreturn to undo above since we don't want BLINK spilled
   on stack for this specific case

3. Add dwarf CFI psuedo-ops to various syscall generators

Signed-off-by: Cupertino Miranda <cmiranda at synopsys.com>
Signed-off-by: Vineet Gupta <vgupta at synopsys.com>
---
 sysdeps/arc/dl-trampoline.S                 |  9 +++++++++
 sysdeps/arc/sysdep.h                        |  2 ++
 sysdeps/unix/sysv/linux/arc/sigaction.c     |  7 ++++++-
 sysdeps/unix/sysv/linux/arc/sysdep-cancel.h |  4 ++++
 sysdeps/unix/sysv/linux/arc/sysdep.h        | 12 ++++++++----
 5 files changed, 29 insertions(+), 5 deletions(-)

diff --git a/sysdeps/arc/dl-trampoline.S b/sysdeps/arc/dl-trampoline.S
index 0e781af8380e..06fd7ff9a667 100644
--- a/sysdeps/arc/dl-trampoline.S
+++ b/sysdeps/arc/dl-trampoline.S
@@ -37,11 +37,16 @@
 	st.a	r7, [sp, -4]
 	st.a	r8, [sp, -4]
 	st.a	r9, [sp, -4]
+	cfi_adjust_cfa_offset (40)
 	push_s	blink
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (blink, 0)
 .endm
 
 .macro RESTORE_CALLER_SAVED_BUT_R0
 	ld.ab	blink,[sp, 4]
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (blink)
 	ld.ab	r9, [sp, 4]
 	ld.ab	r8, [sp, 4]
 	ld.ab	r7, [sp, 4]
@@ -51,6 +56,7 @@
 	pop_s   r3
 	pop_s   r2
 	pop_s   r1
+	cfi_adjust_cfa_offset (-36)
 .endm
 
 ; Upon entry, PLTn, which led us here, sets up the following regs
@@ -69,4 +75,7 @@ ENTRY(_dl_runtime_resolve)
 	RESTORE_CALLER_SAVED_BUT_R0
 	j_s.d   [r0]    ; r0 has resolved function addr
 	pop_s   r0      ; restore first arg to resolved call
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (r0)
+
 END(_dl_runtime_resolve)
diff --git a/sysdeps/arc/sysdep.h b/sysdeps/arc/sysdep.h
index d57f1c0c60a4..c4495bd877c9 100644
--- a/sysdeps/arc/sysdep.h
+++ b/sysdeps/arc/sysdep.h
@@ -32,10 +32,12 @@
     .globl C_SYMBOL_NAME(name)			ASM_LINE_SEP	\
     .type C_SYMBOL_NAME(name),%function		ASM_LINE_SEP	\
   C_LABEL(name)					ASM_LINE_SEP	\
+    cfi_startproc				ASM_LINE_SEP	\
     CALL_MCOUNT
 
 #undef  END
 #define END(name)						\
+  cfi_endproc					ASM_LINE_SEP	\
   ASM_SIZE_DIRECTIVE(name)
 
 #ifdef SHARED
diff --git a/sysdeps/unix/sysv/linux/arc/sigaction.c b/sysdeps/unix/sysv/linux/arc/sigaction.c
index 2bd7b0f08ddc..e2b898039df1 100644
--- a/sysdeps/unix/sysv/linux/arc/sigaction.c
+++ b/sysdeps/unix/sysv/linux/arc/sigaction.c
@@ -26,7 +26,12 @@
  */
 static void __default_rt_sa_restorer(void)
 {
-	INTERNAL_SYSCALL_NCS(__NR_rt_sigreturn, , 0);
+	/* Don't use INTERNAL_SYSCALL_NCS as it causes blink to be spilled on stack */
+	asm volatile(
+		"mov r8, %0	\n\t"	\
+		ARC_TRAP_INSN		\
+	:
+	: "r"(__NR_rt_sigreturn));
 }
 
 #define SA_RESTORER	0x04000000
diff --git a/sysdeps/unix/sysv/linux/arc/sysdep-cancel.h b/sysdeps/unix/sysv/linux/arc/sysdep-cancel.h
index db89ad033a79..b2dbb8670874 100644
--- a/sysdeps/unix/sysv/linux/arc/sysdep-cancel.h
+++ b/sysdeps/unix/sysv/linux/arc/sysdep-cancel.h
@@ -83,10 +83,14 @@
 
 .macro PUSH reg
 	st.a \reg, [sp, -4]
+	cfi_adjust_cfa_offset (4)
+	cfi_rel_offset (\reg, 0)
 .endm
 
 .macro POP reg
 	ld.ab \reg, [sp, 4]
+	cfi_adjust_cfa_offset (-4)
+	cfi_restore (\reg)
 .endm
 
 #define DOCARGS_0	PUSH blink
diff --git a/sysdeps/unix/sysv/linux/arc/sysdep.h b/sysdeps/unix/sysv/linux/arc/sysdep.h
index 507d06a8a575..492a709b51fd 100644
--- a/sysdeps/unix/sysv/linux/arc/sysdep.h
+++ b/sysdeps/unix/sysv/linux/arc/sysdep.h
@@ -103,8 +103,12 @@
 # define SYSCALL_ERROR_HANDLER					\
 0:						ASM_LINE_SEP	\
     st.a   blink, [sp, -4]			ASM_LINE_SEP	\
+    cfi_adjust_cfa_offset (4)			ASM_LINE_SEP	\
+    cfi_rel_offset (blink, 0)			ASM_LINE_SEP	\
     CALL_ERRNO_SETTER_C				ASM_LINE_SEP	\
     ld.ab  blink, [sp, 4]			ASM_LINE_SEP	\
+    cfi_adjust_cfa_offset (-4)			ASM_LINE_SEP	\
+    cfi_restore (blink)				ASM_LINE_SEP	\
     j      [blink]
 
 # define DO_CALL(syscall_name, args)				\
@@ -137,13 +141,13 @@ hidden_proto (__syscall_error)
 	__res = INTERNAL_SYSCALL_NCS(__NR_##name, , nr_args, args);	\
 	if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P ((__res), ), 0))	\
 	{								\
-		asm volatile ("st.a blink, [sp, -4] \n\t"         	\
+		asm volatile ( \
 			       CALL_ERRNO_SETTER                   	\
-			      "ld.ab blink, [sp, 4] \n\t"         	\
 			      :"+r" (__res)                 		\
 			      :                                   	\
 			      :"r1","r2","r3","r4","r5","r6",		\
-			        "r7","r8","r9","r10","r11","r12");	\
+			        "r7","r8","r9","r10","r11","r12",	\
+			        "blink");				\
 	}								\
 	__res;								\
 })
@@ -174,7 +178,7 @@ hidden_proto (__syscall_error)
 		ARC_TRAP_INSN				\
 		: "+r" (__ret)				\
 		: "r"(_sys_num) ASM_ARGS_##nr_args	\
-		: "memory");				\
+		: "memory", "blink");				\
                                                         \
 	__ret;						\
 })
-- 
2.7.4




More information about the linux-snps-arc mailing list