public inbox for ltp@lists.linux.it
 help / color / mirror / Atom feed
* [LTP] [PATCH 1/2] ltp_rt_sigaction: SPARC fixes for -O0
@ 2015-08-17 12:13 Stanislav Kholmanskikh
  2015-08-17 12:13 ` [LTP] [PATCH 2/2] containers: allow linking with additional libs Stanislav Kholmanskikh
  2015-08-17 12:49 ` [LTP] [PATCH 1/2] ltp_rt_sigaction: SPARC fixes for -O0 Jan Stancek
  0 siblings, 2 replies; 5+ messages in thread
From: Stanislav Kholmanskikh @ 2015-08-17 12:13 UTC (permalink / raw)
  To: ltp-list; +Cc: vasily.isaenko

The *sigreturn_stub functions are copied from glibc, and they
work only if optimization > 0, since they expect that the compiler
does not add an epilogue.

For example, with -O > 0:

0000000000102140 <__rt_sigreturn_stub>:
  102140:       82 10 20 65     mov  0x65, %g1  ! 65 <_init-0x101f23>
  102144:       91 d0 20 6d     ta  0x6d
  102148:       81 c3 e0 08     retl
  10214c:       01 00 00 00     nop

but without -O:

000000000010212c <__rt_sigreturn_stub>:
  10212c:       9d e3 bf 50     save  %sp, -176, %sp  <--- this
  102130:       82 10 20 65     mov  0x65, %g1
  102134:       91 d0 20 6d     ta  0x6d
  102138:       81 cf e0 08     rett  %i7 + 8
  10213c:       01 00 00 00     nop

Therefore, if we build LTP with OPT_CFLAGS="", ltp_rt_sigaction() will
malfunction.

To avoid this, let's declare a new symbol pointing to the instruction we
need ('mov ...').

The trick was proposed by Jose E. Marchesi <jose.marchesi@oracle.com>.

Signed-off-by: Stanislav Kholmanskikh <stanislav.kholmanskikh@oracle.com>
---
 include/lapi/rt_sigaction.h |   20 ++++++++++++--------
 1 files changed, 12 insertions(+), 8 deletions(-)

diff --git a/include/lapi/rt_sigaction.h b/include/lapi/rt_sigaction.h
index 46f6a50..f99c372 100644
--- a/include/lapi/rt_sigaction.h
+++ b/include/lapi/rt_sigaction.h
@@ -105,12 +105,14 @@ static inline int sig_initial(int sig)
 # if defined __arch64__ || defined __sparcv9
 
 /*
- * From glibc/sysdeps/unix/sysv/linux/sparc/sparc64/sigaction.c
+ * Based on glibc/sysdeps/unix/sysv/linux/sparc/sparc64/sigaction.c
  */
 
+extern char *__rt_sig_stub;
+
 static void __rt_sigreturn_stub(void)
 {
-	__asm__ ("mov %0, %%g1\n\t"
+	__asm__ ("__rt_sig_stub: mov %0, %%g1\n\t"
 		"ta  0x6d\n\t"
 		: /* no outputs */
 		: "i" (__NR_rt_sigreturn));
@@ -119,12 +121,14 @@ static void __rt_sigreturn_stub(void)
 # else /* sparc32 */
 
 /*
- * From glibc/sysdeps/unix/sysv/linux/sparc/sparc32/sigaction.c
+ * Based on glibc/sysdeps/unix/sysv/linux/sparc/sparc32/sigaction.c
  */
 
+extern char *__rt_sig_stub, *__sig_stub;
+
 static void __rt_sigreturn_stub(void)
 {
-	__asm__ ("mov %0, %%g1\n\t"
+	__asm__ ("__rt_sig_stub: mov %0, %%g1\n\t"
 		"ta  0x10\n\t"
 		: /* no outputs */
 		: "i" (__NR_rt_sigreturn));
@@ -132,7 +136,7 @@ static void __rt_sigreturn_stub(void)
 
 static void __sigreturn_stub(void)
 {
-	__asm__ ("mov %0, %%g1\n\t"
+	__asm__ ("__sig_stub: mov %0, %%g1\n\t"
 		"ta  0x10\n\t"
 		: /* no outputs */
 		: "i" (__NR_sigreturn));
@@ -181,12 +185,12 @@ static int ltp_rt_sigaction(int signum, const struct sigaction *act,
 #ifdef __sparc__
 	unsigned long stub = 0;
 # if defined __arch64__ || defined __sparcv9
-	stub = ((unsigned long) &__rt_sigreturn_stub) - 8;
+	stub = ((unsigned long) &__rt_sig_stub) - 8;
 # else /* sparc32 */
 	if ((kact.sa_flags & SA_SIGINFO) != 0)
-		stub = ((unsigned long) &__rt_sigreturn_stub) - 8;
+		stub = ((unsigned long) &__rt_sig_stub) - 8;
 	else
-		stub = ((unsigned long) &__sigreturn_stub) - 8;
+		stub = ((unsigned long) &__sig_stub) - 8;
 # endif
 #endif
 
-- 
1.7.1


------------------------------------------------------------------------------
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2015-08-19 14:22 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-08-17 12:13 [LTP] [PATCH 1/2] ltp_rt_sigaction: SPARC fixes for -O0 Stanislav Kholmanskikh
2015-08-17 12:13 ` [LTP] [PATCH 2/2] containers: allow linking with additional libs Stanislav Kholmanskikh
2015-08-17 12:49 ` [LTP] [PATCH 1/2] ltp_rt_sigaction: SPARC fixes for -O0 Jan Stancek
2015-08-17 13:17   ` Stanislav Kholmanskikh
2015-08-19 14:22     ` Stanislav Kholmanskikh

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox