Received: by 2002:a05:6a10:1287:0:0:0:0 with SMTP id d7csp7021276pxv; Fri, 30 Jul 2021 08:11:35 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzfYHiFPgVTIixGDbGdkaMCRGzdv+0PzVlISthmAXGSCjGAhP4WzL0O8DQUN2Dgh7MnY8I/ X-Received: by 2002:a17:907:75f6:: with SMTP id jz22mr3038777ejc.216.1627657895077; Fri, 30 Jul 2021 08:11:35 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627657895; cv=none; d=google.com; s=arc-20160816; b=MUoU2pw511RP2g5qBMzF0qBtWpaIZkap1lfc/SLCSR3pSeWW1TUOUc+KHDhkRjilWQ nxOR9WjQVfOZcqjVjGpoLsAnrA7UJsCfQ3nBwiEjxLfekcgZLa4jbJHg2u12L75ToL+Y OOl3uOv8CinoQwIW83XWDtH/VBLBQz8p1sJ3dMYxDp+9qXYFaaRQcwhspodU2RNQRrUw h02ou+2glHG7fNNA/bmfJ0nrnpV6+9DnJ1FGFPI0vlQi/TBoOzTtQZZYUA6nB7bFPAyY GS7r1ERoRMVteJg+qvHz/RSv12xuqD1w43YigHGelI8L/n3mHgZBVZ2EH1rz32+c+2tD k4Iw== 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; bh=qcntPc8r+kjENepKJBSF/Iu4DgFlwmW3l3qqgUZASos=; b=NcBHNayIRZAe9euweXalmCXDQfVEQX72p6BXf+znkJWN6hM/gF3lDUJBUJlnOR+D7A 8NGjhspHlOlAopFbexELEvldFZgJ1YxEThnEIyO0ne5SR89tn9K/U0TdbwHoRi6TSRNI dMiAQ60hf4yi0g2/Av2uOWtOsn3TRRSXvRGu5J0X4qpp1mQ6UFM7tmvxDl5gfrg1HG+d 7/mQzobPJU2K6v5K0Ij0/MnDe7cPRNpMBj3F4mgv7+mRR/98xdfprpjQjZkyB9xlcADj z29xB05rWq3GjwjEXKgAo+6coh5Iab+JtuIdeI37FB0ruMuVAxYpxyRl39GHKV+rRLU8 lDDw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id i18si1768865ejv.388.2021.07.30.08.11.10; Fri, 30 Jul 2021 08:11:35 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239699AbhG3PGy (ORCPT + 99 others); Fri, 30 Jul 2021 11:06:54 -0400 Received: from mga05.intel.com ([192.55.52.43]:52628 "EHLO mga05.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239470AbhG3PGP (ORCPT ); Fri, 30 Jul 2021 11:06:15 -0400 X-IronPort-AV: E=McAfee;i="6200,9189,10061"; a="298699126" X-IronPort-AV: E=Sophos;i="5.84,282,1620716400"; d="scan'208";a="298699126" Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 30 Jul 2021 08:06:06 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.84,282,1620716400"; d="scan'208";a="508154940" Received: from chang-linux-3.sc.intel.com ([172.25.66.175]) by FMSMGA003.fm.intel.com with ESMTP; 30 Jul 2021 08:06:06 -0700 From: "Chang S. Bae" To: bp@suse.de, luto@kernel.org, tglx@linutronix.de, mingo@kernel.org, x86@kernel.org Cc: len.brown@intel.com, dave.hansen@intel.com, thiago.macieira@intel.com, jing2.liu@intel.com, ravi.v.shankar@intel.com, linux-kernel@vger.kernel.org, chang.seok.bae@intel.com Subject: [PATCH v9 13/26] x86/fpu/xstate: Support ptracer-induced XSTATE buffer expansion Date: Fri, 30 Jul 2021 07:59:44 -0700 Message-Id: <20210730145957.7927-14-chang.seok.bae@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210730145957.7927-1-chang.seok.bae@intel.com> References: <20210730145957.7927-1-chang.seok.bae@intel.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org ptrace() may update XSTATE data before the target task has taken an XFD fault and expanded the XSTATE buffer. Detect this case and allocate a sufficient buffer to support the request. Also, disable the (now unnecessary) associated first-use fault. Signed-off-by: Chang S. Bae Reviewed-by: Len Brown Cc: x86@kernel.org Cc: linux-kernel@vger.kernel.org --- Changes from v5: * Adjusted to use 'tmpbuf' for the new base code. Changes from v4: * Improved the condition check for the expansion. * Simplified the XSTATE_BV retrieval. * Updated the code comment. Changes from v3: * Removed 'no functional changes' in the changelog. (Borislav Petkov) Changes from v2: * Updated the changelog with task->fpu removed. (Borislav Petkov) * Updated the code comments. --- arch/x86/kernel/fpu/regset.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/arch/x86/kernel/fpu/regset.c b/arch/x86/kernel/fpu/regset.c index 73d7d7b489fe..244e672c3e3d 100644 --- a/arch/x86/kernel/fpu/regset.c +++ b/arch/x86/kernel/fpu/regset.c @@ -163,6 +163,30 @@ int xstateregs_set(struct task_struct *target, const struct user_regset *regset, } } + /* + * When a ptracer attempts to write any dynamic user state in the + * target buffer but not sufficiently allocated, it dynamically + * expands the buffer. + * + * Check if the expansion is possibly needed. + */ + if (xfeatures_mask_user_dynamic && + ((fpu->state_mask & xfeatures_mask_user_dynamic) != xfeatures_mask_user_dynamic)) { + u64 state_mask; + + /* Retrieve XSTATE_BV. */ + memcpy(&state_mask, (kbuf ?: tmpbuf) + offsetof(struct xregs_state, header), + sizeof(u64)); + + /* Expand the xstate buffer based on the XSTATE_BV. */ + state_mask &= xfeatures_mask_user_dynamic; + if (state_mask) { + ret = alloc_xstate_buffer(fpu, state_mask); + if (ret) + goto out; + } + } + fpu_force_restore(fpu); ret = copy_uabi_from_kernel_to_xstate(fpu, kbuf ?: tmpbuf); -- 2.17.1