Skip to content

Commit 19fe070

Browse files
committed
adding test updates and new architecture mips3 to disassembly
1 parent f6c8b41 commit 19fe070

File tree

2 files changed

+45
-14
lines changed

2 files changed

+45
-14
lines changed

arch/mips/arch_mips.cpp

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

385390
public:
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
}

arch/mips/mips/test.c

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,27 @@ int main(int ac, char **av)
5858
uint64_t baseaddr = 0;
5959
int instindex = 0;
6060
int c = 0;
61+
int version = MIPS_32;
6162

62-
while ((c = getopt(ac, av, "a:")) != -1)
63+
while ((c = getopt(ac, av, "klmnoa:")) != -1)
6364
{
6465
switch (c)
6566
{
67+
case 'k':
68+
version = MIPS_64;
69+
break;
70+
case 'l':
71+
version = MIPS_1;
72+
break;
73+
case 'm':
74+
version = MIPS_2;
75+
break;
76+
case 'n':
77+
version = MIPS_3;
78+
break;
79+
case 'o':
80+
version = MIPS_4;
81+
break;
6682
case 'a':
6783
baseaddr = strtoull(optarg, NULL, 0x10);
6884
break;
@@ -82,9 +98,9 @@ int main(int ac, char **av)
8298

8399
if (ac == 2 && !strcmp(av[1], "test"))
84100
{
85-
disassemble(0x14E00003, 0, MIPS_32, instxt);
101+
disassemble(0x14E00003, 0, version, instxt);
86102
ASSERT(!strcmp(instxt, "bne\t$a3, $zero, 0x10"));
87-
disassemble(0x14E00003, 4, MIPS_32, instxt);
103+
disassemble(0x14E00003, 4, version, instxt);
88104
ASSERT(!strcmp(instxt, "bne\t$a3, $zero, 0x405a68"));
89105
exit(0);
90106
}
@@ -93,7 +109,7 @@ int main(int ac, char **av)
93109
{
94110
insword = strtoul(av[instindex], NULL, 16);
95111

96-
if (0 == disassemble(insword, baseaddr, MIPS_32, instxt))
112+
if (0 == disassemble(insword, baseaddr, version, instxt))
97113
{
98114
printf("%08llX: %08X %s\n", baseaddr, insword, instxt);
99115
}

0 commit comments

Comments
 (0)