diff options
| author | Galen Williamson <galen@vector35.com> | 2024-03-08 15:00:02 -0500 |
|---|---|---|
| committer | Galen Williamson <galen@vector35.com> | 2024-03-26 15:08:13 -0400 |
| commit | 661f5c4cfb60f36a57b5d05ec7883af821abd046 (patch) | |
| tree | d1f57e539f0d69a32c4b1ce657c341cae9fd88f6 /arch/powerpc/arch_ppc.cpp | |
| parent | cc22a52907a052f37dad319f843f218fe69e1b9a (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.cpp | 16 |
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 */ |
