fxos/lib/vspace.cpp

64 lines
1.4 KiB
C++

#include <fxos/vspace.h>
#include <fxos/os.h>
#include <cstring>
namespace FxOS {
//---
// Bindings of data buffers into memory regions
//---
Binding::Binding(MemoryRegion source_region, Buffer source_buffer):
region {source_region}, buffer {source_buffer}
{
/* Extend the buffer if it's not at least as large as the region */
if(buffer.size < region.size())
buffer = Buffer(buffer, region.size());
}
char const *Binding::translate_dynamic(uint32_t addr, int *size)
{
if(addr >= region.start && addr < region.end) {
*size = region.end - addr;
return buffer.data.get() + (addr - region.start);
}
return nullptr;
}
//---
// Composite memory targets
//---
VirtualSpace::VirtualSpace():
mpu {}, bindings {}, m_os {nullptr}
{
}
OS *VirtualSpace::os_analysis(bool force)
{
if(!m_os || force) {
m_os = std::make_unique<OS>(*this);
/* We don't keep an OS analysis result that failed */
if(m_os->type == OS::UNKNOWN)
m_os = nullptr;
}
return m_os.get();
}
void VirtualSpace::bind_region(MemoryRegion const &region, Buffer const &buf)
{
this->bindings.emplace(this->bindings.begin(), region, buf);
}
char const *VirtualSpace::translate_dynamic(uint32_t addr, int *size)
{
for(auto &b: this->bindings) {
char const *ptr = b.translate_dynamic(addr, size);
if(ptr)
return ptr;
}
return nullptr;
}
} /* namespace FxOS */