From nobody Tue Jun 16 18:08:17 2026 Received: from SHSQR01.spreadtrum.com (mx1.unisoc.com [222.66.158.135]) (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 303C61EEA49 for ; Thu, 30 Apr 2026 02:06:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=222.66.158.135 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777514771; cv=none; b=qtNQyXQ3Tyo6e+uDrrTwbajFVdFXUwTcrctZBAx0xNhq8AmTp4jhWCqyQthYAVv3jkCdOD5bRm1At+TEN5HHN5XQxqou0lqPUWNMXtW0mga0tI+2pRgGzjXi5oDc0R673G1SglBskcmYz6x72FubseKt1Pwuk7BuU39IekwmGtU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777514771; c=relaxed/simple; bh=wcEfIKXFEyDpRkNmUR/7vuDUwvdnQ5Vjp7BNOr6WiXI=; h=From:To:Subject:Date:Message-ID:MIME-Version:Content-Type; b=LZXNpZZkzwKiN2L12ABAd+2rIlhnvvUPzBfxgZJHsjfkhaYIpMfdn1Q9cT+44mp0VjPkFuctAbsPH9u8jlYqCEciLvL8cSye5k14i0Wns9bOiPFmadXJ7hazt+2vI1M/vkkilH2AR9WcMUWkfv5PFn3oVwp+KjdC0/tvM3ukk/c= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=unisoc.com; spf=pass smtp.mailfrom=unisoc.com; dkim=pass (2048-bit key) header.d=unisoc.com header.i=@unisoc.com header.b=MpB3qZSA; arc=none smtp.client-ip=222.66.158.135 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=unisoc.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=unisoc.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=unisoc.com header.i=@unisoc.com header.b="MpB3qZSA" Received: from dlp.unisoc.com ([10.29.3.86]) by SHSQR01.spreadtrum.com with ESMTP id 63U244CY051377; Thu, 30 Apr 2026 10:04:04 +0800 (+08) (envelope-from zhaoyang.huang@unisoc.com) Received: from SHDLP.spreadtrum.com (BJMBX01.spreadtrum.com [10.0.64.7]) by dlp.unisoc.com (SkyGuard) with ESMTPS id 4g5cpW05mpz2LYw4K; Thu, 30 Apr 2026 10:01:06 +0800 (CST) Received: from bj03382pcu03.spreadtrum.com (10.0.73.40) by BJMBX01.spreadtrum.com (10.0.64.7) with Microsoft SMTP Server (TLS) id 15.0.1497.48; Thu, 30 Apr 2026 10:04:01 +0800 From: "zhaoyang.huang" To: Catalin Marinas , Will Deacon , Ard Biesheuvel , , , Zhaoyang Huang , Subject: [PATCHv2] arch: arm64: fix KERNEL_SEGMENT_COUNT error Date: Thu, 30 Apr 2026 10:03:51 +0800 Message-ID: <20260430020351.2925330-1-zhaoyang.huang@unisoc.com> X-Mailer: git-send-email 2.25.1 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 X-ClientProxiedBy: SHCAS03.spreadtrum.com (10.0.1.207) To BJMBX01.spreadtrum.com (10.0.64.7) X-MAIL: SHSQR01.spreadtrum.com 63U244CY051377 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=unisoc.com; s=default; t=1777514661; bh=GPDDvWgl/s7dZoayqq/i64CZE2KFXHaJFBEQdJtsAa8=; h=From:To:Subject:Date; b=MpB3qZSAIFdpAJhz2hbXEA5czVyCUGoeCWhW3SQ9oiRxkZCd8lz/wuLBU2cyVXfQw 67rqoKwEKIgFHYkijBK5p7IvJnzJbBQApI8r3a3h4bHz9sjr8D8o3SRAevHg7HcS6e mk1nQKfY6JmW6xjiuvDYcCvWnf74YvnnKMWhBok4jpVc9WxpsATQKzQGeynNE8hscu twXj/NuYRfNKYMblHbQiKCAXyoSjn44vAPdOPS+d3QKGX1zwscKve3fyM0q+GeiTvM qfwuwMN733OVnhVXfED8L7+oJoPWj81c0tNlW2pWvl1tfzAR2jlE1q8rADwFPpesy/ 2cx4Bh1+zxKoQ== Content-Type: text/plain; charset="utf-8" From: Zhaoyang Huang During debug of a kernel panic, we find that the pte_t of the final part of [data, end] segment got overflow to the next page of init_pg_end[1] which is the gap page before early_init_stack[2]. This should be introduced by the KERNEL_SEGMENT_COUNT's value is 5 which should be 6 as map_segment are called 6 times for the segments of (text, stext, rodata, inittext, initdata, data+bss) [1] crash_arm64_v9.0.1> vtop ffffffed00601000 VIRTUAL PHYSICAL ffffffed00601000 83401000 PAGE DIRECTORY: ffffffecffd62000 PGD: ffffffecffd62da0 =3D> 10000000833fb003 PMD: ffffff80033fb018 =3D> 10000000833fe003 PTE: ffffff80033fe008 =3D> 68000083401f03 PAGE: 83401000 PTE PHYSICAL FLAGS 68000083401f03 83401000 (VALID|SHARED|AF|NG|PXN|UXN) PAGE PHYSICAL MAPPING INDEX CNT FLAGS fffffffec00d0040 83401000 0 0 1 4000 reserved [2] ffffffed002c8000 (r) __pi__data ffffffed0054e000 (d) __pi___bss_start ffffffed005f5000 (b) __pi_init_pg_dir ffffffed005fe000 (b) __pi_init_pg_end ffffffed005ff000 (B) early_init_stack ffffffed00608000 (b) __pi__end Fixes: 5973a62efa34 ("arm64: map [_text, _stext) virtual address range non-= executable+read-only") Assisted-by: TRAE: GLM-5.1 Suggested-by: Ard Biesheuvel Signed-off-by: Zhaoyang Huang --- Patchv2: make the size of vmlinux_reg[] more reasonable --- --- arch/arm64/include/asm/kernel-pgtable.h | 4 ++-- arch/arm64/mm/mmu.c | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/arch/arm64/include/asm/kernel-pgtable.h b/arch/arm64/include/a= sm/kernel-pgtable.h index 74a4f738c5f5..14dd1c52552a 100644 --- a/arch/arm64/include/asm/kernel-pgtable.h +++ b/arch/arm64/include/asm/kernel-pgtable.h @@ -64,8 +64,8 @@ #define INIT_IDMAP_FDT_PAGES (EARLY_PAGES(INIT_IDMAP_PGTABLE_LEVELS, 0UL, = UL(MAX_FDT_SIZE), 1) - 1) #define INIT_IDMAP_FDT_SIZE ((INIT_IDMAP_FDT_PAGES + EARLY_IDMAP_EXTRA_FDT= _PAGES) * PAGE_SIZE) =20 -/* The number of segments in the kernel image (text, rodata, inittext, ini= tdata, data+bss) */ -#define KERNEL_SEGMENT_COUNT 5 +/* The number of segments in the kernel image (text, stext, rodata, initte= xt, initdata, data+bss) */ +#define KERNEL_SEGMENT_COUNT 6 =20 #if SWAPPER_BLOCK_SIZE > SEGMENT_ALIGN #define EARLY_SEGMENT_EXTRA_PAGES (KERNEL_SEGMENT_COUNT + 1) diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c index a6a00accf4f9..c807119c7bd7 100644 --- a/arch/arm64/mm/mmu.c +++ b/arch/arm64/mm/mmu.c @@ -1355,7 +1355,11 @@ core_initcall(map_entry_trampoline); */ static void __init declare_kernel_vmas(void) { - static struct vm_struct vmlinux_seg[KERNEL_SEGMENT_COUNT]; + /* + * [_text, _stext) is mapped in init_pg_dir seperatly while they got + * merged into one here + */ + static struct vm_struct vmlinux_seg[KERNEL_SEGMENT_COUNT - 1]; =20 declare_vma(&vmlinux_seg[0], _text, _etext, VM_NO_GUARD); declare_vma(&vmlinux_seg[1], __start_rodata, __inittext_begin, VM_NO_GUAR= D); --=20 2.25.1