From patchwork Thu Oct 22 13:19:05 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrey Konovalov X-Patchwork-Id: 11851349 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id DDEF214B4 for ; Thu, 22 Oct 2020 13:20:04 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 8EA2C24630 for ; Thu, 22 Oct 2020 13:20:04 +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 8EA2C24630 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) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id CD6BB6B009B; Thu, 22 Oct 2020 09:19:57 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org 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-Original-To: linux-mm@kvack.org 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-Spam-Summary: 1,0,0,7df60b37684224a3,d41d8cd98f00b204,3-4arxwokcfiu7xbyi47f508805y.w86527eh-664fuw4.8b0@flex--andreyknvl.bounces.google.com,,RULES_HIT:41:152:355:379:541:800:960:967:973:988:989:1260:1277:1313:1314:1345:1359:1431:1437:1516:1518:1535:1543:1593:1594:1711:1730:1747:1777:1792:1981:2194:2199:2393:2525:2559:2563:2682:2685:2693:2859:2892:2902:2911:2933:2937:2939:2942:2945:2947:2951:2954:3022:3138:3139:3140:3141:3142:3152:3354:3865:3867:3868:3871:3872:3874:3934:3936:3938:3941:3944:3947:3950:3953:3956:3959:4118:4250:4321:4425:4605:5007:6120:6261:6653:6742:7901:7903:8603:9025:9969:10004:10400:11026:11473:11657:11658:11914:12043:12048:12291:12297:12438:12555:12679:12691:12737:12895:12986:13141:13230:14096:14097:14181:14394:14659:14721:21080:21365:21444:21451:21627:21740:21939:21990:30054:30075,0,RBL:209.85.222.201:@flex--andreyknvl.bounces.google.com:.lbl8.mailshell.net-62.18.0.100 66.100.201.100;04y8wa1pzjf8idj6m969qe1tgm4rryp3x6cfdy8e6eihzs1g9ozke1pfmnd3tig.sqeoycjhe rh68ep8r 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 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 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)