123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- #[derive(Debug)]
- #[repr(C)]
- pub struct MemoryMapTag {
- typ: u32,
- size: u32,
- entry_size: u32,
- entry_version: u32,
- first_area: MemoryArea,
- }
- impl MemoryMapTag {
- pub fn memory_areas(&self) -> MemoryAreaIter {
- let self_ptr = self as *const MemoryMapTag;
- let start_area = (&self.first_area) as *const MemoryArea;
- MemoryAreaIter {
- current_area: start_area as u64,
- last_area: (self_ptr as u64 + (self.size - self.entry_size) as u64),
- entry_size: self.entry_size,
- }
- }
- }
- #[derive(Debug)]
- #[repr(C)]
- pub struct MemoryArea {
- base_addr: u64,
- length: u64,
- typ: u32,
- _reserved: u32,
- }
- impl MemoryArea {
- pub fn start_address(&self) -> u64 {
- self.base_addr
- }
- pub fn end_address(&self) -> u64 {
- (self.base_addr + self.length)
- }
- pub fn size(&self) -> u64 {
- self.length
- }
- }
- #[derive(Clone, Debug)]
- pub struct MemoryAreaIter {
- current_area: u64,
- last_area: u64,
- entry_size: u32,
- }
- impl Iterator for MemoryAreaIter {
- type Item = &'static MemoryArea;
- fn next(&mut self) -> Option<&'static MemoryArea> {
- if self.current_area > self.last_area {
- None
- } else {
- let area = unsafe{&*(self.current_area as *const MemoryArea)};
- self.current_area = self.current_area + (self.entry_size as u64);
- if area.typ == 1 {
- Some(area)
- } else {self.next()}
- }
- }
- }
|