64 lines
1.4 KiB
C++
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 ®ion, 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 */
|