Received: by 2002:a05:6358:16cd:b0:dc:6189:e246 with SMTP id r13csp1556340rwl; Fri, 4 Nov 2022 15:52:51 -0700 (PDT) X-Google-Smtp-Source: AMsMyM7RcMJ4ADQe3mMnhn/h0G5SeDYri1NM6YGeMiDnnLcYqKAobNTD6X/Xj++NXMQuuZllynoR X-Received: by 2002:a17:90a:aa91:b0:212:f865:4f0d with SMTP id l17-20020a17090aaa9100b00212f8654f0dmr38193540pjq.90.1667602370876; Fri, 04 Nov 2022 15:52:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1667602370; cv=none; d=google.com; s=arc-20160816; b=jjkzcJC1BYGg65RYle8tVAPRwNr+zjYaXf7YRFFICw1lqyn328iizDHQ5907Lc/WWS mdlAyDKvKLNXjKR2kXjZO4/kK68GS6JmJoGBbNKtiHGYEPNGPq2PAlTl+42QS3AiMDXO y9msOUrVcgT3FO/SEU1hOK7WGRCuIWkd+3x2z8coX81ehMxTfhd35mJrlJl1L9IizG4G 9TmV3vJDOTOwZiYaATelhGsk0S7b7Nld5/EzDrFrNTUUr9K9TsxLAK6vfkLjdjcOyM+z PkFUvTQsqbtfc0J7ZEF87syUsPBADG682X7dRlpc6jWKasH05VIyMTfmfFxEwB3EotTp Ge4Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:in-reply-to:message-id:date:subject :cc:to:from:dkim-signature; bh=wfij3On5SR3Fk6sHG6SiK7Kiq6GdNSzM8aUPT131Pzc=; b=s8gQz99i3Ho47nEnrJdtLDP9SDTyqx4UXlj/f/8BsHwyRKWN7EAFSACfJH922tOq41 fJ+CS0RDU3XfyWKZfHNczCyoK+rKBks8Q9JB5qaGOMVmzKBkX5+0WDzlKSQc3idlWwTg NhLRJzsRfYvoESbWhW84u5sFE0U3LhR9i1V1y2TOCLWidvAjLdI11oWY//JW8tntiD1e +2x0PjknWJ7M2wCi0ejnuBzbbqV7kqkYwrVr9r1HW8veV9JiFiymW1NZCF0MrQHreYw6 mYmKOxCUh0S3j5kYpEVwG3rz9xrPxArGULmlJNEUy6mS60N9AMokR6FNPeRPx3M5HR2/ ohcA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=lcRNsHxN; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id u7-20020a17090341c700b00176e226934dsi1041800ple.367.2022.11.04.15.52.38; Fri, 04 Nov 2022 15:52:50 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=lcRNsHxN; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230038AbiKDWjj (ORCPT + 98 others); Fri, 4 Nov 2022 18:39:39 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46438 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229898AbiKDWj0 (ORCPT ); Fri, 4 Nov 2022 18:39:26 -0400 Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3043924BDA; Fri, 4 Nov 2022 15:39:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1667601565; x=1699137565; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=rczL0H8pPnMW1qW7foBVSx9Ii+JR6CtkXBQ8oZY4Am4=; b=lcRNsHxN8ztO7Cj01+/rsf6TrBL8e9w/NqBvKPDfA/c0ofxej19dif2B T+YqQiT6Gz6k9DardUQ1WziP06eOxs17/dezJIffMOdskrFFfcYPNw6zm 5DwRuutHjeCscyP+T2kKSXSPKTRJGRjFwutbW2BmEKE5SMjxugKn73uIS eSN71cZ878YlUY4g9eOmIO6sgBRDZPpM5c8Md2IMU6+aAteRZLXEq3/KP /3wnHRQIM8AkLLiVtJo/aOpdSHZMrrmDmaI/EPGyq29/WGjiEuENVYJ9E 9PJDrvct3ia+ukAXQhFqsQet8UKQL0HnmJuHWsugGngfR89KeQarxqNzm A==; X-IronPort-AV: E=McAfee;i="6500,9779,10521"; a="311840485" X-IronPort-AV: E=Sophos;i="5.96,138,1665471600"; d="scan'208";a="311840485" Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Nov 2022 15:39:24 -0700 X-IronPort-AV: E=McAfee;i="6500,9779,10521"; a="668513924" X-IronPort-AV: E=Sophos;i="5.96,138,1665471600"; d="scan'208";a="668513924" Received: from adhjerms-mobl1.amr.corp.intel.com (HELO rpedgeco-desk.amr.corp.intel.com) ([10.212.227.68]) by orsmga001-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Nov 2022 15:39:23 -0700 From: Rick Edgecombe To: x86@kernel.org, "H . Peter Anvin" , Thomas Gleixner , Ingo Molnar , linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-mm@kvack.org, linux-arch@vger.kernel.org, linux-api@vger.kernel.org, Arnd Bergmann , Andy Lutomirski , Balbir Singh , Borislav Petkov , Cyrill Gorcunov , Dave Hansen , Eugene Syromiatnikov , Florian Weimer , "H . J . Lu" , Jann Horn , Jonathan Corbet , Kees Cook , Mike Kravetz , Nadav Amit , Oleg Nesterov , Pavel Machek , Peter Zijlstra , Randy Dunlap , "Ravi V . Shankar" , Weijiang Yang , "Kirill A . Shutemov" , John Allen , kcc@google.com, eranian@google.com, rppt@kernel.org, jamorris@linux.microsoft.com, dethoma@microsoft.com, akpm@linux-foundation.org Cc: rick.p.edgecombe@intel.com, Yu-cheng Yu Subject: [PATCH v3 03/37] x86/cpufeatures: Add CPU feature flags for shadow stacks Date: Fri, 4 Nov 2022 15:35:30 -0700 Message-Id: <20221104223604.29615-4-rick.p.edgecombe@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20221104223604.29615-1-rick.p.edgecombe@intel.com> References: <20221104223604.29615-1-rick.p.edgecombe@intel.com> X-Spam-Status: No, score=-5.4 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED, SPF_HELO_NONE,SPF_NONE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Yu-cheng Yu The Control-Flow Enforcement Technology contains two related features, one of which is Shadow Stacks. Future patches will utilize this feature for shadow stack support in KVM, so add a CPU feature flags for Shadow Stacks (CPUID.(EAX=7,ECX=0):ECX[bit 7]). To protect shadow stack state from malicious modification, the registers are only accessible in supervisor mode. This implementation context-switches the registers with XSAVES. Make X86_FEATURE_SHSTK depend on XSAVES. The shadow stack feature, enumerated by the CPUID bit described above, encompasses both supervisor and userspace support for shadow stack. In near future patches, only userspace shadow stack will be enabled. In expectation of future supervisor shadow stack support, create a software CPU capability to enumerate kernel utilization of userspace shadow stack support. This will also allow for userspace shadow stack to be disabled, while leaving the shadow stack hardware capability exposed in the cpuinfo proc. This user shadow stack bit should depend on the HW "shstk" capability and that logic will be implemented in future patches. Tested-by: Pengfei Xu Tested-by: John Allen Signed-off-by: Yu-cheng Yu Co-developed-by: Rick Edgecombe Signed-off-by: Rick Edgecombe Cc: Kees Cook --- v3: - Add user specific shadow stack cpu cap (Andrew Cooper) - Drop reviewed-bys from Boris and Kees due to the above change. v2: - Remove IBT reference in commit log (Kees) - Describe xsaves dependency using text from (Dave) v1: - Remove IBT, can be added in a follow on IBT series. Yu-cheng v25: - Make X86_FEATURE_IBT depend on X86_FEATURE_SHSTK. arch/x86/include/asm/cpufeatures.h | 2 ++ arch/x86/include/asm/disabled-features.h | 9 ++++++++- arch/x86/kernel/cpu/cpuid-deps.c | 1 + 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/arch/x86/include/asm/cpufeatures.h b/arch/x86/include/asm/cpufeatures.h index b71f4f2ecdd5..5626ecb8a080 100644 --- a/arch/x86/include/asm/cpufeatures.h +++ b/arch/x86/include/asm/cpufeatures.h @@ -304,6 +304,7 @@ #define X86_FEATURE_UNRET (11*32+15) /* "" AMD BTB untrain return */ #define X86_FEATURE_USE_IBPB_FW (11*32+16) /* "" Use IBPB during runtime firmware calls */ #define X86_FEATURE_RSB_VMEXIT_LITE (11*32+17) /* "" Fill RSB on VM exit when EIBRS is enabled */ +#define X86_FEATURE_USER_SHSTK (11*32+18) /* Shadow stack support for user mode applications */ /* Intel-defined CPU features, CPUID level 0x00000007:1 (EAX), word 12 */ #define X86_FEATURE_AVX_VNNI (12*32+ 4) /* AVX VNNI instructions */ @@ -365,6 +366,7 @@ #define X86_FEATURE_OSPKE (16*32+ 4) /* OS Protection Keys Enable */ #define X86_FEATURE_WAITPKG (16*32+ 5) /* UMONITOR/UMWAIT/TPAUSE Instructions */ #define X86_FEATURE_AVX512_VBMI2 (16*32+ 6) /* Additional AVX512 Vector Bit Manipulation Instructions */ +#define X86_FEATURE_SHSTK (16*32+ 7) /* Shadow Stack */ #define X86_FEATURE_GFNI (16*32+ 8) /* Galois Field New Instructions */ #define X86_FEATURE_VAES (16*32+ 9) /* Vector AES */ #define X86_FEATURE_VPCLMULQDQ (16*32+10) /* Carry-Less Multiplication Double Quadword */ diff --git a/arch/x86/include/asm/disabled-features.h b/arch/x86/include/asm/disabled-features.h index 33d2cd04d254..30cd12905499 100644 --- a/arch/x86/include/asm/disabled-features.h +++ b/arch/x86/include/asm/disabled-features.h @@ -87,6 +87,12 @@ # define DISABLE_TDX_GUEST (1 << (X86_FEATURE_TDX_GUEST & 31)) #endif +#ifdef CONFIG_X86_USER_SHADOW_STACK +#define DISABLE_USER_SHSTK 0 +#else +#define DISABLE_USER_SHSTK (1 << (X86_FEATURE_USER_SHSTK & 31)) +#endif + /* * Make sure to add features to the correct mask */ @@ -101,7 +107,8 @@ #define DISABLED_MASK8 (DISABLE_TDX_GUEST) #define DISABLED_MASK9 (DISABLE_SGX) #define DISABLED_MASK10 0 -#define DISABLED_MASK11 (DISABLE_RETPOLINE|DISABLE_RETHUNK|DISABLE_UNRET) +#define DISABLED_MASK11 (DISABLE_RETPOLINE|DISABLE_RETHUNK|DISABLE_UNRET| \ + DISABLE_USER_SHSTK) #define DISABLED_MASK12 0 #define DISABLED_MASK13 0 #define DISABLED_MASK14 0 diff --git a/arch/x86/kernel/cpu/cpuid-deps.c b/arch/x86/kernel/cpu/cpuid-deps.c index c881bcafba7d..bf1b55a1ba21 100644 --- a/arch/x86/kernel/cpu/cpuid-deps.c +++ b/arch/x86/kernel/cpu/cpuid-deps.c @@ -78,6 +78,7 @@ static const struct cpuid_dep cpuid_deps[] = { { X86_FEATURE_XFD, X86_FEATURE_XSAVES }, { X86_FEATURE_XFD, X86_FEATURE_XGETBV1 }, { X86_FEATURE_AMX_TILE, X86_FEATURE_XFD }, + { X86_FEATURE_SHSTK, X86_FEATURE_XSAVES }, {} }; -- 2.17.1