@@ -23,6 +23,7 @@
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
+#include <sys/syscall.h>
#include <signal.h>
#include <unistd.h>
@@ -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;
}
@@ -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)
deleted file mode 100644
@@ -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 <jakub@redhat.com>, 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
-# <http://www.gnu.org/licenses/>.
-
-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
@@ -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");
@@ -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");
@@ -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);
@@ -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)