@@ -9,77 +9,45 @@ use std::{
9
9
} ;
10
10
11
11
use xmas_elf:: {
12
- program:: Type ,
13
12
sections:: { SectionData , ShType } ,
14
13
ElfFile ,
15
14
} ;
16
15
17
- use crate :: {
18
- error:: { ElfError , Error } ,
19
- targets:: Chip ,
20
- } ;
16
+ use crate :: targets:: Chip ;
21
17
22
18
/// Operations for working with firmware images
23
19
pub trait FirmwareImage < ' a > {
24
20
/// Firmware image entry point
25
21
fn entry ( & self ) -> u32 ;
26
22
27
23
/// Firmware image segments
28
- fn segments ( & ' a self ) -> Box < dyn Iterator < Item = CodeSegment < ' a > > + ' a > ;
29
-
30
- /// Firmware image segments, with their associated load addresses
31
- fn segments_with_load_addresses ( & ' a self ) -> Box < dyn Iterator < Item = CodeSegment < ' a > > + ' a > ;
24
+ fn segments ( & ' a self ) -> Box < dyn Iterator < Item = Segment < ' a > > + ' a > ;
32
25
33
26
/// Firmware image ROM segments
34
- fn rom_segments ( & ' a self , chip : Chip ) -> Box < dyn Iterator < Item = CodeSegment < ' a > > + ' a > {
27
+ fn rom_segments ( & ' a self , chip : Chip ) -> Box < dyn Iterator < Item = Segment < ' a > > + ' a > {
35
28
Box :: new (
36
29
self . segments ( )
37
30
. filter ( move |segment| chip. into_target ( ) . addr_is_flash ( segment. addr ) ) ,
38
31
)
39
32
}
40
33
41
34
/// Firmware image RAM segments
42
- fn ram_segments ( & ' a self , chip : Chip ) -> Box < dyn Iterator < Item = CodeSegment < ' a > > + ' a > {
35
+ fn ram_segments ( & ' a self , chip : Chip ) -> Box < dyn Iterator < Item = Segment < ' a > > + ' a > {
43
36
Box :: new (
44
37
self . segments ( )
45
38
. filter ( move |segment| !chip. into_target ( ) . addr_is_flash ( segment. addr ) ) ,
46
39
)
47
40
}
48
41
}
49
42
50
- /// A firmware image built from an ELF file
51
- #[ derive( Debug ) ]
52
- pub struct ElfFirmwareImage < ' a > {
53
- elf : ElfFile < ' a > ,
54
- }
55
-
56
- impl < ' a > ElfFirmwareImage < ' a > {
57
- pub fn new ( elf : ElfFile < ' a > ) -> Self {
58
- Self { elf }
59
- }
60
- }
61
-
62
- impl < ' a > TryFrom < & ' a [ u8 ] > for ElfFirmwareImage < ' a > {
63
- type Error = Error ;
64
-
65
- fn try_from ( value : & ' a [ u8 ] ) -> Result < Self , Self :: Error > {
66
- let elf = ElfFile :: new ( value) . map_err ( ElfError :: from) ?;
67
-
68
- let image = ElfFirmwareImage :: new ( elf) ;
69
-
70
- Ok ( image)
71
- }
72
- }
73
-
74
- impl < ' a > FirmwareImage < ' a > for ElfFirmwareImage < ' a > {
43
+ impl < ' a > FirmwareImage < ' a > for ElfFile < ' a > {
75
44
fn entry ( & self ) -> u32 {
76
- self . elf . header . pt2 . entry_point ( ) as u32
45
+ self . header . pt2 . entry_point ( ) as u32
77
46
}
78
47
79
- fn segments ( & ' a self ) -> Box < dyn Iterator < Item = CodeSegment < ' a > > + ' a > {
48
+ fn segments ( & ' a self ) -> Box < dyn Iterator < Item = Segment < ' a > > + ' a > {
80
49
Box :: new (
81
- self . elf
82
- . section_iter ( )
50
+ self . section_iter ( )
83
51
. filter ( |header| {
84
52
header. size ( ) > 0
85
53
&& header. get_type ( ) == Ok ( ShType :: ProgBits )
@@ -88,50 +56,33 @@ impl<'a> FirmwareImage<'a> for ElfFirmwareImage<'a> {
88
56
} )
89
57
. flat_map ( move |header| {
90
58
let addr = header. address ( ) as u32 ;
91
- let data = match header. get_data ( & self . elf ) {
59
+ let data = match header. get_data ( self ) {
92
60
Ok ( SectionData :: Undefined ( data) ) => data,
93
61
_ => return None ,
94
62
} ;
95
- Some ( CodeSegment :: new ( addr, data) )
96
- } ) ,
97
- )
98
- }
99
-
100
- fn segments_with_load_addresses ( & ' a self ) -> Box < dyn Iterator < Item = CodeSegment < ' a > > + ' a > {
101
- Box :: new (
102
- self . elf
103
- . program_iter ( )
104
- . filter ( |header| {
105
- header. file_size ( ) > 0
106
- && header. get_type ( ) == Ok ( Type :: Load )
107
- && header. offset ( ) > 0
108
- } )
109
- . flat_map ( move |header| {
110
- let addr = header. physical_addr ( ) as u32 ;
111
- let from = header. offset ( ) as usize ;
112
- let to = header. offset ( ) as usize + header. file_size ( ) as usize ;
113
- let data = & self . elf . input [ from..to] ;
114
- Some ( CodeSegment :: new ( addr, data) )
63
+ Some ( Segment :: new ( addr, data) )
115
64
} ) ,
116
65
)
117
66
}
118
67
}
119
68
120
- #[ derive( Eq , Clone , Default ) ]
121
69
/// A segment of code from the source ELF
122
- pub struct CodeSegment < ' a > {
70
+ #[ derive( Default , Clone , Eq ) ]
71
+ pub struct Segment < ' a > {
123
72
/// Base address of the code segment
124
73
pub addr : u32 ,
125
- data : Cow < ' a , [ u8 ] > ,
74
+ /// Segment data
75
+ pub data : Cow < ' a , [ u8 ] > ,
126
76
}
127
77
128
- impl < ' a > CodeSegment < ' a > {
78
+ impl < ' a > Segment < ' a > {
129
79
pub fn new ( addr : u32 , data : & ' a [ u8 ] ) -> Self {
130
- let mut segment = CodeSegment {
80
+ let mut segment = Segment {
131
81
addr,
132
82
data : Cow :: Borrowed ( data) ,
133
83
} ;
134
84
segment. pad_align ( 4 ) ;
85
+
135
86
segment
136
87
}
137
88
@@ -149,7 +100,7 @@ impl<'a> CodeSegment<'a> {
149
100
( Cow :: Owned ( data) , Cow :: Owned ( tail) )
150
101
}
151
102
} ;
152
- let new = CodeSegment {
103
+ let new = Segment {
153
104
addr : self . addr ,
154
105
data : head,
155
106
} ;
@@ -183,28 +134,39 @@ impl<'a> CodeSegment<'a> {
183
134
self . data = Cow :: Owned ( data) ;
184
135
}
185
136
}
137
+
138
+ /// Borrow the segment for the given lifetime
139
+ pub fn borrow < ' b > ( & ' b self ) -> Segment < ' b >
140
+ where
141
+ ' a : ' b ,
142
+ {
143
+ Segment {
144
+ addr : self . addr ,
145
+ data : Cow :: Borrowed ( self . data . as_ref ( ) ) ,
146
+ }
147
+ }
186
148
}
187
149
188
- impl AddAssign < & ' _ [ u8 ] > for CodeSegment < ' _ > {
150
+ impl AddAssign < & ' _ [ u8 ] > for Segment < ' _ > {
189
151
fn add_assign ( & mut self , rhs : & ' _ [ u8 ] ) {
190
152
let mut data = take ( & mut self . data ) . into_owned ( ) ;
191
153
data. extend_from_slice ( rhs) ;
192
154
self . data = Cow :: Owned ( data) ;
193
155
}
194
156
}
195
157
196
- impl AddAssign < & ' _ CodeSegment < ' _ > > for CodeSegment < ' _ > {
197
- fn add_assign ( & mut self , rhs : & ' _ CodeSegment < ' _ > ) {
158
+ #[ allow( clippy:: suspicious_op_assign_impl) ]
159
+ impl AddAssign < & ' _ Segment < ' _ > > for Segment < ' _ > {
160
+ fn add_assign ( & mut self , rhs : & ' _ Segment < ' _ > ) {
198
161
let mut data = take ( & mut self . data ) . into_owned ( ) ;
199
- // pad or truncate
200
- #[ allow( clippy:: suspicious_op_assign_impl) ]
162
+ // Pad or truncate:
201
163
data. resize ( ( rhs. addr - self . addr ) as usize , 0 ) ;
202
164
data. extend_from_slice ( rhs. data ( ) ) ;
203
165
self . data = Cow :: Owned ( data) ;
204
166
}
205
167
}
206
168
207
- impl Debug for CodeSegment < ' _ > {
169
+ impl Debug for Segment < ' _ > {
208
170
fn fmt ( & self , f : & mut Formatter < ' _ > ) -> std:: fmt:: Result {
209
171
f. debug_struct ( "CodeSegment" )
210
172
. field ( "addr" , & self . addr )
@@ -213,50 +175,20 @@ impl Debug for CodeSegment<'_> {
213
175
}
214
176
}
215
177
216
- impl PartialEq for CodeSegment < ' _ > {
178
+ impl PartialEq for Segment < ' _ > {
217
179
fn eq ( & self , other : & Self ) -> bool {
218
180
self . addr . eq ( & other. addr )
219
181
}
220
182
}
221
183
222
- impl PartialOrd for CodeSegment < ' _ > {
184
+ impl PartialOrd for Segment < ' _ > {
223
185
fn partial_cmp ( & self , other : & Self ) -> Option < Ordering > {
224
186
Some ( self . cmp ( other) )
225
187
}
226
188
}
227
189
228
- impl Ord for CodeSegment < ' _ > {
190
+ impl Ord for Segment < ' _ > {
229
191
fn cmp ( & self , other : & Self ) -> Ordering {
230
192
self . addr . cmp ( & other. addr )
231
193
}
232
194
}
233
-
234
- /// A segment of data to write to the flash
235
- #[ derive( Debug , Clone ) ]
236
- pub struct RomSegment < ' a > {
237
- /// ROM address at which the segment begins
238
- pub addr : u32 ,
239
- /// Segment data
240
- pub data : Cow < ' a , [ u8 ] > ,
241
- }
242
-
243
- impl < ' a > RomSegment < ' a > {
244
- pub fn borrow < ' b > ( & ' b self ) -> RomSegment < ' b >
245
- where
246
- ' a : ' b ,
247
- {
248
- RomSegment {
249
- addr : self . addr ,
250
- data : Cow :: Borrowed ( self . data . as_ref ( ) ) ,
251
- }
252
- }
253
- }
254
-
255
- impl < ' a > From < CodeSegment < ' a > > for RomSegment < ' a > {
256
- fn from ( segment : CodeSegment < ' a > ) -> Self {
257
- RomSegment {
258
- addr : segment. addr ,
259
- data : segment. data ,
260
- }
261
- }
262
- }
0 commit comments