NAME=rcall
FILE==
CMDS=<<EOF
e asm.arch=arm
e asm.bits=64
e cfg.bigendian=false
wx e18f1394 # BL XXX
sd +4
wx 00013fd6 # BLR x8
ao~type[1]
ao@ 0~type[1]
/at call
echo --
/at ucall
echo --
/at rcall
EOF
EXPECT=<<EOF
rcall
type:
call
type:
0x00000000 4 bl 0x4e3f84
--
--
0x00000004 4 blr x8
EOF
RUN

NAME=syscall
FILE==
CMDS=<<EOF
e asm.arch=arm
e asm.bits=64
e cfg.bigendian=false
e asm.os=linux
asn fstat
asr 80
EOF
EXPECT=<<EOF
80
fstat
EOF
RUN

NAME=noreturn errno
FILE=bins/mach0/BatteryLife.arm_64.1
CMDS=<<EOF
e emu.str=1
s 0x100011130
pd 2~addChild
EOF
EXPECT=
RUN

NAME=adrp string
FILE=bins/mach0/SwiftUITest
CMDS=<<EOF
e emu.str=1
s. 886c
pds 10
EOF
EXPECT=<<EOF
0x100008870 str.Hello_World
EOF
RUN

NAME=symbol with invalid offset
FILE=bins/elf/libarm64.so
CMDS=<<EOF
ii
iE
EOF
EXPECT=<<EOF
nth      vaddr bind   type   lib name             
--------------------------------------------------
  3 0x00020060 GLOBAL NOTYPE     _bss_end__
  4 0x000006b0 GLOBAL FUNC       realloc
  5 0x000006c0 GLOBAL FUNC       __cxa_finalize
  7 0x000006d0 GLOBAL FUNC       __stack_chk_fail
  8 0x00020058 GLOBAL NOTYPE     __bss_start
  9 0x00020060 GLOBAL NOTYPE     __end__
 10 0x00020058 GLOBAL NOTYPE     __bss_start__
 11 0x00020058 GLOBAL NOTYPE     _edata
 12 0x000006e0 GLOBAL FUNC       malloc
 13 0x000006f0 GLOBAL FUNC       memcpy
 14 0x00020060 GLOBAL NOTYPE     __bss_end__
 15 0x00000700 GLOBAL FUNC       memset
 16 0x00020060 GLOBAL NOTYPE     _end
 17 0x00000710 GLOBAL FUNC       free
 18 0x00000720 GLOBAL FUNC       __cxa_atexit
nth      paddr      vaddr bind   type size lib name            
---------------------------------------------------------------
  6 0x0000aa20 0x0000aa20 GLOBAL FUNC 1176     Java_o__003dc_e
EOF
RUN

NAME=ao mte irg addg
FILE=bins/mach0/hello-mte
CMDS=<<EOF
ao@ 0x100007f10
echo --
ao@ 0x100007f14
EOF
EXPECT=<<EOF
address: 0x100007f10
opcode: irg x8, sp, x8
disasm: irg x8, sp, x8
pseudo: asm("irg x8, sp, x8")
mnemonic: irg
mask: ffffffff
prefix: 0
id: 508
bytes: e813c89a
refptr: 0
size: 4
sign: false
type: mov
cycles: 0
opex:
  operands:
    - type: "reg"
      value: "x8"
    - type: "reg"
      value: "sp"
    - type: "reg"
      value: "x8"
family: sec
--
address: 0x100007f14
opcode: addg x9, x8, 0x20, 0
disasm: addg x9, x8, 0x20, 0
pseudo: asm("addg x9, x8, 0x20, 0")
mnemonic: addg
mask: ffffffff
prefix: 0
id: 6
bytes: 09018291
refptr: 0
size: 4
sign: false
type: add
cycles: 0
opex:
  operands:
    - type: "reg"
      value: "x9"
    - type: "reg"
      value: "x8"
    - type: "imm"
      value: 32
    - type: "imm"
      value: 0
family: sec
EOF
RUN

NAME=ao mte big endian
FILE==
ARGS=-a arm -b 64 -E big
CMDS=<<EOF
wx 91a0090c918201099ac813e8
ao@ 0
echo ---
ao@ 4
echo ---
ao@ 8
EOF
EXPECT=<<EOF
address: 0x0
opcode: addg x12, x8, 0x200, 2
disasm: addg x12, x8, 0x200, 2
pseudo: asm("addg x12, x8, 0x200, 2")
mnemonic: addg
mask: ffffffff
prefix: 0
id: 6
bytes: 91a0090c
refptr: 0
size: 4
sign: false
type: add
cycles: 0
opex:
  operands:
    - type: "reg"
      value: "x12"
    - type: "reg"
      value: "x8"
    - type: "imm"
      value: 512
    - type: "imm"
      value: 2
family: sec
---
address: 0x4
opcode: addg x9, x8, 0x20, 0
disasm: addg x9, x8, 0x20, 0
pseudo: asm("addg x9, x8, 0x20, 0")
mnemonic: addg
mask: ffffffff
prefix: 0
id: 6
bytes: 91820109
refptr: 0
size: 4
sign: false
type: add
cycles: 0
opex:
  operands:
    - type: "reg"
      value: "x9"
    - type: "reg"
      value: "x8"
    - type: "imm"
      value: 32
    - type: "imm"
      value: 0
family: sec
---
address: 0x8
opcode: irg x8, sp, x8
disasm: irg x8, sp, x8
pseudo: asm("irg x8, sp, x8")
mnemonic: irg
mask: ffffffff
prefix: 0
id: 508
bytes: 9ac813e8
refptr: 0
size: 4
sign: false
type: mov
cycles: 0
opex:
  operands:
    - type: "reg"
      value: "x8"
    - type: "reg"
      value: "sp"
    - type: "reg"
      value: "x8"
family: sec
EOF
RUN

NAME=Variable analysis with stp/preindexed str
FILE=malloc://1024
ARGS=-a arm -b 64
CMDS=<<EOF
e cfg.bigendian=false
wx 00000000000000000000000000000000f30f1ef8fd7b01a9fd430091fd7b41a9e00313aaf30742f8c0035fd6
aap
s 0x10
aaef
afvx
e asm.comments=0
e asm.bytes=0
e asm.stackptr=1
pdf
EOF
EXPECT=<<EOF
afvR
   var_10h  0x18,0x1c
   var_20h
    var_8h  0x1c
afvW
   var_10h  0x14
   var_20h  0x10
    var_8h  0x14
/ fcn.00000010();
|           ; var int64_t var_20h @ stack - 0x20
|           ; var int64_t var_10h @ stack - 0x10
|           ; var int64_t var_8h @ stack - 0x8
|           0x00000010     0 -= 32      str   x19, [var_20h]!
|           0x00000014   -32            stp   fp, lr, [var_10h]
|           0x00000018   -32            add   fp, sp, 0x10
|           0x0000001c   -32            ldp   fp, lr, [var_10h]
|           0x00000020   -32            mov   x0, x19
|           0x00000024   -32 += 32      ldr   x19, [sp], 0x20
\           0x00000028     0            ret
EOF
RUN

NAME=pacibsp considered a valid function preamble
FILE=malloc://1024
ARGS=-a arm -b 64
CMDS=<<EOF
e cfg.bigendian=false
wx 7f2303d5fc6fbaa9fa6701a9f85f02a9
af
pd 4
EOF
EXPECT=<<EOF
/ fcn.00000000();
|           0x00000000      pacibsp
|           0x00000004      stp   x28, x27, [sp, -0x60]!
|           0x00000008      stp   x26, x25, [sp, 0x10]
|           0x0000000c      stp   x24, x23, [sp, 0x20]
EOF
RUN

NAME=pacibsp identified as function prologue
FILE=malloc://1024
ARGS=-a arm -b 64
CMDS=<<EOF
e cfg.bigendian=false
wx 7f2303d5fc6fbaa9fa6701a9f85f02a9ff0f5fd6
aap
pd 5
EOF
EXPECT=<<EOF
/ fcn.00000000();
|           0x00000000      pacibsp
|           0x00000004      stp   x28, x27, [sp, -0x60]!
|           0x00000008      stp   x26, x25, [sp, 0x10]
|           0x0000000c      stp   x24, x23, [sp, 0x20]
\           0x00000010      retab
EOF
RUN

NAME=tail call
FILE=bins/elf/static-glibc-2.27
CMDS=<<EOF
s 0x00401ae0
af
pdf
EOF
EXPECT=<<EOF
/ fcn.00401ae0(int64_t arg1, int64_t arg2, int64_t arg3);
|           ; arg int64_t arg1 @ rdi
|           ; arg int64_t arg2 @ rsi
|           ; arg int64_t arg3 @ rdx
|           0x00401ae0      mov   r9d, edx                             ; arg3
|           0x00401ae3      xor   r8d, r8d
|           0x00401ae6      xor   ecx, ecx
|           0x00401ae8      xor   edx, edx
\       ,=< 0x00401aea      jmp   fcn.00402f40
EOF
RUN

NAME=aarch64 cmn/cmp/tst show char comment for printable immediate
FILE=malloc://1024
ARGS=-a arm -b 64
CMDS=<<EOF
e cfg.bigendian=false
wx 3f0401b13f0401f13f1440f2
pd 3
EOF
EXPECT=<<EOF
            0x00000000      cmn   x1, 0x41                             ; 'A'
            0x00000004      cmp   x1, 0x41                             ; 'A'
            0x00000008      tst   x1, 0x3f                             ; '?'
EOF
RUN

NAME=data xrefs outside functions marked as data
FILE=bins/elf/libarm64.so
CMDS=<<EOF
aaa
s 0xe080
pd 1
s 0xe09c
pd 1
e asm.xrefs=false
e asm.comments=false
pd 3 @ 0x810
EOF
EXPECT=<<EOF
            ; DATA XREFS from fcn.00005b80 @ 0x5bb0, 0x5bec
            0x0000e080 hex length=15 delta=0
0x0000e080  787b ffff 587b ffff 887b ffff 4c7b ff    x{..X{...{..L{.

            ; DATA XREFS from sym.Java_o__003dc_e @ 0xaa64, 0xaaa8
            0x0000e09c hex length=36 delta=0
0x0000e09c  18ca ffff f8c9 ffff 48ca ffff ecc9 ffff  ........H.......
0x0000e0ac  64ca ffff 28ca ffff c8ca ffff 0000 0000  d...(...........
0x0000e0bc  0000 0000                                ....

            0x00000810      ret
            0x00000814      ldr   x8, [x0]
            0x00000818      add   x9, x8, 1
EOF
RUN
