On 26/01/2026 09:26, Ard Biesheuvel wrote: > From: Ard Biesheuvel <[email protected]> > > Move the fixmap 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. > > Signed-off-by: Ard Biesheuvel <[email protected]>
Reviewed-by: Ryan Roberts <[email protected]> > --- > arch/arm64/kernel/vmlinux.lds.S | 5 +++++ > arch/arm64/mm/fixmap.c | 7 ++++--- > 2 files changed, 9 insertions(+), 3 deletions(-) > > diff --git a/arch/arm64/kernel/vmlinux.lds.S b/arch/arm64/kernel/vmlinux.lds.S > index b2a093f5b3fc..c089b83308a5 100644 > --- a/arch/arm64/kernel/vmlinux.lds.S > +++ b/arch/arm64/kernel/vmlinux.lds.S > @@ -335,6 +335,11 @@ SECTIONS > __pi___bss_start = __bss_start; > > . = ALIGN(PAGE_SIZE); > + .pgdir : { > + __pgdir_start = .; > + *(.fixmap_bss) > + } Observing that this still gets zero-initialized: /* Clear BSS and the initial page tables */ memset(__bss_start, 0, (char *)init_pg_end - (char *)__bss_start); Thanks, Ryan > + > __pi_init_pg_dir = .; > . += INIT_DIR_SIZE; > __pi_init_pg_end = .; > diff --git a/arch/arm64/mm/fixmap.c b/arch/arm64/mm/fixmap.c > index c5c5425791da..b649ea1a46e4 100644 > --- a/arch/arm64/mm/fixmap.c > +++ b/arch/arm64/mm/fixmap.c > @@ -31,9 +31,10 @@ 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; > +#define __fixmap_bss __section(".fixmap_bss") __aligned(PAGE_SIZE) > +static pte_t bm_pte[NR_BM_PTE_TABLES][PTRS_PER_PTE] __fixmap_bss; > +static pmd_t bm_pmd[PTRS_PER_PMD] __fixmap_bss __maybe_unused; > +static pud_t bm_pud[PTRS_PER_PUD] __fixmap_bss __maybe_unused; > > static inline pte_t *fixmap_pte(unsigned long addr) > {
