1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-10-26 00:57:39 +03:00
Files
glibc/sysdeps/unix/sysv/linux/s390/s390-32/__makecontext_ret.S
Stefan Liebler 8beba15d53 S390: Add cfi information for start routines in order to stop unwinding.
GDB failed to detect the outermost frame while showing the backtrace
within a thread:
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

Before this patch, the start routines like thread_start had no cfi information.
GDB is then using the prologue unwinder if no cfi information is available.
This unwinder tries to unwind r15 and stops e.g. if r15 was updated or
on some jump-instructions.

On older glibc-versions (before commit "Remove cached PID/TID in clone"
c579f48edb), the thread_start function used
such a jump-instruction and GDB did not fail with an error.

This patch adds cfi information for _start, thread_start and __makecontext_ret
and marks r14 as undefined which marks the frame as outermost frame and GDB
stops the backtrace. Also tested different gcc versions in order to test
_Unwind_Backtrace() in libgcc as this is used by backtrace() in glibc.

ChangeLog:

	* sysdeps/s390/s390-64/start.S (_start): Add cfi information for r14.
	* sysdeps/s390/s390-32/start.S: (_start): Likewise
	* sysdeps/unix/sysv/linux/s390/s390-64/clone.S
	(thread_start): Likewise.
	* sysdeps/unix/sysv/linux/s390/s390-32/clone.S
	(thread_start): Likewise.
	* sysdeps/unix/sysv/linux/s390/s390-64/__makecontext_ret.S
	(__makecontext_ret): Likewise.
	* sysdeps/unix/sysv/linux/s390/s390-32/__makecontext_ret.S
	(__makecontext_ret): Likewise.
2017-11-21 08:45:28 +01:00

44 lines
1.5 KiB
ArmAsm

/* Copyright (C) 2012-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
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
ENTRY(__makecontext_ret)
/* Mark r14 as undefined in order to stop unwinding here! */
cfi_undefined (r14)
basr %r14,%r7
ltr %r8,%r8 /* Check whether uc_link is 0. */
jz 1f
lr %r2,%r8
br %r9
1: lhi %r2,0 /* EXIT return value. */
#ifdef NO_HIDDEN
/* If SHARED and NO_HIDDEN is defined, we need to setup got pointer
as HIDDEN_JUMPTARGET expands to JUMPTARGET which expands to
exit@PLT. Otherwise HIDDEN_JUMPTARGET expands to __GI_exit if
SHARED is defined and to exit if SHARED is not defined. */
SYSCALL_PIC_SETUP
#endif
basr %r1,0
2:
al %r1,3f-2b(%r1)
basr %r14,%r1 /* Call exit. */
j .+2 /* Trap if exit returns for some reason. */
3:
.long HIDDEN_JUMPTARGET (exit) - 2b
END(__makecontext_ret)