diff --git a/bootloader/build.rs b/bootloader/build.rs index b4e87e8..958e977 100644 --- a/bootloader/build.rs +++ b/bootloader/build.rs @@ -25,7 +25,7 @@ fn gen_payload_asm() -> Result { write!(f, "# generated by build.rs - do not edit")?; write!(f, r#" - .section .rodata + .section .payload,"a" .align 12 .global _kernel_payload_start, _kernel_payload_end _kernel_payload_start: diff --git a/bootloader/src/arch/aarch64/boot.ld b/bootloader/src/arch/aarch64/boot.ld index 20c42ab..3e95fe5 100644 --- a/bootloader/src/arch/aarch64/boot.ld +++ b/bootloader/src/arch/aarch64/boot.ld @@ -27,5 +27,9 @@ SECTIONS { _ebss = .; } + .payload : { + *(.payload) + } + /DISCARD/ : { *(.comment) *(.gnu*) *(.note*) *(.eh_frame*) } } diff --git a/kernel/src/arch/aarch64/boot/entry.S b/kernel/src/arch/aarch64/boot/entry.S index e2a22f4..3cf258d 100644 --- a/kernel/src/arch/aarch64/boot/entry.S +++ b/kernel/src/arch/aarch64/boot/entry.S @@ -5,3 +5,4 @@ _start: ldr x0, =bootstacktop mov sp, x0 bl rust_main +1: b 1b diff --git a/kernel/src/arch/aarch64/boot/linker.ld b/kernel/src/arch/aarch64/boot/linker.ld index e8a1046..c82f537 100644 --- a/kernel/src/arch/aarch64/boot/linker.ld +++ b/kernel/src/arch/aarch64/boot/linker.ld @@ -2,7 +2,6 @@ ENTRY(_start) SECTIONS { . = 0xffff000000100000; /* Load the kernel at this address. It's also kernel stack top address */ - bootstacktop = .; .text : { stext = .; @@ -35,12 +34,15 @@ SECTIONS { ebss = .; } + .stack : { + . = ALIGN(4K); + bootstack = .; + . += 0x100000; + bootstacktop = .; + } + /* end of the binary */ _end = ALIGN(8); - /* number of bytes in BSS section and complete binary */ - __bss_length = (ebss - sbss); - __binary_length = (_end - _start); - /DISCARD/ : { *(.comment) *(.gnu*) *(.note*) *(.eh_frame*) } } diff --git a/kernel/src/arch/aarch64/memory.rs b/kernel/src/arch/aarch64/memory.rs index c40a055..6de1ba8 100644 --- a/kernel/src/arch/aarch64/memory.rs +++ b/kernel/src/arch/aarch64/memory.rs @@ -47,11 +47,11 @@ static mut KERNEL_MEMORY_SET: Option = None; fn remap_the_kernel() { let offset = -(KERNEL_OFFSET as isize); let mut ms = MemorySet::new_bare(); - ms.push(KERNEL_OFFSET, bootstacktop as usize, Linear::new(offset, MemoryAttr::default()), "kstack"); ms.push(stext as usize, etext as usize, Linear::new(offset, MemoryAttr::default().execute().readonly()), "text"); ms.push(sdata as usize, edata as usize, Linear::new(offset, MemoryAttr::default()), "data"); ms.push(srodata as usize, erodata as usize, Linear::new(offset, MemoryAttr::default().readonly()), "rodata"); ms.push(sbss as usize, ebss as usize, Linear::new(offset, MemoryAttr::default()), "bss"); + ms.push(bootstack as usize, bootstacktop as usize, Linear::new(offset, MemoryAttr::default()), "kstack"); use super::board::{IO_REMAP_BASE, IO_REMAP_END}; ms.push(IO_REMAP_BASE, IO_REMAP_END, Linear::new(offset, MemoryAttr::default().mmio(MMIOType::Device as u8)), "io_remap"); @@ -73,7 +73,6 @@ pub fn ioremap(paddr: usize, len: usize, name: &'static str) -> usize { } extern "C" { - fn bootstacktop(); fn stext(); fn etext(); fn sdata(); @@ -82,6 +81,8 @@ extern "C" { fn erodata(); fn sbss(); fn ebss(); + fn bootstack(); + fn bootstacktop(); fn _start(); fn _end(); }