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=-20.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_AGENT_GIT,USER_IN_DEF_DKIM_WL autolearn=unavailable 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 C077EC388F2 for ; Thu, 22 Oct 2020 13:20:17 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 6F656241A3 for ; Thu, 22 Oct 2020 13:20:17 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="hyg/yHWH" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2899704AbgJVNUO (ORCPT ); Thu, 22 Oct 2020 09:20:14 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50814 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2899672AbgJVNT4 (ORCPT ); Thu, 22 Oct 2020 09:19:56 -0400 Received: from mail-qk1-x74a.google.com (mail-qk1-x74a.google.com [IPv6:2607:f8b0:4864:20::74a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 84D05C0613CE for ; Thu, 22 Oct 2020 06:19:56 -0700 (PDT) Received: by mail-qk1-x74a.google.com with SMTP id g184so1010952qke.3 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=sZ43204hqpGnfn7Yv/jEEweTrneWP6tLO3Qpl0j6529UJdTJusl5mUxhz4zcFC5Nxc NM5WwxZwak2Pvw/1LFrr2puafC112c15XwKxlEIjbAzHTpNiJJ6h4xoKlALzxvJqWfky ObBbeo7bySke3GhydFc0lscdetIJbWjEp7hlqGQR2CLw+U3h1qpEwsWZ8AA3jb+n8T5U 6si/ovMPgU4Xqss4T7qwkeEXLpiPSBQY7wXx1mb0IH8e60V8OdVOZ9r3ZTQKXywxs/DW 8th1sIHeEssFe958NQbj+lw06JyZmy/a4Dczl41U+0k1Uilki+QMtwrHgmp6xnMhhFB6 c9Yg== X-Gm-Message-State: AOAM531Sm+zBCmZ7X98N4QvrK7Mb4poPIIDwyoKnlUZLhShcoADiiXAc 6/tV+N5diBqCpamioeNbGwwHvzFAJzgZnYJO X-Google-Smtp-Source: ABdhPJz/upwD11o6KftRnmUWcVjQhuj/aMMh5idv43GrvZzPuF9FjjUI7+5zI2FNbmCB5582zV2P7+i0EuR2ktv5 Sender: "andreyknvl via sendgmr" 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" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 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 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.7 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_ADSP_CUSTOM_MED,DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable 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 AF0EAC388F2 for ; Thu, 22 Oct 2020 13:24:55 +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 DD47D24178 for ; Thu, 22 Oct 2020 13:24:54 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="zP5M8uQi"; 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 DD47D24178 Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.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-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:To:From:Subject:References:Mime-Version:Message-Id: In-Reply-To:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=jD8o9gKmyrD8gVlvXv+sA3vv8GLWoyWTr3+UObWo9ks=; b=zP5M8uQiGjncEpmOXHshHPhX5 vAevkcjfYeLWI2baAhO/GfI/h6zrJSxWAD+5VyVVHFYI2avvvKvdsgTM839tix651hsDF+nlRG/Oa ZxioNqJFK7ln2dWVpICfFeW+B/vA6ALpvmfUGY15HFO78Q/mp1cFTbGwh+qrrYOVnTOKvrKpz+xRz 4bmJHqBrVNQtwqUi2e3OvWjYuSf8qGFrZEWM2lzpP5N0evp3MKOI0fSe3pyUMKKHxE4mHi+I2rUE7 zddntfFyzMfrBPRs62Kvfvyp8hyK/QN1tLwdn/qBdTw4svSen6CNK0ZDiCRT7zDAT0T1lx7USnUQM O2C6TR2bw==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kVaYC-0004rE-Sl; Thu, 22 Oct 2020 13:22:40 +0000 Received: from mail-qk1-x74a.google.com ([2607:f8b0:4864:20::74a]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kVaVb-0003oH-R4 for linux-arm-kernel@lists.infradead.org; Thu, 22 Oct 2020 13:20:21 +0000 Received: by mail-qk1-x74a.google.com with SMTP id i2so1022672qkk.0 for ; Thu, 22 Oct 2020 06:19:57 -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=p3E+gg0Ub2uAV5ezabwU4qkuSDUS0njmsNOCXaDTsJISJhYcoLoli5o9zMYbDf6bDd WHLkdBi39QuieQZkgGALSYM+IoTTVCKFGSwWQswnXihjtDFO4ziO6Q27XEckWp2z3fpF Oc56114gc9L6bMwRjVMdBZYa07qHHGcZPPVRHawI8te0l2fbZVZEr17qWEDKqGLwGXOX Fs636/osNX0LlN5aOMaQVmuqHb9XknjAIScqWDYbcbsWSt/AykHzZ6OBMssqTMZQ1fHz XY7I7OBSwjL6Ma4OD0gBzgNrhcSG5o0CfEvLY4rKfwkWUIlYj3p7ychdMYGODZMlaXca SrYw== X-Gm-Message-State: AOAM532z92kxm4Qwu1mLxlXzUz/j3rXyQoX9O2cyccN5hWQVcbZQOPaW BSqansePPOSiAtjNtx/CtKQFCM1EVlCoSNEM 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 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20201022_091959_944078_B6649D0F X-CRM114-Status: GOOD ( 17.76 ) 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: Branislav Rankov , Elena Petrova , linux-mm@kvack.org, Andrey Konovalov , Kevin Brodsky , linux-kernel@vger.kernel.org, kasan-dev@googlegroups.com, Kostya Serebryany , linux-arm-kernel@lists.infradead.org, Serban Constantinescu , Andrey Ryabinin , Andrew Morton , Peter Collingbourne , Evgenii Stepanov 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 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 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel