fxos/lib/vspace.cpp

60 lines
1.7 KiB
C++

//---------------------------------------------------------------------------//
// 1100101 |_ mov #0, r4 __ //
// 11 |_ <0xb380 %5c4> / _|_ _____ ___ //
// 0110 |_ 3.50 -> 3.60 | _\ \ / _ (_-< //
// |_ base# + offset |_| /_\_\___/__/ //
//---------------------------------------------------------------------------//
#include <fxos/vspace.h>
#include <fxos/os.h>
#include <cstring>
namespace FxOS {
Binding::Binding(MemoryRegion source_region, Buffer const &source_buffer):
region {source_region}, buffer {source_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;
}
VirtualSpace::VirtualSpace():
mpu {}, bindings {}, cursor {0}, disasm {*this}, 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 */