From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 4647 invoked by alias); 21 May 2013 08:05:03 -0000 Mailing-List: contact libc-ports-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: libc-ports-owner@sourceware.org Received: (qmail 4624 invoked by uid 89); 21 May 2013 08:05:02 -0000 X-Spam-SWARE-Status: No, score=-2.7 required=5.0 tests=AWL,BAYES_00,KAM_STOCKGEN,RP_MATCHES_RCVD,TW_GJ,TW_TJ autolearn=no version=3.3.1 Received: from cantor2.suse.de (HELO mx2.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Tue, 21 May 2013 08:05:01 +0000 Received: from relay2.suse.de (unknown [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 49D2EA0FED; Tue, 21 May 2013 10:04:59 +0200 (CEST) From: Andreas Schwab To: Marcus Shawcroft Subject: [PATCH] AArch64: Don't clobber argument for tail call to __sigjmp_save in sigsetjmp Cc: libc-ports@sourceware.org X-Yow: I just put lots of the EGG SALAD in the SILK SOCKS -- Date: Tue, 21 May 2013 08:05:00 -0000 Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-SW-Source: 2013-05/txt/msg00091.txt.bz2 sigsetjmp needs to preserve the second argument for the tail call to __sigjmp_save. Also, in ld.so there is no need to call it at all. Andreas. [BZ #15493] * setjmp/Makefile (tests): Add tst-sigsetjmp. * setjmp/tst-sigsetjmp.c: New test. ChangeLog.aarch64: [BZ #15493] * sysdeps/aarch64/setjmp.S (__sigsetjmp): Don't clobber register x1. [NOT_IN_libc && IS_IN_rtld]: Don't call __sigjmp_save. --- ports/sysdeps/aarch64/setjmp.S | 10 ++++++++-- setjmp/Makefile | 3 ++- setjmp/tst-sigsetjmp.c | 44 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 setjmp/tst-sigsetjmp.c diff --git a/ports/sysdeps/aarch64/setjmp.S b/ports/sysdeps/aarch64/setjmp.S index cff81c7..10e0709 100644 --- a/ports/sysdeps/aarch64/setjmp.S +++ b/ports/sysdeps/aarch64/setjmp.S @@ -44,8 +44,14 @@ ENTRY (__sigsetjmp) stp d10, d11, [x0, #JB_D10<<3] stp d12, d13, [x0, #JB_D12<<3] stp d14, d15, [x0, #JB_D14<<3] - mov x1, sp - str x1, [x0, #JB_SP<<3] + mov x2, sp + str x2, [x0, #JB_SP<<3] +#if defined NOT_IN_libc && defined IS_IN_rtld + /* In ld.so we never save the signal mask */ + mov w0, #0 + RET +#else b C_SYMBOL_NAME(__sigjmp_save) +#endif END (__sigsetjmp) hidden_def (__sigsetjmp) diff --git a/setjmp/Makefile b/setjmp/Makefile index 6124333..913359c 100644 --- a/setjmp/Makefile +++ b/setjmp/Makefile @@ -25,7 +25,8 @@ headers := setjmp.h bits/setjmp.h bits/setjmp2.h routines := setjmp sigjmp bsd-setjmp bsd-_setjmp \ longjmp __longjmp jmp-unwind -tests := tst-setjmp jmpbug bug269-setjmp tst-setjmp-fp +tests := tst-setjmp jmpbug bug269-setjmp tst-setjmp-fp \ + tst-sigsetjmp include ../Rules diff --git a/setjmp/tst-sigsetjmp.c b/setjmp/tst-sigsetjmp.c new file mode 100644 index 0000000..d5cf295 --- /dev/null +++ b/setjmp/tst-sigsetjmp.c @@ -0,0 +1,44 @@ +/* Copyright (C) 2013 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +/* Test case for BZ #15493 */ + +#include +#include +#include + +static int +do_test (void) +{ + sigjmp_buf sj; + sigset_t m; + + sigemptyset (&m); + sigprocmask (SIG_SETMASK, &m, 0); + if (!sigsetjmp (sj, 0)) + { + sigaddset (&m, SIGUSR1); + sigprocmask (SIG_SETMASK, &m, 0); + siglongjmp (sj, 1); + return 1; + } + sigprocmask (SIG_SETMASK, 0, &m); + return sigismember (&m, SIGUSR1) == 0 ? EXIT_FAILURE : EXIT_SUCCESS; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" -- 1.8.2.3 -- Andreas Schwab, SUSE Labs, schwab@suse.de GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE 1748 E4D4 88E3 0EEA B9D7 "And now for something completely different."