memory_map.rs 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. #[repr(C)]
  2. pub struct MemoryMapTag {
  3. typ: u32,
  4. size: u32,
  5. entry_size: u32,
  6. entry_version: u32,
  7. first_area: MemoryArea,
  8. }
  9. impl MemoryMapTag {
  10. pub fn memory_areas(&self) -> MemoryAreaIter {
  11. let self_ptr = self as *const MemoryMapTag;
  12. let start_area = (&self.first_area) as *const MemoryArea;
  13. MemoryAreaIter {
  14. current_area: start_area,
  15. last_area: ((self_ptr as u32) + self.size - self.entry_size) as *const MemoryArea,
  16. entry_size: self.entry_size,
  17. }
  18. }
  19. }
  20. #[repr(C)]
  21. pub struct MemoryArea {
  22. pub base_addr: u64,
  23. pub length: u64,
  24. typ: u32,
  25. _reserved: u32,
  26. }
  27. #[derive(Clone)]
  28. pub struct MemoryAreaIter {
  29. current_area: *const MemoryArea,
  30. last_area: *const MemoryArea,
  31. entry_size: u32,
  32. }
  33. impl Iterator for MemoryAreaIter {
  34. type Item = &'static MemoryArea;
  35. fn next(&mut self) -> Option<&'static MemoryArea> {
  36. if self.current_area > self.last_area {
  37. None
  38. } else {
  39. let area = unsafe{&*self.current_area};
  40. self.current_area = ((self.current_area as u32) + self.entry_size)
  41. as *const MemoryArea;
  42. if area.typ == 1 {
  43. Some(area)
  44. } else {self.next()}
  45. }
  46. }
  47. }