summaryrefslogtreecommitdiff
path: root/arch/powerpc/arch_ppc.cpp
diff options
context:
space:
mode:
authorGalen Williamson <galen@vector35.com>2024-03-08 15:00:02 -0500
committerGalen Williamson <galen@vector35.com>2024-03-26 15:08:13 -0400
commit661f5c4cfb60f36a57b5d05ec7883af821abd046 (patch)
treed1f57e539f0d69a32c4b1ce657c341cae9fd88f6 /arch/powerpc/arch_ppc.cpp
parentcc22a52907a052f37dad319f843f218fe69e1b9a (diff)
added lifting for EXTSW LD LDU LDUX LDX SLD SRAD SRADI SRD STD STDU STDUX STDX
Diffstat (limited to 'arch/powerpc/arch_ppc.cpp')
-rw-r--r--arch/powerpc/arch_ppc.cpp16
1 files changed, 9 insertions, 7 deletions
diff --git a/arch/powerpc/arch_ppc.cpp b/arch/powerpc/arch_ppc.cpp
index 2f657b7a..e44564c4 100644
--- a/arch/powerpc/arch_ppc.cpp
+++ b/arch/powerpc/arch_ppc.cpp
@@ -281,6 +281,7 @@ class PowerpcArchitecture: public Architecture
{
private:
BNEndianness endian;
+ size_t addressSize;
/* this can maybe be moved to the API later */
BNRegisterInfo RegisterInfo(uint32_t fullWidthReg, size_t offset, size_t size, bool zeroExtend = false)
@@ -296,9 +297,10 @@ class PowerpcArchitecture: public Architecture
public:
/* initialization list */
- PowerpcArchitecture(const char* name, BNEndianness endian_): Architecture(name)
+ PowerpcArchitecture(const char* name, BNEndianness endian_, size_t addressSize_=4): Architecture(name)
{
endian = endian_;
+ addressSize = addressSize_;
}
/*************************************************************************/
@@ -312,7 +314,7 @@ class PowerpcArchitecture: public Architecture
virtual size_t GetAddressSize() const override
{
//MYLOG("%s()\n", __func__);
- return 4;
+ return addressSize;
}
virtual size_t GetDefaultIntegerSize() const override
@@ -360,7 +362,7 @@ class PowerpcArchitecture: public Architecture
}
/* decompose the instruction to get branch info */
- if(powerpc_decompose(data, 4, (uint32_t)addr, endian == LittleEndian, &res)) {
+ if(powerpc_decompose(data, 4, (uint32_t)addr, endian == LittleEndian, &res, GetAddressSize() == 8)) {
MYLOG("ERROR: powerpc_decompose()\n");
return false;
}
@@ -622,7 +624,7 @@ class PowerpcArchitecture: public Architecture
if (DoesQualifyForLocalDisassembly(data))
return PerformLocalDisassembly(data, addr, len, result);
- if(powerpc_decompose(data, 4, (uint32_t)addr, endian == LittleEndian, &res)) {
+ if(powerpc_decompose(data, 4, (uint32_t)addr, endian == LittleEndian, &res, GetAddressSize() == 8)) {
MYLOG("ERROR: powerpc_decompose()\n");
goto cleanup;
}
@@ -748,7 +750,7 @@ class PowerpcArchitecture: public Architecture
goto cleanup;
}
- if(powerpc_decompose(data, 4, (uint32_t)addr, endian == LittleEndian, &res)) {
+ if(powerpc_decompose(data, 4, (uint32_t)addr, endian == LittleEndian, &res, GetAddressSize() == 8)) {
MYLOG("ERROR: powerpc_decompose()\n");
il.AddInstruction(il.Undefined());
goto cleanup;
@@ -2471,13 +2473,13 @@ extern "C"
Architecture* ppc = new PowerpcArchitecture("ppc", BigEndian);
Architecture::Register(ppc);
- Architecture* ppc64 = new PowerpcArchitecture("ppc64", BigEndian);
+ Architecture* ppc64 = new PowerpcArchitecture("ppc64", BigEndian, 8);
Architecture::Register(ppc64);
Architecture* ppc_le = new PowerpcArchitecture("ppc_le", LittleEndian);
Architecture::Register(ppc_le);
- Architecture* ppc64_le = new PowerpcArchitecture("ppc64_le", LittleEndian);
+ Architecture* ppc64_le = new PowerpcArchitecture("ppc64_le", LittleEndian, 8);
Architecture::Register(ppc64_le);
/* calling conventions */