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=-14.4 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS 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 13885C2B9F7 for ; Mon, 24 May 2021 18:26:16 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (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 D05AD610C8 for ; Mon, 24 May 2021 18:26:15 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org D05AD610C8 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org 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=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:Cc:To:Subject:Message-ID:Date:From: In-Reply-To:References:MIME-Version:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=BFwuhGXN5oW7Q6PYL47cobESe337bm49XHAdJx3XKM8=; b=u45WWuhjfoGfsD lAzSKxSAOIkgeuDLUqsegxcEDXff8m8bRPW9ng0lJcUbzS78paZx39SofwENZYjhrkC0L4RBugXqL NlfGeYQyKhE6QU05LkMU8G6x2UoKjBkzj2q/0+JcXyHCGGKtTbs9BR8g+kNwlsHYtYamd0bZsJijD fP6bHbQAbTqWwdIwwO8Q1dXok5ffOfG2QuxaXGDHW7OyJia3x6FIS+F0t19NMiOCNlyN7ffjCxECI 7TGqmivva5mRmrFy7aoQyKkUUOFAmGcWE7jHWisvdHH+LeNPvYIgEgW7hGtlvhgswuMl9Vk3mE2kL 4HtIoVu/JSjg11KAE13g==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94 #2 (Red Hat Linux)) id 1llFFT-001RNd-P4; Mon, 24 May 2021 18:24:22 +0000 Received: from mail.kernel.org ([198.145.29.99]) by bombadil.infradead.org with esmtps (Exim 4.94 #2 (Red Hat Linux)) id 1ll6Tf-000mgh-Iy for linux-arm-kernel@lists.infradead.org; Mon, 24 May 2021 09:02:25 +0000 Received: by mail.kernel.org (Postfix) with ESMTPSA id 0E22360698 for ; Mon, 24 May 2021 09:02:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1621846943; bh=bUXRji/yuSdw9ac2x4pHKjGcVGFvaK/mHXpchgaSo5A=; h=References:In-Reply-To:From:Date:Subject:To:Cc:From; b=f3AjdMSfzGuSXIzhPO4xQ6aHeLUNhyGI/mzkIeio7WT6O5tv2THa7AVfYlEbmTlwO OV9xFpxORDPQwBJbiRdkEKG7YdxRuc9STHALO3v9brYxfIWFTGB6szlQ9PZxgwB3W7 6snrRgP/Sh89F67obQSLvA2/C0O0fdBfTuv8fmyv3kuWIT8B8xdAeqEPLrjyUZYMPB ZEqfW94Ohz9idFCHdEU3NUGuQM8H0axKocOZ/AZ/UsX/Ypnp5pcG5qY6/rURkhOi0E EsJOFv2WZcVAr4sx5nKhGl1weyKgvJkt7keC/eFdrSs88Qn2QARcLl1c//xFUmPY0O 4tf5rwpo9XZOA== Received: by mail-ot1-f50.google.com with SMTP id 69-20020a9d0a4b0000b02902ed42f141e1so24574273otg.2 for ; Mon, 24 May 2021 02:02:23 -0700 (PDT) X-Gm-Message-State: AOAM5338Q6x4cpI2AyZ2HOca6FdVh7Q0obWUuOn1khbptseBq15dsXkS gUga27ZYh6IWkuB7dIIaKzXUtmNmo86HJR4amLw= X-Google-Smtp-Source: ABdhPJxuw4g4bSpRDUom6jCjfbB9dSxpRLxhTyogP0VxOLgWfBE3sDI7w0+46xNhMoznJ6vYRy+0Cm/3U6aNje0Ey2k= X-Received: by 2002:a05:6830:4da:: with SMTP id s26mr17404558otd.77.1621846942399; Mon, 24 May 2021 02:02:22 -0700 (PDT) MIME-Version: 1.0 References: <20210524083001.2586635-1-tabba@google.com> <20210524083001.2586635-5-tabba@google.com> In-Reply-To: <20210524083001.2586635-5-tabba@google.com> From: Ard Biesheuvel Date: Mon, 24 May 2021 11:02:11 +0200 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH v4 04/18] arm64: Do not enable uaccess for flush_icache_range To: Fuad Tabba Cc: Linux ARM , Will Deacon , Catalin Marinas , Mark Rutland , Marc Zyngier , James Morse , Alexandru Elisei , Suzuki K Poulose , Robin Murphy X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210524_020223_685645_F6A090D5 X-CRM114-Status: GOOD ( 24.46 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org On Mon, 24 May 2021 at 10:30, Fuad Tabba wrote: > > __flush_icache_range works on kernel addresses, and doesn't need > uaccess. The existing code is a side-effect of its current > implementation with __flush_cache_user_range fallthrough. > > Instead of fallthrough to share the code, use a common macro for > the two where the caller specifies an optional fixup label if > user access is needed. If provided, this label would be used to > generate an extable entry. > > Simplify the code to use dcache_by_line_op, instead of > replicating much of its functionality. > > No functional change intended. > Possible performance impact due to the reduced number of > instructions. > > Reported-by: Catalin Marinas > Reported-by: Will Deacon > Reported-by: Mark Rutland > Link: https://lore.kernel.org/linux-arch/20200511110014.lb9PEahJ4hVOYrbwIb_qUHXyNy9KQzNFdb_I3YlzY6A@z/ > Link: https://lore.kernel.org/linux-arm-kernel/20210521121846.GB1040@C02TD0UTHF1T.local/ > Signed-off-by: Fuad Tabba > --- > arch/arm64/mm/cache.S | 57 ++++++++++++++++++++++++++----------------- > 1 file changed, 34 insertions(+), 23 deletions(-) > > diff --git a/arch/arm64/mm/cache.S b/arch/arm64/mm/cache.S > index 2d881f34dd9d..7c54bcbf5a36 100644 > --- a/arch/arm64/mm/cache.S > +++ b/arch/arm64/mm/cache.S > @@ -14,6 +14,34 @@ > #include > #include > > +/* > + * __flush_cache_range(start,end) [fixup] > + * > + * Ensure that the I and D caches are coherent within specified region. > + * This is typically used when code has been written to a memory region, > + * and will be executed. > + * > + * - start - virtual start address of region > + * - end - virtual end address of region > + * - fixup - optional label to branch to on user fault > + */ > +.macro __flush_cache_range, fixup > +alternative_if ARM64_HAS_CACHE_IDC > + dsb ishst Should this perhaps be dsb ish? IIUC, ishst does not synchronize on completion of cache maintenance, and while that is implicit on this code path, I'd still assume it needs to complete before carrying on. Or does IDC not require this? > + b .Ldc_skip_\@ > +alternative_else_nop_endif > + mov x2, x0 > + sub x3, x1, x0 > + dcache_by_line_op cvau, ish, x2, x3, x4, x5, \fixup > +.Ldc_skip_\@: > +alternative_if ARM64_HAS_CACHE_DIC > + isb > + b .Lic_skip_\@ > +alternative_else_nop_endif > + invalidate_icache_by_line x0, x1, x2, x3, \fixup > +.Lic_skip_\@: > +.endm > + > /* > * flush_icache_range(start,end) > * > @@ -25,7 +53,9 @@ > * - end - virtual end address of region > */ > SYM_FUNC_START(__flush_icache_range) > - /* FALLTHROUGH */ > + __flush_cache_range > + ret > +SYM_FUNC_END(__flush_icache_range) > > /* > * __flush_cache_user_range(start,end) > @@ -39,34 +69,15 @@ SYM_FUNC_START(__flush_icache_range) > */ > SYM_FUNC_START(__flush_cache_user_range) > uaccess_ttbr0_enable x2, x3, x4 > -alternative_if ARM64_HAS_CACHE_IDC > - dsb ishst > - b 7f > -alternative_else_nop_endif > - dcache_line_size x2, x3 > - sub x3, x2, #1 > - bic x4, x0, x3 > -1: > -user_alt 9f, "dc cvau, x4", "dc civac, x4", ARM64_WORKAROUND_CLEAN_CACHE > - add x4, x4, x2 > - cmp x4, x1 > - b.lo 1b > - dsb ish > > -7: > -alternative_if ARM64_HAS_CACHE_DIC > - isb > - b 8f > -alternative_else_nop_endif > - invalidate_icache_by_line x0, x1, x2, x3, 9f > -8: mov x0, #0 > + __flush_cache_range 2f > + mov x0, xzr > 1: > uaccess_ttbr0_disable x1, x2 > ret > -9: > +2: > mov x0, #-EFAULT > b 1b > -SYM_FUNC_END(__flush_icache_range) > SYM_FUNC_END(__flush_cache_user_range) > > /* > -- > 2.31.1.818.g46aad6cb9e-goog > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel