On 26/05/2026 19:58, Ard Biesheuvel wrote: > From: Ard Biesheuvel <[email protected]> > > Move the fixmap and kasan page tables out of the BSS section, and place > them at the end of the image, right before the init_pg_dir section where > some of the other statically allocated page tables live. > > These page tables are currently the only data objects in vmlinux that > are meant to be accessed via the kernel image's linear alias, and so > placing them together allows the remainder of the data/bss section to be > remapped read-only or unmapped entirely. > > Reviewed-by: Kevin Brodsky <[email protected]> > Signed-off-by: Ard Biesheuvel <[email protected]> > --- > arch/arm64/include/asm/mmu.h | 2 ++ > arch/arm64/kernel/vmlinux.lds.S | 8 +++++++- > arch/arm64/mm/fixmap.c | 6 +++--- > arch/arm64/mm/kasan_init.c | 2 +- > 4 files changed, 13 insertions(+), 5 deletions(-) > > diff --git a/arch/arm64/include/asm/mmu.h b/arch/arm64/include/asm/mmu.h > index 5e1211c540ab..fb95754f2876 100644 > --- a/arch/arm64/include/asm/mmu.h > +++ b/arch/arm64/include/asm/mmu.h > @@ -13,6 +13,8 @@ > > #ifndef __ASSEMBLER__ > > +#define __pgtbl_bss __section(".pgdir.bss") __aligned(PAGE_SIZE) > + > #include <linux/refcount.h> > #include <asm/cpufeature.h> > > diff --git a/arch/arm64/kernel/vmlinux.lds.S b/arch/arm64/kernel/vmlinux.lds.S > index e1ac876200a3..2b0ebfb30c63 100644 > --- a/arch/arm64/kernel/vmlinux.lds.S > +++ b/arch/arm64/kernel/vmlinux.lds.S > @@ -349,9 +349,15 @@ SECTIONS > _edata = .; > > /* start of zero-init region */ > - BSS_SECTION(SBSS_ALIGN, 0, 0) > + BSS_SECTION(SBSS_ALIGN, 0, PAGE_SIZE) > __pi___bss_start = __bss_start; > > + /* fixmap BSS starts here - preceding data/BSS is omitted from the > linear map */ > + .pgdir.bss (NOLOAD) : ALIGN(PAGE_SIZE) {
Do we actually need the NOLOAD type here? Aside from that: Reviewed-by: Kevin Brodsky <[email protected]> > + *(.pgdir.bss) > + } > + ASSERT(ADDR(.pgdir.bss) == __bss_stop, ".pgdir.bss must follow BSS") > + > . = ALIGN(PAGE_SIZE); > __pi_init_pg_dir = .; > . += INIT_DIR_SIZE; > diff --git a/arch/arm64/mm/fixmap.c b/arch/arm64/mm/fixmap.c > index c5c5425791da..1a3bbd67dd76 100644 > --- a/arch/arm64/mm/fixmap.c > +++ b/arch/arm64/mm/fixmap.c > @@ -31,9 +31,9 @@ static_assert(NR_BM_PMD_TABLES == 1); > > #define BM_PTE_TABLE_IDX(addr) __BM_TABLE_IDX(addr, PMD_SHIFT) > > -static pte_t bm_pte[NR_BM_PTE_TABLES][PTRS_PER_PTE] __page_aligned_bss; > -static pmd_t bm_pmd[PTRS_PER_PMD] __page_aligned_bss __maybe_unused; > -static pud_t bm_pud[PTRS_PER_PUD] __page_aligned_bss __maybe_unused; > +static pte_t bm_pte[NR_BM_PTE_TABLES][PTRS_PER_PTE] __pgtbl_bss; > +static pmd_t bm_pmd[PTRS_PER_PMD] __pgtbl_bss __maybe_unused; > +static pud_t bm_pud[PTRS_PER_PUD] __pgtbl_bss __maybe_unused; > > static inline pte_t *fixmap_pte(unsigned long addr) > { > diff --git a/arch/arm64/mm/kasan_init.c b/arch/arm64/mm/kasan_init.c > index abeb81bf6ebd..dbf22cae82ee 100644 > --- a/arch/arm64/mm/kasan_init.c > +++ b/arch/arm64/mm/kasan_init.c > @@ -214,7 +214,7 @@ asmlinkage void __init kasan_early_init(void) > * shadow pud_t[]/p4d_t[], which could end up getting corrupted > * when the linear region is mapped. > */ > - static pte_t tbl[PTRS_PER_PTE] __page_aligned_bss; > + static pte_t tbl[PTRS_PER_PTE] __pgtbl_bss; > pgd_t *pgdp = pgd_offset_k(KASAN_SHADOW_START); > > set_pgd(pgdp, __pgd(__pa_symbol(tbl) | PGD_TYPE_TABLE));

