Skip to content

Commit eeb0e8f

Browse files
bjoernQjessebraham
authored andcommitted
use load address when creating direct boot image
1 parent 040fe78 commit eeb0e8f

File tree

2 files changed

+17
-1
lines changed

2 files changed

+17
-1
lines changed

espflash/src/elf.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use crate::flasher::FlashSize;
77
use std::fmt::{Debug, Formatter};
88
use std::mem::take;
99
use std::ops::AddAssign;
10+
use xmas_elf::program::Type;
1011
use xmas_elf::sections::{SectionData, ShType};
1112
use xmas_elf::ElfFile;
1213

@@ -78,6 +79,21 @@ impl<'a> FirmwareImage<'a> {
7879
})
7980
}
8081

82+
pub fn segments_with_load_addresses(&'a self) -> impl Iterator<Item = CodeSegment<'a>> + 'a {
83+
self.elf
84+
.program_iter()
85+
.filter(|header| {
86+
header.file_size() > 0 && header.get_type() == Ok(Type::Load) && header.offset() > 0
87+
})
88+
.flat_map(move |header| {
89+
let addr = header.physical_addr() as u32;
90+
let from = header.offset() as usize;
91+
let to = header.offset() as usize + header.file_size() as usize;
92+
let data = &self.elf.input[from..to];
93+
Some(CodeSegment::new(addr, data))
94+
})
95+
}
96+
8197
pub fn rom_segments(&'a self, chip: Chip) -> impl Iterator<Item = CodeSegment<'a>> + 'a {
8298
self.segments()
8399
.filter(move |segment| chip.addr_is_flash(segment.addr))

espflash/src/image_format/esp32directboot.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ pub struct Esp32DirectBootFormat<'a> {
1414
impl<'a> Esp32DirectBootFormat<'a> {
1515
pub fn new(image: &'a FirmwareImage) -> Result<Self, Error> {
1616
let mut segment = image
17-
.segments()
17+
.segments_with_load_addresses()
1818
.map(|mut segment| {
1919
// map address to the first 4MB
2020
segment.addr %= 0x400000;

0 commit comments

Comments
 (0)