1*9a0e4156SSadaf Ebrahimi#!/usr/bin/python 2*9a0e4156SSadaf Ebrahimi 3*9a0e4156SSadaf Ebrahimifrom capstone import * 4*9a0e4156SSadaf Ebrahimifrom capstone.arm import * 5*9a0e4156SSadaf Ebrahimifrom capstone.arm64 import * 6*9a0e4156SSadaf Ebrahimifrom capstone.mips import * 7*9a0e4156SSadaf Ebrahimifrom capstone.ppc import * 8*9a0e4156SSadaf Ebrahimifrom capstone.sparc import * 9*9a0e4156SSadaf Ebrahimifrom capstone.systemz import * 10*9a0e4156SSadaf Ebrahimifrom capstone.x86 import * 11*9a0e4156SSadaf Ebrahimifrom capstone.xcore import * 12*9a0e4156SSadaf Ebrahimiimport sys 13*9a0e4156SSadaf Ebrahimi 14*9a0e4156SSadaf Ebrahimiclass GroupTest: 15*9a0e4156SSadaf Ebrahimi def __init__(self, name, arch, mode, data): 16*9a0e4156SSadaf Ebrahimi self.name = name 17*9a0e4156SSadaf Ebrahimi self.arch = arch 18*9a0e4156SSadaf Ebrahimi self.mode = mode 19*9a0e4156SSadaf Ebrahimi self.data = data 20*9a0e4156SSadaf Ebrahimi 21*9a0e4156SSadaf Ebrahimi def run(self): 22*9a0e4156SSadaf Ebrahimi print('Testing %s' %self.name) 23*9a0e4156SSadaf Ebrahimi cap = Cs(self.arch, self.mode) 24*9a0e4156SSadaf Ebrahimi for group_id in xrange(0,255): 25*9a0e4156SSadaf Ebrahimi name = self.data.get(group_id) 26*9a0e4156SSadaf Ebrahimi res = cap.group_name(group_id) 27*9a0e4156SSadaf Ebrahimi if res != name: 28*9a0e4156SSadaf Ebrahimi print("ERROR: id = %u expected '%s', but got '%s'" %(group_id, name, res)) 29*9a0e4156SSadaf Ebrahimi print("") 30*9a0e4156SSadaf Ebrahimi 31*9a0e4156SSadaf Ebrahimiarm_dict = { 32*9a0e4156SSadaf Ebrahimi ARM_GRP_JUMP: "jump", 33*9a0e4156SSadaf Ebrahimi ARM_GRP_CALL: "call", 34*9a0e4156SSadaf Ebrahimi ARM_GRP_INT: "int", 35*9a0e4156SSadaf Ebrahimi ARM_GRP_PRIVILEGE: "privilege", 36*9a0e4156SSadaf Ebrahimi 37*9a0e4156SSadaf Ebrahimi ARM_GRP_CRYPTO: "crypto", 38*9a0e4156SSadaf Ebrahimi ARM_GRP_DATABARRIER: "databarrier", 39*9a0e4156SSadaf Ebrahimi ARM_GRP_DIVIDE: "divide", 40*9a0e4156SSadaf Ebrahimi ARM_GRP_FPARMV8: "fparmv8", 41*9a0e4156SSadaf Ebrahimi ARM_GRP_MULTPRO: "multpro", 42*9a0e4156SSadaf Ebrahimi ARM_GRP_NEON: "neon", 43*9a0e4156SSadaf Ebrahimi ARM_GRP_T2EXTRACTPACK: "T2EXTRACTPACK", 44*9a0e4156SSadaf Ebrahimi ARM_GRP_THUMB2DSP: "THUMB2DSP", 45*9a0e4156SSadaf Ebrahimi ARM_GRP_TRUSTZONE: "TRUSTZONE", 46*9a0e4156SSadaf Ebrahimi ARM_GRP_V4T: "v4t", 47*9a0e4156SSadaf Ebrahimi ARM_GRP_V5T: "v5t", 48*9a0e4156SSadaf Ebrahimi ARM_GRP_V5TE: "v5te", 49*9a0e4156SSadaf Ebrahimi ARM_GRP_V6: "v6", 50*9a0e4156SSadaf Ebrahimi ARM_GRP_V6T2: "v6t2", 51*9a0e4156SSadaf Ebrahimi ARM_GRP_V7: "v7", 52*9a0e4156SSadaf Ebrahimi ARM_GRP_V8: "v8", 53*9a0e4156SSadaf Ebrahimi ARM_GRP_VFP2: "vfp2", 54*9a0e4156SSadaf Ebrahimi ARM_GRP_VFP3: "vfp3", 55*9a0e4156SSadaf Ebrahimi ARM_GRP_VFP4: "vfp4", 56*9a0e4156SSadaf Ebrahimi ARM_GRP_ARM: "arm", 57*9a0e4156SSadaf Ebrahimi ARM_GRP_MCLASS: "mclass", 58*9a0e4156SSadaf Ebrahimi ARM_GRP_NOTMCLASS: "notmclass", 59*9a0e4156SSadaf Ebrahimi ARM_GRP_THUMB: "thumb", 60*9a0e4156SSadaf Ebrahimi ARM_GRP_THUMB1ONLY: "thumb1only", 61*9a0e4156SSadaf Ebrahimi ARM_GRP_THUMB2: "thumb2", 62*9a0e4156SSadaf Ebrahimi ARM_GRP_PREV8: "prev8", 63*9a0e4156SSadaf Ebrahimi ARM_GRP_FPVMLX: "fpvmlx", 64*9a0e4156SSadaf Ebrahimi ARM_GRP_MULOPS: "mulops", 65*9a0e4156SSadaf Ebrahimi ARM_GRP_CRC: "crc", 66*9a0e4156SSadaf Ebrahimi ARM_GRP_DPVFP: "dpvfp", 67*9a0e4156SSadaf Ebrahimi ARM_GRP_V6M: "v6m", 68*9a0e4156SSadaf Ebrahimi ARM_GRP_VIRTUALIZATION: "virtualization", 69*9a0e4156SSadaf Ebrahimi} 70*9a0e4156SSadaf Ebrahimi 71*9a0e4156SSadaf Ebrahimiarm64_dict = { 72*9a0e4156SSadaf Ebrahimi ARM64_GRP_JUMP: "jump", 73*9a0e4156SSadaf Ebrahimi ARM64_GRP_CALL: "call", 74*9a0e4156SSadaf Ebrahimi ARM64_GRP_RET: "return", 75*9a0e4156SSadaf Ebrahimi ARM64_GRP_INT: "int", 76*9a0e4156SSadaf Ebrahimi ARM64_GRP_PRIVILEGE: "privilege", 77*9a0e4156SSadaf Ebrahimi 78*9a0e4156SSadaf Ebrahimi ARM64_GRP_CRYPTO: "crypto", 79*9a0e4156SSadaf Ebrahimi ARM64_GRP_FPARMV8: "fparmv8", 80*9a0e4156SSadaf Ebrahimi ARM64_GRP_NEON: "neon", 81*9a0e4156SSadaf Ebrahimi ARM64_GRP_CRC: "crc" 82*9a0e4156SSadaf Ebrahimi} 83*9a0e4156SSadaf Ebrahimi 84*9a0e4156SSadaf Ebrahimimips_dict = { 85*9a0e4156SSadaf Ebrahimi MIPS_GRP_JUMP: "jump", 86*9a0e4156SSadaf Ebrahimi MIPS_GRP_CALL: "call", 87*9a0e4156SSadaf Ebrahimi MIPS_GRP_RET: "ret", 88*9a0e4156SSadaf Ebrahimi MIPS_GRP_INT: "int", 89*9a0e4156SSadaf Ebrahimi MIPS_GRP_IRET: "iret", 90*9a0e4156SSadaf Ebrahimi MIPS_GRP_PRIVILEGE: "privilege", 91*9a0e4156SSadaf Ebrahimi MIPS_GRP_BITCOUNT: "bitcount", 92*9a0e4156SSadaf Ebrahimi MIPS_GRP_DSP: "dsp", 93*9a0e4156SSadaf Ebrahimi MIPS_GRP_DSPR2: "dspr2", 94*9a0e4156SSadaf Ebrahimi MIPS_GRP_FPIDX: "fpidx", 95*9a0e4156SSadaf Ebrahimi MIPS_GRP_MSA: "msa", 96*9a0e4156SSadaf Ebrahimi MIPS_GRP_MIPS32R2: "mips32r2", 97*9a0e4156SSadaf Ebrahimi MIPS_GRP_MIPS64: "mips64", 98*9a0e4156SSadaf Ebrahimi MIPS_GRP_MIPS64R2: "mips64r2", 99*9a0e4156SSadaf Ebrahimi MIPS_GRP_SEINREG: "seinreg", 100*9a0e4156SSadaf Ebrahimi MIPS_GRP_STDENC: "stdenc", 101*9a0e4156SSadaf Ebrahimi MIPS_GRP_SWAP: "swap", 102*9a0e4156SSadaf Ebrahimi MIPS_GRP_MICROMIPS: "micromips", 103*9a0e4156SSadaf Ebrahimi MIPS_GRP_MIPS16MODE: "mips16mode", 104*9a0e4156SSadaf Ebrahimi MIPS_GRP_FP64BIT: "fp64bit", 105*9a0e4156SSadaf Ebrahimi MIPS_GRP_NONANSFPMATH: "nonansfpmath", 106*9a0e4156SSadaf Ebrahimi MIPS_GRP_NOTFP64BIT: "notfp64bit", 107*9a0e4156SSadaf Ebrahimi MIPS_GRP_NOTINMICROMIPS: "notinmicromips", 108*9a0e4156SSadaf Ebrahimi MIPS_GRP_NOTNACL: "notnacl", 109*9a0e4156SSadaf Ebrahimi 110*9a0e4156SSadaf Ebrahimi MIPS_GRP_NOTMIPS32R6: "notmips32r6", 111*9a0e4156SSadaf Ebrahimi MIPS_GRP_NOTMIPS64R6: "notmips64r6", 112*9a0e4156SSadaf Ebrahimi MIPS_GRP_CNMIPS: "cnmips", 113*9a0e4156SSadaf Ebrahimi 114*9a0e4156SSadaf Ebrahimi MIPS_GRP_MIPS32: "mips32", 115*9a0e4156SSadaf Ebrahimi MIPS_GRP_MIPS32R6: "mips32r6", 116*9a0e4156SSadaf Ebrahimi MIPS_GRP_MIPS64R6: "mips64r6", 117*9a0e4156SSadaf Ebrahimi 118*9a0e4156SSadaf Ebrahimi MIPS_GRP_MIPS2: "mips2", 119*9a0e4156SSadaf Ebrahimi MIPS_GRP_MIPS3: "mips3", 120*9a0e4156SSadaf Ebrahimi MIPS_GRP_MIPS3_32: "mips3_32", 121*9a0e4156SSadaf Ebrahimi MIPS_GRP_MIPS3_32R2: "mips3_32r2", 122*9a0e4156SSadaf Ebrahimi 123*9a0e4156SSadaf Ebrahimi MIPS_GRP_MIPS4_32: "mips4_32", 124*9a0e4156SSadaf Ebrahimi MIPS_GRP_MIPS4_32R2: "mips4_32r2", 125*9a0e4156SSadaf Ebrahimi MIPS_GRP_MIPS5_32R2: "mips5_32r2", 126*9a0e4156SSadaf Ebrahimi 127*9a0e4156SSadaf Ebrahimi MIPS_GRP_GP32BIT: "gp32bit", 128*9a0e4156SSadaf Ebrahimi MIPS_GRP_GP64BIT: "gp64bit", 129*9a0e4156SSadaf Ebrahimi} 130*9a0e4156SSadaf Ebrahimi 131*9a0e4156SSadaf Ebrahimippc_dict = { 132*9a0e4156SSadaf Ebrahimi PPC_GRP_JUMP: "jump", 133*9a0e4156SSadaf Ebrahimi 134*9a0e4156SSadaf Ebrahimi PPC_GRP_ALTIVEC: "altivec", 135*9a0e4156SSadaf Ebrahimi PPC_GRP_MODE32: "mode32", 136*9a0e4156SSadaf Ebrahimi PPC_GRP_MODE64: "mode64", 137*9a0e4156SSadaf Ebrahimi PPC_GRP_BOOKE: "booke", 138*9a0e4156SSadaf Ebrahimi PPC_GRP_NOTBOOKE: "notbooke", 139*9a0e4156SSadaf Ebrahimi PPC_GRP_SPE: "spe", 140*9a0e4156SSadaf Ebrahimi PPC_GRP_VSX: "vsx", 141*9a0e4156SSadaf Ebrahimi PPC_GRP_E500: "e500", 142*9a0e4156SSadaf Ebrahimi PPC_GRP_PPC4XX: "ppc4xx", 143*9a0e4156SSadaf Ebrahimi PPC_GRP_PPC6XX: "ppc6xx", 144*9a0e4156SSadaf Ebrahimi PPC_GRP_ICBT: "icbt", 145*9a0e4156SSadaf Ebrahimi PPC_GRP_P8ALTIVEC: "p8altivec", 146*9a0e4156SSadaf Ebrahimi PPC_GRP_P8VECTOR: "p8vector", 147*9a0e4156SSadaf Ebrahimi PPC_GRP_QPX: "qpx", 148*9a0e4156SSadaf Ebrahimi} 149*9a0e4156SSadaf Ebrahimi 150*9a0e4156SSadaf Ebrahimisparc_dict = { 151*9a0e4156SSadaf Ebrahimi SPARC_GRP_JUMP: "jump", 152*9a0e4156SSadaf Ebrahimi 153*9a0e4156SSadaf Ebrahimi SPARC_GRP_HARDQUAD: "hardquad", 154*9a0e4156SSadaf Ebrahimi SPARC_GRP_V9: "v9", 155*9a0e4156SSadaf Ebrahimi SPARC_GRP_VIS: "vis", 156*9a0e4156SSadaf Ebrahimi SPARC_GRP_VIS2: "vis2", 157*9a0e4156SSadaf Ebrahimi SPARC_GRP_VIS3: "vis3", 158*9a0e4156SSadaf Ebrahimi SPARC_GRP_32BIT: "32bit", 159*9a0e4156SSadaf Ebrahimi SPARC_GRP_64BIT: "64bit", 160*9a0e4156SSadaf Ebrahimi} 161*9a0e4156SSadaf Ebrahimi 162*9a0e4156SSadaf Ebrahimisysz_dict = { 163*9a0e4156SSadaf Ebrahimi SYSZ_GRP_JUMP: "jump", 164*9a0e4156SSadaf Ebrahimi 165*9a0e4156SSadaf Ebrahimi SYSZ_GRP_DISTINCTOPS: "distinctops", 166*9a0e4156SSadaf Ebrahimi SYSZ_GRP_FPEXTENSION: "fpextension", 167*9a0e4156SSadaf Ebrahimi SYSZ_GRP_HIGHWORD: "highword", 168*9a0e4156SSadaf Ebrahimi SYSZ_GRP_INTERLOCKEDACCESS1: "interlockedaccess1", 169*9a0e4156SSadaf Ebrahimi SYSZ_GRP_LOADSTOREONCOND: "loadstoreoncond", 170*9a0e4156SSadaf Ebrahimi} 171*9a0e4156SSadaf Ebrahimi 172*9a0e4156SSadaf Ebrahimix86_dict = { 173*9a0e4156SSadaf Ebrahimi X86_GRP_JUMP: "jump", 174*9a0e4156SSadaf Ebrahimi X86_GRP_CALL: "call", 175*9a0e4156SSadaf Ebrahimi X86_GRP_RET: "ret", 176*9a0e4156SSadaf Ebrahimi X86_GRP_INT: "int", 177*9a0e4156SSadaf Ebrahimi X86_GRP_IRET: "iret", 178*9a0e4156SSadaf Ebrahimi X86_GRP_PRIVILEGE: "privilege", 179*9a0e4156SSadaf Ebrahimi 180*9a0e4156SSadaf Ebrahimi X86_GRP_VM: "vm", 181*9a0e4156SSadaf Ebrahimi X86_GRP_3DNOW: "3dnow", 182*9a0e4156SSadaf Ebrahimi X86_GRP_AES: "aes", 183*9a0e4156SSadaf Ebrahimi X86_GRP_ADX: "adx", 184*9a0e4156SSadaf Ebrahimi X86_GRP_AVX: "avx", 185*9a0e4156SSadaf Ebrahimi X86_GRP_AVX2: "avx2", 186*9a0e4156SSadaf Ebrahimi X86_GRP_AVX512: "avx512", 187*9a0e4156SSadaf Ebrahimi X86_GRP_BMI: "bmi", 188*9a0e4156SSadaf Ebrahimi X86_GRP_BMI2: "bmi2", 189*9a0e4156SSadaf Ebrahimi X86_GRP_CMOV: "cmov", 190*9a0e4156SSadaf Ebrahimi X86_GRP_F16C: "fc16", 191*9a0e4156SSadaf Ebrahimi X86_GRP_FMA: "fma", 192*9a0e4156SSadaf Ebrahimi X86_GRP_FMA4: "fma4", 193*9a0e4156SSadaf Ebrahimi X86_GRP_FSGSBASE: "fsgsbase", 194*9a0e4156SSadaf Ebrahimi X86_GRP_HLE: "hle", 195*9a0e4156SSadaf Ebrahimi X86_GRP_MMX: "mmx", 196*9a0e4156SSadaf Ebrahimi X86_GRP_MODE32: "mode32", 197*9a0e4156SSadaf Ebrahimi X86_GRP_MODE64: "mode64", 198*9a0e4156SSadaf Ebrahimi X86_GRP_RTM: "rtm", 199*9a0e4156SSadaf Ebrahimi X86_GRP_SHA: "sha", 200*9a0e4156SSadaf Ebrahimi X86_GRP_SSE1: "sse1", 201*9a0e4156SSadaf Ebrahimi X86_GRP_SSE2: "sse2", 202*9a0e4156SSadaf Ebrahimi X86_GRP_SSE3: "sse3", 203*9a0e4156SSadaf Ebrahimi X86_GRP_SSE41: "sse41", 204*9a0e4156SSadaf Ebrahimi X86_GRP_SSE42: "sse42", 205*9a0e4156SSadaf Ebrahimi X86_GRP_SSE4A: "sse4a", 206*9a0e4156SSadaf Ebrahimi X86_GRP_SSSE3: "ssse3", 207*9a0e4156SSadaf Ebrahimi X86_GRP_PCLMUL: "pclmul", 208*9a0e4156SSadaf Ebrahimi X86_GRP_XOP: "xop", 209*9a0e4156SSadaf Ebrahimi X86_GRP_CDI: "cdi", 210*9a0e4156SSadaf Ebrahimi X86_GRP_ERI: "eri", 211*9a0e4156SSadaf Ebrahimi X86_GRP_TBM: "tbm", 212*9a0e4156SSadaf Ebrahimi X86_GRP_16BITMODE: "16bitmode", 213*9a0e4156SSadaf Ebrahimi X86_GRP_NOT64BITMODE: "not64bitmode", 214*9a0e4156SSadaf Ebrahimi X86_GRP_SGX: "sgx", 215*9a0e4156SSadaf Ebrahimi X86_GRP_DQI: "dqi", 216*9a0e4156SSadaf Ebrahimi X86_GRP_BWI: "bwi", 217*9a0e4156SSadaf Ebrahimi X86_GRP_PFI: "pfi", 218*9a0e4156SSadaf Ebrahimi X86_GRP_VLX: "vlx", 219*9a0e4156SSadaf Ebrahimi X86_GRP_SMAP: "smap", 220*9a0e4156SSadaf Ebrahimi X86_GRP_NOVLX: "novlx", 221*9a0e4156SSadaf Ebrahimi} 222*9a0e4156SSadaf Ebrahimi 223*9a0e4156SSadaf Ebrahimixcore_dict = { 224*9a0e4156SSadaf Ebrahimi XCORE_GRP_JUMP: "jump", 225*9a0e4156SSadaf Ebrahimi} 226*9a0e4156SSadaf Ebrahimi 227*9a0e4156SSadaf Ebrahimitests = [ 228*9a0e4156SSadaf Ebrahimi GroupTest('arm', CS_ARCH_ARM, CS_MODE_THUMB, arm_dict), 229*9a0e4156SSadaf Ebrahimi GroupTest('arm64', CS_ARCH_ARM64, CS_MODE_ARM, arm64_dict), 230*9a0e4156SSadaf Ebrahimi GroupTest('mips', CS_ARCH_MIPS, CS_MODE_MIPS32 | CS_MODE_BIG_ENDIAN, mips_dict), 231*9a0e4156SSadaf Ebrahimi GroupTest('ppc', CS_ARCH_PPC, CS_MODE_BIG_ENDIAN, ppc_dict), 232*9a0e4156SSadaf Ebrahimi GroupTest('sparc', CS_ARCH_SPARC, CS_MODE_BIG_ENDIAN, sparc_dict), 233*9a0e4156SSadaf Ebrahimi GroupTest('sysz', CS_ARCH_SYSZ, CS_MODE_BIG_ENDIAN, sysz_dict), 234*9a0e4156SSadaf Ebrahimi GroupTest('x86', CS_ARCH_X86, CS_MODE_32, x86_dict), 235*9a0e4156SSadaf Ebrahimi GroupTest('xcore', CS_ARCH_XCORE, CS_MODE_BIG_ENDIAN, xcore_dict), 236*9a0e4156SSadaf Ebrahimi GroupTest('m68k', CS_ARCH_M68K, CS_MODE_BIG_ENDIAN, xcore_dict), 237*9a0e4156SSadaf Ebrahimi] 238*9a0e4156SSadaf Ebrahimi 239*9a0e4156SSadaf Ebrahimiif __name__ == '__main__': 240*9a0e4156SSadaf Ebrahimi args = sys.argv[1:] 241*9a0e4156SSadaf Ebrahimi all = len(args) == 0 or 'all' in args 242*9a0e4156SSadaf Ebrahimi for t in tests: 243*9a0e4156SSadaf Ebrahimi if all or t.name in args: 244*9a0e4156SSadaf Ebrahimi t.run() 245*9a0e4156SSadaf Ebrahimi else: 246*9a0e4156SSadaf Ebrahimi print('Skipping %s' %t.name) 247*9a0e4156SSadaf Ebrahimi 248