Luna/kernel/src/memory/MemoryMap.cpp

75 lines
1.5 KiB
C++
Raw Normal View History

#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();
}