11use anyhow:: { Context , Result , anyhow, bail} ;
2- use probe_rs_target:: { FlashProperties , RawFlashAlgorithm } ;
2+ use probe_rs_target:: { FlashProperties , RawFlashAlgorithm , SectorDescription } ;
33use std:: collections:: HashMap ;
44use std:: path:: Path ;
55use std:: process:: Command ;
@@ -243,7 +243,14 @@ fn extract_algo(buf: &[u8]) -> Result<RawFlashAlgorithm> {
243243 erased_byte_value : dev. erased ,
244244 program_page_timeout : dev. program_to ,
245245 erase_sector_timeout : dev. erase_to ,
246- sectors : Vec :: new ( ) ,
246+ sectors : dev
247+ . sectors
248+ . iter ( )
249+ . map ( |( size, address) | SectorDescription {
250+ size : * size as u64 ,
251+ address : * address as u64 ,
252+ } )
253+ . collect ( ) ,
247254 } ;
248255 // probe-rs schema default (Rust default for u64 is 0).
249256 algo. rtt_poll_interval = 20 ;
@@ -257,28 +264,44 @@ struct FlashDevice {
257264 erased : u8 ,
258265 program_to : u32 ,
259266 erase_to : u32 ,
267+ sectors : Vec < ( u32 , u32 ) > ,
260268}
261269
262270fn read_flash_device ( elf : & goblin:: elf:: Elf < ' _ > , buf : & [ u8 ] ) -> Result < FlashDevice > {
263271 use scroll:: Pread ;
264272 let mut addr = None ;
273+ let mut sym_size = 0u32 ;
265274 for s in elf. syms . iter ( ) {
266275 if & elf. strtab [ s. st_name ] == "FlashDevice" {
267276 addr = Some ( s. st_value as u32 ) ;
277+ sym_size = s. st_size as u32 ;
268278 break ;
269279 }
270280 }
271281 let addr = addr. ok_or_else ( || anyhow ! ( "ELF missing FlashDevice symbol" ) ) ?;
272282
273- let bytes = read_at ( elf, buf, addr, 160 )
274- . ok_or_else ( || anyhow ! ( "FlashDevice not in any LOAD segment" ) ) ?;
283+ let want = sym_size. max ( 160 ) ;
284+ let bytes =
285+ read_at ( elf, buf, addr, want) . ok_or_else ( || anyhow ! ( "FlashDevice not in any LOAD segment" ) ) ?;
286+ let mut sectors = Vec :: new ( ) ;
287+ let mut off = 160 ;
288+ while off + 8 <= bytes. len ( ) {
289+ let size: u32 = bytes. pread ( off) . unwrap ( ) ;
290+ let address: u32 = bytes. pread ( off + 4 ) . unwrap ( ) ;
291+ if size == u32:: MAX && address == u32:: MAX {
292+ break ;
293+ }
294+ sectors. push ( ( size, address) ) ;
295+ off += 8 ;
296+ }
275297 Ok ( FlashDevice {
276298 start : bytes. pread :: < u32 > ( 132 ) . unwrap ( ) as u64 ,
277299 size : bytes. pread :: < u32 > ( 136 ) . unwrap ( ) as u64 ,
278300 page_size : bytes. pread ( 140 ) . unwrap ( ) ,
279301 erased : bytes. pread ( 148 ) . unwrap ( ) ,
280302 program_to : bytes. pread ( 152 ) . unwrap ( ) ,
281303 erase_to : bytes. pread ( 156 ) . unwrap ( ) ,
304+ sectors,
282305 } )
283306}
284307
0 commit comments