We want to rework how set_pXd() and pgd_page_vaddr() behaves for generic compile-time folded page tables by disallowing its use and triggering a compile-time error when they're used improperly, ensuring that the actual first-level pgtable APIs are used instead.
For this, Replace set_pgd() with set_pud() and pgd_page_vaddr() with pud_pgtable() to setup kasan early patable since it used with LPAE and PGTABLE_LEVEL as 3 Since the first page-level is 3 to get a first page-level properly introduce new helper pud_off_k() and replace direct dereference of first page-table entry with pudp_get(). There should be no functional change. Signed-off-by: Yeoreum Yun <[email protected]> --- arch/arm/mm/kasan_init.c | 8 +++++--- include/linux/pgtable.h | 5 +++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/arch/arm/mm/kasan_init.c b/arch/arm/mm/kasan_init.c index c6625e808bf85..31fa1b11816c7 100644 --- a/arch/arm/mm/kasan_init.c +++ b/arch/arm/mm/kasan_init.c @@ -211,6 +211,7 @@ void __init kasan_init(void) { phys_addr_t pa_start, pa_end; u64 i; + pud_t *pudp __maybe_unused; /* * We are going to perform proper setup of shadow memory. @@ -230,11 +231,12 @@ void __init kasan_init(void) /* We need to be in the same PGD or this won't work */ BUILD_BUG_ON(pgd_index(KASAN_SHADOW_START) != pgd_index(KASAN_SHADOW_END)); + pudp = pud_off_k(KASAN_SHADOW_START); memcpy(tmp_pmd_table, - (void*)pgd_page_vaddr(*pgd_offset_k(KASAN_SHADOW_START)), + (void*)pud_pgtable(pudp_get(pudp)), sizeof(tmp_pmd_table)); - set_pgd(&tmp_pgd_table[pgd_index(KASAN_SHADOW_START)], - __pgd(__pa(tmp_pmd_table) | PMD_TYPE_TABLE | L_PGD_SWAPPER)); + set_pud(&tmp_pgd_table[pgd_index(KASAN_SHADOW_START)], + __pmd(__pa(tmp_pmd_table) | PMD_TYPE_TABLE | L_PGD_SWAPPER)); #endif cpu_switch_mm(tmp_pgd_table, &init_mm); local_flush_tlb_all(); diff --git a/include/linux/pgtable.h b/include/linux/pgtable.h index 8c093c119e5a8..4962d9764b487 100644 --- a/include/linux/pgtable.h +++ b/include/linux/pgtable.h @@ -155,6 +155,11 @@ static inline pgd_t *pgd_offset_pgd(pgd_t *pgd, unsigned long address) */ #define pgd_offset_k(address) pgd_offset(&init_mm, (address)) +static inline pud_t *pud_off_k(unsigned long va) +{ + return pud_offset(p4d_offset(pgd_offset_k(va), va), va); +} + /* * In many cases it is known that a virtual address is mapped at PMD or PTE * level, so instead of traversing all the page table levels, we can get a -- LEVI:{C3F47F37-75D8-414A-A8BA-3980EC8A46D7}
