75 lines
1.5 KiB
C++
75 lines
1.5 KiB
C++
|
#include "memory/MemoryMap.h"
|
||
|
|
||
|
extern BOOTBOOT bootboot;
|
||
|
|
||
|
static MemoryMapEntry memory_map_entry_from_mmapent(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<MemoryMapEntry> MemoryMapIterator::at(usize index)
|
||
|
{
|
||
|
if (index >= m_mmap_entries) return err(ERANGE);
|
||
|
return memory_map_entry_from_mmapent(m_base_ent + index);
|
||
|
}
|
||
|
|
||
|
Result<MemoryMapEntry> 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();
|
||
|
}
|