@@ -181,20 +181,25 @@ class MipsArchitecture: public Architecture
181181protected:
182182 size_t m_bits;
183183 BNEndianness m_endian;
184+ MipsVersion version_overwrite;
184185 uint32_t m_decomposeFlags;
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_decomposeFlags) != 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_decomposeFlags) != 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 {
@@ -402,8 +407,8 @@ class MipsArchitecture: public Architecture
402407 }
403408
404409public:
405- MipsArchitecture (const std::string& name, BNEndianness endian, size_t bits, uint32_t decomposeFlags = 0 )
406- : Architecture(name), m_bits(bits), m_endian(endian), m_decomposeFlags(decomposeFlags)
410+ MipsArchitecture (const std::string& name, BNEndianness endian, size_t bits, MipsVersion version_in, uint32_t decomposeFlags = 0 )
411+ : Architecture(name), m_bits(bits), m_endian(endian), version_overwrite(version_in), m_decomposeFlags(decomposeFlags)
407412 {
408413 Ref<Settings> settings = Settings::Instance ();
409414 uint32_t flag_pseudo_ops = settings->Get <bool >(" arch.mips.disassembly.pseudoOps" ) ? DECOMPOSE_FLAGS_PSEUDO_OP : 0 ;
@@ -3258,14 +3263,18 @@ extern "C"
32583263 {
32593264 InitMipsSettings ();
32603265
3261- Architecture* mipsel = new MipsArchitecture (" mipsel32" , LittleEndian, 32 );
3262- Architecture* mipseb = new MipsArchitecture (" mips32" , BigEndian, 32 );
3263- Architecture* mips64el = new MipsArchitecture (" mipsel64" , LittleEndian, 64 );
3264- Architecture* mips64eb = new MipsArchitecture (" mips64" , BigEndian, 64 );
3265- Architecture* cnmips64eb = new MipsArchitecture (" cavium-mips64" , BigEndian, 64 , DECOMPOSE_FLAGS_CAVIUM);
3266+ Architecture* mipseb = new MipsArchitecture (" mips32" , BigEndian, 32 , MIPS_32);
3267+ Architecture* mipsel = new MipsArchitecture (" mipsel32" , LittleEndian, 32 , MIPS_32);
3268+ Architecture* mips3 = new MipsArchitecture (" mips3" , BigEndian, 32 , MIPS_3);
3269+ Architecture* mips3el = new MipsArchitecture (" mipsel3" , LittleEndian, 32 , MIPS_3);
3270+ Architecture* mips64el = new MipsArchitecture (" mipsel64" , LittleEndian, 64 , MIPS_64);
3271+ Architecture* mips64eb = new MipsArchitecture (" mips64" , BigEndian, 64 , MIPS_64);
3272+ Architecture* cnmips64eb = new MipsArchitecture (" cavium-mips64" , BigEndian, 64 , MIPS_64, DECOMPOSE_FLAGS_CAVIUM);
32663273
3267- Architecture::Register (mipsel);
32683274 Architecture::Register (mipseb);
3275+ Architecture::Register (mipsel);
3276+ Architecture::Register (mips3);
3277+ Architecture::Register (mips3el);
32693278 Architecture::Register (mips64el);
32703279 Architecture::Register (mips64eb);
32713280 Architecture::Register (cnmips64eb);
@@ -3277,10 +3286,14 @@ extern "C"
32773286 MipsN64CallingConvention* n64BE = new MipsN64CallingConvention (mips64eb);
32783287 MipsN64CallingConvention* n64BEc = new MipsN64CallingConvention (cnmips64eb);
32793288
3280- mipsel->RegisterCallingConvention (o32LE);
32813289 mipseb->RegisterCallingConvention (o32BE);
3282- mipsel->SetDefaultCallingConvention (o32LE);
32833290 mipseb->SetDefaultCallingConvention (o32BE);
3291+ mipsel->RegisterCallingConvention (o32LE);
3292+ mipsel->SetDefaultCallingConvention (o32LE);
3293+ mips3->RegisterCallingConvention (o32BE);
3294+ mips3->SetDefaultCallingConvention (o32BE);
3295+ mips3->RegisterCallingConvention (o32LE);
3296+ mips3->SetDefaultCallingConvention (o32LE);
32843297 mips64el->RegisterCallingConvention (n64LE);
32853298 mips64el->SetDefaultCallingConvention (n64LE);
32863299 mips64eb->RegisterCallingConvention (n64BE);
@@ -3290,21 +3303,29 @@ extern "C"
32903303
32913304 MipsLinuxSyscallCallingConvention* linuxSyscallLE = new MipsLinuxSyscallCallingConvention (mipsel);
32923305 MipsLinuxSyscallCallingConvention* linuxSyscallBE = new MipsLinuxSyscallCallingConvention (mipseb);
3293- mipsel->RegisterCallingConvention (linuxSyscallLE);
32943306 mipseb->RegisterCallingConvention (linuxSyscallBE);
3307+ mipsel->RegisterCallingConvention (linuxSyscallLE);
3308+ mips3->RegisterCallingConvention (linuxSyscallBE);
3309+ mips3el->RegisterCallingConvention (linuxSyscallLE);
32953310
3296- mipsel->RegisterCallingConvention (new MipsLinuxRtlResolveCallingConvention (mipsel));
32973311 mipseb->RegisterCallingConvention (new MipsLinuxRtlResolveCallingConvention (mipseb));
3312+ mipsel->RegisterCallingConvention (new MipsLinuxRtlResolveCallingConvention (mipsel));
3313+ mips3->RegisterCallingConvention (new MipsLinuxRtlResolveCallingConvention (mips3));
3314+ mips3el->RegisterCallingConvention (new MipsLinuxRtlResolveCallingConvention (mips3el));
32983315 mips64el->RegisterCallingConvention (new MipsLinuxRtlResolveCallingConvention (mips64el));
32993316 mips64eb->RegisterCallingConvention (new MipsLinuxRtlResolveCallingConvention (mips64eb));
33003317 cnmips64eb->RegisterCallingConvention (new MipsLinuxRtlResolveCallingConvention (cnmips64eb));
33013318
33023319 /* function recognizers */
3303- mipsel->RegisterFunctionRecognizer (new MipsImportedFunctionRecognizer ());
33043320 mipseb->RegisterFunctionRecognizer (new MipsImportedFunctionRecognizer ());
3321+ mipsel->RegisterFunctionRecognizer (new MipsImportedFunctionRecognizer ());
3322+ mips3->RegisterFunctionRecognizer (new MipsImportedFunctionRecognizer ());
3323+ mips3el->RegisterFunctionRecognizer (new MipsImportedFunctionRecognizer ());
33053324
3306- mipsel->RegisterRelocationHandler (" ELF" , new MipsElfRelocationHandler ());
33073325 mipseb->RegisterRelocationHandler (" ELF" , new MipsElfRelocationHandler ());
3326+ mipsel->RegisterRelocationHandler (" ELF" , new MipsElfRelocationHandler ());
3327+ mips3->RegisterRelocationHandler (" ELF" , new MipsElfRelocationHandler ());
3328+ mips3el->RegisterRelocationHandler (" ELF" , new MipsElfRelocationHandler ());
33083329 mips64el->RegisterRelocationHandler (" ELF" , new MipsElfRelocationHandler ());
33093330 mips64eb->RegisterRelocationHandler (" ELF" , new MipsElfRelocationHandler ());
33103331 cnmips64eb->RegisterRelocationHandler (" ELF" , new MipsElfRelocationHandler ());
0 commit comments