RISC-V: Fix elfutils testsuite unwind failures.

The clone.S patch fixes 2 elfutils testsuite unwind failures, where the
backtrace gets stuck repeating __thread_start until we hit the backtrace
limit.  This was confirmed by building and installing a patched glibc and
then building elfutils and running its testsuite.

Unfortunately, the testcase isn't working as expected and I don't know why.
The testcase passes even when my clone.S patch is not installed.  The testcase
looks logically similarly to the elfutils testcases that are failing.  Maybe
there is a subtle difference in how the glibc unwinding works versus the
elfutils unwinding?  I don't have good gdb pthread support yet, so I haven't
found a way to debug this.  Anyways, I don't know if the testcase is useful or
not.  If the testcase isn't useful then maybe the clone.S patch is OK without
a testcase?

Jim

	[BZ #24040]
	* elf/Makefile (CFLAGS-tst-unwind-main.c): Add -DUSE_PTHREADS=0.
	* elf/tst-unwind-main.c: If USE_PTHEADS, include pthread.h and error.h
	(func): New.
	(main): If USE_PTHREADS, call pthread_create to run func.  Otherwise
	call func directly.
	* nptl/Makefile (tests): Add tst-unwind-thread.
	(CFLAGS-tst-unwind-thread.c): Define.
	* nptl/tst-unwind-thread.c: New file.
	* sysdeps/unix/sysv/linux/riscv/clone.S (__thread_start): Mark ra
	as undefined.

(cherry picked from commit 85bd1ddbdf)
This commit is contained in:
Jim Wilson 2019-01-13 15:48:09 -08:00 committed by Aurelien Jarno
parent e8c13d5f7a
commit 384113d1c0
7 changed files with 52 additions and 5 deletions

View File

@ -1,3 +1,17 @@
2019-01-13 Jim Wilson <jimw@sifive.com>
[BZ #24040]
* elf/Makefile (CFLAGS-tst-unwind-main.c): Add -DUSE_PTHREADS=0.
* elf/tst-unwind-main.c: If USE_PTHEADS, include pthread.h and error.h
(func): New.
(main): If USE_PTHREADS, call pthread_create to run func. Otherwise
call func directly.
* nptl/Makefile (tests): Add tst-unwind-thread.
(CFLAGS-tst-unwind-thread.c): Define.
* nptl/tst-unwind-thread.c: New file.
* sysdeps/unix/sysv/linux/riscv/clone.S (__thread_start): Mark ra
as undefined.
2019-01-31 Carlos O'Donell <carlos@redhat.com> 2019-01-31 Carlos O'Donell <carlos@redhat.com>
Torvald Riegel <triegel@redhat.com> Torvald Riegel <triegel@redhat.com>
Rik Prohaska <prohaska7@gmail.com> Rik Prohaska <prohaska7@gmail.com>

1
NEWS
View File

@ -36,6 +36,7 @@ The following bugs are resolved with this release:
[24024] strerror() might set errno to ENOMEM due to -fno-math-error [24024] strerror() might set errno to ENOMEM due to -fno-math-error
[24027] malloc: Integer overflow in realloc [24027] malloc: Integer overflow in realloc
[24034] tst-cancel21-static fails with SIGBUS on pre-ARMv7 when using GCC 8 [24034] tst-cancel21-static fails with SIGBUS on pre-ARMv7 when using GCC 8
[24040] riscv64: unterminated call chain in __thread_start
[24097] Can't use 64-bit register for size_t in assembly codes for x32 (CVE-2019-6488) [24097] Can't use 64-bit register for size_t in assembly codes for x32 (CVE-2019-6488)
[24155] x32 memcmp can treat positive length as 0 (if sign bit in RDX is set) (CVE-2019-7309) [24155] x32 memcmp can treat positive length as 0 (if sign bit in RDX is set) (CVE-2019-7309)
[24161] __run_fork_handlers self-deadlocks in malloc/tst-mallocfork2 [24161] __run_fork_handlers self-deadlocks in malloc/tst-mallocfork2

View File

@ -1486,4 +1486,4 @@ $(objpfx)tst-libc_dlvsym-static.out: $(objpfx)tst-libc_dlvsym-dso.so
$(objpfx)tst-big-note: $(objpfx)tst-big-note-lib.so $(objpfx)tst-big-note: $(objpfx)tst-big-note-lib.so
CFLAGS-tst-unwind-main.c += -funwind-tables CFLAGS-tst-unwind-main.c += -funwind-tables -DUSE_PTHREADS=0

View File

@ -20,19 +20,41 @@
#include <unistd.h> #include <unistd.h>
#include <support/test-driver.h> #include <support/test-driver.h>
#if USE_PTHREADS
# include <pthread.h>
# include <error.h>
#endif
static _Unwind_Reason_Code static _Unwind_Reason_Code
callback (struct _Unwind_Context *ctx, void *arg) callback (struct _Unwind_Context *ctx, void *arg)
{ {
return _URC_NO_REASON; return _URC_NO_REASON;
} }
int static void *
main (void) func (void *a)
{ {
/* Arrange for this test to be killed if _Unwind_Backtrace runs into an /* Arrange for this test to be killed if _Unwind_Backtrace runs into an
endless loop. We cannot use the test driver because the complete endless loop. We cannot use the test driver because the complete
call chain needs to be compiled with -funwind-tables so that call chain needs to be compiled with -funwind-tables so that
_Unwind_Backtrace is able to reach _start. */ _Unwind_Backtrace is able to reach the start routine. */
alarm (DEFAULT_TIMEOUT); alarm (DEFAULT_TIMEOUT);
_Unwind_Backtrace (callback, 0); _Unwind_Backtrace (callback, 0);
return a;
}
int
main (void)
{
#if USE_PTHREADS
pthread_t thr;
int rc = pthread_create (&thr, NULL, &func, NULL);
if (rc)
error (1, rc, "pthread_create");
rc = pthread_join (thr, NULL);
if (rc)
error (1, rc, "pthread_join");
#else
func (NULL);
#endif
} }

View File

@ -320,7 +320,8 @@ tests = tst-attr1 tst-attr2 tst-attr3 tst-default-attr \
tst-cnd-timedwait tst-thrd-detach tst-mtx-basic tst-thrd-sleep \ tst-cnd-timedwait tst-thrd-detach tst-mtx-basic tst-thrd-sleep \
tst-mtx-recursive tst-tss-basic tst-call-once tst-mtx-timedlock \ tst-mtx-recursive tst-tss-basic tst-call-once tst-mtx-timedlock \
tst-rwlock-pwn \ tst-rwlock-pwn \
tst-rwlock-tryrdlock-stall tst-rwlock-trywrlock-stall tst-rwlock-tryrdlock-stall tst-rwlock-trywrlock-stall \
tst-unwind-thread
tests-internal := tst-rwlock19 tst-rwlock20 \ tests-internal := tst-rwlock19 tst-rwlock20 \
tst-sem11 tst-sem12 tst-sem13 \ tst-sem11 tst-sem12 tst-sem13 \
@ -723,6 +724,8 @@ $(objpfx)tst-audit-threads: $(objpfx)tst-audit-threads-mod2.so
$(objpfx)tst-audit-threads.out: $(objpfx)tst-audit-threads-mod1.so $(objpfx)tst-audit-threads.out: $(objpfx)tst-audit-threads-mod1.so
tst-audit-threads-ENV = LD_AUDIT=$(objpfx)tst-audit-threads-mod1.so tst-audit-threads-ENV = LD_AUDIT=$(objpfx)tst-audit-threads-mod1.so
CFLAGS-tst-unwind-thread.c += -funwind-tables
# The tests here better do not run in parallel # The tests here better do not run in parallel
ifneq ($(filter %tests,$(MAKECMDGOALS)),) ifneq ($(filter %tests,$(MAKECMDGOALS)),)
.NOTPARALLEL: .NOTPARALLEL:

2
nptl/tst-unwind-thread.c Normal file
View File

@ -0,0 +1,2 @@
#define USE_PTHREADS 1
#include "../elf/tst-unwind-main.c"

View File

@ -69,6 +69,11 @@ L (error):
ENTRY (__thread_start) ENTRY (__thread_start)
L (thread_start): L (thread_start):
/* Terminate call stack by noting ra is undefined. Use a dummy
.cfi_label to force starting the FDE. */
.cfi_label .Ldummy
cfi_undefined (ra)
/* Restore the arg for user's function. */ /* Restore the arg for user's function. */
REG_L a1,0(sp) /* Function pointer. */ REG_L a1,0(sp) /* Function pointer. */
REG_L a0,SZREG(sp) /* Argument pointer. */ REG_L a0,SZREG(sp) /* Argument pointer. */