From eb1e72d6ec86aebf22b68bdb1eb5c7f341b115f2 Mon Sep 17 00:00:00 2001 From: equation314 Date: Sat, 16 Mar 2019 21:03:15 +0800 Subject: [PATCH] aarch64: reverse program headers to avoid overlapping in memory copying --- bootloader/src/arch/aarch64/mod.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/bootloader/src/arch/aarch64/mod.rs b/bootloader/src/arch/aarch64/mod.rs index 2ba1473..3aa3762 100644 --- a/bootloader/src/arch/aarch64/mod.rs +++ b/bootloader/src/arch/aarch64/mod.rs @@ -99,8 +99,15 @@ fn enable_mmu() { } pub fn map_kernel(kernel_start: usize, segments: &FixedVec) { + // reverse program headers to avoid overlapping in memory copying + let mut space = alloc_stack!([ProgramHeader64; 32]); + let mut rev_segments = FixedVec::new(&mut space); + for i in (0..segments.len()).rev() { + rev_segments.push(segments[i]).unwrap(); + } + let (mut start_vaddr, mut end_vaddr) = (VirtAddr::new(core::u64::MAX), VirtAddr::zero()); - for segment in segments { + for segment in &rev_segments { if segment.get_type() != Ok(Type::Load) { continue; }