summaryrefslogtreecommitdiff
path: root/architecture.cpp
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2016-07-15 21:15:37 -0400
committerRusty Wagner <rusty@vector35.com>2016-07-15 21:15:37 -0400
commit2c2f521aa188d4f8027c5db8dfaf88f670d8a63f (patch)
treef736704102bc0f1f779a7ab34714baf465a66042 /architecture.cpp
parent8fcc840c79174728ef96afa0ff37713e74311d51 (diff)
Add API for instruction length and option for showing opcodes in disassembly
Diffstat (limited to 'architecture.cpp')
-rw-r--r--architecture.cpp43
1 files changed, 43 insertions, 0 deletions
diff --git a/architecture.cpp b/architecture.cpp
index accfa69f..d068ff36 100644
--- a/architecture.cpp
+++ b/architecture.cpp
@@ -97,6 +97,20 @@ size_t Architecture::GetDefaultIntegerSizeCallback(void* ctxt)
}
+size_t Architecture::GetMaxInstructionLengthCallback(void* ctxt)
+{
+ Architecture* arch = (Architecture*)ctxt;
+ return arch->GetMaxInstructionLength();
+}
+
+
+size_t Architecture::GetOpcodeDisplayLengthCallback(void* ctxt)
+{
+ Architecture* arch = (Architecture*)ctxt;
+ return arch->GetOpcodeDisplayLength();
+}
+
+
bool Architecture::GetInstructionInfoCallback(void* ctxt, const uint8_t* data, uint64_t addr,
size_t maxLen, BNInstructionInfo* result)
{
@@ -390,6 +404,8 @@ void Architecture::Register(Architecture* arch)
callbacks.getEndianness = GetEndiannessCallback;
callbacks.getAddressSize = GetAddressSizeCallback;
callbacks.getDefaultIntegerSize = GetDefaultIntegerSizeCallback;
+ callbacks.getMaxInstructionLength = GetMaxInstructionLengthCallback;
+ callbacks.getOpcodeDisplayLength = GetOpcodeDisplayLengthCallback;
callbacks.getInstructionInfo = GetInstructionInfoCallback;
callbacks.getInstructionText = GetInstructionTextCallback;
callbacks.freeInstructionText = FreeInstructionTextCallback;
@@ -466,6 +482,21 @@ size_t Architecture::GetDefaultIntegerSize() const
}
+size_t Architecture::GetMaxInstructionLength() const
+{
+ return BN_DEFAULT_NSTRUCTION_LENGTH;
+}
+
+
+size_t Architecture::GetOpcodeDisplayLength() const
+{
+ size_t maxLen = GetMaxInstructionLength();
+ if (maxLen < BN_DEFAULT_OPCODE_DISPLAY)
+ return maxLen;
+ return BN_DEFAULT_OPCODE_DISPLAY;
+}
+
+
bool Architecture::GetInstructionLowLevelIL(const uint8_t*, uint64_t, size_t&, LowLevelILFunction& il)
{
il.AddInstruction(il.Undefined());
@@ -874,6 +905,18 @@ size_t CoreArchitecture::GetDefaultIntegerSize() const
}
+size_t CoreArchitecture::GetMaxInstructionLength() const
+{
+ return BNGetArchitectureMaxInstructionLength(m_object);
+}
+
+
+size_t CoreArchitecture::GetOpcodeDisplayLength() const
+{
+ return BNGetArchitectureOpcodeDisplayLength(m_object);
+}
+
+
bool CoreArchitecture::GetInstructionInfo(const uint8_t* data, uint64_t addr, size_t maxLen, InstructionInfo& result)
{
return BNGetInstructionInfo(m_object, data, addr, maxLen, &result);