#include "memory/MemoryMap.h" extern const BOOTBOOT bootboot; static MemoryMapEntry memory_map_entry_from_mmapent(const MMapEnt* ent) { MemoryMapEntry result; result.ptr = MMapEnt_Ptr(ent); result.size = MMapEnt_Size(ent); result.free = MMapEnt_IsFree(ent); return result; } MemoryMapIterator::MemoryMapIterator() { m_mmap_entries = (bootboot.size - 128) / 16; m_base_ent = &bootboot.mmap; rewind(); } void MemoryMapIterator::rewind() { m_cur_ent = 0; } Result MemoryMapIterator::at(usize index) const { if (index >= m_mmap_entries) return err(ERANGE); return memory_map_entry_from_mmapent(m_base_ent + index); } Result MemoryMapIterator::next() { return at(m_cur_ent++); } MemoryMapEntry MemoryMapIterator::largest_free() { usize largest_size = 0; usize largest_index = 0; rewind(); MemoryMapEntry entry; while (next().try_set_value(entry)) { if (entry.free && entry.size > largest_size) { largest_size = entry.size; largest_index = m_cur_ent - 1; } } return at(largest_index).release_value(); } MemoryMapEntry MemoryMapIterator::highest() { usize highest_ptr = 0; usize highest_index = 0; rewind(); MemoryMapEntry entry; while (next().try_set_value(entry)) { if (entry.ptr > highest_ptr) { highest_ptr = entry.ptr; highest_index = m_cur_ent - 1; } } return at(highest_index).release_value(); }