summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIlya Leoshkevich <iii@linux.ibm.com>2018-08-10 09:07:43 +0200
committerStefan Liebler <stli@linux.ibm.com>2018-08-10 09:07:43 +0200
commit69e2444ab1444ab8210598abbcb4822701d368b9 (patch)
treedd8987d70c9f8365bb9d697cfc55cebf94aa2bff
parentbde6320f39cfe56fe3cbafe55fc498d7b329ff05 (diff)
downloadglibc-69e2444ab1444ab8210598abbcb4822701d368b9.tar.gz
S390: Test that lazy binding does not clobber R0
The following combinations need to be tested: * 32- (g5, esa and zarch) and 64-bit * linux32 glibc/configure CC='gcc -m31 -march=g5' * linux32 glibc/configure CC='gcc -m31' * linux32 glibc/configure CC='gcc -m31 -mzarch' * With and without VX: * glibc/configure libc_cv_asm_s390_vx=no * With and without profiling (using LD_PROFILE) * With and without pltexit (using LD_AUDIT) ChangeLog: * sysdeps/s390/Makefile: Register the new tests. * sysdeps/s390/tst-dl-runtime-mod.S: New file. * sysdeps/s390/tst-dl-runtime-profile-audit.c: New file. * sysdeps/s390/tst-dl-runtime-profile-noaudit.c: New file. * sysdeps/s390/tst-dl-runtime-resolve-audit.c: New file. * sysdeps/s390/tst-dl-runtime-resolve-noaudit.c: New file. * sysdeps/s390/tst-dl-runtime.c: New file.
-rw-r--r--ChangeLog10
-rw-r--r--sysdeps/s390/Makefile23
-rw-r--r--sysdeps/s390/tst-dl-runtime-mod.S30
-rw-r--r--sysdeps/s390/tst-dl-runtime-profile-audit.c19
-rw-r--r--sysdeps/s390/tst-dl-runtime-profile-noaudit.c19
-rw-r--r--sysdeps/s390/tst-dl-runtime-resolve-audit.c19
-rw-r--r--sysdeps/s390/tst-dl-runtime-resolve-noaudit.c19
-rw-r--r--sysdeps/s390/tst-dl-runtime.c91
8 files changed, 230 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 87e3288712..ae2868ffe0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
2018-08-10 Ilya Leoshkevich <iii@linux.ibm.com>
+ * sysdeps/s390/Makefile: Register the new tests.
+ * sysdeps/s390/tst-dl-runtime-mod.S: New file.
+ * sysdeps/s390/tst-dl-runtime-profile-audit.c: New file.
+ * sysdeps/s390/tst-dl-runtime-profile-noaudit.c: New file.
+ * sysdeps/s390/tst-dl-runtime-resolve-audit.c: New file.
+ * sysdeps/s390/tst-dl-runtime-resolve-noaudit.c: New file.
+ * sysdeps/s390/tst-dl-runtime.c: New file.
+
+2018-08-10 Ilya Leoshkevich <iii@linux.ibm.com>
+
* sysdeps/s390/s390-64/dl-trampoline.h (_dl_runtime_profile):
Do not clobber R0.
diff --git a/sysdeps/s390/Makefile b/sysdeps/s390/Makefile
index 8a54f88cd7..496ab51973 100644
--- a/sysdeps/s390/Makefile
+++ b/sysdeps/s390/Makefile
@@ -29,3 +29,26 @@ $(inst_gconvdir)/%.so: $(objpfx)%.so $(+force)
sysdeps-gconv-modules = ../sysdeps/s390/gconv-modules
endif
+
+ifeq ($(subdir),elf)
+ifeq ($(build-shared),yes)
+tests += tst-dl-runtime-resolve-noaudit tst-dl-runtime-resolve-audit \
+ tst-dl-runtime-profile-noaudit
+# FIXME: When both LD_PROFILE and LD_AUDIT are set, a segfault occurs.
+#tests += tst-dl-runtime-profile-audit
+modules-names += tst-dl-runtime-mod
+$(objpfx)tst-dl-runtime-resolve-noaudit: $(objpfx)tst-dl-runtime-mod.so
+$(objpfx)tst-dl-runtime-resolve-audit: $(objpfx)tst-dl-runtime-mod.so
+$(objpfx)tst-dl-runtime-profile-noaudit: $(objpfx)tst-dl-runtime-mod.so
+$(objpfx)tst-dl-runtime-profile-audit: $(objpfx)tst-dl-runtime-mod.so
+$(objpfx)tst-dl-runtime-resolve-audit.out: $(objpfx)tst-auditmod1.so
+$(objpfx)tst-dl-runtime-profile-audit.out: $(objpfx)tst-auditmod1.so
+# The profiling output goes to $LD_PROFILE_OUTPUT/$LD_PROFILE.profile
+env-profile = LD_PROFILE=$(objpfx)tst-dl-runtime-mod.so \
+ LD_PROFILE_OUTPUT=/
+env-audit = LD_AUDIT=$(objpfx)tst-auditmod1.so
+tst-dl-runtime-resolve-audit-ENV = $(env-audit)
+tst-dl-runtime-profile-noaudit-ENV = $(env-profile)
+tst-dl-runtime-profile-audit-ENV = $(env-profile) $(env-audit)
+endif
+endif
diff --git a/sysdeps/s390/tst-dl-runtime-mod.S b/sysdeps/s390/tst-dl-runtime-mod.S
new file mode 100644
index 0000000000..5568524db9
--- /dev/null
+++ b/sysdeps/s390/tst-dl-runtime-mod.S
@@ -0,0 +1,30 @@
+/* Shared library for the lazy binding tests.
+ Copyright (C) 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/>. */
+
+ .globl r0x2
+ .type r0x2, @function
+r0x2:
+ .cfi_startproc
+#if defined (__s390x__)
+ agr %r0,%r0
+#else
+ ar %r0,%r0
+#endif
+ br %r14
+ .cfi_endproc
+ .size r0x2, .-r0x2
diff --git a/sysdeps/s390/tst-dl-runtime-profile-audit.c b/sysdeps/s390/tst-dl-runtime-profile-audit.c
new file mode 100644
index 0000000000..a797e720b1
--- /dev/null
+++ b/sysdeps/s390/tst-dl-runtime-profile-audit.c
@@ -0,0 +1,19 @@
+/* Lazy binding test with profiling and auditing.
+ Copyright (C) 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 "tst-dl-runtime.c"
diff --git a/sysdeps/s390/tst-dl-runtime-profile-noaudit.c b/sysdeps/s390/tst-dl-runtime-profile-noaudit.c
new file mode 100644
index 0000000000..fedae9d0bb
--- /dev/null
+++ b/sysdeps/s390/tst-dl-runtime-profile-noaudit.c
@@ -0,0 +1,19 @@
+/* Lazy binding test with profiling.
+ Copyright (C) 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 "tst-dl-runtime.c"
diff --git a/sysdeps/s390/tst-dl-runtime-resolve-audit.c b/sysdeps/s390/tst-dl-runtime-resolve-audit.c
new file mode 100644
index 0000000000..a4fb189b3d
--- /dev/null
+++ b/sysdeps/s390/tst-dl-runtime-resolve-audit.c
@@ -0,0 +1,19 @@
+/* Lazy binding test with auditing.
+ Copyright (C) 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 "tst-dl-runtime.c"
diff --git a/sysdeps/s390/tst-dl-runtime-resolve-noaudit.c b/sysdeps/s390/tst-dl-runtime-resolve-noaudit.c
new file mode 100644
index 0000000000..472724c1c8
--- /dev/null
+++ b/sysdeps/s390/tst-dl-runtime-resolve-noaudit.c
@@ -0,0 +1,19 @@
+/* Lazy binding test.
+ Copyright (C) 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 "tst-dl-runtime.c"
diff --git a/sysdeps/s390/tst-dl-runtime.c b/sysdeps/s390/tst-dl-runtime.c
new file mode 100644
index 0000000000..7ab3c076ba
--- /dev/null
+++ b/sysdeps/s390/tst-dl-runtime.c
@@ -0,0 +1,91 @@
+/* Test that lazy binding does not clobber r0.
+ Copyright (C) 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 <assert.h>
+#include <dlfcn.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#if defined (__s390x__)
+static const unsigned long magic_value = 0x0011223344556677UL;
+#else
+static const unsigned long magic_value = 0x00112233;
+#endif
+
+unsigned long r0x2_trampoline (unsigned long);
+
+/* Invoke r0x2, which doubles the value in r0. If we get
+ value * 2 back, this means nothing clobbers r0, particularly,
+ _dl_runtime_resolve and _dl_runtime_profile. */
+asm (" .type r0x2_trampoline, @function\n"
+ "r0x2_trampoline:\n"
+#if defined (__s390x__)
+ " lgr %r0,%r2\n"
+ " stg %r14,112(%r15)\n"
+ " aghi %r15,-160\n"
+ " brasl %r14,r0x2@plt\n"
+ " aghi %r15,160\n"
+ " lg %r14,112(%r15)\n"
+ " lgr %r2,%r0\n"
+ " br %r14\n"
+#elif defined (__zarch__)
+ " lr %r0,%r2\n"
+ " st %r14,56(%r15)\n"
+ " ahi %r15,-96\n"
+ " brasl %r14,r0x2@plt\n"
+ " ahi %r15,96\n"
+ " l %r14,56(%r15)\n"
+ " lr %r2,%r0\n"
+ " br %r14\n"
+#else
+ " lr %r0,%r2\n"
+ " st %r14,56(%r15)\n"
+ " ahi %r15,-96\n"
+ " balr %r14,0\n"
+ " l %r14,1f-.(%r14)\n"
+ " basr %r14,%r14\n"
+ " ahi %r15,96\n"
+ " l %r14,56(%r15)\n"
+ " lr %r2,%r0\n"
+ " br %r14\n"
+ "1: .long r0x2\n"
+#endif
+ );
+
+static int
+do_test (void)
+{
+ int i;
+ unsigned long r0;
+ const char *run;
+
+ for (i = 0; i < 2; i++)
+ {
+ run = (i == 0) ? "lazy" : "non-lazy";
+ r0 = magic_value;
+ printf ("-> %s r0 = 0x%lx\n", run, r0);
+ r0 = r0x2_trampoline (r0);
+ printf ("<- %s r0 * 2 = 0x%lx\n", run, r0);
+ if (r0 != magic_value * 2)
+ return EXIT_FAILURE;
+ }
+ return EXIT_SUCCESS;
+}
+
+#include <support/test-driver.c>