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=-17.4 required=3.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_IN_DEF_DKIM_WL 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 D1DF9C4363A for ; Wed, 28 Oct 2020 11:38:58 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 18150246C7 for ; Wed, 28 Oct 2020 11:38:57 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="moy3QtjP" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 18150246C7 Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 44BD06B006E; Wed, 28 Oct 2020 07:38:57 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 3D3636B0070; Wed, 28 Oct 2020 07:38:57 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 276956B0071; Wed, 28 Oct 2020 07:38:57 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0120.hostedemail.com [216.40.44.120]) by kanga.kvack.org (Postfix) with ESMTP id EA0106B006E for ; Wed, 28 Oct 2020 07:38:56 -0400 (EDT) Received: from smtpin29.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay02.hostedemail.com (Postfix) with ESMTP id 889F43621 for ; Wed, 28 Oct 2020 11:38:56 +0000 (UTC) X-FDA: 77421137472.29.rest34_480631027284 Received: from filter.hostedemail.com (10.5.16.251.rfc1918.com [10.5.16.251]) by smtpin29.hostedemail.com (Postfix) with ESMTP id 61F4E180868C1 for ; Wed, 28 Oct 2020 11:38:56 +0000 (UTC) X-HE-Tag: rest34_480631027284 X-Filterd-Recvd-Size: 7855 Received: from mail-qk1-f193.google.com (mail-qk1-f193.google.com [209.85.222.193]) by imf26.hostedemail.com (Postfix) with ESMTP for ; Wed, 28 Oct 2020 11:38:55 +0000 (UTC) Received: by mail-qk1-f193.google.com with SMTP id r7so4147340qkf.3 for ; Wed, 28 Oct 2020 04:38:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=/44VlBK6OKm+RXk0OJTWh6hF3WHJ///hTwLxttFcS6M=; b=moy3QtjPyL3cZ9xsAR+crMwlJ3jr7ixVIebxppVrc8dGFCovMimfDfFD90LygZcrsh Rx3LGU4VxFLTFIzKoaXqh75BHUiacUo02JaByhdySLZupWOYbHwbpwILgLI1FSLGWBjC ZLc2N+6dGWVTyl/zDZjvlcTglANqUFxj7H3XV381T1NhVv4/7m64Q15gIQhNfrKpYuFG I3xEltXbMvRa+iaqGSNHYKa6jgEz3JXVVURdPoh/DM45eUheJRBx83WeIojfALhx7q02 jywkx5zTOHyz2jCXytrzHix59yRvFRwuawP0qHmWCoXaBpSMNWSWpKQyrOtBpw/up7tG n19Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=/44VlBK6OKm+RXk0OJTWh6hF3WHJ///hTwLxttFcS6M=; b=Ay1lR5psx4CXyMzY/9b4dnQJDts65kC7L5la9HHfu/H9/HhHUcv75zWO/jFn78mpd4 6Mutup3OEE+ZZgXkoIgfSs2jiSdoTgPZfSpCyzQ6VDy7pAvYT4jMExu3w/u0V9SSH977 Fxq7a1D744xkgeymrI+6/qfNFTY8qdVd2i706OwBQz8GRwx2tkNtKYtIcsQ7EwMGFSym epcAqS82QPv9fdszE0ZW9XzfJzTewldfTlNSdpkc7cDVUlAhuNAmML1SDNxN+oLl85Lq +xGZUcFM5FLhnGjiPdDVOSSsoYWc1+2MNnFqqHMyACsEIQ+i/jC5U7toMTm90v3jUr51 zGRw== X-Gm-Message-State: AOAM530BHWsao6nj7P3Ea8JbG+r87XwMe9g8JosRERf1DQK0wyZX7/M5 IYPdf5wovEpG3koUlRk425SmjLDrLEXKq0+bJwa3lA== X-Google-Smtp-Source: ABdhPJxWIdsJfS6ydyqUNERfH2TM2/Kde07YNypvw2f5tV+AK4gxs6r74i0fEIC6gEuqLgxHTNr/UVLd8f9srNcIMgo= X-Received: by 2002:a05:620a:1188:: with SMTP id b8mr6917152qkk.265.1603885134792; Wed, 28 Oct 2020 04:38:54 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Dmitry Vyukov Date: Wed, 28 Oct 2020 12:38:43 +0100 Message-ID: Subject: Re: [PATCH RFC v2 13/21] arm64: kasan: Add cpu_supports_tags helper To: Andrey Konovalov Cc: Catalin Marinas , Will Deacon , Vincenzo Frascino , Alexander Potapenko , Marco Elver , Evgenii Stepanov , Kostya Serebryany , Peter Collingbourne , Serban Constantinescu , Andrey Ryabinin , Elena Petrova , Branislav Rankov , Kevin Brodsky , Andrew Morton , kasan-dev , Linux ARM , Linux-MM , LKML Content-Type: text/plain; charset="UTF-8" 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: On Thu, Oct 22, 2020 at 3:19 PM Andrey Konovalov wrote: > > Add an arm64 helper called cpu_supports_mte() that exposes information > about whether the CPU supports memory tagging and that can be called > during early boot (unlike system_supports_mte()). > > Use that helper to implement a generic cpu_supports_tags() helper, that > will be used by hardware tag-based KASAN. > > Signed-off-by: Andrey Konovalov > Link: https://linux-review.googlesource.com/id/Ib4b56a42c57c6293df29a0cdfee334c3ca7bdab4 Reviewed-by: Dmitry Vyukov > --- > arch/arm64/include/asm/memory.h | 1 + > arch/arm64/include/asm/mte-kasan.h | 6 ++++++ > arch/arm64/kernel/mte.c | 20 ++++++++++++++++++++ > mm/kasan/kasan.h | 4 ++++ > 4 files changed, 31 insertions(+) > > diff --git a/arch/arm64/include/asm/memory.h b/arch/arm64/include/asm/memory.h > index b5d6b824c21c..f496abfcf7f5 100644 > --- a/arch/arm64/include/asm/memory.h > +++ b/arch/arm64/include/asm/memory.h > @@ -232,6 +232,7 @@ static inline const void *__tag_set(const void *addr, u8 tag) > } > > #ifdef CONFIG_KASAN_HW_TAGS > +#define arch_cpu_supports_tags() cpu_supports_mte() > #define arch_init_tags(max_tag) mte_init_tags(max_tag) > #define arch_get_random_tag() mte_get_random_tag() > #define arch_get_mem_tag(addr) mte_get_mem_tag(addr) > diff --git a/arch/arm64/include/asm/mte-kasan.h b/arch/arm64/include/asm/mte-kasan.h > index a4c61b926d4a..4c3f2c6b4fe6 100644 > --- a/arch/arm64/include/asm/mte-kasan.h > +++ b/arch/arm64/include/asm/mte-kasan.h > @@ -9,6 +9,7 @@ > > #ifndef __ASSEMBLY__ > > +#include > #include > > /* > @@ -30,6 +31,7 @@ u8 mte_get_random_tag(void); > void *mte_set_mem_tag_range(void *addr, size_t size, u8 tag); > > void mte_init_tags(u64 max_tag); > +bool __init cpu_supports_mte(void); > > #else /* CONFIG_ARM64_MTE */ > > @@ -54,6 +56,10 @@ static inline void *mte_set_mem_tag_range(void *addr, size_t size, u8 tag) > static inline void mte_init_tags(u64 max_tag) > { > } > +static inline bool cpu_supports_mte(void) > +{ > + return false; > +} > > #endif /* CONFIG_ARM64_MTE */ > > diff --git a/arch/arm64/kernel/mte.c b/arch/arm64/kernel/mte.c > index ca8206b7f9a6..8fcd17408515 100644 > --- a/arch/arm64/kernel/mte.c > +++ b/arch/arm64/kernel/mte.c > @@ -134,6 +134,26 @@ void mte_init_tags(u64 max_tag) > gcr_kernel_excl = ~incl & SYS_GCR_EL1_EXCL_MASK; > } > > +/* > + * This function can be used during early boot to determine whether the CPU > + * supports MTE. The alternative that must be used after boot is completed is > + * system_supports_mte(), but it only works after the cpufeature framework > + * learns about MTE. > + */ > +bool __init cpu_supports_mte(void) > +{ > + u64 pfr1; > + u32 val; > + > + if (!IS_ENABLED(CONFIG_ARM64_MTE)) > + return false; > + > + pfr1 = read_cpuid(ID_AA64PFR1_EL1); > + val = cpuid_feature_extract_unsigned_field(pfr1, ID_AA64PFR1_MTE_SHIFT); > + > + return val >= ID_AA64PFR1_MTE; > +} > + > static void update_sctlr_el1_tcf0(u64 tcf0) > { > /* ISB required for the kernel uaccess routines */ > diff --git a/mm/kasan/kasan.h b/mm/kasan/kasan.h > index da08b2533d73..f7ae0c23f023 100644 > --- a/mm/kasan/kasan.h > +++ b/mm/kasan/kasan.h > @@ -240,6 +240,9 @@ static inline const void *arch_kasan_set_tag(const void *addr, u8 tag) > #define set_tag(addr, tag) ((void *)arch_kasan_set_tag((addr), (tag))) > #define get_tag(addr) arch_kasan_get_tag(addr) > > +#ifndef arch_cpu_supports_tags > +#define arch_cpu_supports_tags() (false) > +#endif > #ifndef arch_init_tags > #define arch_init_tags(max_tag) > #endif > @@ -253,6 +256,7 @@ static inline const void *arch_kasan_set_tag(const void *addr, u8 tag) > #define arch_set_mem_tag_range(addr, size, tag) ((void *)(addr)) > #endif > > +#define cpu_supports_tags() arch_cpu_supports_tags() > #define init_tags(max_tag) arch_init_tags(max_tag) > #define get_random_tag() arch_get_random_tag() > #define get_mem_tag(addr) arch_get_mem_tag(addr) > -- > 2.29.0.rc1.297.gfa9743e501-goog >