summaryrefslogtreecommitdiff
path: root/architecture.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'architecture.cpp')
-rw-r--r--architecture.cpp48
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());
}