about summary refs log tree commit diff
path: root/sysdeps/powerpc/powerpc64/setjmp-bug21895.c
diff options
context:
space:
mode:
authorRogerio Alves <rcardoso@linux.vnet.ibm.com>2018-07-16 15:07:10 -0300
committerTulio Magno Quites Machado Filho <tuliom@linux.ibm.com>2018-07-16 16:08:41 -0300
commit52b2a80fae89d2a99ac3d1866a73c8bbf7b608ff (patch)
treec861930d393bdd30c0cbdc7346aa388cee7eebf2 /sysdeps/powerpc/powerpc64/setjmp-bug21895.c
parent3ae725dfb6d7f61447d27d00ed83e573bd5454f4 (diff)
downloadglibc-52b2a80fae89d2a99ac3d1866a73c8bbf7b608ff.tar.gz
glibc-52b2a80fae89d2a99ac3d1866a73c8bbf7b608ff.tar.xz
glibc-52b2a80fae89d2a99ac3d1866a73c8bbf7b608ff.zip
powerpc64: Always restore TOC on longjmp [BZ #21895]
This patch changes longjmp to always restore the TOC pointer (r2 register)
to the caller frame on powerpc64 and powerpc64le.  This is related to bug
21895 that reports a situation where you have a static longjmp to a
shared object file.

	[BZ #21895]
	* sysdeps/powerpc/powerpc64/__longjmp-common.S: Remove condition code for
	restoring r2 in longjmp.
	* sysdeps/powerpc/powerpc64/Makefile: Added tst-setjmp-bug21895-static to
	test list.
	Added rules to build test tst-setjmp-bug21895-static.
	Added module setjmp-bug21895 and rules to build a shared object from it.
	* sysdeps/powerpc/powerpc64/setjmp-bug21895.c: New test file.
	* sysdeps/powerpc/powerpc64/tst-setjmp-bug21895-static.c: New test file.

Reviewed-by: Tulio Magno Quites Machado Filho <tuliom@linux.ibm.com>
Diffstat (limited to 'sysdeps/powerpc/powerpc64/setjmp-bug21895.c')
-rw-r--r--sysdeps/powerpc/powerpc64/setjmp-bug21895.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/sysdeps/powerpc/powerpc64/setjmp-bug21895.c b/sysdeps/powerpc/powerpc64/setjmp-bug21895.c
new file mode 100644
index 0000000000..945a251d95
--- /dev/null
+++ b/sysdeps/powerpc/powerpc64/setjmp-bug21895.c
@@ -0,0 +1,51 @@
+/* Shared object part of test for setjmp interoperability with static
+   dlopen BZ #21895.
+   Copyright (C) 2017-2018 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 <string.h>
+#include <setjmp.h>
+
+/* Copy r1 adress to a local variable.  */
+#define GET_STACK_POINTER(sp)	  \
+  ({				  \
+    asm volatile ("mr %0, 1\n\t"  \
+		  : "=r" (sp));	  \
+  })
+
+jmp_buf jb;
+void (*bar)(jmp_buf, unsigned long);
+
+void
+lbar (unsigned long sp)
+{
+  bar(jb, sp);
+  for(;;);
+}
+
+void
+foo (void)
+{
+  unsigned long sp;
+  /* Copy r1 (stack pointer) to sp. It will be use later to get
+     TOC area.  */
+  GET_STACK_POINTER(sp);
+  setjmp(jb);
+  lbar(sp);
+
+  for(;;);
+}