From patchwork Thu Sep 14 03:23:30 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Yang, Weijiang" X-Patchwork-Id: 139501 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:612c:172:b0:3f2:4152:657d with SMTP id h50csp258993vqi; Thu, 14 Sep 2023 03:54:43 -0700 (PDT) X-Google-Smtp-Source: AGHT+IG30wEyqPSet6qHf9QhpXEcNmq39F4ceSi1FgEDCRAXmzojWADdEySN/Icej7zvEvKXjgYj X-Received: by 2002:a05:6a00:39a5:b0:68f:cd32:c52d with SMTP id fi37-20020a056a0039a500b0068fcd32c52dmr5692208pfb.14.1694688882936; Thu, 14 Sep 2023 03:54:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1694688882; cv=none; d=google.com; s=arc-20160816; b=aPcZN16lx9EO5a4Re/m2Eqhy/kG8v3Gi8tfMDwwhiGcwvDZsVdJiKn2+xflwzMPIKo Ei7Y97mkRXUgXnUt8h0P0dpE2tSa/vqVnkrb4RHK0YZTlSVNqyMXCSw7+uHYJoF+QRvR 5gMmqfatBRhF69W8gNkqvN/Ops1azfBMNa+d/t544/+yC0OP+Jdd/QKNJbiH75mTZv/U V1KG1F+7AiebILAu32q8bs2WeJLfFstu5TO+IQJ+sh8k1oCvyq5+cJPVOkRc2rywaz6a iTNhz5WDQGJoHJSaWk9S/0lZ1h8nDs1hiHFVlb0EymQsTMqX7sW+6oUMwRQhKsrfKM80 POTQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=Uj/uIkifhxYe243RLIyYA/4oIY9s6e3zTKdEeOhULDA=; fh=VKDky7JI6Mwho+jW2kjyYjgneGFqVaPlgJX6sIBNvQM=; b=Nhynsnm9RqhdeCqnJZDyn5/+8PHMF2o0ttMUfAl8ljZRY0qi9G9yQyNkawcu/uV1DI LsV60yQyg5ZyJBZApwN8tG8H1fQbYJIZXgW3l4aFNKdlnNJLda0KMbV8G4ZD1KYZkUh0 yY50pN6sqVPgFVGTpJ4F82XjyA+waKJp6e3T9gSKQpAVmK6d3a6JTrkxsFbDJLhzKsQP 68sTxJLmVN6wjqybDUQMwQ9og4MOBuKbsa8Ls8N1T3Kb9hRFj8uOPbmmCNuLLgA0nJ85 3M9Tr20j8ync+HtJIWEt2gHi0hdMFU8GegOVHgaiA3w/gYt7wWEx1Agsusf5q1pb6MDx df8w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=Tc7YvM78; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.31 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from morse.vger.email (morse.vger.email. [23.128.96.31]) by mx.google.com with ESMTPS id d15-20020a056a00198f00b0068ff3a3c9d0si1433476pfl.91.2023.09.14.03.54.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 Sep 2023 03:54:42 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.31 as permitted sender) client-ip=23.128.96.31; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=Tc7YvM78; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.31 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by morse.vger.email (Postfix) with ESMTP id CE3AE80C5A01; Wed, 13 Sep 2023 23:29:19 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at morse.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235589AbjING24 (ORCPT + 35 others); Thu, 14 Sep 2023 02:28:56 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46396 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235344AbjING2r (ORCPT ); Thu, 14 Sep 2023 02:28:47 -0400 Received: from mgamail.intel.com (mgamail.intel.com [134.134.136.65]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7A873F9; Wed, 13 Sep 2023 23:28:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1694672923; x=1726208923; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=RiRpO69NN4+D9BiPv1b8kqQ9mDIXR5b5ZIvKZMvuZW0=; b=Tc7YvM78ki119DQU8AXTlj+eR6/WKAiafjX5L7+z2qE3GEXOq9jNAb9F LK1Xlv0rJbOFt1HBHw9fpyQTep7eu3aG/LmvqUlqLHyUETpiUtYr1JMvG WhwK6f9qoSkxPVFFMLBTwRujZMP/zfzkIQmXbjFikI4YIT63NIpFZyIMb X/UPS+5KfqbqoEYOmCJYo0m2tFg04J/SZyLUO3VXgvbY3g8woIQ1zCw2Q 4BgnjLefwfOZ4C08JiuckohhbEu6NpjoQpuwuXlrmqDEAs3JEfh1lzQ/o ur7IIq3IThxbA2C/4uc4w/devaRlmdUKvbiTqoJrM5CZbproC/cwPrrnU w==; X-IronPort-AV: E=McAfee;i="6600,9927,10832"; a="382672455" X-IronPort-AV: E=Sophos;i="6.02,145,1688454000"; d="scan'208";a="382672455" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 Sep 2023 23:28:43 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10832"; a="809937987" X-IronPort-AV: E=Sophos;i="6.02,145,1688454000"; d="scan'208";a="809937987" Received: from embargo.jf.intel.com ([10.165.9.183]) by fmsmga008-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 Sep 2023 23:28:42 -0700 From: Yang Weijiang To: x86@kernel.org, linux-kernel@vger.kernel.org Cc: dave.hansen@intel.com, tglx@linutronix.de, peterz@infradead.org, seanjc@google.com, pbonzini@redhat.com, rick.p.edgecombe@intel.com, kvm@vger.kernel.org, yang.zhong@intel.com, jing2.liu@intel.com, chao.gao@intel.com, Yang Weijiang Subject: [RFC PATCH 4/8] x86/fpu/xstate: Introduce kernel dynamic xfeature set Date: Wed, 13 Sep 2023 23:23:30 -0400 Message-Id: <20230914032334.75212-5-weijiang.yang@intel.com> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20230914032334.75212-1-weijiang.yang@intel.com> References: <20230914032334.75212-1-weijiang.yang@intel.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (morse.vger.email [0.0.0.0]); Wed, 13 Sep 2023 23:29:19 -0700 (PDT) X-Spam-Status: No, score=0.2 required=5.0 tests=DATE_IN_PAST_03_06, DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on morse.vger.email X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1777010090009266298 X-GMAIL-MSGID: 1777010090009266298 Define a new kernel xfeature set including the features can be dynamically enabled, i.e., the relevant feature is enabled on demand. The xfeature set is currently used by KVM to configure __guest__ fpstate, i.e., calculating the xfeature and fpstate storage size etc. The xfeature set is initialized once and used whenever it's referenced to avoid repeat calculation. Currently it's used when 1) guest fpstate __state_size is calculated while guest permits are configured 2) guest vCPU is created and its fpstate is initialized. Suggested-by: Dave Hansen Signed-off-by: Yang Weijiang --- arch/x86/kernel/fpu/xstate.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/arch/x86/kernel/fpu/xstate.c b/arch/x86/kernel/fpu/xstate.c index c3ed86732d33..eaec05bc1b3c 100644 --- a/arch/x86/kernel/fpu/xstate.c +++ b/arch/x86/kernel/fpu/xstate.c @@ -84,6 +84,8 @@ static unsigned int xstate_sizes[XFEATURE_MAX] __ro_after_init = { [ 0 ... XFEATURE_MAX - 1] = -1}; static unsigned int xstate_flags[XFEATURE_MAX] __ro_after_init; +u64 fpu_kernel_dynamic_xfeatures __ro_after_init; + #define XSTATE_FLAG_SUPERVISOR BIT(0) #define XSTATE_FLAG_ALIGNED64 BIT(1) @@ -740,6 +742,23 @@ static void __init fpu__init_disable_system_xstate(unsigned int legacy_size) fpstate_reset(¤t->thread.fpu); } +static unsigned short xsave_kernel_dynamic_xfeatures[] = { + [XFEATURE_CET_KERNEL] = X86_FEATURE_SHSTK, +}; + +static void __init init_kernel_dynamic_xfeatures(void) +{ + unsigned short cid; + int i; + + for (i = 0; i < ARRAY_SIZE(xsave_kernel_dynamic_xfeatures); i++) { + cid = xsave_kernel_dynamic_xfeatures[i]; + + if (cid && boot_cpu_has(cid)) + fpu_kernel_dynamic_xfeatures |= BIT_ULL(i); + } +} + /* * Enable and initialize the xsave feature. * Called once per system bootup. @@ -809,6 +828,8 @@ void __init fpu__init_system_xstate(unsigned int legacy_size) if (boot_cpu_has(X86_FEATURE_SHSTK) || boot_cpu_has(X86_FEATURE_IBT)) fpu_kernel_cfg.max_features |= BIT_ULL(XFEATURE_CET_USER); + init_kernel_dynamic_xfeatures(); + if (!cpu_feature_enabled(X86_FEATURE_XFD)) fpu_kernel_cfg.max_features &= ~XFEATURE_MASK_USER_DYNAMIC;