From patchwork Tue May 19 17:06:27 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Weimer X-Patchwork-Id: 39323 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 61EC33897827; Tue, 19 May 2020 17:06:34 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 61EC33897827 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1589907994; bh=p/80ztDUS1FVrneu4aRh4vNKOaPXdgdTCxYk4NH2MUc=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=c7MXrKa7B+BO2bHfn8gcU9FdUNurLWFXyeka/K3Cy2sUJpybEnjcNLwkgZjsMEqnE YSQRjqokr9oyWt8ziWJmoQSdCi9Y0BRknHFjk20LmEZtpV4kJPcmLfhB9ECktz/EDk Urdjd197Zfoh4Th7TfE9ySqZv7QH/+RZisffmzDM= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from us-smtp-1.mimecast.com (us-smtp-1.mimecast.com [205.139.110.61]) by sourceware.org (Postfix) with ESMTP id 7936A3894E62 for ; Tue, 19 May 2020 17:06:32 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 7936A3894E62 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-166-7hFGk_7qMFadputRFIikTA-1; Tue, 19 May 2020 13:06:30 -0400 X-MC-Unique: 7hFGk_7qMFadputRFIikTA-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 71CA3872FE0 for ; Tue, 19 May 2020 17:06:29 +0000 (UTC) Received: from oldenburg2.str.redhat.com (ovpn-113-18.ams2.redhat.com [10.36.113.18]) by smtp.corp.redhat.com (Postfix) with ESMTPS id C000460610 for ; Tue, 19 May 2020 17:06:28 +0000 (UTC) To: libc-alpha@sourceware.org Subject: [PATCH] elf: Do not read hwcaps from the vDSO in ld.so Date: Tue, 19 May 2020 19:06:27 +0200 Message-ID: <87wo57etws.fsf@oldenburg2.str.redhat.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.3 (gnu/linux) MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-14.1 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) 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-Patchwork-Original-From: Florian Weimer via Libc-alpha From: Florian Weimer Reply-To: Florian Weimer Errors-To: libc-alpha-bounces@sourceware.org Sender: "Libc-alpha" This was only ever used for the "nosegneg" flag. This approach for passing hardware capability information creates a subtle dependency between the kernel and userspace, and ld.so.cache contents. It seems inappropriate for toady, where people expect to be able to run system images which very different kernel versions. Reviewed-by: Adhemerval Zanella --- elf/dl-hwcaps.c | 110 -------------------------------------------------------- 1 file changed, 110 deletions(-) diff --git a/elf/dl-hwcaps.c b/elf/dl-hwcaps.c index 71aea86700..6df9efb255 100644 --- a/elf/dl-hwcaps.c +++ b/elf/dl-hwcaps.c @@ -26,12 +26,6 @@ #include #include -#ifdef _DL_FIRST_PLATFORM -# define _DL_FIRST_EXTRA (_DL_FIRST_PLATFORM + _DL_PLATFORMS_COUNT) -#else -# define _DL_FIRST_EXTRA _DL_HWCAP_COUNT -#endif - /* Return an array of useful/necessary hardware capability names. */ const struct r_strlenpair * _dl_important_hwcaps (const char *platform, size_t platform_len, size_t *sz, @@ -52,116 +46,12 @@ _dl_important_hwcaps (const char *platform, size_t platform_len, size_t *sz, if ((masked & (1ULL << n)) != 0) ++cnt; -#ifdef NEED_DL_SYSINFO_DSO - /* The system-supplied DSO can contain a note of type 2, vendor "GNU". - This gives us a list of names to treat as fake hwcap bits. */ - - const char *dsocaps = NULL; - size_t dsocapslen = 0; - if (GLRO(dl_sysinfo_map) != NULL) - { - const ElfW(Phdr) *const phdr = GLRO(dl_sysinfo_map)->l_phdr; - const ElfW(Word) phnum = GLRO(dl_sysinfo_map)->l_phnum; - for (uint_fast16_t i = 0; i < phnum; ++i) - if (phdr[i].p_type == PT_NOTE) - { - const ElfW(Addr) start = (phdr[i].p_vaddr - + GLRO(dl_sysinfo_map)->l_addr); - /* NB: Some PT_NOTE segment may have alignment value of 0 - or 1. gABI specifies that PT_NOTE segments should be - aligned to 4 bytes in 32-bit objects and to 8 bytes in - 64-bit objects. As a Linux extension, we also support - 4 byte alignment in 64-bit objects. If p_align is less - than 4, we treate alignment as 4 bytes since some note - segments have 0 or 1 byte alignment. */ - ElfW(Addr) align = phdr[i].p_align; - if (align < 4) - align = 4; - else if (align != 4 && align != 8) - continue; - /* The standard ELF note layout is exactly as the anonymous struct. - The next element is a variable length vendor name of length - VENDORLEN (with a real length rounded to ElfW(Word)), followed - by the data of length DATALEN (with a real length rounded to - ElfW(Word)). */ - const struct - { - ElfW(Word) vendorlen; - ElfW(Word) datalen; - ElfW(Word) type; - } *note = (const void *) start; - while ((ElfW(Addr)) (note + 1) - start < phdr[i].p_memsz) - { - /* The layout of the type 2, vendor "GNU" note is as follows: - .long - .long (as mask >> _DL_FIRST_EXTRA). - .byte - .asciz . */ - if (note->type == NT_GNU_HWCAP - && note->vendorlen == sizeof "GNU" - && !memcmp ((note + 1), "GNU", sizeof "GNU") - && note->datalen > 2 * sizeof (ElfW(Word)) + 2) - { - const ElfW(Word) *p - = ((const void *) note - + ELF_NOTE_DESC_OFFSET (sizeof "GNU", align)); - cnt += *p++; - ++p; /* Skip mask word. */ - dsocaps = (const char *) p; /* Pseudo-string "name" */ - dsocapslen = note->datalen - sizeof *p * 2; - break; - } - note = ((const void *) note - + ELF_NOTE_NEXT_OFFSET (note->vendorlen, - note->datalen, align)); - } - if (dsocaps != NULL) - break; - } - } -#endif - /* For TLS enabled builds always add 'tls'. */ ++cnt; /* Create temporary data structure to generate result table. */ struct r_strlenpair temp[cnt]; m = 0; -#ifdef NEED_DL_SYSINFO_DSO - if (dsocaps != NULL) - { - /* dsocaps points to the .asciz string, and -1 points to the mask - .long just before the string. */ - const ElfW(Word) mask = ((const ElfW(Word) *) dsocaps)[-1]; - GLRO(dl_hwcap) |= (uint64_t) mask << _DL_FIRST_EXTRA; - /* Note that we add the dsocaps to the set already chosen by the - LD_HWCAP_MASK environment variable (or default HWCAP_IMPORTANT). - So there is no way to request ignoring an OS-supplied dsocap - string and bit like you can ignore an OS-supplied HWCAP bit. */ - hwcap_mask |= (uint64_t) mask << _DL_FIRST_EXTRA; -#if HAVE_TUNABLES - TUNABLE_SET (glibc, cpu, hwcap_mask, uint64_t, hwcap_mask); -#else - GLRO(dl_hwcap_mask) = hwcap_mask; -#endif - size_t len; - for (const char *p = dsocaps; p < dsocaps + dsocapslen; p += len + 1) - { - uint_fast8_t bit = *p++; - len = strlen (p); - - /* Skip entries that are not enabled in the mask word. */ - if (__glibc_likely (mask & ((ElfW(Word)) 1 << bit))) - { - temp[m].str = p; - temp[m].len = len; - ++m; - } - else - --cnt; - } - } -#endif for (n = 0; masked != 0; ++n) if ((masked & (1ULL << n)) != 0) {