----- Original Message -----
> From: "Stanislav Kholmanskikh" <stanislav.kholmansk...@oracle.com>
> To: ltp-list@lists.sourceforge.net
> Cc: "vasily isaenko" <vasily.isae...@oracle.com>
> Sent: Monday, 17 August, 2015 2:13:17 PM
> Subject: [LTP] [PATCH 1/2] ltp_rt_sigaction: SPARC fixes for -O0
>
> 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.
Isn't that prologue?
Other than that it looks good to me, ACK.
Regards,
Jan
>
> 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.march...@oracle.com>.
>
> Signed-off-by: Stanislav Kholmanskikh <stanislav.kholmansk...@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
>
------------------------------------------------------------------------------
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list