NAME=Printing il statements in various formats
FILE=bins/elf/emulateme.arm64
CMDS=<<EOF
s sym.decrypt
echo -- oneline
aoi 5
echo -- pretty
aoip 5
echo -- graph
agI
EOF
EXPECT=<<EOF
-- oneline
0x804 (set sp (- (var sp) (bv 64 0x30)))
0x808 (storew 0 (+ (var sp) (bv 64 0x8)) (var x0))
0x80c (store 0 (+ (var sp) (bv 64 0x2f)) (cast 8 false (bv 32 0x0)))
0x810 (storew 0 (+ (var sp) (bv 64 0x20)) (bv 64 0x0))
0x814 (jmp (bv 64 0x888))
-- pretty
0x804
(set sp
  (-
    (var sp)
    (bv 64 0x30)))
0x808
(storew 0
  (+
    (var sp)
    (bv 64 0x8))
  (var x0))
0x80c
(store 0
  (+
    (var sp)
    (bv 64 0x2f))
  (cast 8
    false
    (bv 32 0x0)))
0x810
(storew 0
  (+
    (var sp)
    (bv 64 0x20))
  (bv 64 0x0))
0x814
(jmp
  (bv 64 0x888))
-- graph
    .---------------------.
    |  sub sp, sp, #0x30  |
    `---------------------'
        v
        |
        '----.
             |
         .-----------.
         |  set: sp  |
         `-----------'
             v
             |
             |
         .-----------.
         |  sub      |
         `-----------'
               v v
               | |
    .----------' |
    |            '--.
    |               |
.-----------.   .---------------.
|  var: sp  |   |  bv: 64 0x30  |
`-----------'   `---------------'
EOF
RUN


NAME=arm64 cls
FILE=malloc://0x100
ARGS=-aarm -b64
CMDS=<<EOF
wx 6214c0da
aezi
echo -- 0x00800000
ar x3=0x00800000
aezs
ar x2
echo -- 0xffffffffff800000
ar pc=0
ar x3=0xffffffffff800000
aezs
ar x2
echo -- 0xffffffffffffffff
ar pc=0
ar x3=0xffffffffffffffff
aezs
ar x2
echo -- 0x0
ar pc=0
ar x3=0x0
aezs
ar x2
EOF
EXPECT=<<EOF
-- 0x00800000
x2 = 0x0000000000000027
-- 0xffffffffff800000
x2 = 0x0000000000000028
-- 0xffffffffffffffff
x2 = 0x000000000000003f
-- 0x0
x2 = 0x000000000000003f
EOF
RUN

NAME=arm clz
FILE=malloc://0x100
ARGS=-aarm -b64
CMDS=<<EOF
wx 6210c0da
aezi
echo -- 0x00800000
ar x3=0x00800000
aezs
ar x2
echo -- 0xffffffffff800000
ar pc=0
ar x3=0xffffffffff800000
aezs
ar x2
echo -- 0xffffffffffffffff
ar pc=0
ar x3=0xffffffffffffffff
aezs
ar x2
echo -- 0x0
ar pc=0
ar x3=0x0
aezs
ar x2
EOF
EXPECT=<<EOF
-- 0x00800000
x2 = 0x0000000000000028
-- 0xffffffffff800000
x2 = 0x0000000000000000
-- 0xffffffffffffffff
x2 = 0x0000000000000000
-- 0x0
x2 = 0x0000000000000040
EOF
RUN

NAME=arm64 sdiv 64-bit
FILE=malloc://0x100
ARGS=-aarm -b64
CMDS=<<EOF
wx 200cc29a
aezi
ar x1=42
ar x2=5
echo -- 42 / 5
aezs
ar x0
echo -- 42 / 0
ar pc=0
ar x1=42
ar x2=0
aezs
ar x0
echo -- 0 / 0
ar pc=0
ar x1=0
ar x2=0
aezs
ar x0
echo -- -2^63 / -1
ar pc=0
ar x1=0x8000000000000000
ar x2=0xffffffffffffffff
aezs
ar x0
echo -- -42 / 5
ar pc=0
ar x1=0xffffffffffffffd6
ar x2=5
aezs
ar x0
echo -- -42 / -5
ar pc=0
ar x1=0xffffffffffffffd6
ar x2=0xfffffffffffffffb
aezs
ar x0
EOF
EXPECT=<<EOF
-- 42 / 5
x0 = 0x0000000000000008
-- 42 / 0
x0 = 0x0000000000000000
-- 0 / 0
x0 = 0x0000000000000000
-- -2^63 / -1
x0 = 0x8000000000000000
-- -42 / 5
x0 = 0xfffffffffffffff8
-- -42 / -5
x0 = 0x0000000000000008
EOF
RUN

NAME=arm64 sdiv 32-bit
FILE=malloc://0x100
ARGS=-aarm -b64
CMDS=<<EOF
wx 200cc21a
aezi
ar x1=42
ar x2=5
echo -- 42 / 5
aezs
ar x0
echo -- 42 / 0
ar pc=0
ar x1=42
ar x2=0
aezs
ar x0
echo -- 0 / 0
ar pc=0
ar x1=0
ar x2=0
aezs
ar x0
echo -- -2^31 / -1
ar pc=0
ar x1=0x80000000
ar x2=0xffffffff
aezs
ar x0
echo -- -42 / 5
ar pc=0
ar x1=0xffffffd6
ar x2=5
aezs
ar x0
echo -- -42 / -5
ar pc=0
ar x1=0xffffffd6
ar x2=0xfffffffb
aezs
ar x0
EOF
EXPECT=<<EOF
-- 42 / 5
x0 = 0x0000000000000008
-- 42 / 0
x0 = 0x0000000000000000
-- 0 / 0
x0 = 0x0000000000000000
-- -2^31 / -1
x0 = 0x0000000080000000
-- -42 / 5
x0 = 0x00000000fffffff8
-- -42 / -5
x0 = 0x0000000000000008
EOF
RUN

NAME=arm udiv 64-bit
FILE=malloc://0x100
ARGS=-aarm -b64
CMDS=<<EOF
wx 0008c19a
aezi
ar x0=42
ar x1=5
echo -- 42 / 5
aezs
ar x0
echo -- 42 / 0
ar pc=0
ar x0=42
ar x1=0
aezs
ar x0
echo -- 0 / 0
ar pc=0
ar x0=0
ar x1=0
aezs
ar x0
echo -- -2^31 / -1
ar pc=0
ar x0=0x8000000000000000
ar x1=0xffffffffffffffff
aezs
ar x0
echo -- -42 / 5
ar pc=0
ar x0=0xffffffffffffffd6
ar x1=5
aezs
ar x0
echo -- -42 / -5
ar pc=0
ar x0=0xffffffffffffffd6
ar x1=0xfffffffffffffffb
aezs
ar x0
EOF
EXPECT=<<EOF
-- 42 / 5
x0 = 0x0000000000000008
-- 42 / 0
x0 = 0x0000000000000000
-- 0 / 0
x0 = 0x0000000000000000
-- -2^31 / -1
x0 = 0x0000000000000000
-- -42 / 5
x0 = 0x333333333333332a
-- -42 / -5
x0 = 0x0000000000000000
EOF
RUN

NAME=arm udiv 32-bit
FILE=malloc://0x100
ARGS=-aarm -b64
CMDS=<<EOF
wx 0008c11a
aezi
ar x0=42
ar x1=5
echo -- 42 / 5
aezs
ar x0
echo -- 42 / 0
ar pc=0
ar x0=42
ar x1=0
aezs
ar x0
echo -- 0 / 0
ar pc=0
ar x0=0
ar x1=0
aezs
ar x0
echo -- -2^31 / -1
ar pc=0
ar x0=0x80000000
ar x1=0xffffffff
aezs
ar x0
echo -- -42 / 5
ar pc=0
ar x0=0xffffffd6
ar x1=5
aezs
ar x0
echo -- -42 / -5
ar pc=0
ar x0=0xffffffd6
ar x1=0xfffffffb
aezs
ar x0
EOF
EXPECT=<<EOF
-- 42 / 5
x0 = 0x0000000000000008
-- 42 / 0
x0 = 0x0000000000000000
-- 0 / 0
x0 = 0x0000000000000000
-- -2^31 / -1
x0 = 0x0000000000000000
-- -42 / 5
x0 = 0x000000003333332a
-- -42 / -5
x0 = 0x0000000000000000
EOF
RUN

NAME=emulateme arm64
FILE=bins/elf/emulateme.arm64
TIMEOUT=30
CMDS=<<EOF
s sym.decrypt
o malloc://0x1000 0x40000
o malloc://0x10 0x50000
oC 0x10 @ obj.seckrit   # New file mapping from 0x0-0xf
omb. obj.seckrit @ 0x0
w AnyColourYouLike @ 0x50000
ar sp=0x41000
ar x0=0x50000
aezi
aezsu 0x914
ps @ obj.seckrit
EOF
EXPECT=<<EOF
Hello from RzIL!
EOF
RUN
