From 69e2444ab1444ab8210598abbcb4822701d368b9 Mon Sep 17 00:00:00 2001 From: Ilya Leoshkevich Date: Fri, 10 Aug 2018 09:07:43 +0200 Subject: 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. --- ChangeLog | 10 +++ sysdeps/s390/Makefile | 23 +++++++ sysdeps/s390/tst-dl-runtime-mod.S | 30 +++++++++ sysdeps/s390/tst-dl-runtime-profile-audit.c | 19 ++++++ sysdeps/s390/tst-dl-runtime-profile-noaudit.c | 19 ++++++ sysdeps/s390/tst-dl-runtime-resolve-audit.c | 19 ++++++ sysdeps/s390/tst-dl-runtime-resolve-noaudit.c | 19 ++++++ sysdeps/s390/tst-dl-runtime.c | 91 +++++++++++++++++++++++++++ 8 files changed, 230 insertions(+) create mode 100644 sysdeps/s390/tst-dl-runtime-mod.S create mode 100644 sysdeps/s390/tst-dl-runtime-profile-audit.c create mode 100644 sysdeps/s390/tst-dl-runtime-profile-noaudit.c create mode 100644 sysdeps/s390/tst-dl-runtime-resolve-audit.c create mode 100644 sysdeps/s390/tst-dl-runtime-resolve-noaudit.c create mode 100644 sysdeps/s390/tst-dl-runtime.c diff --git a/ChangeLog b/ChangeLog index 87e3288712..ae2868ffe0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2018-08-10 Ilya Leoshkevich + + * 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 * sysdeps/s390/s390-64/dl-trampoline.h (_dl_runtime_profile): 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 + . */ + + .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 + . */ + +#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 + . */ + +#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 + . */ + +#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 + . */ + +#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 + . */ + +#include +#include +#include +#include +#include + +#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 -- cgit 1.4.1