From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.4 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,NICE_REPLY_A,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C2EDFC4363A for ; Tue, 27 Oct 2020 18:05:38 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 58DA120723 for ; Tue, 27 Oct 2020 18:05:38 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="iGuWpRR2" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 58DA120723 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=arm.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Type: Content-Transfer-Encoding:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:Date:Message-ID:From: References:To:Subject:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=+/4Sne5IEZH5DRRCG5sUcjgM0LBBvRZ8aPni4iBC/RM=; b=iGuWpRR2KmlaifO4LokauKpbH gCZQpYAuzXhoDDQMmzLm1qouhLZDWggSRcIJxYgnDU4Jzc6ub4E2iMWtGJjLRBwVe7h3z+yizmDzm MlihKwzZ0VnhA2KWC+WGmvHcvmqLlbQ8REWOSdEFH5QOvdwY9rTUD+in3KG7mzOuVh1fTb9voMsup QhJZHX1AkGQeLFkOABMpR4YhSDOR5i8CBnU4+zt6MJtHnaYO+OeywI+FLG8SidOZp+Iqg/V+fkIE+ ZrUHH1eqqco9OjW7D+0GBTknkWf/RoairMWQdlmaUwtB4n8YjRQfqUeIxtgmvKAum+rg9PHNHZAlH 6HLEXfnJw==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kXTKR-0006A6-GY; Tue, 27 Oct 2020 18:04:15 +0000 Received: from foss.arm.com ([217.140.110.172]) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kXTKO-00069Q-Fk for linux-arm-kernel@lists.infradead.org; Tue, 27 Oct 2020 18:04:13 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id AC915139F; Tue, 27 Oct 2020 11:04:10 -0700 (PDT) Received: from [10.57.50.191] (unknown [10.57.50.191]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id B85493F66E; Tue, 27 Oct 2020 11:03:29 -0700 (PDT) Subject: Re: [PATCHv3 11/17] arm64: uaccess: refactor __{get,put}_user To: Mark Rutland , linux-arm-kernel@lists.infradead.org References: <20201026133156.44186-1-mark.rutland@arm.com> <20201026133156.44186-12-mark.rutland@arm.com> From: Robin Murphy Message-ID: Date: Tue, 27 Oct 2020 18:03:19 +0000 User-Agent: Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Thunderbird/78.4.0 MIME-Version: 1.0 In-Reply-To: <20201026133156.44186-12-mark.rutland@arm.com> Content-Language: en-GB X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20201027_140412_629595_9D77AC48 X-CRM114-Status: GOOD ( 25.42 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: catalin.marinas@arm.com, james.morse@arm.com, hch@lst.de, will@kernel.org Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="us-ascii"; Format="flowed" Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org On 2020-10-26 13:31, Mark Rutland wrote: > As a step towards implementing __{get,put}_kernel_nofault(), this patch > splits most user-memory specific logic out of __{get,put}_user(), with > the memory access and fault handling in new __{raw_get,put}_mem() > helpers. > > For now the LDR/LDTR patching is left within the *get_mem() helpers, and > will be removed in a subsequent patch. > > There should be no functional change as a result of this patch. > > Signed-off-by: Mark Rutland > Cc: Catalin Marinas > Cc: Christoph Hellwig > Cc: James Morse > Cc: Will Deacon > --- > arch/arm64/include/asm/uaccess.h | 40 +++++++++++++++++++++++++--------------- > 1 file changed, 25 insertions(+), 15 deletions(-) > > diff --git a/arch/arm64/include/asm/uaccess.h b/arch/arm64/include/asm/uaccess.h > index d6a4e496ebc64..4ad2990241d78 100644 > --- a/arch/arm64/include/asm/uaccess.h > +++ b/arch/arm64/include/asm/uaccess.h > @@ -253,7 +253,7 @@ static inline void __user *__uaccess_mask_ptr(const void __user *ptr) > * The "__xxx_error" versions set the third argument to -EFAULT if an error > * occurs, and leave it unchanged on success. > */ > -#define __get_user_asm(instr, alt_instr, reg, x, addr, err, feature) \ > +#define __get_mem_asm(instr, alt_instr, reg, x, addr, err, feature) \ > asm volatile( \ > "1:"ALTERNATIVE(instr " " reg "1, [%2]\n", \ > alt_instr " " reg "1, [%2]\n", feature) \ > @@ -268,35 +268,40 @@ static inline void __user *__uaccess_mask_ptr(const void __user *ptr) > : "+r" (err), "=&r" (x) \ > : "r" (addr), "i" (-EFAULT)) > > -#define __raw_get_user(x, ptr, err) \ > +#define __raw_get_mem(x, ptr, err) \ > do { \ > unsigned long __gu_val; \ > __chk_user_ptr(ptr); \ Should this move out as well? It seems logical that wherever we figure out whether a pointer is "kernel" or "user" in order to call the appropriate low-level routine, the __user annotation could be dropped from the "kernel" path at that point - or have I misunderstood? Robin. > - uaccess_enable_not_uao(); \ > switch (sizeof(*(ptr))) { \ > case 1: \ > - __get_user_asm("ldrb", "ldtrb", "%w", __gu_val, (ptr), \ > + __get_mem_asm("ldrb", "ldtrb", "%w", __gu_val, (ptr), \ > (err), ARM64_HAS_UAO); \ > break; \ > case 2: \ > - __get_user_asm("ldrh", "ldtrh", "%w", __gu_val, (ptr), \ > + __get_mem_asm("ldrh", "ldtrh", "%w", __gu_val, (ptr), \ > (err), ARM64_HAS_UAO); \ > break; \ > case 4: \ > - __get_user_asm("ldr", "ldtr", "%w", __gu_val, (ptr), \ > + __get_mem_asm("ldr", "ldtr", "%w", __gu_val, (ptr), \ > (err), ARM64_HAS_UAO); \ > break; \ > case 8: \ > - __get_user_asm("ldr", "ldtr", "%x", __gu_val, (ptr), \ > + __get_mem_asm("ldr", "ldtr", "%x", __gu_val, (ptr), \ > (err), ARM64_HAS_UAO); \ > break; \ > default: \ > BUILD_BUG(); \ > } \ > - uaccess_disable_not_uao(); \ > (x) = (__force __typeof__(*(ptr)))__gu_val; \ > } while (0) > > +#define __raw_get_user(x, ptr, err) \ > +do { \ > + uaccess_enable_not_uao(); \ > + __raw_get_mem(x, ptr, err); \ > + uaccess_disable_not_uao(); \ > +} while (0) > + > #define __get_user_error(x, ptr, err) \ > do { \ > __typeof__(*(ptr)) __user *__p = (ptr); \ > @@ -318,7 +323,7 @@ do { \ > > #define get_user __get_user > > -#define __put_user_asm(instr, alt_instr, reg, x, addr, err, feature) \ > +#define __put_mem_asm(instr, alt_instr, reg, x, addr, err, feature) \ > asm volatile( \ > "1:"ALTERNATIVE(instr " " reg "1, [%2]\n", \ > alt_instr " " reg "1, [%2]\n", feature) \ > @@ -332,31 +337,36 @@ do { \ > : "+r" (err) \ > : "r" (x), "r" (addr), "i" (-EFAULT)) > > -#define __raw_put_user(x, ptr, err) \ > +#define __raw_put_mem(x, ptr, err) \ > do { \ > __typeof__(*(ptr)) __pu_val = (x); \ > __chk_user_ptr(ptr); \ > - uaccess_enable_not_uao(); \ > switch (sizeof(*(ptr))) { \ > case 1: \ > - __put_user_asm("strb", "sttrb", "%w", __pu_val, (ptr), \ > + __put_mem_asm("strb", "sttrb", "%w", __pu_val, (ptr), \ > (err), ARM64_HAS_UAO); \ > break; \ > case 2: \ > - __put_user_asm("strh", "sttrh", "%w", __pu_val, (ptr), \ > + __put_mem_asm("strh", "sttrh", "%w", __pu_val, (ptr), \ > (err), ARM64_HAS_UAO); \ > break; \ > case 4: \ > - __put_user_asm("str", "sttr", "%w", __pu_val, (ptr), \ > + __put_mem_asm("str", "sttr", "%w", __pu_val, (ptr), \ > (err), ARM64_HAS_UAO); \ > break; \ > case 8: \ > - __put_user_asm("str", "sttr", "%x", __pu_val, (ptr), \ > + __put_mem_asm("str", "sttr", "%x", __pu_val, (ptr), \ > (err), ARM64_HAS_UAO); \ > break; \ > default: \ > BUILD_BUG(); \ > } \ > +} while (0) > + > +#define __raw_put_user(x, ptr, err) \ > +do { \ > + uaccess_enable_not_uao(); \ > + __raw_put_mem(x, ptr, err); \ > uaccess_disable_not_uao(); \ > } while (0) > > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel