The branch main has been updated by andrew: URL: https://cgit.FreeBSD.org/src/commit/?id=e6928c33f60c0a29a5e280840b038dfcbbbbce72
commit e6928c33f60c0a29a5e280840b038dfcbbbbce72 Author: Andrew Turner <and...@freebsd.org> AuthorDate: 2025-06-12 09:37:27 +0000 Commit: Andrew Turner <and...@freebsd.org> CommitDate: 2025-06-12 09:48:57 +0000 arm64: Reduce the kernel executable pages When creating the kernel page tables we create them all executable to allow the kernel to boot. We can reduce the number of l2 blocks or l3 pages created as executable by looking where the end of the .text section is and only marking memory up to this as executable (rounded up to the block/page size). Memory after the .text is marked as execute never as it will be data. Reviewed by: alc Sponsored by: Arm Ltd Differential Revision: https://reviews.freebsd.org/D45063 --- sys/arm64/arm64/locore.S | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/sys/arm64/arm64/locore.S b/sys/arm64/arm64/locore.S index 1268d0d79193..fcc3f948f00c 100644 --- a/sys/arm64/arm64/locore.S +++ b/sys/arm64/arm64/locore.S @@ -598,7 +598,14 @@ common: #endif /* Get the number of blocks/pages to allocate, rounded down */ - lsr x10, x8, #(PTE_SHIFT) + lsr x14, x8, #(PTE_SHIFT) + + ldr x25, =etext + ldr x8, =((1 << PTE_SHIFT) - 1) + add x25, x25, x8 + mov x8, #(KERNBASE) + sub x25, x25, x8 + lsr x25, x25, #(PTE_SHIFT) /* Create the kernel space PTE table */ adrp x6, LL_PAGE_TABLE @@ -606,6 +613,16 @@ common: mov x7, #(ATTR_S1_IDX(VM_MEMATTR_WRITE_BACK)) mov x8, #(KERNBASE) mov x9, x28 + mov x10, x25 + bl BUILD_PTE_FUNC + + /* Create the kernel space XN PTE table */ + lsl x10, x25, #(PTE_SHIFT) + ldr x7, =(ATTR_S1_IDX(VM_MEMATTR_WRITE_BACK) | ATTR_S1_XN) + ldr x8, =(KERNBASE) + add x8, x8, x10 + add x9, x28, x10 + sub x10, x14, x25 bl BUILD_PTE_FUNC #undef PTE_SHIFT