[PATCH v9 08/10] arm64: Add support for MEMBLOCK_LLMAP

From: Vincent Donnefort

Date: Wed Sep 02 2026 - 07:12:15 EST


With the MEMBLOCK_LLMAP flag, force a last-level mapping.

Signed-off-by: Vincent Donnefort <vdonnefort@xxxxxxxxxx>

diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c
index 79d90226fd5d..c0fcc76914d1 100644
--- a/arch/arm64/mm/mmu.c
+++ b/arch/arm64/mm/mmu.c
@@ -1184,9 +1184,8 @@ static void __init map_mem(void)
phys_addr_t init_begin = __pa_symbol(__init_begin);
phys_addr_t init_end = __pa_symbol(__init_end);
phys_addr_t kernel_end = __pa_symbol(__bss_stop);
- phys_addr_t start, end;
int flags = NO_EXEC_MAPPINGS;
- u64 i;
+ struct memblock_region *r;

/*
* Setting hierarchical PXNTable attributes on table entries covering
@@ -1226,9 +1225,13 @@ static void __init map_mem(void)
flags);

/* map all the memory banks */
- for_each_mem_range(i, &start, &end) {
+ for_each_mem_region(r) {
+ phys_addr_t start, end;
+
+ if (memblock_is_nomap(r))
+ continue;
/*
- * for_each_mem_range may return sub-page-aligned boundaries
+ * for_each_mem_region may return sub-page-aligned boundaries
* after memblock_mark_nomap() splits regions at byte precision.
* __create_pgd_mapping_locked aligns phys down to PAGE_MASK,
* which could accidentally map no-map memory on the boundary.
@@ -1237,17 +1240,23 @@ static void __init map_mem(void)
* regions. The cost is at most one page of unmapped gap at
* each boundary.
*/
- start = PAGE_ALIGN(start);
- end = end & PAGE_MASK;
+ start = PAGE_ALIGN(r->base);
+ end = (r->base + r->size) & PAGE_MASK;
if (start >= end)
continue;
+
+ int rflags = flags;
+
+ if (memblock_is_llmap(r))
+ rflags |= NO_BLOCK_MAPPINGS | NO_CONT_MAPPINGS;
+
/*
* The linear map must allow allocation tags reading/writing
* if MTE is present. Otherwise, it has the same attributes as
* PAGE_KERNEL.
*/
__map_memblock(start, end, pgprot_tagged(PAGE_KERNEL),
- flags);
+ rflags);
}
}

--
2.55.0.970.g62bdec98f9-goog