From patchwork Thu Nov 8 20:13:39 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 995172 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=sourceware.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=libc-alpha-return-97082-incoming=patchwork.ozlabs.org@sourceware.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.b="DGf6Oj0b"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 42rZHg6CN6z9s7T for ; Fri, 9 Nov 2018 07:14:07 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; q=dns; s= default; b=axErz6v/kENauIWtMYTnQbrXz2OizGgUU9KOg0ULKtXjQTXPkteBb LxlS4MP8P4E0bxNszoOIzmLOnNRN6lKfXnwEONekntYDnOoatNESX9gPkg+YWt2l iMTkuyRgdqDwqe/fTv/+AIYxGYhPv0nH6+hxxXGAi7rfMCBCQiHta8= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; s=default; bh=FJgEWx7C0sXi/kENEFrTBUJJHyg=; b=DGf6Oj0blWkCJPVFal1c2uzO5yhY 1wP4AUdDbGkepEgD+lZqmjhzzsc8+LW4pSdiZ3iLwMohGfadBD+oTluzI1HgdGlR TeFIqRHNm5v+JHqFSvQsenoM+ynjlkd4w5Jx+Hu2AtRoTmVnYamr8pJ6bTsE+3jT fX1Z8jxpuri/0+4= Received: (qmail 20034 invoked by alias); 8 Nov 2018 20:13:49 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 19905 invoked by uid 89); 8 Nov 2018 20:13:48 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.2 required=5.0 tests=BAYES_00, FREEMAIL_FROM, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, SPF_SOFTFAIL autolearn=ham version=3.3.2 spammy=HContent-Transfer-Encoding:8bit X-HELO: mga18.intel.com From: "H.J. Lu" To: libc-alpha@sourceware.org Subject: [PATCH 1/2] elf: Update GNU_PROPERTY_X86_XXX macros [BZ #23797] Date: Thu, 8 Nov 2018 12:13:39 -0800 Message-Id: <20181108201340.29845-2-hjl.tools@gmail.com> In-Reply-To: <20181108201340.29845-1-hjl.tools@gmail.com> References: <20181108201340.29845-1-hjl.tools@gmail.com> MIME-Version: 1.0 This patch updates GNU_PROPERTY_X86_XXX macros according to the x86 program property in x86-64 psABI: https://github.com/hjl-tools/x86-psABI/wiki/x86-64-psABI-property.pdf 1. GNU_PROPERTY_X86_UINT32_AND_XXX: A 4-byte unsigned integer property. A bit is set if it is set in all relocatable inputs: #define GNU_PROPERTY_X86_UINT32_AND_LO 0xc0000002 #define GNU_PROPERTY_X86_UINT32_AND_HI 0xc0007fff 2. GNU_PROPERTY_X86_UINT32_OR_XXX: A 4-byte unsigned integer property. A bit is set if it is set in any relocatable inputs: #define GNU_PROPERTY_X86_UINT32_OR_LO 0xc0008000 #define GNU_PROPERTY_X86_UINT32_OR_HI 0xc000ffff 3. GNU_PROPERTY_X86_UINT32_OR_AND_XXX: A 4-byte unsigned integer property. A bit is set if it is set in any relocatable inputs and the property is present in all relocatable inputs: #define GNU_PROPERTY_X86_UINT32_OR_AND_LO 0xc0010000 #define GNU_PROPERTY_X86_UINT32_OR_AND_HI 0xc0017fff 4. GNU_PROPERTY_X86_FEATURE_2_NEEDED, GNU_PROPERTY_X86_FEATURE_2_USED and GNU_PROPERTY_X86_FEATURE_2_XXX bits. GNU_PROPERTY_X86_FEATURE_1_AND is unchanged. GNU_PROPERTY_X86_ISA_1_USED and GNU_PROPERTY_X86_FEATURE_2_USED are redefined to better support targeted processors since GNU_PROPERTY_X86_ISA_1_?86 aren't isn't very useful. A new set of GNU_PROPERTY_X86_ISA_1_XXX bits are defined. The previous GNU_PROPERTY_X86_ISA_1_XXX macros are removed. NOTE: The NT_GNU_PROPERTY_TYPE_0 note is used to describe features and capabilities supported by ELF binaries. Consumers of ELF binaries can consult the NT_GNU_PROPERTY_TYPE_0 note to make appropriate decisions. If a consumer of ELF binaries ignores NT_GNU_PROPERTY_TYPE_0 note, nothing is changed. [BZ #23797] * elf.h (GNU_PROPERTY_X86_UINT32_AND_LO): New. (GNU_PROPERTY_X86_UINT32_AND_HI): Likewise. (GNU_PROPERTY_X86_UINT32_OR_LO): Likewise. (GNU_PROPERTY_X86_UINT32_OR_HI): Likewise. (GNU_PROPERTY_X86_UINT32_OR_AND_LO): Likewise. (GNU_PROPERTY_X86_UINT32_OR_AND_HI): Likewise. (GNU_PROPERTY_X86_ISA_1_CMOV): Likewise. (GNU_PROPERTY_X86_ISA_1_SSE): Likewise. (GNU_PROPERTY_X86_ISA_1_SSE2): Likewise. (GNU_PROPERTY_X86_ISA_1_SSE3): Likewise. (GNU_PROPERTY_X86_ISA_1_SSSE3): Likewise. (GNU_PROPERTY_X86_ISA_1_SSE4_1): Likewise. (GNU_PROPERTY_X86_ISA_1_SSE4_2): Likewise. (GNU_PROPERTY_X86_ISA_1_AVX): Likewise. (GNU_PROPERTY_X86_ISA_1_AVX2): Likewise. (GNU_PROPERTY_X86_ISA_1_FMA): Likewise. (GNU_PROPERTY_X86_ISA_1_AVX512F): Likewise. (GNU_PROPERTY_X86_ISA_1_AVX512CD): Likewise. (GNU_PROPERTY_X86_ISA_1_AVX512ER): Likewise. (GNU_PROPERTY_X86_ISA_1_AVX512PF): Likewise. (GNU_PROPERTY_X86_ISA_1_AVX512VL): Likewise. (GNU_PROPERTY_X86_ISA_1_AVX512DQ): Likewise. (GNU_PROPERTY_X86_ISA_1_AVX512BW): Likewise. (GNU_PROPERTY_X86_ISA_1_AVX512_4FMAPS): Likewise. (GNU_PROPERTY_X86_ISA_1_AVX512_4VNNIW): Likewise. (GNU_PROPERTY_X86_ISA_1_AVX512_BITALG): Likewise. (GNU_PROPERTY_X86_ISA_1_AVX512_IFMA): Likewise. (GNU_PROPERTY_X86_ISA_1_AVX512_VBMI): Likewise. (GNU_PROPERTY_X86_ISA_1_AVX512_VBMI2): Likewise. (GNU_PROPERTY_X86_ISA_1_AVX512_VNNI): Likewise. (GNU_PROPERTY_X86_FEATURE_2_X86): Likewise. (GNU_PROPERTY_X86_FEATURE_2_X87): Likewise. (GNU_PROPERTY_X86_FEATURE_2_MMX): Likewise. (GNU_PROPERTY_X86_FEATURE_2_XMM): Likewise. (GNU_PROPERTY_X86_FEATURE_2_YMM): Likewise. (GNU_PROPERTY_X86_FEATURE_2_ZMM): Likewise. (GNU_PROPERTY_X86_FEATURE_2_FXSR): Likewise. (GNU_PROPERTY_X86_FEATURE_2_XSAVE): Likewise. (GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT): Likewise. (GNU_PROPERTY_X86_FEATURE_2_XSAVEC): Likewise. (GNU_PROPERTY_X86_FEATURE_1_AND): Updated to (GNU_PROPERTY_X86_UINT32_AND_LO + 0). (GNU_PROPERTY_X86_ISA_1_NEEDED): Defined to (GNU_PROPERTY_X86_UINT32_OR_LO + 0). (GNU_PROPERTY_X86_FEATURE_2_NEEDED): New. Defined to (GNU_PROPERTY_X86_UINT32_OR_LO + 1). (GNU_PROPERTY_X86_ISA_1_USED): Defined to (GNU_PROPERTY_X86_UINT32_OR_AND_LO + 0). (GNU_PROPERTY_X86_FEATURE_2_USED): New. Defined to (GNU_PROPERTY_X86_UINT32_OR_AND_LO + 1). --- elf/elf.h | 98 +++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 73 insertions(+), 25 deletions(-) diff --git a/elf/elf.h b/elf/elf.h index 69ffa2ec0e..b4bd428187 100644 --- a/elf/elf.h +++ b/elf/elf.h @@ -1307,33 +1307,81 @@ typedef struct /* Application-specific semantics, hi */ #define GNU_PROPERTY_HIUSER 0xffffffff -/* The x86 instruction sets indicated by the corresponding bits are - used in program. Their support in the hardware is optional. */ -#define GNU_PROPERTY_X86_ISA_1_USED 0xc0000000 +/* A 4-byte unsigned integer property: A bit is set if it is set in all + relocatable inputs. */ +#define GNU_PROPERTY_X86_UINT32_AND_LO 0xc0000002 +#define GNU_PROPERTY_X86_UINT32_AND_HI 0xc0007fff + +/* A 4-byte unsigned integer property: A bit is set if it is set in any + relocatable inputs. */ +#define GNU_PROPERTY_X86_UINT32_OR_LO 0xc0008000 +#define GNU_PROPERTY_X86_UINT32_OR_HI 0xc000ffff + +/* A 4-byte unsigned integer property: A bit is set if it is set in any + relocatable inputs and the property is present in all relocatable + inputs. */ +#define GNU_PROPERTY_X86_UINT32_OR_AND_LO 0xc0010000 +#define GNU_PROPERTY_X86_UINT32_OR_AND_HI 0xc0017fff + +/* X86 processor-specific features used in program. */ +#define GNU_PROPERTY_X86_FEATURE_1_AND \ + (GNU_PROPERTY_X86_UINT32_AND_LO + 0) + /* The x86 instruction sets indicated by the corresponding bits are used in program and they must be supported by the hardware. */ -#define GNU_PROPERTY_X86_ISA_1_NEEDED 0xc0000001 -/* X86 processor-specific features used in program. */ -#define GNU_PROPERTY_X86_FEATURE_1_AND 0xc0000002 - -#define GNU_PROPERTY_X86_ISA_1_486 (1U << 0) -#define GNU_PROPERTY_X86_ISA_1_586 (1U << 1) -#define GNU_PROPERTY_X86_ISA_1_686 (1U << 2) -#define GNU_PROPERTY_X86_ISA_1_SSE (1U << 3) -#define GNU_PROPERTY_X86_ISA_1_SSE2 (1U << 4) -#define GNU_PROPERTY_X86_ISA_1_SSE3 (1U << 5) -#define GNU_PROPERTY_X86_ISA_1_SSSE3 (1U << 6) -#define GNU_PROPERTY_X86_ISA_1_SSE4_1 (1U << 7) -#define GNU_PROPERTY_X86_ISA_1_SSE4_2 (1U << 8) -#define GNU_PROPERTY_X86_ISA_1_AVX (1U << 9) -#define GNU_PROPERTY_X86_ISA_1_AVX2 (1U << 10) -#define GNU_PROPERTY_X86_ISA_1_AVX512F (1U << 11) -#define GNU_PROPERTY_X86_ISA_1_AVX512CD (1U << 12) -#define GNU_PROPERTY_X86_ISA_1_AVX512ER (1U << 13) -#define GNU_PROPERTY_X86_ISA_1_AVX512PF (1U << 14) -#define GNU_PROPERTY_X86_ISA_1_AVX512VL (1U << 15) -#define GNU_PROPERTY_X86_ISA_1_AVX512DQ (1U << 16) -#define GNU_PROPERTY_X86_ISA_1_AVX512BW (1U << 17) +#define GNU_PROPERTY_X86_ISA_1_NEEDED \ + (GNU_PROPERTY_X86_UINT32_OR_LO + 0) +#define GNU_PROPERTY_X86_FEATURE_2_NEEDED \ + (GNU_PROPERTY_X86_UINT32_OR_LO + 1) + +/* The x86 instruction sets indicated by the corresponding bits are + used in program. Their support in the hardware is optional. */ +#define GNU_PROPERTY_X86_ISA_1_USED \ + (GNU_PROPERTY_X86_UINT32_OR_AND_LO + 0) +#define GNU_PROPERTY_X86_FEATURE_2_USED \ + (GNU_PROPERTY_X86_UINT32_OR_AND_LO + 1) + +/* Set by linker to indicate that the property is valid. */ +#define GNU_PROPERTY_X86_UINT32_VALID (1U << 31) + +#define GNU_PROPERTY_X86_FEATURE_1_IBT (1U << 0) +#define GNU_PROPERTY_X86_FEATURE_1_SHSTK (1U << 1) + +#define GNU_PROPERTY_X86_ISA_1_CMOV (1U << 0) +#define GNU_PROPERTY_X86_ISA_1_SSE (1U << 1) +#define GNU_PROPERTY_X86_ISA_1_SSE2 (1U << 2) +#define GNU_PROPERTY_X86_ISA_1_SSE3 (1U << 3) +#define GNU_PROPERTY_X86_ISA_1_SSSE3 (1U << 4) +#define GNU_PROPERTY_X86_ISA_1_SSE4_1 (1U << 5) +#define GNU_PROPERTY_X86_ISA_1_SSE4_2 (1U << 6) +#define GNU_PROPERTY_X86_ISA_1_AVX (1U << 7) +#define GNU_PROPERTY_X86_ISA_1_AVX2 (1U << 8) +#define GNU_PROPERTY_X86_ISA_1_FMA (1U << 9) +#define GNU_PROPERTY_X86_ISA_1_AVX512F (1U << 10) +#define GNU_PROPERTY_X86_ISA_1_AVX512CD (1U << 11) +#define GNU_PROPERTY_X86_ISA_1_AVX512ER (1U << 12) +#define GNU_PROPERTY_X86_ISA_1_AVX512PF (1U << 13) +#define GNU_PROPERTY_X86_ISA_1_AVX512VL (1U << 14) +#define GNU_PROPERTY_X86_ISA_1_AVX512DQ (1U << 15) +#define GNU_PROPERTY_X86_ISA_1_AVX512BW (1U << 16) +#define GNU_PROPERTY_X86_ISA_1_AVX512_4FMAPS (1U << 17) +#define GNU_PROPERTY_X86_ISA_1_AVX512_4VNNIW (1U << 18) +#define GNU_PROPERTY_X86_ISA_1_AVX512_BITALG (1U << 19) +#define GNU_PROPERTY_X86_ISA_1_AVX512_IFMA (1U << 20) +#define GNU_PROPERTY_X86_ISA_1_AVX512_VBMI (1U << 21) +#define GNU_PROPERTY_X86_ISA_1_AVX512_VBMI2 (1U << 22) +#define GNU_PROPERTY_X86_ISA_1_AVX512_VNNI (1U << 23) + +#define GNU_PROPERTY_X86_FEATURE_2_X86 (1U << 0) +#define GNU_PROPERTY_X86_FEATURE_2_X87 (1U << 1) +#define GNU_PROPERTY_X86_FEATURE_2_MMX (1U << 2) +#define GNU_PROPERTY_X86_FEATURE_2_XMM (1U << 3) +#define GNU_PROPERTY_X86_FEATURE_2_YMM (1U << 4) +#define GNU_PROPERTY_X86_FEATURE_2_ZMM (1U << 5) +#define GNU_PROPERTY_X86_FEATURE_2_FXSR (1U << 6) +#define GNU_PROPERTY_X86_FEATURE_2_XSAVE (1U << 7) +#define GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT (1U << 8) +#define GNU_PROPERTY_X86_FEATURE_2_XSAVEC (1U << 9) /* This indicates that all executable sections are compatible with IBT. */ From patchwork Thu Nov 8 20:13:40 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 995171 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=sourceware.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=libc-alpha-return-97081-incoming=patchwork.ozlabs.org@sourceware.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.b="BnT1IU9x"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 42rZHV5TKZz9s7T for ; Fri, 9 Nov 2018 07:13:58 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; q=dns; s= default; b=jION36bcLTBYFkrQeBcnp0ApVZDTNDSfWVEJq9Lt5bmMKNRaaPEzm oJl44NR1RQJhMduGWuzTo7uE+HbAC5zyCd2jY7mbCvzO5Aa2ytzGMVWNWYrgaBv1 JqD96xFi8R72OOU1i3aEina34PgompvaaY1LCdXz4hKf210g8Ifi8g= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; s=default; bh=9wKPT9hsloCMrggkzIMFf6WO2Y8=; b=BnT1IU9xHuvLaj+bO7DzqNvNQBOD CVQsa6NQmR1amRo7BHBAulNfLonsNL1GGvYPLAG6hSQPA+v8rlQN5mjdn9DHBYec 5jS5Gsa/D2X60VYmvB3B3Gm9Kz2hdGsblyYV7Ep6B+0mPrhJXRYRA7T2jlhE6ACL F/Zv5+hVZ4YhiLg= Received: (qmail 19540 invoked by alias); 8 Nov 2018 20:13:46 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 19419 invoked by uid 89); 8 Nov 2018 20:13:45 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.2 required=5.0 tests=BAYES_00, FREEMAIL_FROM, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, SPF_SOFTFAIL autolearn=ham version=3.3.2 spammy=HContent-Transfer-Encoding:8bit X-HELO: mga18.intel.com From: "H.J. Lu" To: libc-alpha@sourceware.org Subject: [PATCH 2/2] x86/CET: Stop if the GNU_PROPERTY_X86_UINT32_VALID bit is set Date: Thu, 8 Nov 2018 12:13:40 -0800 Message-Id: <20181108201340.29845-3-hjl.tools@gmail.com> In-Reply-To: <20181108201340.29845-1-hjl.tools@gmail.com> References: <20181108201340.29845-1-hjl.tools@gmail.com> MIME-Version: 1.0 When updated linkers merge input .note.gnu.property sections into one .note.gnu.property section, it sets the GNU_PROPERTY_X86_UINT32_VALID bit in the GNU_PROPERTY_X86_FEATURE_1_AND property. This can be used to detect if the NT_GNU_PROPERTY_TYPE_0 note is generated by updated linkers. If the GNU_PROPERTY_X86_UINT32_VALID bit is set, we can stop checking for invalid .note.gnu.property section. * sysdeps/x86/dl-prop.h (_dl_process_cet_property_note): Stop if the GNU_PROPERTY_X86_UINT32_VALID bit is set. --- sysdeps/x86/dl-prop.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sysdeps/x86/dl-prop.h b/sysdeps/x86/dl-prop.h index 9ab890d12b..5c06aa5fbc 100644 --- a/sysdeps/x86/dl-prop.h +++ b/sysdeps/x86/dl-prop.h @@ -115,6 +115,11 @@ _dl_process_cet_property_note (struct link_map *l, feature_1 = *(unsigned int *) ptr; + /* Done if this property note is created by updated + linker. */ + if ((feature_1 & GNU_PROPERTY_X86_UINT32_VALID)) + goto found_feature_1; + /* Keep searching for the next GNU property note generated by the older linker. */ break; @@ -138,6 +143,7 @@ _dl_process_cet_property_note (struct link_map *l, align)); } +found_feature_1: /* We get here only if there is one or no GNU property note. */ if ((feature_1 & GNU_PROPERTY_X86_FEATURE_1_IBT)) l->l_cet |= lc_ibt;