Path: blob/master/libs/capstone/arch/AArch64/AArch64Mapping.c
4393 views
/* Capstone Disassembly Engine */1/* By Nguyen Anh Quynh <[email protected]>, 2013-2019 */23#ifdef CAPSTONE_HAS_ARM6445#include <stdio.h> // debug6#include <string.h>78#include "../../utils.h"910#include "AArch64Mapping.h"1112#define GET_INSTRINFO_ENUM13#include "AArch64GenInstrInfo.inc"1415#ifndef CAPSTONE_DIET16// NOTE: this reg_name_maps[] reflects the order of registers in arm64_reg17static const char * const reg_name_maps[] = {18NULL, /* ARM64_REG_INVALID */1920"ffr",21"fp",22"lr",23"nzcv",24"sp",25"vg",26"wsp",27"wzr",28"xzr",2930"za",3132"b0",33"b1",34"b2",35"b3",36"b4",37"b5",38"b6",39"b7",40"b8",41"b9",42"b10",43"b11",44"b12",45"b13",46"b14",47"b15",48"b16",49"b17",50"b18",51"b19",52"b20",53"b21",54"b22",55"b23",56"b24",57"b25",58"b26",59"b27",60"b28",61"b29",62"b30",63"b31",6465"d0",66"d1",67"d2",68"d3",69"d4",70"d5",71"d6",72"d7",73"d8",74"d9",75"d10",76"d11",77"d12",78"d13",79"d14",80"d15",81"d16",82"d17",83"d18",84"d19",85"d20",86"d21",87"d22",88"d23",89"d24",90"d25",91"d26",92"d27",93"d28",94"d29",95"d30",96"d31",9798"h0",99"h1",100"h2",101"h3",102"h4",103"h5",104"h6",105"h7",106"h8",107"h9",108"h10",109"h11",110"h12",111"h13",112"h14",113"h15",114"h16",115"h17",116"h18",117"h19",118"h20",119"h21",120"h22",121"h23",122"h24",123"h25",124"h26",125"h27",126"h28",127"h29",128"h30",129"h31",130131"p0",132"p1",133"p2",134"p3",135"p4",136"p5",137"p6",138"p7",139"p8",140"p9",141"p10",142"p11",143"p12",144"p13",145"p14",146"p15",147148"q0",149"q1",150"q2",151"q3",152"q4",153"q5",154"q6",155"q7",156"q8",157"q9",158"q10",159"q11",160"q12",161"q13",162"q14",163"q15",164"q16",165"q17",166"q18",167"q19",168"q20",169"q21",170"q22",171"q23",172"q24",173"q25",174"q26",175"q27",176"q28",177"q29",178"q30",179"q31",180181"s0",182"s1",183"s2",184"s3",185"s4",186"s5",187"s6",188"s7",189"s8",190"s9",191"s10",192"s11",193"s12",194"s13",195"s14",196"s15",197"s16",198"s17",199"s18",200"s19",201"s20",202"s21",203"s22",204"s23",205"s24",206"s25",207"s26",208"s27",209"s28",210"s29",211"s30",212"s31",213214"w0",215"w1",216"w2",217"w3",218"w4",219"w5",220"w6",221"w7",222"w8",223"w9",224"w10",225"w11",226"w12",227"w13",228"w14",229"w15",230"w16",231"w17",232"w18",233"w19",234"w20",235"w21",236"w22",237"w23",238"w24",239"w25",240"w26",241"w27",242"w28",243"w29",244"w30",245246"x0",247"x1",248"x2",249"x3",250"x4",251"x5",252"x6",253"x7",254"x8",255"x9",256"x10",257"x11",258"x12",259"x13",260"x14",261"x15",262"x16",263"x17",264"x18",265"x19",266"x20",267"x21",268"x22",269"x23",270"x24",271"x25",272"x26",273"x27",274"x28",275276"z0",277"z1",278"z2",279"z3",280"z4",281"z5",282"z6",283"z7",284"z8",285"z9",286"z10",287"z11",288"z12",289"z13",290"z14",291"z15",292"z16",293"z17",294"z18",295"z19",296"z20",297"z21",298"z22",299"z23",300"z24",301"z25",302"z26",303"z27",304"z28",305"z29",306"z30",307"z31",308309"zab0",310311"zad0",312"zad1",313"zad2",314"zad3",315"zad4",316"zad5",317"zad6",318"zad7",319320"zah0",321"zah1",322323"zaq0",324"zaq1",325"zaq2",326"zaq3",327"zaq4",328"zaq5",329"zaq6",330"zaq7",331"zaq8",332"zaq9",333"zaq10",334"zaq11",335"zaq12",336"zaq13",337"zaq14",338"zaq15",339340"zas0",341"zas1",342"zas2",343"zas3",344345"v0",346"v1",347"v2",348"v3",349"v4",350"v5",351"v6",352"v7",353"v8",354"v9",355"v10",356"v11",357"v12",358"v13",359"v14",360"v15",361"v16",362"v17",363"v18",364"v19",365"v20",366"v21",367"v22",368"v23",369"v24",370"v25",371"v26",372"v27",373"v28",374"v29",375"v30",376"v31",377};378#endif379380const char *AArch64_reg_name(csh handle, unsigned int reg)381{382#ifndef CAPSTONE_DIET383if (reg >= ARR_SIZE(reg_name_maps))384return NULL;385386return reg_name_maps[reg];387#else388return NULL;389#endif390}391392static const insn_map insns[] = {393// dummy item394{3950, 0,396#ifndef CAPSTONE_DIET397{ 0 }, { 0 }, { 0 }, 0, 0398#endif399},400401#include "AArch64MappingInsn.inc"402};403404// given internal insn id, return public instruction info405void AArch64_get_insn_id(cs_struct *h, cs_insn *insn, unsigned int id)406{407int i = insn_find(insns, ARR_SIZE(insns), id, &h->insn_cache);408if (i != 0) {409insn->id = insns[i].mapid;410411if (h->detail) {412#ifndef CAPSTONE_DIET413cs_struct handle;414handle.detail = h->detail;415416memcpy(insn->detail->regs_read, insns[i].regs_use, sizeof(insns[i].regs_use));417insn->detail->regs_read_count = (uint8_t)count_positive(insns[i].regs_use);418419memcpy(insn->detail->regs_write, insns[i].regs_mod, sizeof(insns[i].regs_mod));420insn->detail->regs_write_count = (uint8_t)count_positive(insns[i].regs_mod);421422memcpy(insn->detail->groups, insns[i].groups, sizeof(insns[i].groups));423insn->detail->groups_count = (uint8_t)count_positive8(insns[i].groups);424425insn->detail->arm64.update_flags = cs_reg_write((csh)&handle, insn, ARM64_REG_NZCV);426#endif427}428}429}430431static const char * const insn_name_maps[] = {432NULL, // ARM64_INS_INVALID433#include "AArch64MappingInsnName.inc"434"sbfiz",435"ubfiz",436"sbfx",437"ubfx",438"bfi",439"bfxil",440"ic",441"dc",442"at",443"tlbi",444"smstart",445"smstop",446};447448const char *AArch64_insn_name(csh handle, unsigned int id)449{450#ifndef CAPSTONE_DIET451if (id >= ARM64_INS_ENDING)452return NULL;453454if (id < ARR_SIZE(insn_name_maps))455return insn_name_maps[id];456457// not found458return NULL;459#else460return NULL;461#endif462}463464#ifndef CAPSTONE_DIET465static const name_map group_name_maps[] = {466// generic groups467{ ARM64_GRP_INVALID, NULL },468{ ARM64_GRP_JUMP, "jump" },469{ ARM64_GRP_CALL, "call" },470{ ARM64_GRP_RET, "return" },471{ ARM64_GRP_PRIVILEGE, "privilege" },472{ ARM64_GRP_INT, "int" },473{ ARM64_GRP_BRANCH_RELATIVE, "branch_relative" },474{ ARM64_GRP_PAC, "pointer authentication" },475476// architecture-specific groups477{ ARM64_GRP_CRYPTO, "crypto" },478{ ARM64_GRP_FPARMV8, "fparmv8" },479{ ARM64_GRP_NEON, "neon" },480{ ARM64_GRP_CRC, "crc" },481482{ ARM64_GRP_AES, "aes" },483{ ARM64_GRP_DOTPROD, "dotprod" },484{ ARM64_GRP_FULLFP16, "fullfp16" },485{ ARM64_GRP_LSE, "lse" },486{ ARM64_GRP_RCPC, "rcpc" },487{ ARM64_GRP_RDM, "rdm" },488{ ARM64_GRP_SHA2, "sha2" },489{ ARM64_GRP_SHA3, "sha3" },490{ ARM64_GRP_SM4, "sm4" },491{ ARM64_GRP_SVE, "sve" },492{ ARM64_GRP_SVE2, "sve2" },493{ ARM64_GRP_SVE2AES, "sve2-aes" },494{ ARM64_GRP_SVE2BitPerm, "sve2-bitperm" },495{ ARM64_GRP_SVE2SHA3, "sve2-sha3" },496{ ARM64_GRP_SVE2SM4, "sve2-sm4" },497{ ARM64_GRP_SME, "sme" },498{ ARM64_GRP_SMEF64, "sme-f64" },499{ ARM64_GRP_SMEI64, "sme-i64" },500{ ARM64_GRP_MatMulFP32, "f32mm" },501{ ARM64_GRP_MatMulFP64, "f64mm" },502{ ARM64_GRP_MatMulInt8, "i8mm" },503{ ARM64_GRP_V8_1A, "v8_1a" },504{ ARM64_GRP_V8_3A, "v8_3a" },505{ ARM64_GRP_V8_4A, "v8_4a" },506};507#endif508509const char *AArch64_group_name(csh handle, unsigned int id)510{511#ifndef CAPSTONE_DIET512return id2name(group_name_maps, ARR_SIZE(group_name_maps), id);513#else514return NULL;515#endif516}517518// map instruction name to public instruction ID519arm64_insn AArch64_map_insn(const char *name)520{521unsigned int i;522523for(i = 1; i < ARR_SIZE(insn_name_maps); i++) {524if (!strcmp(name, insn_name_maps[i]))525return i;526}527528// not found529return ARM64_INS_INVALID;530}531532// map internal raw vregister to 'public' register533arm64_reg AArch64_map_vregister(unsigned int r)534{535static const unsigned short RegAsmOffsetvreg[] = {536#include "AArch64GenRegisterV.inc"537};538539if (r < ARR_SIZE(RegAsmOffsetvreg))540return RegAsmOffsetvreg[r - 1];541542// cannot find this register543return 0;544}545546static const name_map sys_op_name_map[] = {547{ ARM64_TLBI_ALLE1, "alle1"} ,548{ ARM64_TLBI_ALLE1IS, "alle1is"} ,549{ ARM64_TLBI_ALLE1ISNXS, "alle1isnxs"} ,550{ ARM64_TLBI_ALLE1NXS, "alle1nxs"} ,551{ ARM64_TLBI_ALLE1OS, "alle1os"} ,552{ ARM64_TLBI_ALLE1OSNXS, "alle1osnxs"} ,553{ ARM64_TLBI_ALLE2, "alle2"} ,554{ ARM64_TLBI_ALLE2IS, "alle2is"} ,555{ ARM64_TLBI_ALLE2ISNXS, "alle2isnxs"} ,556{ ARM64_TLBI_ALLE2NXS, "alle2nxs"} ,557{ ARM64_TLBI_ALLE2OS, "alle2os"} ,558{ ARM64_TLBI_ALLE2OSNXS, "alle2osnxs"} ,559{ ARM64_TLBI_ALLE3, "alle3"} ,560{ ARM64_TLBI_ALLE3IS, "alle3is"} ,561{ ARM64_TLBI_ALLE3ISNXS, "alle3isnxs"} ,562{ ARM64_TLBI_ALLE3NXS, "alle3nxs"} ,563{ ARM64_TLBI_ALLE3OS, "alle3os"} ,564{ ARM64_TLBI_ALLE3OSNXS, "alle3osnxs"} ,565{ ARM64_TLBI_ASIDE1, "aside1"} ,566{ ARM64_TLBI_ASIDE1IS, "aside1is"} ,567{ ARM64_TLBI_ASIDE1ISNXS, "aside1isnxs"} ,568{ ARM64_TLBI_ASIDE1NXS, "aside1nxs"} ,569{ ARM64_TLBI_ASIDE1OS, "aside1os"} ,570{ ARM64_TLBI_ASIDE1OSNXS, "aside1osnxs"} ,571{ ARM64_TLBI_IPAS2E1, "ipas2e1"} ,572{ ARM64_TLBI_IPAS2E1IS, "ipas2e1is"} ,573{ ARM64_TLBI_IPAS2E1ISNXS, "ipas2e1isnxs"} ,574{ ARM64_TLBI_IPAS2E1NXS, "ipas2e1nxs"} ,575{ ARM64_TLBI_IPAS2E1OS, "ipas2e1os"} ,576{ ARM64_TLBI_IPAS2E1OSNXS, "ipas2e1osnxs"} ,577{ ARM64_TLBI_IPAS2LE1, "ipas2le1"} ,578{ ARM64_TLBI_IPAS2LE1IS, "ipas2le1is"} ,579{ ARM64_TLBI_IPAS2LE1ISNXS, "ipas2le1isnxs"} ,580{ ARM64_TLBI_IPAS2LE1NXS, "ipas2le1nxs"} ,581{ ARM64_TLBI_IPAS2LE1OS, "ipas2le1os"} ,582{ ARM64_TLBI_IPAS2LE1OSNXS, "ipas2le1osnxs"} ,583{ ARM64_TLBI_PAALL, "paall"} ,584{ ARM64_TLBI_PAALLNXS, "paallnxs"} ,585{ ARM64_TLBI_PAALLOS, "paallos"} ,586{ ARM64_TLBI_PAALLOSNXS, "paallosnxs"} ,587{ ARM64_TLBI_RIPAS2E1, "ripas2e1"} ,588{ ARM64_TLBI_RIPAS2E1IS, "ripas2e1is"} ,589{ ARM64_TLBI_RIPAS2E1ISNXS, "ripas2e1isnxs"} ,590{ ARM64_TLBI_RIPAS2E1NXS, "ripas2e1nxs"} ,591{ ARM64_TLBI_RIPAS2E1OS, "ripas2e1os"} ,592{ ARM64_TLBI_RIPAS2E1OSNXS, "ripas2e1osnxs"} ,593{ ARM64_TLBI_RIPAS2LE1, "ripas2le1"} ,594{ ARM64_TLBI_RIPAS2LE1IS, "ripas2le1is"} ,595{ ARM64_TLBI_RIPAS2LE1ISNXS, "ripas2le1isnxs"} ,596{ ARM64_TLBI_RIPAS2LE1NXS, "ripas2le1nxs"} ,597{ ARM64_TLBI_RIPAS2LE1OS, "ripas2le1os"} ,598{ ARM64_TLBI_RIPAS2LE1OSNXS, "ripas2le1osnxs"} ,599{ ARM64_TLBI_RPALOS, "rpalos"} ,600{ ARM64_TLBI_RPALOSNXS, "rpalosnxs"} ,601{ ARM64_TLBI_RPAOS, "rpaos"} ,602{ ARM64_TLBI_RPAOSNXS, "rpaosnxs"} ,603{ ARM64_TLBI_RVAAE1, "rvaae1"} ,604{ ARM64_TLBI_RVAAE1IS, "rvaae1is"} ,605{ ARM64_TLBI_RVAAE1ISNXS, "rvaae1isnxs"} ,606{ ARM64_TLBI_RVAAE1NXS, "rvaae1nxs"} ,607{ ARM64_TLBI_RVAAE1OS, "rvaae1os"} ,608{ ARM64_TLBI_RVAAE1OSNXS, "rvaae1osnxs"} ,609{ ARM64_TLBI_RVAALE1, "rvaale1"} ,610{ ARM64_TLBI_RVAALE1IS, "rvaale1is"} ,611{ ARM64_TLBI_RVAALE1ISNXS, "rvaale1isnxs"} ,612{ ARM64_TLBI_RVAALE1NXS, "rvaale1nxs"} ,613{ ARM64_TLBI_RVAALE1OS, "rvaale1os"} ,614{ ARM64_TLBI_RVAALE1OSNXS, "rvaale1osnxs"} ,615{ ARM64_TLBI_RVAE1, "rvae1"} ,616{ ARM64_TLBI_RVAE1IS, "rvae1is"} ,617{ ARM64_TLBI_RVAE1ISNXS, "rvae1isnxs"} ,618{ ARM64_TLBI_RVAE1NXS, "rvae1nxs"} ,619{ ARM64_TLBI_RVAE1OS, "rvae1os"} ,620{ ARM64_TLBI_RVAE1OSNXS, "rvae1osnxs"} ,621{ ARM64_TLBI_RVAE2, "rvae2"} ,622{ ARM64_TLBI_RVAE2IS, "rvae2is"} ,623{ ARM64_TLBI_RVAE2ISNXS, "rvae2isnxs"} ,624{ ARM64_TLBI_RVAE2NXS, "rvae2nxs"} ,625{ ARM64_TLBI_RVAE2OS, "rvae2os"} ,626{ ARM64_TLBI_RVAE2OSNXS, "rvae2osnxs"} ,627{ ARM64_TLBI_RVAE3, "rvae3"} ,628{ ARM64_TLBI_RVAE3IS, "rvae3is"} ,629{ ARM64_TLBI_RVAE3ISNXS, "rvae3isnxs"} ,630{ ARM64_TLBI_RVAE3NXS, "rvae3nxs"} ,631{ ARM64_TLBI_RVAE3OS, "rvae3os"} ,632{ ARM64_TLBI_RVAE3OSNXS, "rvae3osnxs"} ,633{ ARM64_TLBI_RVALE1, "rvale1"} ,634{ ARM64_TLBI_RVALE1IS, "rvale1is"} ,635{ ARM64_TLBI_RVALE1ISNXS, "rvale1isnxs"} ,636{ ARM64_TLBI_RVALE1NXS, "rvale1nxs"} ,637{ ARM64_TLBI_RVALE1OS, "rvale1os"} ,638{ ARM64_TLBI_RVALE1OSNXS, "rvale1osnxs"} ,639{ ARM64_TLBI_RVALE2, "rvale2"} ,640{ ARM64_TLBI_RVALE2IS, "rvale2is"} ,641{ ARM64_TLBI_RVALE2ISNXS, "rvale2isnxs"} ,642{ ARM64_TLBI_RVALE2NXS, "rvale2nxs"} ,643{ ARM64_TLBI_RVALE2OS, "rvale2os"} ,644{ ARM64_TLBI_RVALE2OSNXS, "rvale2osnxs"} ,645{ ARM64_TLBI_RVALE3, "rvale3"} ,646{ ARM64_TLBI_RVALE3IS, "rvale3is"} ,647{ ARM64_TLBI_RVALE3ISNXS, "rvale3isnxs"} ,648{ ARM64_TLBI_RVALE3NXS, "rvale3nxs"} ,649{ ARM64_TLBI_RVALE3OS, "rvale3os"} ,650{ ARM64_TLBI_RVALE3OSNXS, "rvale3osnxs"} ,651{ ARM64_TLBI_VAAE1, "vaae1"} ,652{ ARM64_TLBI_VAAE1IS, "vaae1is"} ,653{ ARM64_TLBI_VAAE1ISNXS, "vaae1isnxs"} ,654{ ARM64_TLBI_VAAE1NXS, "vaae1nxs"} ,655{ ARM64_TLBI_VAAE1OS, "vaae1os"} ,656{ ARM64_TLBI_VAAE1OSNXS, "vaae1osnxs"} ,657{ ARM64_TLBI_VAALE1, "vaale1"} ,658{ ARM64_TLBI_VAALE1IS, "vaale1is"} ,659{ ARM64_TLBI_VAALE1ISNXS, "vaale1isnxs"} ,660{ ARM64_TLBI_VAALE1NXS, "vaale1nxs"} ,661{ ARM64_TLBI_VAALE1OS, "vaale1os"} ,662{ ARM64_TLBI_VAALE1OSNXS, "vaale1osnxs"} ,663{ ARM64_TLBI_VAE1, "vae1"} ,664{ ARM64_TLBI_VAE1IS, "vae1is"} ,665{ ARM64_TLBI_VAE1ISNXS, "vae1isnxs"} ,666{ ARM64_TLBI_VAE1NXS, "vae1nxs"} ,667{ ARM64_TLBI_VAE1OS, "vae1os"} ,668{ ARM64_TLBI_VAE1OSNXS, "vae1osnxs"} ,669{ ARM64_TLBI_VAE2, "vae2"} ,670{ ARM64_TLBI_VAE2IS, "vae2is"} ,671{ ARM64_TLBI_VAE2ISNXS, "vae2isnxs"} ,672{ ARM64_TLBI_VAE2NXS, "vae2nxs"} ,673{ ARM64_TLBI_VAE2OS, "vae2os"} ,674{ ARM64_TLBI_VAE2OSNXS, "vae2osnxs"} ,675{ ARM64_TLBI_VAE3, "vae3"} ,676{ ARM64_TLBI_VAE3IS, "vae3is"} ,677{ ARM64_TLBI_VAE3ISNXS, "vae3isnxs"} ,678{ ARM64_TLBI_VAE3NXS, "vae3nxs"} ,679{ ARM64_TLBI_VAE3OS, "vae3os"} ,680{ ARM64_TLBI_VAE3OSNXS, "vae3osnxs"} ,681{ ARM64_TLBI_VALE1, "vale1"} ,682{ ARM64_TLBI_VALE1IS, "vale1is"} ,683{ ARM64_TLBI_VALE1ISNXS, "vale1isnxs"} ,684{ ARM64_TLBI_VALE1NXS, "vale1nxs"} ,685{ ARM64_TLBI_VALE1OS, "vale1os"} ,686{ ARM64_TLBI_VALE1OSNXS, "vale1osnxs"} ,687{ ARM64_TLBI_VALE2, "vale2"} ,688{ ARM64_TLBI_VALE2IS, "vale2is"} ,689{ ARM64_TLBI_VALE2ISNXS, "vale2isnxs"} ,690{ ARM64_TLBI_VALE2NXS, "vale2nxs"} ,691{ ARM64_TLBI_VALE2OS, "vale2os"} ,692{ ARM64_TLBI_VALE2OSNXS, "vale2osnxs"} ,693{ ARM64_TLBI_VALE3, "vale3"} ,694{ ARM64_TLBI_VALE3IS, "vale3is"} ,695{ ARM64_TLBI_VALE3ISNXS, "vale3isnxs"} ,696{ ARM64_TLBI_VALE3NXS, "vale3nxs"} ,697{ ARM64_TLBI_VALE3OS, "vale3os"} ,698{ ARM64_TLBI_VALE3OSNXS, "vale3osnxs"} ,699{ ARM64_TLBI_VMALLE1, "vmalle1"} ,700{ ARM64_TLBI_VMALLE1IS, "vmalle1is"} ,701{ ARM64_TLBI_VMALLE1ISNXS, "vmalle1isnxs"} ,702{ ARM64_TLBI_VMALLE1NXS, "vmalle1nxs"} ,703{ ARM64_TLBI_VMALLE1OS, "vmalle1os"} ,704{ ARM64_TLBI_VMALLE1OSNXS, "vmalle1osnxs"} ,705{ ARM64_TLBI_VMALLS12E1, "vmalls12e1"} ,706{ ARM64_TLBI_VMALLS12E1IS, "vmalls12e1is"} ,707{ ARM64_TLBI_VMALLS12E1ISNXS, "vmalls12e1isnxs"} ,708{ ARM64_TLBI_VMALLS12E1NXS, "vmalls12e1nxs"} ,709{ ARM64_TLBI_VMALLS12E1OS, "vmalls12e1os"} ,710{ ARM64_TLBI_VMALLS12E1OSNXS, "vmalls12e1osnxs"} ,711{ ARM64_AT_S1E1R, "s1e1r"} ,712{ ARM64_AT_S1E2R, "s1e2r"} ,713{ ARM64_AT_S1E3R, "s1e3r"} ,714{ ARM64_AT_S1E1W, "s1e1w"} ,715{ ARM64_AT_S1E2W, "s1e2w"} ,716{ ARM64_AT_S1E3W, "s1e3w"} ,717{ ARM64_AT_S1E0R, "s1e0r"} ,718{ ARM64_AT_S1E0W, "s1e0w"} ,719{ ARM64_AT_S12E1R, "s12e1r"} ,720{ ARM64_AT_S12E1W, "s12e1w"} ,721{ ARM64_AT_S12E0R, "s12e0r"} ,722{ ARM64_AT_S12E0W, "s12e0w"} ,723{ ARM64_AT_S1E1RP, "s1e1rp"} ,724{ ARM64_AT_S1E1WP, "s1e1wp"} ,725{ ARM64_DC_CGDSW, "cgdsw"} ,726{ ARM64_DC_CGDVAC, "cgdvac"} ,727{ ARM64_DC_CGDVADP, "cgdvadp"} ,728{ ARM64_DC_CGDVAP, "cgdvap"} ,729{ ARM64_DC_CGSW, "cgsw"} ,730{ ARM64_DC_CGVAC, "cgvac"} ,731{ ARM64_DC_CGVADP, "cgvadp"} ,732{ ARM64_DC_CGVAP, "cgvap"} ,733{ ARM64_DC_CIGDSW, "cigdsw"} ,734{ ARM64_DC_CIGDVAC, "cigdvac"} ,735{ ARM64_DC_CIGSW, "cigsw"} ,736{ ARM64_DC_CIGVAC, "cigvac"} ,737{ ARM64_DC_CISW, "cisw"} ,738{ ARM64_DC_CIVAC, "civac"} ,739{ ARM64_DC_CSW, "csw"} ,740{ ARM64_DC_CVAC, "cvac"} ,741{ ARM64_DC_CVADP, "cvadp"} ,742{ ARM64_DC_CVAP, "cvap"} ,743{ ARM64_DC_CVAU, "cvau"} ,744{ ARM64_DC_GVA, "gva"} ,745{ ARM64_DC_GZVA, "gzva"} ,746{ ARM64_DC_IGDSW, "igdsw"} ,747{ ARM64_DC_IGDVAC, "igdvac"} ,748{ ARM64_DC_IGSW, "igsw"} ,749{ ARM64_DC_IGVAC, "igvac"} ,750{ ARM64_DC_ISW, "isw"} ,751{ ARM64_DC_IVAC, "ivac"} ,752{ ARM64_DC_ZVA, "zva"} ,753{ ARM64_IC_IALLUIS, "ialluis"} ,754{ ARM64_IC_IALLU, "iallu"} ,755{ ARM64_IC_IVAU, "ivau"} ,756};757758arm64_sys_op AArch64_map_sys_op(const char *name)759{760int result = name2id(sys_op_name_map, ARR_SIZE(sys_op_name_map), name);761if (result == -1) {762return ARM64_SYS_INVALID;763}764return result;765}766767void arm64_op_addReg(MCInst *MI, int reg)768{769if (MI->csh->detail) {770MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_REG;771MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].reg = reg;772MI->flat_insn->detail->arm64.op_count++;773}774}775776void arm64_op_addVectorArrSpecifier(MCInst * MI, int sp)777{778if (MI->csh->detail) {779MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count - 1].vas = sp;780}781}782783void arm64_op_addFP(MCInst *MI, float fp)784{785if (MI->csh->detail) {786MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_FP;787MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].fp = fp;788MI->flat_insn->detail->arm64.op_count++;789}790}791792void arm64_op_addImm(MCInst *MI, int64_t imm)793{794if (MI->csh->detail) {795MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].type = ARM64_OP_IMM;796MI->flat_insn->detail->arm64.operands[MI->flat_insn->detail->arm64.op_count].imm = (int)imm;797MI->flat_insn->detail->arm64.op_count++;798}799}800801#ifndef CAPSTONE_DIET802803// map instruction to its characteristics804typedef struct insn_op {805unsigned int eflags_update; // how this instruction update status flags806uint8_t access[5];807} insn_op;808809static const insn_op insn_ops[] = {810{811/* NULL item */8120, { 0 }813},814815#include "AArch64MappingInsnOp.inc"816};817818// given internal insn id, return operand access info819const uint8_t *AArch64_get_op_access(cs_struct *h, unsigned int id)820{821int i = insn_find(insns, ARR_SIZE(insns), id, &h->insn_cache);822if (i != 0) {823return insn_ops[i].access;824}825826return NULL;827}828829void AArch64_reg_access(const cs_insn *insn,830cs_regs regs_read, uint8_t *regs_read_count,831cs_regs regs_write, uint8_t *regs_write_count)832{833uint8_t i;834uint8_t read_count, write_count;835cs_arm64 *arm64 = &(insn->detail->arm64);836837read_count = insn->detail->regs_read_count;838write_count = insn->detail->regs_write_count;839840// implicit registers841memcpy(regs_read, insn->detail->regs_read, read_count * sizeof(insn->detail->regs_read[0]));842memcpy(regs_write, insn->detail->regs_write, write_count * sizeof(insn->detail->regs_write[0]));843844// explicit registers845for (i = 0; i < arm64->op_count; i++) {846cs_arm64_op *op = &(arm64->operands[i]);847switch((int)op->type) {848case ARM64_OP_REG:849if ((op->access & CS_AC_READ) && !arr_exist(regs_read, read_count, op->reg)) {850regs_read[read_count] = (uint16_t)op->reg;851read_count++;852}853if ((op->access & CS_AC_WRITE) && !arr_exist(regs_write, write_count, op->reg)) {854regs_write[write_count] = (uint16_t)op->reg;855write_count++;856}857break;858case ARM_OP_MEM:859// registers appeared in memory references always being read860if ((op->mem.base != ARM64_REG_INVALID) && !arr_exist(regs_read, read_count, op->mem.base)) {861regs_read[read_count] = (uint16_t)op->mem.base;862read_count++;863}864if ((op->mem.index != ARM64_REG_INVALID) && !arr_exist(regs_read, read_count, op->mem.index)) {865regs_read[read_count] = (uint16_t)op->mem.index;866read_count++;867}868if ((arm64->writeback) && (op->mem.base != ARM64_REG_INVALID) && !arr_exist(regs_write, write_count, op->mem.base)) {869regs_write[write_count] = (uint16_t)op->mem.base;870write_count++;871}872default:873break;874}875}876877*regs_read_count = read_count;878*regs_write_count = write_count;879}880#endif881882#endif883884885