diff options
| author | Rusty Wagner <rusty@vector35.com> | 2020-04-28 17:13:54 -0400 |
|---|---|---|
| committer | Rusty Wagner <rusty@vector35.com> | 2020-04-28 17:17:46 -0400 |
| commit | ce385dc73e2d264fc2404c75b060a8a42486e27b (patch) | |
| tree | d5e4650935f414799a6b61f9cd22f047b7d0cfee /architecture.cpp | |
| parent | e2c1b6123769e9eb185ddb23c2f7131ed6e593e8 (diff) | |
Add system register list to architectures.
Global registers are commonly used for module data pointers in
architectures, which are global in nature but should still be eliminated
in high level ILs once the data pointers have been resolved. This means
there needs to be an additional type of global register for those that
should never be eliminated in any way, such as an MSR register or other
registers that contain important system state with side effects. To
allow for this, a list of system registers can be supplied by the
archtiecture.
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()); } |
