From patchwork Mon Feb 27 22:29:54 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Edgecombe, Rick P" X-Patchwork-Id: 13154268 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5C456C87FDE for ; Mon, 27 Feb 2023 22:32:31 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 2CB936B00A9; Mon, 27 Feb 2023 17:32:03 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 278666B00AA; Mon, 27 Feb 2023 17:32:03 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 055286B00AC; Mon, 27 Feb 2023 17:32:02 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id E33596B00AA for ; Mon, 27 Feb 2023 17:32:02 -0500 (EST) Received: from smtpin21.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id C4D6F1A08EE for ; Mon, 27 Feb 2023 22:32:02 +0000 (UTC) X-FDA: 80514520884.21.9F04559 Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by imf07.hostedemail.com (Postfix) with ESMTP id CE6F540013 for ; Mon, 27 Feb 2023 22:32:00 +0000 (UTC) Authentication-Results: imf07.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b="Iw/fzHL4"; dmarc=pass (policy=none) header.from=intel.com; spf=pass (imf07.hostedemail.com: domain of rick.p.edgecombe@intel.com designates 192.55.52.136 as permitted sender) smtp.mailfrom=rick.p.edgecombe@intel.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1677537121; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:in-reply-to: references:references:dkim-signature; bh=U7hvfVf5QRzvGljNI8gpRe6+fyv2kVLnLmpYI7wD5/Q=; b=nAOViyi9tICF4ew+s1Nhc/FIbrGD3eJZfagyaLllEaGnploG1uxIlJ74jwSum8mRQwHR+K DifJ4WrJ512+SGiIrlhmNQECaBBnm+U9p0Qh7o+ISWNNcam3O/9PwuxzvCKnAWCxJEfNbq DBKTYr1U/W/s9mYDCtQqatQjcH7iFB4= ARC-Authentication-Results: i=1; imf07.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b="Iw/fzHL4"; dmarc=pass (policy=none) header.from=intel.com; spf=pass (imf07.hostedemail.com: domain of rick.p.edgecombe@intel.com designates 192.55.52.136 as permitted sender) smtp.mailfrom=rick.p.edgecombe@intel.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1677537121; a=rsa-sha256; cv=none; b=jo21rhveRTv8dPPFo1bOptEOOkLre6yxVK9mnjAk5egNnR17F+tkeHb9PhowH4Q3BCExeS qRpWMcHsktOp9Qj4rixva3ohS34hMqZ84tpKEV0PB4Gu0d2bIqHUgR/hpj/p51MH8rTdS9 3q4pvuAFr0tnvUtxMg7uK+owL7O3Mv4= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1677537120; x=1709073120; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=AW2ARGp5U2MHiLvxwUeTShQ2Nof5LT8uoV2neNfX8mg=; b=Iw/fzHL4HzJeUj0+tjDFN+f2yxbzsXg/j2Wr0U+2++sdi7WV5emKEfML 0THQXbdAbkp0qmlWkHzw4O1LsGuSXhhNPI0BlubhceFsj5LJbTyUzuunK ZfDiPdNSgAACATATgn15CdosfK1TaZSkwlhCVkOY2s1YMXo8w6mM4mQLt oAryYDgCMum8eiH4RQcD3wv1CMzMZIX6vmo0NhHfQ0QZLM6jGin2KAY78 rNNdtKKSYFjK01TejGRoZcvBkdjwW6eMP9Qi5jZa2jLSwYB1XIzAF6F1B Eq8PyMcA6FHrNB7uHmMOQHKkPAKLtDs0ke42sYJhUqXjacBh8OD9vUpws w==; X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="313657939" X-IronPort-AV: E=Sophos;i="5.98,220,1673942400"; d="scan'208";a="313657939" Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Feb 2023 14:31:36 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="848024808" X-IronPort-AV: E=Sophos;i="5.98,220,1673942400"; d="scan'208";a="848024808" Received: from leonqu-mobl1.amr.corp.intel.com (HELO rpedgeco-desk.amr.corp.intel.com) ([10.209.72.19]) by orsmga005-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Feb 2023 14:31:35 -0800 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 , 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, Andrew.Cooper3@citrix.com, christina.schimpe@intel.com, david@redhat.com, debug@rivosinc.com Cc: rick.p.edgecombe@intel.com Subject: [PATCH v7 38/41] x86/fpu: Add helper for initing features Date: Mon, 27 Feb 2023 14:29:54 -0800 Message-Id: <20230227222957.24501-39-rick.p.edgecombe@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20230227222957.24501-1-rick.p.edgecombe@intel.com> References: <20230227222957.24501-1-rick.p.edgecombe@intel.com> X-Rspam-User: X-Rspamd-Server: rspam02 X-Rspamd-Queue-Id: CE6F540013 X-Stat-Signature: xqhhijscpkkijqrnckomqwzfbuiy4a7j X-HE-Tag: 1677537120-853737 X-HE-Meta: U2FsdGVkX1/HVeMHmfj6I91MuY3WHa7wPhJ4Jz6KaPGSPJ1sxde2c5W466Pz/oJ4zyuEPADJPu4L6f4O6rJoKZeRCHmgKm0eOdBTcwNddp6d2mHiGKvi8ujN8wFcE48EKTa35XbnWwqMD6XyjrcIj/aq9LcVfwkGC2Lcy2O8sFR5OpZFdcttA7Tyw/+xHjbTdems9c8U5oFkbFXtAgI7R74e8coNm4uM807VhckT7QMLfzahD9XIj2hq8friFXqmzsszhU4veJdixbCjHdvBtKEA0Kp4/XDKG+TzXIDqUuk3KIga0QU4WIiFtMfWM5o5GRI1AkTWDOuTfM8rAUeA29aaJx/GGuhOmnz8nfwjf4oIltgkGngE3G4z5WPFMDlUgvG9qPkMGWflZXP8HHG7EIDIrzibVmGmFWfeP+1JxwZ4u1FDQiY5Rzmsl8lAvY6jeahvyzAdEG/62bmJr4m7KVVU6efcatr7+s1tCdb6tRFQcB9qg+Zvid6k3mBGo4evjYSn9KZQsIs30h71fsYwK+d/QNvgp3PJyD+16buzXRnHhGDIFZMF4pX38/MlrpiGjU1cb8YER7JOtZSfFfN/rlBzUttpuoQXqlh0mklpymGa17xq1dc5O+e93dffuabHHjYIL2/f2pY9pc0eGDWQNGW2u8aHIY7G9+/4vO9icV//p9bViumtMSXPPJjMVXgDxDrPprDmm7Wy/cGiNqSJxecrt5fLk8fD9jOgOn8fGww0CjwrD/BfUm4RJG79z1zN7yehDraKF3iimJ6s7u2IHUUGe9s679iqBwKXV4wM3zVdpS+VJtFY1xEkrSjnD9OZ6ESemtI+/4Z8Q3xAkCxHO/roBdy1ZI9makbjITgHvAHERXn04cASflpG7Sn4Py/v5VcLe5ssFWgPXoz7aPCEUzcSHVK3Mz1f1RDoncLNJBgkTUn3y1ioryzNaA4Mc/EVd7wdDgoTeg/m4NIViXA Px6X+dgB mfKNp954uw33wqsAn/PGolUh12nDFqqVLpuJwc0bgLKDzF19cKhJhjMmAO2lSAu0t1ah0yu75cHJzNQmXs5tiyqu6c8yYVtUaQ+j335EOQeLSMuO4fvmhKYjP51L+Ijq7ykona3eU6GT3k7bWvQeWNvJGvM9mslP4y9w7iNeQb0GlAhbqNPLQ36Wx9LbYuYwLOZTgHrxWtF8PEEEpy7gK7/43o8dW5+fhM+N4PKoIn09FrFfToL/7eBwRqhwhiTmjg0qnsiSyp93c+jru/BH5DXKVOQSW4wAscFufskIaV7N1oRtMV9p9d0vzHgMFIIat7AgT838YqX8mUjZSZ+x7ikuYOnF6Cv2t5S3/ X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: If an xfeature is saved in a buffer, the xfeature's bit will be set in xsave->header.xfeatures. The CPU may opt to not save the xfeature if it is in it's init state. In this case the xfeature buffer address cannot be retrieved with get_xsave_addr(). Future patches will need to handle the case of writing to an xfeature that may not be saved. So provide helpers to init an xfeature in an xsave buffer. This could of course be done directly by reaching into the xsave buffer, however this would not be robust against future changes to optimize the xsave buffer by compacting it. In that case the xsave buffer would need to be re-arranged as well. So the logic properly belongs encapsulated in a helper where the logic can be unified. Tested-by: Pengfei Xu Tested-by: John Allen Tested-by: Kees Cook Acked-by: Mike Rapoport (IBM) Reviewed-by: Kees Cook Signed-off-by: Rick Edgecombe --- v2: - New patch --- arch/x86/kernel/fpu/xstate.c | 58 +++++++++++++++++++++++++++++------- arch/x86/kernel/fpu/xstate.h | 6 ++++ 2 files changed, 53 insertions(+), 11 deletions(-) diff --git a/arch/x86/kernel/fpu/xstate.c b/arch/x86/kernel/fpu/xstate.c index 13a80521dd51..3ff80be0a441 100644 --- a/arch/x86/kernel/fpu/xstate.c +++ b/arch/x86/kernel/fpu/xstate.c @@ -934,6 +934,24 @@ static void *__raw_xsave_addr(struct xregs_state *xsave, int xfeature_nr) return (void *)xsave + xfeature_get_offset(xcomp_bv, xfeature_nr); } +static int xsave_buffer_access_checks(int xfeature_nr) +{ + /* + * Do we even *have* xsave state? + */ + if (!boot_cpu_has(X86_FEATURE_XSAVE)) + return 1; + + /* + * We should not ever be requesting features that we + * have not enabled. + */ + if (WARN_ON_ONCE(!xfeature_enabled(xfeature_nr))) + return 1; + + return 0; +} + /* * Given the xsave area and a state inside, this function returns the * address of the state. @@ -954,17 +972,7 @@ static void *__raw_xsave_addr(struct xregs_state *xsave, int xfeature_nr) */ void *get_xsave_addr(struct xregs_state *xsave, int xfeature_nr) { - /* - * Do we even *have* xsave state? - */ - if (!boot_cpu_has(X86_FEATURE_XSAVE)) - return NULL; - - /* - * We should not ever be requesting features that we - * have not enabled. - */ - if (WARN_ON_ONCE(!xfeature_enabled(xfeature_nr))) + if (xsave_buffer_access_checks(xfeature_nr)) return NULL; /* @@ -984,6 +992,34 @@ void *get_xsave_addr(struct xregs_state *xsave, int xfeature_nr) return __raw_xsave_addr(xsave, xfeature_nr); } +/* + * Given the xsave area and a state inside, this function + * initializes an xfeature in the buffer. + * + * get_xsave_addr() will return NULL if the feature bit is + * not present in the header. This function will make it so + * the xfeature buffer address is ready to be retrieved by + * get_xsave_addr(). + * + * Inputs: + * xstate: the thread's storage area for all FPU data + * xfeature_nr: state which is defined in xsave.h (e.g. XFEATURE_FP, + * XFEATURE_SSE, etc...) + * Output: + * 1 if the feature cannot be inited, 0 on success + */ +int init_xfeature(struct xregs_state *xsave, int xfeature_nr) +{ + if (xsave_buffer_access_checks(xfeature_nr)) + return 1; + + /* + * Mark the feature inited. + */ + xsave->header.xfeatures |= BIT_ULL(xfeature_nr); + return 0; +} + #ifdef CONFIG_ARCH_HAS_PKEYS /* diff --git a/arch/x86/kernel/fpu/xstate.h b/arch/x86/kernel/fpu/xstate.h index a4ecb04d8d64..dc06f63063ee 100644 --- a/arch/x86/kernel/fpu/xstate.h +++ b/arch/x86/kernel/fpu/xstate.h @@ -54,6 +54,12 @@ extern void fpu__init_cpu_xstate(void); extern void fpu__init_system_xstate(unsigned int legacy_size); extern void *get_xsave_addr(struct xregs_state *xsave, int xfeature_nr); +extern int init_xfeature(struct xregs_state *xsave, int xfeature_nr); + +static inline int xfeature_saved(struct xregs_state *xsave, int xfeature_nr) +{ + return xsave->header.xfeatures & BIT_ULL(xfeature_nr); +} static inline u64 xfeatures_mask_supervisor(void) {