From patchwork Sat Aug 29 16:24:09 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 40339 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 B5C7D3857005; Sat, 29 Aug 2020 16:24:16 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B5C7D3857005 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1598718256; bh=ZuOD01jhTHZIOAIrx2l8uqdn3RR5yF+K33g0qClMyMM=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=l4wxgJuAUIq/Oxl0aEQJISk7Pdx2zX07PNXFc4crJriOD8L4V8z5mEWEnpAUOnGcs P8yMfz++7/jqWImRxJVZCTo9YfzMq0yzXO0BrEp291gHwbuvvcpGr5BxFhD0D+dxWA ga9SRfI10QK9OmtBXvu9LG0QvNvvZsIxe+RiIcss= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-pf1-x441.google.com (mail-pf1-x441.google.com [IPv6:2607:f8b0:4864:20::441]) by sourceware.org (Postfix) with ESMTPS id 046FE3857C64 for ; Sat, 29 Aug 2020 16:24:13 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 046FE3857C64 Received: by mail-pf1-x441.google.com with SMTP id t9so2230027pfq.8 for ; Sat, 29 Aug 2020 09:24:12 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=ZuOD01jhTHZIOAIrx2l8uqdn3RR5yF+K33g0qClMyMM=; b=TPJftUYeehgiyg4Yf44v5VjbwXKk3u756UbNpq4otPYXIlst4ehVbbLeCzg+Al9xXW uHjGISOH3IRzGYQN94IYpCnFaoVwBJwSDHnFiDfz0Cb8U6WkOKwODPnYGxkkXZhJH89d 8h6AzvYmQkE+MdrsrymlTa1QEjc0EDUWD6Dl9ZxoHTpncIjldMKzAHK2pID7jeKsddgM ThLK75BTFAdwNN6nnse+EJMhQnO8b2gv1ZuM/INVweJ2proo/gwnuAjjrQvoH1mlvq2j 0oF2LGEqeTU/InP+goUIeohD95Jbw3TtUHa+65h11zNgzUCF2ZqCVXDQtYDMI7DafFXE ZoQQ== X-Gm-Message-State: AOAM532lhzbWu0+hcXAPhaY03Oqp7YLgmrYe3W4j+tnyt4NM8TUotULi 6LbGZcpuZivp8seYBuj5Pma/8Xd9VgQ= X-Google-Smtp-Source: ABdhPJwjZriS4IjSpRcNdMt4rDFvfTi2yQeiBFsOhaCoWr6fP1Oe63U9wxx2xOAc9ATzfYHB3+g5sA== X-Received: by 2002:a63:d25:: with SMTP id c37mr2799449pgl.403.1598718251658; Sat, 29 Aug 2020 09:24:11 -0700 (PDT) Received: from gnu-cfl-2.localdomain (c-69-181-90-243.hsd1.ca.comcast.net. [69.181.90.243]) by smtp.gmail.com with ESMTPSA id d13sm3045258pfq.118.2020.08.29.09.24.10 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 29 Aug 2020 09:24:11 -0700 (PDT) Received: from gnu-cfl-2.localdomain (localhost [IPv6:::1]) by gnu-cfl-2.localdomain (Postfix) with ESMTP id 320C41A0210 for ; Sat, 29 Aug 2020 09:24:10 -0700 (PDT) To: libc-alpha@sourceware.org Subject: [PATCH] x86: Set CPU usable feature bits conservatively [BZ #26552] Date: Sat, 29 Aug 2020 09:24:09 -0700 Message-Id: <20200829162409.319707-1-hjl.tools@gmail.com> X-Mailer: git-send-email 2.26.2 MIME-Version: 1.0 X-Spam-Status: No, score=-12.8 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, UPPERCASE_50_75 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: "H.J. Lu via Libc-alpha" From: "H.J. Lu" Reply-To: "H.J. Lu" Errors-To: libc-alpha-bounces@sourceware.org Sender: "Libc-alpha" Set CPU usable feature bits only for CPU features which are usable in user space and whose usability can be detected from user space, excluding features like FSGSBASE whose enable bit can only be checked in the kernel. --- sysdeps/x86/cpu-features.c | 143 ++++++++++++------------------------- 1 file changed, 47 insertions(+), 96 deletions(-) diff --git a/sysdeps/x86/cpu-features.c b/sysdeps/x86/cpu-features.c index 4c24ba7c31..b0ded20486 100644 --- a/sysdeps/x86/cpu-features.c +++ b/sysdeps/x86/cpu-features.c @@ -44,107 +44,55 @@ extern void TUNABLE_CALLBACK (set_x86_shstk) (tunable_val_t *) static void update_usable (struct cpu_features *cpu_features) { - /* Before COMMON_CPUID_INDEX_80000001, copy the cpuid array elements to - the usable array. */ - unsigned int i; - for (i = 0; i < COMMON_CPUID_INDEX_80000001; i++) - cpu_features->features[i].usable = cpu_features->features[i].cpuid; - - /* Before COMMON_CPUID_INDEX_80000001, clear the unknown usable bits - and the always zero bits. */ - CPU_FEATURE_UNSET (cpu_features, INDEX_1_ECX_16); - CPU_FEATURE_UNSET (cpu_features, INDEX_1_ECX_31); - CPU_FEATURE_UNSET (cpu_features, INDEX_1_EDX_10); - CPU_FEATURE_UNSET (cpu_features, INDEX_1_EDX_20); - CPU_FEATURE_UNSET (cpu_features, INDEX_1_EDX_30); - CPU_FEATURE_UNSET (cpu_features, INDEX_7_EBX_6); - CPU_FEATURE_UNSET (cpu_features, INDEX_7_EBX_22); - CPU_FEATURE_UNSET (cpu_features, INDEX_7_ECX_13); - CPU_FEATURE_UNSET (cpu_features, INDEX_7_ECX_15); - CPU_FEATURE_UNSET (cpu_features, INDEX_7_ECX_16); - CPU_FEATURE_UNSET (cpu_features, INDEX_7_ECX_23); - CPU_FEATURE_UNSET (cpu_features, INDEX_7_ECX_24); - CPU_FEATURE_UNSET (cpu_features, INDEX_7_ECX_26); - CPU_FEATURE_UNSET (cpu_features, INDEX_7_EDX_0); - CPU_FEATURE_UNSET (cpu_features, INDEX_7_EDX_1); - CPU_FEATURE_UNSET (cpu_features, INDEX_7_EDX_5); - CPU_FEATURE_UNSET (cpu_features, INDEX_7_EDX_6); - CPU_FEATURE_UNSET (cpu_features, INDEX_7_EDX_7); - CPU_FEATURE_UNSET (cpu_features, INDEX_7_EDX_9); - CPU_FEATURE_UNSET (cpu_features, INDEX_7_EDX_11); - CPU_FEATURE_UNSET (cpu_features, INDEX_7_EDX_12); - CPU_FEATURE_UNSET (cpu_features, INDEX_7_EDX_13); - CPU_FEATURE_UNSET (cpu_features, INDEX_7_EDX_17); - CPU_FEATURE_UNSET (cpu_features, INDEX_7_EDX_19); - CPU_FEATURE_UNSET (cpu_features, INDEX_7_EDX_21); - CPU_FEATURE_UNSET (cpu_features, INDEX_7_EDX_23); - - /* EAX/EBX from COMMON_CPUID_INDEX_1 and EAX from COMMON_CPUID_INDEX_7 - aren't used for CPU feature detection. */ - cpu_features->features[COMMON_CPUID_INDEX_1].usable.eax = 0; - cpu_features->features[COMMON_CPUID_INDEX_1].usable.ebx = 0; - cpu_features->features[COMMON_CPUID_INDEX_7].usable.eax = 0; - - /* Starting from COMMON_CPUID_INDEX_80000001, copy the cpuid bits to - usable bits. */ + /* Copy the cpuid bits to usable bits for CPU featuress whose usability + in user space can be detected without additonal OS support. */ + CPU_FEATURE_SET_USABLE (cpu_features, SSE3); + CPU_FEATURE_SET_USABLE (cpu_features, PCLMULQDQ); + CPU_FEATURE_SET_USABLE (cpu_features, SSSE3); + CPU_FEATURE_SET_USABLE (cpu_features, CMPXCHG16B); + CPU_FEATURE_SET_USABLE (cpu_features, SSE4_1); + CPU_FEATURE_SET_USABLE (cpu_features, SSE4_2); + CPU_FEATURE_SET_USABLE (cpu_features, MOVBE); + CPU_FEATURE_SET_USABLE (cpu_features, POPCNT); + CPU_FEATURE_SET_USABLE (cpu_features, AES); + CPU_FEATURE_SET_USABLE (cpu_features, OSXSAVE); + CPU_FEATURE_SET_USABLE (cpu_features, TSC); + CPU_FEATURE_SET_USABLE (cpu_features, CX8); + CPU_FEATURE_SET_USABLE (cpu_features, CMOV); + CPU_FEATURE_SET_USABLE (cpu_features, CLFSH); + CPU_FEATURE_SET_USABLE (cpu_features, MMX); + CPU_FEATURE_SET_USABLE (cpu_features, FXSR); + CPU_FEATURE_SET_USABLE (cpu_features, SSE); + CPU_FEATURE_SET_USABLE (cpu_features, SSE2); + CPU_FEATURE_SET_USABLE (cpu_features, HTT); + CPU_FEATURE_SET_USABLE (cpu_features, BMI1); + CPU_FEATURE_SET_USABLE (cpu_features, HLE); + CPU_FEATURE_SET_USABLE (cpu_features, BMI2); + CPU_FEATURE_SET_USABLE (cpu_features, ERMS); + CPU_FEATURE_SET_USABLE (cpu_features, RTM); + CPU_FEATURE_SET_USABLE (cpu_features, RDSEED); + CPU_FEATURE_SET_USABLE (cpu_features, ADX); + CPU_FEATURE_SET_USABLE (cpu_features, CLFLUSHOPT); + CPU_FEATURE_SET_USABLE (cpu_features, CLWB); + CPU_FEATURE_SET_USABLE (cpu_features, SHA); + CPU_FEATURE_SET_USABLE (cpu_features, PREFETCHWT1); + CPU_FEATURE_SET_USABLE (cpu_features, OSPKE); + CPU_FEATURE_SET_USABLE (cpu_features, WAITPKG); + CPU_FEATURE_SET_USABLE (cpu_features, GFNI); + CPU_FEATURE_SET_USABLE (cpu_features, RDPID); + CPU_FEATURE_SET_USABLE (cpu_features, CLDEMOTE); + CPU_FEATURE_SET_USABLE (cpu_features, MOVDIRI); + CPU_FEATURE_SET_USABLE (cpu_features, MOVDIR64B); + CPU_FEATURE_SET_USABLE (cpu_features, FSRM); + CPU_FEATURE_SET_USABLE (cpu_features, SERIALIZE); + CPU_FEATURE_SET_USABLE (cpu_features, TSXLDTRK); CPU_FEATURE_SET_USABLE (cpu_features, LAHF64_SAHF64); - CPU_FEATURE_SET_USABLE (cpu_features, SVM); CPU_FEATURE_SET_USABLE (cpu_features, LZCNT); CPU_FEATURE_SET_USABLE (cpu_features, SSE4A); CPU_FEATURE_SET_USABLE (cpu_features, PREFETCHW); - CPU_FEATURE_SET_USABLE (cpu_features, XOP); - CPU_FEATURE_SET_USABLE (cpu_features, LWP); - CPU_FEATURE_SET_USABLE (cpu_features, FMA4); CPU_FEATURE_SET_USABLE (cpu_features, TBM); - CPU_FEATURE_SET_USABLE (cpu_features, SYSCALL_SYSRET); - CPU_FEATURE_SET_USABLE (cpu_features, NX); - CPU_FEATURE_SET_USABLE (cpu_features, PAGE1GB); CPU_FEATURE_SET_USABLE (cpu_features, RDTSCP); - CPU_FEATURE_SET_USABLE (cpu_features, LM); - CPU_FEATURE_SET_USABLE (cpu_features, XSAVEOPT); - CPU_FEATURE_SET_USABLE (cpu_features, XSAVEC); - CPU_FEATURE_SET_USABLE (cpu_features, XGETBV_ECX_1); - CPU_FEATURE_SET_USABLE (cpu_features, XSAVES); - CPU_FEATURE_SET_USABLE (cpu_features, XFD); - CPU_FEATURE_SET_USABLE (cpu_features, INVARIANT_TSC); CPU_FEATURE_SET_USABLE (cpu_features, WBNOINVD); - CPU_FEATURE_SET_USABLE (cpu_features, AVX512_BF16); - - /* MPX has been deprecated. */ - CPU_FEATURE_UNSET (cpu_features, MPX); - - /* Clear the usable bits which require OS support. */ - CPU_FEATURE_UNSET (cpu_features, FMA); - CPU_FEATURE_UNSET (cpu_features, AVX); - CPU_FEATURE_UNSET (cpu_features, F16C); - CPU_FEATURE_UNSET (cpu_features, AVX2); - CPU_FEATURE_UNSET (cpu_features, AVX512F); - CPU_FEATURE_UNSET (cpu_features, AVX512DQ); - CPU_FEATURE_UNSET (cpu_features, AVX512_IFMA); - CPU_FEATURE_UNSET (cpu_features, AVX512PF); - CPU_FEATURE_UNSET (cpu_features, AVX512ER); - CPU_FEATURE_UNSET (cpu_features, AVX512CD); - CPU_FEATURE_UNSET (cpu_features, AVX512BW); - CPU_FEATURE_UNSET (cpu_features, AVX512VL); - CPU_FEATURE_UNSET (cpu_features, AVX512_VBMI); - CPU_FEATURE_UNSET (cpu_features, PKU); - CPU_FEATURE_UNSET (cpu_features, AVX512_VBMI2); - CPU_FEATURE_UNSET (cpu_features, VAES); - CPU_FEATURE_UNSET (cpu_features, VPCLMULQDQ); - CPU_FEATURE_UNSET (cpu_features, AVX512_VNNI); - CPU_FEATURE_UNSET (cpu_features, AVX512_BITALG); - CPU_FEATURE_UNSET (cpu_features, AVX512_VPOPCNTDQ); - CPU_FEATURE_UNSET (cpu_features, AVX512_4VNNIW); - CPU_FEATURE_UNSET (cpu_features, AVX512_4FMAPS); - CPU_FEATURE_UNSET (cpu_features, AVX512_VP2INTERSECT); - CPU_FEATURE_UNSET (cpu_features, AMX_BF16); - CPU_FEATURE_UNSET (cpu_features, AMX_TILE); - CPU_FEATURE_UNSET (cpu_features, AMX_INT8); - CPU_FEATURE_UNSET (cpu_features, XOP); - CPU_FEATURE_UNSET (cpu_features, FMA4); - CPU_FEATURE_UNSET (cpu_features, XSAVEC); - CPU_FEATURE_UNSET (cpu_features, XFD); - CPU_FEATURE_UNSET (cpu_features, AVX512_BF16); /* Can we call xgetbv? */ if (CPU_FEATURES_CPU_P (cpu_features, OSXSAVE)) @@ -243,8 +191,11 @@ update_usable (struct cpu_features *cpu_features) CPU_FEATURE_SET_USABLE (cpu_features, AMX_INT8); } - - /* XFD is usable only when OSXSAVE is enabled. */ + /* These features are usable only when OSXSAVE is enabled. */ + CPU_FEATURE_SET (cpu_features, XSAVE); + CPU_FEATURE_SET_USABLE (cpu_features, XSAVEOPT); + CPU_FEATURE_SET_USABLE (cpu_features, XSAVEC); + CPU_FEATURE_SET_USABLE (cpu_features, XGETBV_ECX_1); CPU_FEATURE_SET_USABLE (cpu_features, XFD); /* For _dl_runtime_resolve, set xsave_state_size to xsave area