@@ -182,19 +182,24 @@ class MipsArchitecture: public Architecture
182182 size_t m_bits;
183183 BNEndianness m_endian;
184184 uint32_t m_enablePseudoOps;
185+ MipsVersion version_overwrite;
185186
186187 virtual bool Disassemble (const uint8_t * data, uint64_t addr, size_t maxLen, Instruction& result)
187188 {
189+ MipsVersion version = version_overwrite;
190+
188191 memset (&result, 0 , sizeof (result));
189- if (mips_decompose ((uint32_t *)data, maxLen, &result, m_bits == 64 ? MIPS_64 : MIPS_32, addr, m_endian, m_enablePseudoOps) != 0 )
192+ if (m_bits == 64 )
193+ {
194+ version = MIPS_64;
195+ }
196+
197+ if (mips_decompose ((uint32_t *)data, maxLen, &result, version, addr, m_endian, m_enablePseudoOps) != 0 )
190198 return false ;
191199 return true ;
192200 }
193201
194- virtual size_t GetAddressSize () const override
195- {
196- return m_bits / 8 ;
197- }
202+ virtual size_t GetAddressSize () const override { return m_bits / 8 ; }
198203
199204 size_t InstructionHasBranchDelay (const Instruction& instr)
200205 {
@@ -383,7 +388,8 @@ class MipsArchitecture: public Architecture
383388 }
384389
385390public:
386- MipsArchitecture (const std::string& name, BNEndianness endian, size_t bits): Architecture(name), m_bits(bits), m_endian(endian)
391+ MipsArchitecture (const std::string& name, BNEndianness endian, size_t bits, MipsVersion version_in):
392+ Architecture (name), m_bits(bits), m_endian(endian), version_overwrite(version_in)
387393 {
388394 Ref<Settings> settings = Settings::Instance ();
389395 m_enablePseudoOps = settings->Get <bool >(" arch.mips.disassembly.pseudoOps" ) ? 1 : 0 ;
@@ -2228,12 +2234,14 @@ extern "C"
22282234 {
22292235 InitMipsSettings ();
22302236
2231- Architecture* mipsel = new MipsArchitecture (" mipsel32" , LittleEndian, 32 );
2232- Architecture* mipseb = new MipsArchitecture (" mips32" , BigEndian, 32 );
2233- Architecture* mips64eb = new MipsArchitecture (" mips64" , BigEndian, 64 );
2237+ Architecture* mipsel = new MipsArchitecture (" mipsel32" , LittleEndian, 32 , MIPS_32);
2238+ Architecture* mipseb = new MipsArchitecture (" mips32" , BigEndian, 32 , MIPS_32);
2239+ Architecture* mips3 = new MipsArchitecture (" mips3" , BigEndian, 32 , MIPS_3);
2240+ Architecture* mips64eb = new MipsArchitecture (" mips64" , BigEndian, 64 , MIPS_64);
22342241
22352242 Architecture::Register (mipsel);
22362243 Architecture::Register (mipseb);
2244+ Architecture::Register (mips3);
22372245 Architecture::Register (mips64eb);
22382246
22392247 /* calling conventions */
@@ -2242,27 +2250,33 @@ extern "C"
22422250 MipsN64CallingConvention* n64BE = new MipsN64CallingConvention (mips64eb);
22432251
22442252 mipsel->RegisterCallingConvention (o32LE);
2245- mipseb->RegisterCallingConvention (o32BE);
22462253 mipsel->SetDefaultCallingConvention (o32LE);
2254+ mipseb->RegisterCallingConvention (o32BE);
22472255 mipseb->SetDefaultCallingConvention (o32BE);
2256+ mips3->RegisterCallingConvention (o32BE);
2257+ mips3->SetDefaultCallingConvention (o32BE);
22482258 mips64eb->RegisterCallingConvention (n64BE);
22492259 mips64eb->SetDefaultCallingConvention (n64BE);
22502260
22512261 MipsLinuxSyscallCallingConvention* linuxSyscallLE = new MipsLinuxSyscallCallingConvention (mipsel);
22522262 MipsLinuxSyscallCallingConvention* linuxSyscallBE = new MipsLinuxSyscallCallingConvention (mipseb);
22532263 mipsel->RegisterCallingConvention (linuxSyscallLE);
22542264 mipseb->RegisterCallingConvention (linuxSyscallBE);
2265+ mips3->RegisterCallingConvention (linuxSyscallBE);
22552266
22562267 mipsel->RegisterCallingConvention (new MipsLinuxRtlResolveCallingConvention (mipsel));
22572268 mipseb->RegisterCallingConvention (new MipsLinuxRtlResolveCallingConvention (mipseb));
2269+ mips3->RegisterCallingConvention (new MipsLinuxRtlResolveCallingConvention (mips3));
22582270 mips64eb->RegisterCallingConvention (new MipsLinuxRtlResolveCallingConvention (mips64eb));
22592271
22602272 /* function recognizers */
22612273 mipsel->RegisterFunctionRecognizer (new MipsImportedFunctionRecognizer ());
22622274 mipseb->RegisterFunctionRecognizer (new MipsImportedFunctionRecognizer ());
2275+ mips3->RegisterFunctionRecognizer (new MipsImportedFunctionRecognizer ());
22632276
22642277 mipsel->RegisterRelocationHandler (" ELF" , new MipsElfRelocationHandler ());
22652278 mipseb->RegisterRelocationHandler (" ELF" , new MipsElfRelocationHandler ());
2279+ mips3->RegisterRelocationHandler (" ELF" , new MipsElfRelocationHandler ());
22662280 mips64eb->RegisterRelocationHandler (" ELF" , new MipsElfRelocationHandler ());
22672281
22682282 // Register the architectures with the binary format parsers so that they know when to use
@@ -2278,6 +2292,7 @@ extern "C"
22782292 BinaryViewType::RegisterArchitecture (" ELF" , ARCH_ID_MIPS64, BigEndian, mips64eb);
22792293 BinaryViewType::RegisterArchitecture (" ELF" , ARCH_ID_MIPS32, LittleEndian, mipsel);
22802294 BinaryViewType::RegisterArchitecture (" ELF" , ARCH_ID_MIPS32, BigEndian, mipseb);
2295+ BinaryViewType::RegisterArchitecture (" ELF" , ARCH_ID_MIPS32, BigEndian, mips3);
22812296 BinaryViewType::RegisterArchitecture (" PE" , 0x166 , LittleEndian, mipsel);
22822297 return true ;
22832298 }
0 commit comments