Commit 8eb7e28d authored by Jun Yao's avatar Jun Yao Committed by Catalin Marinas

arm64/mm: move runtime pgds to rodata

Now that deliberate writes to swapper_pg_dir are made via the fixmap, we
can defend against errant writes by moving it into the rodata section.
Since tramp_pg_dir and reserved_ttbr0 must be at a fixed offset from
swapper_pg_dir, and are not modified at runtime, these are also moved
into the rodata section. Likewise, idmap_pg_dir is not modified at
runtime, and is moved into rodata.
Signed-off-by: default avatarJun Yao <yaojun8558363@gmail.com>
Reviewed-by: default avatarJames Morse <james.morse@arm.com>
[Mark: simplify linker script, commit message]
Signed-off-by: default avatarMark Rutland <mark.rutland@arm.com>
Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
parent 2330b7ca
...@@ -287,18 +287,20 @@ __create_page_tables: ...@@ -287,18 +287,20 @@ __create_page_tables:
mov x28, lr mov x28, lr
/* /*
* Invalidate the idmap and swapper page tables to avoid potential * Invalidate the init page tables to avoid potential dirty cache lines
* dirty cache lines being evicted. * being evicted. Other page tables are allocated in rodata as part of
* the kernel image, and thus are clean to the PoC per the boot
* protocol.
*/ */
adrp x0, idmap_pg_dir adrp x0, init_pg_dir
adrp x1, init_pg_end adrp x1, init_pg_end
sub x1, x1, x0 sub x1, x1, x0
bl __inval_dcache_area bl __inval_dcache_area
/* /*
* Clear the idmap and swapper page tables. * Clear the init page tables.
*/ */
adrp x0, idmap_pg_dir adrp x0, init_pg_dir
adrp x1, init_pg_end adrp x1, init_pg_end
sub x1, x1, x0 sub x1, x1, x0
1: stp xzr, xzr, [x0], #16 1: stp xzr, xzr, [x0], #16
......
...@@ -138,6 +138,23 @@ SECTIONS ...@@ -138,6 +138,23 @@ SECTIONS
EXCEPTION_TABLE(8) /* __init_begin will be marked RO NX */ EXCEPTION_TABLE(8) /* __init_begin will be marked RO NX */
NOTES NOTES
. = ALIGN(PAGE_SIZE);
idmap_pg_dir = .;
. += IDMAP_DIR_SIZE;
#ifdef CONFIG_UNMAP_KERNEL_AT_EL0
tramp_pg_dir = .;
. += PAGE_SIZE;
#endif
#ifdef CONFIG_ARM64_SW_TTBR0_PAN
reserved_ttbr0 = .;
. += RESERVED_TTBR0_SIZE;
#endif
swapper_pg_dir = .;
. += PAGE_SIZE;
swapper_pg_end = .;
. = ALIGN(SEGMENT_ALIGN); . = ALIGN(SEGMENT_ALIGN);
__init_begin = .; __init_begin = .;
__inittext_begin = .; __inittext_begin = .;
...@@ -216,22 +233,6 @@ SECTIONS ...@@ -216,22 +233,6 @@ SECTIONS
BSS_SECTION(0, 0, 0) BSS_SECTION(0, 0, 0)
. = ALIGN(PAGE_SIZE); . = ALIGN(PAGE_SIZE);
idmap_pg_dir = .;
. += IDMAP_DIR_SIZE;
#ifdef CONFIG_UNMAP_KERNEL_AT_EL0
tramp_pg_dir = .;
. += PAGE_SIZE;
#endif
#ifdef CONFIG_ARM64_SW_TTBR0_PAN
reserved_ttbr0 = .;
. += RESERVED_TTBR0_SIZE;
#endif
swapper_pg_dir = .;
. += PAGE_SIZE;
swapper_pg_end = .;
init_pg_dir = .; init_pg_dir = .;
. += INIT_DIR_SIZE; . += INIT_DIR_SIZE;
init_pg_end = .; init_pg_end = .;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment