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=-12.5 required=3.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED,DKIM_INVALID,DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_GIT 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 8BB50C388F7 for ; Thu, 22 Oct 2020 13:20:03 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 0CCAA222E9 for ; Thu, 22 Oct 2020 13:20:02 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=google.com header.i=@google.com header.b="hyg/yHWH" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 0CCAA222E9 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 D20736B009A; Thu, 22 Oct 2020 09:19:57 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id CD6BB6B009B; Thu, 22 Oct 2020 09:19:57 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id B4B246B009C; Thu, 22 Oct 2020 09:19:57 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0020.hostedemail.com [216.40.44.20]) by kanga.kvack.org (Postfix) with ESMTP id 7BB1C6B009A for ; Thu, 22 Oct 2020 09:19:57 -0400 (EDT) Received: from smtpin14.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay01.hostedemail.com (Postfix) with ESMTP id 03C62180AD817 for ; Thu, 22 Oct 2020 13:19:57 +0000 (UTC) X-FDA: 77399619234.14.look25_470e37627251 Received: from filter.hostedemail.com (10.5.16.251.rfc1918.com [10.5.16.251]) by smtpin14.hostedemail.com (Postfix) with ESMTP id DB3D018229835 for ; Thu, 22 Oct 2020 13:19:56 +0000 (UTC) X-HE-Tag: look25_470e37627251 X-Filterd-Recvd-Size: 7438 Received: from mail-qk1-f201.google.com (mail-qk1-f201.google.com [209.85.222.201]) by imf33.hostedemail.com (Postfix) with ESMTP for ; Thu, 22 Oct 2020 13:19:56 +0000 (UTC) Received: by mail-qk1-f201.google.com with SMTP id u16so981326qkm.22 for ; Thu, 22 Oct 2020 06:19:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=sender:date:in-reply-to:message-id:mime-version:references:subject :from:to:cc; bh=ZoFNxYTX2w5xrKhT+4kOLYASUdfUPOoAnADKxtZ91BU=; b=hyg/yHWHvwShqvDVWk+p9jRaj1k1vbYvbMkQiwt/KYz+fgLWUl5RZZxkLQGBjmXyTg 4Mpc350rxmj8NEmdVWFhN7K3IA0gBvxNU4krBGMa40Pe5tYLMpxQp9rTdZcI2IVNAq8X X6BGbZ198yO5M4c9WFkFQB1vRxo/zQKgMMnJ71TSXhFNz3csA5eIcnR7mgxlYqKdbvfO F6V3nrozw4kqQp8r3Mhim3FV/62Y22qIA0J/BOk+a8s/8mqn9yOWPdIKUBViFZUM5jRy Z4a7ho525wIUCVayqHieRmS5aR43zx68e2mZ9l/J1sD2671q8FvP0uYhAMnEpSGEGE0q iIbw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=ZoFNxYTX2w5xrKhT+4kOLYASUdfUPOoAnADKxtZ91BU=; b=BxBkXDXieqPsbctvopfaBTOSTtHX6IeI3elMBiiVuYMFsb+8EVAB1ro3pUQEZpZRP0 Uf/rh29I4NEMl06CgidzzWM0+Q/aX3ZAC+7cWl9+MlcOwPfzFNQ0gCg3b4KrTh8fAdwP rhEtachZtdN4XX3/Ju/DOF17eGQUHlgJB9Y6uotE18pu9Xgm7aSnPGGsINgdHki8ez7W Zy409VQYTuw5Vpw8ymDPpy0zagby3+2oasHTpsElZHnMGXWIsYmfIihl9WdEE6Duc7fP wcH0aKaS000MK+PNy0an0E7sBVjpQbRKFwqorJsP38o7gCsteCpB6yyUdSyVrG0cjpmc 9rwA== X-Gm-Message-State: AOAM533S+cpYbHlDGQQlBFldyorAOAXK2w5BvlyIw+zy1c8lnnaA4P4a JwWQeloqsYAFLWHY6A9DhpgmEUUdZQHCgdgK X-Google-Smtp-Source: ABdhPJz/upwD11o6KftRnmUWcVjQhuj/aMMh5idv43GrvZzPuF9FjjUI7+5zI2FNbmCB5582zV2P7+i0EuR2ktv5 X-Received: from andreyknvl3.muc.corp.google.com ([2a00:79e0:15:13:7220:84ff:fe09:7e9d]) (user=andreyknvl job=sendgmr) by 2002:a05:6214:1267:: with SMTP id r7mr2283039qvv.50.1603372795643; Thu, 22 Oct 2020 06:19:55 -0700 (PDT) Date: Thu, 22 Oct 2020 15:19:05 +0200 In-Reply-To: Message-Id: Mime-Version: 1.0 References: X-Mailer: git-send-email 2.29.0.rc1.297.gfa9743e501-goog Subject: [PATCH RFC v2 13/21] arm64: kasan: Add cpu_supports_tags helper From: Andrey Konovalov To: Catalin Marinas , Will Deacon , Vincenzo Frascino , Dmitry Vyukov , Alexander Potapenko , Marco Elver Cc: Evgenii Stepanov , Kostya Serebryany , Peter Collingbourne , Serban Constantinescu , Andrey Ryabinin , Elena Petrova , Branislav Rankov , Kevin Brodsky , Andrew Morton , kasan-dev@googlegroups.com, linux-arm-kernel@lists.infradead.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, Andrey Konovalov 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: 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 --- 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