//---------------------------------------------------------------------------// // 1100101 |_ mov #0, r4 __ // // 11 |_ <0xb380 %5c4> / _|_ _____ ___ // // 0110 |_ 3.50 -> 3.60 | _\ \ / _ (_-< // // |_ base# + offset |_| /_\_\___/__/ // //---------------------------------------------------------------------------// #include #include #include 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(*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 */