[RFC PATCH 12/34] arm64: mm: use proper set_pXd() for generic compile-time folded patable in kasan_early_init()

Yeoreum Yun <[email protected]>
Newsgroups org.kernel.vger.linux-arch,dev.linux.lists.loongarch,org.infradead.lists.kvm-riscv,org.infradead.lists.linux-riscv,org.kernel.vger.linux-csky,org.kernel.vger.linux-kernel,org.kernel.vger.linux-m68k,org.kernel.vger.linux-mips,org.kernel.vger.linux-openrisc
Message-ID <[email protected]>
We want to rework how set_pXd() behaves for generic compile-time folded
page tables by disallowing its use and triggering a compile-time error
when it is used improperly, ensuring that the actual first-level set_pXd()
function is used instead.

Therefore, call the proper set_pXd() in case of folded pgtable
to setup early kasan first-level pgtable with pXd_present()

There should be no functional change.

Signed-off-by: Yeoreum Yun <[email protected]>
---
 arch/arm64/mm/kasan_init.c | 26 ++++++++++++++++++++++++--
 1 file changed, 24 insertions(+), 2 deletions(-)

diff --git a/arch/arm64/mm/kasan_init.c b/arch/arm64/mm/kasan_init.c
index 3fcad956fdf7c..c77ba4ab643b5 100644
--- a/arch/arm64/mm/kasan_init.c
+++ b/arch/arm64/mm/kasan_init.c
@@ -216,10 +216,32 @@ asmlinkage void __init kasan_early_init(void)
 		 */
 		static pte_t tbl[PTRS_PER_PTE] __bss_pgtbl;
 		pgd_t *pgdp = pgd_offset_k(KASAN_SHADOW_START);
-
-		set_pgd(pgdp, __pgd(__pa_symbol(tbl) | PGD_TYPE_TABLE));
+		p4d_t *p4dp;
+		pud_t *pudp;
+		pmd_t *pmdp;
+
+		if (CONFIG_PGTABLE_LEVELS == 5 && pgtable_l5_enabled()) {
+			set_pgd(pgdp, __pgd(__pa_symbol(tbl) | PGD_TYPE_TABLE));
+			goto populate;
+		}
+
+		p4dp = p4d_offset(pgdp, KASAN_SHADOW_START);
+		if (CONFIG_PGTABLE_LEVELS >= 4 && pgtable_l4_enabled()) {
+			set_p4d(p4dp, __p4d(__pa_symbol(tbl) | P4D_TYPE_TABLE));
+			goto populate;
+		}
+
+		pudp = pud_offset(p4dp, KASAN_SHADOW_START);
+		if (CONFIG_PGTABLE_LEVELS >= 3) {
+			set_pud(pudp, __pud(__pa_symbol(tbl) | PUD_TYPE_TABLE));
+			goto populate;
+		}
+
+		pmdp = pmd_offset(pudp, KASAN_SHADOW_START);
+		set_pmd(pmdp, __pmd(__pa_symbol(tbl) | PMD_TYPE_TABLE));
 	}
 
+populate:
 	kasan_pgd_populate(KASAN_SHADOW_START, KASAN_SHADOW_END, NUMA_NO_NODE,
 			   true);
 }
-- 
LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.