summaryrefslogtreecommitdiff
path: root/arch/arm64/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm64/kernel')
-rw-r--r--arch/arm64/kernel/start.S4
-rw-r--r--arch/arm64/kernel/tashaboot.lds10
2 files changed, 12 insertions, 2 deletions
diff --git a/arch/arm64/kernel/start.S b/arch/arm64/kernel/start.S
index 705721f..2d4b5c0 100644
--- a/arch/arm64/kernel/start.S
+++ b/arch/arm64/kernel/start.S
@@ -143,8 +143,8 @@ c_entry:
3:
isb
- /* stack for the bootloader, grows down from the image end */
- ldr x0, =__image_end
+ /* stack for the bootloader, its own region above the bss */
+ ldr x0, =__stack_top
mov sp, x0
/* clear bss */
diff --git a/arch/arm64/kernel/tashaboot.lds b/arch/arm64/kernel/tashaboot.lds
index 4f8dfb1..4d7adad 100644
--- a/arch/arm64/kernel/tashaboot.lds
+++ b/arch/arm64/kernel/tashaboot.lds
@@ -52,6 +52,16 @@ SECTIONS
. = ALIGN(8);
__bss_end = .;
+ /*
+ * the stack lives in its own region, clear of bss. page tables
+ * and buffers are bss objects, a stack sharing their address
+ * space grows down into them and the first deep call crushes
+ * whatever it meets.
+ */
+ . = ALIGN(4096);
+ __stack_bottom = .;
+ . += 0x4000;
+ __stack_top = .;
__image_copy_end = .;
/DISCARD/ : { *(.dynsym) }