rizin/test/db/analysis/mips
2023-06-05 22:41:20 +08:00

908 lines
23 KiB
Text

NAME=mips hello reference analysis
FILE=bins/elf/analysis/mips-hello
CMDS=<<EOF
s sym.main
aac
afl~?
EOF
EXPECT=<<EOF
1
EOF
RUN
NAME=mozi aae functions
FILE=bins/elf/mips-mozi
CMDS=<<EOF
aae
aflc
EOF
EXPECT=<<EOF
436
EOF
RUN
NAME=mips hello ref anal
FILE=bins/elf/analysis/mips.elf
ARGS=-e bin.strings=false -e analysis.strings=true
CMDS=<<EOF
e asm.bytes=true
s entry0
aae
s 0x0041ed50
pd 5~IGNORE
EOF
EXPECT=<<EOF
0x0041ed58 24a54268 addiu a1, a1, 0x4268 ; 0x474268 ; "IGNORE" ; str.IGNORE
EOF
RUN
NAME=mips hello ref analysis subtract
FILE=bins/elf/analysis/busybox-mips
ARGS=-e bin.strings=false -e analysis.strings=true
CMDS=<<EOF
e analysis.resolve.pointers=false
e asm.bytes=true
aae @ entry0
pd 1 @ 0x00406228
fs strings
axt @ str.busybox
EOF
EXPECT=<<EOF
0x00406228 fcc38424 addiu a0, a0, -0x3c04 ; 0x44c3fc ; "busybox" ; str.busybox
(nofunc); str.busybox 0x406228 [DATA] addiu a0, a0, -str.busybox
EOF
RUN
NAME=Calculate GP
FILE=bins/elf/analysis/mips64r2-ld-2.28.so
CMDS=<<EOF
s 0x000023f0
e asm.bytes=true
pd 1
s 0x00002494
pd 1
EOF
EXPECT=<<EOF
0x000023f0 208084df ld a0, -0x7fe0(gp) ; [0x37020:8]=0x10a0 segment.DYNAMIC
0x00002494 488099df ld t9, -0x7fb8(gp) ; [0x37048:8]=0x134f0
EOF
RUN
NAME=mips ld(load doubleword) instruction
FILE=bins/elf/analysis/mips64r2-busybox-loongson
CMDS=<<EOF
s 0x120004460
e asm.bytes=true
f-*
fs-*
pd 1
EOF
EXPECT=<<EOF
0x120004460 208084df ld a0, -0x7fe0(gp) ; [0x1200ee290:8]=0x120005074
EOF
RUN
NAME=gp-based ref
FILE=bins/elf/analysis/mips-hello
CMDS=<<EOF
aae @ entry0
axt @ str.Hello_World
EOF
EXPECT=<<EOF
(nofunc); str.Hello_World 0x805c4 [DATA] addiu a0, v0, str.Hello_World
EOF
RUN
NAME=assembler
FILE==
CMDS=<<EOF
e asm.arch=mips.gnu
e asm.bits=32
e cfg.bigendian=0
pa lui t9, 0x41
e cfg.bigendian=1
pa lui t9, 0x41
e cfg.bigendian=0
pad 4100193c
e cfg.bigendian=1
pad 3c190041
EOF
EXPECT=<<EOF
4100193c
3c190041
lui t9, 0x41
lui t9, 0x41
EOF
RUN
NAME=with-spaces
FILE==
CMDS=<<EOF
e asm.arch=mips.gnu
e asm.bits=32
e cfg.bigendian=0
pa addiu v0, v1, 33
pa addiu v0 v1 33
e cfg.bigendian=1
pa addiu v0, v1, 33
pa addiu v0 v1 33
EOF
EXPECT=<<EOF
21006224
21006224
24620021
24620021
EOF
RUN
NAME=mips hello pseudo move instruction
FILE=bins/elf/analysis/mips-hello
ARGS=-e bin.strings=false -e analysis.strings=false
CMDS=<<EOF
e asm.bytes=true
pd 1 @ main+0x18
e asm.pseudo=true
pd 1 @ main+0x18
EOF
EXPECT=<<EOF
0x000805b8 21f0a003 move fp, sp
0x000805b8 21f0a003 fp = sp
EOF
RUN
NAME=mips pseudo sw + 0
FILE=malloc://32
ARGS=-a mips -m 0x80100000
CMDS=<<EOF
e io.va=true
e asm.bytes=true
wx 0000beaf
pd 1
e asm.pseudo=true
pd 1
EOF
EXPECT=<<EOF
0x80100000 0000beaf sw fp, (sp)
0x80100000 0000beaf word [sp] = fp
EOF
RUN
NAME=mips LE anal
FILE=malloc://32
CMDS=<<EOF
wx 01001104
e asm.arch=mips
e asm.bits=32
e asm.nbytes=4
ao 1~type:[1]
EOF
EXPECT=<<EOF
call
EOF
RUN
NAME=mips LE back reference
FILE=malloc://32
ARGS=-m 0x80100000
CMDS=<<EOF
e io.va=true
wx 0000000000000000010000100000000000000000
e asm.bits=32
e asm.arch=mips
e asm.nbytes=4
af+ fcn.test @ 0x80100000
afb+ 0x80100000 0x80100000 20
pif
EOF
EXPECT=<<EOF
nop
nop
b 0x80100010
nop
nop
EOF
RUN
NAME=mips LE correct relative jump reference if not mapped from command line.
FILE=malloc://40
CMDS=<<EOF
e asm.calls=false
e asm.bits=32
e asm.bytes=true
e asm.arch=mips
e analysis.jmp.eob=true
e analysis.nopskip=false
e asm.cmtcol=0
e asm.comments=false
e asm.lines.bb=0
e asm.lines.fcn=0
e asm.nbytes=4
wx 0800040c000000000000000000000000000000000000000040040408000000000800e00300000000
aa 2> /dev/null
pdf
EOF
EXPECT=<<EOF
fcn.00000000();
0x00000000 0800040c jal 0x100020
0x00000004 00000000 nop
0x00000008 00000000 nop
0x0000000c 00000000 nop
0x00000010 00000000 nop
0x00000014 00000000 nop
0x00000018 40040408 j 0x101100
0x0000001c 00000000 nop
EOF
RUN
NAME=mips LE correct relative jump reference if mapped from command line.
FILE=malloc://40
ARGS=-m 0x80100000
CMDS=<<EOF
e io.va=true
e asm.calls=false
e asm.bytes=true
e asm.bits=32
e asm.arch=mips
e analysis.jmp.eob=false
e asm.lines.bb=0
e asm.lines.fcn=false
e asm.nbytes=4
wx 0800040c000000000000000000000000000000000000000040040408000000000800e00300000000
af 2> /dev/null
pd 10
afl
EOF
EXPECT=<<EOF
fcn.80100000();
0x80100000 0800040c jal fcn.80100020
0x80100004 00000000 nop
0x80100008 00000000 nop
0x8010000c 00000000 nop
0x80100010 00000000 nop
0x80100014 00000000 nop
0x80100018 40040408 j 0x80101100
0x8010001c 00000000 nop
; CALL XREF from fcn.80100000 @ 0x80100000
fcn.80100020();
0x80100020 0800e003 jr ra
0x80100024 00000000 nop
0x80100000 1 32 fcn.80100000
0x80100020 1 8 fcn.80100020
EOF
RUN
NAME=mips branch delay function sizing.
FILE=malloc://20
ARGS=-m 0x80100000
CMDS=<<EOF
e io.va=true
e asm.calls=false
e asm.bytes=true
e asm.bits=32
e asm.arch=mips
e asm.nbytes=4
e asm.lines.bb=false
e asm.lines.fcn=false
s 0x80100000
wx 0800e0030a1844000000000000000000000000
af 2>/dev/null
pdf
EOF
EXPECT=<<EOF
fcn.80100000();
0x80100000 0800e003 jr ra
0x80100004 0a184400 movz v1, v0, a0
EOF
RUN
NAME=mips branch delay function sizing.
FILE=malloc://20
CMDS=<<EOF
e asm.calls=false
e asm.bits=32
e asm.bytes=true
e asm.arch=mips
e asm.nbytes=4
e asm.lines.fcn=false
wx 0800e0030a1844000000000000000000000000
af 2> /dev/null
pdf
EOF
EXPECT=<<EOF
fcn.00000000();
0x00000000 0800e003 jr ra
0x00000004 0a184400 movz v1, v0, a0
EOF
RUN
NAME=mips branch delay function sizing with conditional jump loop.
FILE=malloc://40
ARGS=-m 0x80100000
CMDS=<<EOF
e io.va=true
e asm.calls=false
e asm.bits=32
e asm.bytes=true
e asm.arch=mips
e analysis.jmp.eob=false
e asm.comments=false
e asm.nbytes=4
e asm.lines.bb=false
e asm.lines.fcn=false
s 0x80100000
wx e0ffbd27000000000100001000000000fdff09150a1844000800e0032000bd270000000000000000000000
af 2> /dev/null
pdf
EOF
EXPECT=<<EOF
fcn.80100000();
0x80100000 e0ffbd27 addiu sp, sp, -0x20
0x80100004 00000000 nop
0x80100008 01000010 b 0x80100010
0x8010000c 00000000 nop
0x80100010 fdff0915 bne t0, t1, 0x80100008
0x80100014 0a184400 movz v1, v0, a0
0x80100018 0800e003 jr ra
0x8010001c 2000bd27 addiu sp, sp, 0x20
EOF
RUN
NAME=mips branch delay function sizing with conditional jump forward.
FILE=malloc://40
ARGS=-m 0x80100000
CMDS=<<EOF
e io.va=true
e asm.calls=false
e asm.bytes=true
e asm.bits=32
e asm.arch=mips
e asm.comments=false
e analysis.jmp.eob=false
e analysis.nopskip=false
e asm.nbytes=4
e asm.lines.bb=false
e asm.lines.fcn=false
s 0x80100000
wx e0ffbd27000000000100001000000000000000000a1844000800e003 2000bd270000000000000000000000
af 2> /dev/null
pdf
EOF
EXPECT=<<EOF
fcn.80100000();
0x80100000 e0ffbd27 addiu sp, sp, -0x20
0x80100004 00000000 nop
0x80100008 01000010 b 0x80100010
0x8010000c 00000000 nop
0x80100010 00000000 nop
0x80100014 0a184400 movz v1, v0, a0
0x80100018 0800e003 jr ra
0x8010001c 2000bd27 addiu sp, sp, 0x20
EOF
RUN
NAME=mips branch delay function sizing with conditional jump back.
FILE=malloc://40
ARGS=-m 0x80100000
CMDS=<<EOF
e io.va=true
e asm.calls=false
e asm.arch=mips
e asm.bits=32
e asm.comments=false
e asm.bytes=true
e analysis.jmp.eob=false
e analysis.nopskip=false
e asm.nbytes=4
e asm.lines.bb=false
e asm.lines.fcn=false
wx e0ffbd27000000000000000000000000fdff09150a1844000800e0032000bd270000000000000000000000
af 2> /dev/null
pdf
EOF
EXPECT=<<EOF
fcn.80100000();
0x80100000 e0ffbd27 addiu sp, sp, -0x20
0x80100004 00000000 nop
0x80100008 00000000 nop
0x8010000c 00000000 nop
0x80100010 fdff0915 bne t0, t1, 0x80100008
0x80100014 0a184400 movz v1, v0, a0
0x80100018 0800e003 jr ra
0x8010001c 2000bd27 addiu sp, sp, 0x20
EOF
RUN
NAME=mips branch delay function sizing with conditional jump back then forward.
FILE=malloc://56
ARGS=-m 0x80100000
CMDS=<<EOF
e io.va=true
e asm.bytes=true
e asm.calls=false
e asm.arch=mips
e asm.bits=32
e asm.comments=false
e analysis.jmp.eob=false
e analysis.nopskip=false
e asm.nbytes=4
e asm.lines.bb=false
e asm.lines.fcn=false
wx e0ffbd27000000000000000000000000fdff09150000000001000010000000000a1844000800e0032000bd270000000000000000000000
af 2> /dev/null
pdf
EOF
EXPECT=<<EOF
fcn.80100000();
0x80100000 e0ffbd27 addiu sp, sp, -0x20
0x80100004 00000000 nop
0x80100008 00000000 nop
0x8010000c 00000000 nop
0x80100010 fdff0915 bne t0, t1, 0x80100008
0x80100014 00000000 nop
0x80100018 01000010 b 0x80100020
0x8010001c 00000000 nop
0x80100020 0a184400 movz v1, v0, a0
0x80100024 0800e003 jr ra
0x80100028 2000bd27 addiu sp, sp, 0x20
EOF
RUN
NAME=mips branch delay function detection #1.
FILE=malloc://160
ARGS=-m 0x8060b4f8
CMDS=<<EOF
e io.va=true
e asm.calls=false
e asm.bytes=true
e asm.bits=32
e asm.arch=mips
e asm.comments=0
e analysis.hasnext=1
e analysis.jmp.eob=0
e analysis.nopskip=1
e asm.nbytes=4
e asm.lines.bb=false
e asm.lines.fcn=false
s 0x8060b4f8
wx 0000000000000000002e0500032e05000f00801021100000492d1808000082900800e003211080000000829007004010000000000016020003160200f8ff451000000000482d180801008424211000000800e003000000000000a290050040100100a524000082a00000a290552d1808010084240800e003000080a000000000e0ffbd27542d180c000000000800e0032000bd270000000000000000
aa 2> /dev/null
pd 38
EOF
EXPECT=<<EOF
0x8060b4f8 00000000 nop
0x8060b4fc 00000000 nop
fcn.8060b500(int32_t arg1, int32_t arg2);
; arg int32_t arg1 @ a0
; arg int32_t arg2 @ a1
0x8060b500 002e0500 sll a1, a1, 0x18
0x8060b504 032e0500 sra a1, a1, 0x18
0x8060b508 0f008010 beqz a0, 0x8060b548
0x8060b50c 21100000 move v0, zero
0x8060b510 492d1808 j 0x8060b524
0x8060b514 00008290 lbu v0, (a0)
0x8060b518 0800e003 jr ra
0x8060b51c 21108000 move v0, a0
0x8060b520 00008290 lbu v0, (a0)
0x8060b524 07004010 beqz v0, 0x8060b544
0x8060b528 00000000 nop
0x8060b52c 00160200 sll v0, v0, 0x18
0x8060b530 03160200 sra v0, v0, 0x18
0x8060b534 f8ff4510 beq v0, a1, 0x8060b518
0x8060b538 00000000 nop
0x8060b53c 482d1808 j 0x8060b520
0x8060b540 01008424 addiu a0, a0, 1
0x8060b544 21100000 move v0, zero
0x8060b548 0800e003 jr ra
0x8060b54c 00000000 nop
fcn.8060b550(int32_t arg1, int32_t arg2);
; arg int32_t arg1 @ a0
; arg int32_t arg2 @ a1
0x8060b550 0000a290 lbu v0, (a1)
0x8060b554 05004010 beqz v0, 0x8060b56c
0x8060b558 0100a524 addiu a1, a1, 1
0x8060b55c 000082a0 sb v0, (a0)
0x8060b560 0000a290 lbu v0, (a1)
0x8060b564 552d1808 j 0x8060b554
0x8060b568 01008424 addiu a0, a0, 1
0x8060b56c 0800e003 jr ra
0x8060b570 000080a0 sb zero, (a0)
0x8060b574 00000000 nop
fcn.8060b578();
0x8060b578 e0ffbd27 addiu sp, sp, -0x20
0x8060b57c 542d180c jal fcn.8060b550
0x8060b580 00000000 nop
0x8060b584 0800e003 jr ra
0x8060b588 2000bd27 addiu sp, sp, 0x20
0x8060b58c 00000000 nop
EOF
RUN
NAME=GNU mips branch delay function detection #1.
FILE=malloc://160
ARGS=-m 0x8060b4f8
BROKEN=1
CMDS=<<EOF
e io.va=true
e asm.bits=32
e asm.arch=mips.gnu
e asm.comments=0
e analysis.hasnext=1
e analysis.jmp.eob=0
e analysis.nopskip=1
e asm.nbytes=4
e asm.lines.bb=false
e asm.lines.fcn=false
s 0x8060b4f8
wx 0000000000000000002e0500032e05000f00801021100000492d1808000082900800e003211080000000829007004010000000000016020003160200f8ff451000000000482d180801008424211000000800e003000000000000a290050040100100a524000082a00000a290552d1808010084240800e003000080a000000000e0ffbd27542d180c000000000800e0032000bd270000000000000000
aa 2> /dev/null
pd 38
EOF
EXPECT=<<EOF
0x8060b4f8 00000000 nop
0x8060b4fc 00000000 nop
fcn.8060b500 (int32_t arg1, int32_t arg2);
0x8060b500 002e0500 sll a1, a1, 0x18
0x8060b504 032e0500 sra a1, a1, 0x18
0x8060b508 0f008010 beqz a0, 0x8060b548
0x8060b50c 21100000 move v0, zero
0x8060b510 492d1808 j 0x8060b524
0x8060b514 00008290 lbu v0, 0(a0)
0x8060b518 0800e003 jr ra
0x8060b51c 21108000 move v0, a0
0x8060b520 00008290 lbu v0, 0(a0)
0x8060b524 07004010 beqz v0, 0x8060b544
0x8060b528 00000000 nop
0x8060b52c 00160200 sll v0, v0, 0x18
0x8060b530 03160200 sra v0, v0, 0x18
0x8060b534 f8ff4510 beq v0, a1, 0x8060b518
0x8060b538 00000000 nop
0x8060b53c 482d1808 j 0x8060b520
0x8060b540 01008424 addiu a0, a0, 1
0x8060b544 21100000 move v0, zero
0x8060b548 0800e003 jr ra
0x8060b54c 00000000 nop
fcn.8060b550 (int32_t arg1, int32_t arg2);
0x8060b550 0000a290 lbu v0, 0(a1)
0x8060b554 05004010 beqz v0, 0x8060b56c
0x8060b558 0100a524 addiu a1, a1, 1
0x8060b55c 000082a0 sb v0, 0(a0)
0x8060b560 0000a290 lbu v0, 0(a1)
0x8060b564 552d1808 j 0x8060b554
0x8060b568 01008424 addiu a0, a0, 1
0x8060b56c 0800e003 jr ra
0x8060b570 000080a0 sb zero, (a0)
0x8060b574 00000000 nop
fcn.8060b578 ();
0x8060b578 e0ffbd27 addiu sp, sp, -32
0x8060b57c 542d180c jal fcn.8060b550
0x8060b580 00000000 nop
0x8060b584 0800e003 jr ra
0x8060b588 2000bd27 addiu sp, sp, 32
0x8060b58c 00000000 nop
EOF
RUN
NAME=capstone: mips branch delay function detection #1.
FILE=malloc://160
ARGS=-m 0x8060b4f8
CMDS=<<EOF
e io.va=true
e asm.calls=false
e asm.bits=32
e asm.bytes=true
e asm.arch=mips
e analysis.noncode=1
e asm.comments=0
e analysis.hasnext=1
e analysis.jmp.eob=0
e analysis.nopskip=1
e asm.nbytes=4
e asm.lines.bb=false
e asm.lines.fcn=false
s 0x8060b4f8
wx 0000000000000000002e0500032e05000f00801021100000492d1808000082900800e003211080000000829007004010000000000016020003160200f8ff451000000000482d180801008424211000000800e003000000000000a290050040100100a524000082a00000a290552d1808010084240800e003000080a000000000e0ffbd27542d180c000000000800e0032000bd270000000000000000
aa 2> /dev/null
pd 38
EOF
EXPECT=<<EOF
0x8060b4f8 00000000 nop
0x8060b4fc 00000000 nop
fcn.8060b500(int32_t arg1, int32_t arg2);
; arg int32_t arg1 @ a0
; arg int32_t arg2 @ a1
0x8060b500 002e0500 sll a1, a1, 0x18
0x8060b504 032e0500 sra a1, a1, 0x18
0x8060b508 0f008010 beqz a0, 0x8060b548
0x8060b50c 21100000 move v0, zero
0x8060b510 492d1808 j 0x8060b524
0x8060b514 00008290 lbu v0, (a0)
0x8060b518 0800e003 jr ra
0x8060b51c 21108000 move v0, a0
0x8060b520 00008290 lbu v0, (a0)
0x8060b524 07004010 beqz v0, 0x8060b544
0x8060b528 00000000 nop
0x8060b52c 00160200 sll v0, v0, 0x18
0x8060b530 03160200 sra v0, v0, 0x18
0x8060b534 f8ff4510 beq v0, a1, 0x8060b518
0x8060b538 00000000 nop
0x8060b53c 482d1808 j 0x8060b520
0x8060b540 01008424 addiu a0, a0, 1
0x8060b544 21100000 move v0, zero
0x8060b548 0800e003 jr ra
0x8060b54c 00000000 nop
fcn.8060b550(int32_t arg1, int32_t arg2);
; arg int32_t arg1 @ a0
; arg int32_t arg2 @ a1
0x8060b550 0000a290 lbu v0, (a1)
0x8060b554 05004010 beqz v0, 0x8060b56c
0x8060b558 0100a524 addiu a1, a1, 1
0x8060b55c 000082a0 sb v0, (a0)
0x8060b560 0000a290 lbu v0, (a1)
0x8060b564 552d1808 j 0x8060b554
0x8060b568 01008424 addiu a0, a0, 1
0x8060b56c 0800e003 jr ra
0x8060b570 000080a0 sb zero, (a0)
0x8060b574 00000000 nop
fcn.8060b578();
0x8060b578 e0ffbd27 addiu sp, sp, -0x20
0x8060b57c 542d180c jal fcn.8060b550
0x8060b580 00000000 nop
0x8060b584 0800e003 jr ra
0x8060b588 2000bd27 addiu sp, sp, 0x20
0x8060b58c 00000000 nop
EOF
RUN
NAME=capstone: mips branch delay function detection #2.
FILE=malloc://160
ARGS=-m 0x8060b4f8
CMDS=<<EOF
e io.va=true
e asm.calls=false
e asm.bytes=true
e asm.bits=32
e asm.arch=mips
e analysis.noncode=1
e asm.comments=0
e analysis.hasnext=1
e analysis.jmp.eob=0
e analysis.nopskip=1
e asm.nbytes=4
e asm.lines.bb=false
e asm.lines.fcn=true
s 0x8060b4f8
wx 0000000000000000002e0500032e05000f00801021100000492d1808000082900800e003211080000000829007004010000000000016020003160200f8ff451000000000482d180801008424211000000800e003000000000000a290050040100100a524000082a00000a290552d1808010084240800e003000080a000000000e0ffbd27542d180c000000000800e0032000bd270000000000000000
aa 2> /dev/null
pd 38
EOF
EXPECT=<<EOF
0x8060b4f8 00000000 nop
0x8060b4fc 00000000 nop
/ fcn.8060b500(int32_t arg1, int32_t arg2);
| ; arg int32_t arg1 @ a0
| ; arg int32_t arg2 @ a1
| 0x8060b500 002e0500 sll a1, a1, 0x18
| 0x8060b504 032e0500 sra a1, a1, 0x18
| 0x8060b508 0f008010 beqz a0, 0x8060b548
| 0x8060b50c 21100000 move v0, zero
| 0x8060b510 492d1808 j 0x8060b524
| 0x8060b514 00008290 lbu v0, (a0)
| 0x8060b518 0800e003 jr ra
| 0x8060b51c 21108000 move v0, a0
| 0x8060b520 00008290 lbu v0, (a0)
| 0x8060b524 07004010 beqz v0, 0x8060b544
| 0x8060b528 00000000 nop
| 0x8060b52c 00160200 sll v0, v0, 0x18
| 0x8060b530 03160200 sra v0, v0, 0x18
| 0x8060b534 f8ff4510 beq v0, a1, 0x8060b518
| 0x8060b538 00000000 nop
| 0x8060b53c 482d1808 j 0x8060b520
| 0x8060b540 01008424 addiu a0, a0, 1
| 0x8060b544 21100000 move v0, zero
| 0x8060b548 0800e003 jr ra
\ 0x8060b54c 00000000 nop
/ fcn.8060b550(int32_t arg1, int32_t arg2);
| ; arg int32_t arg1 @ a0
| ; arg int32_t arg2 @ a1
| 0x8060b550 0000a290 lbu v0, (a1)
| 0x8060b554 05004010 beqz v0, 0x8060b56c
| 0x8060b558 0100a524 addiu a1, a1, 1
| 0x8060b55c 000082a0 sb v0, (a0)
| 0x8060b560 0000a290 lbu v0, (a1)
| 0x8060b564 552d1808 j 0x8060b554
| 0x8060b568 01008424 addiu a0, a0, 1
| 0x8060b56c 0800e003 jr ra
\ 0x8060b570 000080a0 sb zero, (a0)
0x8060b574 00000000 nop
/ fcn.8060b578();
| 0x8060b578 e0ffbd27 addiu sp, sp, -0x20
| 0x8060b57c 542d180c jal fcn.8060b550
| 0x8060b580 00000000 nop
| 0x8060b584 0800e003 jr ra
\ 0x8060b588 2000bd27 addiu sp, sp, 0x20
0x8060b58c 00000000 nop
EOF
RUN
NAME=mips big endian strings, calls, etc. analysis
FILE=bins/elf/analysis/mipsbe-ip
CMDS=<<EOF
s 0x00402088
e asm.bytes=true
pd 10
EOF
EXPECT=<<EOF
0x00402088 8f84814c lw a0, -main(gp) ; [0x43522c:4]=0x402558 sym.main
0x0040208c 8fa50000 lw a1, (sp)
0x00402090 27a60004 addiu a2, sp, 4
0x00402094 2401fff8 addiu at, zero, -8
0x00402098 03a1e824 and sp, sp, at
0x0040209c 27bdffe0 addiu sp, sp, -0x20
0x004020a0 8f878230 lw a3, -sym._init(gp) ; [0x435310:4]=0x401ff4 sym._init
0x004020a4 8f888114 lw t0, -sym._fini(gp) ; [0x4351f4:4]=0x41eca0 sym._fini
0x004020a8 afa80010 sw t0, 0x10(sp)
0x004020ac afa20014 sw v0, 0x14(sp)
EOF
RUN
NAME=mips.gnu regs
FILE=
CMDS=<<EOF
e asm.arch=mips.gnu
ar
EOF
EXPECT=<<EOF
zero = 0x0000000000000000
at = 0x0000000000000000
v0 = 0x0000000000000000
v1 = 0x0000000000000000
a0 = 0x0000000000000000
a1 = 0x0000000000000000
a2 = 0x0000000000000000
a3 = 0x0000000000000000
t0 = 0x0000000000000000
t1 = 0x0000000000000000
t2 = 0x0000000000000000
t3 = 0x0000000000000000
t4 = 0x0000000000000000
t5 = 0x0000000000000000
t6 = 0x0000000000000000
t7 = 0x0000000000000000
s0 = 0x0000000000000000
s1 = 0x0000000000000000
s2 = 0x0000000000000000
s3 = 0x0000000000000000
s4 = 0x0000000000000000
s5 = 0x0000000000000000
s6 = 0x0000000000000000
s7 = 0x0000000000000000
t8 = 0x0000000000000000
t9 = 0x0000000000000000
k0 = 0x0000000000000000
k1 = 0x0000000000000000
gp = 0x0000000000000000
sp = 0x0000000000000000
fp = 0x0000000000000000
ra = 0x0000000000000000
pc = 0x0000000000000000
EOF
RUN
NAME=mips sp/bp tracking
FILE=bins/elf/vars-mips-bp
ARGS=-e bin.dbginfo=0
CMDS=<<EOF
s sym.varfunc
af
e asm.sub.var=0
e asm.comments=0
e asm.stackptr=0
pdf
afvx
EOF
EXPECT=<<EOF
/ sym.varfunc();
| ; var int32_t var_20h @ stack - 0x20
| ; var int32_t var_18h @ stack - 0x18
| ; var int32_t var_14h @ stack - 0x14
| ; var int32_t var_10h @ stack - 0x10
| ; var int32_t var_ch @ stack - 0xc
| ; var int32_t var_8h @ stack - 0x8
| ; var int32_t var_4h @ stack - 0x4
| 0x00000794 lui gp, 2
| 0x00000798 addiu gp, gp, -0x7db4
| 0x0000079c addu gp, gp, t9
| 0x000007a0 addiu sp, sp, -0x30
| 0x000007a4 sw ra, 0x2c(sp)
| 0x000007a8 sw fp, 0x28(sp)
| 0x000007ac move fp, sp
| 0x000007b0 sw gp, 0x10(sp)
| 0x000007b4 addiu v0, zero, 1
| 0x000007b8 sw v0, 0x18(fp)
| 0x000007bc addiu v0, zero, 2
| 0x000007c0 sw v0, 0x1c(fp)
| 0x000007c4 addiu v0, zero, 3
| 0x000007c8 sw v0, 0x20(fp)
| 0x000007cc addiu v0, zero, 4
| 0x000007d0 sw v0, 0x24(fp)
| 0x000007d4 lw v0, -sym.leaffunc(gp)
| 0x000007d8 move t9, v0
| 0x000007dc bal sym.leaffunc
| 0x000007e0 nop
| 0x000007e4 lw gp, 0x10(fp)
| 0x000007e8 lw v0, 0x24(fp)
| 0x000007ec sw v0, 0x1c(fp)
| 0x000007f0 lw v0, 0x18(fp)
| 0x000007f4 move sp, fp
| 0x000007f8 lw ra, 0x2c(sp)
| 0x000007fc lw fp, 0x28(sp)
| 0x00000800 addiu sp, sp, 0x30
| 0x00000804 jr ra
\ 0x00000808 nop
afvR
var_4h 0x7f8
var_8h 0x7fc
var_20h 0x7e4
var_18h 0x7f0
var_14h
var_10h
var_ch 0x7e8
afvW
var_4h 0x7a4
var_8h 0x7a8
var_20h 0x7b0
var_18h 0x7b8
var_14h 0x7c0,0x7ec
var_10h 0x7c8
var_ch 0x7d0
EOF
RUN
NAME=aav without vinfun
FILE=bins/elf/analysis/mipsbe-busybox
CMDS=<<EOF
af @ 0x0040eb60
e analysis.vinfun=false
aav
pd 1 @ 0x0040ec8c~?jr
EOF
EXPECT=<<EOF
1
EOF
RUN
NAME=aav with vinfun
FILE=bins/elf/analysis/mipsbe-busybox
CMDS=<<EOF
af @ 0x0040eb60
e analysis.vinfun=true
aav
pd 1 @ 0x0040ec8c~?dword
EOF
EXPECT=<<EOF
1
EOF
RUN
NAME=aac on mips BE
FILE=bins/elf/analysis/mipsbe-busybox
CMDS=<<EOF
aac
afl~?
EOF
EXPECT=<<EOF
1268
EOF
RUN
NAME=raw aac with maps (less because of wrong map address)
FILE=bins/elf/analysis/mipsbe-busybox
ARGS=-n -m 0x80000 -a mips -b32 -e cfg.bigendian=true
CMDS=<<EOF
aac
afl~?
EOF
EXPECT=<<EOF
4
EOF
RUN