aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm64/kernel/vmlinux.lds.S
diff options
context:
space:
mode:
authorMark Rutland <mark.rutland@arm.com>2014-06-24 11:51:35 -0400
committerCatalin Marinas <catalin.marinas@arm.com>2014-07-10 07:36:12 -0400
commitbd00cd5f8c8c3c282bb1e1eac6a6679a4f808091 (patch)
treef146d737e7fdd6b107e23f51cd912402ef7f0bcd /arch/arm64/kernel/vmlinux.lds.S
parent909a4069da65a5cfca8c968edf9f0d99f694d2f3 (diff)
arm64: place initial page tables above the kernel
Currently we place swapper_pg_dir and idmap_pg_dir below the kernel image, between PHYS_OFFSET and (PHYS_OFFSET + TEXT_OFFSET). However, bootloaders may use portions of this memory below the kernel and we do not parse the memory reservation list until after the MMU has been enabled. As such we may clobber some memory a bootloader wishes to have preserved. To enable the use of all of this memory by bootloaders (when the required memory reservations are communicated to the kernel) it is necessary to move our initial page tables elsewhere. As we currently have an effectively unbound requirement for memory at the end of the kernel image for .bss, we can place the page tables here. This patch moves the initial page table to the end of the kernel image, after the BSS. As they do not consist of any initialised data they will be stripped from the kernel Image as with the BSS. The BSS clearing routine is updated to stop at __bss_stop rather than _end so as to not clobber the page tables, and memory reservations made redundant by the new organisation are removed. Signed-off-by: Mark Rutland <mark.rutland@arm.com> Tested-by: Laura Abbott <lauraa@codeaurora.org> Acked-by: Will Deacon <will.deacon@arm.com> Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Diffstat (limited to 'arch/arm64/kernel/vmlinux.lds.S')
-rw-r--r--arch/arm64/kernel/vmlinux.lds.S7
1 files changed, 7 insertions, 0 deletions
diff --git a/arch/arm64/kernel/vmlinux.lds.S b/arch/arm64/kernel/vmlinux.lds.S
index f1e6d5c032e1..c6648d301adf 100644
--- a/arch/arm64/kernel/vmlinux.lds.S
+++ b/arch/arm64/kernel/vmlinux.lds.S
@@ -104,6 +104,13 @@ SECTIONS
104 _edata = .; 104 _edata = .;
105 105
106 BSS_SECTION(0, 0, 0) 106 BSS_SECTION(0, 0, 0)
107
108 . = ALIGN(PAGE_SIZE);
109 idmap_pg_dir = .;
110 . += IDMAP_DIR_SIZE;
111 swapper_pg_dir = .;
112 . += SWAPPER_DIR_SIZE;
113
107 _end = .; 114 _end = .;
108 115
109 STABS_DEBUG 116 STABS_DEBUG