NAME=ppc-asserts
FILE=bins/elf/powerpc-linux-gnu-symexec-palindrome
CMDS=<<EOF
env RZ_DEBUG_ASSERT=1
aaa
echo done
EOF
EXPECT=<<EOF
done
EOF
RUN

NAME=ppc-aflm
FILE=bins/elf/analysis/elf-ppc-execstack
CMDS=<<EOF
aac
aflm
EOF
EXPECT=<<EOF
sym._init:
    loc.imp.__gmon_start
    fcn.100015e0
    fcn.100264c0

fcn.100016d0:
    sym.imp.abort

fcn.100016e0:
    sym.imp.abort

fcn.100016f0:
    sym.imp.memset
    sym.imp.gelf_fsize

fcn.100017a0:
    fcn.10001fd0
    fcn.10003ba0
    fcn.100048e0
    sym.imp.error
    fcn.10003f90
    fcn.100016f0
    fcn.10002660
    fcn.10006480

fcn.10001fd0:
    sym.imp.strlen
    fcn.10002d10
    sym.imp.strcmp
    sym.imp.sprintf
    sym.imp.mkstemp
    sym.imp.__strdup
    sym.imp.vfork
    sym.imp.waitpid
    sym.imp.error
    sym.imp.free
    fcn.10003f90
    fcn.10008d80
    sym.imp.unlink
    sym.imp.close
    fcn.10007450
    sym.imp.__errno_location
    fcn.100017a0
    sym.imp.execlp
    sym.imp.execl
    sym.imp._exit

fcn.10002660:
    fcn.10006120
    fcn.10004730
    sym.imp.elf_getdata
    fcn.1000f2d0
    sym.imp.gelf_xlatetof
    sym.imp.gelf_xlatetom
    sym.imp.abort

fcn.10002d10:
    sym.imp.elf_getdata

fcn.10002e00:
    sym.imp.elf_getdata
    fcn.10003bc0

fcn.10002ff0:
    sym.imp.gelf_fsize
    fcn.10002e00
    fcn.10025f80
    fcn.10025b30
    sym.imp.gelf_getsym

fcn.100030f0:
    fcn.10003bc0
    sym.imp.elf_getdata

fcn.10003230:
    fcn.100030f0
    sym.imp.elf_flagscn

fcn.100032c0:
    fcn.100030f0

fcn.10003320:
    fcn.100030f0
    sym.imp.elf_flagscn

fcn.100033d0:
    fcn.100030f0

fcn.10003450:
    fcn.100030f0
    sym.imp.elf_flagscn

fcn.100034d0:
    fcn.100030f0
    sym.imp.elf_flagscn

fcn.10003630:
    fcn.100030f0
    sym.imp.elf_flagscn

fcn.100036e0:
    fcn.100030f0

fcn.10003770:
    fcn.100030f0

fcn.10003820:
    fcn.100030f0
    sym.imp.elf_flagscn

fcn.100038d0:
    fcn.100030f0
    sym.imp.elf_flagscn

fcn.10003ce0:
    sym.imp.error

fcn.10003e40:
    sym.imp.free
    sym.imp.elf_getdata
    sym.imp.elf_end
    sym.imp.fsync
    sym.imp.close

fcn.10003f90:
    sym.imp.unlink
    fcn.10003e40

fcn.10003fe0:
    sym.imp.getfilecon
    sym.imp.setfilecon
    sym.imp.freecon
    sym.imp.__errno_location
    sym.imp.error
    sym.imp.is_selinux_enabled

fcn.10004120:
    sym.imp.__assert_fail

fcn.10004390:
    sym.imp.memset
    sym.imp.elf_getdata
    sym.imp.gelf_getsym
    fcn.10025b30
    sym.imp.gelf_update_sym
    sym.imp.__assert_fail

fcn.10004730:
    fcn.10003ce0
    sym.imp.gelf_update_ehdr
    sym.imp.gelf_update_phdr
    sym.imp.gelf_update_shdr
    fcn.10004390
    fcn.1000d780

fcn.10004880:
    fcn.10004730
    sym.imp.elf_update

fcn.100048e0:
    fcn.10004880
    sym.imp.strlen
    sym.imp.memcpy
    sym.imp.__fxstat64
    sym.imp.fchown
    sym.imp.fchmod
    fcn.10003e40
    sym.imp.time
    sym.imp.utime
    fcn.10003fe0
    sym.imp.rename
    sym.imp.unlink
    sym.imp.__errno_location
    sym.imp.error
    fcn.10003f90
    sym.imp.elf_errmsg

fcn.10005480:
    sym.imp.gelf_fsize

fcn.10005a00:
    sym.imp.elf_getdata
    fcn.10025b30
    sym.imp.gelf_getsym
    sym.imp.gelf_update_sym
    sym.imp.elf_flagscn
    sym.imp.error

fcn.10005cb0:
    sym.imp.memset
    sym.imp.elf_getdata
    fcn.10025b30
    sym.imp.gelf_getdyn

fcn.10006120:
    sym.imp.elf_getdata
    fcn.10025b30
    sym.imp.gelf_getdyn
    sym.imp.gelf_update_dyn
    sym.imp.elf_flagscn
    sym.imp.__assert_fail
    sym.imp.error

fcn.10006480:
    fcn.10025f80
    sym.imp.gelf_update_phdr
    fcn.1000e110
    sym.imp.elf_flagphdr
    sym.imp.gelf_update_shdr
    sym.imp.elf_flagshdr
    sym.imp.gelf_update_ehdr
    sym.imp.elf_flagehdr
    fcn.10004120
    sym.imp.realloc
    sym.imp.memmove
    fcn.10005480
    sym.imp.error

fcn.10007380:
    sym.imp.malloc
    sym.imp.error

fcn.10007450:
    sym.imp.strlen
    sym.imp.sprintf
    sym.imp.mkstemp
    sym.imp.elf_begin
    sym.imp.gelf_getclass
    sym.imp.error
    sym.imp.elf_end
    sym.imp.unlink
    sym.imp.close
    sym.imp.free
    sym.imp.elf64_newehdr
    sym.imp.gelf_update_ehdr
    sym.imp.gelf_newphdr
    sym.imp.memcpy
    sym.imp.elf_flagelf
    sym.imp.gelf_update_phdr
    sym.imp.elf_newscn
    sym.imp.gelf_update_shdr
    sym.imp.elf_getdata
    sym.imp.elf_newdata
    sym.imp.__strdup
    sym.imp.elf_getscn
    sym.imp.gelf_getshdr
    fcn.10005cb0
    sym.imp.gelf_fsize
    fcn.10005480
    sym.imp.__errno_location
    sym.imp.elf32_newehdr
    sym.imp.elf_errmsg
    fcn.10007380
    fcn.10005a00
    sym.imp.__assert_fail
    sym.imp.calloc
    sym.imp.abort

fcn.10008d80:
    sym.imp.elf_begin
    sym.imp.elf_kind
    sym.imp.gelf_getehdr
    sym.imp.malloc
    sym.imp.elf_flagelf
    sym.imp.memset
    sym.imp.memcpy
    sym.imp.gelf_getphdr
    sym.imp.elf_getscn
    sym.imp.gelf_getshdr
    sym.imp.qsort
    fcn.10005cb0
    sym.imp.__strdup
    fcn.10002d10
    sym.imp.strcmp
    sym.imp.error
    sym.imp.free
    sym.imp.elf_end
    fcn.10007380
    sym.imp.close
    fcn.100030f0
    sym.imp.pread
    sym.imp.memmem
    sym.imp.elf_errmsg
    sym.imp.__assert_fail
    sym.imp.open
    sym.imp.__errno_location

fcn.10008f70:
    sym.imp.error

fcn.10009270:
    fcn.10003bc0
    sym.imp.elf_flagscn
    sym.imp.error
    fcn.10008f70
    sym.imp.__assert_fail

fcn.10009f00:
    fcn.10002d10
    sym.imp.strncmp
    sym.imp.strcmp
    sym.imp.elf_getdata
    sym.imp.__assert_fail
    sym.imp.error
    fcn.1000cbf0
    sym.imp.malloc
    fcn.1000cb20
    fcn.1000c650
    sym.imp.realloc
    sym.imp.elf_flagscn
    fcn.10003bc0
    sym.imp.free
    fcn.1000c2f0
    fcn.10009270

fcn.1000b3e0:
    sym.imp.calloc
    sym.imp.error

fcn.1000b540:
    fcn.1000c440
    sym.imp.calloc

fcn.1000b6c0:
    sym.imp.malloc
    fcn.1000cb20
    sym.imp.error
    sym.imp.calloc

fcn.1000b8e0:
    sym.imp.calloc
    fcn.10025b30
    fcn.1000cbf0
    fcn.10025f80
    sym.imp.error
    fcn.1000c650
    sym.imp.free
    sym.imp.__assert_fail
    fcn.1000cb20
    fcn.1000c490
    sym.imp.qsort

fcn.1000c490:
    sym.imp.abort

fcn.1000c650:
    sym.imp.free

fcn.1000c730:
    sym.imp.fprintf
    sym.imp.abort

fcn.1000cb20:
    fcn.1000c730
    sym.imp.free
    sym.imp.calloc
    sym.imp.abort

fcn.1000cbf0:
    fcn.1000c730
    sym.imp.calloc
    sym.imp.free

fcn.1000ce30:
    sym.imp.memset

fcn.1000d410:
    sym.imp.elf_getdata
    sym.imp.__assert_fail
    sym.imp.error

fcn.1000d780:
    sym.imp.__assert_fail
    fcn.1000d410
    sym.imp.error

fcn.1000e110:
    fcn.1000d410
    sym.imp.error

fcn.1000ef70:
    sym.imp.__assert_fail
    sym.imp.elf_getdata
    sym.imp.error
    sym.imp.elf_flagscn

fcn.1000f620:
    sym.imp.__assert_fail

fcn.100139b0:
    sym.imp.qsort
    sym.imp.calloc
    sym.imp.memset
    fcn.100139b0
    sym.imp.error
    fcn.10025b30
    fcn.10003230

fcn.1001ce70:
    sym.imp.error
    fcn.10003430
    fcn.100033b0

fcn.1001d690:
    fcn.100033b0
    sym.imp.__assert_fail

EOF
RUN

NAME=ppc-elf
FILE=bins/elf/analysis/elf-ppc-execstack
CMDS=<<EOF
e asm.flags=false
e asm.bytes=true
pdq 4
EOF
EXPECT=<<EOF
0x100014e0             7c290b78  mr r9, r1
0x100014e4             54210036  rlwinm r1, r1, 0, 0, 0x1b
0x100014e8             38000000  li r0, 0
0x100014ec             9421fff0  stwu r1, -0x10(r1)
EOF
RUN

NAME=ppc-elf entry0 name issue
FILE=bins/elf/analysis/elf-ppc-execstack
CMDS=<<EOF
echo
e asm.flags=true
e asm.bytes=true
pdq 1
af
afi~name[1]
EOF
EXPECT=<<EOF

0x100014e0   section..text:
0x100014e0             7c290b78  mr r9, r1
entry0
EOF
RUN

NAME=ppc-elf relocs
FILE=bins/elf/analysis/elf-ppc-execstack
CMDS=<<EOF
s 0x10001500
pi 1
EOF
EXPECT=<<EOF
b sym.imp.__libc_start_main
EOF
RUN

NAME=ppc update suffix esil/rzil
FILE=bins/elf/a6ppc.out
CMDS=<<EOF
echo ---- esil ----
40ds
ar r3
ar r4
10ds
ar r3
ar r4
echo ---- rzil ----
aezi
# reset all modified registers.
ar PC=0x100000d4
ar r1=0
ar r3=0
ar r4=0
ar r9=0
aezs 40
ar r3
ar r4
aezs 10
ar r3
ar r4
EOF
EXPECT=<<EOF
---- esil ----
r3 = 0xffffffbf
r4 = 0x10000107
r3 = 0xffffffc1
r4 = 0x1000010a
---- rzil ----
r3 = 0xffffffbf
r4 = 0x10000107
r3 = 0xffffffc1
r4 = 0x1000010a
EOF
RUN

NAME=ppc-detect-vtables
FILE=bins/elf/ppc_classes
CMDS=<<EOF
av
EOF
EXPECT=<<EOF

Vtable Found at 0x100016d4
0x100016d4 : No Name found
0x100016d8 : No Name found
0x100016dc : No Name found


Vtable Found at 0x100016e8
0x100016e8 : No Name found
0x100016ec : No Name found
0x100016f0 : No Name found


Vtable Found at 0x100016fc
0x100016fc : No Name found
0x10001700 : No Name found
0x10001704 : No Name found


Vtable Found at 0x10001710
0x10001710 : No Name found
0x10001714 : No Name found
0x10001718 : No Name found
0x1000171c : No Name found
0x10001720 : No Name found


Vtable Found at 0x1000172c
0x1000172c : No Name found
0x10001730 : No Name found
0x10001734 : No Name found
0x10001738 : No Name found
0x1000173c : No Name found


Vtable Found at 0x10001748
0x10001748 : No Name found
0x1000174c : No Name found
0x10001750 : No Name found
0x10001754 : No Name found
0x10001758 : No Name found


Vtable Found at 0x10001764
0x10001764 : No Name found
0x10001768 : No Name found
0x1000176c : No Name found

EOF
RUN

NAME=aoj f0ff2194
FILE==
CMDS=<<EOF
e asm.arch=ppc
e asm.bits=64
wx f0ff2194
aoj~{}
EOF
EXPECT=<<EOF
[
  {
    "opcode": "stwu r1, -0x10(r1)",
    "disasm": "stwu r1, -0x10(r1)",
    "pseudo": "word[r1 - 0x10] = r1",
    "description": "Store Word with Update",
    "mnemonic": "stwu",
    "mask": "ffffffff",
    "esil": "r1,-16,r1,+,=[4],-16,r1,+=",
    "rzil": {
      "opcode": "seq",
      "x": {
        "opcode": "storew",
        "mem": 0,
        "key": {
          "opcode": "+",
          "x": {
            "opcode": "var",
            "value": "r1"
          },
          "y": {
            "opcode": "let",
            "dst": "v",
            "exp": {
              "opcode": "bitv",
              "bits": "0xfff0",
              "len": 16
            },
            "body": {
              "opcode": "ite",
              "condition": {
                "opcode": "msb",
                "bv": {
                  "opcode": "var",
                  "value": "v"
                }
              },
              "x": {
                "opcode": "cast",
                "value": {
                  "opcode": "var",
                  "value": "v"
                },
                "length": 64,
                "fill": {
                  "opcode": "msb",
                  "bv": {
                    "opcode": "var",
                    "value": "v"
                  }
                }
              },
              "y": {
                "opcode": "cast",
                "value": {
                  "opcode": "var",
                  "value": "v"
                },
                "length": 64,
                "fill": {
                  "opcode": "bool",
                  "value": false
                }
              }
            }
          }
        },
        "value": {
          "opcode": "cast",
          "value": {
            "opcode": "var",
            "value": "r1"
          },
          "length": 32,
          "fill": {
            "opcode": "bool",
            "value": false
          }
        }
      },
      "y": {
        "opcode": "set",
        "dst": "r1",
        "src": {
          "opcode": "+",
          "x": {
            "opcode": "var",
            "value": "r1"
          },
          "y": {
            "opcode": "let",
            "dst": "v",
            "exp": {
              "opcode": "bitv",
              "bits": "0xfff0",
              "len": 16
            },
            "body": {
              "opcode": "ite",
              "condition": {
                "opcode": "msb",
                "bv": {
                  "opcode": "var",
                  "value": "v"
                }
              },
              "x": {
                "opcode": "cast",
                "value": {
                  "opcode": "var",
                  "value": "v"
                },
                "length": 64,
                "fill": {
                  "opcode": "msb",
                  "bv": {
                    "opcode": "var",
                    "value": "v"
                  }
                }
              },
              "y": {
                "opcode": "cast",
                "value": {
                  "opcode": "var",
                  "value": "v"
                },
                "length": 64,
                "fill": {
                  "opcode": "bool",
                  "value": false
                }
              }
            }
          }
        }
      }
    },
    "sign": false,
    "prefix": 0,
    "id": 1004,
    "opex": {
      "operands": [
        {
          "type": "reg",
          "value": "r1"
        },
        {
          "type": "mem",
          "base": "r1",
          "disp": -16
        }
      ]
    },
    "addr": 0,
    "bytes": "f0ff2194",
    "size": 4,
    "type": "store",
    "esilcost": 12,
    "scale": 0,
    "refptr": 0,
    "cycles": 0,
    "failcycles": 0,
    "delay": 0,
    "stack": "inc",
    "stackptr": 16,
    "family": "cpu"
  }
]
EOF
RUN

NAME=ppc vle big-endian
FILE=bins/firmware/ppc-big-endian-vle.bin
CMDS=<<EOF
e asm.arch=ppc
e asm.bits=32
e asm.cpu=vle
e cfg.bigendian=true
pd 10
echo ensure that the endianness is kept
pd 10
EOF
EXPECT=<<EOF
            0x00000000      se_mflr r0
            0x00000002      e_stwu r1 0xfffffff0(r1)
            0x00000006      se_stw r31 0xc(r1)
            0x00000008      se_stw r0 0x14(r1)
            0x0000000a      se_cmpi r4 0x0
            0x0000000c      e_li  r11 0x0
        ,=< 0x00000010      e_beq cr0 0x212
        |   0x00000014      e_addi r10 r4 0xffffffff
        |   0x00000018      e_srwi r10 r10 0x2
        |   0x0000001c      e_addi r7 r10 0x2
ensure that the endianness is kept
            0x00000000      se_mflr r0
            0x00000002      e_stwu r1 0xfffffff0(r1)
            0x00000006      se_stw r31 0xc(r1)
            0x00000008      se_stw r0 0x14(r1)
            0x0000000a      se_cmpi r4 0x0
            0x0000000c      e_li  r11 0x0
        ,=< 0x00000010      e_beq cr0 0x212
        |   0x00000014      e_addi r10 r4 0xffffffff
        |   0x00000018      e_srwi r10 r10 0x2
        |   0x0000001c      e_addi r7 r10 0x2
EOF
RUN
