From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTPS id 6B36D3858438 for ; Tue, 18 Jan 2022 12:54:48 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 6B36D3858438 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-546-MHQ3WolSP9OQWyvI68ulKA-1; Tue, 18 Jan 2022 07:54:44 -0500 X-MC-Unique: MHQ3WolSP9OQWyvI68ulKA-1 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 4C18E8143E5; Tue, 18 Jan 2022 12:54:43 +0000 (UTC) Received: from oldenburg.str.redhat.com (unknown [10.39.192.198]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 3BCED752D6; Tue, 18 Jan 2022 12:54:42 +0000 (UTC) From: Florian Weimer To: Stefan Liebler Cc: libc-alpha@sourceware.org Subject: Re: [PATCH 7/7] s390x: Use in early HWCAP check References: <201e517c6a751bebe505af99e35a9f8643066f31.1642162312.git.fweimer@redhat.com> <81a3cde1-250e-b04a-0037-4fb7f363fd42@linux.ibm.com> Date: Tue, 18 Jan 2022 13:54:40 +0100 In-Reply-To: <81a3cde1-250e-b04a-0037-4fb7f363fd42@linux.ibm.com> (Stefan Liebler's message of "Tue, 18 Jan 2022 13:42:26 +0100") Message-ID: <87czkpjjan.fsf@oldenburg.str.redhat.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.2 (gnu/linux) MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Status: No, score=-12.5 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 18 Jan 2022 12:54:50 -0000 --=-=-= Content-Type: text/plain * Stefan Liebler: > I'm not quite sure if all your patches are already committed. I've just > give it a try with commit f8b765bec44e6c464a7eabf80e58c6851ca15ac3: > > - configure glibc with --with-rtld-early-cflags=-march=zEC12 and > CFLAGS=-march=z15 on a z15. > > - Rebooted with novx-kernel-parameter => vector-related HWCAPs are > disabled and executing vector-instructions leads to a crash > > - run a helloworld-program: crash due to vector-instruction in > _dl_setup_hash, which is called in _dl_start_final before > _dl_sysdep_start is called which runs dl_hwcap_check. > > I've checked the build-log and see that the following files are compiled > with -march=zEC12: > - dl-printf.c > - ../sysdeps/unix/sysv/linux/dl-write.c > - dl-tunables.c > - ../sysdeps/unix/sysv/linux/dl-sysdep.c > - rtld.c Sorry, I missed that requirement. Would you mind testing the attached patch? Thanks, Florian --=-=-= Content-Type: text/x-patch Content-Disposition: inline; filename=0001-elf-Move-_dl_setup_hash-to-its-own-file.patch >From dae7882e11191cab17afb22dba4ebba69f433d93 Mon Sep 17 00:00:00 2001 Message-Id: From: Florian Weimer Date: Tue, 18 Jan 2022 13:53:11 +0100 Subject: [PATCH] elf: Move _dl_setup_hash to its own file To: libc-alpha@sourceware.org And compile it with the early CFLAGS. _dl_setup_hash is called very early for the ld.so link map, so it should be compiled differently. --- elf/Makefile | 2 ++ elf/dl-lookup.c | 45 -------------------------------- elf/dl-setup_hash.c | 63 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+), 45 deletions(-) create mode 100644 elf/dl-setup_hash.c diff --git a/elf/Makefile b/elf/Makefile index c6c4710e16..692a65b061 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -74,6 +74,7 @@ dl-routines = \ dl-reloc \ dl-runtime \ dl-scope \ + dl-setup_hash \ dl-sort-maps \ dl-thread_gscope_wait \ dl-tls \ @@ -169,6 +170,7 @@ CFLAGS-.os += $(call elide-stack-protector,.os,$(all-rtld-routines)) # Add the requested compiler flags to the early startup code. CFLAGS-dl-printf.os += $(rtld-early-cflags) +CFLAGS-dl-setup_hash.os += $(rtld-early-cflags) CFLAGS-dl-sysdep.os += $(rtld-early-cflags) CFLAGS-dl-tunables.os += $(rtld-early-cflags) CFLAGS-dl-write.os += $(rtld-early-cflags) diff --git a/elf/dl-lookup.c b/elf/dl-lookup.c index f43ae150b7..cbf46fda62 100644 --- a/elf/dl-lookup.c +++ b/elf/dl-lookup.c @@ -953,51 +953,6 @@ _dl_lookup_symbol_x (const char *undef_name, struct link_map *undef_map, } -/* Cache the location of MAP's hash table. */ - -void -_dl_setup_hash (struct link_map *map) -{ - Elf_Symndx *hash; - - if (__glibc_likely (map->l_info[ELF_MACHINE_GNU_HASH_ADDRIDX] != NULL)) - { - Elf32_Word *hash32 - = (void *) D_PTR (map, l_info[ELF_MACHINE_GNU_HASH_ADDRIDX]); - map->l_nbuckets = *hash32++; - Elf32_Word symbias = *hash32++; - Elf32_Word bitmask_nwords = *hash32++; - /* Must be a power of two. */ - assert ((bitmask_nwords & (bitmask_nwords - 1)) == 0); - map->l_gnu_bitmask_idxbits = bitmask_nwords - 1; - map->l_gnu_shift = *hash32++; - - map->l_gnu_bitmask = (ElfW(Addr) *) hash32; - hash32 += __ELF_NATIVE_CLASS / 32 * bitmask_nwords; - - map->l_gnu_buckets = hash32; - hash32 += map->l_nbuckets; - map->l_gnu_chain_zero = hash32 - symbias; - - /* Initialize MIPS xhash translation table. */ - ELF_MACHINE_XHASH_SETUP (hash32, symbias, map); - - return; - } - - if (!map->l_info[DT_HASH]) - return; - hash = (void *) D_PTR (map, l_info[DT_HASH]); - - map->l_nbuckets = *hash++; - /* Skip nchain. */ - hash++; - map->l_buckets = hash; - hash += map->l_nbuckets; - map->l_chain = hash; -} - - static void _dl_debug_bindings (const char *undef_name, struct link_map *undef_map, const ElfW(Sym) **ref, struct sym_val *value, diff --git a/elf/dl-setup_hash.c b/elf/dl-setup_hash.c new file mode 100644 index 0000000000..6dd57c5c94 --- /dev/null +++ b/elf/dl-setup_hash.c @@ -0,0 +1,63 @@ +/* Cache the location of a link map hash table. + Copyright (C) 1995-2022 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 + +void +_dl_setup_hash (struct link_map *map) +{ + Elf_Symndx *hash; + + if (__glibc_likely (map->l_info[ELF_MACHINE_GNU_HASH_ADDRIDX] != NULL)) + { + Elf32_Word *hash32 + = (void *) D_PTR (map, l_info[ELF_MACHINE_GNU_HASH_ADDRIDX]); + map->l_nbuckets = *hash32++; + Elf32_Word symbias = *hash32++; + Elf32_Word bitmask_nwords = *hash32++; + /* Must be a power of two. */ + assert ((bitmask_nwords & (bitmask_nwords - 1)) == 0); + map->l_gnu_bitmask_idxbits = bitmask_nwords - 1; + map->l_gnu_shift = *hash32++; + + map->l_gnu_bitmask = (ElfW(Addr) *) hash32; + hash32 += __ELF_NATIVE_CLASS / 32 * bitmask_nwords; + + map->l_gnu_buckets = hash32; + hash32 += map->l_nbuckets; + map->l_gnu_chain_zero = hash32 - symbias; + + /* Initialize MIPS xhash translation table. */ + ELF_MACHINE_XHASH_SETUP (hash32, symbias, map); + + return; + } + + if (!map->l_info[DT_HASH]) + return; + hash = (void *) D_PTR (map, l_info[DT_HASH]); + + map->l_nbuckets = *hash++; + /* Skip nchain. */ + hash++; + map->l_buckets = hash; + hash += map->l_nbuckets; + map->l_chain = hash; +} -- 2.34.1 --=-=-=--