@@ -18,6 +18,16 @@ pub struct UsedMemorySlice {
1818 pub end : u64 ,
1919}
2020
21+ impl UsedMemorySlice {
22+ /// Creates a new slice
23+ pub fn new_from_len ( start : u64 , len : u64 ) -> Self {
24+ Self {
25+ start,
26+ end : start + len,
27+ }
28+ }
29+ }
30+
2131/// Abstraction trait for a memory region returned by the UEFI or BIOS firmware.
2232pub trait LegacyMemoryRegion : Copy + core:: fmt:: Debug {
2333 /// Returns the physical start address of the region.
@@ -208,22 +218,18 @@ where
208218 ramdisk_slice_len : u64 ,
209219 used_slices : S ,
210220 ) -> impl Iterator < Item = UsedMemorySlice > + Clone {
211- BootloaderUsedMemorySliceIter {
212- bootloader : UsedMemorySlice {
221+ [
222+ UsedMemorySlice {
213223 start : min_frame. start_address ( ) . as_u64 ( ) ,
214- // TODO: unit test that this is not an off by 1
215- end : next_free. start_address ( ) - min_frame. start_address ( ) ,
224+ end : next_free. start_address ( ) . as_u64 ( ) ,
216225 } ,
217- kernel : UsedMemorySlice {
218- start : kernel_slice_start. as_u64 ( ) ,
219- end : kernel_slice_len,
220- } ,
221- ramdisk : ramdisk_slice_start. map ( |start| UsedMemorySlice {
222- start : start. as_u64 ( ) ,
223- end : ramdisk_slice_len,
224- } ) ,
225- state : KernelRamIterState :: Bootloader ,
226- }
226+ UsedMemorySlice :: new_from_len ( kernel_slice_start. as_u64 ( ) , kernel_slice_len) ,
227+ ]
228+ . into_iter ( )
229+ . chain (
230+ ramdisk_slice_start
231+ . map ( |start| UsedMemorySlice :: new_from_len ( start. as_u64 ( ) , ramdisk_slice_len) ) ,
232+ )
227233 . chain ( used_slices)
228234 }
229235
@@ -368,41 +374,3 @@ where
368374 None
369375 }
370376}
371-
372- #[ derive( Clone ) ]
373- struct BootloaderUsedMemorySliceIter {
374- bootloader : UsedMemorySlice ,
375- kernel : UsedMemorySlice ,
376- ramdisk : Option < UsedMemorySlice > ,
377- state : KernelRamIterState ,
378- }
379-
380- #[ derive( Clone ) ]
381- enum KernelRamIterState {
382- Bootloader ,
383- Kernel ,
384- Ramdisk ,
385- Done ,
386- }
387-
388- impl Iterator for BootloaderUsedMemorySliceIter {
389- type Item = UsedMemorySlice ;
390-
391- fn next ( & mut self ) -> Option < Self :: Item > {
392- match self . state {
393- KernelRamIterState :: Bootloader => {
394- self . state = KernelRamIterState :: Kernel ;
395- Some ( self . bootloader )
396- }
397- KernelRamIterState :: Kernel => {
398- self . state = KernelRamIterState :: Ramdisk ;
399- Some ( self . kernel )
400- }
401- KernelRamIterState :: Ramdisk => {
402- self . state = KernelRamIterState :: Done ;
403- self . ramdisk
404- }
405- KernelRamIterState :: Done => None ,
406- }
407- }
408- }
0 commit comments