From patchwork Mon Dec 11 19:06:45 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella X-Patchwork-Id: 121438 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp3167179qgn; Mon, 11 Dec 2017 11:07:51 -0800 (PST) X-Google-Smtp-Source: ACJfBovOWSTzdtVd9y4wwz+rPf5seICCR1v2V16dlW8xjbWTD/QtFZwzjlPfrjZPMwnZK4NwACYf X-Received: by 10.98.130.4 with SMTP id w4mr1278443pfd.238.1513019271036; Mon, 11 Dec 2017 11:07:51 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1513019271; cv=none; d=google.com; s=arc-20160816; b=cASlJWY6BeET0PKozQVNTqKVkeEK4KQWwZy5+1RWll4E7UkA0u+eVpWBtYeAvtErtK D3CfRWzB4/3j5FKy1IX0YWhSGtPaQxTrbKMcL5ThEA+2AUddx6c1ziZ3Ew4eO7Q0GEiU vr7zjWSDdt9UL151G5zSXED9vo+TKjk458iWCRwiaCQCBYd2yhVq5PftBWzxF5uvd5U3 eQ3qbTOD/+V9sqbWiRwXcMLd4rWsTkffrJiEtCJUyfQRsvXzb9xK9ElZ0hGZK1QsVG8X ZgXTFhgtCa5yBAJBY6TTO26N6+XSQrT1vxgTIaJu5VeGYZ7xjBvTLrbiaOaNzI4xSG6U bJjg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from :delivered-to:sender:list-help:list-post:list-archive:list-subscribe :list-unsubscribe:list-id:precedence:mailing-list:dkim-signature :domainkey-signature:arc-authentication-results; bh=dgI15CEA2tSig44fzwKoHyrbQlq2By0Cx/jBiCe4jYE=; b=hTzEDo1n5AHYt4at8gzIAKHtO8u3t+auD2aFD/Q8EGK+vxf3trcuUiqRO99ImqFL52 2Fntg+HmVRdIBhqNuem5VbLzbQckAsHnIk/h0Fd7nEQ6T4oxwD4gikBTi6iCdYnfVi7T UNft8p02bKG5aVqnpImynSk4HhzBVOCNPo2HaWXBEFbG083hqnq49O/8TS70dgYahvKk 6slkPsD0zpHMbZ4mr3MLyu0BDdz1nZsaQT8QmBVAGnkTkj9Eg/H4cxrj7cGi/OYklxc7 RpU8+l2mObXFDxe8SVrhJqvayMYh1H8lCBcmD7Yci3mpwX3wi0MlXYrkiKz/bC+awI2z brTw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=wupi8IB7; spf=pass (google.com: domain of libc-alpha-return-88015-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88015-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id h1si7512795pld.364.2017.12.11.11.07.50 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Dec 2017 11:07:51 -0800 (PST) Received-SPF: pass (google.com: domain of libc-alpha-return-88015-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=wupi8IB7; spf=pass (google.com: domain of libc-alpha-return-88015-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88015-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id:in-reply-to :references; q=dns; s=default; b=W76jNKjEc/DT6BNavgPZEC2BQTRAznJ AyTrt8sl/hxf92oJi5h+Kq8Uu4q4wDssZbVvPUpB5VjQefsXbYdwokZwK78tZVCW I1eleuZtGQPr2OVPjml8C9HHcXgA1iDTtknSGkyqUhPEid7kjXrNEk6k8rwJwkGZ ZWSTM8sx1NV8= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id:in-reply-to :references; s=default; bh=zq9qNYuj7McVmYXnJTIHzLA7lhg=; b=wupi8 IB7c8ggINk8OLWByVjXJB1BYeurFXEe9BVCLwo1MuuX830Pcd5f52nrjBmEXBiBV UU4qeq1zBcl9Bj/OEfyGDm3eRbPCZNZPJQFZZwqOKox6iZtzxJp6uK/t5Yy7qjR3 TBCE6ZtZKOaa8zXOFZM+AlhFEA/JoWFzsOEd6I= Received: (qmail 40609 invoked by alias); 11 Dec 2017 19:07:18 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 40490 invoked by uid 89); 11 Dec 2017 19:07:17 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.8 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=700000, sk:sparcv9, 1914, 4457 X-HELO: mail-qt0-f194.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=dgI15CEA2tSig44fzwKoHyrbQlq2By0Cx/jBiCe4jYE=; b=TTO8jbugkqgI/7IaBR9HtiPD+y0uc8YG62DQFzv79CK2Q+HqwrLi/3OAAyynFvnKxD TQNteifwzAstjZyWCylrV6U/pkPZHDMzrKaWoEio+jcCfQuHSp2nzzCZzdMDTRsVq6ga RUTv/k8K8WRSVSG0f2mlnKMFJnIbC/gwBavsvDb26SDntBXxAUZ846nDvOlOCp3AwTEM F7ZEopPQ6XUZjT8t8BbQJE26eSFNIhEtYCaeMqVzThfoUsmt0064nXXTyjsl5teShjwT lO0QISk056WKbvmoMPs+dkEdi9IyKPCSnUrjGyLNgOYR5v3wNCGfISupZ9rH0S/YDTQV UvIQ== X-Gm-Message-State: AKGB3mKI6+E119WyxNV9UyZrvho5fE2y7Z72fEoOg2vNJnYzGhPdPPGu 8kTYA1TiJ9f9GAHnzUqA3dw6Gl/gE+4= X-Received: by 10.237.63.184 with SMTP id s53mr2100063qth.89.1513019231736; Mon, 11 Dec 2017 11:07:11 -0800 (PST) From: Adhemerval Zanella To: libc-alpha@sourceware.org Cc: Adhemerval Zanella Subject: [PATCH 01/19] nptl: Fix testcases for new pthread cancellation mechanism Date: Mon, 11 Dec 2017 17:06:45 -0200 Message-Id: <1513019223-7603-2-git-send-email-adhemerval.zanella@linaro.org> In-Reply-To: <1513019223-7603-1-git-send-email-adhemerval.zanella@linaro.org> References: <1513019223-7603-1-git-send-email-adhemerval.zanella@linaro.org> From: Adhemerval Zanella With upcoming fix for BZ#12683, pthread cancellation does not act for: 1. If syscall is blocked but with some side effects already having taken place (e.g. a partial read or write). 2. After the syscall has returned. The main change is due the fact programs need to act in syscalls with side-effects (for instance, to avoid leak of allocated resources or handle partial read/write). This patch changes the NPTL testcase that assumes the old behavior and also remove the tst-cancel-wrappers.sh test (which checks for symbols that will not exist anymore). For tst-cancel{2,3} case it remove the pipe close because it might cause the write syscall to return with side effects if the close is executed before the pthread cancel. It also changes how to call the read syscall on tst-backtrace{5,6} to use syscall instead of read cancelable syscall to avoid need to handle the cancelable bridge function calls. It requires a change on powerpc syscall implementation to create a stackframe, since powerpc backtrace rely on such information. Checked on i686-linux-gnu, x86_64-linux-gnu, x86_64-linux-gnux32, aarch64-linux-gnu, arm-linux-gnueabihf, powerpc64le-linux-gnu, powerpc-linux-gnu, sparcv9-linux-gnu, and sparc64-linux-gnu. * debug/tst-backtrace5.c (handle_signal): Check for syscall instead of read. (fn): Issue the read syscall instead of call the cancellable syscall. * nptl/Makefile [$(run-built-tests) = yes] (tests-special): Remove tst-cancel-wrappers.sh. * nptl/tst-cancel-wrappers.sh: Remove file. * nptl/tst-cancel2.c (do_test): Do not close pipe. * nptl/tst-cancel3.c (do_test): Likewise. * nptl/tst-cancel4.c (tf_write): Handle cancelled syscall with side-effects. (tf_send): Likewise. * sysdeps/unix/sysv/linux/powerpc/syscall.S (syscall): Create stack frame. Signed-off-by: Adhemerval Zanella --- ChangeLog | 17 ++++++ debug/tst-backtrace5.c | 26 +++++---- nptl/Makefile | 17 +----- nptl/tst-cancel-wrappers.sh | 92 ------------------------------- nptl/tst-cancel2.c | 3 - nptl/tst-cancel3.c | 3 - nptl/tst-cancel4.c | 8 +++ sysdeps/unix/sysv/linux/powerpc/syscall.S | 14 +++++ 8 files changed, 57 insertions(+), 123 deletions(-) delete mode 100644 nptl/tst-cancel-wrappers.sh -- 2.7.4 diff --git a/debug/tst-backtrace5.c b/debug/tst-backtrace5.c index 0b85e44..0ef2627 100644 --- a/debug/tst-backtrace5.c +++ b/debug/tst-backtrace5.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -33,7 +34,7 @@ #endif /* The backtrace should include at least handle_signal, a signal - trampoline, read, 3 * fn, and do_test. */ + trampoline, syscall, 3 * fn, and do_test. */ #define NUM_FUNCTIONS 7 void @@ -71,15 +72,17 @@ handle_signal (int signum) } /* Do not check name for signal trampoline. */ i = 2; - if (!match (symbols[i++], "read")) + + if (match (symbols[i], "__kernel_vsyscall")) + i++; + + /* We are using syscall(...) instead of read. */ + if (!match (symbols[i++], "syscall")) { - /* Perhaps symbols[2] is __kernel_vsyscall? */ - if (!match (symbols[i++], "read")) - { - FAIL (); - return; - } + FAIL (); + return; } + for (; i < n - 1; i++) if (!match (symbols[i], "fn")) { @@ -123,8 +126,11 @@ fn (int c, int flags) _exit (0); } - /* In the parent. */ - read (pipefd[0], r, 1); + /* To avoid need to handle cancellation syscall backtrace (which call + the function using both the generic bridge (__syscall_cancel) and + the architecture defined one (__syscall_cancel_arch), issue the + syscall directly. */ + syscall (__NR_read, pipefd[0], r, 1); return 0; } diff --git a/nptl/Makefile b/nptl/Makefile index 11e6ecd..36bf25f 100644 --- a/nptl/Makefile +++ b/nptl/Makefile @@ -445,8 +445,7 @@ tests-reverse += tst-cancel5 tst-cancel23 tst-vfork1x tst-vfork2x ifeq ($(run-built-tests),yes) tests-special += $(objpfx)tst-stack3-mem.out $(objpfx)tst-oddstacklimit.out ifeq ($(build-shared),yes) -tests-special += $(objpfx)tst-tls6.out $(objpfx)tst-cleanup0-cmp.out \ - $(objpfx)tst-cancel-wrappers.out +tests-special += $(objpfx)tst-tls6.out $(objpfx)tst-cleanup0-cmp.out endif endif @@ -670,7 +669,7 @@ $(objpfx)$(multidir)/crtn.o: $(objpfx)crtn.o $(objpfx)$(multidir)/ endif generated += libpthread_nonshared.a \ - multidir.mk tst-atfork2.mtrace tst-cancel-wrappers.out \ + multidir.mk tst-atfork2.mtrace \ tst-tls6.out generated += $(objpfx)tst-atfork2.mtrace \ @@ -682,18 +681,6 @@ LDFLAGS-pthread.so += -e __nptl_main $(objpfx)pt-interp.os: $(common-objpfx)runtime-linker.h endif -ifeq ($(run-built-tests),yes) -ifeq (yes,$(build-shared)) -$(objpfx)tst-cancel-wrappers.out: tst-cancel-wrappers.sh - $(SHELL) $< '$(NM)' \ - $(common-objpfx)libc_pic.a \ - $(common-objpfx)libc.a \ - $(objpfx)libpthread_pic.a \ - $(objpfx)libpthread.a > $@; \ - $(evaluate-test) -endif -endif - tst-exec4-ARGS = $(host-test-program-cmd) $(objpfx)tst-execstack: $(libdl) diff --git a/nptl/tst-cancel-wrappers.sh b/nptl/tst-cancel-wrappers.sh deleted file mode 100644 index 1795e3d..0000000 --- a/nptl/tst-cancel-wrappers.sh +++ /dev/null @@ -1,92 +0,0 @@ -#!/bin/sh -# Test whether all cancelable functions are cancelable. -# Copyright (C) 2002-2017 Free Software Foundation, Inc. -# This file is part of the GNU C Library. -# Contributed by Jakub Jelinek , 2002. - -# 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 -# . - -NM="$1"; shift -while [ $# -gt 0 ]; do - ( $NM -P $1; echo 'end[end]:' ) | gawk ' BEGIN { -C["accept"]=1 -C["close"]=1 -C["connect"]=1 -C["creat"]=1 -C["fcntl"]=1 -C["fdatasync"]=1 -C["fsync"]=1 -C["msgrcv"]=1 -C["msgsnd"]=1 -C["msync"]=1 -C["nanosleep"]=1 -C["open"]=1 -C["open64"]=1 -C["pause"]=1 -C["poll"]=1 -C["pread"]=1 -C["pread64"]=1 -C["pselect"]=1 -C["pwrite"]=1 -C["pwrite64"]=1 -C["read"]=1 -C["readv"]=1 -C["recv"]=1 -C["recvfrom"]=1 -C["recvmsg"]=1 -C["select"]=1 -C["send"]=1 -C["sendmsg"]=1 -C["sendto"]=1 -C["sigpause"]=1 -C["sigsuspend"]=1 -C["sigwait"]=1 -C["sigwaitinfo"]=1 -C["tcdrain"]=1 -C["wait"]=1 -C["waitid"]=1 -C["waitpid"]=1 -C["write"]=1 -C["writev"]=1 -C["__xpg_sigpause"]=1 -} -/:$/ { - if (seen) - { - if (!seen_enable || !seen_disable) - { - printf "in '$1'(%s) %s'\''s cancellation missing\n", object, seen - ret = 1 - } - } - seen="" - seen_enable="" - seen_disable="" - object=gensub(/^.*\[(.*)\]:$/, "\\1", 1, $0) - next -} -{ - if (C[$1] && $2 ~ /^[TW]$/) - seen=$1 - else if ($1 ~ /^([.]|)__(libc|pthread)_enable_asynccancel$/ && $2 == "U") - seen_enable=1 - else if ($1 ~ /^([.]|)__(libc|pthread)_disable_asynccancel$/ && $2 == "U") - seen_disable=1 -} -END { - exit ret -}' || exit - shift -done diff --git a/nptl/tst-cancel2.c b/nptl/tst-cancel2.c index bf7946c..25a6143 100644 --- a/nptl/tst-cancel2.c +++ b/nptl/tst-cancel2.c @@ -73,9 +73,6 @@ do_test (void) return 1; } - /* This will cause the write in the child to return. */ - close (fd[0]); - if (pthread_join (th, &r) != 0) { puts ("join failed"); diff --git a/nptl/tst-cancel3.c b/nptl/tst-cancel3.c index 228c478..c462a7e 100644 --- a/nptl/tst-cancel3.c +++ b/nptl/tst-cancel3.c @@ -75,9 +75,6 @@ do_test (void) return 1; } - /* This will cause the read in the child to return. */ - close (fd[0]); - if (pthread_join (th, &r) != 0) { puts ("join failed"); diff --git a/nptl/tst-cancel4.c b/nptl/tst-cancel4.c index 7a560a1..4f21131 100644 --- a/nptl/tst-cancel4.c +++ b/nptl/tst-cancel4.c @@ -166,6 +166,10 @@ tf_write (void *arg) char buf[WRITE_BUFFER_SIZE]; memset (buf, '\0', sizeof (buf)); s = write (fd, buf, sizeof (buf)); + /* The write can return a value higher than 0 (meaning partial write) + due to the SIGCANCEL, but the thread may still be pending + cancellation. */ + pthread_testcancel (); pthread_cleanup_pop (0); @@ -742,6 +746,10 @@ tf_send (void *arg) char mem[700000]; send (tempfd2, mem, arg == NULL ? sizeof (mem) : 1, 0); + /* Thez send can return a value higher than 0 (meaning partial send) + due to the SIGCANCEL, but the thread may still be pending + cancellation. */ + pthread_testcancel (); pthread_cleanup_pop (0); diff --git a/sysdeps/unix/sysv/linux/powerpc/syscall.S b/sysdeps/unix/sysv/linux/powerpc/syscall.S index 0522ccd..9fa64d9 100644 --- a/sysdeps/unix/sysv/linux/powerpc/syscall.S +++ b/sysdeps/unix/sysv/linux/powerpc/syscall.S @@ -19,6 +19,14 @@ ENTRY (syscall) ABORT_TRANSACTION + /* Creates a minimum stack frame so backtrace. */ +#ifdef __powerpc64__ + stdu r1, -FRAME_MIN_SIZE (r1) + cfi_adjust_cfa_offset (FRAME_MIN_SIZE) +#else + stwu r1,-16(1) + cfi_def_cfa_offset (16) +#endif mr r0,r3 mr r3,r4 mr r4,r5 @@ -26,6 +34,12 @@ ENTRY (syscall) mr r6,r7 mr r7,r8 mr r8,r9 +#ifdef __powerpc64__ + addi r1, r1, FRAME_MIN_SIZE +#else + addi r1,r1,16 +#endif + cfi_def_cfa_offset (0) sc PSEUDO_RET PSEUDO_END (syscall) From patchwork Mon Dec 11 19:06:46 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella X-Patchwork-Id: 121446 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp3168889qgn; Mon, 11 Dec 2017 11:09:32 -0800 (PST) X-Google-Smtp-Source: ACJfBoshTvxmZi3JMTt5iXcwRFnatfqXcOqTLZdUIy4udZ1V/8etX4JUmUMZtk2tftkyQzmfiHlV X-Received: by 10.159.195.8 with SMTP id bd8mr1335251plb.322.1513019372268; Mon, 11 Dec 2017 11:09:32 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1513019372; cv=none; d=google.com; s=arc-20160816; b=Ig6VaE9lVZ2xvEaxh05xGVz/KLovdqngtxpEPuBqHtTWBk7kVfRVGXqfJR+sU06aoi zGKstPgu2q4dAa3rjnInsNaO3TPsUSJheaKXL1yCOBueCTQW7plJJD2q8MWAhxDnDJjk lhCLSKUhsjf0ibFxaRtgwXFwec9rbShLWIKlK2gjYb/1O4b5vp7RVI/GV6rievQHSw6M F58yfq0Q3DpX8W90jlWdtbcEoBpv3nO4rkeOSN8jtmrOHOb2ii7er+yj2YRadwzFWJP7 TZ6O19pPeD4/t1jou4YoneeHvEYYqRKB4dgRKIzikRzSTre0Z8aaldGSDzscdAgx155U 7fiQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:to:from:delivered-to :sender:list-help:list-post:list-archive:list-subscribe :list-unsubscribe:list-id:precedence:mailing-list:dkim-signature :domainkey-signature:arc-authentication-results; bh=ly6gPr9mm7efbVLFzdv2hbfsfIj+Wz2CI3ulOToOizQ=; b=fhZxClW2/pwOvMzOpduoT4RXcu7Bg6Yjnf4JM7Nx3fwh3OtnZmOb/IkA8hFz58rDZp WElRsXFauNJ1XhVj2Xtps82z0VnEpgdAHtZrqhh92ISEaF4Yqpjii1ULJfBPCJJipvMl 3mgm1NgyqOg5kQLrR+rzUFVuidOZsqGS+hOU+5yT/7VqMryfPVLgbru5ykj2g4qpRz1n NpYBkytqISTtdSvnhxGUN06pgKM0vpNU8Q65S7F9GL4shV8jkDhA0dtTUeoehp5bSUnN yxXQoIrlM9PjwUE7uQXKugXfqlb30zzKNTOPEnTO6TkpciN8oS0Mt3Hzwc526Zqz5xJj HsKg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=IYwrsj2O; spf=pass (google.com: domain of libc-alpha-return-88023-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88023-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id h80si11280093pfh.32.2017.12.11.11.09.31 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Dec 2017 11:09:32 -0800 (PST) Received-SPF: pass (google.com: domain of libc-alpha-return-88023-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=IYwrsj2O; spf=pass (google.com: domain of libc-alpha-return-88023-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88023-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; q=dns; s=default; b=PumMfQuBkfnv93jfmEvEvfLSS04bkrx +XZWcVpySS/ZiJD5LirK3Wxa5dUK4+2aqX3qaXj+ge3tU86BPIcOedQRfU64oe0B 1EOYPPRzpX7dc1TvrCJWRfYlM9DCE4UWvQT5v2KXAJWpurEgRXuaVJpryw/ceWk0 3DfGJDz9G4BA= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; s=default; bh=sYTTgTxcv/NpfVGEJpDb+tRbHDE=; b=IYwrs j2OmYusT/bymZwLXWbj31r2U414glzrnxzW+fDAGISoVT5bQ3H5AyMPj0hKI/Ciz 0PjrAszubW4mLiRcV8d00/YRJnZ7+G/3gzFQu7XpBIKiAdzJeKyp36/PoKXsrF6u rg86F3IiN0q8IYh4v/O5+vYF+yrGEH9wHVHmRM= Received: (qmail 41806 invoked by alias); 11 Dec 2017 19:07:28 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 41726 invoked by uid 89); 11 Dec 2017 19:07:27 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-22.7 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, KAM_STOCKGEN, RCVD_IN_DNSWL_NONE, SPF_PASS, UNSUBSCRIBE_BODY autolearn=ham version=3.3.2 spammy=sk:cancel, leakage, arrives, interruption X-HELO: mail-qt0-f170.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=ly6gPr9mm7efbVLFzdv2hbfsfIj+Wz2CI3ulOToOizQ=; b=Grop1giPxOL+4rEpX3XgqLpDrbkrrAmYeaj3kRH5sT1dTTCVP+ZC1/gSNuHGvqNa00 Jzt8y4YTK4jSLeo1WzdR5xf+OdUlByYGcXAHDpvD6Djb7HeCK3qQwv6rkavJupJZiNOw NZ0HGpjBh/uQw8ZR4KOWiAdSzGpZqS/bi39IagEoLF5JrfZfuczRc0hnDOhhh55SBIdB l+BC1VJyLQu34Mb9+a7dq47xvF1bxBoIwJbACyIEITws7VaO8piIBkdf3s/Y4RoEqdCM UK6snznM5L/ZbUVczeHT5KmwTD7WERi57UApnLZjLcN+JAE3UvYqc3OGvwlk51xFOlZq HKcQ== X-Gm-Message-State: AKGB3mIN/QGOM/hrGZp/RxR5XQQenuQ+ajZjYrdm1zgomHpVvROX280E hDKHpy6KnQ0W9kkqyVrsA9H7O5RxDWs= X-Received: by 10.200.41.249 with SMTP id 54mr2096244qtt.312.1513019233500; Mon, 11 Dec 2017 11:07:13 -0800 (PST) From: Adhemerval Zanella To: libc-alpha@sourceware.org Subject: [PATCH 02/19] nptl: Fix Race conditions in pthread cancellation (BZ#12683) Date: Mon, 11 Dec 2017 17:06:46 -0200 Message-Id: <1513019223-7603-3-git-send-email-adhemerval.zanella@linaro.org> In-Reply-To: <1513019223-7603-1-git-send-email-adhemerval.zanella@linaro.org> References: <1513019223-7603-1-git-send-email-adhemerval.zanella@linaro.org> This patches fixes some race conditions in NPTL cancellation code by redefining how cancellable syscalls are defined and handled. Current approach is to enable asynchronous cancellation prior to making the syscall and restore the previous cancellation type once the syscall returns. As decribed in BZ#12683, this approach shows 2 important problems: 1. Cancellation can act after the syscall has returned from kernel, but before userspace saves the return value. It might result in a resource leak if the syscall allocated a resource or a side effect (partial read/write), and there is no way to program handle it with cancellation handlers. 2. If a signal is handled while the thread is blocked at a cancellable syscall, the entire signal handler runs with asynchronous cancellation enabled. This can lead to issues if the signal handler call functions which are async-signal-safe but not async-cancel-safe. For cancellation to work correctly, there are 5 points at which the cancellation signal could arrive: 1. Before the final "testcancel" and before the syscall is made. 2. Between the "testcancel" and the syscall. 3. While the syscall is blocked and no side effects have yet taken place. 4. While the syscall is blocked but with some side effects already having taken place (e.g. a partial read or write). 5. After the syscall has returned. And GLIBC wants to act on cancellation in cases 1, 2, and 3 but not in case 4 or 5. The proposed solution follows: * Handling case 1 is trivial: do a conditional branch based on whether the thread has received a cancellation request; * Case 2 can be caught by the signal handler determining that the saved program counter (from the ucontext_t) is in some address range beginning just before the "testcancel" and ending with the syscall instruction. * In this case, except for certain syscalls that ALWAYS fail with EINTR even for non-interrupting signals, the kernel will reset the program counter to point at the syscall instruction during signal handling, so that the syscall is restarted when the signal handler returns. So, from the signal handler's standpoint, this looks the same as case 2, and thus it's taken care of. * In this case, the kernel cannot restart the syscall; when it's interrupted by a signal, the kernel must cause the syscall to return with whatever partial result it obtained (e.g. partial read or write). * In this case, the saved program counter points just after the syscall instruction, so the signal handler won't act on cancellation. This one is equal to 4. since the program counter is past the syscall instruction already. Another case that needs handling is syscalls that fail with EINTR even when the signal handler is non-interrupting. In this case, the syscall wrapper code can just check the cancellation flag when the errno result is EINTR, and act on cancellation if it's set. The proposed GLIBC adjustments are: 1. Remove the enable_asynccancel/disable_asynccancel function usage in syscall definition and instead make them call a common symbol that will check if cancellation is enabled (__syscall_cancel at nptl/libc-cancellation.c), call the arch-specific cancellable entry-point (__syscall_cancel_arch) and cancel the thread when required. 2. Provide a arch-specific symbol that contains global markers. These markers will be used in SIGCANCEL handler to check if the interruption has been called in a valid syscall and if the syscalls has been completed or not. A default version is provided (sysdeps/unix/sysv/linux/syscall_cancel.c), however the markers may not be set on correct expected places depeding of how INTERNAL_SYSCALL_NCS is implemented by the underlying architecture. In this case arch-specific implementation should be provided. 3. Rewrite SIGCANCEL asynchronous handler to check for both cancelling type and if current IP from signal handler falls between the global markes and act accordingly (sigcancel_handler at nptl/nptl-init.c). 4. Adjust nptl/pthread_cancel.c to send an signal instead of acting directly. This avoid synchronization issues when updating the cancellation status and also focus the logic on signal handler and cancellation syscall code. 5. Adjust pthread code to replace CANCEL_ASYNC/CANCEL_RESET calls to appropriated cancelable futex syscalls. 6. Adjust libc code to replace LIBC_CANCEL_ASYNC/LIBC_CANCEL_RESET to appropriated cancelable syscalls. 7. Adjust 'lowlevellock-futex.h' arch-specific implementations to provide cancelable futex calls (used in libpthread code). This patch adds the proposed changes to NPTL. The code leaves all the ports broken without further patches in the list. * nptl/Makefile [routines]: Add syscall_cancel object. [libpthread-routines]: Remove cancellation object. (CFLAGS-cancellation.c): Remove rule. (CFLAGS-syscall_cancel.c): New rule. (tests): Add tst-cancel28. * nptl/Versions [GLIBC_PRIVATE] (libc): Add __syscall_cancel, __syscall_cancel_arch_start, and __syscall_cancel_arch_end. * nptl/cancellation.c: Remove file. * nptl/descr.h (CANCELING_BIT): Remove define. (CANCELING_BITMASK): Likewise. (CANCEL_RESTMASK): Adjust value with CANCELED_BIT remove. * nptl/libc-cancellation.c (__syscall_cancel): Add non-cancellable implementation for loader and cancellable one for libc. (__syscall_do_cancel): New function: cancel call for syscall wrappers. * nptl/lll_timedlock_wait.c (__lll_timedlock_wait): Use cancellable futex operation. (__lll_timedwait_tid): Likewise. * nptl/nptl-init.c (sigcancel_handler): Rewrite function to avoid race conditions. (__pthread_initialize_minimal_internal): Add SA_RESTART to SIGCANCEL handler. * nptl/pt-system.c [LIBC_CANCEL_HANDLED]: Remove definition. * io/creat.c (LIBC_CANCEL_HANDLED): Likewise. * io/ppoll.c [ppoll] (LIBC_CANCEL_HANDLED): Likewise. * misc/pselect [__pselect] (LIBC_CANCEL_HANDLED): Likewise. * sysdeps/posix/pause.c (LIBC_CANCEL_HANDLED): Likewise. * sysdeps/unix/sysv/linux/generic/creat.c (LIBC_CANCEL_HANDLED): Likewise. * nptl/pthreadP.h (__do_cancel): Rewrite to both disable asynchronous cancellation and setting the thread as cancelled. (CANCEL_ASYNC): Remove definition. (CANCEL_RESET): Likewise. (LIBC_CANCEL_ASYNC): Likewise. (LIBC_CANCEL_RESET): Likewise. (LIBC_CANCEL_HANDLED): Likewise. (__syscall_cancel_arch): Add prototype. (__pthread_enable_asynccancel): Remove prototype. (__pthread_disable_asynccancel): Likewise. (__libc_enable_asynccancel): Likewise. (__libc_disable_asynccancel): Likewise. (__librt_enable_asynccancel): Likewise. (__librt_disable_asynccancel): Likewise. (__syscall_cancel_arch): Add prototype. (__syscall_do_cancel): Likewise. * nptl/pthread_cancel.c (pthread_cancel): Rewrite to just set CANCELLED_BIT and call __pthread_kill. * nptl/pthread_create.c (start_thread): Likewise. * nptl/pthread_timedjoin.c (pthread_timedjoin_np): Likewise. * nptl/sem_timedwait.c (sem_timedwait): Likewise. * nptl/sem_wait.c (__new_sem_wait): Likewise. * nptl/sem_waitcommon.c (futex_abstimed_wait): Likewise. * sysdeps/nptl/aio_misc.h (AIO_MISC_WAIT): Likewise. * sysdeps/nptl/gai_misc.h (GAI_MISC_WAIT): Likewise. * sysdeps/posix/sigpause.c (do_sigpause): Likewise. * sysdeps/posix/sigwait.c (__sigwait): Likewise. * sysdeps/posix/waitid.c (__waitid): Likewise. * sysdeps/nptl/lowlevellock.h (lll_wait_tid): Likewise. * sysdeps/posix/open64.c (__libc_open64): Likewise. * sysdeps/unix/sysv/linux/sigwait.c (__sigwait): Likewise. * nptl/pthread_exit.c (pthread_exit): Rewrite to set EXITING_BIT before call __pthread_unwind. * nptl/pthread_join.c (pthread_join): Remove CANCEL_ASYNC/CANCEL_RESET usage. * rt/Makefile [CFLAGS-librt-cancellation.c]: Remove rule. * sysdeps/generic/sysdep-cancel.h (LIBC_CANCEL_ASYNC): Remove define. (LIBC_CANCEL_RESET): Likewise. (LIBC_CANCEL_HANDLED): Likewise. * sysdeps/unix/sysv/linux/clock_nanosleep.c (__clock_nanosleep): Likewise. * sysdeps/unix/sysv/linux/fcntl.c (__libc_fcntl): Likewise. * sysdeps/unix/sysv/linux/generic/wordsize-32/fcntl.c (__libc_fcntl): Likewise. * sysdeps/nptl/Makefile [$(subdir) = rt] (librt-sysdep_routines): Remove librt-cancellation object. [$(subdir) = rt] (librt-cancellation.c): Remove rule. * sysdeps/nptl/librt-cancellation.c: Remove file. * sysdeps/unix/sysv/linux/futex-internal.h (lll_futex_wait_cancel): Use lll_futex_timed_wait_cancel. (futex_reltimed_wait_cancelable): Likewise. (futex_abstimed_wait_cancelable)): Use lll_futex_timed_wait_bitset_cancel. * sysdeps/unix/sysv/linux/lowlevellock-futex.h (lll_futex_wait_cancel): New macro. (lll_futex_timed_wait_cancel): Likewise. (lll_futex_timed_wait_bitset_cancel): Likewise. * sysdeps/unix/sysdep.h (SYSCALL_CANCEL): New macro: cancelable syscall calls. (INTERNAL_SYSCALL_NCS_CALL): New macro. (__syscall_cancel): New prototype. * sysdeps/unix/sysv/linux/socketcall.h (SOCKETCALL): Use __SSC macros. (SOCKETCALL_CANCEL): Use SYSCALL_CANCEL macros. * sysdeps/generic/sysdep-cancel.h (LIBC_CANCEL_ASYNC): Remove define. (LIBC_CANCEL_RESET): Likewise. (LIBC_CANCEL_HANDLED): Likewise. * sysdeps/unix/sysv/linux/pthread_kill.c (__pthread_kill): Allow SIGCANCEL to be sent. * nptl/tst-cancel28.c: New file. * sysdeps/unix/sysv/linux/syscall_cancel.c: Likewise. * support/temp_file.c (create_temp_fifo): New function. * support/temp_file.h (create_temp_fifo): Likewise. Signed-off-by: Adhemerval Zanella --- ChangeLog | 85 ++++++++++++++++++++++ io/creat.c | 3 - io/ppoll.c | 2 - manual/llio.texi | 4 +- misc/pselect.c | 2 - nptl/Makefile | 8 +-- nptl/Versions | 3 + nptl/cancellation.c | 101 --------------------------- nptl/descr.h | 15 ++-- nptl/libc-cancellation.c | 47 ++++++++++++- nptl/lll_timedlock_wait.c | 2 +- nptl/lll_timedwait_tid.c | 3 +- nptl/nptl-init.c | 78 +++++++++++++-------- nptl/pthreadP.h | 73 +++++++------------ nptl/pthread_cancel.c | 68 ++++-------------- nptl/pthread_create.c | 7 +- nptl/pthread_exit.c | 9 ++- nptl/pthread_join.c | 10 ++- nptl/pthread_timedjoin.c | 9 +-- nptl/sem_wait.c | 8 +-- nptl/tst-cancel28.c | 94 +++++++++++++++++++++++++ rt/Makefile | 1 - support/temp_file.c | 23 ++++++ support/temp_file.h | 6 ++ sysdeps/generic/sigcontextinfo.h | 15 ++++ sysdeps/generic/sysdep-cancel.h | 3 - sysdeps/nptl/Makefile | 3 +- sysdeps/nptl/aio_misc.h | 13 +--- sysdeps/nptl/gai_misc.h | 13 +--- sysdeps/nptl/librt-cancellation.c | 24 ------- sysdeps/nptl/lowlevellock.h | 5 +- sysdeps/posix/open64.c | 12 +--- sysdeps/posix/pause.c | 2 - sysdeps/posix/sigpause.c | 3 - sysdeps/posix/sigwait.c | 9 +-- sysdeps/posix/waitid.c | 11 +-- sysdeps/sparc/sparc32/lowlevellock.c | 3 +- sysdeps/unix/sysdep.h | 96 +++++++++++++++++++++---- sysdeps/unix/sysv/linux/clock_nanosleep.c | 20 +----- sysdeps/unix/sysv/linux/creat.c | 2 - sysdeps/unix/sysv/linux/creat64.c | 2 - sysdeps/unix/sysv/linux/futex-internal.h | 18 ++--- sysdeps/unix/sysv/linux/lowlevellock-futex.h | 34 ++++++++- sysdeps/unix/sysv/linux/pthread_kill.c | 5 +- sysdeps/unix/sysv/linux/sigwait.c | 3 - sysdeps/unix/sysv/linux/sigwaitinfo.c | 3 - sysdeps/unix/sysv/linux/socketcall.h | 37 ++++++++-- sysdeps/unix/sysv/linux/syscall_cancel.c | 61 ++++++++++++++++ sysdeps/unix/sysv/linux/sysdep.h | 17 +++++ 49 files changed, 641 insertions(+), 434 deletions(-) delete mode 100644 nptl/cancellation.c create mode 100644 nptl/tst-cancel28.c delete mode 100644 sysdeps/nptl/librt-cancellation.c create mode 100644 sysdeps/unix/sysv/linux/syscall_cancel.c -- 2.7.4 diff --git a/io/creat.c b/io/creat.c index 4e095d6..031cc78 100644 --- a/io/creat.c +++ b/io/creat.c @@ -27,6 +27,3 @@ creat (const char *file, mode_t mode) { return __open (file, O_WRONLY|O_CREAT|O_TRUNC, mode); } - -/* __open handles cancellation. */ -LIBC_CANCEL_HANDLED (); diff --git a/io/ppoll.c b/io/ppoll.c index e2919a7..f8cb3a4 100644 --- a/io/ppoll.c +++ b/io/ppoll.c @@ -70,7 +70,5 @@ ppoll (struct pollfd *fds, nfds_t nfds, const struct timespec *timeout, } #ifndef ppoll -/* __poll handles cancellation. */ -LIBC_CANCEL_HANDLED (); libc_hidden_def (ppoll); #endif diff --git a/manual/llio.texi b/manual/llio.texi index 8b2f599..20f494f 100644 --- a/manual/llio.texi +++ b/manual/llio.texi @@ -2436,13 +2436,13 @@ aiocb64}, since the LFS transparently replaces the old interface. @c sigemptyset ok @c sigaddset ok @c setjmp ok -@c CANCEL_ASYNC -> pthread_enable_asynccancel ok +@c __pthread_setcanceltype ok @c do_cancel ok @c pthread_unwind ok @c Unwind_ForcedUnwind or longjmp ok [@ascuheap @acsmem?] @c lll_lock @asulock @aculock @c lll_unlock @asulock @aculock -@c CANCEL_RESET -> pthread_disable_asynccancel ok +@c __pthread_setcanceltype ok @c lll_futex_wait ok @c ->start_routine ok ----- @c call_tls_dtors @asulock @ascuheap @aculock @acsmem diff --git a/misc/pselect.c b/misc/pselect.c index 2292219..17492f0 100644 --- a/misc/pselect.c +++ b/misc/pselect.c @@ -73,6 +73,4 @@ __pselect (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, } #ifndef __pselect weak_alias (__pselect, pselect) -/* __select handles cancellation. */ -LIBC_CANCEL_HANDLED (); #endif diff --git a/nptl/Makefile b/nptl/Makefile index 36bf25f..a586f74 100644 --- a/nptl/Makefile +++ b/nptl/Makefile @@ -30,7 +30,7 @@ install-lib-ldscripts := libpthread.so routines = alloca_cutoff forward libc-lowlevellock libc-cancellation \ libc-cleanup libc_pthread_init libc_multiple_threads \ - register-atfork unregister-atfork + register-atfork unregister-atfork syscall_cancel shared-only-routines = forward # We need to provide certain routines for compatibility with existing @@ -116,7 +116,6 @@ libpthread-routines = nptl-init vars events version pt-interp \ cleanup cleanup_defer cleanup_compat \ cleanup_defer_compat unwind \ pt-longjmp pt-cleanup\ - cancellation \ lowlevellock \ lll_timedlock_wait lll_timedwait_tid \ pt-fork pt-vfork \ @@ -165,7 +164,6 @@ CFLAGS-pthread_setcanceltype.c = -fexceptions -fasynchronous-unwind-tables # These are internal functions which similar functionality as setcancelstate # and setcanceltype. -CFLAGS-cancellation.c = -fasynchronous-unwind-tables CFLAGS-libc-cancellation.c = -fasynchronous-unwind-tables # Calling pthread_exit() must cause the registered cancel handlers to @@ -224,6 +222,8 @@ CFLAGS-fsync.c = -fexceptions -fasynchronous-unwind-tables CFLAGS-pt-system.c = -fexceptions +CFLAGS-syscall_cancel.c = -fexceptions + LDLIBS-tst-once5 = -lstdc++ CFLAGS-tst-thread_local1.o = -std=gnu++11 LDLIBS-tst-thread_local1 = -lstdc++ @@ -272,7 +272,7 @@ tests = tst-attr1 tst-attr2 tst-attr3 tst-default-attr \ tst-cancel11 tst-cancel12 tst-cancel13 tst-cancel14 tst-cancel15 \ tst-cancel16 tst-cancel17 tst-cancel18 tst-cancel19 tst-cancel20 \ tst-cancel21 tst-cancel22 tst-cancel23 tst-cancel24 tst-cancel25 \ - tst-cancel26 tst-cancel27 \ + tst-cancel26 tst-cancel27 tst-cancel28 \ tst-cancel-self tst-cancel-self-cancelstate \ tst-cancel-self-canceltype tst-cancel-self-testcancel \ tst-cleanup0 tst-cleanup1 tst-cleanup2 tst-cleanup3 tst-cleanup4 \ diff --git a/nptl/Versions b/nptl/Versions index 0ae5def..734d47a 100644 --- a/nptl/Versions +++ b/nptl/Versions @@ -36,6 +36,9 @@ libc { __libc_pthread_init; __libc_current_sigrtmin_private; __libc_current_sigrtmax_private; __libc_allocate_rtsig_private; + __syscall_cancel; + __syscall_cancel_arch_start; + __syscall_cancel_arch_end; } } diff --git a/nptl/cancellation.c b/nptl/cancellation.c deleted file mode 100644 index f3a3805..0000000 --- a/nptl/cancellation.c +++ /dev/null @@ -1,101 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper , 2002. - - 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 - . */ - -#include -#include -#include "pthreadP.h" -#include - - -/* The next two functions are similar to pthread_setcanceltype() but - more specialized for the use in the cancelable functions like write(). - They do not need to check parameters etc. */ -int -attribute_hidden -__pthread_enable_asynccancel (void) -{ - struct pthread *self = THREAD_SELF; - int oldval = THREAD_GETMEM (self, cancelhandling); - - while (1) - { - int newval = oldval | CANCELTYPE_BITMASK; - - if (newval == oldval) - break; - - int curval = THREAD_ATOMIC_CMPXCHG_VAL (self, cancelhandling, newval, - oldval); - if (__glibc_likely (curval == oldval)) - { - if (CANCEL_ENABLED_AND_CANCELED_AND_ASYNCHRONOUS (newval)) - { - THREAD_SETMEM (self, result, PTHREAD_CANCELED); - __do_cancel (); - } - - break; - } - - /* Prepare the next round. */ - oldval = curval; - } - - return oldval; -} - - -void -attribute_hidden -__pthread_disable_asynccancel (int oldtype) -{ - /* If asynchronous cancellation was enabled before we do not have - anything to do. */ - if (oldtype & CANCELTYPE_BITMASK) - return; - - struct pthread *self = THREAD_SELF; - int newval; - - int oldval = THREAD_GETMEM (self, cancelhandling); - - while (1) - { - newval = oldval & ~CANCELTYPE_BITMASK; - - int curval = THREAD_ATOMIC_CMPXCHG_VAL (self, cancelhandling, newval, - oldval); - if (__glibc_likely (curval == oldval)) - break; - - /* Prepare the next round. */ - oldval = curval; - } - - /* We cannot return when we are being canceled. Upon return the - thread might be things which would have to be undone. The - following loop should loop until the cancellation signal is - delivered. */ - while (__builtin_expect ((newval & (CANCELING_BITMASK | CANCELED_BITMASK)) - == CANCELING_BITMASK, 0)) - { - futex_wait_simple ((unsigned int *) &self->cancelhandling, newval, - FUTEX_PRIVATE); - newval = THREAD_GETMEM (self, cancelhandling); - } -} diff --git a/nptl/descr.h b/nptl/descr.h index c83b17b..c3e1cc0 100644 --- a/nptl/descr.h +++ b/nptl/descr.h @@ -278,23 +278,20 @@ struct pthread /* Bit set if asynchronous cancellation mode is selected. */ #define CANCELTYPE_BIT 1 #define CANCELTYPE_BITMASK (0x01 << CANCELTYPE_BIT) - /* Bit set if canceling has been initiated. */ -#define CANCELING_BIT 2 -#define CANCELING_BITMASK (0x01 << CANCELING_BIT) - /* Bit set if canceled. */ -#define CANCELED_BIT 3 + /* Bit set if threads is canceled. */ +#define CANCELED_BIT 2 #define CANCELED_BITMASK (0x01 << CANCELED_BIT) /* Bit set if thread is exiting. */ -#define EXITING_BIT 4 +#define EXITING_BIT 3 #define EXITING_BITMASK (0x01 << EXITING_BIT) /* Bit set if thread terminated and TCB is freed. */ -#define TERMINATED_BIT 5 +#define TERMINATED_BIT 4 #define TERMINATED_BITMASK (0x01 << TERMINATED_BIT) /* Bit set if thread is supposed to change XID. */ -#define SETXID_BIT 6 +#define SETXID_BIT 5 #define SETXID_BITMASK (0x01 << SETXID_BIT) /* Mask for the rest. Helps the compiler to optimize. */ -#define CANCEL_RESTMASK 0xffffff80 +#define CANCEL_RESTMASK 0xffffffc0 #define CANCEL_ENABLED_AND_CANCELED(value) \ (((value) & (CANCELSTATE_BITMASK | CANCELED_BITMASK | EXITING_BITMASK \ diff --git a/nptl/libc-cancellation.c b/nptl/libc-cancellation.c index cb675ce..b013435 100644 --- a/nptl/libc-cancellation.c +++ b/nptl/libc-cancellation.c @@ -16,9 +16,50 @@ License along with the GNU C Library; if not, see . */ +#include +#include #include "pthreadP.h" +/* Cancellation function called by all cancellable syscalls. */ +long int +__syscall_cancel (__syscall_arg_t nr, __syscall_arg_t a1, + __syscall_arg_t a2, __syscall_arg_t a3, + __syscall_arg_t a4, __syscall_arg_t a5, + __syscall_arg_t a6) +{ + pthread_t self = (pthread_t) THREAD_SELF; + volatile struct pthread *pd = (volatile struct pthread *) self; + long int result; -#define __pthread_enable_asynccancel __libc_enable_asynccancel -#define __pthread_disable_asynccancel __libc_disable_asynccancel -#include + /* If cancellation is not enabled, call the syscall directly. */ + if (pd->cancelhandling & CANCELSTATE_BITMASK) + { + INTERNAL_SYSCALL_DECL (err); + result = INTERNAL_SYSCALL_NCS_CALL (nr, err, a1, a2, a3, a4, a5, a6); + if (INTERNAL_SYSCALL_ERROR_P (result, err)) + return -INTERNAL_SYSCALL_ERRNO (result, err); + return result; + } + + /* Call the arch-specific entry points that contains the globals markers + to be checked by SIGCANCEL handler. */ + result = __syscall_cancel_arch (&pd->cancelhandling, nr, a1, a2, a3, a4, a5, + a6); + + if ((result == -EINTR) + && (pd->cancelhandling & CANCELED_BITMASK) + && !(pd->cancelhandling & CANCELSTATE_BITMASK)) + __syscall_do_cancel (); + + return result; +} +libc_hidden_def (__syscall_cancel) + +/* Since __do_cancel is a always inline function, this creates a symbol the + arch-specific symbol can call to cancel the thread. */ +void +__cleanup_fct_attribute attribute_hidden __attribute ((noreturn)) +__syscall_do_cancel (void) +{ + __do_cancel (); +} diff --git a/nptl/lll_timedlock_wait.c b/nptl/lll_timedlock_wait.c index 604953c..630c028 100644 --- a/nptl/lll_timedlock_wait.c +++ b/nptl/lll_timedlock_wait.c @@ -52,7 +52,7 @@ __lll_timedlock_wait (int *futex, const struct timespec *abstime, int private) return ETIMEDOUT; /* If *futex == 2, wait until woken or timeout. */ - lll_futex_timed_wait (futex, 2, &rt, private); + lll_futex_timed_wait_cancel (futex, 2, &rt, private); } return 0; diff --git a/nptl/lll_timedwait_tid.c b/nptl/lll_timedwait_tid.c index e4c8de0..950d1aa 100644 --- a/nptl/lll_timedwait_tid.c +++ b/nptl/lll_timedwait_tid.c @@ -62,7 +62,8 @@ __lll_timedwait_tid (int *tidp, const struct timespec *abstime) The kernel up to version 3.16.3 does not use the private futex operations for futex wake-up when the clone terminates. */ - if (lll_futex_timed_wait (tidp, tid, &rt, LLL_SHARED) == -ETIMEDOUT) + if (lll_futex_timed_wait_cancel (tidp, tid, &rt, LLL_SHARED) + == -ETIMEDOUT) return ETIMEDOUT; } diff --git a/nptl/nptl-init.c b/nptl/nptl-init.c index 869e926..33ee7c4 100644 --- a/nptl/nptl-init.c +++ b/nptl/nptl-init.c @@ -38,6 +38,7 @@ #include #include #include +#include #ifndef TLS_MULTIPLE_THREADS_IN_TCB /* Pointer to the corresponding variable in libc. */ @@ -176,49 +177,65 @@ __nptl_set_robust (struct pthread *self) #ifdef SIGCANCEL + +extern const char __syscall_cancel_arch_start[1]; +extern const char __syscall_cancel_arch_end[1]; + +/* Workaround for architectures which either does not define the mask + as a sigset (alpha) or does not call sa_sigaction with a ucontext_t + as third argument (sparc). */ +# ifndef UCONTEXT_SIGMASK +# define UCONTEXT_SIGMASK(cxt) \ + &(((ucontext_t*) (cxt))->uc_sigmask) +# endif + /* For asynchronous cancellation we use a signal. This is the handler. */ static void sigcancel_handler (int sig, siginfo_t *si, void *ctx) { + INTERNAL_SYSCALL_DECL (err); + pid_t pid = INTERNAL_SYSCALL_CALL (getpid, err); + /* Safety check. It would be possible to call this function for other signals and send a signal from another process. This is not correct and might even be a security problem. Try to catch as many incorrect invocations as possible. */ if (sig != SIGCANCEL - || si->si_pid != __getpid() + || si->si_pid != pid || si->si_code != SI_TKILL) return; struct pthread *self = THREAD_SELF; + volatile struct pthread *pd = (volatile struct pthread *) self; - int oldval = THREAD_GETMEM (self, cancelhandling); - while (1) + if (((pd->cancelhandling & (CANCELSTATE_BITMASK)) != 0) + || ((pd->cancelhandling & CANCELED_BITMASK) == 0)) + return; + + /* Add SIGCANCEL on ignored sigmask to avoid the handler to be called + again. */ + sigset_t *set = UCONTEXT_SIGMASK (ctx); + __sigaddset (set, SIGCANCEL); + + /* Check if asynchronous cancellation mode is set and if interrupted + instruction pointer falls within the cancellable syscall bridge. For + interruptable syscalls that might generate external side-effects (partial + reads or writes, for instance), the kernel will set the IP to after + '__syscall_cancel_arch_end', thus disabling the cancellation and allowing + the process to handle such conditions. */ + uintptr_t pc = ucontext_get_pc (ctx); + if (pd->cancelhandling & CANCELTYPE_BITMASK + || (pc >= (uintptr_t) __syscall_cancel_arch_start + && pc < (uintptr_t) __syscall_cancel_arch_end)) { - /* We are canceled now. When canceled by another thread this flag - is already set but if the signal is directly send (internally or - from another process) is has to be done here. */ - int newval = oldval | CANCELING_BITMASK | CANCELED_BITMASK; - - if (oldval == newval || (oldval & EXITING_BITMASK) != 0) - /* Already canceled or exiting. */ - break; - - int curval = THREAD_ATOMIC_CMPXCHG_VAL (self, cancelhandling, newval, - oldval); - if (curval == oldval) - { - /* Set the return value. */ - THREAD_SETMEM (self, result, PTHREAD_CANCELED); - - /* Make sure asynchronous cancellation is still enabled. */ - if ((newval & CANCELTYPE_BITMASK) != 0) - /* Run the registered destructors and terminate the thread. */ - __do_cancel (); - - break; - } - - oldval = curval; + THREAD_ATOMIC_BIT_SET (self, cancelhandling, EXITING_BIT); + THREAD_SETMEM (self, result, PTHREAD_CANCELED); + + INTERNAL_SYSCALL_CALL (rt_sigprocmask, err, SIG_SETMASK, set, NULL, + _NSIG / 8); + + __do_cancel (); + return; } } #endif @@ -373,7 +390,10 @@ __pthread_initialize_minimal_internal (void) cannot install the handler we do not abort. Maybe we should, but it is only asynchronous cancellation which is affected. */ sa.sa_sigaction = sigcancel_handler; - sa.sa_flags = SA_SIGINFO; + /* The signal handle should be non-interruptible to avoid the risk of + spurious EINTR caused by SIGCANCEL sent to process or if pthread_cancel + is called while cancellation is disabled in the target thread. */ + sa.sa_flags = SA_SIGINFO | SA_RESTART; (void) __libc_sigaction (SIGCANCEL, &sa, NULL); # endif diff --git a/nptl/pthreadP.h b/nptl/pthreadP.h index 713000e..35d99f6 100644 --- a/nptl/pthreadP.h +++ b/nptl/pthreadP.h @@ -291,51 +291,37 @@ __do_cancel (void) { struct pthread *self = THREAD_SELF; - /* Make sure we get no more cancellations. */ - THREAD_ATOMIC_BIT_SET (self, cancelhandling, EXITING_BIT); + /* Make sure we get no more cancellations by clearing the cancel + state. */ + int oldval = THREAD_GETMEM (self, cancelhandling); + while (1) + { + int newval = (oldval | CANCELSTATE_BITMASK); + newval &= ~(CANCELTYPE_BITMASK); + if (oldval == newval) + break; + + int curval = THREAD_ATOMIC_CMPXCHG_VAL (self, cancelhandling, newval, + oldval); + if (__glibc_likely (curval == oldval)) + break; + oldval = curval; + } + + THREAD_SETMEM (self, result, PTHREAD_CANCELED); __pthread_unwind ((__pthread_unwind_buf_t *) THREAD_GETMEM (self, cleanup_jmp_buf)); } -/* Set cancellation mode to asynchronous. */ -#define CANCEL_ASYNC() \ - __pthread_enable_asynccancel () -/* Reset to previous cancellation mode. */ -#define CANCEL_RESET(oldtype) \ - __pthread_disable_asynccancel (oldtype) - -#if IS_IN (libc) -/* Same as CANCEL_ASYNC, but for use in libc.so. */ -# define LIBC_CANCEL_ASYNC() \ - __libc_enable_asynccancel () -/* Same as CANCEL_RESET, but for use in libc.so. */ -# define LIBC_CANCEL_RESET(oldtype) \ - __libc_disable_asynccancel (oldtype) -# define LIBC_CANCEL_HANDLED() \ - __asm (".globl " __SYMBOL_PREFIX "__libc_enable_asynccancel"); \ - __asm (".globl " __SYMBOL_PREFIX "__libc_disable_asynccancel") -#elif IS_IN (libpthread) -# define LIBC_CANCEL_ASYNC() CANCEL_ASYNC () -# define LIBC_CANCEL_RESET(val) CANCEL_RESET (val) -# define LIBC_CANCEL_HANDLED() \ - __asm (".globl " __SYMBOL_PREFIX "__pthread_enable_asynccancel"); \ - __asm (".globl " __SYMBOL_PREFIX "__pthread_disable_asynccancel") -#elif IS_IN (librt) -# define LIBC_CANCEL_ASYNC() \ - __librt_enable_asynccancel () -# define LIBC_CANCEL_RESET(val) \ - __librt_disable_asynccancel (val) -# define LIBC_CANCEL_HANDLED() \ - __asm (".globl " __SYMBOL_PREFIX "__librt_enable_asynccancel"); \ - __asm (".globl " __SYMBOL_PREFIX "__librt_disable_asynccancel") -#else -# define LIBC_CANCEL_ASYNC() 0 /* Just a dummy value. */ -# define LIBC_CANCEL_RESET(val) ((void)(val)) /* Nothing, but evaluate it. */ -# define LIBC_CANCEL_HANDLED() /* Nothing. */ -#endif +extern long int __syscall_cancel_arch (volatile int *, __syscall_arg_t nr, + __syscall_arg_t arg1, __syscall_arg_t arg2, __syscall_arg_t arg3, + __syscall_arg_t arg4, __syscall_arg_t arg5, __syscall_arg_t arg6); +libc_hidden_proto (__syscall_cancel_arch); +extern void __syscall_do_cancel (void) + __cleanup_fct_attribute attribute_hidden __attribute ((__noreturn__)); /* Internal prototypes. */ @@ -503,8 +489,6 @@ extern int __pthread_kill (pthread_t threadid, int signo); extern void __pthread_exit (void *value) __attribute__ ((__noreturn__)); extern int __pthread_join (pthread_t threadid, void **thread_return); extern int __pthread_setcanceltype (int type, int *oldtype); -extern int __pthread_enable_asynccancel (void) attribute_hidden; -extern void __pthread_disable_asynccancel (int oldtype) attribute_hidden; extern void __pthread_testcancel (void); #if IS_IN (libpthread) @@ -540,15 +524,6 @@ extern int __pthread_cond_wait_2_0 (pthread_cond_2_0_t *cond, extern int __pthread_getaffinity_np (pthread_t th, size_t cpusetsize, cpu_set_t *cpuset); -/* The two functions are in libc.so and not exported. */ -extern int __libc_enable_asynccancel (void) attribute_hidden; -extern void __libc_disable_asynccancel (int oldtype) attribute_hidden; - - -/* The two functions are in librt.so and not exported. */ -extern int __librt_enable_asynccancel (void) attribute_hidden; -extern void __librt_disable_asynccancel (int oldtype) attribute_hidden; - #if IS_IN (libpthread) /* Special versions which use non-exported functions. */ extern void __pthread_cleanup_push (struct _pthread_cleanup_buffer *buffer, diff --git a/nptl/pthread_cancel.c b/nptl/pthread_cancel.c index 742dfe6..04d9b89 100644 --- a/nptl/pthread_cancel.c +++ b/nptl/pthread_cancel.c @@ -37,67 +37,23 @@ __pthread_cancel (pthread_t th) #ifdef SHARED pthread_cancel_init (); #endif - int result = 0; - int oldval; - int newval; - do - { - again: - oldval = pd->cancelhandling; - newval = oldval | CANCELING_BITMASK | CANCELED_BITMASK; - /* Avoid doing unnecessary work. The atomic operation can - potentially be expensive if the bug has to be locked and - remote cache lines have to be invalidated. */ - if (oldval == newval) - break; + THREAD_ATOMIC_BIT_SET (pd, cancelhandling, CANCELED_BIT); - /* If the cancellation is handled asynchronously just send a - signal. We avoid this if possible since it's more - expensive. */ - if (CANCEL_ENABLED_AND_CANCELED_AND_ASYNCHRONOUS (newval)) - { - /* Mark the cancellation as "in progress". */ - if (atomic_compare_and_exchange_bool_acq (&pd->cancelhandling, - oldval | CANCELING_BITMASK, - oldval)) - goto again; - -#ifdef SIGCANCEL - /* The cancellation handler will take care of marking the - thread as canceled. */ - pid_t pid = __getpid (); - - INTERNAL_SYSCALL_DECL (err); - int val = INTERNAL_SYSCALL_CALL (tgkill, err, pid, pd->tid, - SIGCANCEL); - if (INTERNAL_SYSCALL_ERROR_P (val, err)) - result = INTERNAL_SYSCALL_ERRNO (val, err); -#else - /* It should be impossible to get here at all, since - pthread_setcanceltype should never have allowed - PTHREAD_CANCEL_ASYNCHRONOUS to be set. */ - abort (); -#endif - - break; - } - - /* A single-threaded process should be able to kill itself, since - there is nothing in the POSIX specification that says that it - cannot. So we set multiple_threads to true so that cancellation - points get executed. */ - THREAD_SETMEM (THREAD_SELF, header.multiple_threads, 1); + /* A single-threaded process should be able to kill itself, since there is + nothing in the POSIX specification that says that it cannot. So we set + multiple_threads to true so that cancellation points get executed. */ + THREAD_SETMEM (THREAD_SELF, header.multiple_threads, 1); #ifndef TLS_MULTIPLE_THREADS_IN_TCB - __pthread_multiple_threads = *__libc_multiple_threads_ptr = 1; + __pthread_multiple_threads = *__libc_multiple_threads_ptr = 1; #endif - } - /* Mark the thread as canceled. This has to be done - atomically since other bits could be modified as well. */ - while (atomic_compare_and_exchange_bool_acq (&pd->cancelhandling, newval, - oldval)); - return result; + /* Avoid signaling when thread attempts cancel itself (pthread_kill + is expensive). */ + if (pd == THREAD_SELF && !(pd->cancelhandling & CANCELTYPE_BITMASK)) + return 0; + + return __pthread_kill (th, SIGCANCEL); } weak_alias (__pthread_cancel, pthread_cancel) diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c index 51ae60d..64526e2 100644 --- a/nptl/pthread_create.c +++ b/nptl/pthread_create.c @@ -412,7 +412,7 @@ START_THREAD_DEFN /* If the parent was running cancellation handlers while creating the thread the new thread inherited the signal mask. Reset the cancellation signal mask. */ - if (__glibc_unlikely (pd->parent_cancelhandling & CANCELING_BITMASK)) + if (__glibc_unlikely (pd->parent_cancelhandling & CANCELED_BITMASK)) { INTERNAL_SYSCALL_DECL (err); sigset_t mask; @@ -444,7 +444,8 @@ START_THREAD_DEFN have ownership (see CONCURRENCY NOTES above). */ if (__glibc_unlikely (pd->stopped_start)) { - int oldtype = CANCEL_ASYNC (); + int ct; + __pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, &ct); /* Get the lock the parent locked to force synchronization. */ lll_lock (pd->lock, LLL_PRIVATE); @@ -454,7 +455,7 @@ START_THREAD_DEFN /* And give it up right away. */ lll_unlock (pd->lock, LLL_PRIVATE); - CANCEL_RESET (oldtype); + __pthread_setcanceltype (ct, NULL); } LIBC_PROBE (pthread_start, 3, (pthread_t) pd, pd->start_routine, pd->arg); diff --git a/nptl/pthread_exit.c b/nptl/pthread_exit.c index 7209769..82ef4f8 100644 --- a/nptl/pthread_exit.c +++ b/nptl/pthread_exit.c @@ -23,9 +23,14 @@ void __pthread_exit (void *value) { - THREAD_SETMEM (THREAD_SELF, result, value); + struct pthread *self = THREAD_SELF; - __do_cancel (); + THREAD_SETMEM (self, result, value); + + THREAD_ATOMIC_BIT_SET (self, cancelhandling, EXITING_BIT); + + __pthread_unwind ((__pthread_unwind_buf_t *) + THREAD_GETMEM (self, cleanup_jmp_buf)); } weak_alias (__pthread_exit, pthread_exit) diff --git a/nptl/pthread_join.c b/nptl/pthread_join.c index afc8c37..8255a7d 100644 --- a/nptl/pthread_join.c +++ b/nptl/pthread_join.c @@ -52,7 +52,7 @@ __pthread_join (pthread_t threadid, void **thread_return) return EINVAL; struct pthread *self = THREAD_SELF; - int result = 0; + int result = 0, ct; LIBC_PROBE (pthread_join, 1, threadid); @@ -62,12 +62,12 @@ __pthread_join (pthread_t threadid, void **thread_return) pthread_cleanup_push (cleanup, &pd->joinid); /* Switch to asynchronous cancellation. */ - int oldtype = CANCEL_ASYNC (); + __pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, &ct); if ((pd == self || (self->joinid == pd && (pd->cancelhandling - & (CANCELING_BITMASK | CANCELED_BITMASK | EXITING_BITMASK + & (CANCELED_BITMASK | EXITING_BITMASK | TERMINATED_BITMASK)) == 0)) && !CANCEL_ENABLED_AND_CANCELED (self->cancelhandling)) /* This is a deadlock situation. The threads are waiting for each @@ -89,9 +89,7 @@ __pthread_join (pthread_t threadid, void **thread_return) /* Wait for the child. */ lll_wait_tid (pd->tid); - - /* Restore cancellation mode. */ - CANCEL_RESET (oldtype); + __pthread_setcanceltype (ct, NULL); /* Remove the handler. */ pthread_cleanup_pop (0); diff --git a/nptl/pthread_timedjoin.c b/nptl/pthread_timedjoin.c index 567c171..75a9cfe 100644 --- a/nptl/pthread_timedjoin.c +++ b/nptl/pthread_timedjoin.c @@ -35,7 +35,7 @@ pthread_timedjoin_np (pthread_t threadid, void **thread_return, { struct pthread *self; struct pthread *pd = (struct pthread *) threadid; - int result; + int result, ct; /* Make sure the descriptor is valid. */ if (INVALID_NOT_TERMINATED_TD_P (pd)) @@ -72,15 +72,12 @@ pthread_timedjoin_np (pthread_t threadid, void **thread_return, pthread_cleanup_push (cleanup, &pd->joinid); /* Switch to asynchronous cancellation. */ - int oldtype = CANCEL_ASYNC (); - + __pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, &ct); /* Wait for the child. */ result = lll_timedwait_tid (pd->tid, abstime); - - /* Restore cancellation mode. */ - CANCEL_RESET (oldtype); + __pthread_setcanceltype (ct, NULL); /* Remove the handler. */ pthread_cleanup_pop (0); diff --git a/nptl/sem_wait.c b/nptl/sem_wait.c index 625bf08..b6f4312 100644 --- a/nptl/sem_wait.c +++ b/nptl/sem_wait.c @@ -56,14 +56,8 @@ __old_sem_wait (sem_t *sem) if (atomic_decrement_if_positive (futex) > 0) return 0; - /* Enable asynchronous cancellation. Required by the standard. */ - int oldtype = __pthread_enable_asynccancel (); - /* Always assume the semaphore is shared. */ - err = lll_futex_wait (futex, 0, LLL_SHARED); - - /* Disable asynchronous cancellation. */ - __pthread_disable_asynccancel (oldtype); + err = lll_futex_wait_cancel (futex, 0, LLL_SHARED); } while (err == 0 || err == -EWOULDBLOCK); diff --git a/nptl/tst-cancel28.c b/nptl/tst-cancel28.c new file mode 100644 index 0000000..e086e9b --- /dev/null +++ b/nptl/tst-cancel28.c @@ -0,0 +1,94 @@ +/* Check side-effect act for cancellable syscalls (BZ #12683). + Copyright (C) 2017 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 + . */ + +/* This testcase checks if there is resource leakage if the syscall has + returned from kernelspace, but before userspace saves the return + value. The 'leaker' thread should be able to close the file descriptor + if the resource is already allocated, meaning that if the cancellation + signal arrives *after* the open syscal return from kernel, the + side-effect should be visible to application. */ + +#include +#include +#include +#include +#include + +#include +#include +#include + +static void * +writeopener (void *arg) +{ + int fd; + for (;;) + { + fd = open (arg, O_WRONLY); + close (fd); + } + return NULL; +} + +static void * +leaker (void *arg) +{ + int fd = open (arg, O_RDONLY); + pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, 0); + close (fd); + return NULL; +} + + +#define ITER_COUNT 1000 +#define MAX_FILENO 1024 + +static int +do_test (void) +{ + struct stat st; + int i; + + char *name = NULL; + support_create_temp_fifo ("tst-cancel28", &name); + + srand (1); + + xpthread_create (NULL, writeopener, name); + for (i = 0; i < ITER_COUNT; i++) + { + pthread_t td = xpthread_create (NULL, leaker, name); + struct timespec ts = + { .tv_nsec = rand () % 100000, .tv_sec = 0 }; + nanosleep (&ts, NULL); + /* Ignore pthread_cancel result because it might be the + case when pthread_cancel is called when thread is already + exited. */ + pthread_cancel (td); + xpthread_join (td); + } + + for (i = STDERR_FILENO+1; i < MAX_FILENO; i++) + if (!fstat (i, &st)) + FAIL_EXIT1 ("leaked fd %d", i); + + return 0; +} + +#define TIMEOUT 10 +#include diff --git a/rt/Makefile b/rt/Makefile index 9740dc2..232e543 100644 --- a/rt/Makefile +++ b/rt/Makefile @@ -64,7 +64,6 @@ CFLAGS-aio_suspend.c = -fexceptions CFLAGS-mq_timedreceive.c = -fexceptions -fasynchronous-unwind-tables CFLAGS-mq_timedsend.c = -fexceptions -fasynchronous-unwind-tables CFLAGS-clock_nanosleep.c = -fexceptions -fasynchronous-unwind-tables -CFLAGS-librt-cancellation.c = -fasynchronous-unwind-tables LDFLAGS-rt.so = -Wl,--enable-new-dtags,-z,nodelete diff --git a/support/temp_file.c b/support/temp_file.c index 547263a..dad13dc 100644 --- a/support/temp_file.c +++ b/support/temp_file.c @@ -86,6 +86,29 @@ create_temp_file (const char *base, char **filename) return fd; } +int +support_create_temp_fifo (const char *base, char **fifoname) +{ + char *fname = xasprintf ("%s/%sXXXXXX", test_dir, base); + mktemp (fname); + + int fd = mkfifo (fname, 0600); + if (fd == -1) + { + printf ("cannot open temporary fifo '%s': %m\n", fname); + free (fname); + return -1; + } + + add_temp_file (fname); + if (fifoname != NULL) + *fifoname = fname; + else + free (fname); + + return fd; +} + char * support_create_temp_directory (const char *base) { diff --git a/support/temp_file.h b/support/temp_file.h index 3b8563e..66bfd1c 100644 --- a/support/temp_file.h +++ b/support/temp_file.h @@ -32,6 +32,12 @@ void add_temp_file (const char *name); *FILENAME. */ int create_temp_file (const char *base, char **filename); +/* Create a temporary fifo. Return the opened file descriptor on + success, or -1 on failure. Write the file name to *FILENAME if + FILENAME is not NULL. In this case, the caller is expected to free + *FILENAME. */ +int support_create_temp_fifo (const char *name, char **fifoname); + /* Create a temporary directory and schedule it for deletion. BASE is used as a prefix for the unique directory name, which the function returns. The caller should free this string. */ diff --git a/sysdeps/generic/sigcontextinfo.h b/sysdeps/generic/sigcontextinfo.h index d25a787..2ca20e9 100644 --- a/sysdeps/generic/sigcontextinfo.h +++ b/sysdeps/generic/sigcontextinfo.h @@ -16,6 +16,11 @@ License along with the GNU C Library; if not, see . */ +#ifndef _SIGCONTEXTINFO_H +#define _SIGCONTEXTINFO_H + +#include + /* In general we cannot provide any information. */ #define SIGCONTEXT struct sigcontext * #define SIGCONTEXT_EXTRA_ARGS @@ -24,3 +29,13 @@ #define GET_STACK(ctx) ((void *) 0) #define CALL_SIGHANDLER(handler, signo, ctx) \ (handler)((signo), SIGCONTEXT_EXTRA_ARGS (ctx)) + +/* Obtain the Program Counter from third argument in signal handler set + with SA_SIGINFO. */ +static inline uintptr_t +ucontext_get_pc (void *ctx) +{ + return 0; +} + +#endif diff --git a/sysdeps/generic/sysdep-cancel.h b/sysdeps/generic/sysdep-cancel.h index ba6a1e0..5c84b44 100644 --- a/sysdeps/generic/sysdep-cancel.h +++ b/sysdeps/generic/sysdep-cancel.h @@ -3,6 +3,3 @@ /* No multi-thread handling enabled. */ #define SINGLE_THREAD_P (1) #define RTLD_SINGLE_THREAD_P (1) -#define LIBC_CANCEL_ASYNC() 0 /* Just a dummy value. */ -#define LIBC_CANCEL_RESET(val) ((void)(val)) /* Nothing, but evaluate it. */ -#define LIBC_CANCEL_HANDLED() /* Nothing. */ diff --git a/sysdeps/nptl/Makefile b/sysdeps/nptl/Makefile index 4f4f4ff..708cab5 100644 --- a/sysdeps/nptl/Makefile +++ b/sysdeps/nptl/Makefile @@ -21,8 +21,7 @@ libpthread-sysdep_routines += errno-loc endif ifeq ($(subdir),rt) -librt-sysdep_routines += timer_routines librt-cancellation -CFLAGS-librt-cancellation.c += -fexceptions -fasynchronous-unwind-tables +librt-sysdep_routines += timer_routines tests += tst-mqueue8x CFLAGS-tst-mqueue8x.c += -fexceptions diff --git a/sysdeps/nptl/aio_misc.h b/sysdeps/nptl/aio_misc.h index 47b1a36..817a75c 100644 --- a/sysdeps/nptl/aio_misc.h +++ b/sysdeps/nptl/aio_misc.h @@ -34,22 +34,18 @@ #define AIO_MISC_WAIT(result, futex, timeout, cancel) \ do { \ - volatile unsigned int *futexaddr = &futex; \ + unsigned int *futexaddr = (unsigned int *)&futex; \ unsigned int oldval = futex; \ \ if (oldval != 0) \ { \ pthread_mutex_unlock (&__aio_requests_mutex); \ \ - int oldtype; \ - if (cancel) \ - oldtype = LIBC_CANCEL_ASYNC (); \ - \ int status; \ do \ { \ - status = futex_reltimed_wait ((unsigned int *) futexaddr, oldval, \ - timeout, FUTEX_PRIVATE); \ + status = futex_reltimed_wait_cancelable (futexaddr, oldval, \ + timeout, FUTEX_PRIVATE); \ if (status != EAGAIN) \ break; \ \ @@ -57,9 +53,6 @@ } \ while (oldval != 0); \ \ - if (cancel) \ - LIBC_CANCEL_RESET (oldtype); \ - \ if (status == EINTR) \ result = EINTR; \ else if (status == ETIMEDOUT) \ diff --git a/sysdeps/nptl/gai_misc.h b/sysdeps/nptl/gai_misc.h index 8b2a2c1..df6b434 100644 --- a/sysdeps/nptl/gai_misc.h +++ b/sysdeps/nptl/gai_misc.h @@ -35,22 +35,18 @@ #define GAI_MISC_WAIT(result, futex, timeout, cancel) \ do { \ - volatile unsigned int *futexaddr = &futex; \ + unsigned int *futexaddr = (unsigned int *)&futex; \ unsigned int oldval = futex; \ \ if (oldval != 0) \ { \ pthread_mutex_unlock (&__gai_requests_mutex); \ \ - int oldtype; \ - if (cancel) \ - oldtype = LIBC_CANCEL_ASYNC (); \ - \ int status; \ do \ { \ - status = futex_reltimed_wait ((unsigned int *) futexaddr, oldval, \ - timeout, FUTEX_PRIVATE); \ + status = futex_reltimed_wait_cancelable (futexaddr, oldval, \ + timeout, FUTEX_PRIVATE); \ if (status != EAGAIN) \ break; \ \ @@ -58,9 +54,6 @@ } \ while (oldval != 0); \ \ - if (cancel) \ - LIBC_CANCEL_RESET (oldtype); \ - \ if (status == EINTR) \ result = EINTR; \ else if (status == ETIMEDOUT) \ diff --git a/sysdeps/nptl/librt-cancellation.c b/sysdeps/nptl/librt-cancellation.c deleted file mode 100644 index 1932242..0000000 --- a/sysdeps/nptl/librt-cancellation.c +++ /dev/null @@ -1,24 +0,0 @@ -/* Copyright (C) 2002-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper , 2002. - - 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 - . */ - -#include - - -#define __pthread_enable_asynccancel __librt_enable_asynccancel -#define __pthread_disable_asynccancel __librt_disable_asynccancel -#include diff --git a/sysdeps/nptl/lowlevellock.h b/sysdeps/nptl/lowlevellock.h index 54e3c28..0d806bc 100644 --- a/sysdeps/nptl/lowlevellock.h +++ b/sysdeps/nptl/lowlevellock.h @@ -180,12 +180,13 @@ extern int __lll_timedlock_wait (int *futex, const struct timespec *, wake-up when the clone terminates. The memory location contains the thread ID while the clone is running and is reset to zero by the kernel afterwards. The kernel up to version 3.16.3 does not use the private futex - operations for futex wake-up when the clone terminates. */ + operations for futex wake-up when the clone terminates. + Both lll_wait_tid and lll_timewait_tid acts as cancellation points. */ #define lll_wait_tid(tid) \ do { \ __typeof (tid) __tid; \ while ((__tid = (tid)) != 0) \ - lll_futex_wait (&(tid), __tid, LLL_SHARED);\ + lll_futex_wait_cancel (&(tid), __tid, LLL_SHARED);\ } while (0) extern int __lll_timedwait_tid (int *, const struct timespec *) diff --git a/sysdeps/posix/open64.c b/sysdeps/posix/open64.c index dd1b4d6..8e6f2b9 100644 --- a/sysdeps/posix/open64.c +++ b/sysdeps/posix/open64.c @@ -34,16 +34,8 @@ __libc_open64 (const char *file, int oflag, ...) va_end (arg); } - if (SINGLE_THREAD_P) - return __libc_open (file, oflag | O_LARGEFILE, mode); - - int oldtype = LIBC_CANCEL_ASYNC (); - - int result = __libc_open (file, oflag | O_LARGEFILE, mode); - - LIBC_CANCEL_RESET (oldtype); - - return result; + /* __libc_open should be a cancellation point. */ + return __libc_open (file, oflag | O_LARGEFILE, mode); } weak_alias (__libc_open64, __open64) libc_hidden_weak (__open64) diff --git a/sysdeps/posix/pause.c b/sysdeps/posix/pause.c index 7c17f49..f875939 100644 --- a/sysdeps/posix/pause.c +++ b/sysdeps/posix/pause.c @@ -38,5 +38,3 @@ __libc_pause (void) return __sigsuspend (&set); } weak_alias (__libc_pause, pause) - -LIBC_CANCEL_HANDLED (); /* sigsuspend handles our cancellation. */ diff --git a/sysdeps/posix/sigpause.c b/sysdeps/posix/sigpause.c index a61e056..d58e3e8 100644 --- a/sysdeps/posix/sigpause.c +++ b/sysdeps/posix/sigpause.c @@ -70,6 +70,3 @@ __xpg_sigpause (int sig) return __sigpause (sig, 1); } strong_alias (__xpg_sigpause, __libc___xpg_sigpause) - -/* __sigsuspend handles cancellation. */ -LIBC_CANCEL_HANDLED (); diff --git a/sysdeps/posix/sigwait.c b/sysdeps/posix/sigwait.c index d807dbf..f86cce2 100644 --- a/sysdeps/posix/sigwait.c +++ b/sysdeps/posix/sigwait.c @@ -88,13 +88,8 @@ __sigwait (const sigset_t *set, int *sig) if (SINGLE_THREAD_P) return do_sigwait (set, sig); - int oldtype = LIBC_CANCEL_ASYNC (); - - int result = do_sigwait (set, sig); - - LIBC_CANCEL_RESET (oldtype); - - return result; + /* do_sigwait should be a cancellation point. */ + return do_sigwait (set, sig); } libc_hidden_def (__sigwait) weak_alias (__sigwait, sigwait) diff --git a/sysdeps/posix/waitid.c b/sysdeps/posix/waitid.c index 2c23cdb..9925700 100644 --- a/sysdeps/posix/waitid.c +++ b/sysdeps/posix/waitid.c @@ -151,16 +151,7 @@ OUR_WAITID (idtype_t idtype, id_t id, siginfo_t *infop, int options) int __waitid (idtype_t idtype, id_t id, siginfo_t *infop, int options) { - if (SINGLE_THREAD_P) - return do_waitid (idtype, id, infop, options); - - int oldtype = LIBC_CANCEL_ASYNC (); - - int result = do_waitid (idtype, id, infop, options); - - LIBC_CANCEL_RESET (oldtype); - - return result; + return do_waitid (idtype, id, infop, options); } weak_alias (__waitid, waitid) strong_alias (__waitid, __libc_waitid) diff --git a/sysdeps/sparc/sparc32/lowlevellock.c b/sysdeps/sparc/sparc32/lowlevellock.c index e502bf6..af3b227 100644 --- a/sysdeps/sparc/sparc32/lowlevellock.c +++ b/sysdeps/sparc/sparc32/lowlevellock.c @@ -122,7 +122,8 @@ __lll_timedwait_tid (int *tidp, const struct timespec *abstime) /* Wait until thread terminates. The kernel so far does not use the private futex operations for this. */ - if (lll_futex_timed_wait (tidp, tid, &rt, LLL_SHARED) == -ETIMEDOUT) + if (lll_futex_timed_wait_cancel (tidp, tid, &rt, LLL_SHARED) + == -ETIMEDOUT) return ETIMEDOUT; } diff --git a/sysdeps/unix/sysdep.h b/sysdeps/unix/sysdep.h index c308547..10669ae 100644 --- a/sysdeps/unix/sysdep.h +++ b/sysdeps/unix/sysdep.h @@ -24,6 +24,9 @@ #define SYSCALL__(name, args) PSEUDO (__##name, name, args) #define SYSCALL(name, args) PSEUDO (name, name, args) +#ifndef __ASSEMBLER__ +# include + #define __SYSCALL_CONCAT_X(a,b) a##b #define __SYSCALL_CONCAT(a,b) __SYSCALL_CONCAT_X (a, b) @@ -57,6 +60,29 @@ #define INTERNAL_SYSCALL_CALL(...) \ __INTERNAL_SYSCALL_DISP (__INTERNAL_SYSCALL, __VA_ARGS__) +#define __INTERNAL_SYSCALL_NCS0(name, err) \ + INTERNAL_SYSCALL_NCS (name, err, 0) +#define __INTERNAL_SYSCALL_NCS1(name, err, a1) \ + INTERNAL_SYSCALL_NCS (name, err, 1, a1) +#define __INTERNAL_SYSCALL_NCS2(name, err, a1, a2) \ + INTERNAL_SYSCALL_NCS (name, err, 2, a1, a2) +#define __INTERNAL_SYSCALL_NCS3(name, err, a1, a2, a3) \ + INTERNAL_SYSCALL_NCS (name, err, 3, a1, a2, a3) +#define __INTERNAL_SYSCALL_NCS4(name, err, a1, a2, a3, a4) \ + INTERNAL_SYSCALL_NCS (name, err, 4, a1, a2, a3, a4) +#define __INTERNAL_SYSCALL_NCS5(name, err, a1, a2, a3, a4, a5) \ + INTERNAL_SYSCALL_NCS (name, err, 5, a1, a2, a3, a4, a5) +#define __INTERNAL_SYSCALL_NCS6(name, err, a1, a2, a3, a4, a5, a6) \ + INTERNAL_SYSCALL_NCS (name, err, 6, a1, a2, a3, a4, a5, a6) +#define __INTERNAL_SYSCALL_NCS7(name, err, a1, a2, a3, a4, a5, a6, a7) \ + INTERNAL_SYSCALL_NCS (name, err, 7, a1, a2, a3, a4, a5, a6, a7) + +/* Issue a syscall defined by syscall number plus any other argument required. + It is similar to INTERNAL_SYSCALL_NCS macro, but without the need to pass + the expected argument number as third parameter. */ +#define INTERNAL_SYSCALL_NCS_CALL(...) \ + __INTERNAL_SYSCALL_DISP (__INTERNAL_SYSCALL_NCS, __VA_ARGS__) + #define __INLINE_SYSCALL0(name) \ INLINE_SYSCALL (name, 0) #define __INLINE_SYSCALL1(name, a1) \ @@ -88,19 +114,65 @@ #define INLINE_SYSCALL_CALL(...) \ __INLINE_SYSCALL_DISP (__INLINE_SYSCALL, __VA_ARGS__) -#define SYSCALL_CANCEL(...) \ - ({ \ - long int sc_ret; \ - if (SINGLE_THREAD_P) \ - sc_ret = INLINE_SYSCALL_CALL (__VA_ARGS__); \ - else \ - { \ - int sc_cancel_oldtype = LIBC_CANCEL_ASYNC (); \ - sc_ret = INLINE_SYSCALL_CALL (__VA_ARGS__); \ - LIBC_CANCEL_RESET (sc_cancel_oldtype); \ - } \ - sc_ret; \ + +/* Cancellation macros. */ +#ifndef __SSC +typedef long int __syscall_arg_t; +# define __SSC(__x) ((__syscall_arg_t) (__x)) +#endif + +long int __syscall_cancel (__syscall_arg_t nr, __syscall_arg_t arg1, + __syscall_arg_t arg2, __syscall_arg_t arg3, + __syscall_arg_t arg4, __syscall_arg_t arg5, + __syscall_arg_t arg6); +libc_hidden_proto (__syscall_cancel); + +#define __SYSCALL_CANCEL0(name) \ + (__syscall_cancel)(__NR_##name, 0, 0, 0, 0, 0, 0) +#define __SYSCALL_CANCEL1(name, a1) \ + (__syscall_cancel)(__NR_##name, __SSC(a1), 0, 0, 0, 0, 0) +#define __SYSCALL_CANCEL2(name, a1, a2) \ + (__syscall_cancel)(__NR_##name, __SSC(a1), __SSC(a2), 0, 0, 0, 0) +#define __SYSCALL_CANCEL3(name, a1, a2, a3) \ + (__syscall_cancel)(__NR_##name, __SSC(a1), __SSC(a2), __SSC(a3), 0, 0, 0) +#define __SYSCALL_CANCEL4(name, a1, a2, a3, a4) \ + (__syscall_cancel)(__NR_##name, __SSC(a1), __SSC(a2), __SSC(a3), \ + __SSC(a4), 0, 0) +#define __SYSCALL_CANCEL5(name, a1, a2, a3, a4, a5) \ + (__syscall_cancel)(__NR_##name, __SSC(a1), __SSC(a2), __SSC(a3), \ + __SSC(a4), __SSC(a5), 0) +#define __SYSCALL_CANCEL6(name, a1, a2, a3, a4, a5, a6) \ + (__syscall_cancel)(__NR_##name, __SSC(a1), __SSC(a2), __SSC(a3), \ + __SSC(a4), __SSC(a5), __SSC(a6)) + +#define __SYSCALL_CANCEL_NARGS_X(a,b,c,d,e,f,g,h,n,...) n +#define __SYSCALL_CANCEL_NARGS(...) \ + __SYSCALL_CANCEL_NARGS_X (__VA_ARGS__,7,6,5,4,3,2,1,0,) +#define __SYSCALL_CANCEL_CONCAT_X(a,b) a##b +#define __SYSCALL_CANCEL_CONCAT(a,b) __SYSCALL_CANCEL_CONCAT_X (a, b) +#define __SYSCALL_CANCEL_DISP(b,...) \ + __SYSCALL_CANCEL_CONCAT (b,__SYSCALL_CANCEL_NARGS(__VA_ARGS__))(__VA_ARGS__) + +#define __SYSCALL_CANCEL_CALL(...) \ + __SYSCALL_CANCEL_DISP (__SYSCALL_CANCEL, __VA_ARGS__) + +#define SYSCALL_CANCEL_NCS(name, nr, args...) \ + __SYSCALL_CANCEL_CALL (name, nr, args) + + +/* The loader does not need to handle thread cancellation, use direct + syscall instead. */ +#if IS_IN (rtld) +# define SYSCALL_CANCEL(...) INLINE_SYSCALL_CALL (__VA_ARGS__) +#else +# define SYSCALL_CANCEL(...) \ + ({ \ + long int sc_ret = __SYSCALL_CANCEL_CALL (__VA_ARGS__); \ + SYSCALL_CANCEL_RET ((sc_ret)); \ }) +#endif + +#endif /* __ASSEMBLER__ */ /* Machine-dependent sysdep.h files are expected to define the macro PSEUDO (function_name, syscall_name) to emit assembly code to define the diff --git a/sysdeps/unix/sysv/linux/clock_nanosleep.c b/sysdeps/unix/sysv/linux/clock_nanosleep.c index 93bc4cf..b9a835a 100644 --- a/sysdeps/unix/sysv/linux/clock_nanosleep.c +++ b/sysdeps/unix/sysv/linux/clock_nanosleep.c @@ -28,27 +28,13 @@ int __clock_nanosleep (clockid_t clock_id, int flags, const struct timespec *req, struct timespec *rem) { - INTERNAL_SYSCALL_DECL (err); - int r; - if (clock_id == CLOCK_THREAD_CPUTIME_ID) return EINVAL; if (clock_id == CLOCK_PROCESS_CPUTIME_ID) clock_id = MAKE_PROCESS_CPUCLOCK (0, CPUCLOCK_SCHED); - if (SINGLE_THREAD_P) - r = INTERNAL_SYSCALL (clock_nanosleep, err, 4, clock_id, flags, req, rem); - else - { - int oldstate = LIBC_CANCEL_ASYNC (); - - r = INTERNAL_SYSCALL (clock_nanosleep, err, 4, clock_id, flags, req, - rem); - - LIBC_CANCEL_RESET (oldstate); - } - - return (INTERNAL_SYSCALL_ERROR_P (r, err) - ? INTERNAL_SYSCALL_ERRNO (r, err) : 0); + /* If the call is interrupted by a signal handler or encounters an error, + it returns a positive value similar to errno. */ + return -SYSCALL_CANCEL_NCS (clock_nanosleep, clock_id, flags, req, rem); } weak_alias (__clock_nanosleep, clock_nanosleep) diff --git a/sysdeps/unix/sysv/linux/creat.c b/sysdeps/unix/sysv/linux/creat.c index 31e0248..124d734 100644 --- a/sysdeps/unix/sysv/linux/creat.c +++ b/sysdeps/unix/sysv/linux/creat.c @@ -35,6 +35,4 @@ __creat (const char *file, mode_t mode) } weak_alias (__creat, creat) -LIBC_CANCEL_HANDLED (); - #endif diff --git a/sysdeps/unix/sysv/linux/creat64.c b/sysdeps/unix/sysv/linux/creat64.c index 709c660..2404fea 100644 --- a/sysdeps/unix/sysv/linux/creat64.c +++ b/sysdeps/unix/sysv/linux/creat64.c @@ -37,5 +37,3 @@ weak_alias (__creat64, creat64) strong_alias (__creat64, __creat) weak_alias (__creat64, creat) #endif - -LIBC_CANCEL_HANDLED (); diff --git a/sysdeps/unix/sysv/linux/futex-internal.h b/sysdeps/unix/sysv/linux/futex-internal.h index 1386807..a73fec8 100644 --- a/sysdeps/unix/sysv/linux/futex-internal.h +++ b/sysdeps/unix/sysv/linux/futex-internal.h @@ -83,10 +83,7 @@ static __always_inline int futex_wait_cancelable (unsigned int *futex_word, unsigned int expected, int private) { - int oldtype; - oldtype = __pthread_enable_asynccancel (); - int err = lll_futex_timed_wait (futex_word, expected, NULL, private); - __pthread_disable_asynccancel (oldtype); + int err = lll_futex_timed_wait_cancel (futex_word, expected, NULL, private); switch (err) { case 0: @@ -137,10 +134,7 @@ futex_reltimed_wait_cancelable (unsigned int *futex_word, unsigned int expected, const struct timespec *reltime, int private) { - int oldtype; - oldtype = __pthread_enable_asynccancel (); - int err = lll_futex_timed_wait (futex_word, expected, reltime, private); - __pthread_disable_asynccancel (oldtype); + int err = lll_futex_timed_wait_cancel (futex_word, expected, reltime, private); switch (err) { case 0: @@ -200,11 +194,9 @@ futex_abstimed_wait_cancelable (unsigned int *futex_word, despite them being valid. */ if (__glibc_unlikely ((abstime != NULL) && (abstime->tv_sec < 0))) return ETIMEDOUT; - int oldtype; - oldtype = __pthread_enable_asynccancel (); - int err = lll_futex_timed_wait_bitset (futex_word, expected, abstime, - FUTEX_CLOCK_REALTIME, private); - __pthread_disable_asynccancel (oldtype); + int err = lll_futex_timed_wait_bitset_cancel (futex_word, expected, abstime, + FUTEX_CLOCK_REALTIME, + private); switch (err) { case 0: diff --git a/sysdeps/unix/sysv/linux/lowlevellock-futex.h b/sysdeps/unix/sysv/linux/lowlevellock-futex.h index bb4fbae..ba6bd99 100644 --- a/sysdeps/unix/sysv/linux/lowlevellock-futex.h +++ b/sysdeps/unix/sysv/linux/lowlevellock-futex.h @@ -89,6 +89,12 @@ ? -INTERNAL_SYSCALL_ERRNO (__ret, __err) : 0); \ }) +#define lll_futex_syscall_cp(...) \ + ({ \ + long int __ret = __SYSCALL_CANCEL_CALL (__VA_ARGS__); \ + __ret; \ + }) + #define lll_futex_wait(futexp, val, private) \ lll_futex_timed_wait (futexp, val, NULL, private) @@ -140,6 +146,32 @@ private), \ nr_wake, nr_move, mutex, val) -#endif /* !__ASSEMBLER__ */ +/* Cancellable futex macros. */ +#define lll_futex_wait_cancel(futexp, val, private) \ + lll_futex_timed_wait_cancel (futexp, val, NULL, private) + +#define lll_futex_timed_wait_cancel(futexp, val, timeout, private) \ + ({ \ + long int __ret; \ + int __op = FUTEX_WAIT; \ + __ret = lll_futex_syscall_cp (futex, futexp, \ + __lll_private_flag (__op, private), \ + val, timeout); \ + __ret; \ + }) + +#define lll_futex_timed_wait_bitset_cancel(futexp, val, timeout, \ + clockbit, private) \ + ({ \ + long int __ret; \ + int __op = FUTEX_WAIT_BITSET | clockbit; \ + __ret = lll_futex_syscall_cp (futex, futexp, \ + __lll_private_flag (__op, private), \ + val, timeout, 0, \ + FUTEX_BITSET_MATCH_ANY); \ + __ret; \ + }) + +# endif /* !__ASSEMBLER__ */ #endif /* lowlevellock-futex.h */ diff --git a/sysdeps/unix/sysv/linux/pthread_kill.c b/sysdeps/unix/sysv/linux/pthread_kill.c index cd6f16e..01377b0 100644 --- a/sysdeps/unix/sysv/linux/pthread_kill.c +++ b/sysdeps/unix/sysv/linux/pthread_kill.c @@ -42,9 +42,8 @@ __pthread_kill (pthread_t threadid, int signo) /* Not a valid thread handle. */ return ESRCH; - /* Disallow sending the signal we use for cancellation, timers, - for the setxid implementation. */ - if (signo == SIGCANCEL || signo == SIGTIMER || signo == SIGSETXID) + /* Disallow sending the signal we use for setxid implementation. */ + if (signo == SIGSETXID) return EINVAL; /* We have a special syscall to do the work. */ diff --git a/sysdeps/unix/sysv/linux/sigwait.c b/sysdeps/unix/sysv/linux/sigwait.c index 443c3ad..86d6a54 100644 --- a/sysdeps/unix/sysv/linux/sigwait.c +++ b/sysdeps/unix/sysv/linux/sigwait.c @@ -37,6 +37,3 @@ __sigwait (const sigset_t *set, int *sig) libc_hidden_def (__sigwait) weak_alias (__sigwait, sigwait) strong_alias (__sigwait, __libc_sigwait) - -/* __sigtimedwait handles cancellation. */ -LIBC_CANCEL_HANDLED (); diff --git a/sysdeps/unix/sysv/linux/sigwaitinfo.c b/sysdeps/unix/sysv/linux/sigwaitinfo.c index 75ddd52..738c0d4 100644 --- a/sysdeps/unix/sysv/linux/sigwaitinfo.c +++ b/sysdeps/unix/sysv/linux/sigwaitinfo.c @@ -28,6 +28,3 @@ __sigwaitinfo (const sigset_t *set, siginfo_t *info) libc_hidden_def (__sigwaitinfo) weak_alias (__sigwaitinfo, sigwaitinfo) strong_alias (__sigwaitinfo, __libc_sigwaitinfo) - -/* __sigtimedwait handles cancellation. */ -LIBC_CANCEL_HANDLED (); diff --git a/sysdeps/unix/sysv/linux/socketcall.h b/sysdeps/unix/sysv/linux/socketcall.h index 75f70d0..e5a3a7a 100644 --- a/sysdeps/unix/sysv/linux/socketcall.h +++ b/sysdeps/unix/sysv/linux/socketcall.h @@ -87,16 +87,39 @@ }) -#if IS_IN (libc) -# define __pthread_enable_asynccancel __libc_enable_asynccancel -# define __pthread_disable_asynccancel __libc_disable_asynccancel -#endif +#define __SOCKETCALL_CANCEL1(__name, __a1) \ + SYSCALL_CANCEL_NCS (socketcall, __name, \ + ((long int [1]) { (long int) __a1 })) +#define __SOCKETCALL_CANCEL2(__name, __a1, __a2) \ + SYSCALL_CANCEL_NCS (socketcall, __name, \ + ((long int [2]) { (long int) __a1, (long int) __a2 })) +#define __SOCKETCALL_CANCEL3(__name, __a1, __a2, __a3) \ + SYSCALL_CANCEL_NCS (socketcall, __name, \ + ((long int [3]) { (long int) __a1, (long int) __a2, (long int) __a3 })) +#define __SOCKETCALL_CANCEL4(__name, __a1, __a2, __a3, __a4) \ + SYSCALL_CANCEL_NCS (socketcall, __name, \ + ((long int [4]) { (long int) __a1, (long int) __a2, (long int) __a3, \ + (long int) __a4 })) +#define __SOCKETCALL_CANCEL5(__name, __a1, __a2, __a3, __a4, __a5) \ + SYSCALL_CANCEL_NCS (socketcall, __name, \ + ((long int [5]) { (long int) __a1, (long int) __a2, (long int) __a3, \ + (long int) __a4, (long int) __a5 })) +#define __SOCKETCALL_CANCEL6(__name, __a1, __a2, __a3, __a4, __a5, __a6) \ + SYSCALL_CANCEL_NCS (socketcall, __name, \ + ((long int [6]) { (long int) __a1, (long int) __a2, (long int) __a3, \ + (long int) __a4, (long int) __a5, (long int) __a6 })) + +#define __SOCKETCALL_CANCEL(...) __SOCKETCALL_DISP (__SOCKETCALL_CANCEL,\ + __VA_ARGS__) #define SOCKETCALL_CANCEL(name, args...) \ ({ \ - int oldtype = LIBC_CANCEL_ASYNC (); \ - long int sc_ret = __SOCKETCALL (SOCKOP_##name, args); \ - LIBC_CANCEL_RESET (oldtype); \ + long int sc_ret = __SOCKETCALL_CANCEL (SOCKOP_##name, args); \ + if (sc_ret > -4096UL) \ + { \ + __set_errno (-sc_ret); \ + sc_ret = -1L; \ + } \ sc_ret; \ }) diff --git a/sysdeps/unix/sysv/linux/syscall_cancel.c b/sysdeps/unix/sysv/linux/syscall_cancel.c new file mode 100644 index 0000000..66c87a2 --- /dev/null +++ b/sysdeps/unix/sysv/linux/syscall_cancel.c @@ -0,0 +1,61 @@ +/* Default cancellation syscall bridge. + Copyright (C) 2017 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 + . */ + +#include +#include + +#define ADD_LABEL(__label) \ + asm volatile ( \ + ".global " __label "\t\n" \ + ".type " __label ",@function\t\n" \ + __label ":\n"); + +/* This is the generic version of the cancellable syscall code which + adds the label guards (__syscall_cancel_arch_{start,end}) used + on SIGCANCEL handler (sigcancel_handler at nptl-init.c) to check if + the cancelled syscall have side-effects that need to be signaled to + program. + + An important contrainst should be observed when using this generic + implementation: the __syscall_cancel_arch_end should point to the + immediate next instruction after the syscall one. This is because + kernel will signal interrupted syscall with side effects by setting + the signal frame Program Counter right after the syscall instruction. + + If the INTERNAL_SYSCALL_NCS macro use more instructions to get the + error condition from kernel (from instance on powerpc) or uses an + out of the line helper (such as ARM), one should either adjust the + macro or provide a custom __syscall_cancel_arch implementation. */ +long int +__syscall_cancel_arch (volatile int *ch, __syscall_arg_t nr, + __syscall_arg_t a1, __syscall_arg_t a2, + __syscall_arg_t a3, __syscall_arg_t a4, + __syscall_arg_t a5, __syscall_arg_t a6) +{ + ADD_LABEL ("__syscall_cancel_arch_start"); + if (__glibc_unlikely (*ch & CANCELED_BITMASK)) + __syscall_do_cancel(); + + INTERNAL_SYSCALL_DECL(err); + long int result = INTERNAL_SYSCALL_NCS (nr, err, 6, a1, a2, a3, a4, a5, a6); + ADD_LABEL ("__syscall_cancel_arch_end"); + if (INTERNAL_SYSCALL_ERROR_P (result, err)) + return -INTERNAL_SYSCALL_ERRNO (result, err); + return result; +} +libc_hidden_def (__syscall_cancel_arch) diff --git a/sysdeps/unix/sysv/linux/sysdep.h b/sysdeps/unix/sysv/linux/sysdep.h index 1c24766..22d70c0 100644 --- a/sysdeps/unix/sysv/linux/sysdep.h +++ b/sysdeps/unix/sysv/linux/sysdep.h @@ -27,6 +27,23 @@ -1l; \ }) +/* Check error from cancellable syscall and set errno accordingly. + Linux uses a negative return value to indicate syscall errors + and since version 2.1 the return value of a system call might be + negative even if the call succeeded (e.g., the `lseek' system call + might return a large offset). + Current contract is kernel make sure the no syscall returns a value + in -1 .. -4095 as a valid result so we can savely test with -4095. */ +#define SYSCALL_CANCEL_RET(__ret) \ + ({ \ + if (__ret > -4096UL) \ + { \ + __set_errno (-__ret); \ + __ret = -1; \ + } \ + __ret; \ + }) + /* Provide a dummy argument that can be used to force register alignment for register pairs if required by the syscall ABI. */ #ifdef __ASSUME_ALIGNED_REGISTER_PAIRS From patchwork Mon Dec 11 19:06:47 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella X-Patchwork-Id: 121440 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp3167606qgn; Mon, 11 Dec 2017 11:08:17 -0800 (PST) X-Google-Smtp-Source: ACJfBosy8Lauiqsd34FRrkhTAkDDBbWJF5ZwV7GFaTmgeY82I+/nuUchUE4QaVVZTr3FOJs0GOUJ X-Received: by 10.159.214.148 with SMTP id n20mr1272580plp.101.1513019297243; Mon, 11 Dec 2017 11:08:17 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1513019297; cv=none; d=google.com; s=arc-20160816; b=EKPz7uwPEXCwPWIkvGbvE4qYaVbdJSYPf7R/pMgcBB+FwQNbSOSuFDOMXTVycISwAs Gvuxchnbry7Rrl2AhWgsq6PPBQSXmdlDXM4xqHNAl7AR7etFV1kKOns7XQvRjx3ZhzbL zaDDNE+dh74CjfhnG+0yfzz8mI/Hc06Vla58NpKSaFQHNdIh/d3BuK9jXo3iFW6RkKi2 Eo9dRvrlzi/7VvhkF5VHXfPOFtVuKopvQypFO6NjyOMvoH8F/Xmu/u/deOI8GVDD6INx b2ivUFiM2J3dGPyrTTSKynGq1AN8grHiRC5RwPAAT9xmWulCCIYqvoLRc8TlgTl3w1eV 7rmw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:to:from:delivered-to :sender:list-help:list-post:list-archive:list-subscribe :list-unsubscribe:list-id:precedence:mailing-list:dkim-signature :domainkey-signature:arc-authentication-results; bh=7Ye/+cXRyMK2m2IbkWy1/+PbxiiIRwoJvLzJGFfJ0LY=; b=DnuzKRDBw+q0JWMp0XVAHkDozUkKMcJbFdnWCxcLIGK3vd7lF9wK1tcQCGVVbjz+iD vu8HJNMA97hDarqA6CJRJHqObkwx+7LZAwq27JyODt2TG2dQfY8bm9yzn7PqIO3TyESA vcJpQJrC6N/NaqX4oT2b7LYg1cnkzBYd+I3o+CvbEt7lobRHRa+Ib/g7b81mWdo9sd0k pSbRcox8oi7CdCrsCIz/oyx74EyjvqzAGfLpk4gTAxxBRpHPu5IfnNI5ftAtL56yCmCR 5dL+pS0cXlGvLPnWWwZTdO7pF8YfOA0V/BCbtIZFFjAfznpzGo5y8q7rsdo0fglpC+Jk ghBA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=mP48nJic; spf=pass (google.com: domain of libc-alpha-return-88017-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88017-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id q3si1346429pll.254.2017.12.11.11.08.16 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Dec 2017 11:08:17 -0800 (PST) Received-SPF: pass (google.com: domain of libc-alpha-return-88017-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=mP48nJic; spf=pass (google.com: domain of libc-alpha-return-88017-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88017-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; q=dns; s=default; b=yrbM8ZDUO6ZKSNOCDGydVdKkYEMyvEb LsND3I3sdZjdtcy5s8oG6JnMZ7nhtDLFS1F5GOEDrmhsdUKdi7ZhX36Xw7kHudkh SLIILQvcl3jCahemKXqyfRys6v4KIL4HG2r+2GADbrpiRvZAaYmNeE1h6nQ3eJ5Y 0K7qE71cFFHc= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; s=default; bh=XzuSU6prTyqkulWVTcDOWy0Gocg=; b=mP48n JicTe/RcxJztbSApXU+SVSxnE4Q7BulJjKl47iQoZy/RmPbGv5SzU19l2FJ145DZ 7Hu3w1mEqRB0YJMB+eg1DvHPYrPwyRVs5ZWQ+tszFQLXy3ImWmB3yfSewyVxMbwP MIGuVmA8x9IObqYkEynkEZpKxf59LQwevRk3b8= Received: (qmail 40894 invoked by alias); 11 Dec 2017 19:07:20 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 40836 invoked by uid 89); 11 Dec 2017 19:07:20 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.8 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=proves, crucial, H*RU:209.85.216.196, 2009-2017 X-HELO: mail-qt0-f196.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=7Ye/+cXRyMK2m2IbkWy1/+PbxiiIRwoJvLzJGFfJ0LY=; b=cfxFBdZKzG6+90JAslUau6tI+IZb3dRZqQQcb+oSYjSWvZAh1uOH87kT/fx7Yv0S1Z 8QOkpso99mvWCJMPbrNLvmc946w+8hyq4XlC3u/r0xuMccDYVa29LTlA7Vz+ODwrgXL7 eNA0hNRNq3S9CERCm0/Q2WtjsUG3HyOIHPl3C7/gfmpJhqWWkZePdWZj9mcsXySKcj3N EZVzuO1PzNtgvWFR/qjIyw6cD61nwUB6kc/gCikjmTBMsjNuuZEv39Jw4LG9H+S7Zgs7 2fxRfqYbECbhOS0cy6AE7nbuagxWiw76hKQYzkY21JaYhe8WpQ/O5RRBy1dMx5Syv5GR nhsg== X-Gm-Message-State: AKGB3mLYvpaBXKqRbmXRppGOAIQ4JNvcYCUjdfYTILDaScKv3PtGghs4 2CYk0vpUC6RchG4E0QxzqlFdjIybfmA= X-Received: by 10.55.16.80 with SMTP id a77mr1982288qkh.250.1513019234955; Mon, 11 Dec 2017 11:07:14 -0800 (PST) From: Adhemerval Zanella To: libc-alpha@sourceware.org Subject: [PATCH 03/19] nptl: x86_64: Fix Race conditions in pthread cancellation (BZ#12683) Date: Mon, 11 Dec 2017 17:06:47 -0200 Message-Id: <1513019223-7603-4-git-send-email-adhemerval.zanella@linaro.org> In-Reply-To: <1513019223-7603-1-git-send-email-adhemerval.zanella@linaro.org> References: <1513019223-7603-1-git-send-email-adhemerval.zanella@linaro.org> This patches adds the x86_64 modification required for the BZ#12683. It basically provide the required ucontext_get_pc symbol and remove the arch-specific libc-cancellation implementations. It also remove bogus arch-specific THREAD_ATOMIC_BIT_SET where it always reference to current thread instead of the one referenced by input 'descr' argument. It works as long the input is the self thread pointer, however it creates wrong code is it used along with a description to a different one (as on nptl/pthread_cancel.c). The code generated create an additional load to reference to TLS segment, for instance the code: THREAD_ATOMIC_BIT_SET (THREAD_SELF, cancelhandling, CANCELED_BIT); Compiles to: lock;orl $4, %fs:776 Where with patch changes it now compiles to: mov %fs:16,%rax lock;orl $4, 776(%rax) If some usage indeed proves to be a hotspot we can add an extra macro with a more descriptive name (THREAD_ATOMIC_BIT_SET_SELF for instance) where x86_64 might optimize it. In fact all x86_64 THREAD_ATOMIC_* macros do not respect the input descr and possible will fail when used with a 'descr' difference than THREAD_SELF. Checked on x86_64-linux-gnu. * sysdeps/unix/sysv/linux/x86_64/cancellation.S: Remove file. * sysdeps/unix/sysv/linux/x86_64/libc-cancellation.S: Remove file. * sysdeps/unix/sysv/linux/x86_64/librt-cancellation.S: Remove file. * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h (lll_wait_tid): Use cancellable futex wait call. * sysdeps/unix/sysv/linux/x86_64/sigcontextinfo.h (ucontext_get_pc): New function. * sysdeps/x86_64/nptl/tcb-offsets.sym (TCB_CANCELING_BITMASK): Remove. * sysdeps/x86_64/nptl/tls.h (THREAD_ATOMIC_CMPXCHG_VAL, THREAD_ATOMIC_BIT_SET): Remove macros. Signed-off-by: Adhemerval Zanella --- ChangeLog | 12 +++ sysdeps/unix/sysv/linux/x86_64/cancellation.S | 115 --------------------- sysdeps/unix/sysv/linux/x86_64/libc-cancellation.S | 21 ---- .../unix/sysv/linux/x86_64/librt-cancellation.S | 21 ---- sysdeps/unix/sysv/linux/x86_64/lowlevellock.h | 8 +- sysdeps/unix/sysv/linux/x86_64/sigcontextinfo.h | 11 ++ sysdeps/x86_64/nptl/tcb-offsets.sym | 1 - sysdeps/x86_64/nptl/tls.h | 11 -- 8 files changed, 27 insertions(+), 173 deletions(-) delete mode 100644 sysdeps/unix/sysv/linux/x86_64/cancellation.S delete mode 100644 sysdeps/unix/sysv/linux/x86_64/libc-cancellation.S delete mode 100644 sysdeps/unix/sysv/linux/x86_64/librt-cancellation.S -- 2.7.4 diff --git a/sysdeps/unix/sysv/linux/x86_64/cancellation.S b/sysdeps/unix/sysv/linux/x86_64/cancellation.S deleted file mode 100644 index ed804df..0000000 --- a/sysdeps/unix/sysv/linux/x86_64/cancellation.S +++ /dev/null @@ -1,115 +0,0 @@ -/* Copyright (C) 2009-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper , 2009. - - 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 - . */ - -#include -#include -#include -#include "lowlevellock.h" - -#define PTHREAD_UNWIND JUMPTARGET(__pthread_unwind) -#if IS_IN (libpthread) -# if defined SHARED && !defined NO_HIDDEN -# undef PTHREAD_UNWIND -# define PTHREAD_UNWIND __GI___pthread_unwind -# endif -#else -# ifndef SHARED - .weak __pthread_unwind -# endif -#endif - - -#ifdef __ASSUME_PRIVATE_FUTEX -# define LOAD_PRIVATE_FUTEX_WAIT(reg) \ - movl $(FUTEX_WAIT | FUTEX_PRIVATE_FLAG), reg -#else -# if FUTEX_WAIT == 0 -# define LOAD_PRIVATE_FUTEX_WAIT(reg) \ - movl %fs:PRIVATE_FUTEX, reg -# else -# define LOAD_PRIVATE_FUTEX_WAIT(reg) \ - movl %fs:PRIVATE_FUTEX, reg ; \ - orl $FUTEX_WAIT, reg -# endif -#endif - -/* It is crucial that the functions in this file don't modify registers - other than %rax and %r11. The syscall wrapper code depends on this - because it doesn't explicitly save the other registers which hold - relevant values. */ - .text - - .hidden __pthread_enable_asynccancel -ENTRY(__pthread_enable_asynccancel) - movl %fs:CANCELHANDLING, %eax -2: movl %eax, %r11d - orl $TCB_CANCELTYPE_BITMASK, %r11d - cmpl %eax, %r11d - je 1f - - lock - cmpxchgl %r11d, %fs:CANCELHANDLING - jnz 2b - - andl $(TCB_CANCELSTATE_BITMASK|TCB_CANCELTYPE_BITMASK|TCB_CANCELED_BITMASK|TCB_EXITING_BITMASK|TCB_CANCEL_RESTMASK|TCB_TERMINATED_BITMASK), %r11d - cmpl $(TCB_CANCELTYPE_BITMASK|TCB_CANCELED_BITMASK), %r11d - je 3f - -1: ret - -3: subq $8, %rsp - cfi_adjust_cfa_offset(8) - LP_OP(mov) $TCB_PTHREAD_CANCELED, %fs:RESULT - lock - orl $TCB_EXITING_BITMASK, %fs:CANCELHANDLING - mov %fs:CLEANUP_JMP_BUF, %RDI_LP - call PTHREAD_UNWIND - hlt -END(__pthread_enable_asynccancel) - - - .hidden __pthread_disable_asynccancel -ENTRY(__pthread_disable_asynccancel) - testl $TCB_CANCELTYPE_BITMASK, %edi - jnz 1f - - movl %fs:CANCELHANDLING, %eax -2: movl %eax, %r11d - andl $~TCB_CANCELTYPE_BITMASK, %r11d - lock - cmpxchgl %r11d, %fs:CANCELHANDLING - jnz 2b - - movl %r11d, %eax -3: andl $(TCB_CANCELING_BITMASK|TCB_CANCELED_BITMASK), %eax - cmpl $TCB_CANCELING_BITMASK, %eax - je 4f -1: ret - - /* Performance doesn't matter in this loop. We will - delay until the thread is canceled. And we will unlikely - enter the loop twice. */ -4: mov %fs:0, %RDI_LP - movl $__NR_futex, %eax - xorq %r10, %r10 - addq $CANCELHANDLING, %rdi - LOAD_PRIVATE_FUTEX_WAIT (%esi) - syscall - movl %fs:CANCELHANDLING, %eax - jmp 3b -END(__pthread_disable_asynccancel) diff --git a/sysdeps/unix/sysv/linux/x86_64/libc-cancellation.S b/sysdeps/unix/sysv/linux/x86_64/libc-cancellation.S deleted file mode 100644 index dc9d822..0000000 --- a/sysdeps/unix/sysv/linux/x86_64/libc-cancellation.S +++ /dev/null @@ -1,21 +0,0 @@ -/* Copyright (C) 2009-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper , 2009. - - 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 - . */ - -#define __pthread_enable_asynccancel __libc_enable_asynccancel -#define __pthread_disable_asynccancel __libc_disable_asynccancel -#include "cancellation.S" diff --git a/sysdeps/unix/sysv/linux/x86_64/librt-cancellation.S b/sysdeps/unix/sysv/linux/x86_64/librt-cancellation.S deleted file mode 100644 index 8422939..0000000 --- a/sysdeps/unix/sysv/linux/x86_64/librt-cancellation.S +++ /dev/null @@ -1,21 +0,0 @@ -/* Copyright (C) 2009-2017 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper , 2009. - - 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 - . */ - -#define __pthread_enable_asynccancel __librt_enable_asynccancel -#define __pthread_disable_asynccancel __librt_disable_asynccancel -#include "cancellation.S" diff --git a/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h b/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h index cbf6597..bb6d9ee 100644 --- a/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h +++ b/sysdeps/unix/sysv/linux/x86_64/lowlevellock.h @@ -232,10 +232,10 @@ extern int __lll_timedlock_elision (int *futex, short *adapt_count, afterwards. The kernel up to version 3.16.3 does not use the private futex operations for futex wake-up when the clone terminates. */ #define lll_wait_tid(tid) \ - do { \ - __typeof (tid) __tid; \ - while ((__tid = (tid)) != 0) \ - lll_futex_wait (&(tid), __tid, LLL_SHARED);\ + do { \ + __typeof (tid) __tid; \ + while ((__tid = (tid)) != 0) \ + lll_futex_wait_cancel (&(tid), __tid, LLL_SHARED); \ } while (0) extern int __lll_timedwait_tid (int *, const struct timespec *) diff --git a/sysdeps/unix/sysv/linux/x86_64/sigcontextinfo.h b/sysdeps/unix/sysv/linux/x86_64/sigcontextinfo.h index 131f96b..d9a44e1 100644 --- a/sysdeps/unix/sysv/linux/x86_64/sigcontextinfo.h +++ b/sysdeps/unix/sysv/linux/x86_64/sigcontextinfo.h @@ -15,6 +15,9 @@ License along with the GNU C Library; if not, see . */ +#ifndef _SIGCONTEXTINFO_H +#define _SIGCONTEXTINFO_H + #include #define SIGCONTEXT siginfo_t *_si, ucontext_t * @@ -28,3 +31,11 @@ #define CALL_SIGHANDLER(handler, signo, ctx) \ (handler)((signo), SIGCONTEXT_EXTRA_ARGS (ctx)) + +static inline +uintptr_t ucontext_get_pc (const ucontext_t *uc) +{ + return uc->uc_mcontext.gregs[REG_RIP]; +} + +#endif diff --git a/sysdeps/x86_64/nptl/tcb-offsets.sym b/sysdeps/x86_64/nptl/tcb-offsets.sym index 8a25c48..b225e5b 100644 --- a/sysdeps/x86_64/nptl/tcb-offsets.sym +++ b/sysdeps/x86_64/nptl/tcb-offsets.sym @@ -19,7 +19,6 @@ PRIVATE_FUTEX offsetof (tcbhead_t, private_futex) -- Not strictly offsets, but these values are also used in the TCB. TCB_CANCELSTATE_BITMASK CANCELSTATE_BITMASK TCB_CANCELTYPE_BITMASK CANCELTYPE_BITMASK -TCB_CANCELING_BITMASK CANCELING_BITMASK TCB_CANCELED_BITMASK CANCELED_BITMASK TCB_EXITING_BITMASK EXITING_BITMASK TCB_CANCEL_RESTMASK CANCEL_RESTMASK diff --git a/sysdeps/x86_64/nptl/tls.h b/sysdeps/x86_64/nptl/tls.h index 9b8ad82..4594fe9 100644 --- a/sysdeps/x86_64/nptl/tls.h +++ b/sysdeps/x86_64/nptl/tls.h @@ -315,17 +315,6 @@ typedef struct abort (); }) -/* Atomic set bit. */ -# define THREAD_ATOMIC_BIT_SET(descr, member, bit) \ - (void) ({ if (sizeof ((descr)->member) == 4) \ - asm volatile (LOCK_PREFIX "orl %1, %%fs:%P0" \ - :: "i" (offsetof (struct pthread, member)), \ - "ir" (1 << (bit))); \ - else \ - /* Not necessary for other sizes in the moment. */ \ - abort (); }) - - /* Set the stack guard field in TCB head. */ # define THREAD_SET_STACK_GUARD(value) \ THREAD_SETMEM (THREAD_SELF, header.stack_guard, value) From patchwork Mon Dec 11 19:06:48 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella X-Patchwork-Id: 121439 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp3167401qgn; Mon, 11 Dec 2017 11:08:04 -0800 (PST) X-Google-Smtp-Source: ACJfBotjM8YSiIxKjYJUS3On8tPcoH8u70ZhTgvZF1knPvt4kXNUyXDZUdyqftNnOVt0qBHzzh3w X-Received: by 10.159.229.129 with SMTP id az1mr1254367plb.133.1513019284315; Mon, 11 Dec 2017 11:08:04 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1513019284; cv=none; d=google.com; s=arc-20160816; b=z+QaYYy0IBCq5P4haVd+vanvGqGBEz3DP2McbRGX9fu7i7pxRz0yRwIf+T7vMNeGPj MnEWkOswVPo6bhthGNk5ioKhsm4SGZ8tcFm2sDipNogvp3lbge/7zQnWSH5wbozoxLZ8 zGn307Kv6TTJxpyMgHJlu37toapwtJoxSydSv/FnvVXTyJm4isB6MUK0HQJI2g3fOZeC jQqnYmOoCKUjujHgxAeIsJWE/cRhBInRuhharW4n/eROLcvCPnfOGB1ruDPYZ01I0vgx VDg58edZdu/rgbAZGkOStFyWlUf3PzQ7EDwpAsIqdtqKdqTMtKRpBLwtW68d/qY4s/Xn yEig== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:to:from:delivered-to :sender:list-help:list-post:list-archive:list-subscribe :list-unsubscribe:list-id:precedence:mailing-list:dkim-signature :domainkey-signature:arc-authentication-results; bh=CANBRdgKirol+rlz+5kKrRvYmaKcr5AvOnHny/WPNeY=; b=OOeRXHPkSqS4czz/jhYEV5EbyJ/VcgF5jWntO23vCw1lBTXWlqkYT8TtUgkd850gFR Sz4qUvVq8UwXyNb4jTI4Lfsp8+ZcKbXyy0zTmRBfLMVcs21gHan+tHzFxN99qdYotcdD Bn7RklXgDRJdvfF/dcNGE79Uxl+2qwIOD3tyxCsmpxJyFk9W943JqGP5xY5xvUxz4/jb /wLtoi5xrNaCnW2Ty2gHYN7QAkgzkUEJPNQzLJoM5Y+nmJgGZTazc2aIysy/6FxNo4F/ DwFyDw/G7E/KN1qO2IIsLcFCxvmMTFMdSp09X/Zy4WKra3XV7qrr8xPAy0o+1QJrQzq0 FUSQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=hNpdTPup; spf=pass (google.com: domain of libc-alpha-return-88016-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88016-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id b5si10206240pgu.108.2017.12.11.11.08.04 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Dec 2017 11:08:04 -0800 (PST) Received-SPF: pass (google.com: domain of libc-alpha-return-88016-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=hNpdTPup; spf=pass (google.com: domain of libc-alpha-return-88016-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88016-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; q=dns; s=default; b=nVf5EFhrbJe0xwN5zqIDOp1RRX7GkDo tJMHbiFd1Vfi3u325HYOT4fdJOh3/rAXV/7lKbpC1of8GKXs3gqvNlYEPkDlQ5zN 9DBHlt5/iNKIyGuWATzINR46A8fIKDFVuSke+skPcUmLE06coxJTkTDarrGvvwe8 dGqyjk6xOB78= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; s=default; bh=bXnufHF8B/xR/wqv5sfmn6PDbrk=; b=hNpdT PupqFzylewo/WBFAwGgpA/PZHsgtABG9MW4ZcbJYUwxTxv5vh0lf8r8tgLEpNhYC E9dUDP6B2ePDVHbSbzSfxn31WPFzyPVDr8g4RR3W9hqYAjns6VUbKPxW75FM2i0m fWLslN88EZRQO9b43ugm3rZ3oZouVh9MCBbz04= Received: (qmail 40843 invoked by alias); 11 Dec 2017 19:07:20 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 40799 invoked by uid 89); 11 Dec 2017 19:07:19 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.8 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mail-qt0-f194.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=CANBRdgKirol+rlz+5kKrRvYmaKcr5AvOnHny/WPNeY=; b=cIktUSRQd9Ccs+KwtjuAD23lCoIter2+rEQlM2PG9hgRq2gGKIwMsuZ9VJqAHoCo+9 cic2OyX7vTiN4LC8IeRqX5RJfXPY4M2MZgs2qZpI0Ktd2h9+i2KryxIh/O/KJMGr22Vu 1As5ks7n5ubqjm1UOV4CPl9wiDf62CGH3+QXKKHDQ/wJI1N6vIkYd9h+lPaK2ELWTK+J c9zYCJPmPoe7pyVw44HGSnWqXvBWPHE57vit447avQzu3NiuEz+rslCYhvD2dsd23qyY klLSpoXd8dQKC1ZGoZry+ibcdL3QWYEwMrE6FhTzrbrCL/SjD0On7Hi+Lge1/n01//ul gy9A== X-Gm-Message-State: AKGB3mKxSGchA0gD/7KnTtbu98F9BZc8zleEpdzYZ+7ctjU5ZUtdJSa8 V0/H0odG5FGdKi9BBxCmiEgEZ10Qm0g= X-Received: by 10.200.27.76 with SMTP id p12mr2127588qtk.310.1513019236522; Mon, 11 Dec 2017 11:07:16 -0800 (PST) From: Adhemerval Zanella To: libc-alpha@sourceware.org Subject: [PATCH 04/19] nptl: x32: Fix Race conditions in pthread cancellation (BZ#12683) Date: Mon, 11 Dec 2017 17:06:48 -0200 Message-Id: <1513019223-7603-5-git-send-email-adhemerval.zanella@linaro.org> In-Reply-To: <1513019223-7603-1-git-send-email-adhemerval.zanella@linaro.org> References: <1513019223-7603-1-git-send-email-adhemerval.zanella@linaro.org> This patches adds the x32 modification required for the BZ#12683. It basically adjust the syscall size used to pass the arguments to the syscall cancel wrappers by zero extending pointers type while preserting values for default types (such as off_t). Checked on x86_64-linux-gnu-x32. * sysdeps/unix/sysv/linux/x86_64/x32/sysdep.h (__syscall_arg_t): Define type for x32. (__SSC): Add platform specific macro. * include/libc-pointer-arith.h (__integer_if_pointer_type_sub, __integer_if_pointer_type, cast_to_integer): Parametrize integer type cast. (cast_to_uinteger): New macro. Signed-off-by: Adhemerval Zanella --- ChangeLog | 8 ++++++++ include/libc-pointer-arith.h | 16 +++++++++++----- sysdeps/unix/sysv/linux/x86_64/x32/sysdep.h | 13 +++++++++++++ 3 files changed, 32 insertions(+), 5 deletions(-) -- 2.7.4 diff --git a/include/libc-pointer-arith.h b/include/libc-pointer-arith.h index 715cbc1..4cacb6c 100644 --- a/include/libc-pointer-arith.h +++ b/include/libc-pointer-arith.h @@ -25,17 +25,23 @@ # define __pointer_type(type) (__builtin_classify_type ((type) 0) == 5) /* intptr_t if P is true, or T if P is false. */ -# define __integer_if_pointer_type_sub(T, P) \ +# define __integer_if_pointer_type_sub(T, P, INTTYPE) \ __typeof__ (*(0 ? (__typeof__ (0 ? (T *) 0 : (void *) (P))) 0 \ - : (__typeof__ (0 ? (intptr_t *) 0 : (void *) (!(P)))) 0)) + : (__typeof__ (0 ? (INTTYPE *) 0 : (void *) (!(P)))) 0)) /* intptr_t if EXPR has a pointer type, or the type of EXPR otherwise. */ -# define __integer_if_pointer_type(expr) \ +# define __integer_if_pointer_type(expr, inttype) \ __integer_if_pointer_type_sub(__typeof__ ((__typeof__ (expr)) 0), \ - __pointer_type (__typeof__ (expr))) + __pointer_type (__typeof__ (expr)), \ + inttype) /* Cast an integer or a pointer VAL to integer with proper type. */ -# define cast_to_integer(val) ((__integer_if_pointer_type (val)) (val)) +# define cast_to_integer(val) \ + ((__integer_if_pointer_type (val, intptr_t)) (val)) + +/* Cast an integer or a pointer VAL to unsigned integer with proper type. */ +# define cast_to_uinteger(val) \ + ((__integer_if_pointer_type (val, uintptr_t)) (val)) /* Align a value by rounding down to closest size. e.g. Using size of 4096, we get this behavior: diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/sysdep.h b/sysdeps/unix/sysv/linux/x86_64/x32/sysdep.h index 04c73a2..dedff6c 100644 --- a/sysdeps/unix/sysv/linux/x86_64/x32/sysdep.h +++ b/sysdeps/unix/sysv/linux/x86_64/x32/sysdep.h @@ -18,6 +18,19 @@ #ifndef _LINUX_X32_SYSDEP_H #define _LINUX_X32_SYSDEP_H 1 +#ifndef __ASSEMBLER__ +#include +#include + +typedef long long int __syscall_arg_t; + +/* Syscall arguments for x32 follows x86_64 size, however pointers are 32 + bits in size. The idea is to zero extend pointer types while cast to + signed 64 bit default arguments. */ +#define __SSC(__x) ((__syscall_arg_t) cast_to_uinteger (__x)) + +#endif + /* There is some commonality. */ #include #include From patchwork Mon Dec 11 19:06:49 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella X-Patchwork-Id: 121441 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp3167814qgn; Mon, 11 Dec 2017 11:08:30 -0800 (PST) X-Google-Smtp-Source: ACJfBovW3A6afSwVJXR9T13Nq+jVB3aaBaStM7v6dVCcjdctvir+03nBPEuAmn3+aI+qnm0NScSN X-Received: by 10.84.142.1 with SMTP id 1mr1290501plw.254.1513019310014; Mon, 11 Dec 2017 11:08:30 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1513019310; cv=none; d=google.com; s=arc-20160816; b=PyBFZYIdR5FEfRTEFagiQ7jIH1HGZAGKlcdEH1qIXor3YwW1fokUzMTMiZ+PF/7uUv 50a/O4a42JA+c354HGBjsAsoMIMcQrxDwVcwjpOeNiCSJYzofoBruJRezauFt0Wv4BAr +PS3M70zIlhlpjZiis2wt/Ii+UXO5OuUUPVih1TFp4oBui0ZPFRsptzt0h1B9ONuTVyx gzoEwt1iko9DwHfG1PfSS8nlWvl29cqflpB62i8LMSqZwCGmW5UMb8mkXPHzc/kAMHGb VVFUQRmjT6Az+AicG+7IA6a3cqY9Ae5LVxkokp5NgWfGt3jqmaYeXazq+MzD0+ferGWJ nqHw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:to:from:delivered-to :sender:list-help:list-post:list-archive:list-subscribe :list-unsubscribe:list-id:precedence:mailing-list:dkim-signature :domainkey-signature:arc-authentication-results; bh=x3JY/2B4XC8sA2krs9r9KkAjCapMtsOzy4sXmyZG3os=; b=nKVQDoxpfYY89/DEOmDMEXapmwapiSCdN3QyPMfqqJQjWl8H18yIzctrhYFOR+ylA3 xHjnFEK5+cIMkJ9QMjajWRvOgqZ1dbWl2WuSB7xLGl1SzN/mpJMPBkJU/AK7J/LWLVww 0aW36myQJ6ssZzD5O4/drPJEHG2uhj6v4r782ZFpZ3BNan+4uv4Jr56IXK/ovyAdO+yj d3jOJS4uyE4m1PDxqW+nNjH1PxGmmA1uOL1Hs6VJiiqd3NrNiwu2dc0O72Z7DnVRI+tu TIELtSqX8cerViiM34Pmno9/hTkud7b1wWFOhH9AENqHOf0x0YmvwRNy5FgYLwpWh3x/ gx/Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=hMNZMgNE; spf=pass (google.com: domain of libc-alpha-return-88018-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88018-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id i195si10250111pgc.351.2017.12.11.11.08.29 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Dec 2017 11:08:30 -0800 (PST) Received-SPF: pass (google.com: domain of libc-alpha-return-88018-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=hMNZMgNE; spf=pass (google.com: domain of libc-alpha-return-88018-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88018-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; q=dns; s=default; b=Ht54dwzHxzqVjTva5UGu9OkyIFLJT9B 9Mw7f3acH4jCNxlsWsI4+8hf/EBaj3kYoD0GXNXK4CY6sjwkPQIXZCFlPho6puQ5 GSGFwrxN3Kl2lgS8SGw3aABK1h/piMMRAom5iY76Is+r80cCExFjQ2QacvDvUVdi s31bJ6FkqpxA= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; s=default; bh=LYKpF561FniPe8VBMHCufW1hKWQ=; b=hMNZM gNEZO6Z/hRx7l+EdpLZUbFF+6WbKBMCNgNGSDBtWR++z9kjYcnCzER3GTHYZw5c7 211FxtE4EFnFtAehz26lIsW/hRMg4Za/os9yWMd86rxGlX19EEVQaPlDMJxGT9Yk u/ZMQTVMEgr3EJgfie0kgKCzfVnxrpZE0s+/F4= Received: (qmail 41126 invoked by alias); 11 Dec 2017 19:07:22 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 41098 invoked by uid 89); 11 Dec 2017 19:07:22 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.8 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mail-qt0-f194.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=x3JY/2B4XC8sA2krs9r9KkAjCapMtsOzy4sXmyZG3os=; b=UFhlm8mraWt6PsGUDhavk+UZCy23VKzc/KC95PKjI/ayb1OUSuNkXVPPpetlOdzfGo lSsFcI4Zveed4Mw4KNnqrAGKW5nlMP1Se2Q3/sH/nBvwXP1Ko+OwQNPslgeLAOVafi4l 31vCaliy+z6tczmHIn9gSIWmx2jvC4vS7TYD03E1utlPdvouaUtKzv76NnoWkpBH9OWl HRzgHFxNsTyghRMriyqj0RcYKEHTpC87cGq6kmf719xM9ekFJ2Kcpw9zv5HG9k9DUkf+ 8X1as4oTMi2OqSjjTPujBKqvGD/ACR01xIakwiSLxhgxIHVcVDXLs4rm4uKXACPhB/Gq 0yFQ== X-Gm-Message-State: AKGB3mKA1pIh7MeOJkMcXgyahgz+MnQaRvVKG9iAS1XmOv718gyH84ra QrAtWMPQPjjIduosmdWb7SypA7cRRz8= X-Received: by 10.237.50.130 with SMTP id z2mr1879772qtd.243.1513019238003; Mon, 11 Dec 2017 11:07:18 -0800 (PST) From: Adhemerval Zanella To: libc-alpha@sourceware.org Subject: [PATCH 05/19] nptl: i386: Fix Race conditions in pthread cancellation (BZ#12683) Date: Mon, 11 Dec 2017 17:06:49 -0200 Message-Id: <1513019223-7603-6-git-send-email-adhemerval.zanella@linaro.org> In-Reply-To: <1513019223-7603-1-git-send-email-adhemerval.zanella@linaro.org> References: <1513019223-7603-1-git-send-email-adhemerval.zanella@linaro.org> This patch adds the i386 modifications required for the BZ#12683. It basically provides the required ucontext_get_pc symbol, add the cancelable syscall wrapper and fix a thread atomic update macro. On i386 an arch-specific cancellation implementation is required because depending of the glibc configuration and underlying kernel the syscall may be done using a vDSO symbol (__kernel_vsyscall). By using the vDSO symbol the resulting PC value for an interrupted syscall points to an adress outside the expected markers in __syscall_cancel_arch. It has been discussed in LKML [1] on how kernel could help userland to accomplish it, but afaik discussion was stalled. Also, since glibc supports i486, the old 'int 0x80' should be used in the syscall wrapper. One option could make minimum default chip to pentium II (which implements sysenter) or add a runtime check on syscall_cancel.S to use 'int 0x80' or sysenter. Similar to x86_64, it also remove bogus arch-specific THREAD_ATOMIC_BIT_SET where it always reference to current thread instead of the one referenced by input 'descr' argument. Checked on i686-linux-gnu. * sysdeps/i386/nptl/tls.h (THREAD_ATOMIC_CMPXCHG_VAL, THREAD_ATOMIC_BIT_SET): Remove macro. * sysdeps/unix/sysv/linux/i386/Makefile [$(subdir) = elf] (sysdep-rtld_routines): Add libc-do-syscall object. * sysdeps/unix/sysv/linux/i386/lowlevellock.h (lll_wait_tid): Use cancellable futex syscall macro. * sysdeps/unix/sysv/linux/i386/syscall_cancel.S: New file. * sysdeps/unix/sysv/linux/i386/sigcontextinfo.h (ucontext_get_pc): New function. [1] https://lkml.org/lkml/2016/3/8/1105 Signed-off-by: Adhemerval Zanella --- ChangeLog | 9 +++ sysdeps/i386/nptl/tls.h | 11 --- sysdeps/unix/sysv/linux/i386/Makefile | 2 +- sysdeps/unix/sysv/linux/i386/lowlevellock.h | 2 +- sysdeps/unix/sysv/linux/i386/sigcontextinfo.h | 13 ++++ sysdeps/unix/sysv/linux/i386/syscall_cancel.S | 107 ++++++++++++++++++++++++++ 6 files changed, 131 insertions(+), 13 deletions(-) create mode 100644 sysdeps/unix/sysv/linux/i386/syscall_cancel.S -- 2.7.4 diff --git a/sysdeps/i386/nptl/tls.h b/sysdeps/i386/nptl/tls.h index f9a6b11..afc2f88 100644 --- a/sysdeps/i386/nptl/tls.h +++ b/sysdeps/i386/nptl/tls.h @@ -383,17 +383,6 @@ tls_fill_user_desc (union user_desc_init *desc, abort (); }) -/* Atomic set bit. */ -#define THREAD_ATOMIC_BIT_SET(descr, member, bit) \ - (void) ({ if (sizeof ((descr)->member) == 4) \ - asm volatile (LOCK_PREFIX "orl %1, %%gs:%P0" \ - :: "i" (offsetof (struct pthread, member)), \ - "ir" (1 << (bit))); \ - else \ - /* Not necessary for other sizes in the moment. */ \ - abort (); }) - - /* Set the stack guard field in TCB head. */ #define THREAD_SET_STACK_GUARD(value) \ THREAD_SETMEM (THREAD_SELF, header.stack_guard, value) diff --git a/sysdeps/unix/sysv/linux/i386/Makefile b/sysdeps/unix/sysv/linux/i386/Makefile index 4080b8c..bae2e4b 100644 --- a/sysdeps/unix/sysv/linux/i386/Makefile +++ b/sysdeps/unix/sysv/linux/i386/Makefile @@ -6,7 +6,7 @@ sysdep_routines += ioperm iopl vm86 endif ifeq ($(subdir),elf) -sysdep-dl-routines += libc-do-syscall +sysdep-rtld_routines += libc-do-syscall sysdep-others += lddlibc4 install-bin += lddlibc4 endif diff --git a/sysdeps/unix/sysv/linux/i386/lowlevellock.h b/sysdeps/unix/sysv/linux/i386/lowlevellock.h index 197bb1f..e54d1ea 100644 --- a/sysdeps/unix/sysv/linux/i386/lowlevellock.h +++ b/sysdeps/unix/sysv/linux/i386/lowlevellock.h @@ -223,7 +223,7 @@ extern int __lll_timedlock_elision (int *futex, short *adapt_count, do { \ __typeof (tid) __tid; \ while ((__tid = (tid)) != 0) \ - lll_futex_wait (&(tid), __tid, LLL_SHARED);\ + lll_futex_wait_cancel (&(tid), __tid, LLL_SHARED);\ } while (0) extern int __lll_timedwait_tid (int *tid, const struct timespec *abstime) diff --git a/sysdeps/unix/sysv/linux/i386/sigcontextinfo.h b/sysdeps/unix/sysv/linux/i386/sigcontextinfo.h index 7e2764e..8547d9e 100644 --- a/sysdeps/unix/sysv/linux/i386/sigcontextinfo.h +++ b/sysdeps/unix/sysv/linux/i386/sigcontextinfo.h @@ -16,6 +16,11 @@ License along with the GNU C Library; if not, see . */ +#ifndef _SIGCONTEXTINFO_H +#define _SIGCONTEXTINFO_H + +#include + #define SIGCONTEXT struct sigcontext #define SIGCONTEXT_EXTRA_ARGS #define GET_PC(ctx) ((void *) ctx.eip) @@ -48,3 +53,11 @@ do { \ "i" (sizeof (struct sigcontext) / 4) \ : "cc", "edi"); \ } while (0) + +static inline uintptr_t +ucontext_get_pc (const ucontext_t *uc) +{ + return uc->uc_mcontext.gregs[REG_EIP]; +} + +#endif /* _SIGCONTEXTINFO_H */ diff --git a/sysdeps/unix/sysv/linux/i386/syscall_cancel.S b/sysdeps/unix/sysv/linux/i386/syscall_cancel.S new file mode 100644 index 0000000..5596b3e --- /dev/null +++ b/sysdeps/unix/sysv/linux/i386/syscall_cancel.S @@ -0,0 +1,107 @@ +/* Cancellable syscall wrapper. Linux/i686 version. + Copyright (C) 2017 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 + . */ + +#include + +/* long int [eax] __syscall_cancel_arch (int *cancelhandling [SP], + long int nr [SP+4], + long int arg1 [SP+8], + long int arg2 [SP+12], + long int arg3 [SP+16], + long int arg4 [SP+20], + long int arg5 [SP+24], + long int arg6 [SP+28]) */ + +ENTRY (__syscall_cancel_arch) + pushl %ebp + cfi_def_cfa_offset (8) + cfi_offset (ebp, -8) + pushl %edi + cfi_def_cfa_offset (12) + cfi_offset (edi, -12) + pushl %esi + cfi_def_cfa_offset (16) + cfi_offset (esi, -16) + pushl %ebx + cfi_def_cfa_offset (20) + cfi_offset (ebx, -20) + + .global __syscall_cancel_arch_start + .type __syscall_cancel_arch_start, @function +__syscall_cancel_arch_start: + + /* if (*cancelhandling & CANCELED_BITMASK) + __syscall_do_cancel() */ + testb $4, (%eax) + jne 1f + + /* Issue a 6 argument syscall, the nr [%eax] being the syscall + number. */ + movl 24(%esp), %eax + movl 28(%esp), %ebx + movl 32(%esp), %ecx + movl 36(%esp), %edx + movl 40(%esp), %esi + movl 44(%esp), %edi + movl 48(%esp), %ebp + + /* We can not use the vDSO helper for syscall (__kernel_vsyscall) + because the returned PC from kernel will indicate whether the + interrupted syscall have any side-effects that need to be reported + back to program. And the signal handler (sigcancel_handler at + nptl-init.c) checks the PC agains the __syscall_cancel_arch_* + marks. */ + int $128 + + .global __syscall_cancel_arch_end + .type __syscall_cancel_arch_end, @function +__syscall_cancel_arch_end: + + popl %ebx + cfi_restore (ebx) + cfi_def_cfa_offset (16) + popl %esi + cfi_restore (esi) + cfi_def_cfa_offset (12) + popl %edi + cfi_restore (edi) + cfi_def_cfa_offset (8) + popl %ebp + cfi_restore (ebp) + cfi_def_cfa_offset (4) + ret + +1: + /* Although the __syscall_do_cancel do not return, we need to stack + being set correctly for unwind. */ + popl %ebx + cfi_restore (ebx) + cfi_def_cfa_offset (16) + popl %esi + cfi_restore (esi) + cfi_def_cfa_offset (12) + popl %edi + cfi_restore (edi) + cfi_def_cfa_offset (8) + popl %ebp + cfi_restore (ebp) + cfi_def_cfa_offset (4) + jmp __syscall_do_cancel + +END (__syscall_cancel_arch) +libc_hidden_def (__syscall_cancel_arch) From patchwork Mon Dec 11 19:06:50 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella X-Patchwork-Id: 121442 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp3168070qgn; Mon, 11 Dec 2017 11:08:45 -0800 (PST) X-Google-Smtp-Source: ACJfBov14PH2NG/Mf2tZ9m3uoxO2DFkAaaJWFvsnYjyIVOwd+UQD52Cia5e4Yv3ZJT7vuitACXI1 X-Received: by 10.84.129.132 with SMTP id b4mr1351213plb.326.1513019325100; Mon, 11 Dec 2017 11:08:45 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1513019325; cv=none; d=google.com; s=arc-20160816; b=r2qQdeSWAKA2RHB2axieCTmD+FnkgOYBHq+/gDyP3fc8L9aWoWkFtMWS/D2guJLM6L CAZSwLiXw/+5SDjQDHZvCGAvOuyYXbmJtLCTtAHakLCnB75p9/7RNIjoaSRwagUwDaCG TSE17eYBeLLq03S4ZHy7gdkrwJptNR9YpmiFHSw0eFlqJXRuTHb6vUcdtuSC1YugmN+u pBeEgel+zFp64DNBftpN2JuRsZGOxgXU0Vzy/8NW53EJI52yZQjz49XzdG6I61qu/rWK sjgiSoR2TXHICJQ4aWLSpWLy0Sl245Tl5CQ+OetlgQv+thxngAnMMSOx2BH8kHd5St9t zSgA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:to:from:delivered-to :sender:list-help:list-post:list-archive:list-subscribe :list-unsubscribe:list-id:precedence:mailing-list:dkim-signature :domainkey-signature:arc-authentication-results; bh=dDx1LeN6LkMETtkjqt/IYdk5RljfTjHXK3uQHILN+Ec=; b=O6Hip4P1/+3PynED9BF2BakmGhbhMhPeaSH9gapsi7TngkIPkYgVZ5zrEh8I/WRCCk UuBGn5lED2XhMddgaKnYKcjpeNUFSSfPjynwGeFhWGsAwol8fXq5TMiv2YY/vxF0ahd5 DUquZUpsa1/fJvVwnrWOujLcOuZNjOArtlflfM9yh0pvDGK8kM5z2Wc86nzaQNoiyuef pb+5uDh3az5eJrVx8RgFzYazBSYDdEwm2Itvziwoz9EUja7yLa5WFbrCsfYpkY5Jxqh3 Ii1pZQSJKUIwB1u26Ny7ZAVTFY2uQHc4gE+TxuipwfHAlU5RFlHyj8h7AxHrT4KRc+4a XUbA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=MzqenNdn; spf=pass (google.com: domain of libc-alpha-return-88019-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88019-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id d13si11440036pfb.56.2017.12.11.11.08.44 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Dec 2017 11:08:45 -0800 (PST) Received-SPF: pass (google.com: domain of libc-alpha-return-88019-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=MzqenNdn; spf=pass (google.com: domain of libc-alpha-return-88019-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88019-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; q=dns; s=default; b=iZ6WoxMoGqhKuJtA9U6yUDfcB5doRbb +mu6/lrYhBln0S3gGo0Q4wP2v4hWA6/Nvl4plhs499y2o3Ychv6YH6gOBCg7WEJD kfSdM8J1+dpCP1kDRwIoawt8JcJJcdQ/MlIOHZHEunUqgzBVhBAIvzw+iwX9+OUe k0FGdTiUil9k= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; s=default; bh=9O0eWweJuRo2PaWwABTrAH1srxo=; b=Mzqen NdnUAiieSXQHO3/khdikNC8CXk9TEtSqpBlc1RnQyzWRhoz/Abg2uekglqbLA8JW vm26fIc9SkxitIcT5S3E9vt0XG3oDih3ucEU60YMoLrHW82tE0wD05yriJ6AzPUs wjri2XeYCTHB4FSS74IFOkw5Mcx9YKzDFA8ruA= Received: (qmail 41213 invoked by alias); 11 Dec 2017 19:07:23 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 41188 invoked by uid 89); 11 Dec 2017 19:07:22 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.8 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mail-qt0-f194.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=dDx1LeN6LkMETtkjqt/IYdk5RljfTjHXK3uQHILN+Ec=; b=dWY3ff3p8V2rUEGWX+ywgfEUUXf5y6O9Ag1124fAA5Z3+9oP5L1Mi/LJMDHx7Vx/2U LF91VwX/pBolq0PCPyN7Y957M+X1Xp/PH0TBpV/Svifh5c+/5aNLGSO0m2DOLtb4OJXU I/SrUriSnUBaWA84IE+RS3+yNaAIbh7a0wv24VsMNUh1JHprT7K8EmqzpFelR6zmr+ek 5ru7EG7tkKQKUNu1SGOMQlQ1MjlvKurXUBUlyEv/mQoqDN1G5WSJ3zyfnATfp7KeLJy3 2ZjX7LqyFLftNZ/m+bpzI/rKXdGhAT7pVUI9aHok1KKo5d22yEcLITRxVSovTNjUDj1e snAg== X-Gm-Message-State: AKGB3mKSeoWUn0NDvdiAJcg5PBZUxx+jWNWFAK106y/nKrxU7VEOTXP7 6mP+S3ldOb+qd80ILG0Jvc+HHY3zp3w= X-Received: by 10.55.182.129 with SMTP id g123mr1825499qkf.243.1513019239376; Mon, 11 Dec 2017 11:07:19 -0800 (PST) From: Adhemerval Zanella To: libc-alpha@sourceware.org Subject: [PATCH 06/19] nptl: powerpc: Fix Race conditions in pthread cancellation (BZ#12683) Date: Mon, 11 Dec 2017 17:06:50 -0200 Message-Id: <1513019223-7603-7-git-send-email-adhemerval.zanella@linaro.org> In-Reply-To: <1513019223-7603-1-git-send-email-adhemerval.zanella@linaro.org> References: <1513019223-7603-1-git-send-email-adhemerval.zanella@linaro.org> This patches adds the powerpc64 modification required for the BZ#12683. It basically adds the required __pthread_get_pc function and a arch specific syscall_cancel implementation. The powerpc requires an arch-specific syscall_cancel because INTERNAL_SYSCALL_NCS adds a mfcr just after the sc instruction to get the CR0.SO bit information from kernel (which signals the error return status). So for cancelled syscalls with side effects, __pthread_get_pc will point to mcfr and thus invalidating the checks on sigcancel_handler. Checked on powerpc64le-linux-gnu and powerpc-linux-gnu. * sysdeps/unix/sysv/linux/powerpc/syscall_cancel.S: New file. * sysdeps/unix/sysv/linux/powerpc/sysdep-cancel.h (__pthread_get_pc): New function. Signed-off-by: Adhemerval Zanella --- ChangeLog | 4 ++ sysdeps/unix/sysv/linux/powerpc/sigcontextinfo.h | 16 ++++++ sysdeps/unix/sysv/linux/powerpc/syscall_cancel.S | 64 ++++++++++++++++++++++++ 3 files changed, 84 insertions(+) create mode 100644 sysdeps/unix/sysv/linux/powerpc/syscall_cancel.S -- 2.7.4 diff --git a/sysdeps/unix/sysv/linux/powerpc/sigcontextinfo.h b/sysdeps/unix/sysv/linux/powerpc/sigcontextinfo.h index b8b5997..aada838 100644 --- a/sysdeps/unix/sysv/linux/powerpc/sigcontextinfo.h +++ b/sysdeps/unix/sysv/linux/powerpc/sigcontextinfo.h @@ -15,7 +15,11 @@ License along with the GNU C Library; if not, see . */ +#ifndef _SIGCONTEXTINFO_H +#define _SIGCONTEXTINFO_H + #include +#include #define SIGCONTEXT struct sigcontext * #define SIGCONTEXT_EXTRA_ARGS @@ -24,3 +28,15 @@ #define GET_STACK(ctx) ((void *)((ctx)->regs->gpr[1])) #define CALL_SIGHANDLER(handler, signo, ctx) \ (handler)((signo), SIGCONTEXT_EXTRA_ARGS (ctx)) + +static inline uintptr_t +ucontext_get_pc (const ucontext_t *uc) +{ +#ifdef __powerpc64__ + return uc->uc_mcontext.gp_regs[PT_NIP]; +#else + return uc->uc_mcontext.uc_regs->gregs[PT_NIP]; +#endif +} + +#endif /* _SIGCONTEXTINFO_H */ diff --git a/sysdeps/unix/sysv/linux/powerpc/syscall_cancel.S b/sysdeps/unix/sysv/linux/powerpc/syscall_cancel.S new file mode 100644 index 0000000..bda2199 --- /dev/null +++ b/sysdeps/unix/sysv/linux/powerpc/syscall_cancel.S @@ -0,0 +1,64 @@ +/* Cancellable syscall wrapper. Linux/powerpc version. + Copyright (C) 2017 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 + . */ + +#include + +/* long int [r3] __syscall_cancel_arch (int *cancelhandling [r3], + long int nr [r4], + long int arg1 [r5], + long int arg2 [r6], + long int arg3 [r7], + long int arg4 [r8], + long int arg5 [r9], + long int arg6 [r10]) */ + +ENTRY (__syscall_cancel_arch) + + .globl __syscall_cancel_arch_start + .type __syscall_cancel_arch_start,@function +__syscall_cancel_arch_start: + + /* if (*cancelhandling & CANCELED_BITMASK) + __syscall_do_cancel() */ + lwz r0,0(r3) + rldicl. r0,r0,62,63 + beq 1f + b __syscall_do_cancel + nop +1: + /* Issue a 6 argument syscall, the nr [r4] being the syscall + number. */ + mr r0,r4 + mr r3,r5 + mr r4,r6 + mr r5,r7 + mr r6,r8 + mr r7,r9 + mr r8,r10 + ABORT_TRANSACTION + sc + + .globl __syscall_cancel_arch_end + .type __syscall_cancel_arch_end,@function +__syscall_cancel_arch_end: + + bnslr+ + neg r3,r3 + blr +END (__syscall_cancel_arch) +libc_hidden_def (__syscall_cancel_arch) From patchwork Mon Dec 11 19:06:51 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella X-Patchwork-Id: 121443 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp3168225qgn; Mon, 11 Dec 2017 11:08:54 -0800 (PST) X-Google-Smtp-Source: ACJfBov0rGlBvdnVXl8gU3Kf8uzZQ/9qupCOoCrfOaX8A1FyMRMoh2pel6P5pFoqxzvvz4q/35Vg X-Received: by 10.159.252.197 with SMTP id o5mr1322285pls.46.1513019334849; Mon, 11 Dec 2017 11:08:54 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1513019334; cv=none; d=google.com; s=arc-20160816; b=Hyd5QK1cdBekaMZ67UoVEpf7TcU6dj5gWSxVMExyd/J3V1ikdYMj8Kf9/TUFja9Fjl g9K5LS1sG6chef3Bx6+iFQAxSPNh6i4Kr8V46bZKJvQEUbQOJjF15t3G4V0iKCddgsP0 RzLgWWmU4hFu87YIOHSlG6fjSjxSnBJymr3vQD+xfFKodaIiweVSDIsZsfyjLEZkGc7F T/uxm4cCeIZ7cYPDqT0tm4WPLSYd13xK6zXrQMqa9HgR4Z/oC47Ae1U2X9xtXm+Y2jMP KM0cmt8rDwspFrjSVpuPj96HRZyGhPCKV9xNqIrtk9+GbW0f7hYmLTJ8MEsEAi4gd0tE RlUQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:to:from:delivered-to :sender:list-help:list-post:list-archive:list-subscribe :list-unsubscribe:list-id:precedence:mailing-list:dkim-signature :domainkey-signature:arc-authentication-results; bh=+ZzPUeqVpgNTa1Rnv9v8I/qJhq2Aoh1svP3JDkJ2PZI=; b=SydXTS+6IyE2zVzfhnFpVol/ASSGXhlG3VJ5hmjAcHrZsTaMB1Bb6beVxE1xD2ZJd3 QwkgcVBuJ1xxJmk/2GUBKsZaEjGcSSrZRzz4uE24EpHBTyBH0zmz2lOf6jUnBlKTPWto D+JqwpACJOp3siSSV/czVDZb6wNNpbuuPcwAgPfAtbyM45uhfHkBALttlHB8WwuStzPc 0QNSYOjYd7XM6FJF67t+543VxezxMtoQLSqpqYDkw47oMB2Var+vxqdSjuU93oufeBkO nzQ/BUCe9HXQnHNvuxhsD/cpVqA1h7FnjujOLyweOh+mjRDiGcQhdmAlrW8mhvHCi0Gd +xLw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=GSNxj4il; spf=pass (google.com: domain of libc-alpha-return-88020-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88020-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id c26si11441428pfh.105.2017.12.11.11.08.54 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Dec 2017 11:08:54 -0800 (PST) Received-SPF: pass (google.com: domain of libc-alpha-return-88020-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=GSNxj4il; spf=pass (google.com: domain of libc-alpha-return-88020-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88020-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; q=dns; s=default; b=wJEVW4v+1ZmxySJzvvs+8Sz2QjIY4y9 IwzkeDPvtwRnWQZrAjNeXDCoPCEAsG/+v/ZOTSbnLRHVyLhjuS1i3BUob5HM6frG UAGwWq0HQdWKZRNSvp1eCR4Q37uuwvVbzLoJmtnP1t8k/3onVI7aHKIuU2VVRBO6 FF9JDSbfTdY0= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; s=default; bh=u/2b6qjROyAq91THcECO5f2CEZI=; b=GSNxj 4ilwbKdMeTPuK1JjKIYc8QF31itstzEDJVb5DHoThGJkK+R3vxTjWuIYZbbE+1Gc Ljk1pf5/KbE+724rrax6zRIJhhXOYpcMZqNS/MjM9fZ+79P4PedhLqaMCMODSjuK yjwRmBrQwIQH9ZlYj1vPIJ5i4EwjIidSCR4tpU= Received: (qmail 41388 invoked by alias); 11 Dec 2017 19:07:24 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 41358 invoked by uid 89); 11 Dec 2017 19:07:24 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.8 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=H*RU:209.85.216.195, Hx-spam-relays-external:209.85.216.195, 3611 X-HELO: mail-qt0-f195.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=+ZzPUeqVpgNTa1Rnv9v8I/qJhq2Aoh1svP3JDkJ2PZI=; b=jqmJ5YBloYsuSnaKBbjwotgv2dx7SUGbqivmgFwWQmjhNyqKoKBl8VsuX36dYBEcb3 mYkpcab8ztWD+EOUHeao7JOKujlG+7OPxyQmSWOfCcncupSZkVh2wViclidDLeNPK9Lg EqFcYQve/yJ7B37ngQoWV7bkENgreMaAIttyvQYylhiuLXkuZx13ksRzGeYtXtnFPkGa gF/grmlPMTNnmejchSqX/EKRgzsVEIB+cQhw1VInJSwmIIZdk3FGMPfiAhY/taVQDYz8 KHN9OHpbDD559+dvC1YH93sTIBIrAdecBdIs1oi5PD0FdjptZGXAqRfb2vVc8ND6xjs1 FF3A== X-Gm-Message-State: AKGB3mLDT4BwOJ4VT+VfVhjua//58otYUFSKmcz+hv3HxMgBvIjRZCdk 23caNrnwjsTL/da9CGiN0+grLpsrI/c= X-Received: by 10.55.19.19 with SMTP id d19mr1815668qkh.189.1513019240764; Mon, 11 Dec 2017 11:07:20 -0800 (PST) From: Adhemerval Zanella To: libc-alpha@sourceware.org Subject: [PATCH 07/19] nptl: aarch64: Fix Race conditions in pthread cancellation (BZ#12683) Date: Mon, 11 Dec 2017 17:06:51 -0200 Message-Id: <1513019223-7603-8-git-send-email-adhemerval.zanella@linaro.org> In-Reply-To: <1513019223-7603-1-git-send-email-adhemerval.zanella@linaro.org> References: <1513019223-7603-1-git-send-email-adhemerval.zanella@linaro.org> This patch adds the aarch64 modifications required for the BZ#12683. It basically adds the required ucontext_get_pc function. The built cancelable syscall wrapper for aarch64 using GCC 7.2.1 and default configuration flags shows an expected optimized version: --- __GI___syscall_cancel_arch: .LFB38: .cfi_startproc .global __syscall_cancel_arch_start .type __syscall_cancel_arch_start,@function __syscall_cancel_arch_start: ldr w9, [x0] tbnz x9, 2, .L7 mov x8, x1 mov x0, x2 mov x1, x3 mov x2, x4 mov x3, x5 mov x4, x6 mov x5, x7 svc 0 // syscall nr .global __syscall_cancel_arch_end .type __syscall_cancel_arch_end,@function __syscall_cancel_arch_end: ret --- A similar code is obtained with GCC 5.3.1, so I see to need to provide an arch-specific syscall_cancel.S for aarch64. Checked on aarch64-linux-gnu. * sysdeps/unix/sysv/linux/aarch64/sysdep-cancel.h (PSEUDO): Redefine to call __syscall_cancel function for cancellable syscalls. (__pthread_get_ip): Add implementation. * sysdeps/unix/sysv/linux/aarch64/sysdep.h (SYSCALL_CANCEL_ERROR): Add definition. (SYSCALL_CANCEL_ERRNO): Likewise. Signed-off-by: Adhemerval Zanella --- ChangeLog | 3 +++ sysdeps/unix/sysv/linux/aarch64/sigcontextinfo.h | 11 +++++++++++ 2 files changed, 14 insertions(+) -- 2.7.4 diff --git a/sysdeps/unix/sysv/linux/aarch64/sigcontextinfo.h b/sysdeps/unix/sysv/linux/aarch64/sigcontextinfo.h index 7793d11..4213be9 100644 --- a/sysdeps/unix/sysv/linux/aarch64/sigcontextinfo.h +++ b/sysdeps/unix/sysv/linux/aarch64/sigcontextinfo.h @@ -16,6 +16,9 @@ License along with the GNU C Library; if not, see . */ +#ifndef _SIGCONTEXTINFO_H +#define _SIGCONTEXTINFO_H + #include #include @@ -33,3 +36,11 @@ (act)->sa_flags |= SA_SIGINFO; \ (sigaction) (sig, act, oact); \ }) + +static inline uintptr_t +ucontext_get_pc (const ucontext_t *uc) +{ + return uc->uc_mcontext.pc; +} + +#endif From patchwork Mon Dec 11 19:06:52 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella X-Patchwork-Id: 121444 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp3168392qgn; Mon, 11 Dec 2017 11:09:04 -0800 (PST) X-Google-Smtp-Source: ACJfBosrMSUEGfcIT6+lif8DGz50ElwrEG1YWMiHt2cWiBBoi6kmBMJpJBYhKnWDA78uOBpvvDkI X-Received: by 10.84.202.194 with SMTP id q2mr1340553plh.220.1513019344892; Mon, 11 Dec 2017 11:09:04 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1513019344; cv=none; d=google.com; s=arc-20160816; b=BPgLKO9Zm7y8/YkfLlgMsavt8RLvMxag8Bl53nWa6+D4ZTsX1SkcqJWPiWB4T6G7Qu 6OEDI8qaMOQxtUsO5szpNUI9M1Nlg9bQXiVMEHJz91QHlQTfAYJY1A9kNBqKde0UH48F 2E02cP+i/bFpbZYgkKZdoq0A8O8b7X30HPk+W+/ncaA9g5RRv9a8X9Om9zmbEQd1zZI8 raKT7YnYB1/0BW3eDqZZdyQxZjvWOUyvVzB34NGj7p2UepLIL9Z1UihrrExIHg5XMdUu aArYWI3F1AaYU1YvwSkpyDWYJlXCtqqbC0MrZ06EDmBNPDapDUB3IlpHNU+tK5ULH6CB f4Vg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:to:from:delivered-to :sender:list-help:list-post:list-archive:list-subscribe :list-unsubscribe:list-id:precedence:mailing-list:dkim-signature :domainkey-signature:arc-authentication-results; bh=6q7FgajN6kglFih6jNcgENhY1G2GsnK72NJVhZcldok=; b=vAyUkyKnG4tjZijNjkJBPqZwd4AFyopFp1mEuwFPEhuXpwSN7DgcScnxsWWMBOoOwe BiPdj3fjZzNX+66fvpZ4xm9YGmrl+3FBHBh7mJ043VJyXwfj/OqEgfqMoElbJcCjhU/J tGoUi3gzzlvd2Gg4hmUgzK64kklHUf7SfbuyyxGPlkX0a50MkitmTLO02uSVy1vOx56M eWMEfYLcZlL75P5Y4LVUfM8sawAarWUTm0kunSSRk77QzyPpIy7wIzFHQAzD/FL+UotY Ks9zCFw/VTVkbmhXAKzEkvsJvjNZm7n3opUsTCqDaOb8N1MrGd6VTcabEFEFqLHqEKMw 1KKA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=IzN9RKGI; spf=pass (google.com: domain of libc-alpha-return-88021-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88021-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id e4si10393527pln.445.2017.12.11.11.09.04 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Dec 2017 11:09:04 -0800 (PST) Received-SPF: pass (google.com: domain of libc-alpha-return-88021-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=IzN9RKGI; spf=pass (google.com: domain of libc-alpha-return-88021-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88021-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; q=dns; s=default; b=cUIlLZbaRWpV/iZZmUpZKtvJlTvSK85 y6lvwYb5jx8LmVi5tK8f13HEQMluZ737OCgdt+W6XrV6pWMhZ+taBqtB5oN+ySam YBPeMKhvxwoJZ+dv2JT9ZfHwIAYNbCvp4ha5mNoUlOZCrI7Wg7sh5KkuSYPSgA/e BePXmDI2TOik= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; s=default; bh=bArRcu+Xr35PakCTRkVTCdKHPbM=; b=IzN9R KGIM9/acexiH1w+xsZhpctHRTfi/BsGoGg+WNEUiL4TolNfkENzk9b5raS8/2nBD Sq3ZD8G8iWQwuDuNHw70Z1KURjCgqI9/v3sA71DOYKDI4B/YdCteYsuNWtw5PRf/ Rm+SKFv/a3Id8xM0gFhgkExRS4l6Ozw1u8v3rg= Received: (qmail 41615 invoked by alias); 11 Dec 2017 19:07:26 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 41567 invoked by uid 89); 11 Dec 2017 19:07:26 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.8 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=5011, thumb X-HELO: mail-qt0-f193.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=6q7FgajN6kglFih6jNcgENhY1G2GsnK72NJVhZcldok=; b=Ila2y4FAvoM68xmeOcn12V7h3PoaqA5DjuqCgYK4OTuF3m1tq87XxbaRC62KIg2Z27 9vzlpYrOmquxAGN41zhYDY7kz79nB9TPaJ+n8P1B/iNXurBL8iPC4HFESlXe71RjAS+B +6mitLRq2nP9K0ljFeqquLcNH/XvEp2KedZP0MxZiZq4jDfndFPmM+QTQ0FJWsFeqK2/ Mun1ghMKbYGikn4yuEg48cq3W9isKzZ+EcwqShZwyxI4Lsz1R1le8VlwnyengrjdH+MB YRor9PCGiiIheK/wB7yPb9zWxwaQyPsh5tfWAp0JEjHOawTdSo4vTf/uS6GZ7TUGlJvK 3LYA== X-Gm-Message-State: AKGB3mLDKyEC2Rjb4TjLLLf5Re6mDAX0dJx6BSi/dBXe48IZPv+g4ptp uVA2NoGPqr8YzF3PIuG4zxnsi7Qxp/Y= X-Received: by 10.55.167.139 with SMTP id q133mr2001728qke.328.1513019242314; Mon, 11 Dec 2017 11:07:22 -0800 (PST) From: Adhemerval Zanella To: libc-alpha@sourceware.org Subject: [PATCH 08/19] nptl: arm: Fix Race conditions in pthread cancellation (BZ#12683) Date: Mon, 11 Dec 2017 17:06:52 -0200 Message-Id: <1513019223-7603-9-git-send-email-adhemerval.zanella@linaro.org> In-Reply-To: <1513019223-7603-1-git-send-email-adhemerval.zanella@linaro.org> References: <1513019223-7603-1-git-send-email-adhemerval.zanella@linaro.org> This patch adds the ARM modifications required for the BZ#12683. It basically adds the required ucontext_get_pc function and a arch specific syscall_cancel implementation. ARM requires an arch-specific syscall_cancel implementation because INTERNAL_SYSCALL_NCS may call an auxiliary symbol (__libc_do_syscall) for thumb which invalides the check on sigcancel_handler. Checked on arm-linux-gnueabihf. * sysdeps/unix/sysv/linux/arm/syscall_cancel.S: New file. * sysdeps/unix/sysv/linux/arm/sigcontextinfo.h (ucontext_get_pc): New function. Signed-off-by: Adhemerval Zanella --- ChangeLog | 4 ++ sysdeps/unix/sysv/linux/arm/sigcontextinfo.h | 12 +++++ sysdeps/unix/sysv/linux/arm/syscall_cancel.S | 69 ++++++++++++++++++++++++++++ 3 files changed, 85 insertions(+) create mode 100644 sysdeps/unix/sysv/linux/arm/syscall_cancel.S -- 2.7.4 Signed-off-by: Adhemerval Zanella diff --git a/sysdeps/unix/sysv/linux/arm/sigcontextinfo.h b/sysdeps/unix/sysv/linux/arm/sigcontextinfo.h index d3313af..8132a95 100644 --- a/sysdeps/unix/sysv/linux/arm/sigcontextinfo.h +++ b/sysdeps/unix/sysv/linux/arm/sigcontextinfo.h @@ -16,6 +16,10 @@ License along with the GNU C Library. If not, see . */ +#ifndef _SIGCONTEXTINFO_H +#define _SIGCONTEXTINFO_H + +#include #include #define SIGCONTEXT siginfo_t *_si, ucontext_t * @@ -46,3 +50,11 @@ (act)->sa_flags |= SA_SIGINFO; \ (sigaction) (sig, act, oact); \ }) + +static inline uintptr_t +ucontext_get_pc (const ucontext_t *uc) +{ + return uc->uc_mcontext.arm_pc; +} + +#endif /* _SIGCONTEXTINFO_H */ diff --git a/sysdeps/unix/sysv/linux/arm/syscall_cancel.S b/sysdeps/unix/sysv/linux/arm/syscall_cancel.S new file mode 100644 index 0000000..5ae1412 --- /dev/null +++ b/sysdeps/unix/sysv/linux/arm/syscall_cancel.S @@ -0,0 +1,69 @@ +/* Cancellable syscall wrapper. Linux/arm version. + Copyright (C) 2017 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 + . */ + +#include + +/* long int [r0] __syscall_cancel_arch (int *cancelhandling [r0], + long int nr [r1], + long int arg1 [r2], + long int arg2 [r3], + long int arg3 [SP], + long int arg4 [SP+4], + long int arg5 [SP+8], + long int arg6 [SP+12]) */ + + .syntax unified + +ENTRY (__syscall_cancel_arch) + .fnstart + mov ip,sp + stmfd sp!, {r4,r5,r6,r7,lr} + .save {r4,r5,r6,r7,lr} + + cfi_adjust_cfa_offset (20) + cfi_rel_offset (lr, 16) + + .globl __syscall_cancel_arch_start +__syscall_cancel_arch_start: + + /* if (*cancelhandling & CANCELED_BITMASK) + __syscall_do_cancel() */ + ldr r0, [r0] + tst r0, #4 + bne 1f + + /* Issue a 6 argument syscall, the nr [r1] being the syscall + number. */ + mov r7, r1 + mov r0, r2 + mov r1, r3 + ldmfd ip, {r2,r3,r4,r5,r6} + svc 0x0 + + .globl __syscall_cancel_arch_end +__syscall_cancel_arch_end: + ldmfd sp!, {r4,r5,r6,r7,lr} + cfi_adjust_cfa_offset (-20); + bx lr + +1: + mov lr, pc + b __syscall_do_cancel + .fnend +END (__syscall_cancel_arch) +libc_hidden_def (__syscall_cancel_arch) From patchwork Mon Dec 11 19:06:53 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella X-Patchwork-Id: 121445 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp3168570qgn; Mon, 11 Dec 2017 11:09:14 -0800 (PST) X-Google-Smtp-Source: ACJfBosar5rpMS2XFrfyf0MYtB8i1wMc4GFAUj8b5yxWXLSTJFuqW4P2RKp3HRKmHYwT0t0zh0Qw X-Received: by 10.84.137.129 with SMTP id 1mr1308240pln.169.1513019354551; Mon, 11 Dec 2017 11:09:14 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1513019354; cv=none; d=google.com; s=arc-20160816; b=EYgTUbuKCFsUrYwWvfRTljBweZpDqghSiXE48RtA3Wj0FLiGVbesG/91EOBw2WiSes OYGwRniaKYRak78qOy2A+/FXYLxVW9TH8TIHcCFjUhsjLBAEarXlWoJby1VGmw+Bgaql LBDOLF4R4ZHpBFb8JPH3qIWrUInTz795oSrPlW331hP2Wn0ZHazwtcEpsQlvCjsKwaiB M1fSaQ9O2HfTfp+GVkFmNOyviqSydTy3CTtWh2JOQBp41PF4UUbbHfYW882ckh8349kJ 7fvfhVT13JmTLFz4DwhCcS/eiDCmqZE4TkQSJ+Zl72vRUnvM+1y2CBf5a74n3Pw+/gI/ kp8A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from :delivered-to:sender:list-help:list-post:list-archive:list-subscribe :list-unsubscribe:list-id:precedence:mailing-list:dkim-signature :domainkey-signature:arc-authentication-results; bh=Rqh/D9W65fMFC1DYB2ohJ5K3qjrQCvLICpkdWuaqyOo=; b=joetY18LVNchA14Q9Lj/Nl8KPt6FOCv+HZ79nM5/NhCAHVRTQyfunhTCtbJ5sfPl8L r2nAxIJ0fTZVnPeAVnly5WX4PhUF/i5vPBLB25fiyRLrEy8skWbt9oYxr8CLqCeMkldl roqPnYwsW3AkzhfzhVcMLJzfhN4M9ctVIV+x+tQx0nanrzWnec+kFXzu7cccEQR5osGZ hFpWkiq24eLYdyt7t6Ar7oPZMSQsYXAimmOxH3Q72Mnkp6HvkMs9VONxcEFn3d+1T6YE /RnEcek1KAPHG5RwtUjB3F3mLC8D9szTiC56kjHCzZK2ByYmGaJN/5Jo6r0RUKsDirGm d21Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=IRbLqEx7; spf=pass (google.com: domain of libc-alpha-return-88022-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88022-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id l18si11370895pfk.170.2017.12.11.11.09.14 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Dec 2017 11:09:14 -0800 (PST) Received-SPF: pass (google.com: domain of libc-alpha-return-88022-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=IRbLqEx7; spf=pass (google.com: domain of libc-alpha-return-88022-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88022-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id:in-reply-to :references; q=dns; s=default; b=qqsoqUPwcw9a9CnBdpoy6LLQggY6Mjd zyLNakdzZmBl2Pg7/0mz70HlFYygMI+mwVKuKvCHgOO4djljUrxSdroM9Ntd8+b/ Vmr+CGJByOQUh8ENJatIASMcXm+6qR+bJfb4sdtLeywfemM/yhEssA0ow4pDlCSs F9VVzArjHHqs= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id:in-reply-to :references; s=default; bh=AO+Jo7/V8y6uB55rB1+c2NH5pCg=; b=IRbLq Ex7Qgz/eDNyEnpv9mK1sYpbrearJDIrVRMcupX3nZ9r0s45bVmH7tqirh49qI4HV YFsk32NnErxpVL9x9yJyLO6x21j5+emAgKzc3UWgzjR+PrCpUzYjIG2wDSUtJTM8 YHWPFGQWbi6u813LTTgnnpUjEGKmFTqsrDBZd8= Received: (qmail 41774 invoked by alias); 11 Dec 2017 19:07:28 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 41730 invoked by uid 89); 11 Dec 2017 19:07:27 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.9 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=s390xlinuxgnu, s390x-linux-gnu, ahi X-HELO: mail-qt0-f173.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=Rqh/D9W65fMFC1DYB2ohJ5K3qjrQCvLICpkdWuaqyOo=; b=ocyaFE3bTVmR52qFW/VOJokwSaxpG4dSW88rsVvB7uTiXhMfI8+mRUeJIz/FnUw7Ie GM0JUNvzk19k29CKSIaK+mBGBVT88FrSUD9ygGNmnyfdgUpPHYh01RSoTM+eSzi/9ng2 9G69jg3oUJqI8q8VCP1lFUKEGkQinWBELcB6RzFqIAvZAoymWAgzPF/jvn8aUbau5CJm ckF/dWn7mybh6cIKdNE94ru+OM4dOS2978V8b7VDC0b3MutBQp0fNEtySeHj5/t7IHJq G/+HDOeTV3w4GRW60sVjOeF+0eL8BTHM+b+Sd6xfqr7Isr1eklHYFwmS5UxWF+Ko7CiH WjgA== X-Gm-Message-State: AKGB3mI1M4nxINtNYVR+7hM1RJYVeplcFs25eKF4JAUrLraij/m4LUt8 Dr5besYya6ftufTAWGKrKDW+EpMfx8U= X-Received: by 10.55.25.22 with SMTP id k22mr1883148qkh.120.1513019244012; Mon, 11 Dec 2017 11:07:24 -0800 (PST) From: Adhemerval Zanella To: libc-alpha@sourceware.org Cc: Adhemerval Zanella Subject: [PATCH 09/19] nptl: s390: Fix Race conditions in pthread cancellation (BZ#12683) Date: Mon, 11 Dec 2017 17:06:53 -0200 Message-Id: <1513019223-7603-10-git-send-email-adhemerval.zanella@linaro.org> In-Reply-To: <1513019223-7603-1-git-send-email-adhemerval.zanella@linaro.org> References: <1513019223-7603-1-git-send-email-adhemerval.zanella@linaro.org> From: Adhemerval Zanella This patch adds the s390 modifications required for the BZ#12683 fix. It basically adds the required ucontext_get_pc function. The built cancelable syscall wrapper for s390 using GCC 7.2.1 and default configuration flags shows the wrappers on expected corrected places: --- __GI___syscall_cancel_arch: .LFB39: .cfi_startproc stm %r6,%r15,24(%r15) .cfi_offset 6, -72 .cfi_offset 7, -68 .cfi_offset 8, -64 .cfi_offset 9, -60 .cfi_offset 10, -56 .cfi_offset 11, -52 .cfi_offset 12, -48 .cfi_offset 13, -44 .cfi_offset 14, -40 .cfi_offset 15, -36 ahi %r15,-96 .cfi_def_cfa_offset 192 .global __syscall_cancel_arch_start .type __syscall_cancel_arch_start,@function __syscall_cancel_arch_start: l %r0,0(%r2) tml %r0,4 jne .L5 lr %r1,%r3 lr %r2,%r4 lr %r3,%r5 lr %r4,%r6 l %r5,192(%r15) l %r6,196(%r15) l %r7,200(%r15) svc 0 .global __syscall_cancel_arch_end .type __syscall_cancel_arch_end,@function __syscall_cancel_arch_end: l %r4,152(%r15) lm %r6,%r15,120(%r15) .cfi_remember_state .cfi_restore 15 .cfi_restore 14 .cfi_restore 13 .cfi_restore 12 .cfi_restore 11 .cfi_restore 10 .cfi_restore 9 .cfi_restore 8 .cfi_restore 7 .cfi_restore 6 .cfi_def_cfa_offset 96 br %r4 .L5: .cfi_restore_state brasl %r14,__syscall_do_cancel .cfi_endproc --- The s390x version also shows similar placement: --- __GI___syscall_cancel_arch: .cfi_startproc stmg %r6,%r15,48(%r15) .cfi_offset 6, -112 .cfi_offset 7, -104 .cfi_offset 8, -96 .cfi_offset 9, -88 .cfi_offset 10, -80 .cfi_offset 11, -72 .cfi_offset 12, -64 .cfi_offset 13, -56 .cfi_offset 14, -48 .cfi_offset 15, -40 aghi %r15,-160 .cfi_def_cfa_offset 320 .global __syscall_cancel_arch_start .type __syscall_cancel_arch_start,@function __syscall_cancel_arch_start: l %r0,0(%r2) tmll %r0,4 jne .L5 lgr %r1,%r3 lgr %r2,%r4 lgr %r3,%r5 lgr %r4,%r6 lg %r5,320(%r15) lg %r6,328(%r15) lg %r7,336(%r15) svc 0 .global __syscall_cancel_arch_end .type __syscall_cancel_arch_end,@function __syscall_cancel_arch_end: lg %r4,272(%r15) lmg %r6,%r15,208(%r15) .cfi_remember_state .cfi_restore 15 .cfi_restore 14 .cfi_restore 13 .cfi_restore 12 .cfi_restore 11 .cfi_restore 10 .cfi_restore 9 .cfi_restore 8 .cfi_restore 7 .cfi_restore 6 .cfi_def_cfa_offset 160 br %r4 .L5: .cfi_restore_state brasl %r14,__syscall_do_cancel .cfi_endproc --- Checked with a s390-linux-gnu and s390x-linux-gnu build with run-tests-built=no. * sysdeps/unix/sysv/linux/s390/sigcontextinfo.h (ucontext_get_pc): New function. --- ChangeLog | 3 +++ sysdeps/unix/sysv/linux/s390/sigcontextinfo.h | 17 +++++++++++++++++ 2 files changed, 20 insertions(+) -- 2.7.4 diff --git a/sysdeps/unix/sysv/linux/s390/sigcontextinfo.h b/sysdeps/unix/sysv/linux/s390/sigcontextinfo.h index 90ead3f..676a8bd 100644 --- a/sysdeps/unix/sysv/linux/s390/sigcontextinfo.h +++ b/sysdeps/unix/sysv/linux/s390/sigcontextinfo.h @@ -16,7 +16,11 @@ License along with the GNU C Library; if not, see . */ +#ifndef _SIGCONTEXTINFO_H +#define _SIGCONTEXTINFO_H + #include +#include #define SIGCONTEXT struct sigcontext * #define SIGCONTEXT_EXTRA_ARGS @@ -25,3 +29,16 @@ #define GET_STACK(ctx) ((void *)((ctx)->sregs->regs.gprs[15])) #define CALL_SIGHANDLER(handler, signo, ctx) \ (handler)((signo), SIGCONTEXT_EXTRA_ARGS (ctx)) + +static inline uintptr_t +ucontext_get_pc (const ucontext_t *uc) +{ +#ifdef __s390x__ + return uc->uc_mcontext.psw.addr; +#else + /* We have 31bit addresses, remove bit 0. */ + return uc->uc_mcontext.psw.addr & 0x7FFFFFFF; +#endif +} + +#endif From patchwork Mon Dec 11 19:06:54 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella X-Patchwork-Id: 121447 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp3169078qgn; Mon, 11 Dec 2017 11:09:44 -0800 (PST) X-Google-Smtp-Source: ACJfBouAsMoL34G/ziIfwRIL2sxEjYbJKr56ebUSmLyRT7CteMGORBj7BsgIZjrUjqGZl0Uzni6y X-Received: by 10.101.93.79 with SMTP id e15mr1153261pgt.157.1513019384067; Mon, 11 Dec 2017 11:09:44 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1513019384; cv=none; d=google.com; s=arc-20160816; b=xCp2trPMfN8ccvI+3jcwpmZj5lo8w8BQRB0DX1/jtHo/gfBPbJjx5zQ9bUKuhbOeHS jhRjMLmG/orQbAZmtgGU/lknHrIriElyTa37QwJMNLvgYQ2aSyBDv5f6InlBGpLVJXZE pseP/qZYvTtn3Cxx9zfouZNd3L7SWtOGiszaTj3Rt2tqxIvGzbDzUwpcMIA7ffMIVGJd 848+IuppXiO/rBXcSlh3EN1fG2HDlJETxmZaj2smIKowvdUjvE1zfZ4vf0uOvTTY9092 w4y0e+65Rq2G2qXKXjp7zL8SySOHk2BskyenKZb70UdrcrrhCPaJeGsJzawjnkXAkm5B fB1w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:to:from:delivered-to :sender:list-help:list-post:list-archive:list-subscribe :list-unsubscribe:list-id:precedence:mailing-list:dkim-signature :domainkey-signature:arc-authentication-results; bh=jGWXbBZweZPCLKNmK3QSueBU2WZ+JiAOoWEv0RLZlZc=; b=RcDhv8hrzE4RSG5lzWGzd/cDKFrQJpQQLgYY/a3HVy76cEY1wDLATjrrZFdIpEo9G5 zgt36KbOx3KERBVc0RnUq0LmxxAQNdhbj2LOaxlHDbgu5lfXSkTw6z6NUw7q8PwEQzJZ KvSQxGOOE44ydtVf1uobzQomwjDUietL19oPt5sV9SwP9Wzq/aY6IsxRyTVvJ9en07bD hnLYGJTHq4sboZEsHSDMey3lp+j4FOL9HZKHCI4Q4cbnjGe+2fAZ27QcFUAzqGEW9+d0 ZJ6aSzNvcl1HGeo/XoyrqnMNOMrbIJ5ODLGMfONbllT3egBHmLEJc5/VW4MzplI7J1wF a7SQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=FPkaTIQ5; spf=pass (google.com: domain of libc-alpha-return-88024-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88024-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id f68si11374281pfc.315.2017.12.11.11.09.43 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Dec 2017 11:09:44 -0800 (PST) Received-SPF: pass (google.com: domain of libc-alpha-return-88024-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=FPkaTIQ5; spf=pass (google.com: domain of libc-alpha-return-88024-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88024-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; q=dns; s=default; b=Xs/duKU7a+nk7I4nQ9yTdNLaOACr3qw xBBRTwbI9eC9WX8Jk2dT7PWOPmDUzRUHtS9T8gllT5s2kDt+ZvdJyCcFITweFnN1 y0XQ++LRDGcyfvyPDK9iQ8iuWJXV7/7ttM1S5TgIMUJnj4vI8RxttYO98jK0mTsB eK6yL9+ADNfc= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; s=default; bh=Glmga0qXj8GfyYrutsLa9Cvbqag=; b=FPkaT IQ59w91Uk3dDwPFt1LGs7p8vuNMEQJ7aSX3bdQc1POc+csS3l1w1e/GAs7y5xz2L tv1XscN/zbc0Epzib63kReTJVA77z/Fj3++abxGfpwbVwptpyXbRyJ2l9al4rgMC gc5pRnWgQSpR8ZkQxzNYcEsi3wo8DoFl1zPSIg= Received: (qmail 42016 invoked by alias); 11 Dec 2017 19:07:30 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 41986 invoked by uid 89); 11 Dec 2017 19:07:29 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.9 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=mmi, Different, renders, incur X-HELO: mail-qt0-f193.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=jGWXbBZweZPCLKNmK3QSueBU2WZ+JiAOoWEv0RLZlZc=; b=t20BbR9vkdu/f2293PPZQL6O9S1IMI+so78do+X5UyrNpiworL4loe+hDun4B9UwBQ xqNLCTUtHC4GKEmUnloidCqyIQtYiAzGrn3rCJ+u0MK4RVz1wzBu32ELfVQEST2FP4VY eMg8pyLr0YNq3kLUj1lLtV4EvRkTZwDdSB12gpLrEBjuhoNPmsqlTVCzNF9Bh7EWtiqG VADUJE7xDjG3KSb4h8TWe7YWJ4pcpejN7rmd7J28Ybz5qpxdBcg/4Gc2Td6+I8CSaHqb hTIKkKtrfpb6g3ASwPKtGm4TvnLLonxMwAwp6YhlXJV6C7yx2+HEwC2aZqQ+rQP/ATX/ EmfA== X-Gm-Message-State: AKGB3mJ5xLaHaM13Wzt3NwxszM1Jq2vK1ycJENc0mL3XPuXf/LIlT8wd RKYC4bFgPKD26RUMRmxT0CrB0d3i0fI= X-Received: by 10.237.53.2 with SMTP id a2mr1998891qte.5.1513019245334; Mon, 11 Dec 2017 11:07:25 -0800 (PST) From: Adhemerval Zanella To: libc-alpha@sourceware.org Subject: [PATCH 10/19] nptl: ia64: Fix Race conditions in pthread cancellation (BZ#12683) Date: Mon, 11 Dec 2017 17:06:54 -0200 Message-Id: <1513019223-7603-11-git-send-email-adhemerval.zanella@linaro.org> In-Reply-To: <1513019223-7603-1-git-send-email-adhemerval.zanella@linaro.org> References: <1513019223-7603-1-git-send-email-adhemerval.zanella@linaro.org> This patch adds the s390 modifications required for the BZ#12683. It basically adds the required ucontext_get_pc function. a workaround for mismatched sigcontext::sa_flags defiition between kernel and GLIBC (tracked by BZ#21634), and an arch specific syscall_cancel implementation. IA64 requires an arch-specific syscall_cancel implemetantion because {INLINE,INTERNAL}_SYSCALL is implemented by branching to a gate DSO (similar to i386) which renders the pointer comparison in SIGCANCEL handler wrong. This incurs in performance penalty due the use of a break instruction insteaf of a eds one, however cancellable syscalls should potentially incur in syscalls blocking. Checked with a ia64-linux-gnu build with run-tests-built=no. * sysdeps/unix/sysv/linux/ia64/sigcontextinfo.h (ucontext_get_pc, ucontext_get_mask): New functions. * sysdeps/unix/sysv/linux/ia64/syscall_cancel.S: New file. Signed-off-by: Adhemerval Zanella --- ChangeLog | 3 + sysdeps/unix/sysv/linux/ia64/sigcontextinfo.h | 24 +++++++ sysdeps/unix/sysv/linux/ia64/syscall_cancel.S | 94 +++++++++++++++++++++++++++ 3 files changed, 121 insertions(+) create mode 100644 sysdeps/unix/sysv/linux/ia64/syscall_cancel.S -- 2.7.4 diff --git a/sysdeps/unix/sysv/linux/ia64/sigcontextinfo.h b/sysdeps/unix/sysv/linux/ia64/sigcontextinfo.h index 37a6190..927cb3c 100644 --- a/sysdeps/unix/sysv/linux/ia64/sigcontextinfo.h +++ b/sysdeps/unix/sysv/linux/ia64/sigcontextinfo.h @@ -15,6 +15,11 @@ License along with the GNU C Library; if not, see . */ +#ifndef _SIGCONTEXTINFO_H +#define _SIGCONTEXTINFO_H + +#include + #define SIGCONTEXT siginfo_t *_si, struct sigcontext * #define SIGCONTEXT_EXTRA_ARGS _si, #define GET_PC(ctx) ((ctx)->sc_ip) @@ -23,3 +28,22 @@ #define CALL_SIGHANDLER(handler, signo, ctx) \ (handler)((signo), SIGCONTEXT_EXTRA_ARGS (ctx)) + +/* Different that other architectures, SPARC pass a sigcontext_t struct + in third argument for sa_sigaction handler with SA_SIGINFO. */ +static inline uintptr_t +ucontext_get_pc (const struct sigcontext *sigctx) +{ + return sigctx->sc_ip; +} + +static inline sigset_t * +ucontext_get_mask (const struct sigcontext *sigctx) +{ + /* IA64 sigcontext::sa_mask is a sigset_t since Linux 2.6.12 (initial + git repository build). */ + return (sigset_t *) &sigctx->sc_mask; +} +#define UCONTEXT_SIGMASK(ctx) ucontext_get_mask (ctx) + +#endif /* _SIGCONTEXTINFO_H */ diff --git a/sysdeps/unix/sysv/linux/ia64/syscall_cancel.S b/sysdeps/unix/sysv/linux/ia64/syscall_cancel.S new file mode 100644 index 0000000..9c6c9d3 --- /dev/null +++ b/sysdeps/unix/sysv/linux/ia64/syscall_cancel.S @@ -0,0 +1,94 @@ +/* Cancellable syscall wrapper. Linux/IA64 version. + Copyright (C) 2017 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 + . */ + +#include +#undef ret + +/* long int __syscall_cancel_arch (int *cancelhandling, long int nr, + long int arg1, long int arg2, long int arg3, + long int arg4, long int arg5, long int arg6) +*/ + +ENTRY (__syscall_cancel_arch) + .prologue 14, 40 + .mmi + .save ar.pfs, r41 + alloc r41 = ar.pfs, 8, 4, 8, 0 + .vframe r42 + mov r42 = r12 + .save rp, r40 + mov r40 = b0 + .body + ;; + + .global __syscall_cancel_arch_start + .type __syscall_cancel_arch_start,@function +__syscall_cancel_arch_start: + + ;; + .mmi + nop 0 + ld4.acq r14 = [r32] + nop 0 + ;; + .mib + nop 0 + tbit.z p6, p7 = r14, 2 + .pred.safe_across_calls p1-p63 + (p7) br.call.dpnt.many b0 = __syscall_do_cancel# + .pred.safe_across_calls p1-p5,p16-p63 + ;; + .mmi + mov r15 = r33 + mov r49 = r39 + mov r48 = r38 + .mmi + mov r47 = r37 + mov r46 = r36 + mov r45 = r35 + ;; + .mmi + nop 0 + mov r44 = r34 + nop 0 + ;; + break 0x100000 + ;; + + .global __syscall_cancel_arch_end + .type __syscall_cancel_arch_end,@function +__syscall_cancel_arch_end: + + ;; + .mmi + cmp.ne p6, p7 = -1, r10 + nop 0 + mov ar.pfs = r41 + ;; + .mmi + nop 0 + (p7) sub r8 = r0, r8 + mov b0 = r40 + .mmb + nop 0 + .restore sp + mov r12 = r42 + br.ret.sptk.many b0 + +END (__syscall_cancel_arch) +libc_hidden_def (__syscall_cancel_arch) From patchwork Mon Dec 11 19:06:55 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella X-Patchwork-Id: 121448 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp3169324qgn; Mon, 11 Dec 2017 11:09:58 -0800 (PST) X-Google-Smtp-Source: ACJfBouTlWj32dCoVWpHOrOPf0jf6fJDTToqu3Xbwbk2rT0sC1qUL/AYSge8Bd4JZgL5RQ/Xp7y9 X-Received: by 10.99.181.72 with SMTP id u8mr1205468pgo.118.1513019398635; Mon, 11 Dec 2017 11:09:58 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1513019398; cv=none; d=google.com; s=arc-20160816; b=LbFownxMsfj4APtY+RegyAN6SkrE/gohP3G5lUvInvkGbe2AdQceLWVdTR+TEZrHzJ oP5coPQlpsKvsXGp2JhNqOgdCcXaneAHj6PmuBgIrq0ve06GKgs1QSYQaMk9NTqrCPcD zua2GQsxiPm55W8RkLy0GbRTXoS+uLNPs2Y3V0lFWHJYXlla1bluR3t+cwCLErwZ5KK0 PwIRLqknvb9GowFAHkDwH+XBHKteqJXki697sGKMU2dgJP1Kmj5y2Lj8emH/YK4YWA9V 1JFCr3hivDN7kQgHmuPWsQyUjKWSGS/tZYRnMDvDeQAuA19BF08IZVTKa+bqE4imJRlK /aaA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:to:from:delivered-to :sender:list-help:list-post:list-archive:list-subscribe :list-unsubscribe:list-id:precedence:mailing-list:dkim-signature :domainkey-signature:arc-authentication-results; bh=xbYWbumA6kX8KYJKza5utUN/uiShIM9DdLlMXmBkjHY=; b=h41V5xeKQW5tnb1bVJbHRaLzK/EGe/ryY0uiTU43qkL+asQMRfKC0G2UYktpTLeU6R C1yQjEiDsBPDAlhYcgq4t3p47IQRACrHcqafBqugqWeeSd12CuwwTV5XvW4W8MsKw8TV tSUpIpmOl7Slkj1ye3HGu86027rleWSky0Y3vBAOlOqNNR0gLeUZX24qv/oeMaz3E7F3 v/HykQYz2uDitQmvE8E46wDyhV2WwtNMuToiqLUlSwv2aKlqKxU5GutUh20UaDunjm9i oMkoS5Pzb9gUBXJusS0/bMy78hM4+eOfJMuIa0t8KENtrbJVJ8XkSH/gRNPx/3xojdjV 5ZnQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=r1nS9arh; spf=pass (google.com: domain of libc-alpha-return-88025-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88025-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id v196si10138840pgb.825.2017.12.11.11.09.58 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Dec 2017 11:09:58 -0800 (PST) Received-SPF: pass (google.com: domain of libc-alpha-return-88025-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=r1nS9arh; spf=pass (google.com: domain of libc-alpha-return-88025-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88025-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; q=dns; s=default; b=DUfVg5dEKIkAK6YhiwZINLSRWcjdzr4 MeLXdJJOCDjwZJo3u3tE2q+COqfLdOCe3TjDFrebT28Yo5mlu36P4LC/bhwMbp7W usRB57KFNWnICNEJkImsiLikPzEUHUHEhL2M3IPJZVcuPi6zBHOsgGSZWrsu0Lio RDvXE8bZMggk= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; s=default; bh=FG/nfqmmhOaZOfJI9SzC4LjVYZQ=; b=r1nS9 arhbMlitRc4ut5IFrjcARU2se1sZNDJ3b9RhOg50txj2vhKJse4sYgElGIYgU5e9 QQ/hy1phw5xEOqjvxQVMSHx7u11FvoUZ0kz/ugteLGptbL1PqlxGTuSB1VNfxHio q1IuP+oDUodbwJswYTHKuHPRy/55y1y9KksCmg= Received: (qmail 42106 invoked by alias); 11 Dec 2017 19:07:30 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 42091 invoked by uid 89); 11 Dec 2017 19:07:30 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.9 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mail-qt0-f196.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=xbYWbumA6kX8KYJKza5utUN/uiShIM9DdLlMXmBkjHY=; b=Q/qBiW5R+hKKY5t+TdVklISInwXjZ8VwxlxptbSH7B8gk4fpEPiczvMVlTl5gRlkNB MTOiyX47rwTuGS56VwAljLzNNEMUwFlFiNU9rSqL7aRE9RHOkZYC7kb8KAMfecdJMxNt YXzD7z3nmHsgoaFXcklbn703tHHjkPcOQfSeb6du6PUmE4x3Y+g0zDYfo0vk05Lggw3Z rdJ0d30CA/EcUhgehyA2fK4Su53V8jwlihkoR4x3sLT8sqa7ZgT0R+0G23ww4cFJNCfV QLhbaOBtAIZTXYwFXdFwaM3ZNjzFXqXIgnaGQUmz2RfboQpmz97muMAvGrBPc8kBNC8+ pwgQ== X-Gm-Message-State: AKGB3mLtBSaF6njiP/FmgASyGZ6ZZs6uQO6Kxh/TccCOdoQZueANqRkj KU+F0i1gwfeKO+6Gvhri3ALSnUx4SqA= X-Received: by 10.237.34.202 with SMTP id q10mr2056751qtc.341.1513019246752; Mon, 11 Dec 2017 11:07:26 -0800 (PST) From: Adhemerval Zanella To: libc-alpha@sourceware.org Subject: [PATCH 11/19] nptl: alpha: Fix Race conditions in pthread cancellation (BZ#12683) Date: Mon, 11 Dec 2017 17:06:55 -0200 Message-Id: <1513019223-7603-12-git-send-email-adhemerval.zanella@linaro.org> In-Reply-To: <1513019223-7603-1-git-send-email-adhemerval.zanella@linaro.org> References: <1513019223-7603-1-git-send-email-adhemerval.zanella@linaro.org> This patch adds the alpha modifications required for the BZ#12683. It basically adds the required ucontext_get_pc function The default syscall_cancel.c should be fine for alpha and GCC 6.1 generates the following cod for syscall_cancel.os: --- 0000000000000000 <__GI___syscall_cancel_arch>: 0: 00 00 bb 27 ldah gp,0(t12) 4: 00 00 bd 23 lda gp,0(gp) 8: f0 ff de 23 lda sp,-16(sp) c: 00 04 f1 47 mov a1,v0 10: 00 00 5e b7 stq ra,0(sp) 0000000000000014 <__syscall_cancel_arch_start>: 14: 00 00 30 a0 ldl t0,0(a0) 18: 01 00 e1 43 sextl t0,t0 1c: 01 90 20 44 and t0,0x4,t0 20: 0f 00 20 f4 bne t0,60 <__syscall_cancel_arch_end+0x20> 24: 10 04 f2 47 mov a2,a0 28: 11 04 f3 47 mov a3,a1 2c: 12 04 f4 47 mov a4,a2 30: 10 00 9e a6 ldq a4,16(sp) 34: 13 04 f5 47 mov a5,a3 38: 18 00 be a6 ldq a5,24(sp) 3c: 83 00 00 00 callsys 0000000000000040 <__syscall_cancel_arch_end>: 40: 21 05 e0 43 negq v0,t0 44: 00 00 5e a7 ldq ra,0(sp) 48: c0 04 61 46 cmovne a3,t0,v0 4c: 10 00 de 23 lda sp,16(sp) 50: 01 80 fa 6b ret 54: 00 00 fe 2f unop 58: 1f 04 ff 47 nop 5c: 00 00 fe 2f unop 60: 00 00 7d a7 ldq t12,0(gp) 64: 00 40 5b 6b jsr ra,(t12),68 <__syscall_cancel_arch_end+0x28> 68: 1f 04 ff 47 nop 6c: 00 00 fe 2f unop --- Checked on alpha-linux-gnu, no regression found. * sysdeps/unix/sysv/linux/alpha/sigcontextinfo.h (ucontext_get_pc): New function. Signed-off-by: Adhemerval Zanella --- ChangeLog | 4 ++++ sysdeps/unix/sysv/linux/alpha/sigcontextinfo.h | 13 +++++++++++++ 2 files changed, 17 insertions(+) -- 2.7.4 diff --git a/sysdeps/unix/sysv/linux/alpha/sigcontextinfo.h b/sysdeps/unix/sysv/linux/alpha/sigcontextinfo.h index e8b74d5..a61c289 100644 --- a/sysdeps/unix/sysv/linux/alpha/sigcontextinfo.h +++ b/sysdeps/unix/sysv/linux/alpha/sigcontextinfo.h @@ -15,6 +15,11 @@ License along with the GNU C Library. If not, see . */ +#ifndef _SIGCONTEXTINFO_H +#define _SIGCONTEXTINFO_H + +#include + #define SIGCONTEXT int _code, struct sigcontext * #define SIGCONTEXT_EXTRA_ARGS _code, #define GET_PC(ctx) ((void *) (ctx)->sc_pc) @@ -22,3 +27,11 @@ #define GET_STACK(ctx) ((void *) (ctx)->sc_regs[30]) #define CALL_SIGHANDLER(handler, signo, ctx) \ (handler)((signo), SIGCONTEXT_EXTRA_ARGS (ctx)) + +static inline uintptr_t +ucontext_get_pc (const ucontext_t *uc) +{ + return uc->uc_mcontext.sc_pc; +} + +#endif /* _SIGCONTEXTINFO_H */ From patchwork Mon Dec 11 19:06:56 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella X-Patchwork-Id: 121449 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp3169546qgn; Mon, 11 Dec 2017 11:10:11 -0800 (PST) X-Google-Smtp-Source: ACJfBotNGMNlL6fF6k/MCFyRVjY4fBuOrd4GTsouBjFLnUtSP/RO6R9nsLAJgR7Cr5kOnG7fAkP9 X-Received: by 10.101.86.133 with SMTP id v5mr1172106pgs.266.1513019411426; Mon, 11 Dec 2017 11:10:11 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1513019411; cv=none; d=google.com; s=arc-20160816; b=0k8pfZr/5zlxBdOXR1IdCfB5CGagFAmQ5i3YcuRjJXSj6vMuYEIDyAn0jj0XvI7HBv TM0qFa8HUlJYlaSl+AEjYfvwRlkTJJMNSfdskAqDuLOTW4rUXlbJ86fYgacGIU0PTya/ ZkiobJlTKpbDwIKQga5DenuYiTTUT35rzSuxnE+mCA28pGKQqwVHwG9qoh4jsThvFazM GWEVCsjzYDicLDUfLkoCZo8nsMViAs2bE6CYUcFZ9op3ZKBN70Q8PCSlI+3lCQBasGBK romz/tb8QEFxgPcNyMg0nu4POau5TSXs1i6ExzIOBVg+ntXRlYMmn/1DlYsfTs+MZawC kLJg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:to:from:delivered-to :sender:list-help:list-post:list-archive:list-subscribe :list-unsubscribe:list-id:precedence:mailing-list:dkim-signature :domainkey-signature:arc-authentication-results; bh=k0dqthiKKxuPY/hquuMoUtutZDPpZFMFISHqnRApAWk=; b=ftyQ1ItP52HpcgVdTCgFxzLj0yhWdaZOczskIXDgZbP6EytCByjm76qQZuQQHw2NBl miB4qWMq6DJJxtp96oPVEpqi6pFocMksGUWs5i1JyHC0SxtTMWJCjBc0H0sUtPyR5S6Q eBQkLo96bLbmLe+vNEXz5FTuAYQRBKA8lDnqVmnfvbaJjA7XySddXthcHw+m3ltZlseJ VE5IeQqRDHr8YJc4ZdvLtT53/syImenq2QxzwKrYOkOu1W5M+lfKpwS92AQpGhLxYesZ UnnIgAdAkFw427hoPuDU6yGQqMuC5GZ1owUjdNaLQ2Do7nIAspUsWtbQCCT/YNAoN0zp K/oA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=yl2YfsHf; spf=pass (google.com: domain of libc-alpha-return-88026-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88026-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id h187si10167937pgc.561.2017.12.11.11.10.11 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Dec 2017 11:10:11 -0800 (PST) Received-SPF: pass (google.com: domain of libc-alpha-return-88026-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=yl2YfsHf; spf=pass (google.com: domain of libc-alpha-return-88026-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88026-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; q=dns; s=default; b=OLWLc1WscWIudby7zRv0uT0ZNN7I2p7 w9Esm4FRWKE52w0S/fl/ehliegVrf2bEZRBUafp41jQlpWUpqacmr15zrp6h2Pwm l5tk/+iAsBl32GmodaCLDS9ky9TPNTm1eSHMGigsu11iSlKDVuIKgDNf6qJVyuxm IRY0nOrqBfA4= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; s=default; bh=XCar8vNehOoirfxCRrnA+XfhOGs=; b=yl2Yf sHfolkMcgLDnvyoAFJjTprLg5JuR00yozA4Thyp/k67IUhgfcabVOY8f2ismzXH2 cZaCh33I3Cr72QgTTlo35zKSth56WA/7adXaHrasrCI0/vTH8m57F9KaUsSjTq+S RwVbdDQTiggqKoDQBwKBhlAwGQcTjfe6HCQvWM= Received: (qmail 42259 invoked by alias); 11 Dec 2017 19:07:31 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 42241 invoked by uid 89); 11 Dec 2017 19:07:31 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.9 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=rts X-HELO: mail-qt0-f195.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=k0dqthiKKxuPY/hquuMoUtutZDPpZFMFISHqnRApAWk=; b=JeqPhZwKTAERuzAzpCDPr1qRYShlEzfto8ZFmEFvd9GDq219L2Q7J9Rmq/uIAC+WQs /JuJsTVIt8ObPVmCuJUgqtN9Dl9tLCFypg8qnTX3KLJyRmEDeP01HsdI8NuooRXZ/D7G NwuqKacMtYAxOALKObubmlbASP/gDagzQxh8lsPQP7kRwWtMQJ/RYkiLCxuTPuVEXEH2 YCOckZYiKb+RN5dJk7ZbymBRFlmJlW2lfNrfG10o8kE4DU2zpwRdNkDXA0dQlmMZwS/J ABWQIVR78Qwerqu/IKELgYBLNrdsdzBgx7BSxKpczXzNelxBgrQkZxdrIFhh+kw6mwK9 /RtQ== X-Gm-Message-State: AKGB3mLIByLi0W85bXmAryouIkkXXBB6CSOpXhZYXMhaqFgBwhXGLtMr UqUHwxyqQtm15NVo0z6ff9Aa/K4I6K4= X-Received: by 10.55.16.80 with SMTP id a77mr1983206qkh.250.1513019248186; Mon, 11 Dec 2017 11:07:28 -0800 (PST) From: Adhemerval Zanella To: libc-alpha@sourceware.org Subject: [PATCH 12/19] nptl: m68k: Fix Race conditions in pthread cancellation (BZ#12683) Date: Mon, 11 Dec 2017 17:06:56 -0200 Message-Id: <1513019223-7603-13-git-send-email-adhemerval.zanella@linaro.org> In-Reply-To: <1513019223-7603-1-git-send-email-adhemerval.zanella@linaro.org> References: <1513019223-7603-1-git-send-email-adhemerval.zanella@linaro.org> This patch adds the m68k modifications required for the BZ#12683. It basically adds the required ucontext_get_pc function The default syscall_cancel.c should is as expected for m68k with GCC 6.2.1. It generates the following code for syscall_cancel.os: --- 00000000 <__GI___syscall_cancel_arch>: 0: 4e56 0000 linkw %fp,#0 4: 48e7 3c00 moveml %d2-%d5,%sp@- 00000008 <__syscall_cancel_arch_start>: 8: 206e 0008 moveal %fp@(8),%a0 c: 2010 movel %a0@,%d0 e: 0800 0002 btst #2,%d0 12: 6628 bnes 3c <__syscall_cancel_arch_end+0xa> 14: 206e 0024 moveal %fp@(36),%a0 18: 2a2e 0020 movel %fp@(32),%d5 1c: 282e 001c movel %fp@(28),%d4 20: 262e 0018 movel %fp@(24),%d3 24: 242e 0014 movel %fp@(20),%d2 28: 222e 0010 movel %fp@(16),%d1 2c: 202e 000c movel %fp@(12),%d0 30: 4e40 trap #0 00000032 <__syscall_cancel_arch_end>: 32: 4cee 003c fff0 moveml %fp@(-16),%d2-%d5 38: 4e5e unlk %fp 3a: 4e75 rts 3c: 61ff 0000 0000 bsrl 3e <__syscall_cancel_arch_end+0xc> --- Checked against a build and make check run-built-tests=no for m68k-linux-gnu. * sysdeps/unix/sysv/linux/m68k/sigcontextinfo.h (ucontext_get_pc): New function. Signed-off-by: Adhemerval Zanella --- ChangeLog | 3 +++ sysdeps/unix/sysv/linux/m68k/sigcontextinfo.h | 13 +++++++++++++ 2 files changed, 16 insertions(+) -- 2.7.4 diff --git a/sysdeps/unix/sysv/linux/m68k/sigcontextinfo.h b/sysdeps/unix/sysv/linux/m68k/sigcontextinfo.h index 3c43e55..f39009f 100644 --- a/sysdeps/unix/sysv/linux/m68k/sigcontextinfo.h +++ b/sysdeps/unix/sysv/linux/m68k/sigcontextinfo.h @@ -16,6 +16,11 @@ License along with the GNU C Library. If not, see . */ +#ifndef _SIGCONTEXTINFO_H +#define _SIGCONTEXTINFO_H + +#include + #define SIGCONTEXT int _code, struct sigcontext * #define SIGCONTEXT_EXTRA_ARGS _code, #define GET_PC(ctx) ((void *) (ctx)->sc_pc) @@ -23,3 +28,11 @@ #define GET_STACK(ctx) ((void *) (ctx)->sc_usp) #define CALL_SIGHANDLER(handler, signo, ctx) \ (handler)((signo), SIGCONTEXT_EXTRA_ARGS (ctx)) + +static inline uintptr_t +ucontext_get_pc (const ucontext_t *uc) +{ + return uc->uc_mcontext.gregs[R_PC]; +} + +#endif /* _SIGCONTEXTINFO_H */ From patchwork Mon Dec 11 19:06:57 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella X-Patchwork-Id: 121450 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp3169757qgn; Mon, 11 Dec 2017 11:10:23 -0800 (PST) X-Google-Smtp-Source: ACJfBotySwrheanW9xZ8kOK5PJS2MSb3pxaHdTiASqdeX99yQu/BCXdpfi7oVbpZ3PKNdbIctZYL X-Received: by 10.84.246.140 with SMTP id m12mr1324823pll.74.1513019423545; Mon, 11 Dec 2017 11:10:23 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1513019423; cv=none; d=google.com; s=arc-20160816; b=StFPiGx5/ZolxZQMqIbO01da0mA9uaxH1ngSm++EK5/hnDrKcECJiApftsw/dbySqC rqmYK1SuA7mwLlHrhjrU4fMmby5F3so3jrJWhTJCIM6oXPq/wVpgKu9bX27Mp0qjtKD+ mDxXeDrukfixsKFaNfTqRUzEYPffwdX+e1EE/KTEb3F5sum78VVD6SB3e2r4bSQIBNZw XlaHuR70GK1IxFAj4SL9Pc4WREZwgOymdtEN2ek/Af4meAHti4L/Ru6SygazhkU9PWKV 0w1arQvnzNO2UHiw/a6bh/Mkq3f8SfgofVxEGhwi44sJ7/Z6iEtfUCVJU0GGiB7xLmta RVUA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:to:from:delivered-to :sender:list-help:list-post:list-archive:list-subscribe :list-unsubscribe:list-id:precedence:mailing-list:dkim-signature :domainkey-signature:arc-authentication-results; bh=5fazUPsSgIOWb37B7JQqreRsk9dmR3gz0IzIGgly+c0=; b=qrCxwOUontjgdtgl6Ytln++/inN+c+y4cK1oVZYjGIR2+DVre5n9JMkM+tlAxRPbh6 0Upy9SQUXPvCU+p+lcU4oVUPv6fLD9tiWV+l/ORbJ7+gNhdpL2nrkIykHH/J/dCKWEQ/ t86GqggMJe0LSDo5fevPUaDJtffxOIHOHQJa4XWFlMKmI9rvRGUjqde/D+h9B5aOuZQs M3jk+CUBLnMdvaNQVzdNpckl4f/HY+0OzRDtZTg0v1A1b0BoS293UiQjKkPnTqYR7If7 Q7PkJj41hYdgHuesE1TrN0Z60for6S9RHOYAqo5Axq/7gg9ipo9x/uuJMFJSolQvmEvC ApYw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=GUdHS37Y; spf=pass (google.com: domain of libc-alpha-return-88027-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88027-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id d12si3744771plr.775.2017.12.11.11.10.23 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Dec 2017 11:10:23 -0800 (PST) Received-SPF: pass (google.com: domain of libc-alpha-return-88027-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=GUdHS37Y; spf=pass (google.com: domain of libc-alpha-return-88027-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88027-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; q=dns; s=default; b=GxIPOWmw/GVsoDiY6yk6Jfsi5SqPNMY 3VQx2FEoW6VT2ibB7oxwMdaxu7ZNoE2QwcTmmA4tXhgCOVR1QiRpKHBvkDN8cOVT E4gmP3a/OoRsK8TMGRRlcfeypwL5KWlBRcGveWRNa78EUZUO6jMCAmV2Nmeac3wH miEe0/KpY0oM= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; s=default; bh=GG8GNuhn1eBGnVR14TI4+2BNEKk=; b=GUdHS 37Y3mTWw2TkHaWZ6G/5stIFiPtZTbO1CmSf87nLOSddHC+/D9kjfasZn0Mokestu soJiLsueI6AVhEInHSF3ih2XNPX0a+0XuA0AQ5fseb/yVLP0VMSJk9sdYhH/Qekg bm9nBEsqLtRYVU4KOOljeoOxBvVidHjiVqsqQ8= Received: (qmail 42414 invoked by alias); 11 Dec 2017 19:07:33 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 42383 invoked by uid 89); 11 Dec 2017 19:07:33 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.9 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mail-qt0-f196.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=5fazUPsSgIOWb37B7JQqreRsk9dmR3gz0IzIGgly+c0=; b=UiHFA7zhUE6k2HY+xOyBhtwW9AvZAeA1INDujXOSalmwr1zaZVmAbLyAiRn32n5GB6 FSdl2p5E/lP4YL3mgvk3DESpyXLilBURjA/ZwX7Q9MZ63rQ+jHUah0zDNRRjnYbKg8Jh PTOffE2TH0VTbKTxAnF7syHNDvghMFmkUP5NV+S3Y6YVD9QIZrFMA2iXbeOoS79CXdbU wuJgbHFmp8One1djWXO23B2lxUX5/6g8t/X9KZFVqAKrJFaJaeSJXLdoDLMVvQQIr84S dMZX8dur8kcgV2XLNVaeHE6sVirbPZFU4uuyyZmNPpxY1AS2KFM3u1Axf96/eXSAOBAQ TmJQ== X-Gm-Message-State: AKGB3mJsuxPYpDj94mK1niRyverL+A6uyMzOwB1dK7sTYXZiMrqfhSNB rP4bCLzRkBa2f23jPMNplJ1+NcqyMn0= X-Received: by 10.55.4.136 with SMTP id 130mr1924892qke.203.1513019249723; Mon, 11 Dec 2017 11:07:29 -0800 (PST) From: Adhemerval Zanella To: libc-alpha@sourceware.org Subject: [PATCH 13/19] nptl: microblaze: Fix Race conditions in pthread cancellation (BZ#12683) Date: Mon, 11 Dec 2017 17:06:57 -0200 Message-Id: <1513019223-7603-14-git-send-email-adhemerval.zanella@linaro.org> In-Reply-To: <1513019223-7603-1-git-send-email-adhemerval.zanella@linaro.org> References: <1513019223-7603-1-git-send-email-adhemerval.zanella@linaro.org> This patch adds the microblaze modifications required for the BZ#12683. It basically adds the required ucontext_get_pc function. Microblaze requires an arch specific assembly implementation because the archicture INTERNAL_SYSCALL_NCS implementation adds a nop after the brki instruction because the instruction expect a delay branch slot. I based this implementation on generated assembly using GCC 6.1. Checked against a build and make check run-built-tests=no for microblaze-linux-gnu. * sysdeps/unix/sysv/linux/microblaze/syscall_cancel.S: New file. * sysdeps/unix/sysv/linux/microblaze/sigcontextinfo.h (ucontext_get_pc): New function. Signed-off-by: Adhemerval Zanella --- ChangeLog | 4 ++ .../unix/sysv/linux/microblaze/sigcontextinfo.h | 13 +++++ .../unix/sysv/linux/microblaze/syscall_cancel.S | 62 ++++++++++++++++++++++ 3 files changed, 79 insertions(+) create mode 100644 sysdeps/unix/sysv/linux/microblaze/syscall_cancel.S -- 2.7.4 diff --git a/sysdeps/unix/sysv/linux/microblaze/sigcontextinfo.h b/sysdeps/unix/sysv/linux/microblaze/sigcontextinfo.h index 145b3cb..1708937 100644 --- a/sysdeps/unix/sysv/linux/microblaze/sigcontextinfo.h +++ b/sysdeps/unix/sysv/linux/microblaze/sigcontextinfo.h @@ -16,6 +16,11 @@ License along with the GNU C Library; if not, see . */ +#ifndef _SIGCONTEXTINFO_H +#define _SIGCONTEXTINFO_H + +#include + #define SIGCONTEXT int _code, ucontext_t * #define SIGCONTEXT_EXTRA_ARGS _code, #define GET_PC(ctx) ((void *) (ctx)->uc_mcontext.regs.pc) @@ -23,3 +28,11 @@ #define GET_STACK(ctx) ((void *) (ctx)->uc_mcontext.regs.sp) #define CALL_SIGHANDLER(handler, signo, ctx) \ (handler)((signo), SIGCONTEXT_EXTRA_ARGS (ctx)) + +static inline uintptr_t +ucontext_get_pc (const ucontext_t *uc) +{ + return uc->uc_mcontext.regs.pc; +} + +#endif /* _SIGCONTEXTINFO_H */ diff --git a/sysdeps/unix/sysv/linux/microblaze/syscall_cancel.S b/sysdeps/unix/sysv/linux/microblaze/syscall_cancel.S new file mode 100644 index 0000000..d892362 --- /dev/null +++ b/sysdeps/unix/sysv/linux/microblaze/syscall_cancel.S @@ -0,0 +1,62 @@ +/* Cancellable syscall wrapper. Linux/microblaze version. + Copyright (C) 2017 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 + . */ + +#include + +/* long int __syscall_cancel_arch (int *cancelhandling, + long int nr, + long int arg1, + long int arg2, + long int arg3, + long int arg4, + long int arg5, + long int arg6) */ + +ENTRY (__syscall_cancel_arch) + + .globl __syscall_cancel_arch_start +__syscall_cancel_arch_start: + + lwi r3,r5,0 + andi r3,r3,4 #and1 + bneid r3,1f + addk r12,r6,r0 + + addk r5,r7,r0 + addk r6,r8,r0 + addk r7,r9,r0 + addk r8,r10,r0 + lwi r9,r1,56 + lwi r10,r1,60 + brki r14,8 + + .globl __syscall_cancel_arch_end +__syscall_cancel_arch_end: + + nop + lwi r15,r1,0 + rtsd r15,8 + addik r1,r1,28 + +1: + brlid r15, __syscall_do_cancel + nop + +END (__syscall_cancel_arch) +libc_hidden_def (__syscall_cancel_arch) + From patchwork Mon Dec 11 19:06:58 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella X-Patchwork-Id: 121451 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp3169937qgn; Mon, 11 Dec 2017 11:10:32 -0800 (PST) X-Google-Smtp-Source: ACJfBosmRXVL7YYQpenxoIThWN2I72tCpbJDwT6EJ1ROHpdpxgvmpL9vMP95xcC8GoYc8SKuNdUY X-Received: by 10.84.128.229 with SMTP id a92mr1287196pla.71.1513019432868; Mon, 11 Dec 2017 11:10:32 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1513019432; cv=none; d=google.com; s=arc-20160816; b=iRBdr45PPBI4t8PQ62LgSCJOWoVSbUBG/6GmcPkNK32uOL2BRR6oab4Iyem+J1NKHL 9L9cYMeEQgkRq9z93Hb777YR2HwlTI3tkZ4HNCkF+isK67Ir0Jf6p4JYGhjs/vuAVpB5 WcfOIElu23gN7ynJ8eEoxFWGyPISYawsqQ3XnZHtH6Gtk/CO+PXTmlsN0vO3zY9xoqp+ XTq1kkv2o64EXMhw8n0YWlk4ZgNOz7KrH/o/uROf4eyA9860mMdl6EXa0xUeCh3baZWq cnZ1R5HQNDn7Aw+kiYIxVE2wgbNdgkVIpVv6tXFBVCZjFLPQ+fYZ7YXP1vFywWqn7oox oDig== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:to:from:delivered-to :sender:list-help:list-post:list-archive:list-subscribe :list-unsubscribe:list-id:precedence:mailing-list:dkim-signature :domainkey-signature:arc-authentication-results; bh=aITh5FjZLR851RM2dC9BPOOCfI4N36CTxskUwOpn3aU=; b=r9+xxClC9PrL8em5pKXsimQMgHvSAr3dMKEvxgBNGT0BaLnBclImng5pK2rASXbvU9 uOD9JJBy3HbFMyJD630DK5dpwyDekuRbRWmzCoI35DkDX6mIoJIiLaQTp0kgiz5P1V3P pk4ZvKmkNSRasFOCD4fmQb19fg4iOjlG06hulYBaw5augmG9s/SSeI1ozSDFPfhP+7jq KbDTFpvT8LsybMRjZ4+LvoxzwRTBKemIjGwf011mJ0mvKn3E4uGeXYwLuCT0afh7XF3g 9XOobUAhKbaP1Cpx4bcP95OtfixAPHI/SJdA49tVQvI56R/49pdeV49bX8av8kL/DHns 5krg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=q/AXOcYh; spf=pass (google.com: domain of libc-alpha-return-88028-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88028-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id o5si11525726pfj.28.2017.12.11.11.10.32 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Dec 2017 11:10:32 -0800 (PST) Received-SPF: pass (google.com: domain of libc-alpha-return-88028-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=q/AXOcYh; spf=pass (google.com: domain of libc-alpha-return-88028-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88028-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; q=dns; s=default; b=iMyIZb6bYgkAuS5N0/jLRupL6hwzRPd +EeAvimf3blgECxeWYu2Ro8jpAcyeO3xWWXL3sdopOfJ5tqK1meQfHJ3sTSoGirm d7jubRb8vCiNg09RBVd/ASNB6TsWeBu4m0nd6/9q565Yh0SY5+CCkAsGsyLRMYTM j8jTuXI49kNE= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; s=default; bh=mit3Yb/7bjBXNSg1LGguRB0OApE=; b=q/AXO cYhX0qXXF6wabN0hO0Lnl5IDRJF7HgLGsfC0yE0/TkynGEQ+IhWiN1ECCOi+BMxP t0AZqu9+PpEuia1xB7cLyeeIt7X+L0uZxZlIcauoRqMrQ3eRGblGdLcb4z8Ul2Wg Bv7TvfskkVj7wUhb+uvTox/iZdY9yZRrkhkcug= Received: (qmail 42560 invoked by alias); 11 Dec 2017 19:07:35 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 42538 invoked by uid 89); 11 Dec 2017 19:07:34 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.9 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mail-qt0-f193.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=aITh5FjZLR851RM2dC9BPOOCfI4N36CTxskUwOpn3aU=; b=WUMkDJSxxjINzAyTD/5Y9oy3JYAKEpmE2q6U2Lq+eT2JHEP5bNpVO4+i7/t6IZ6A0h dtXkL8HLoBuK4lz8tHEfFRBqFAnwvWvjsIwIXHyhmZGx6tBdC/rIbFyXbq4e7oww7vIJ SHHGHl6IWq9AJPrjEpNwqLShqRRiTUvLWL2Gm3KsjlXb1PpfKLNGB/R6yMamm0rV/U/o RrgJu2wlENJHFp3GMNqEzJgnXT9K2xz2RCK6saNf6oGVctrLrT19GvcvFpJt/fYsxKeV x1a4x7S15RsveZc7q8+kpbv4mE/81XJJsOSsemeXAeBTM9CGnc4W+v6scHPo5PoSaYdC XW8w== X-Gm-Message-State: AKGB3mJoIp+0Q8kDoIAzegABLHbp0FelUo8f1LUEGNHmuXcd03I+b+5b hDVR9RGen1iDDeLeMPLBLKv26LgPb4I= X-Received: by 10.55.19.19 with SMTP id d19mr1816371qkh.189.1513019251131; Mon, 11 Dec 2017 11:07:31 -0800 (PST) From: Adhemerval Zanella To: libc-alpha@sourceware.org Subject: [PATCH 14/19] nptl: tile: Fix Race conditions in pthread cancellation (BZ#12683) Date: Mon, 11 Dec 2017 17:06:58 -0200 Message-Id: <1513019223-7603-15-git-send-email-adhemerval.zanella@linaro.org> In-Reply-To: <1513019223-7603-1-git-send-email-adhemerval.zanella@linaro.org> References: <1513019223-7603-1-git-send-email-adhemerval.zanella@linaro.org> This patch adds the tile modifications required for the BZ#12683. It basically adds the required ucontext_get_pc function The default syscall_cancel.c should be as expected for TILE. With GCC 6.1 syscall_cancel.c generates the following code: * TILEGX 0000000000000000 <__GI___syscall_cancel_arch>: 0: c7bf46ce576bfd9d { move r29, sp ; addi r28, sp, -24 ; st sp, lr } 8: 283bf825401e0db6 { addi sp, sp, -32 ; move r10, r1 } 10: eeedf85b85c18d9b { addi r27, sp, 24 ; move lr, r2 ; st r28, r29 } 18: eef5f88155bbf0c1 { move r1, r3 ; move r2, r4 ; st r27, r30 } 20: 283bf8c25107f143 { move r3, r5 ; move r4, r6 } 28: 283bf8e2d1483000 { move r5, r7 } 0000000000000030 <__syscall_cancel_arch_start>: 30: 9c5e4000340c3000 { ld4s r11, r0 } 38: 18182165d1483000 { andi r11, r11, 4 } 40: 17c00163d1483000 { bnez r11, 78 <__syscall_cancel_arch_end+0x20> } 48: 283bfee051483000 { move r0, lr } 50: 286b180051485000 { swint1 } 0000000000000058 <__syscall_cancel_arch_end>: 58: 180906ced1401ff7 { subx lr, zero, r1 ; addi r29, sp, 32 } 60: 87b8c6ce4dd77040 { cmovnez r0, r1, lr ; addi r28, sp, 24 ; ld lr, r29 } 68: 9ef6400035cc3000 { ld r30, r28 } 70: 286a6ee040120db6 { addi sp, sp, 32 ; jrp lr } 78: 2000000051483000 { jal 78 <__syscall_cancel_arch_end+0x20> } * TILEGX32 00000000 <__GI___syscall_cancel_arch>: 0: cbbfc6ce576bfd9d { move r29, sp ; addxi r28, sp, -8 ; st sp, lr } 8: 283bf825402f0db6 { addxi sp, sp, -16 ; move r10, r1 } 10: eeedf860d5cbf0b7 { move lr, r2 ; move r1, r3 ; st r28, r29 } 18: 283bf8a1d107f102 { move r2, r4 ; move r3, r5 } 20: 283bf8e2d107f184 { move r4, r6 ; move r5, r7 } 00000028 <__syscall_cancel_arch_start>: 28: 9c5e4000340c3000 { ld4s r11, r0 } 30: 18182165d1483000 { andi r11, r11, 4 } 38: 17c0016351483000 { bnez r11, 68 <__syscall_cancel_arch_end+0x18> } 40: 283bfee051483000 { move r0, lr } 48: 286b180051485000 { swint1 } 00000050 <__syscall_cancel_arch_end>: 50: 28660fe540210d9d { addxi r29, sp, 16 ; subx r10, zero, r1 } 58: 9fbe40004dd4a040 { cmovnez r0, r1, r10 ; ld lr, r29 } 60: 286a6ee040210db6 { addxi sp, sp, 16 ; jrp lr } 68: 2000000051483000 { jal 68 <__syscall_cancel_arch_end+0x18> } * TILEPRO 00000000 <__GI___syscall_cancel_arch>: 0: bfdfa6ce1b7bfd9d { move r29, sp ; addi r28, sp, -12 ; sw sp, lr } 8: 0833f825403f0db6 { addi sp, sp, -16 ; move r10, r1 } 10: 9f75f85bc9d0cd9b { addi r27, sp, 12 ; move lr, r2 ; sw r28, r29 } 18: 9f6df8811debf0c1 { move r1, r3 ; move r2, r4 ; sw r27, r30 } 20: 0833f8c200cff143 { move r3, r5 ; move r4, r6 } 28: 0833f8e2f0165000 { move r5, r7 } 00000030 <__syscall_cancel_arch_start>: 30: dc05080068ba5000 { lw r11, r0 } 38: 30202165f0165000 { andi r11, r11, 4 } 40: 2800396170165000 { bnz r11, 78 <__syscall_cancel_arch_end+0x20> } 48: 0833fee070165000 { move r0, lr } 50: 400b980070166000 { swint1 } 00000058 <__syscall_cancel_arch_end>: 58: 301886ce81741ff7 { sub lr, zero, r1 ; addi r29, sp, 16 } 60: bc7066ce17777040 { mvnz r0, r1, lr ; addi r28, sp, 12 ; lw lr, r29 } 68: dc75080069ea5000 { lw r30, r28 } 70: 081606e040310db6 { addi sp, sp, 16 ; jrp lr } 78: 6000000070165000 { jal 78 <__syscall_cancel_arch_end+0x20> } Checked against a build and make check run-built-tests=no for tile-linux-gnu. * sysdeps/unix/sysv/linux/tile/sigcontextinfo.h (ucontext_get_pc): New function. Signed-off-by: Adhemerval Zanella --- ChangeLog | 3 +++ sysdeps/unix/sysv/linux/tile/sigcontextinfo.h | 12 ++++++++++++ 2 files changed, 15 insertions(+) -- 2.7.4 diff --git a/sysdeps/unix/sysv/linux/tile/sigcontextinfo.h b/sysdeps/unix/sysv/linux/tile/sigcontextinfo.h index bad81e4..043ac75 100644 --- a/sysdeps/unix/sysv/linux/tile/sigcontextinfo.h +++ b/sysdeps/unix/sysv/linux/tile/sigcontextinfo.h @@ -16,6 +16,10 @@ License along with the GNU C Library. If not, see . */ +#ifndef _SIGCONTEXTINFO_H +#define _SIGCONTEXTINFO_H + +#include #include #define SIGCONTEXT siginfo_t *_si, ucontext_t * @@ -25,3 +29,11 @@ #define GET_STACK(ctx) ((void *) (long) ctx->uc_mcontext.sp) #define CALL_SIGHANDLER(handler, signo, ctx) \ (handler)((signo), SIGCONTEXT_EXTRA_ARGS (ctx)) + +static inline uintptr_t +ucontext_get_pc (const ucontext_t *uc) +{ + return uc->uc_mcontext.pc; +} + +#endif /* _SIGCONTEXTINFO_H */ From patchwork Mon Dec 11 19:06:59 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella X-Patchwork-Id: 121453 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp3170251qgn; Mon, 11 Dec 2017 11:10:49 -0800 (PST) X-Google-Smtp-Source: ACJfBovnXsVle+gjzuFqYa/JVedytood5X7/yS44RQry0Ri2ViXw6uwqthkeTDNRUIMV2mOUUfVx X-Received: by 10.99.113.30 with SMTP id m30mr1167278pgc.338.1513019449810; Mon, 11 Dec 2017 11:10:49 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1513019449; cv=none; d=google.com; s=arc-20160816; b=MLJLbjObwNH9gE8aUW+lfJumVVQaxLurC4ozxonIax3VN6RfTt9nWTSH6F23U8y8+Y d6LB/pCUfZA1t0zVlqj7dRgh5+l/Lwaho3QcTub/takX6wSqFwBhue3eVamj/Rzgaurx u3tMCUUVstyZHJ8O/g3N3RcQy5I3QaNjI0kZlDUwqDAQSXf8B75rOUGNCv3pjYyYIDlZ eeK3CSviu/0KD+VlbZys7UOQK4tmmkFZ6Iw8O12+WTGb7HRuWbi0O+vUJ4F3zr6CW9Hl NeFMv4OiJ4Qv6pZFVcDHVupaWxgVyXCa/HSalbd3VXFt44Q2MCz5ePB7UuZChCp2neNy MKIQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:to:from:delivered-to :sender:list-help:list-post:list-archive:list-subscribe :list-unsubscribe:list-id:precedence:mailing-list:dkim-signature :domainkey-signature:arc-authentication-results; bh=heQivUo4VLmG5JIoUHZMi8lzTVUfI4dCjAxjx9yyf7E=; b=B5Y7VTi/tF4n6gWJi+9hBkgdIexx6oiid8iplm+M8d2l6FBUAXzfLXL4jJn0QgUH41 B3s6W4NLIMxIb7HKNKXQGcRLTtd5npyF1Q2hW8dNOnehDCQfsxtUEkbLJF//5jK4oNYj sQXNvCClZJP5F3rMmf1A3WukFRn3lVaRuahChsmzmvMZFSAzA6Rx6C54cols/WyljihB psilfYjM83B2/zZYq9FxqfNFTMUrfkrquGKSqfzOsOSh17lgu5bx6PREwUCBk4MLBLzJ MQUiIn2nWAdhKtQNu8OZ469HwhMNYx3sYd9oihI4tX7hBvQC1Vaojwj3ZAe6N+NzGh0A Flww== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=ShBGN2xi; spf=pass (google.com: domain of libc-alpha-return-88030-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88030-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id n1si10348022pld.591.2017.12.11.11.10.49 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Dec 2017 11:10:49 -0800 (PST) Received-SPF: pass (google.com: domain of libc-alpha-return-88030-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=ShBGN2xi; spf=pass (google.com: domain of libc-alpha-return-88030-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88030-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; q=dns; s=default; b=yC7NzUU6+ZhLzdme9jnIzuhwrXzufZM cL2b9DxM9SfOFeq/97CdWV+keqv5U7bEYEkxpeQ7KAZ7WwUKMcmgqJIHZYjfnZ6c NHPXm29niFIHkv5sFPDZFjN4XNDIO6+Fa7MaPhWsVbt8xCxMkTadCfEXijOEM9yd IqaR5h2kX+dU= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; s=default; bh=GfdPKYLipFoVueBRzLHv8Uce/gU=; b=ShBGN 2xiT91PmJl+Us1m2Wt7SE1VxyVENYIs9KY59vm2TIQYt/HDaygyeo2jfSX84QnjT SDNVJzNO/cyBIeE8RRxF4w5DYg9Xqjl+0EFYKDxaCROYNQKnjtkVfE80Khv38ZPO ZavPXlV0S2mJeBbpsrpq210I11GQS7dsfx09p4= Received: (qmail 42843 invoked by alias); 11 Dec 2017 19:07:38 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 42764 invoked by uid 89); 11 Dec 2017 19:07:37 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.9 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=sk:advance, xcc X-HELO: mail-qt0-f195.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=heQivUo4VLmG5JIoUHZMi8lzTVUfI4dCjAxjx9yyf7E=; b=GXItU9wboXSSR7XvvbcgVkd2+RTCKIkRuLNTrEari3Wel7+4NF0TmQrDCorVlzvKko s9Jz+kWOUELN+Axh2DSx31gM7SOWCxrjrzYnAQll0lgviuDH1Ll2Y4tWHafthskEUfbR PWJG/su3pVZEdnbpi353Ku1Z0qN5J+LarkTC8SU9ZwSgVJFNzhFdP4VJFO5eTY/9pkVr VnmKc1lZJTJuPfL6l3GruWt4i1GhXXCSAPHxmjgR/k4D1MOS+3WeP5kzQSEKgoJ10QdE iCKjt/0EvVSUKCuzmQZEvaJOr38Djias0kUvvCeXLZ3Wb3PcInph+jV7s62Bk4P/bmhD jFSw== X-Gm-Message-State: AKGB3mIItszMaRH8loEwulADMV5yPGBBMvSEtN7VfRg9hjP/B56cX/mq 7U6fWlGVxCL8PlfpxphnD0dg427gbhk= X-Received: by 10.55.145.135 with SMTP id t129mr1869795qkd.205.1513019252607; Mon, 11 Dec 2017 11:07:32 -0800 (PST) From: Adhemerval Zanella To: libc-alpha@sourceware.org Subject: [PATCH 15/19] nptl: sparc: Fix Race conditions in pthread cancellation (BZ#12683) Date: Mon, 11 Dec 2017 17:06:59 -0200 Message-Id: <1513019223-7603-16-git-send-email-adhemerval.zanella@linaro.org> In-Reply-To: <1513019223-7603-1-git-send-email-adhemerval.zanella@linaro.org> References: <1513019223-7603-1-git-send-email-adhemerval.zanella@linaro.org> This patch adds the sparc modifications required for the BZ#12683. It basically adds the required ucontext_get_pc function, cancellable syscall wrappers, and a fix for pause. Sparc requires arch-specific syscall_cancel implementation because INLINE_SYSCALL_NCS uses the __SYSCALL_STRING (defined different for sparc32 and sparc64) and it issues additional instructions after the syscall one to check the resulting error code. When used in the default syscall_cancel.c implementation the label __syscall_cancel_arch_end is not placed just after the syscall as expected. Both 32 and 64 bits version were based on default C version built with GCC 6.1. Also, different than other architectures, SPARC passes the sigcontext_t struct pointer as third argument in the signal handler set with SA_SIGINFO (some info at [1]) for 64 bits and the pt_regs in 32 bits. >From Linux code: * arch/sparc/kernel/signal_64.c 428 /* 3. signal handler back-trampoline and parameters */ 429 regs->u_regs[UREG_FP] = ((unsigned long) sf) - STACK_BIAS; 430 regs->u_regs[UREG_I0] = ksig->sig; 431 regs->u_regs[UREG_I1] = (unsigned long) &sf->info; 432 433 /* The sigcontext is passed in this way because of how it 434 * is defined in GLIBC's /usr/include/bits/sigcontext.h 435 * for sparc64. It includes the 128 bytes of siginfo_t. 436 */ 437 regs->u_regs[UREG_I2] = (unsigned long) &sf->info; * arch/sparc/kernel/signal_32.c: 392 regs->u_regs[UREG_FP] = (unsigned long) sf; 393 regs->u_regs[UREG_I0] = ksig->sig; 394 regs->u_regs[UREG_I1] = (unsigned long) &sf->info; 395 regs->u_regs[UREG_I2] = (unsigned long) &sf->regs; 396 397 regs->pc = (unsigned long) ksig->ka.sa.sa_handler; 398 regs->npc = (regs->pc + 4); So to access the signal mask in the signal frame, a arch-specific ucontext_get_mask is defined which obtain the sa_mask from the context. Checked on a SPARC T5 for sparc64-linux-gnu and sparcv9-linux-gnu. * sysdeps/unix/sysv/linux/sparc/sparc32/sigcontextinfo.h (ucontext_get_pc): New function. * sysdeps/unix/sysv/linux/sparc/sparc64/sigcontextinfo.h (ucontext_get_pc): Likewise. * sysdeps/unix/sysv/linux/sparc/sparc32/syscall_cancel.S: New file. * sysdeps/unix/sysv/linux/sparc/sparc64/syscall_cancel.S: Likwise. * sysdeps/unix/sysv/linux/sparc/sparc64/pause.c: New file. [1] https://www.spinics.net/lists/sparclinux/msg05037.html Signed-off-by: Adhemerval Zanella --- ChangeLog | 8 +++ sysdeps/unix/sysv/linux/sparc/lowlevellock.h | 2 +- .../unix/sysv/linux/sparc/sparc32/sigcontextinfo.h | 52 +++++++++++++++ .../unix/sysv/linux/sparc/sparc32/syscall_cancel.S | 74 ++++++++++++++++++++++ sysdeps/unix/sysv/linux/sparc/sparc64/pause.c | 25 ++++++++ .../unix/sysv/linux/sparc/sparc64/sigcontextinfo.h | 40 ++++++++++++ .../unix/sysv/linux/sparc/sparc64/syscall_cancel.S | 74 ++++++++++++++++++++++ 7 files changed, 274 insertions(+), 1 deletion(-) create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc32/syscall_cancel.S create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/pause.c create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/syscall_cancel.S -- 2.7.4 diff --git a/sysdeps/unix/sysv/linux/sparc/lowlevellock.h b/sysdeps/unix/sysv/linux/sparc/lowlevellock.h index e36fde6..98ccaa1 100644 --- a/sysdeps/unix/sysv/linux/sparc/lowlevellock.h +++ b/sysdeps/unix/sysv/linux/sparc/lowlevellock.h @@ -117,7 +117,7 @@ __lll_timedlock (int *futex, const struct timespec *abstime, int private) { \ __typeof (tid) __tid; \ while ((__tid = (tid)) != 0) \ - lll_futex_wait (&(tid), __tid, LLL_SHARED); \ + lll_futex_wait_cancel (&(tid), __tid, LLL_SHARED); \ } \ while (0) diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/sigcontextinfo.h b/sysdeps/unix/sysv/linux/sparc/sparc32/sigcontextinfo.h index 99cf6ab..25db049 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/sigcontextinfo.h +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/sigcontextinfo.h @@ -16,6 +16,11 @@ License along with the GNU C Library; if not, see . */ +#ifndef _SIGCONTEXTINFO_H +#define _SIGCONTEXTINFO_H + +#include + #define SIGCONTEXT struct sigcontext * #define SIGCONTEXT_EXTRA_ARGS #define GET_PC(__ctx) ((void *) ((__ctx)->si_regs.pc)) @@ -29,3 +34,50 @@ #define GET_FRAME(__ctx) ADVANCE_STACK_FRAME (GET_STACK(__ctx)) #define CALL_SIGHANDLER(handler, signo, ctx) \ (handler)((signo), SIGCONTEXT_EXTRA_ARGS (ctx)) + +/* Different that other architectures, SPARC32 pass a pt_regs (or pt_regs32 + in 32 bits compat mode) struct pointer as third argument for sa_sigaction + handler with SA_SIGINFO. + + Also current sparc32 rt signal frame layout is: + + field | size + ---------------------------------------| ---- + struct rt_signal_frame { | + struct sparc_stackf ss; | 96 + siginfo_t info; | 128 + struct pt_regs regs; | 80 + sigset_t mask; | 128 + __siginfo_fpu_t __user *fpu_save; | 4 + unsigned int insns[2]; | 8 + stack_t stack; | 12 + unsigned int extra_size; | 4 + __siginfo_rwin_t __user *rwin_save; | 4 + }; + + So to obtain a pointer to signal mask based on address of pt_regs + we need to add 208. */ + +struct pt_regs32 +{ + unsigned int psr; + unsigned int pc; + unsigned int npc; + unsigned int y; + unsigned int u_regs[16]; +}; + +static inline uintptr_t +ucontext_get_pc (struct pt_regs32 *regs) +{ + return regs->pc; +} + +static inline sigset_t * +ucontext_get_mask (const void *ctx) +{ + return (sigset_t *)((uintptr_t)ctx + 208); +} +#define UCONTEXT_SIGMASK(ctx) ucontext_get_mask (ctx) + +#endif /* _SIGCONTEXTINFO_H */ diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/syscall_cancel.S b/sysdeps/unix/sysv/linux/sparc/sparc32/syscall_cancel.S new file mode 100644 index 0000000..c06f9d1 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/syscall_cancel.S @@ -0,0 +1,74 @@ +/* Cancellable syscall wrapper. Linux/sparc32 version. + Copyright (C) 2017 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 + . */ + +#include + +/* long int __syscall_cancel_arch (int *cancelhandling, + long int nr, + long int arg1, + long int arg2, + long int arg3, + long int arg4, + long int arg5, + long int arg6) */ + +ENTRY (__syscall_cancel_arch) + save %sp, -104, %sp + + cfi_window_save + cfi_register (15, 31) + cfi_def_cfa_register (30) + + .globl __syscall_cancel_arch_start +__syscall_cancel_arch_start: + + /* if (*cancelhandling & CANCELED_BITMASK) + __syscall_do_cancel() */ + ld [%i0], %g2 + andcc %g2, 4, %g0 + bne,pn %icc, 2f + + /* Issue a 6 argument syscall. */ + mov %i1, %g1 + mov %i2, %o0 + mov %i3, %o1 + mov %i4, %o2 + mov %i5, %o3 + ld [%fp+92], %o4 + ld [%fp+96], %o5 + ta 0x10 + + .globl __syscall_cancel_arch_end +__syscall_cancel_arch_end: + bcc 1f + mov 0,%g1 + sub %g0, %o0, %o0 + mov 1, %g1 + +1: + mov %o0, %i0 + return %i7+8 + nop + +2: + call __syscall_do_cancel, 0 + nop + nop + +END (__syscall_cancel_arch) +libc_hidden_def (__syscall_cancel_arch) diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/pause.c b/sysdeps/unix/sysv/linux/sparc/sparc64/pause.c new file mode 100644 index 0000000..4a0cf4d --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/pause.c @@ -0,0 +1,25 @@ +/* Linux pause syscall implementation. Linux/sparc64. + Copyright (C) 2017 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 + . */ + +#include + +/* On sparc interrupted pause syscall returns with a PC indicating a + side-effect and this deviates from other architectures. Fall back to + ppool implementation. */ +#undef __NR_pause +#include diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/sigcontextinfo.h b/sysdeps/unix/sysv/linux/sparc/sparc64/sigcontextinfo.h index ba53b4a..836ba01 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/sigcontextinfo.h +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/sigcontextinfo.h @@ -16,6 +16,11 @@ License along with the GNU C Library; if not, see . */ +#ifndef _SIGCONTEXTINFO_H +#define _SIGCONTEXTINFO_H + +#include + #ifndef STACK_BIAS #define STACK_BIAS 2047 #endif @@ -29,3 +34,38 @@ #define GET_FRAME(__ctx) ADVANCE_STACK_FRAME (GET_STACK (__ctx)) #define CALL_SIGHANDLER(handler, signo, ctx) \ (handler)((signo), SIGCONTEXT_EXTRA_ARGS (ctx)) + +/* Different that other architectures, SPARC64 pass a sigcontext_t struct + pointer in third argument for sa_sigaction handler with SA_SIGINFO. + + Also current sparc64 rt signal frame layout is: + + field | size + ---------------------------------------| ---- + struct rt_signal_frame { | + struct sparc_stackf ss; | 192 + siginfo_t info; | 128 + struct pt_regs regs; | 160 + __siginfo_fpu_t __user *fpu_save; | 8 + stack_t stack; | 24 + sigset_t mask; | 128 + __siginfo_rwin_t *rwin_save; | 8 + }; + + So to obtain a pointer to signal mask based on address of info + we need to add 320. */ + +static inline uintptr_t +ucontext_get_pc (const struct sigcontext *sigctx) +{ + return sigctx->sigc_regs.tpc; +} + +static inline sigset_t * +ucontext_get_mask (const void *ctx) +{ + return (sigset_t *)((uintptr_t)ctx + 320); +} +#define UCONTEXT_SIGMASK(ctx) ucontext_get_mask (ctx) + +#endif /* _SIGCONTEXTINFO_H */ diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/syscall_cancel.S b/sysdeps/unix/sysv/linux/sparc/sparc64/syscall_cancel.S new file mode 100644 index 0000000..f3eef78 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/syscall_cancel.S @@ -0,0 +1,74 @@ +/* Cancellable syscall wrapper. Linux/sparc64 version. + Copyright (C) 2017 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 + . */ + +#include + +/* long int __syscall_cancel_arch (int *cancelhandling, + long int nr, + long int arg1, + long int arg2, + long int arg3, + long int arg4, + long int arg5, + long int arg6) */ + +ENTRY (__syscall_cancel_arch) + save %sp, -176, %sp + + cfi_window_save + cfi_register (15, 31) + cfi_def_cfa_register (30) + + .globl __syscall_cancel_arch_start +__syscall_cancel_arch_start: + + /* if (*cancelhandling & CANCELED_BITMASK) + __syscall_do_cancel() */ + lduw [%i0], %g1 + andcc %g1, 4, %g0 + bne,pn %xcc, 2f + + /* Issue a 6 argument syscall. */ + mov %i1, %g1 + mov %i2, %o0 + mov %i3, %o1 + mov %i4, %o2 + mov %i5, %o3 + ldx [%fp + STACK_BIAS + 176], %o4 + ldx [%fp + STACK_BIAS + 184], %o5 + ta 0x6d + + .global __syscall_cancel_arch_end +__syscall_cancel_arch_end: + + bcc,pt %xcc, 1f + mov 0, %g1 + sub %g0, %o0, %o0 + mov 1, %g1 +1: + mov %o0, %i0 + return %i7+8 + nop + +2: + call __syscall_do_cancel, 0 + nop + nop + +END (__syscall_cancel_arch) +libc_hidden_def (__syscall_cancel_arch) From patchwork Mon Dec 11 19:07:00 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella X-Patchwork-Id: 121452 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp3170085qgn; Mon, 11 Dec 2017 11:10:40 -0800 (PST) X-Google-Smtp-Source: ACJfBov2X94nbfXcVVSzyucZYM6UMiTH3g6Ng26KvRcFLLVnHNUD1RlqYnE38fepd2iiTGshJIX6 X-Received: by 10.84.213.144 with SMTP id g16mr1273685pli.339.1513019440835; Mon, 11 Dec 2017 11:10:40 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1513019440; cv=none; d=google.com; s=arc-20160816; b=oQb7gIA7hwyTDOAPU4Wm4tqBtyYNhiXf3UcCPc2D2xrGJiKHPqEJxMsgWoWL/eyDwD 3EnwWL5gbbMy5jhBguS20w9AnNgEQ226sYgErL7H3v2g/KhaXrGIS1fQd2r6fyB8h9Xm EXy5tnUwzCbt2sdHYW8Ve47NfcLZ7tZUs4Zyy6RR8INeWt1VxX6Kk6IzmABB+mOiz9nB 1oAEgL4PmEv/374QLXy8Gngktl8hwURTQcn2MRJdQRC3g4wo/+0tKvIKSR1B2/2BM17Q zefmxmXnA+7pPuvb6KoV5LRB/uQ31iScQ22aT/T9bX1Z8m9/uv8Al5+WrcQUzJC65muu KpWw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:to:from:delivered-to :sender:list-help:list-post:list-archive:list-subscribe :list-unsubscribe:list-id:precedence:mailing-list:dkim-signature :domainkey-signature:arc-authentication-results; bh=7PgEL57awyVKGWgql6fFXSY5SXhXxnCYSawkCnQ5G5w=; b=oQMik+wXFdTIs68q8Qg4MraWtai/D+9iKvYTLHa8TFMU6lXoBd6Zw/vvtPBuiQi7O/ /hRVZzTj1GE1bvAp2PWmcqbak2wo6vkqjYU0Tk/j/FoFCjMnWWeVpNhi7wQpU3CWaPYJ mL9+e6PGrmYsPngYjw0JGwh2WmIubA5q5fo7yRg5VfTE3KEyX4Fp+CzggVzohfKrlG6q j1UzAhNJcT4YvsZhUTMbCeGEiDnXC7rSrvYs2Xl5NChdoeSCuq944HwsslhvX/8JVsrt J3rNyaZvV19lM9MI3p3+7RpP0/KwY78354bwA+T6xQpsc3olT7ODWlt0sGgd4nKF0t25 5pxw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=lTjDAnW8; spf=pass (google.com: domain of libc-alpha-return-88029-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88029-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id w24si9389706plq.159.2017.12.11.11.10.40 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Dec 2017 11:10:40 -0800 (PST) Received-SPF: pass (google.com: domain of libc-alpha-return-88029-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=lTjDAnW8; spf=pass (google.com: domain of libc-alpha-return-88029-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88029-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; q=dns; s=default; b=rtdG7vssDLdccUyTMNPptka6JhMMvZ4 cXH5qTWbuQ36LCgaAAZOMbVXQpKh4Ylh1KORlA17dLBqd1n/MgYSung0eBOd6lED BMyHtuV8Q2pT1/cqGM7WkXiZrCVwAJAGrwcB+o1AIO532Qo0BzFUpXR4Q/ln0vEh Az9bVj6WOr+M= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; s=default; bh=eDPP5lw4KC16fUH49Qx++vvyYaI=; b=lTjDA nW8nINTq/x69QbOIR1NsG508Y/StSdt9DAcdvepcNY10SMi1EniLPT8iiYzH69Fv 6a/UloUHWfEI+mAn9TAjRNzLolCGF66VW9HcFDBzv8pNvYzWw5J1tiepXdFMWtFT 2r6/Q0TxnEPDTqZr4F7a72jG1hIZ4OCEk0gNAw= Received: (qmail 42790 invoked by alias); 11 Dec 2017 19:07:38 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 42768 invoked by uid 89); 11 Dec 2017 19:07:37 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.9 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=nios, r2, 0 X-HELO: mail-qt0-f193.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=7PgEL57awyVKGWgql6fFXSY5SXhXxnCYSawkCnQ5G5w=; b=GQWyrS5TdJL2MENVNNF3KmfnjysP3eLC26C2UN4d9t2xzSR2A44awykeATIrUS5Vad Knc+TSopH+d2PN/MzTuoKQ9gKU9hVGIfK75UxQw8a9/df9V+pSoRSGHB2W1diJmj5qh8 hvTiuRgoe98Z9LP3pU6g6qAyp7xlbyD7kPMz/LN7joJHRLHhfnMY2U8jFcP4ZAynJdrr eFTHvkhnSeHawc1uESPXaV3mUPQboxmQ19f5/DuVKjymADeaSlr0BKJURRL8Ih5yPRW7 2YKvsGq60xUkex/OEYgxTuxSt2zJ4J0AQ+Klm/xCKUB8UmOwe7PYwhUjjTperRf4dUaC SnWA== X-Gm-Message-State: AKGB3mJzbenlPTZCiDkf7KvMPSRyuhrQdKmWRgtnc6Y3AlFNuGJNCB2S dsAtBiOdKWqN8prAzTpzBvnAEIfnJXM= X-Received: by 10.237.33.248 with SMTP id m53mr2013216qtc.39.1513019254534; Mon, 11 Dec 2017 11:07:34 -0800 (PST) From: Adhemerval Zanella To: libc-alpha@sourceware.org Subject: [PATCH 16/19] nptl: nios2: Fix Race conditions in pthread cancellation (BZ#12683) Date: Mon, 11 Dec 2017 17:07:00 -0200 Message-Id: <1513019223-7603-17-git-send-email-adhemerval.zanella@linaro.org> In-Reply-To: <1513019223-7603-1-git-send-email-adhemerval.zanella@linaro.org> References: <1513019223-7603-1-git-send-email-adhemerval.zanella@linaro.org> This patch adds the nios2 modifications required for the BZ#12683. It basically adds the required ucontext_get_pc function. The default syscall_cancel.c should be as expected for NIOS2. With GCC 6.2.1 syscall_cancel.c generates the following code: --- 00000000 <__GI___syscall_cancel_arch>: 0: defffe04 addi sp,sp,-8 4: dd800015 stw r22,0(sp) 8: 002ce03a nextpc r22 c: 02000034 movhi r8,0 10: 42000004 addi r8,r8,0 14: dfc00115 stw ra,4(sp) 18: b22d883a add r22,r22,r8 0000001c <__syscall_cancel_arch_start>: 1c: 20c00017 ldw r3,0(r4) 20: 18c0010c andi r3,r3,4 24: 18000f1e bne r3,zero,64 <__syscall_cancel_arch_end+0x18> 28: 3015883a mov r10,r6 2c: 2805883a mov r2,r5 30: da400517 ldw r9,20(sp) 34: 380b883a mov r5,r7 38: da000417 ldw r8,16(sp) 3c: d9c00317 ldw r7,12(sp) 40: d9800217 ldw r6,8(sp) 44: 5009883a mov r4,r10 48: 003b683a trap 0 0000004c <__syscall_cancel_arch_end>: 4c: 38000126 beq r7,zero,54 <__syscall_cancel_arch_end+0x8> 50: 0085c83a sub r2,zero,r2 54: dfc00117 ldw ra,4(sp) 58: dd800017 ldw r22,0(sp) 5c: dec00204 addi sp,sp,8 60: f800283a ret 64: b0800017 ldw r2,0(r22) 68: 103ee83a callr r2 --- Checked against a build and make check run-built-tests=no for nios2-linux-gnu. * sysdeps/unix/sysv/linux/nios2/sigcontextinfo.h (ucontext_get_pc): New function. Signed-off-by: Adhemerval Zanella --- ChangeLog | 3 +++ sysdeps/unix/sysv/linux/nios2/sigcontextinfo.h | 16 ++++++++++++++++ 2 files changed, 19 insertions(+) -- 2.7.4 diff --git a/sysdeps/unix/sysv/linux/nios2/sigcontextinfo.h b/sysdeps/unix/sysv/linux/nios2/sigcontextinfo.h index b244478..1fba6cd 100644 --- a/sysdeps/unix/sysv/linux/nios2/sigcontextinfo.h +++ b/sysdeps/unix/sysv/linux/nios2/sigcontextinfo.h @@ -16,6 +16,11 @@ License along with the GNU C Library; if not, see . */ +#ifndef _SIGCONTEXTINFO_H +#define _SIGCONTEXTINFO_H + +#include + #include #include "kernel-features.h" @@ -33,3 +38,14 @@ (act)->sa_flags |= SA_SIGINFO; \ (sigaction) (sig, act, oact); \ }) + +static inline uintptr_t +ucontext_get_pc (const ucontext_t *uc) +{ + /* rt_restore_ucontext (arch/nios/kernel/signal.c) sets this position + to 'ea' register which is stated as exception return address (pc) + at arch/nios2/include/asm/ptrace.h. */ + return uc->uc_mcontext.regs[27]; +} + +#endif /* _SIGCONTEXTINFO_H */ From patchwork Mon Dec 11 19:07:01 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella X-Patchwork-Id: 121454 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp3170429qgn; Mon, 11 Dec 2017 11:11:00 -0800 (PST) X-Google-Smtp-Source: ACJfBou8jf3d8pVolVTj9tR67rHGWzJtCWkHjQNXx8NjaKSc9YA0NlSO3M52kKqFx7/nsNkET8Ke X-Received: by 10.98.87.142 with SMTP id i14mr1313880pfj.212.1513019460487; Mon, 11 Dec 2017 11:11:00 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1513019460; cv=none; d=google.com; s=arc-20160816; b=nZORAPlqka0Ovkw3BjICTaTMQ1+3Ll1h0zxSIeg7LbqcI8bTGf8lkobz0UpfSKOPVq zfhB0kyHMugXR9zi2yXa+5zTZirzfuO2iNMIeZluhwRAOOWCuonGIw4BhP8iA92E2m8Z UJHRnrPJ2w9A7elex/3Cf1pbGJmQ5BoYgSaq1VxHlT1x8vNv0H+ulvKgCpkfz4I+h4IN bbeughyGRIsGZwrqXI80VvBfSdfVNaqKJvu2JnOALJuzkcCFDavxY67o1iG+sIhRnyX6 mW2EvBQzpyereGkcjMIPDaFb8ijjNncVRE2OPmMpWXxd2Qk+wQcbEr8VHdeOUg672a6e QIfA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:to:from:delivered-to :sender:list-help:list-post:list-archive:list-subscribe :list-unsubscribe:list-id:precedence:mailing-list:dkim-signature :domainkey-signature:arc-authentication-results; bh=LuUi+moPndPT4N7Zk4+fgNS7AH0XNQzu4dhDSpxK7r4=; b=PUYvH7TaP31us78d+Iq60sijox5rJJxhXM1SbR9NITH3sj8YRxGWBbI8hFr2E67a7v HDCSfisvI0PgQlPqL2dX0Cdmi1Vmvx0UvE+srI+iouScyi81m966/cU8SUNI/GH86wkp DsmRf7Xoz63ZcuE4wacpOZJAzKH1rsTBjaWI4uA3IBlx1bDIaBzKApRp1CeBiKCaq7In YVi1HwRvT64k8XVJNgRVLA2IPsDaLsyV5iUtaiLtxmu4QygDnRUSXj8yExdobG1YKNqd zKITD6vR82MjU1voU0zBc4SHwv/+6kCpMiMWDviZgdmmDru+N70TG5I9nSc/wKVrnB7w OV9Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=Cew4XbY6; spf=pass (google.com: domain of libc-alpha-return-88031-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88031-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id l59si10327765plb.743.2017.12.11.11.11.00 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Dec 2017 11:11:00 -0800 (PST) Received-SPF: pass (google.com: domain of libc-alpha-return-88031-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=Cew4XbY6; spf=pass (google.com: domain of libc-alpha-return-88031-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88031-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; q=dns; s=default; b=cSbmHuPv70tNbHI/kw585lF3kpPc4yB xK13XwxWwcu5pMx0sTRg1pDKGLown8qMgdAWIUAd9yF7f+ffFLdZ2taMhJU6zNVS dmAEc2NdahA3BrJxzLO3mmsoalLHyKbgQiRVCO0ys6+LVWbeXPcoobIRU5Ybi+ZH SxI4bwL/6NaE= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; s=default; bh=Rbc2DlgLIN3dng+vNcC3h6PoObk=; b=Cew4X bY6Bfs3+5BTmrtgvE80TUd+vc/zMyqUORpvdoxCYT+ygLA18zwBc+N3pCOEbRX0q 74XLQeT8YPmuIxpaRraMwKrAkKAMNUMMdKwVKd6H4n5TlEtjWBJT8Fsvdfs01bFd HacVDep160xI0I39mMSueuZ6pNDlV6hMVhRZjs= Received: (qmail 43032 invoked by alias); 11 Dec 2017 19:07:40 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 42987 invoked by uid 89); 11 Dec 2017 19:07:39 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.9 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mail-qt0-f193.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=LuUi+moPndPT4N7Zk4+fgNS7AH0XNQzu4dhDSpxK7r4=; b=mhxPqkDj69rXwC+YoYvh+zpFlFwdlz+utNHkphug32zkHSa0Q2t2Ml9KQxK2zIaMx1 U+Q/0vFpgxHzhFw8mORriZs0deWdPne0q6K/cA0kamybGIGkaUWEEpdc/i/fYCIFYl0b 12a1IR5yR+rXa/3y5iS8lMgAJt+MMSZR4K/+HMg+hRToMu/8j56yOZ78KQntpFepAEyX X9+Arp21nGG04a7e8P2vIJbf1avDqCyi8x//QwKWMAC7VbwJIZGZ8fG0LUeDS4vsTe3k pICqLCMHOt0f6a0ROq1fF3YZrlunPsgQsiKb49z4ieFz6CtRQZEena6heb49jMs40ccy iv4g== X-Gm-Message-State: AKGB3mIznT1iSWqlScfjIw5mplcoLgN7a0JH0iUh6GR5qxqULtsu7qPy Io8/8GhhJ7kVjBJ6WzKyhV69gbLP34w= X-Received: by 10.200.57.133 with SMTP id v5mr2088962qte.30.1513019255906; Mon, 11 Dec 2017 11:07:35 -0800 (PST) From: Adhemerval Zanella To: libc-alpha@sourceware.org Subject: [PATCH 17/19] nptl: sh: Fix Race conditions in pthread cancellation (BZ#12683) Date: Mon, 11 Dec 2017 17:07:01 -0200 Message-Id: <1513019223-7603-18-git-send-email-adhemerval.zanella@linaro.org> In-Reply-To: <1513019223-7603-1-git-send-email-adhemerval.zanella@linaro.org> References: <1513019223-7603-1-git-send-email-adhemerval.zanella@linaro.org> This patch adds the sh modifications required for the BZ#12683. It basically adds the required ucontext_get_pc function and a cancellable syscall wrapper. SH requires an arch-specific syscall_cancel because the INTERNAL_SYSCALL_NCS adds the required or instruction to workaround a hardware bug [1]. The implementation were based on on default C version built with GCC 6.2.1. Checked against a build and make check run-built-tests=no for sh4-linux-gnu. * sysdeps/unix/sysv/linux/sh/syscall_cancel.S: New file. * sysdeps/unix/sysv/linux/sh/sigcontextinfo.h (ucontext_get_pc): New function. [1] http://documentation.renesas.com/eng/products/mpumcu/tu/tnsh7456ae.pdf Signed-off-by: Adhemerval Zanella --- ChangeLog | 5 ++ sysdeps/sh/sysdep.h | 1 + sysdeps/unix/sysv/linux/sh/sigcontextinfo.h | 11 +++ sysdeps/unix/sysv/linux/sh/syscall_cancel.S | 125 ++++++++++++++++++++++++++++ 4 files changed, 142 insertions(+) create mode 100644 sysdeps/unix/sysv/linux/sh/syscall_cancel.S -- 2.7.4 diff --git a/sysdeps/sh/sysdep.h b/sysdeps/sh/sysdep.h index 939c931..4208da9 100644 --- a/sysdeps/sh/sysdep.h +++ b/sysdeps/sh/sysdep.h @@ -24,6 +24,7 @@ #define ALIGNARG(log2) log2 #define ASM_SIZE_DIRECTIVE(name) .size name,.-name +#define L(label) .L##label #ifdef SHARED #define PLTJMP(_x) _x##@PLT diff --git a/sysdeps/unix/sysv/linux/sh/sigcontextinfo.h b/sysdeps/unix/sysv/linux/sh/sigcontextinfo.h index 546f23b..3520286 100644 --- a/sysdeps/unix/sysv/linux/sh/sigcontextinfo.h +++ b/sysdeps/unix/sysv/linux/sh/sigcontextinfo.h @@ -16,6 +16,9 @@ License along with the GNU C Library; if not, see . */ +#ifndef _SIGCONTEXTINFO_H +#define _SIGCONTEXTINFO_H + #define SIGCONTEXT int _a2, int _a3, int _a4, struct sigcontext #define SIGCONTEXT_EXTRA_ARGS _a2, _a3, _a4, @@ -24,3 +27,11 @@ #define GET_STACK(ctx) ((void *) ctx.sc_regs[15]) #define CALL_SIGHANDLER(handler, signo, ctx) \ (handler)((signo), SIGCONTEXT_EXTRA_ARGS (ctx)) + +static inline uintptr_t +ucontext_get_pc (const ucontext_t *uc) +{ + return uc->uc_mcontext.pc; +} + +#endif /* _SIGCONTEXTINFO_H */ diff --git a/sysdeps/unix/sysv/linux/sh/syscall_cancel.S b/sysdeps/unix/sysv/linux/sh/syscall_cancel.S new file mode 100644 index 0000000..02a050d --- /dev/null +++ b/sysdeps/unix/sysv/linux/sh/syscall_cancel.S @@ -0,0 +1,125 @@ +/* Cancellable syscall wrapper. Linux/sh version. + Copyright (C) 2017 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 + . */ + +#include + +/* long int __syscall_cancel_arch (int *cancelhandling, + long int nr, + long int arg1, + long int arg2, + long int arg3, + long int arg4, + long int arg5, + long int arg6) */ + +ENTRY (__syscall_cancel_arch) + +#ifdef SHARED + mov.l r12,@-r15 + cfi_def_cfa_offset (4) + cfi_offset (12, -4) + mova L(GT),r0 + mov.l L(GT),r12 + sts.l pr,@-r15 + cfi_def_cfa_offset (8) + cfi_offset (17, -8) + add r0,r12 +#else + sts.l pr,@-r15 + cfi_def_cfa_offset (4) + cfi_offset (17, -4) +#endif + + .globl __syscall_cancel_arch_start +__syscall_cancel_arch_start: + + /* if (*cancelhandling & CANCELED_BITMASK) + __syscall_do_cancel() */ + mov.l @r4,r0 + tst #4,r0 + bf/s 1f + + /* Issue a 6 argument syscall. */ + mov r5,r3 + mov r6,r4 + mov r7,r5 +#ifdef SHARED + mov.l @(8,r15),r6 + mov.l @(12,r15),r7 + mov.l @(16,r15),r0 + mov.l @(20,r15),r1 +#else + mov.l @(4,r15),r6 + mov.l @(8,r15),r7 + mov.l @(12,r15),r0 + mov.l @(16,r15),r1 +#endif + trapa #0x16 + +/* The additional or is a workaround for a hardware issue: + http://documentation.renesas.com/eng/products/mpumcu/tu/tnsh7456ae.pdf */ + .globl __syscall_cancel_arch_end +__syscall_cancel_arch_end: + + or r0,r0 + or r0,r0 + or r0,r0 + or r0,r0 + or r0,r0 + + lds.l @r15+,pr + cfi_remember_state + cfi_restore (17) +#ifdef SHARED + cfi_def_cfa_offset (4) + rts + mov.l @r15+,r12 + cfi_def_cfa_offset (0) + cfi_restore (12) + .align 1 +1: + cfi_restore_state + mov.l L(SC),r1 + bsrf r1 +L(M): + nop + + .align 2 +L(GT): + .long _GLOBAL_OFFSET_TABLE_ +L(SC): + .long __syscall_do_cancel-(L(M)+2) +#else + cfi_def_cfa_offset (0) + rts + nop + + .align 1 +1: + cfi_restore_state + mov.l 2f,r1 + jsr @r1 + nop + + .align 2 +2: + .long __syscall_do_cancel +#endif + +END (__syscall_cancel_arch) +libc_hidden_def (__syscall_cancel_arch) From patchwork Mon Dec 11 19:07:02 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella X-Patchwork-Id: 121456 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp3170874qgn; Mon, 11 Dec 2017 11:11:24 -0800 (PST) X-Google-Smtp-Source: ACJfBotyiTfDCjB0EYaTbrduRWXpi+gwDUHD49PUMGfRCanHiUPBaJj2NZ9HWBpZ4eYeXgXTLizy X-Received: by 10.84.169.36 with SMTP id g33mr1265104plb.83.1513019484286; Mon, 11 Dec 2017 11:11:24 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1513019484; cv=none; d=google.com; s=arc-20160816; b=bK23mbUywYgQ437+tm88smp7OF70YX6nvFWANbrH3ss2fentvs9R3qc1h/YwQO2HXb 5VzpYFphnHWpJ7aeMlB7Rvf/jLPQk1kx/tBOcfLPhYQ5ZKCFrNdEpyX8vCeT5yl0JBCn IoUZzHjGgIE7erRjOoZ3CNSS4iHGLFM51z9q3jMl6y0/7mnMaTLZ4kOOcNcaYfYGF5Bf 3fvTH9nmrjSgwMCJOKBR1dF2qZHtp3njMcMIV60uYcJttNE9+suyoYuC2iV3kjm+kGi5 bfRVjxmFiQnWRx1VS0lo0IAuvlGwVLEycPWKk64u01/3c4wsyXasbeuPfkVC3dgFuk6e wHSQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:to:from:delivered-to :sender:list-help:list-post:list-archive:list-subscribe :list-unsubscribe:list-id:precedence:mailing-list:dkim-signature :domainkey-signature:arc-authentication-results; bh=hvJILjceiPTmDoVd3Evg9Z0h+1s1bf/Kup3cTlJy5h4=; b=FWXTaMXP/MHJrFITLv2nTrkSKAeur7oDrrKHow2Gz7g2wGC+pWTAfFfN+sjU0qN0zb 7BpIEc2dhJbqgANYnH5PVaJ5y71CUgYNjA3nWyuugP241bGXxaBRaau2h7us46EeFBSq o/cRm0+yTp3nKnpiWCvXGIM9jlwYj9K10xA268TGTADsm6LTo2JS4JtIOhWRos2vpIyH QyXo1fn0ZqgikgQrfoV63dUBRV6C6gVs0IS4L6zeqSTIY5nrJe/jF3oj6QGmJUsQJhJ3 0vlIp/za3kgL6OMXfGGh+BFgzgHxKPVRSt9LWfAfAWNYoYsjlLyn92nn/SgSQ2SE1t5z 60gQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=ZrO5l3vT; spf=pass (google.com: domain of libc-alpha-return-88032-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88032-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id c1si10305308pgn.350.2017.12.11.11.11.23 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Dec 2017 11:11:24 -0800 (PST) Received-SPF: pass (google.com: domain of libc-alpha-return-88032-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=ZrO5l3vT; spf=pass (google.com: domain of libc-alpha-return-88032-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88032-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; q=dns; s=default; b=kMd3ni1K3pt/aMDwqaup3vLnSEKEv5L ip/iySeyjH0OM+i9YenW+G32pdcHh25dmr0qATVTdp18jXtb7RjS/czblkxTrL/0 p088NvIeu/tHeZrRJ1xkTmqNzdyc5C9PCKCg20KeJ+zxRDdTAL6YwMOYiTvTNF3S WAw7LQUlpgFA= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; s=default; bh=nIyt5k1SiZDcggwM7dfqANRGWdU=; b=ZrO5l 3vT2xIOBe0CAssL8sQ5tczAI6XIW8+72yoAQh0UyRHfPmECekaZbI7e2yfEf1WVl QQ5yuus1x7Fx9qyUaT/dyg096nO96kmeM75XOEAlODEw3tIEAImAsRUg3UyykiBx S5/Nyu89oagylwnhZUFKAfamojs7WUN79TpKsI= Received: (qmail 43215 invoked by alias); 11 Dec 2017 19:07:42 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 43178 invoked by uid 89); 11 Dec 2017 19:07:42 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.9 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=v1 X-HELO: mail-qt0-f194.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=hvJILjceiPTmDoVd3Evg9Z0h+1s1bf/Kup3cTlJy5h4=; b=OCXK7N3aSA5VuHKmzzxMHOAcrpnz4j0OJPUK9htGIxm4D5OmFApBFo2mOiOJ+APOZY Osxge1rQzwpy+pIU+p0Gt+4YFL2hpyupaCK2ZVWSIe9qDnvLH4ZE16Qj7Jc3Idr39iGk M27cn1tVuTuTFIXueAW88j8RN6G3hvXD+JzMUUAWFZyA3YbuaOffTeFxbZXKV5t4C/md WZDHRj/EpktwXRk3o/RhOVnzUbj2rxnD1bQjGtSjbfiNW18zQ9yngl+Flk4PA2bxkMod xDNzTvbr5gQnCnoebxNcU7W4fe2dfgwQ75vp2yo9BWhO7pFrevizRbVWW7Jo/s5blccA uZ0Q== X-Gm-Message-State: AKGB3mIxr/zSA6Fq1UilhfEc6+8P6ksp8HbbE3TlOjQTkfKeyleTUYJB sr9XNDfdzY6zkkLFVtoMZnFtlEzvDz0= X-Received: by 10.200.45.89 with SMTP id o25mr1911181qta.227.1513019257383; Mon, 11 Dec 2017 11:07:37 -0800 (PST) From: Adhemerval Zanella To: libc-alpha@sourceware.org Subject: [PATCH 18/19] nptl: mips: Fix Race conditions in pthread cancellation (BZ#12683) Date: Mon, 11 Dec 2017 17:07:02 -0200 Message-Id: <1513019223-7603-19-git-send-email-adhemerval.zanella@linaro.org> In-Reply-To: <1513019223-7603-1-git-send-email-adhemerval.zanella@linaro.org> References: <1513019223-7603-1-git-send-email-adhemerval.zanella@linaro.org> This patch adds the mips modifications required for the BZ#12683. It adds the required ucontext_get_pc function, a mips32 cancellable syscall wrapper and 7 argument cancellable syscall support. To avoid code pessimization and add a requirement on all architectures to support {INLINE,INTERNAL)_SYSCALL with 7 argument, its support is added through a flag, HAVE_CANCELABLE_SYSCALL_WITH_7_ARGS, which changes the signature and prototype of the requires macros and functions (SYSCALL_CANCEL, __syscall_cancel and __syscall_cancel_arch). As default 6 arguments cancellable syscalls are use. MIPS o32 requires an arch-specific implementation because INTERNAL_SYSCALL_NCS adds an 'addiu' just after the syscall instruction which invalidates the checks on sigcancel_handler. Checked against a build and make check run-built-tests=no for mips-gnu-linux, mips64-linux-gnu, mips64-n32-linux-gnu. I also ran some basic o32 and n64 cancellation tests on a simulated mips64 qemu system. * nptl/libc-cancellation.c (__syscall_cancel): Define and use 7 argument syscall if architecture requires it. * nptl/pthreadP.h (__syscall_cancel_arch): Likewise. * sysdeps/unix/sysdep.h (__syscall_cancel, __SYSCALL_CANCEL*): Define with 7 argument if architecture requires it. (__SYSCALL_CANCEL7_ARG_DEF): New macro. (__SYSCALL_CANCEL7_ARG): Likewise. (__SYSCALL_CANCEL7_ARG7): Likewise. * sysdeps/unix/sysv/linux/syscall_cancel.c (__syscall_cancel_arch): Likewise. * sysdeps/mips/nptl/tls.h (READ_THREAD_POINTER): Check __mips_isa_rev existance for macro definition. * sysdeps/unix/sysv/linux/mips/sigcontextinfo.h (ucontext_get_pc): New function. * sysdeps/unix/sysv/linux/mips/mips32/syscall_cancel.S: New file. * sysdeps/unix/sysv/linux/mips/mips32/sysdep.h (HAVE_CANCELABLE_SYSCALL_WITH_7_ARGS): Define. Signed-off-by: Adhemerval Zanella --- ChangeLog | 18 +++ nptl/libc-cancellation.c | 7 +- nptl/pthreadP.h | 3 +- sysdeps/mips/nptl/tls.h | 2 +- sysdeps/unix/sysdep.h | 38 ++++-- .../unix/sysv/linux/mips/mips32/syscall_cancel.S | 128 +++++++++++++++++++++ sysdeps/unix/sysv/linux/mips/mips32/sysdep.h | 4 + sysdeps/unix/sysv/linux/mips/sigcontextinfo.h | 13 ++- sysdeps/unix/sysv/linux/syscall_cancel.c | 6 +- 9 files changed, 203 insertions(+), 16 deletions(-) create mode 100644 sysdeps/unix/sysv/linux/mips/mips32/syscall_cancel.S -- 2.7.4 diff --git a/nptl/libc-cancellation.c b/nptl/libc-cancellation.c index b013435..a7bbd7f 100644 --- a/nptl/libc-cancellation.c +++ b/nptl/libc-cancellation.c @@ -25,7 +25,7 @@ long int __syscall_cancel (__syscall_arg_t nr, __syscall_arg_t a1, __syscall_arg_t a2, __syscall_arg_t a3, __syscall_arg_t a4, __syscall_arg_t a5, - __syscall_arg_t a6) + __syscall_arg_t a6 __SYSCALL_CANCEL7_ARG_DEF) { pthread_t self = (pthread_t) THREAD_SELF; volatile struct pthread *pd = (volatile struct pthread *) self; @@ -35,7 +35,8 @@ __syscall_cancel (__syscall_arg_t nr, __syscall_arg_t a1, if (pd->cancelhandling & CANCELSTATE_BITMASK) { INTERNAL_SYSCALL_DECL (err); - result = INTERNAL_SYSCALL_NCS_CALL (nr, err, a1, a2, a3, a4, a5, a6); + result = INTERNAL_SYSCALL_NCS_CALL (nr, err, a1, a2, a3, a4, a5, a6 + __SYSCALL_CANCEL7_ARG7); if (INTERNAL_SYSCALL_ERROR_P (result, err)) return -INTERNAL_SYSCALL_ERRNO (result, err); return result; @@ -44,7 +45,7 @@ __syscall_cancel (__syscall_arg_t nr, __syscall_arg_t a1, /* Call the arch-specific entry points that contains the globals markers to be checked by SIGCANCEL handler. */ result = __syscall_cancel_arch (&pd->cancelhandling, nr, a1, a2, a3, a4, a5, - a6); + a6 __SYSCALL_CANCEL7_ARG7); if ((result == -EINTR) && (pd->cancelhandling & CANCELED_BITMASK) diff --git a/nptl/pthreadP.h b/nptl/pthreadP.h index 35d99f6..88eebca 100644 --- a/nptl/pthreadP.h +++ b/nptl/pthreadP.h @@ -317,7 +317,8 @@ __do_cancel (void) extern long int __syscall_cancel_arch (volatile int *, __syscall_arg_t nr, __syscall_arg_t arg1, __syscall_arg_t arg2, __syscall_arg_t arg3, - __syscall_arg_t arg4, __syscall_arg_t arg5, __syscall_arg_t arg6); + __syscall_arg_t arg4, __syscall_arg_t arg5, __syscall_arg_t arg6 + __SYSCALL_CANCEL7_ARG_DEF); libc_hidden_proto (__syscall_cancel_arch); extern void __syscall_do_cancel (void) diff --git a/sysdeps/mips/nptl/tls.h b/sysdeps/mips/nptl/tls.h index 913f7d3..0d32424 100644 --- a/sysdeps/mips/nptl/tls.h +++ b/sysdeps/mips/nptl/tls.h @@ -35,7 +35,7 @@ # define READ_THREAD_POINTER() (__builtin_thread_pointer ()) #else /* Note: rd must be $v1 to be ABI-conformant. */ -# if __mips_isa_rev >= 2 +# if defined __mips_isa_rev && __mips_isa_rev >= 2 # define READ_THREAD_POINTER() \ ({ void *__result; \ asm volatile ("rdhwr\t%0, $29" : "=v" (__result)); \ diff --git a/sysdeps/unix/sysdep.h b/sysdeps/unix/sysdep.h index 10669ae..c90898d 100644 --- a/sysdeps/unix/sysdep.h +++ b/sysdeps/unix/sysdep.h @@ -121,29 +121,51 @@ typedef long int __syscall_arg_t; # define __SSC(__x) ((__syscall_arg_t) (__x)) #endif +/* Adjust both the __syscall_cancel and the SYSCALL_CANCEL macro to support + 7 arguments instead of default 6 (for some architectures like mip32). + We need it because using 7 arguments for all architecture would require + then to implement both {INTERNAL,INLINE}_SYSCALL and __syscall_cancel_arch + to accept 7 arguments. */ +#ifdef HAVE_CANCELABLE_SYSCALL_WITH_7_ARGS +# define __SYSCALL_CANCEL7_ARG_DEF , __syscall_arg_t arg7 +# define __SYSCALL_CANCEL7_ARG , 0 +# define __SYSCALL_CANCEL7_ARG7 , arg7 +#else +# define __SYSCALL_CANCEL7_ARG_DEF +# define __SYSCALL_CANCEL7_ARG +# define __SYSCALL_CANCEL7_ARG7 +#endif + long int __syscall_cancel (__syscall_arg_t nr, __syscall_arg_t arg1, __syscall_arg_t arg2, __syscall_arg_t arg3, __syscall_arg_t arg4, __syscall_arg_t arg5, - __syscall_arg_t arg6); + __syscall_arg_t arg6 __SYSCALL_CANCEL7_ARG_DEF); libc_hidden_proto (__syscall_cancel); #define __SYSCALL_CANCEL0(name) \ - (__syscall_cancel)(__NR_##name, 0, 0, 0, 0, 0, 0) + (__syscall_cancel)(__NR_##name, 0, 0, 0, 0, 0, 0 \ + __SYSCALL_CANCEL7_ARG) #define __SYSCALL_CANCEL1(name, a1) \ - (__syscall_cancel)(__NR_##name, __SSC(a1), 0, 0, 0, 0, 0) + (__syscall_cancel)(__NR_##name, __SSC(a1), 0, 0, 0, 0, 0 \ + __SYSCALL_CANCEL7_ARG) #define __SYSCALL_CANCEL2(name, a1, a2) \ - (__syscall_cancel)(__NR_##name, __SSC(a1), __SSC(a2), 0, 0, 0, 0) + (__syscall_cancel)(__NR_##name, __SSC(a1), __SSC(a2), 0, 0, 0, 0 \ + __SYSCALL_CANCEL7_ARG) #define __SYSCALL_CANCEL3(name, a1, a2, a3) \ - (__syscall_cancel)(__NR_##name, __SSC(a1), __SSC(a2), __SSC(a3), 0, 0, 0) + (__syscall_cancel)(__NR_##name, __SSC(a1), __SSC(a2), __SSC(a3), 0, 0, 0 \ + __SYSCALL_CANCEL7_ARG) #define __SYSCALL_CANCEL4(name, a1, a2, a3, a4) \ (__syscall_cancel)(__NR_##name, __SSC(a1), __SSC(a2), __SSC(a3), \ - __SSC(a4), 0, 0) + __SSC(a4), 0, 0 __SYSCALL_CANCEL7_ARG) #define __SYSCALL_CANCEL5(name, a1, a2, a3, a4, a5) \ (__syscall_cancel)(__NR_##name, __SSC(a1), __SSC(a2), __SSC(a3), \ - __SSC(a4), __SSC(a5), 0) + __SSC(a4), __SSC(a5), 0 __SYSCALL_CANCEL7_ARG) #define __SYSCALL_CANCEL6(name, a1, a2, a3, a4, a5, a6) \ (__syscall_cancel)(__NR_##name, __SSC(a1), __SSC(a2), __SSC(a3), \ - __SSC(a4), __SSC(a5), __SSC(a6)) + __SSC(a4), __SSC(a5), __SSC(a6) __SYSCALL_CANCEL7_ARG) +#define __SYSCALL_CANCEL7(name, a1, a2, a3, a4, a5, a6, a7) \ + (__syscall_cancel)(__NR_##name, __SSC(a1), __SSC(a2), __SSC(a3), \ + __SSC(a4), __SSC(a5), __SSC(a6), __SSC(a7)) #define __SYSCALL_CANCEL_NARGS_X(a,b,c,d,e,f,g,h,n,...) n #define __SYSCALL_CANCEL_NARGS(...) \ diff --git a/sysdeps/unix/sysv/linux/mips/mips32/syscall_cancel.S b/sysdeps/unix/sysv/linux/mips/mips32/syscall_cancel.S new file mode 100644 index 0000000..75c4390 --- /dev/null +++ b/sysdeps/unix/sysv/linux/mips/mips32/syscall_cancel.S @@ -0,0 +1,128 @@ +/* Cancellable syscall wrapper. Linux/mips32 version. + Copyright (C) 2017 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 + . */ + +#include +#include + +/* long int __syscall_cancel_arch (int *cancelhandling, + __syscall_arg_t nr, + __syscall_arg_t arg1, + __syscall_arg_t arg2, + __syscall_arg_t arg3, + __syscall_arg_t arg4, + __syscall_arg_t arg5, + __syscall_arg_t arg6, + __syscall_arg_t arg7) */ + +#define FRAME_SIZE 56 + +NESTED (__syscall_cancel_arch, FRAME_SIZE, fp) + .mask 0xc0070000,-SZREG + .fmask 0x00000000,0 + + PTR_ADDIU sp, -FRAME_SIZE + cfi_def_cfa_offset (FRAME_SIZE) + + sw fp,48(sp) + sw ra,52(sp) + sw s2,44(sp) + sw s1,40(sp) + sw s0,36(sp) +#ifdef __PIC__ + .cprestore 16 +#endif + cfi_offset (31, -4) + cfi_offset (30, -8) + cfi_offset (18, -12) + cfi_offset (17, -16) + cfi_offset (16, -20) + move fp,sp + cfi_def_cfa_register (30) + + .globl __syscall_cancel_arch_start + .type __syscall_cancel_arch_start, @function +__syscall_cancel_arch_start: + + lw v0,0(a0) + andi v0,v0,0x4 + bne v0,zero,2f + + addiu sp,sp,-16 + addiu v0,sp,16 + sw v0,24(fp) + + move s0,a1 + move a0,a2 + move a1,a3 + lw a2,72(fp) + lw a3,76(fp) + lw v0,84(fp) + lw s1,80(fp) + lw s2,88(fp) + + .set noreorder + subu sp, 32 + sw s1, 16(sp) + sw v0, 20(sp) + sw s2, 24(sp) + move v0, $16 + syscall + + .globl __syscall_cancel_arch_end + .type __syscall_cancel_arch_end, @function +__syscall_cancel_arch_end: + addiu sp, 32 + .set reorder + + beq a3,zero,1f + subu v0,zero,v0 +1: + move sp,fp + cfi_remember_state + cfi_def_cfa_register (29) + lw ra,52(fp) + lw fp,48(sp) + lw s2,44(sp) + lw s1,40(sp) + lw s0,36(sp) + .set noreorder + .set nomacro + jr ra + addiu sp,sp,FRAME_SIZE + + .set macro + .set reorder + + cfi_def_cfa_offset (0) + cfi_restore (16) + cfi_restore (17) + cfi_restore (18) + cfi_restore (30) + cfi_restore (31) + +2: + cfi_restore_state +#ifdef __PIC__ + PTR_LA t9, __syscall_do_cancel + jalr t9 +#else + jal __syscall_do_cancel +#endif + +END (__syscall_cancel_arch) +libc_hidden_def (__syscall_cancel_arch) diff --git a/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h b/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h index dadfa18..f4f23ce 100644 --- a/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h +++ b/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h @@ -18,6 +18,10 @@ #ifndef _LINUX_MIPS_MIPS32_SYSDEP_H #define _LINUX_MIPS_MIPS32_SYSDEP_H 1 +/* mips32 have cancelable syscalls with 7 arguments (currently only + sync_file_range). */ +#define HAVE_CANCELABLE_SYSCALL_WITH_7_ARGS 1 + /* There is some commonality. */ #include #include diff --git a/sysdeps/unix/sysv/linux/mips/sigcontextinfo.h b/sysdeps/unix/sysv/linux/mips/sigcontextinfo.h index c9bc083..f9c1758 100644 --- a/sysdeps/unix/sysv/linux/mips/sigcontextinfo.h +++ b/sysdeps/unix/sysv/linux/mips/sigcontextinfo.h @@ -16,7 +16,10 @@ License along with the GNU C Library. If not, see . */ +#ifndef _SIGCONTEXTINFO_H +#define _SIGCONTEXTINFO_H +#include #include #if _MIPS_SIM == _ABIO32 @@ -39,4 +42,12 @@ #define CALL_SIGHANDLER(handler, signo, ctx) \ (handler)((signo), SIGCONTEXT_EXTRA_ARGS (ctx)) -#endif +#endif /* _MIPS_SIM == _ABIO32 */ + +static inline uintptr_t +ucontext_get_pc (const ucontext_t *uc) +{ + return uc->uc_mcontext.pc; +} + +#endif /* _SIGCONTEXTINFO_H */ diff --git a/sysdeps/unix/sysv/linux/syscall_cancel.c b/sysdeps/unix/sysv/linux/syscall_cancel.c index 66c87a2..cdce362 100644 --- a/sysdeps/unix/sysv/linux/syscall_cancel.c +++ b/sysdeps/unix/sysv/linux/syscall_cancel.c @@ -45,14 +45,16 @@ long int __syscall_cancel_arch (volatile int *ch, __syscall_arg_t nr, __syscall_arg_t a1, __syscall_arg_t a2, __syscall_arg_t a3, __syscall_arg_t a4, - __syscall_arg_t a5, __syscall_arg_t a6) + __syscall_arg_t a5, __syscall_arg_t a6 + __SYSCALL_CANCEL7_ARG_DEF) { ADD_LABEL ("__syscall_cancel_arch_start"); if (__glibc_unlikely (*ch & CANCELED_BITMASK)) __syscall_do_cancel(); INTERNAL_SYSCALL_DECL(err); - long int result = INTERNAL_SYSCALL_NCS (nr, err, 6, a1, a2, a3, a4, a5, a6); + long int result = INTERNAL_SYSCALL_NCS_CALL (nr, err, a1, a2, a3, a4, a5, + a6 __SYSCALL_CANCEL7_ARG7); ADD_LABEL ("__syscall_cancel_arch_end"); if (INTERNAL_SYSCALL_ERROR_P (result, err)) return -INTERNAL_SYSCALL_ERRNO (result, err); From patchwork Mon Dec 11 19:07:03 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella X-Patchwork-Id: 121455 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp3170657qgn; Mon, 11 Dec 2017 11:11:13 -0800 (PST) X-Google-Smtp-Source: ACJfBotUqWIkL+ZnroTbTmluSPfW5C9GVh+EkUPaQALLMnmD8d/fzzzctrLv7Yj3ugnnSCbSJMEu X-Received: by 10.101.100.24 with SMTP id a24mr1191427pgv.239.1513019473266; Mon, 11 Dec 2017 11:11:13 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1513019473; cv=none; d=google.com; s=arc-20160816; b=tLSA+b4cgY5jlvEfI7NF7hfdrHXl2NdjmyHu9JDGHFPwLH5o+5y3epiA8nP4INL60Q IJHnZJiZ2SGYo6X+6VUZfscGUDSiEfBTvbx60c9nbrSaWPxi65AJgNjwljpQ9HoG3jkV taCNOM8+q8QAiwLSOH11QovzQFGUjzivkB7dGrKglpJL1mfAXBxanDs60Q2VtzdWDEeY rleIl/1VHr6kNSiB2H931noV2ZSMNk7qE7fIvEmSVg3lpQ+RRyl9N71mbWjMGLtYDRX8 Y5htuu9hLPIBHVxhHuLhTWW7DdWHA8b+gsX4XaTjH7yvozSkt6KcA+DKqhKAeCw4ztd7 S8HA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:to:from:delivered-to :sender:list-help:list-post:list-archive:list-subscribe :list-unsubscribe:list-id:precedence:mailing-list:dkim-signature :domainkey-signature:arc-authentication-results; bh=/NpNQdoM3x1FW1yS5y6gJFBKb9aSEgN68ONZOJXuXgo=; b=MPefdBgcX5zNQWcvb6l9VxTv6iuo82OxPgRFBZa2GdBC/7J5qOzrZnlRGEysokqQ5Z pHHh7cpAjGGiohe2qJwgwgzyLYQLawo/LV+Kj1LFmjFbxyiNluCTPGmvCBerSz2NVkqs vT8oioVl4I2WE0d+Tm4+rsPhMVLowMueOvkJTpp5jtgjkjfF73waIr/kL9al5P02Lhff 0YunT18hQNbDFHvAID4MdQnjrFAe/xxETOeVM7w9A3Y4f7lTTGoSBqhRtZ95mqBzObJ8 CRs/mrXt0LpKXl4y7g1KJP1NB0S5UC+EkfyYcSExhy1vSjVUL2+n4qFDd69ZS9CSH/E+ Jwyg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=w3yH9S4/; spf=pass (google.com: domain of libc-alpha-return-88033-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88033-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id g7si4220784plp.1.2017.12.11.11.11.13 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Dec 2017 11:11:13 -0800 (PST) Received-SPF: pass (google.com: domain of libc-alpha-return-88033-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=w3yH9S4/; spf=pass (google.com: domain of libc-alpha-return-88033-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88033-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; q=dns; s=default; b=kQ11KKzl3xmmPR8Bvnfmx4WrgijuNCV B1kBdhkQoyk0I0EW7WGT3FH68XHa7m/NmoE1Dg8AzV8I4BEjILyaSsZA2D/URvay NMMQ4nuuZe5naD5h4jy5U+1HHQh1IfZxn0MBwGy2ZN8ozczHEHE1+tBbVf0FvY+R lS6MlIR6TkRE= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; s=default; bh=wZ4ex739pkRdXsP0Cf3iivw6cso=; b=w3yH9 S4/zmbX2T0Clqe5fXuHd/srBg16SfHhm/IhNd7st6IJiqR5t0eXbJhmIBcbo7cE/ OHks66cPiSsishK3r0PGVq2xk+rHikOPIIgKJHMqopqq1DG1eJNL4UvYN39VF34X 6yVqLV1Ak86rK5XD5sLiNdhj12/hN38eQw/jzo= Received: (qmail 43235 invoked by alias); 11 Dec 2017 19:07:42 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 43200 invoked by uid 89); 11 Dec 2017 19:07:42 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.9 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mail-qt0-f193.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=/NpNQdoM3x1FW1yS5y6gJFBKb9aSEgN68ONZOJXuXgo=; b=fct/hscFt0Q5U1evEEmj2A9fVxVZp6u+/LImlHWIfT8dTMU0yponlKq5t6WhShsBsb Hpx16v1fZqm2OZ1+nZhGdw1WakC7sdcEStO73QsyVvY90WkrbLEGdm/IJcjL8u93hLBO ZpEPI8N8iQjK0d/0JdOPG/qzO9lKCm3l0xx40gIIYMp/fZaeXCZ433L/sXGQTmgpZ9yt qLurg4g0qYR9N0to7fr6OeO3SanXZDUon8UviHBG5XpT8uhzG4r3iJxYvW9dx5et256y WxS8bDhhCLtaN0nbrA9OkQWNtKoTbpi70a4Sn4GM/zOWNkqN8Sh0N3QaNQKpOjHLpDf+ KybA== X-Gm-Message-State: AKGB3mKsKGc8Db3461iP+PX4LASP4WT8moxRZVoGHdorxxtrGgPVynai 9ApQj9dOstqzKYTZgmd1wTFbKStsu+U= X-Received: by 10.55.105.5 with SMTP id e5mr2024932qkc.256.1513019258773; Mon, 11 Dec 2017 11:07:38 -0800 (PST) From: Adhemerval Zanella To: libc-alpha@sourceware.org Subject: [PATCH 19/19] nptl: hppa: Fix Race conditions in pthread cancellation (BZ#12683) Date: Mon, 11 Dec 2017 17:07:03 -0200 Message-Id: <1513019223-7603-20-git-send-email-adhemerval.zanella@linaro.org> In-Reply-To: <1513019223-7603-1-git-send-email-adhemerval.zanella@linaro.org> References: <1513019223-7603-1-git-send-email-adhemerval.zanella@linaro.org> This patch adds the hppa modifications required for the BZ#12683. It basically adds the required __pthread_get_pc function. HPPA requires an arch-specific syscall_cancel because the INTERNAL_SYSCALL_NCS adds some instruction to fetch the returned syscalls value. The implementation were based on on default C version built with GCC 6.1 Checked on hppa-linux-gnu. * sysdeps/unix/sysv/linux/hppa/sigcontextinfo.h: New file. * sysdeps/unix/sysv/linux/hppa/syscall_cancel.S: Likewise. Signed-off-by: Adhemerval Zanella --- ChangeLog | 3 + sysdeps/unix/sysv/linux/hppa/sigcontextinfo.h | 38 +++++++++++++ sysdeps/unix/sysv/linux/hppa/syscall_cancel.S | 82 +++++++++++++++++++++++++++ 3 files changed, 123 insertions(+) create mode 100644 sysdeps/unix/sysv/linux/hppa/sigcontextinfo.h create mode 100644 sysdeps/unix/sysv/linux/hppa/syscall_cancel.S -- 2.7.4 diff --git a/sysdeps/unix/sysv/linux/hppa/sigcontextinfo.h b/sysdeps/unix/sysv/linux/hppa/sigcontextinfo.h new file mode 100644 index 0000000..4f59c1e --- /dev/null +++ b/sysdeps/unix/sysv/linux/hppa/sigcontextinfo.h @@ -0,0 +1,38 @@ +/* Copyright (C) 2017 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 + . */ + +#ifndef _SIGCONTEXTINFO_H +#define _SIGCONTEXTINFO_H + +#include + +/* In general we cannot provide any information. */ +#define SIGCONTEXT struct sigcontext * +#define SIGCONTEXT_EXTRA_ARGS +#define GET_PC(ctx) ((void *) 0) +#define GET_FRAME(ctx) ((void *) 0) +#define GET_STACK(ctx) ((void *) 0) +#define CALL_SIGHANDLER(handler, signo, ctx) \ + (handler)((signo), SIGCONTEXT_EXTRA_ARGS (ctx)) + +static inline uintptr_t +ucontext_get_pc (const ucontext_t *uc) +{ + return uc->uc_mcontext.sc_iaoq[0] & ~0x3; +} + +#endif /* _SIGCONTEXTINFO_H */ diff --git a/sysdeps/unix/sysv/linux/hppa/syscall_cancel.S b/sysdeps/unix/sysv/linux/hppa/syscall_cancel.S new file mode 100644 index 0000000..552ba2f --- /dev/null +++ b/sysdeps/unix/sysv/linux/hppa/syscall_cancel.S @@ -0,0 +1,82 @@ +/* Cancellable syscall wrapper. Linux/hppa version. + Copyright (C) 2017 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 + . */ + +#include + +/* long int __syscall_cancel_arch (int *cancelhandling, + long int nr, + long int arg1, + long int arg2, + long int arg3, + long int arg4, + long int arg5, + long int arg6) */ + + .text +ENTRY(__syscall_cancel_arch) + stw %r2,-20(%r30) + ldo 128(%r30),%r30 + cfi_def_cfa_offset (-128) + cfi_offset (2, -20) + ldw -180(%r30),%r28 + copy %r24,%r31 + stw %r28,-104(%r30) + ldw -184(%r30),%r28 + stw %r28,-108(%r30) + ldw -188(%r30),%r28 + stw %r28,-112(%r30) + ldw -192(%r30),%r28 + stw %r4,-100(%r30) + stw %r28,-116(%r30) + copy %r25,%r28 + copy %r23,%r25 + stw %r19,-32(%r30) + cfi_offset (4, 28) + + .global __syscall_cancel_arch_start +.type __syscall_cancel_arch_start,@function +__syscall_cancel_arch_start: + + ldw 0(%r26),%r20 + stw %r20,-120(%r30) + ldw -120(%r30),%r20 + bb,< %r20,29,1f + ldw -116(%r30),%r21 + ldw -112(%r30),%r22 + copy %r31,%r26 + ldw -108(%r30),%r23 + ldw -104(%r30),%r24 + copy %r19, %r4 + ble 0x100(%sr2, %r0) + + .global __syscall_cancel_arch_end +.type __syscall_cancel_arch_end,@function +__syscall_cancel_arch_end: + + copy %r28, %r20 + copy %r4, %r19 + ldw -148(%r30),%r2 + ldw -100(%r30),%r4 + bv %r0(%r2) + ldo -128(%r30),%r30 +1: + bl __syscall_do_cancel,%r2 + nop + nop +END(__syscall_cancel_arch) +libc_hidden_def (__syscall_cancel_arch)