From patchwork Tue Feb 4 17:33:54 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maciej Wieczor-Retman X-Patchwork-Id: 13959496 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2770DC02193 for ; Tue, 4 Feb 2025 17:37:28 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id B545F28000A; Tue, 4 Feb 2025 12:37:27 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id ADDEE280008; Tue, 4 Feb 2025 12:37:27 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 92FFB28000A; Tue, 4 Feb 2025 12:37:27 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id 6F133280008 for ; Tue, 4 Feb 2025 12:37:27 -0500 (EST) Received: from smtpin22.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id D038EA0C30 for ; Tue, 4 Feb 2025 17:37:25 +0000 (UTC) X-FDA: 83082968850.22.3A59517 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.20]) by imf14.hostedemail.com (Postfix) with ESMTP id 392A2100013 for ; Tue, 4 Feb 2025 17:37:21 +0000 (UTC) Authentication-Results: imf14.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b=mFESbTU9; spf=pass (imf14.hostedemail.com: domain of maciej.wieczor-retman@intel.com designates 198.175.65.20 as permitted sender) smtp.mailfrom=maciej.wieczor-retman@intel.com; dmarc=pass (policy=none) header.from=intel.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1738690643; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=AJ+KNrmQGw87u/Lv3sW/ixn2Pc83/zgfJdm0b3G7QSs=; b=X7eHMLrny0/xPRMz0mWkbl0xe7YNcghK7r5K/etsqqWY9VlZRlx5pfhDKy+SkJezEzZmLx I2N4qTkqkGvSFd+8+EFM4dLUU7FYAdXkT/MxCVz2omkqoOe0HFXuDlpwM2pi0Xmj4DQlnJ XrXdC7/ytvweK24ybl9x4pqi1PdMZlk= ARC-Authentication-Results: i=1; imf14.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b=mFESbTU9; spf=pass (imf14.hostedemail.com: domain of maciej.wieczor-retman@intel.com designates 198.175.65.20 as permitted sender) smtp.mailfrom=maciej.wieczor-retman@intel.com; dmarc=pass (policy=none) header.from=intel.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1738690643; a=rsa-sha256; cv=none; b=oZTwZaXrsTM0Osj41rs34GJcyLAP1/ZduYEmDJBaFppj0GQTYPfxqaOQ5yqEFAXF92bIYE yVG6ogMTWWLQX5y9fpuM7BKVY9F/jvq6JUL0ASIxUCWRUccptNHeVtmNrELkzCH3aATw1E l544sPkhe8hYM3wFzshu03FDAxg19kY= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1738690642; x=1770226642; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=tgQnPnMq4WHkStd3vJbMqoHpzLn5Ygn4fGXf7vNlMB4=; b=mFESbTU9nXeiVEzQwpZ0873UAhu6UFcSPd8YK8UqGu4wfncKoanfqlkN pudmvobTB4jR11zXTVUS6w+hoJmZTPnAkF6ofXPDY+SWTiDTGI7Ik+Ani qphC/4zUT7lbeY6I37t27/uc0/rkCOIL+bCgcSc9RgBg/z9zpxwjjkqqw +3+V746PjlR8qn0y2mz7zeNK4LbD5qJeoD1fZq6oPZs7EXx/lgwfz+g8l w881eXWJ2zdFe1HSJkds0lHgbnuISFhJA7s7HHWKMRXTsy5BNvzt1Fk9u 96GV8y2FByJO+I9P/X6VbkVpO4CHPSrNeS43bANE60rrZ3+f5qSluqKsR g==; X-CSE-ConnectionGUID: +YDXhTd0SyKm/pYpBo5gAw== X-CSE-MsgGUID: pkf+qc3MR02TRAS8+i7eiA== X-IronPort-AV: E=McAfee;i="6700,10204,11336"; a="38931130" X-IronPort-AV: E=Sophos;i="6.13,259,1732608000"; d="scan'208";a="38931130" Received: from orviesa001.jf.intel.com ([10.64.159.141]) by orvoesa112.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Feb 2025 09:37:19 -0800 X-CSE-ConnectionGUID: OH9xu6cPRWustG/bFhP1dw== X-CSE-MsgGUID: vAuLaG4TRpmkRprgXY7/Og== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.12,224,1728975600"; d="scan'208";a="147867096" Received: from mjarzebo-mobl1.ger.corp.intel.com (HELO wieczorr-mobl1.intel.com) ([10.245.244.61]) by smtpauth.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Feb 2025 09:37:04 -0800 From: Maciej Wieczor-Retman To: luto@kernel.org, xin@zytor.com, kirill.shutemov@linux.intel.com, palmer@dabbelt.com, tj@kernel.org, andreyknvl@gmail.com, brgerst@gmail.com, ardb@kernel.org, dave.hansen@linux.intel.com, jgross@suse.com, will@kernel.org, akpm@linux-foundation.org, arnd@arndb.de, corbet@lwn.net, maciej.wieczor-retman@intel.com, dvyukov@google.com, richard.weiyang@gmail.com, ytcoode@gmail.com, tglx@linutronix.de, hpa@zytor.com, seanjc@google.com, paul.walmsley@sifive.com, aou@eecs.berkeley.edu, justinstitt@google.com, jason.andryuk@amd.com, glider@google.com, ubizjak@gmail.com, jannh@google.com, bhe@redhat.com, vincenzo.frascino@arm.com, rafael.j.wysocki@intel.com, ndesaulniers@google.com, mingo@redhat.com, catalin.marinas@arm.com, junichi.nomura@nec.com, nathan@kernel.org, ryabinin.a.a@gmail.com, dennis@kernel.org, bp@alien8.de, kevinloughlin@google.com, morbo@google.com, dan.j.williams@intel.com, julian.stecklina@cyberus-technology.de, peterz@infradead.org, cl@linux.com, kees@kernel.org Cc: kasan-dev@googlegroups.com, x86@kernel.org, linux-arm-kernel@lists.infradead.org, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, llvm@lists.linux.dev, linux-doc@vger.kernel.org Subject: [PATCH 13/15] x86: runtime_const used for KASAN_SHADOW_END Date: Tue, 4 Feb 2025 18:33:54 +0100 Message-ID: <5d0f9dbd0f7c2326229f2a1f3dcedd46842a9615.1738686764.git.maciej.wieczor-retman@intel.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: References: MIME-Version: 1.0 X-Rspam-User: X-Rspamd-Server: rspam09 X-Rspamd-Queue-Id: 392A2100013 X-Stat-Signature: gbwm8myuo4qexhjyoeotz8tcbrggikfr X-HE-Tag: 1738690641-484196 X-HE-Meta: U2FsdGVkX19w7Hi0B/NpV/RAycCBipSqTfVujaE7WiBCEhwtrMTDvzp5WNTtyLPs04erzM9eqO7A4fEp+sSjCnpK3D2JXjGwPCB0TXILDD9VzPQDfE+nvQ2Qqp5wB1un8WT6vKbd0aDyy0E/C9BLAmWlOoFR5tHjrPe25L5bdWMFv7nNocCCy31pF5KxjGv6fBiVWBUbehJmxrY+9NnQlvTb02PEg0e/7OARpl3+/TiQxFLHMU0Z6VzlN2Iux6qXWaWEsRgVNioSgBIPkmWU/CVdPEFK7nQq5vxGSNEAKVEVgApE27Ub/6TL3DrfA47sNMxbSRopy86chesh0/FUxKEGcmHx5xrZwIF/aumGFXwyLsuboz4axH4dBpigfGAMFOkHzyeglfmpIGP7kNz25LOZwD6Bf1aPwkQLWwF6sovbEFGhI/XPvoI6GbuFGDbGJ6Pzm9kmMiVhFSCQyhpnd/HaknGh4EPFFAHHMVkQmNg9EMZH9NR9JhOJFYsnwoXjeo/9wmBnRp0lc9W5P1cb6hNc6un5afxNNk0IyrvQoeRS18XvQKL3RBgGTDBO6F4xriNeDmoEMq1UtWmmY17gFuXvXvfd60LSZYEFUx4f7nLEtvRyzM7otUI68DxqyL+EEf/a8HjXiNKTVNeaRxTOdHCyIvlq3EHlAI/y+q9X3dLEhicMxXmgippZLikMdmwAw6L6OMNrmYWmjBNlqPN0oOrWqLg6dPdQYnGhUeCssARDsuuUQqlI1XMZB1wC6tbPVA7ShUVjl0ksj6/WuyBvaPfkfam9OIu5O1QPpAdC4MbOhNplOTW6XlUEF8nMrrQzFFY80O+XD970W7GwGL2AIz2ecusAb278L9gNd1rX43By+jMugv2is1Jqmn44PGPAIzf7DuylkXuxBkU7efZy+i8qY/ypz1q4FOGr7rulTyiA4/Y8dY05J1pWnUH1nK523OnY2UdzXrT3Q9dv5aY MhCZ2jrf s12QKHzEC23unZ47uOM4pqKP3DUim6c3E/YD6rQfIn32ZHnl0KqIs/UUQdoQ880ty4PSTKbbPpKDkm7+VmvIWpz10OdH6iqNBfaQKoMCxnLEJJ7DMLmzHJwDlLeSxbT7GJxL5HB+r/bzhEJyroBLrsc1XLvImTeR4MMpXLLNHnguzzTUuReCyb6Be42DYfNWBy0gblvEKk4JqVsDfXtbKF21bPpgVmn0t2o2muxKzQfKCiRq5/7ZsHwJWLp918bMD5LcB2inEtFMBA7MAOoqUUeK7v/bor4PYsnhEEnONrlVb1jo= 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: List-Subscribe: List-Unsubscribe: On x86, generic KASAN is setup in a way that needs a single KASAN_SHADOW_OFFSET value for both 4 and 5 level paging. It's required to facilitate boot time switching and it's a compiler ABI so it can't be changed during runtime. Software tag-based mode doesn't tie shadow start and end to any linear addresses as part of the compiler ABI so it can be changed during runtime. This notion, for KASAN purposes, allows to optimize out macros such us pgtable_l5_enabled() which would otherwise be used in every single KASAN related function. Use runtime_const infrastructure with pgtable_l5_enabled() to initialize the end address of KASAN's shadow address space. It's a good choice since in software tag based mode KASAN_SHADOW_OFFSET and KASAN_SHADOW_END refer to the same value and the offset in kasan_mem_to_shadow() is a signed negative value. Setup KASAN_SHADOW_END values so that they're aligned to 4TB in 4-level paging mode and to 2PB in 5-level paging mode. Also update x86 memory map documentation. Signed-off-by: Maciej Wieczor-Retman --- Documentation/arch/x86/x86_64/mm.rst | 6 ++++-- arch/x86/Kconfig | 3 +-- arch/x86/include/asm/kasan.h | 14 +++++++++++++- arch/x86/kernel/vmlinux.lds.S | 1 + arch/x86/mm/kasan_init_64.c | 5 ++++- 5 files changed, 23 insertions(+), 6 deletions(-) diff --git a/Documentation/arch/x86/x86_64/mm.rst b/Documentation/arch/x86/x86_64/mm.rst index 35e5e18c83d0..4e8c04d71a13 100644 --- a/Documentation/arch/x86/x86_64/mm.rst +++ b/Documentation/arch/x86/x86_64/mm.rst @@ -48,7 +48,8 @@ Complete virtual memory map with 4-level page tables ffffe90000000000 | -23 TB | ffffe9ffffffffff | 1 TB | ... unused hole ffffea0000000000 | -22 TB | ffffeaffffffffff | 1 TB | virtual memory map (vmemmap_base) ffffeb0000000000 | -21 TB | ffffebffffffffff | 1 TB | ... unused hole - ffffec0000000000 | -20 TB | fffffbffffffffff | 16 TB | KASAN shadow memory + ffffec0000000000 | -20 TB | fffffbffffffffff | 16 TB | KASAN shadow memory (generic mode) + fffff80000000000 | -8 TB | fffffc0000000000 | 4 TB | KASAN shadow memory (software tag-based mode) __________________|____________|__________________|_________|____________________________________________________________ | | Identical layout to the 56-bit one from here on: @@ -107,7 +108,8 @@ Complete virtual memory map with 5-level page tables ffd2000000000000 | -11.5 PB | ffd3ffffffffffff | 0.5 PB | ... unused hole ffd4000000000000 | -11 PB | ffd5ffffffffffff | 0.5 PB | virtual memory map (vmemmap_base) ffd6000000000000 | -10.5 PB | ffdeffffffffffff | 2.25 PB | ... unused hole - ffdf000000000000 | -8.25 PB | fffffbffffffffff | ~8 PB | KASAN shadow memory + ffdf000000000000 | -8.25 PB | fffffbffffffffff | ~8 PB | KASAN shadow memory (generic mode) + ffe8000000000000 | -6 PB | fff0000000000000 | 2 PB | KASAN shadow memory (software tag-based mode) __________________|____________|__________________|_________|____________________________________________________________ | | Identical layout to the 47-bit one from here on: diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 7b9a7e8f39ac..dfec7bc692d4 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -392,8 +392,7 @@ config AUDIT_ARCH config KASAN_SHADOW_OFFSET hex - depends on KASAN - default 0xdffffc0000000000 + default 0xdffffc0000000000 if KASAN_GENERIC config HAVE_INTEL_TXT def_bool y diff --git a/arch/x86/include/asm/kasan.h b/arch/x86/include/asm/kasan.h index f7a8d3763615..79151356d5f2 100644 --- a/arch/x86/include/asm/kasan.h +++ b/arch/x86/include/asm/kasan.h @@ -5,7 +5,7 @@ #include #include #include -#define KASAN_SHADOW_OFFSET _AC(CONFIG_KASAN_SHADOW_OFFSET, UL) + #define KASAN_SHADOW_SCALE_SHIFT 3 /* @@ -14,6 +14,8 @@ * for kernel really starts from compiler's shadow offset + * 'kernel address space start' >> KASAN_SHADOW_SCALE_SHIFT */ +#ifdef CONFIG_KASAN_GENERIC +#define KASAN_SHADOW_OFFSET _AC(CONFIG_KASAN_SHADOW_OFFSET, UL) #define KASAN_SHADOW_START (KASAN_SHADOW_OFFSET + \ ((-1UL << __VIRTUAL_MASK_SHIFT) >> \ KASAN_SHADOW_SCALE_SHIFT)) @@ -24,12 +26,22 @@ #define KASAN_SHADOW_END (KASAN_SHADOW_START + \ (1ULL << (__VIRTUAL_MASK_SHIFT - \ KASAN_SHADOW_SCALE_SHIFT))) +#endif + #ifndef __ASSEMBLY__ +#include #include #include #include +#ifdef CONFIG_KASAN_SW_TAGS +extern unsigned long KASAN_SHADOW_END_RC; +#define KASAN_SHADOW_END runtime_const_ptr(KASAN_SHADOW_END_RC) +#define KASAN_SHADOW_OFFSET KASAN_SHADOW_END +#define KASAN_SHADOW_START (KASAN_SHADOW_END - ((UL(1)) << (__VIRTUAL_MASK_SHIFT - KASAN_SHADOW_SCALE_SHIFT))) +#endif + #define arch_kasan_set_tag(addr, tag) __tag_set(addr, tag) #define arch_kasan_reset_tag(addr) __tag_reset(addr) #define arch_kasan_get_tag(addr) __tag_get(addr) diff --git a/arch/x86/kernel/vmlinux.lds.S b/arch/x86/kernel/vmlinux.lds.S index feb8102a9ca7..46183f7439c9 100644 --- a/arch/x86/kernel/vmlinux.lds.S +++ b/arch/x86/kernel/vmlinux.lds.S @@ -359,6 +359,7 @@ SECTIONS RUNTIME_CONST_VARIABLES RUNTIME_CONST(ptr, USER_PTR_MAX) + RUNTIME_CONST(ptr, KASAN_SHADOW_END_RC) . = ALIGN(PAGE_SIZE); diff --git a/arch/x86/mm/kasan_init_64.c b/arch/x86/mm/kasan_init_64.c index 55d468d83682..0f8190e0e5f6 100644 --- a/arch/x86/mm/kasan_init_64.c +++ b/arch/x86/mm/kasan_init_64.c @@ -358,6 +358,9 @@ void __init kasan_init(void) int i; memcpy(early_top_pgt, init_top_pgt, sizeof(early_top_pgt)); + unsigned long KASAN_SHADOW_END_RC = pgtable_l5_enabled() ? 0xfff0000000000000 : 0xfffffc0000000000; + + runtime_const_init(ptr, KASAN_SHADOW_END_RC); /* * We use the same shadow offset for 4- and 5-level paging to @@ -372,7 +375,7 @@ void __init kasan_init(void) * bunch of things like kernel code, modules, EFI mapping, etc. * We need to take extra steps to not overwrite them. */ - if (pgtable_l5_enabled()) { + if (pgtable_l5_enabled() && !IS_ENABLED(CONFIG_KASAN_SW_TAGS)) { void *ptr; ptr = (void *)pgd_page_vaddr(*pgd_offset_k(KASAN_SHADOW_END));