diff options
Diffstat (limited to 'architecture.cpp')
| -rw-r--r-- | architecture.cpp | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/architecture.cpp b/architecture.cpp index 42323a6c..a3bd77fa 100644 --- a/architecture.cpp +++ b/architecture.cpp @@ -530,6 +530,19 @@ uint32_t* Architecture::GetGlobalRegistersCallback(void* ctxt, size_t* count) } +uint32_t* Architecture::GetSystemRegistersCallback(void* ctxt, size_t* count) +{ + Architecture* arch = (Architecture*)ctxt; + vector<uint32_t> regs = arch->GetSystemRegisters(); + *count = regs.size(); + + uint32_t* result = new uint32_t[regs.size()]; + for (size_t i = 0; i < regs.size(); i++) + result[i] = regs[i]; + return result; +} + + char* Architecture::GetRegisterStackNameCallback(void* ctxt, uint32_t regStack) { Architecture* arch = (Architecture*)ctxt; @@ -756,6 +769,7 @@ void Architecture::Register(Architecture* arch) callbacks.getStackPointerRegister = GetStackPointerRegisterCallback; callbacks.getLinkRegister = GetLinkRegisterCallback; callbacks.getGlobalRegisters = GetGlobalRegistersCallback; + callbacks.getSystemRegisters = GetSystemRegistersCallback; callbacks.getRegisterStackName = GetRegisterStackNameCallback; callbacks.getAllRegisterStacks = GetAllRegisterStacksCallback; callbacks.getRegisterStackInfo = GetRegisterStackInfoCallback; @@ -1035,12 +1049,24 @@ vector<uint32_t> Architecture::GetGlobalRegisters() } +vector<uint32_t> Architecture::GetSystemRegisters() +{ + return vector<uint32_t>(); +} + + bool Architecture::IsGlobalRegister(uint32_t reg) { return BNIsArchitectureGlobalRegister(m_object, reg); } +bool Architecture::IsSystemRegister(uint32_t reg) +{ + return BNIsArchitectureSystemRegister(m_object, reg); +} + + string Architecture::GetRegisterStackName(uint32_t regStack) { char regStr[32]; @@ -1647,6 +1673,21 @@ vector<uint32_t> CoreArchitecture::GetGlobalRegisters() } +vector<uint32_t> CoreArchitecture::GetSystemRegisters() +{ + size_t count; + uint32_t* regs = BNGetArchitectureSystemRegisters(m_object, &count); + + vector<uint32_t> result; + result.reserve(count); + for (size_t i = 0; i < count; i++) + result.push_back(regs[i]); + + BNFreeRegisterList(regs); + return result; +} + + string CoreArchitecture::GetRegisterStackName(uint32_t regStack) { char* name = BNGetArchitectureRegisterStackName(m_object, regStack); @@ -2020,6 +2061,12 @@ vector<uint32_t> ArchitectureExtension::GetGlobalRegisters() } +vector<uint32_t> ArchitectureExtension::GetSystemRegisters() +{ + return m_base->GetSystemRegisters(); +} + + string ArchitectureExtension::GetRegisterStackName(uint32_t regStack) { return m_base->GetRegisterStackName(regStack); @@ -2156,6 +2203,7 @@ void ArchitectureHook::Register(BNCustomArchitecture* callbacks) { AddRefForRegistration(); m_object = BNRegisterArchitectureHook(m_base->GetObject(), callbacks); + BNFinalizeArchitectureHook(m_base->GetObject()); } |
