From nobody Thu Apr 2 01:51:04 2026 Received: from mail-244121.protonmail.ch (mail-244121.protonmail.ch [109.224.244.121]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3D47E2E7623 for ; Mon, 30 Mar 2026 14:33:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=109.224.244.121 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774881230; cv=none; b=WbhAwqj/5enrl2P//oDQvAEQBxo0GUnhKmGKhnONkO0f7XINsi9FvzTP4RgPKXdqbOgL6ayihGy9CDHbejGzeX7xUxHSkWK7ZkXWnN5kJ/4yxeVgHP+0UEDit6kuEmety47y30ua615FdHd8YDW6OzmYqj2S56/h8+n+ETO8jdg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774881230; c=relaxed/simple; bh=7AFthwAm+gatT35eXeU/LM3MuDQxV8VZ/+uxZ3AfbIU=; h=Date:To:From:Cc:Subject:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=AYB4TLf+S4sLcmTwq+3+KsNO4mfWZvUTZBu474GdPxYANb4NCVRNSahS2Fe5r5OZ85pE35GNdLEW2JaeLwe2y/pGHrnZ8NZVjNE/R4g1Ru26JEt+Z/02oLUyH3TQ8Y8OGrRHOst8E8HLq2F8RwJxEV4VGfisIaK4PWJaV/0aJmM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=pm.me; spf=pass smtp.mailfrom=pm.me; dkim=pass (2048-bit key) header.d=pm.me header.i=@pm.me header.b=mUgT38hH; arc=none smtp.client-ip=109.224.244.121 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=pm.me Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pm.me Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=pm.me header.i=@pm.me header.b="mUgT38hH" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pm.me; s=protonmail3; t=1774881222; x=1775140422; bh=P/sihZxhx1D4j95rOaUZIBK6YpmtfpmdHtZkQ0gkPEM=; h=Date:To:From:Cc:Subject:Message-ID:In-Reply-To:References: Feedback-ID:From:To:Cc:Date:Subject:Reply-To:Feedback-ID: Message-ID:BIMI-Selector; b=mUgT38hHjSxFENnSwNipuYJirXL8p/jUUBzDIt7l1ZXerS+XQoeEsdpFy0YkBD3D/ M7D9oazEAXN6GwVGL7J2oejTQfrkYoHQHzczZgGteLuDJgpjJCHN204Hwn98TNM7Vy LRD6rr4+Ncis8WMvN7tifyj4qEEnT81L+uEhRsvD08gbmsyLVG3WOhERJzhDWoYqY9 +gWrRG+XA61FRviTaabZ9lCfl13lIXlsc8sgqFsNK4ZXVVfJAjc0qHR75UZTO1lGXH EfcjohslZFa2+YiooSxTS3sF97R6lYEt4QcHIbyp94Rm0sMty41ZjmvQ7flUW7YUjq 0ZCtXYuRoN67Q== Date: Mon, 30 Mar 2026 14:33:37 +0000 To: Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Andy Lutomirski , Peter Zijlstra From: Maciej Wieczor-Retman Cc: m.wieczorretman@pm.me, Maciej Wieczor-Retman , linux-kernel@vger.kernel.org Subject: [PATCH v12 05/15] x86/mm: Reset pointer tag in x - __START_KERNEL_map instances Message-ID: <8ace9c34403e4bdbb8ab00190c7ce8570535f7ee.1774872838.git.m.wieczorretman@pm.me> In-Reply-To: References: Feedback-ID: 164464600:user:proton X-Pm-Message-ID: 5def07ea5224cd619a7293d1652f1b5c1485faed Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Maciej Wieczor-Retman With KASAN software tag-based mode arbitrary kernel pointers can be tagged, and any place where pointer arithmetic is used to convert a virtual address into a physical one can raise errors if the virtual address is tagged. To lower the amount of lines added it's beneficial to move the similar pointer arithmetic to a helper first. Reset the tag in the __phys_addr_kernel_start() which plugs into all the relevant virtual to physical address helpers. Signed-off-by: Maciej Wieczor-Retman --- Changelog v11: - Split off this patch from the tag reset patch. Move x - __START_KERNEL_map to a helper so less lines are added. arch/x86/include/asm/page_64.h | 11 +++++++++-- arch/x86/mm/physaddr.c | 4 ++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/arch/x86/include/asm/page_64.h b/arch/x86/include/asm/page_64.h index 1895c207f629..9260a0d693d6 100644 --- a/arch/x86/include/asm/page_64.h +++ b/arch/x86/include/asm/page_64.h @@ -7,6 +7,7 @@ #ifndef __ASSEMBLER__ #include #include +#include =20 #include #include @@ -20,9 +21,15 @@ extern unsigned long vmalloc_base; extern unsigned long vmemmap_base; extern unsigned long direct_map_physmem_end; =20 +static __always_inline unsigned long __phys_addr_kernel_start(unsigned lon= g x) +{ + x =3D __tag_reset(x); + return x - __START_KERNEL_map; +} + static __always_inline unsigned long __phys_addr_nodebug(unsigned long x) { - unsigned long y =3D x - __START_KERNEL_map; + unsigned long y =3D __phys_addr_kernel_start(x); =20 /* use the carry flag to determine if x was < __START_KERNEL_map */ x =3D y + ((x > y) ? phys_base : (__START_KERNEL_map - PAGE_OFFSET)); @@ -38,7 +45,7 @@ extern unsigned long __phys_addr(unsigned long); =20 static inline unsigned long __phys_addr_symbol(unsigned long x) { - unsigned long y =3D x - __START_KERNEL_map; + unsigned long y =3D __phys_addr_kernel_start(x); =20 /* only check upper bounds since lower bounds will trigger carry */ VIRTUAL_BUG_ON(y >=3D KERNEL_IMAGE_SIZE); diff --git a/arch/x86/mm/physaddr.c b/arch/x86/mm/physaddr.c index 8d31c6b9e184..682e23541228 100644 --- a/arch/x86/mm/physaddr.c +++ b/arch/x86/mm/physaddr.c @@ -14,7 +14,7 @@ #ifdef CONFIG_DEBUG_VIRTUAL unsigned long __phys_addr(unsigned long x) { - unsigned long y =3D x - __START_KERNEL_map; + unsigned long y =3D __phys_addr_kernel_start(x); =20 /* use the carry flag to determine if x was < __START_KERNEL_map */ if (unlikely(x > y)) { @@ -35,7 +35,7 @@ EXPORT_SYMBOL(__phys_addr); =20 bool __virt_addr_valid(unsigned long x) { - unsigned long y =3D x - __START_KERNEL_map; + unsigned long y =3D __phys_addr_kernel_start(x); =20 /* use the carry flag to determine if x was < __START_KERNEL_map */ if (unlikely(x > y)) { --=20 2.53.0