Received: by 2002:a05:6a10:1287:0:0:0:0 with SMTP id d7csp3850607pxv; Mon, 19 Jul 2021 10:13:41 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzZhlUqTlFcpwTgiLCuyMqn3Q6RAuQZkFr95G0evORrEgi0sDMohpY4tkA70NiVW1RRNZxB X-Received: by 2002:a92:2a05:: with SMTP id r5mr16745173ile.69.1626714821206; Mon, 19 Jul 2021 10:13:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626714821; cv=none; d=google.com; s=arc-20160816; b=huQp9UzA370/7vH4+Rh4PGDJW78gOyqZbydijq0n9t0aHJZTO0ypHBxyIN5WpafBXk LqdtbUreTokkKDQejVp58K9dGfcjD00t+/R0GtG+HjDQoDEo4MvB9Sc/xKSVmp0hQKMh aUvo/JfaHDHe56QFY3feloIjFmYtBTk9qWx44H+6X0ySuZqxRaVSYYrlwIBS2AiB4IWc HazrxQqH6NZSQME3GstKJ/+dt0MGzubwE+6jjEDkTpmoCHxJViX5L5DdvmNKtQbXmf2u /FoupPbaYTeOYcxnhSkaneDzOHynQBk+qBRB9G64oP15q7xnfavAK0EGhD2Olhpy7Pog BHhg== 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 :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=XuMrmiYGLsg8gmz6raEM2UMrm5TfH52HZZanbyRA0Pk=; b=qCUMO6FMGdBIVaufdloWIgVa/ewUhjSib5w2rhCYIbiDLx6Wi1d3m6XsEd6/RiGaX2 BFHHX2hh0w0RfrZhQRayn+5JrS9H548oOpOje785HLNVBH0esds9NB56mHA2c2r9xe3o jSD69esmYMsjnJ27zCQ6yUg/nYZ9xmOtE0rFRtnVRQk7WQNKnaFuO+Bx+TkrZtLZiRD6 hYBU0CuF5e3LcaZbUGgPuqVH2bacjV/ZhdaQfuxcM4v8AGK9lMCyGQezzTBo4eQsbDwd /gMb1tcsLFuMvthbcS1VPyc+qtDmeKhNFmGzd21Q7TiB6WayV02P8wNj9PKfbss0SIAf XVvw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=K4R9VUy+; 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=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id a21si20232779jam.67.2021.07.19.10.13.27; Mon, 19 Jul 2021 10:13:41 -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; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=K4R9VUy+; 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=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1348672AbhGSQcH (ORCPT + 99 others); Mon, 19 Jul 2021 12:32:07 -0400 Received: from mail.kernel.org ([198.145.29.99]:57794 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1345844AbhGSPQx (ORCPT ); Mon, 19 Jul 2021 11:16:53 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 96567610D0; Mon, 19 Jul 2021 15:57:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1626710226; bh=iM1K6mqKlaFRjb/3+kOuMfyvud8VMFcfwJgch6Mi2cM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=K4R9VUy+aKkzQ6t18d48clRjSxiE2DG3ixomS+cZLEUdDsCXObPG3+IJ7MjfTsNEt i83hkSfsjPEDz3mv2kRDHRvD/qQr8koMqL5Lzs5OexGI7/nfo4n/yVIFO1XMdhRUjZ 2V6DjMGFPx4PxhdUy6RNWbdD51Gr3NGb26JNbr8Q= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Thomas Gleixner , Borislav Petkov , Sasha Levin Subject: [PATCH 5.10 128/243] x86/fpu: Return proper error codes from user access functions Date: Mon, 19 Jul 2021 16:52:37 +0200 Message-Id: <20210719144945.042322427@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210719144940.904087935@linuxfoundation.org> References: <20210719144940.904087935@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Thomas Gleixner [ Upstream commit aee8c67a4faa40a8df4e79316dbfc92d123989c1 ] When *RSTOR from user memory raises an exception, there is no way to differentiate them. That's bad because it forces the slow path even when the failure was not a fault. If the operation raised eg. #GP then going through the slow path is pointless. Use _ASM_EXTABLE_FAULT() which stores the trap number and let the exception fixup return the negated trap number as error. This allows to separate the fast path and let it handle faults directly and avoid the slow path for all other exceptions. Signed-off-by: Thomas Gleixner Signed-off-by: Borislav Petkov Link: https://lkml.kernel.org/r/20210623121457.601480369@linutronix.de Signed-off-by: Sasha Levin --- arch/x86/include/asm/fpu/internal.h | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/arch/x86/include/asm/fpu/internal.h b/arch/x86/include/asm/fpu/internal.h index 16bf4d4a8159..4e5af2b00d89 100644 --- a/arch/x86/include/asm/fpu/internal.h +++ b/arch/x86/include/asm/fpu/internal.h @@ -103,6 +103,7 @@ static inline void fpstate_init_fxstate(struct fxregs_state *fx) } extern void fpstate_sanitize_xstate(struct fpu *fpu); +/* Returns 0 or the negated trap number, which results in -EFAULT for #PF */ #define user_insn(insn, output, input...) \ ({ \ int err; \ @@ -110,14 +111,14 @@ extern void fpstate_sanitize_xstate(struct fpu *fpu); might_fault(); \ \ asm volatile(ASM_STAC "\n" \ - "1:" #insn "\n\t" \ + "1: " #insn "\n" \ "2: " ASM_CLAC "\n" \ ".section .fixup,\"ax\"\n" \ - "3: movl $-1,%[err]\n" \ + "3: negl %%eax\n" \ " jmp 2b\n" \ ".previous\n" \ - _ASM_EXTABLE(1b, 3b) \ - : [err] "=r" (err), output \ + _ASM_EXTABLE_FAULT(1b, 3b) \ + : [err] "=a" (err), output \ : "0"(0), input); \ err; \ }) @@ -219,16 +220,20 @@ static inline void fxsave(struct fxregs_state *fx) #define XRSTOR ".byte " REX_PREFIX "0x0f,0xae,0x2f" #define XRSTORS ".byte " REX_PREFIX "0x0f,0xc7,0x1f" +/* + * After this @err contains 0 on success or the negated trap number when + * the operation raises an exception. For faults this results in -EFAULT. + */ #define XSTATE_OP(op, st, lmask, hmask, err) \ asm volatile("1:" op "\n\t" \ "xor %[err], %[err]\n" \ "2:\n\t" \ ".pushsection .fixup,\"ax\"\n\t" \ - "3: movl $-2,%[err]\n\t" \ + "3: negl %%eax\n\t" \ "jmp 2b\n\t" \ ".popsection\n\t" \ - _ASM_EXTABLE(1b, 3b) \ - : [err] "=r" (err) \ + _ASM_EXTABLE_FAULT(1b, 3b) \ + : [err] "=a" (err) \ : "D" (st), "m" (*st), "a" (lmask), "d" (hmask) \ : "memory") -- 2.30.2