memory_map.rs 1.5 KB

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