@@ -1625,7 +1625,10 @@ pub struct MemoryMapSize {
1625
1625
pub map_size : usize ,
1626
1626
}
1627
1627
1628
- /// An iterator of [`MemoryDescriptor`] that is always associated with the
1628
+ /// An accessory to the memory map that can be either iterated or
1629
+ /// indexed like an array.
1630
+ ///
1631
+ /// A [`MemoryMap`] is always associated with the
1629
1632
/// unique [`MemoryMapKey`] contained in the struct.
1630
1633
///
1631
1634
/// To iterate over the entries, call [`MemoryMap::entries`]. To get a sorted
@@ -1720,55 +1723,91 @@ impl<'buf> MemoryMap<'buf> {
1720
1723
#[ must_use]
1721
1724
pub fn entries ( & self ) -> MemoryMapIter {
1722
1725
MemoryMapIter {
1723
- buffer : self . buf ,
1724
- entry_size : self . entry_size ,
1726
+ memory_map : self ,
1725
1727
index : 0 ,
1726
- len : self . len ,
1727
1728
}
1728
1729
}
1730
+
1731
+ /// Returns a reference to the [`MemoryDescriptor`] at `index` or `None` if out of bounds.
1732
+ #[ must_use]
1733
+ pub fn get ( & self , index : usize ) -> Option < & ' buf MemoryDescriptor > {
1734
+ if index >= self . len {
1735
+ return None ;
1736
+ }
1737
+
1738
+ let desc = unsafe {
1739
+ & * self
1740
+ . buf
1741
+ . as_ptr ( )
1742
+ . add ( self . entry_size * index)
1743
+ . cast :: < MemoryDescriptor > ( )
1744
+ } ;
1745
+
1746
+ Some ( desc)
1747
+ }
1748
+
1749
+ /// Returns a mut reference to the [`MemoryDescriptor`] at `index` or `None` if out of bounds.
1750
+ #[ must_use]
1751
+ pub fn get_mut ( & mut self , index : usize ) -> Option < & ' buf mut MemoryDescriptor > {
1752
+ if index >= self . len {
1753
+ return None ;
1754
+ }
1755
+
1756
+ let desc = unsafe {
1757
+ & mut * self
1758
+ . buf
1759
+ . as_mut_ptr ( )
1760
+ . add ( self . entry_size * index)
1761
+ . cast :: < MemoryDescriptor > ( )
1762
+ } ;
1763
+
1764
+ Some ( desc)
1765
+ }
1766
+ }
1767
+
1768
+ impl core:: ops:: Index < usize > for MemoryMap < ' _ > {
1769
+ type Output = MemoryDescriptor ;
1770
+
1771
+ fn index ( & self , index : usize ) -> & Self :: Output {
1772
+ self . get ( index) . unwrap ( )
1773
+ }
1774
+ }
1775
+
1776
+ impl core:: ops:: IndexMut < usize > for MemoryMap < ' _ > {
1777
+ fn index_mut ( & mut self , index : usize ) -> & mut Self :: Output {
1778
+ self . get_mut ( index) . unwrap ( )
1779
+ }
1729
1780
}
1730
1781
1731
1782
/// An iterator of [`MemoryDescriptor`]. The underlying memory map is always
1732
1783
/// associated with a unique [`MemoryMapKey`].
1733
1784
#[ derive( Debug , Clone ) ]
1734
1785
pub struct MemoryMapIter < ' buf > {
1735
- buffer : & ' buf [ u8 ] ,
1736
- entry_size : usize ,
1786
+ memory_map : & ' buf MemoryMap < ' buf > ,
1737
1787
index : usize ,
1738
- len : usize ,
1739
1788
}
1740
1789
1741
1790
impl < ' buf > Iterator for MemoryMapIter < ' buf > {
1742
1791
type Item = & ' buf MemoryDescriptor ;
1743
1792
1744
1793
fn size_hint ( & self ) -> ( usize , Option < usize > ) {
1745
- let sz = self . len - self . index ;
1794
+ let sz = self . memory_map . len - self . index ;
1746
1795
1747
1796
( sz, Some ( sz) )
1748
1797
}
1749
1798
1750
1799
fn next ( & mut self ) -> Option < Self :: Item > {
1751
- if self . index < self . len {
1752
- let descriptor = unsafe {
1753
- & * self
1754
- . buffer
1755
- . as_ptr ( )
1756
- . add ( self . entry_size * self . index )
1757
- . cast :: < MemoryDescriptor > ( )
1758
- } ;
1759
-
1760
- self . index += 1 ;
1761
-
1762
- Some ( descriptor)
1763
- } else {
1764
- None
1765
- }
1800
+ let desc = self . memory_map . get ( self . index ) ?;
1801
+
1802
+ self . index += 1 ;
1803
+
1804
+ Some ( desc)
1766
1805
}
1767
1806
}
1768
1807
1769
1808
impl ExactSizeIterator for MemoryMapIter < ' _ > {
1770
1809
fn len ( & self ) -> usize {
1771
- self . len
1810
+ self . memory_map . len
1772
1811
}
1773
1812
}
1774
1813
@@ -1905,6 +1944,23 @@ mod tests {
1905
1944
1906
1945
use super :: { MemoryDescriptor , MemoryMapIter } ;
1907
1946
1947
+ fn buffer_to_map ( buffer : & mut [ MemoryDescriptor ] ) -> MemoryMap {
1948
+ let desc_count = buffer. len ( ) ;
1949
+
1950
+ let byte_buffer = {
1951
+ let size = desc_count * size_of :: < MemoryDescriptor > ( ) ;
1952
+ unsafe { core:: slice:: from_raw_parts_mut ( buffer. as_mut_ptr ( ) as * mut u8 , size) }
1953
+ } ;
1954
+
1955
+ MemoryMap {
1956
+ // Key doesn't matter
1957
+ key : MemoryMapKey ( 0 ) ,
1958
+ len : desc_count,
1959
+ buf : byte_buffer,
1960
+ entry_size : size_of :: < MemoryDescriptor > ( ) ,
1961
+ }
1962
+ }
1963
+
1908
1964
#[ test]
1909
1965
fn mem_map_sorting ( ) {
1910
1966
// Doesn't matter what type it is.
@@ -1934,20 +1990,7 @@ mod tests {
1934
1990
} ,
1935
1991
] ;
1936
1992
1937
- let desc_count = buffer. len ( ) ;
1938
-
1939
- let byte_buffer = {
1940
- let size = desc_count * size_of :: < MemoryDescriptor > ( ) ;
1941
- unsafe { core:: slice:: from_raw_parts_mut ( buffer. as_mut_ptr ( ) as * mut u8 , size) }
1942
- } ;
1943
-
1944
- let mut mem_map = MemoryMap {
1945
- // Key doesn't matter
1946
- key : MemoryMapKey ( 0 ) ,
1947
- len : desc_count,
1948
- buf : byte_buffer,
1949
- entry_size : size_of :: < MemoryDescriptor > ( ) ,
1950
- } ;
1993
+ let mut mem_map = buffer_to_map ( & mut buffer) ;
1951
1994
1952
1995
mem_map. sort ( ) ;
1953
1996
@@ -1956,6 +1999,52 @@ mod tests {
1956
1999
}
1957
2000
}
1958
2001
2002
+ #[ test]
2003
+ fn mem_map_get ( ) {
2004
+ // Doesn't matter what type it is.
2005
+ const TY : MemoryType = MemoryType :: RESERVED ;
2006
+
2007
+ const BASE : MemoryDescriptor = MemoryDescriptor {
2008
+ ty : TY ,
2009
+ phys_start : 0 ,
2010
+ virt_start : 0 ,
2011
+ page_count : 0 ,
2012
+ att : MemoryAttribute :: empty ( ) ,
2013
+ } ;
2014
+
2015
+ const BUFFER : [ MemoryDescriptor ; 4 ] = [
2016
+ MemoryDescriptor {
2017
+ phys_start : 2000 ,
2018
+ ..BASE
2019
+ } ,
2020
+ MemoryDescriptor {
2021
+ phys_start : 3000 ,
2022
+ ..BASE
2023
+ } ,
2024
+ BASE ,
2025
+ MemoryDescriptor {
2026
+ phys_start : 1000 ,
2027
+ ..BASE
2028
+ } ,
2029
+ ] ;
2030
+
2031
+ let mut buffer = BUFFER ;
2032
+
2033
+ let mut mem_map = buffer_to_map ( & mut buffer) ;
2034
+
2035
+ for index in 0 ..3 {
2036
+ assert_eq ! ( mem_map. get( index) , BUFFER . get( index) )
2037
+ }
2038
+
2039
+ let mut_desc = mem_map. get_mut ( 2 ) . unwrap ( ) ;
2040
+
2041
+ mut_desc. phys_start = 300 ;
2042
+
2043
+ let desc = mem_map. get ( 2 ) . unwrap ( ) ;
2044
+
2045
+ assert_ne ! ( * desc, BUFFER [ 2 ] ) ;
2046
+ }
2047
+
1959
2048
// Added for debug purposes on test failure
1960
2049
impl core:: fmt:: Display for MemoryMap < ' _ > {
1961
2050
fn fmt ( & self , f : & mut core:: fmt:: Formatter < ' _ > ) -> core:: fmt:: Result {
0 commit comments