nfp-dis.c 93 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994
  1. /* Print NFP instructions for objdump.
  2. Copyright (C) 2017-2022 Free Software Foundation, Inc.
  3. Contributed by Francois H. Theron <francois.theron@netronome.com>
  4. This file is part of the GNU opcodes library.
  5. This library is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 3, or (at your option)
  8. any later version.
  9. It is distributed in the hope that it will be useful, but WITHOUT
  10. ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  11. or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
  12. License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with this program; if not, write to the Free Software
  15. Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
  16. MA 02110-1301, USA. */
  17. /* There will be many magic numbers here that are based on hardware.
  18. Making #define macros for each encoded bit field will probably reduce
  19. readability far more than the simple numbers will, so we make sure that
  20. the context of the magic numbers make it clear what they are used for. */
  21. #include "sysdep.h"
  22. #include <stdio.h>
  23. #include "disassemble.h"
  24. #include "libiberty.h"
  25. #include "elf/nfp.h"
  26. #include "opcode/nfp.h"
  27. #include "opintl.h"
  28. #include "elf-bfd.h"
  29. #include "bfd.h"
  30. #include <stdint.h>
  31. #define _NFP_ERR_STOP -1
  32. #define _NFP_ERR_CONT -8
  33. #define _BTST(v, b) (((v) >> b) & 1)
  34. #define _BF(v, msb, lsb) (((v) >> (lsb)) & \
  35. ((1U << ((msb) - (lsb) + 1)) - 1))
  36. #define _BFS(v, msb, lsb, lshift) (_BF(v, msb, lsb) << (lshift))
  37. #define _NFP_ME27_28_CSR_CTX_ENABLES 0x18
  38. #define _NFP_ME27_28_CSR_MISC_CONTROL 0x160
  39. #define _NFP_ISLAND_MAX 64
  40. #define _NFP_ME_MAX 12
  41. typedef struct
  42. {
  43. unsigned char ctx4_mode:1;
  44. unsigned char addr_3rdparty32:1;
  45. unsigned char scs_cnt:2;
  46. unsigned char _future:4;
  47. }
  48. nfp_priv_mecfg;
  49. typedef struct
  50. {
  51. unsigned char show_pc;
  52. unsigned char ctx_mode;
  53. }
  54. nfp_opts;
  55. /* mecfgs[island][menum][is-text] */
  56. typedef struct
  57. {
  58. nfp_priv_mecfg mecfgs[_NFP_ISLAND_MAX][_NFP_ME_MAX][2];
  59. }
  60. nfp_priv_data;
  61. static const char *nfp_mealu_shf_op[8] =
  62. {
  63. /* 0b000 (0) */ "B",
  64. /* 0b001 (1) */ "~B",
  65. /* 0b010 (2) */ "AND",
  66. /* 0b011 (3) */ "~AND",
  67. /* 0b100 (4) */ "AND~",
  68. /* 0b101 (5) */ "OR",
  69. /* 0b110 (6) */ "asr",
  70. /* 0b111 (7) */ "byte_align"
  71. };
  72. static const char *nfp_me27_28_alu_op[32] =
  73. {
  74. /* 0b00000 (0) */ "B",
  75. /* 0b00001 (1) */ "+",
  76. NULL,
  77. /* 0b00011 (3) */ "pop_count3",
  78. /* 0b00100 (4) */ "~B",
  79. /* 0b00101 (5) */ "+16",
  80. /* 0b00110 (6) */ "pop_count1",
  81. /* 0b00111 (7) */ "pop_count2",
  82. /* 0b01000 (8) */ "AND",
  83. /* 0b01001 (9) */ "+8",
  84. NULL,
  85. /* 0b01011 (11) */ "cam_clear",
  86. /* 0b01100 (12) */ "~AND",
  87. /* 0b01101 (13) */ "-carry",
  88. /* 0b01110 (14) */ "ffs",
  89. /* 0b01111 (15) */ "cam_read_tag",
  90. /* 0b10000 (16) */ "AND~",
  91. /* 0b10001 (17) */ "+carry",
  92. /* 0b10010 (18) */ "CRC",
  93. /* 0b10011 (19) */ "cam_write",
  94. /* 0b10100 (20) */ "OR",
  95. /* 0b10101 (21) */ "-",
  96. NULL,
  97. /* 0b10111 (23) */ "cam_lookup",
  98. /* 0b11000 (24) */ "XOR",
  99. /* 0b11001 (25) */ "B-A",
  100. NULL,
  101. /* 0b11011 (27) */ "cam_write_state",
  102. NULL,
  103. NULL,
  104. NULL,
  105. /* 0b11111 (31) */ "cam_read_state"
  106. };
  107. static const char *nfp_me27_28_crc_op[8] =
  108. {
  109. /* 0b000 (0) */ "--",
  110. NULL,
  111. /* 0b010 (2) */ "crc_ccitt",
  112. NULL,
  113. /* 0b100 (4) */ "crc_32",
  114. /* 0b101 (5) */ "crc_iscsi",
  115. /* 0b110 (6) */ "crc_10",
  116. /* 0b111 (7) */ "crc_5"
  117. };
  118. static const char *nfp_me27_28_crc_bytes[8] =
  119. {
  120. /* 0b000 (0) */ "bytes_0_3",
  121. /* 0b001 (1) */ "bytes_1_3",
  122. /* 0b010 (2) */ "bytes_2_3",
  123. /* 0b011 (3) */ "byte_3",
  124. /* 0b100 (4) */ "bytes_0_2",
  125. /* 0b101 (5) */ "bytes_0_1",
  126. /* 0b110 (6) */ "byte_0"
  127. };
  128. static const char *nfp_me27_28_mecsrs[] =
  129. {
  130. /* 0x000 (0) */ "UstorAddr",
  131. /* 0x004 (1) */ "UstorDataLwr",
  132. /* 0x008 (2) */ "UstorDataUpr",
  133. /* 0x00c (3) */ "UstorErrStat",
  134. /* 0x010 (4) */ "ALUOut",
  135. /* 0x014 (5) */ "CtxArbCtrl",
  136. /* 0x018 (6) */ "CtxEnables",
  137. /* 0x01c (7) */ "CondCodeEn",
  138. /* 0x020 (8) */ "CSRCtxPtr",
  139. /* 0x024 (9) */ "PcBreakpoint0",
  140. /* 0x028 (10) */ "PcBreakpoint1",
  141. /* 0x02c (11) */ "PcBreakpointStatus",
  142. /* 0x030 (12) */ "RegErrStatus",
  143. /* 0x034 (13) */ "LMErrStatus",
  144. /* 0x038 (14) */ "LMeccErrorMask",
  145. NULL,
  146. /* 0x040 (16) */ "IndCtxStatus",
  147. /* 0x044 (17) */ "ActCtxStatus",
  148. /* 0x048 (18) */ "IndCtxSglEvt",
  149. /* 0x04c (19) */ "ActCtxSglEvt",
  150. /* 0x050 (20) */ "IndCtxWkpEvt",
  151. /* 0x054 (21) */ "ActCtxWkpEvt",
  152. /* 0x058 (22) */ "IndCtxFtrCnt",
  153. /* 0x05c (23) */ "ActCtxFtrCnt",
  154. /* 0x060 (24) */ "IndLMAddr0",
  155. /* 0x064 (25) */ "ActLMAddr0",
  156. /* 0x068 (26) */ "IndLMAddr1",
  157. /* 0x06c (27) */ "ActLMAddr1",
  158. /* 0x070 (28) */ "ByteIndex",
  159. /* 0x074 (29) */ "XferIndex",
  160. /* 0x078 (30) */ "IndFtrCntSgl",
  161. /* 0x07c (31) */ "ActFtrCntSgl",
  162. /* 0x080 (32) */ "NNPut",
  163. /* 0x084 (33) */ "NNGet",
  164. NULL,
  165. NULL,
  166. /* 0x090 (36) */ "IndLMAddr2",
  167. /* 0x094 (37) */ "ActLMAddr2",
  168. /* 0x098 (38) */ "IndLMAddr3",
  169. /* 0x09c (39) */ "ActLMAddr3",
  170. /* 0x0a0 (40) */ "IndLMAddr2BytIdx",
  171. /* 0x0a4 (41) */ "ActLMAddr2BytIdx",
  172. /* 0x0a8 (42) */ "IndLMAddr3BytIdx",
  173. /* 0x0ac (43) */ "ActLMAddr3BytIdx",
  174. /* 0x0b0 (44) */ "IndPredCC",
  175. NULL,
  176. NULL,
  177. NULL,
  178. /* 0x0c0 (48) */ "TimestampLow",
  179. /* 0x0c4 (49) */ "TimestampHgh",
  180. NULL,
  181. NULL,
  182. NULL,
  183. NULL,
  184. NULL,
  185. NULL,
  186. /* 0x0e0 (56) */ "IndLMAddr0BytIdx",
  187. /* 0x0e4 (57) */ "ActLMAddr0BytIdx",
  188. /* 0x0e8 (58) */ "IndLMAddr1BytIdx",
  189. /* 0x0ec (59) */ "ActLMAddr1BytIdx",
  190. NULL,
  191. /* 0x0f4 (61) */ "XfrAndBytIdx",
  192. NULL,
  193. NULL,
  194. /* 0x100 (64) */ "NxtNghbrSgl",
  195. /* 0x104 (65) */ "PrvNghbrSgl",
  196. /* 0x108 (66) */ "SameMESignal",
  197. NULL,
  198. NULL,
  199. NULL,
  200. NULL,
  201. NULL,
  202. NULL,
  203. NULL,
  204. NULL,
  205. NULL,
  206. NULL,
  207. NULL,
  208. NULL,
  209. NULL,
  210. /* 0x140 (80) */ "CRCRemainder",
  211. /* 0x144 (81) */ "ProfileCnt",
  212. /* 0x148 (82) */ "PseudoRndNum",
  213. NULL,
  214. NULL,
  215. NULL,
  216. NULL,
  217. NULL,
  218. /* 0x160 (88) */ "MiscControl",
  219. /* 0x164 (89) */ "PcBreakpoint0Mask",
  220. /* 0x168 (90) */ "PcBreakpoint1Mask",
  221. NULL,
  222. /* 0x170 (92) */ "Mailbox0",
  223. /* 0x174 (93) */ "Mailbox1",
  224. /* 0x178 (94) */ "Mailbox2",
  225. /* 0x17c (95) */ "Mailbox3",
  226. NULL,
  227. NULL,
  228. NULL,
  229. NULL,
  230. /* 0x190 (100) */ "CmdIndirectRef0"
  231. };
  232. const char *nfp_me27_28_br_ops[32] =
  233. {
  234. /* 0b00000 (0) */ "beq",
  235. /* 0b00001 (1) */ "bne",
  236. /* 0b00010 (2) */ "bmi",
  237. /* 0b00011 (3) */ "bpl",
  238. /* 0b00100 (4) */ "bcs",
  239. /* 0b00101 (5) */ "bcc",
  240. /* 0b00110 (6) */ "bvs",
  241. /* 0b00111 (7) */ "bvc",
  242. /* 0b01000 (8) */ "bge",
  243. /* 0b01001 (9) */ "blt",
  244. /* 0b01010 (10) */ "ble",
  245. /* 0b01011 (11) */ "bgt",
  246. /* (12) */ NULL,
  247. /* (13) */ NULL,
  248. /* (14) */ NULL,
  249. /* (15) */ NULL,
  250. /* 0b10000 (16) */ "br=ctx",
  251. /* 0b10001 (17) */ "br!=ctx",
  252. /* 0b10010 (18) */ "br_signal",
  253. /* 0b10011 (19) */ "br_!signal",
  254. /* 0b10100 (20) */ "br_inp_state",
  255. /* 0b10101 (21) */ "br_!inp_state",
  256. /* 0b10110 (22) */ "br_cls_state",
  257. /* 0b10111 (23) */ "br_!cls_state",
  258. /* 0b11000 (24) */ "br",
  259. /* (25) */ NULL,
  260. /* (26) */ NULL,
  261. /* (27) */ NULL,
  262. /* (28) */ NULL,
  263. /* (29) */ NULL,
  264. /* (30) */ NULL,
  265. /* (31) */ NULL
  266. };
  267. static const char *nfp_me27_br_inpstates[16] =
  268. {
  269. /* 0 */ "nn_empty",
  270. /* 1 */ "nn_full",
  271. /* 2 */ "scr_ring0_status",
  272. /* 3 */ "scr_ring1_status",
  273. /* 4 */ "scr_ring2_status",
  274. /* 5 */ "scr_ring3_status",
  275. /* 6 */ "scr_ring4_status",
  276. /* 7 */ "scr_ring5_status",
  277. /* 8 */ "scr_ring6_status",
  278. /* 9 */ "scr_ring7_status",
  279. /* 10 */ "scr_ring8_status",
  280. /* 11 */ "scr_ring9_status",
  281. /* 12 */ "scr_ring10_status",
  282. /* 13 */ "scr_ring11_status",
  283. /* 14 */ "fci_not_empty",
  284. /* 15 */ "fci_full"
  285. };
  286. static const char *nfp_me28_br_inpstates[16] =
  287. {
  288. /* 0 */ "nn_empty",
  289. /* 1 */ "nn_full",
  290. /* 2 */ "ctm_ring0_status",
  291. /* 3 */ "ctm_ring1_status",
  292. /* 4 */ "ctm_ring2_status",
  293. /* 5 */ "ctm_ring3_status",
  294. /* 6 */ "ctm_ring4_status",
  295. /* 7 */ "ctm_ring5_status",
  296. /* 8 */ "ctm_ring6_status",
  297. /* 9 */ "ctm_ring7_status",
  298. /* 10 */ "ctm_ring8_status",
  299. /* 11 */ "ctm_ring9_status",
  300. /* 12 */ "ctm_ring10_status",
  301. /* 13 */ "ctm_ring11_status",
  302. /* 14 */ "ctm_ring12_status",
  303. /* 15 */ "ctm_ring13_status"
  304. };
  305. static const char *nfp_me27_28_mult_steps[8] =
  306. {
  307. /* 0 */ "step1",
  308. /* 1 */ "step2",
  309. /* 2 */ "step3",
  310. /* 3 */ "step4",
  311. /* 4 */ "last",
  312. /* 5 */ "last2",
  313. NULL,
  314. NULL
  315. };
  316. static const char *nfp_me27_28_mult_types[4] =
  317. {
  318. "start",
  319. "24x8",
  320. "16x16",
  321. "32x32"
  322. };
  323. /* The cmd_mnemonics arrays are sorted here in its definition so that we can
  324. use bsearch () on the first three fields. There can be multiple matches
  325. and we assume that bsearch can return any of them, so we manually step
  326. back to the first one. */
  327. static const nfp_cmd_mnemonic nfp_me27_mnemonics[] =
  328. {
  329. {NFP_3200_CPPTGT_MSF0, 0, 0, 0, 0, "read"},
  330. {NFP_3200_CPPTGT_MSF0, 0, 2, 0, 0, "read64"},
  331. {NFP_3200_CPPTGT_MSF0, 1, 0, 0, 0, "write"},
  332. {NFP_3200_CPPTGT_MSF0, 1, 1, 0, 0, "fast_wr"},
  333. {NFP_3200_CPPTGT_MSF0, 1, 2, 0, 0, "write64"},
  334. {NFP_3200_CPPTGT_QDR, 0, 0, 0, 0, "read"},
  335. {NFP_3200_CPPTGT_QDR, 1, 0, 0, 0, "write"},
  336. {NFP_3200_CPPTGT_QDR, 2, 0, 0, 0, "write_atomic"},
  337. {NFP_3200_CPPTGT_QDR, 2, 1, 0, 0, "swap"},
  338. {NFP_3200_CPPTGT_QDR, 3, 0, 0, 0, "set"},
  339. {NFP_3200_CPPTGT_QDR, 3, 1, 0, 0, "test_and_set"},
  340. {NFP_3200_CPPTGT_QDR, 4, 0, 0, 0, "clr"},
  341. {NFP_3200_CPPTGT_QDR, 4, 1, 0, 0, "test_and_clr"},
  342. {NFP_3200_CPPTGT_QDR, 5, 0, 0, 0, "add"},
  343. {NFP_3200_CPPTGT_QDR, 5, 1, 0, 0, "test_and_add"},
  344. {NFP_3200_CPPTGT_QDR, 6, 0, 0, 0, "read_queue"},
  345. {NFP_3200_CPPTGT_QDR, 6, 1, 0, 0, "read_queue_ring"},
  346. {NFP_3200_CPPTGT_QDR, 6, 2, 0, 0, "write_queue"},
  347. {NFP_3200_CPPTGT_QDR, 6, 3, 0, 0, "write_queue_ring"},
  348. {NFP_3200_CPPTGT_QDR, 7, 0, 0, 0, "incr"},
  349. {NFP_3200_CPPTGT_QDR, 7, 1, 0, 0, "test_and_incr"},
  350. {NFP_3200_CPPTGT_QDR, 8, 0, 0, 0, "decr"},
  351. {NFP_3200_CPPTGT_QDR, 8, 1, 0, 0, "test_and_decr"},
  352. {NFP_3200_CPPTGT_QDR, 9, 0, 0, 0, "put"},
  353. {NFP_3200_CPPTGT_QDR, 9, 1, 0, 0, "get"},
  354. {NFP_3200_CPPTGT_QDR, 9, 2, 0, 0, "put_imm"},
  355. {NFP_3200_CPPTGT_QDR, 9, 3, 0, 0, "pop"},
  356. {NFP_3200_CPPTGT_QDR, 10, 0, 0, 0, "journal"},
  357. {NFP_3200_CPPTGT_QDR, 10, 1, 0, 0, "fast_journal"},
  358. {NFP_3200_CPPTGT_QDR, 11, 0, 0, 0, "dequeue"},
  359. {NFP_3200_CPPTGT_QDR, 12, 0, 0, 0, "enqueue"},
  360. {NFP_3200_CPPTGT_QDR, 12, 1, 0, 0, "enueue_tail"},
  361. {NFP_3200_CPPTGT_QDR, 12, 2, 0, 0, "nfp_enqueue"},
  362. {NFP_3200_CPPTGT_QDR, 12, 3, 0, 0, "nfp_enueue_tail"},
  363. {NFP_3200_CPPTGT_QDR, 13, 0, 0, 0, "csr_wr"},
  364. {NFP_3200_CPPTGT_QDR, 13, 1, 0, 0, "csr_rd"},
  365. {NFP_3200_CPPTGT_QDR, 14, 0, 0, 0, "wr_qdesc"},
  366. {NFP_3200_CPPTGT_QDR, 14, 1, 0, 0, "nfp_wr_qdesc"},
  367. {NFP_3200_CPPTGT_QDR, 14, 2, 0, 0, "wr_qdesc_count"},
  368. {NFP_3200_CPPTGT_QDR, 14, 3, 0, 0, "push_qdesc"},
  369. {NFP_3200_CPPTGT_QDR, 15, 0, 0, 0, "rd_qdesc_other"},
  370. {NFP_3200_CPPTGT_QDR, 15, 1, 0, 0, "rd_qdesc_tail"},
  371. {NFP_3200_CPPTGT_QDR, 15, 2, 0, 0, "rd_qdesc_head"},
  372. {NFP_3200_CPPTGT_QDR, 15, 3, 0, 0, "nfp_rd_qdesc"},
  373. {NFP_3200_CPPTGT_MSF1, 0, 0, 0, 0, "read"},
  374. {NFP_3200_CPPTGT_MSF1, 0, 2, 0, 0, "read64"},
  375. {NFP_3200_CPPTGT_MSF1, 1, 0, 0, 0, "write"},
  376. {NFP_3200_CPPTGT_MSF1, 1, 1, 0, 0, "fast_wr"},
  377. {NFP_3200_CPPTGT_MSF1, 1, 2, 0, 0, "write64"},
  378. {NFP_3200_CPPTGT_HASH, 0, 0, 0, 0, "hash_48"},
  379. {NFP_3200_CPPTGT_HASH, 0, 1, 0, 0, "hash_64"},
  380. {NFP_3200_CPPTGT_HASH, 0, 2, 0, 0, "hash_128"},
  381. {NFP_3200_CPPTGT_MU, 0, 0, 0, 0, "read"},
  382. {NFP_3200_CPPTGT_MU, 0, 1, 0, 0, "read_le"},
  383. {NFP_3200_CPPTGT_MU, 0, 2, 0, 0, "read_swap"},
  384. {NFP_3200_CPPTGT_MU, 0, 3, 0, 0, "read_swap_le"},
  385. {NFP_3200_CPPTGT_MU, 1, 0, 0, 0, "write"},
  386. {NFP_3200_CPPTGT_MU, 1, 1, 0, 0, "write_le"},
  387. {NFP_3200_CPPTGT_MU, 1, 2, 0, 0, "write_swap"},
  388. {NFP_3200_CPPTGT_MU, 1, 3, 0, 0, "write_swap_le"},
  389. {NFP_3200_CPPTGT_MU, 2, 0, 0, 0, "write8"},
  390. {NFP_3200_CPPTGT_MU, 2, 1, 0, 0, "write8_le"},
  391. {NFP_3200_CPPTGT_MU, 2, 2, 0, 0, "write8_swap"},
  392. {NFP_3200_CPPTGT_MU, 2, 3, 0, 0, "write8_swap_le"},
  393. {NFP_3200_CPPTGT_MU, 3, 0, 0, 0, "read_atomic"},
  394. {NFP_3200_CPPTGT_MU, 3, 1, 0, 0, "read8"},
  395. {NFP_3200_CPPTGT_MU, 3, 2, 0, 0, "compare_write"},
  396. {NFP_3200_CPPTGT_MU, 3, 3, 0, 0, "test_and_compare_write"},
  397. {NFP_3200_CPPTGT_MU, 4, 0, 0, 0, "write_atomic"},
  398. {NFP_3200_CPPTGT_MU, 4, 1, 0, 0, "swap"},
  399. {NFP_3200_CPPTGT_MU, 4, 2, 0, 0, "write_atomic_imm"},
  400. {NFP_3200_CPPTGT_MU, 4, 3, 0, 0, "swap_imm"},
  401. {NFP_3200_CPPTGT_MU, 5, 0, 0, 0, "set"},
  402. {NFP_3200_CPPTGT_MU, 5, 1, 0, 0, "test_and_set"},
  403. {NFP_3200_CPPTGT_MU, 5, 2, 0, 0, "set_imm"},
  404. {NFP_3200_CPPTGT_MU, 5, 3, 0, 0, "test_and_set_imm"},
  405. {NFP_3200_CPPTGT_MU, 6, 0, 0, 0, "clr"},
  406. {NFP_3200_CPPTGT_MU, 6, 1, 0, 0, "test_and_clr"},
  407. {NFP_3200_CPPTGT_MU, 6, 2, 0, 0, "clr_imm"},
  408. {NFP_3200_CPPTGT_MU, 6, 3, 0, 0, "test_and_clr_imm"},
  409. {NFP_3200_CPPTGT_MU, 7, 0, 0, 4, "add"},
  410. {NFP_3200_CPPTGT_MU, 7, 0, 4, 4, "add64"},
  411. {NFP_3200_CPPTGT_MU, 7, 1, 0, 4, "test_and_add"},
  412. {NFP_3200_CPPTGT_MU, 7, 1, 4, 4, "test_and_add64"},
  413. {NFP_3200_CPPTGT_MU, 7, 2, 0, 4, "add_imm"},
  414. {NFP_3200_CPPTGT_MU, 7, 2, 4, 4, "add64_imm"},
  415. {NFP_3200_CPPTGT_MU, 7, 3, 0, 4, "test_and_add_imm"},
  416. {NFP_3200_CPPTGT_MU, 7, 3, 4, 4, "test_and_add64_imm"},
  417. {NFP_3200_CPPTGT_MU, 8, 0, 0, 4, "add_sat"},
  418. {NFP_3200_CPPTGT_MU, 8, 0, 4, 4, "add64_sat"},
  419. {NFP_3200_CPPTGT_MU, 8, 1, 0, 4, "test_and_add_sat"},
  420. {NFP_3200_CPPTGT_MU, 8, 1, 4, 4, "test_and_add64_sat"},
  421. {NFP_3200_CPPTGT_MU, 8, 2, 0, 4, "add_imm_sat"},
  422. {NFP_3200_CPPTGT_MU, 8, 2, 4, 4, "add_imm_sat"},
  423. {NFP_3200_CPPTGT_MU, 8, 3, 0, 0, "test_and_add_sat_imm"},
  424. {NFP_3200_CPPTGT_MU, 9, 0, 0, 4, "sub"},
  425. {NFP_3200_CPPTGT_MU, 9, 0, 4, 4, "sub64"},
  426. {NFP_3200_CPPTGT_MU, 9, 1, 0, 4, "test_and_sub"},
  427. {NFP_3200_CPPTGT_MU, 9, 1, 4, 4, "test_and_sub64"},
  428. {NFP_3200_CPPTGT_MU, 9, 2, 0, 4, "sub_imm"},
  429. {NFP_3200_CPPTGT_MU, 9, 2, 4, 4, "sub64_imm"},
  430. {NFP_3200_CPPTGT_MU, 9, 3, 0, 0, "tes_and_sub_imm"},
  431. {NFP_3200_CPPTGT_MU, 10, 0, 0, 4, "sub_sat"},
  432. {NFP_3200_CPPTGT_MU, 10, 0, 4, 4, "sub64_sat"},
  433. {NFP_3200_CPPTGT_MU, 10, 1, 0, 4, "test_and_sub_sat"},
  434. {NFP_3200_CPPTGT_MU, 10, 1, 4, 4, "test_and_sub64_sat"},
  435. {NFP_3200_CPPTGT_MU, 10, 2, 0, 4, "sub_imm_sat"},
  436. {NFP_3200_CPPTGT_MU, 10, 2, 4, 4, "sub64_imm_sat"},
  437. {NFP_3200_CPPTGT_MU, 10, 3, 0, 0, "test_and_sub_sat_imm"},
  438. {NFP_3200_CPPTGT_MU, 11, 0, 0, 0, "release_ticket"},
  439. {NFP_3200_CPPTGT_MU, 11, 1, 0, 0, "release_ticket_ind"},
  440. {NFP_3200_CPPTGT_MU, 12, 0, 0, 0, "cam_lookup"},
  441. {NFP_3200_CPPTGT_MU, 12, 1, 0, 0, "cam_lookup_add"},
  442. {NFP_3200_CPPTGT_MU, 12, 2, 0, 0, "tcam_lookup"},
  443. {NFP_3200_CPPTGT_MU, 12, 3, 0, 3, "lock"},
  444. {NFP_3200_CPPTGT_MU, 12, 3, 2, 3, "cam_lookup_add_inc"},
  445. {NFP_3200_CPPTGT_MU, 13, 0, 0, 4, "microq128_get"},
  446. {NFP_3200_CPPTGT_MU, 13, 0, 4, 4, "microq256_get"},
  447. {NFP_3200_CPPTGT_MU, 13, 1, 0, 4, "microq128_pop"},
  448. {NFP_3200_CPPTGT_MU, 13, 1, 4, 4, "microq256_pop"},
  449. {NFP_3200_CPPTGT_MU, 13, 2, 0, 4, "microq128_put"},
  450. {NFP_3200_CPPTGT_MU, 13, 2, 4, 4, "microq256_put"},
  451. {NFP_3200_CPPTGT_MU, 14, 0, 0, 4, "queue128_lock"},
  452. {NFP_3200_CPPTGT_MU, 14, 0, 4, 4, "queue256_lock"},
  453. {NFP_3200_CPPTGT_MU, 14, 1, 0, 4, "queue128_unlock"},
  454. {NFP_3200_CPPTGT_MU, 14, 1, 4, 4, "queue256_unlock"},
  455. {NFP_3200_CPPTGT_MU, 15, 0, 0, 0, "xor"},
  456. {NFP_3200_CPPTGT_MU, 15, 1, 0, 0, "test_and_xor"},
  457. {NFP_3200_CPPTGT_MU, 15, 2, 0, 0, "xor_imm"},
  458. {NFP_3200_CPPTGT_MU, 15, 3, 0, 0, "test_and_xor_imm"},
  459. {NFP_3200_CPPTGT_MU, 16, 0, 0, 0, "rd_qdesc"},
  460. {NFP_3200_CPPTGT_MU, 16, 1, 0, 0, "wr_qdesc"},
  461. {NFP_3200_CPPTGT_MU, 16, 2, 0, 0, "push_qdesc"},
  462. {NFP_3200_CPPTGT_MU, 16, 3, 0, 0, "tag_writeback"},
  463. {NFP_3200_CPPTGT_MU, 17, 0, 0, 0, "enqueue"},
  464. {NFP_3200_CPPTGT_MU, 17, 1, 0, 0, "enqueue_tail"},
  465. {NFP_3200_CPPTGT_MU, 17, 2, 0, 0, "dequeue"},
  466. {NFP_3200_CPPTGT_MU, 18, 0, 0, 0, "read_queue"},
  467. {NFP_3200_CPPTGT_MU, 18, 1, 0, 0, "read_queue_ring"},
  468. {NFP_3200_CPPTGT_MU, 18, 2, 0, 0, "write_queue"},
  469. {NFP_3200_CPPTGT_MU, 18, 3, 0, 0, "write_queue_ring"},
  470. {NFP_3200_CPPTGT_MU, 19, 0, 0, 0, "add_tail"},
  471. {NFP_3200_CPPTGT_MU, 19, 1, 0, 0, "qadd_thread"},
  472. {NFP_3200_CPPTGT_MU, 19, 2, 0, 0, "qadd_work"},
  473. {NFP_3200_CPPTGT_MU, 19, 3, 0, 0, "qadd_work_imm"},
  474. {NFP_3200_CPPTGT_MU, 20, 0, 0, 0, "put"},
  475. {NFP_3200_CPPTGT_MU, 20, 1, 0, 0, "put_tag"},
  476. {NFP_3200_CPPTGT_MU, 20, 2, 0, 0, "journal"},
  477. {NFP_3200_CPPTGT_MU, 20, 3, 0, 0, "journal_tag"},
  478. {NFP_3200_CPPTGT_MU, 21, 0, 0, 0, "get"},
  479. {NFP_3200_CPPTGT_MU, 21, 1, 0, 0, "get_eop"},
  480. {NFP_3200_CPPTGT_MU, 21, 2, 0, 0, "get_safe"},
  481. {NFP_3200_CPPTGT_MU, 21, 3, 0, 0, "get_tag_safe"},
  482. {NFP_3200_CPPTGT_MU, 22, 0, 0, 0, "pop"},
  483. {NFP_3200_CPPTGT_MU, 22, 1, 0, 0, "pop_eop"},
  484. {NFP_3200_CPPTGT_MU, 22, 2, 0, 0, "pop_safe"},
  485. {NFP_3200_CPPTGT_MU, 22, 3, 0, 0, "pop_tag_safe"},
  486. {NFP_3200_CPPTGT_MU, 23, 0, 0, 0, "fast_journal"},
  487. {NFP_3200_CPPTGT_MU, 23, 1, 0, 0, "fast_journal_sig"},
  488. {NFP_3200_CPPTGT_GS, 0, 0, 0, 0, "read"},
  489. {NFP_3200_CPPTGT_GS, 1, 0, 0, 0, "write"},
  490. {NFP_3200_CPPTGT_GS, 2, 0, 0, 0, "write_atomic"},
  491. {NFP_3200_CPPTGT_GS, 2, 1, 0, 0, "swap"},
  492. {NFP_3200_CPPTGT_GS, 3, 0, 0, 0, "set"},
  493. {NFP_3200_CPPTGT_GS, 3, 1, 0, 0, "test_and_set"},
  494. {NFP_3200_CPPTGT_GS, 4, 0, 0, 0, "clr"},
  495. {NFP_3200_CPPTGT_GS, 4, 1, 0, 0, "test_and_clr"},
  496. {NFP_3200_CPPTGT_GS, 5, 0, 0, 0, "add"},
  497. {NFP_3200_CPPTGT_GS, 5, 1, 0, 0, "test_and_add"},
  498. {NFP_3200_CPPTGT_GS, 6, 0, 0, 0, "sub"},
  499. {NFP_3200_CPPTGT_GS, 6, 1, 0, 0, "test_and_sub"},
  500. {NFP_3200_CPPTGT_GS, 7, 0, 0, 0, "inc"},
  501. {NFP_3200_CPPTGT_GS, 7, 1, 0, 0, "test_and_inc"},
  502. {NFP_3200_CPPTGT_GS, 8, 0, 0, 0, "dec"},
  503. {NFP_3200_CPPTGT_GS, 8, 1, 0, 0, "test_and_dec"},
  504. {NFP_3200_CPPTGT_GS, 9, 0, 0, 0, "get"},
  505. {NFP_3200_CPPTGT_GS, 10, 0, 0, 0, "put"},
  506. {NFP_3200_CPPTGT_PCIE, 0, 0, 0, 0, "read"},
  507. {NFP_3200_CPPTGT_PCIE, 1, 0, 0, 0, "write"},
  508. {NFP_3200_CPPTGT_PCIE, 2, 0, 0, 0, "read_internal"},
  509. {NFP_3200_CPPTGT_PCIE, 3, 0, 0, 0, "write_internal"},
  510. {NFP_3200_CPPTGT_ARM, 0, 0, 0, 0, "read"},
  511. {NFP_3200_CPPTGT_ARM, 1, 0, 0, 0, "write"},
  512. {NFP_3200_CPPTGT_CRYPTO, 0, 0, 0, 0, "read"},
  513. {NFP_3200_CPPTGT_CRYPTO, 1, 0, 0, 0, "write"},
  514. {NFP_3200_CPPTGT_CRYPTO, 2, 0, 0, 0, "write_fifo"},
  515. {NFP_3200_CPPTGT_CAP, 0, 0, 0, 0, "read_enum"},
  516. {NFP_3200_CPPTGT_CAP, 0, 1, 0, 0, "read"},
  517. {NFP_3200_CPPTGT_CAP, 0, 2, 0, 0, "read_reflect"},
  518. {NFP_3200_CPPTGT_CAP, 1, 0, 0, 0, "write_enum"},
  519. {NFP_3200_CPPTGT_CAP, 1, 1, 0, 0, "write"},
  520. {NFP_3200_CPPTGT_CAP, 1, 2, 0, 0, "write_reflect"},
  521. {NFP_3200_CPPTGT_CAP, 2, 0, 0, 0, "fast_wr_alu"},
  522. {NFP_3200_CPPTGT_CAP, 3, 0, 0, 0, "fast_wr"},
  523. {NFP_3200_CPPTGT_CT, 1, 0, 0, 0, "write"},
  524. {NFP_3200_CPPTGT_CLS, 0, 0, 0, 0, "read_be"},
  525. {NFP_3200_CPPTGT_CLS, 0, 1, 0, 0, "read_le"},
  526. {NFP_3200_CPPTGT_CLS, 0, 2, 0, 0, "test_and_compare_write"},
  527. {NFP_3200_CPPTGT_CLS, 0, 3, 0, 0, "xor"},
  528. {NFP_3200_CPPTGT_CLS, 1, 0, 0, 0, "write_be"},
  529. {NFP_3200_CPPTGT_CLS, 1, 1, 0, 0, "write_le"},
  530. {NFP_3200_CPPTGT_CLS, 1, 2, 0, 0, "write8_be"},
  531. {NFP_3200_CPPTGT_CLS, 1, 3, 0, 0, "write8_le"},
  532. {NFP_3200_CPPTGT_CLS, 2, 0, 0, 0, "set"},
  533. {NFP_3200_CPPTGT_CLS, 2, 1, 0, 0, "clr"},
  534. {NFP_3200_CPPTGT_CLS, 2, 2, 0, 0, "test_and_set"},
  535. {NFP_3200_CPPTGT_CLS, 2, 3, 0, 0, "test_and_clr"},
  536. {NFP_3200_CPPTGT_CLS, 3, 0, 0, 0, "set_imm"},
  537. {NFP_3200_CPPTGT_CLS, 3, 1, 0, 0, "clr_imm"},
  538. {NFP_3200_CPPTGT_CLS, 3, 2, 0, 0, "test_and_set_imm"},
  539. {NFP_3200_CPPTGT_CLS, 3, 3, 0, 0, "test_and_clr_imm"},
  540. {NFP_3200_CPPTGT_CLS, 4, 0, 0, 0, "add"},
  541. {NFP_3200_CPPTGT_CLS, 4, 1, 0, 0, "add64"},
  542. {NFP_3200_CPPTGT_CLS, 4, 2, 0, 0, "add_sat"},
  543. {NFP_3200_CPPTGT_CLS, 4, 3, 0, 0, "test_and_add_sat"},
  544. {NFP_3200_CPPTGT_CLS, 5, 0, 0, 0, "add_imm"},
  545. {NFP_3200_CPPTGT_CLS, 5, 1, 0, 0, "add64_imm"},
  546. {NFP_3200_CPPTGT_CLS, 5, 2, 0, 0, "add_imm_sat"},
  547. {NFP_3200_CPPTGT_CLS, 5, 3, 0, 0, "test_and_add_imm_sat"},
  548. {NFP_3200_CPPTGT_CLS, 6, 0, 0, 0, "sub"},
  549. {NFP_3200_CPPTGT_CLS, 6, 1, 0, 0, "sub64"},
  550. {NFP_3200_CPPTGT_CLS, 6, 2, 0, 0, "sub_sat"},
  551. {NFP_3200_CPPTGT_CLS, 6, 3, 0, 0, "test_and_sub_sat"},
  552. {NFP_3200_CPPTGT_CLS, 7, 0, 0, 0, "sub_imm"},
  553. {NFP_3200_CPPTGT_CLS, 7, 1, 0, 0, "sub64_imm"},
  554. {NFP_3200_CPPTGT_CLS, 7, 2, 0, 0, "sub_imm_sat"},
  555. {NFP_3200_CPPTGT_CLS, 7, 3, 0, 0, "test_and_sub_imm_sat"},
  556. {NFP_3200_CPPTGT_CLS, 8, 0, 0, 0, "queue_lock"},
  557. {NFP_3200_CPPTGT_CLS, 8, 1, 0, 0, "queue_unlock"},
  558. {NFP_3200_CPPTGT_CLS, 8, 2, 0, 0, "hash_mask"},
  559. {NFP_3200_CPPTGT_CLS, 8, 3, 0, 0, "hash_mask_clear"},
  560. {NFP_3200_CPPTGT_CLS, 9, 0, 0, 0, "get"},
  561. {NFP_3200_CPPTGT_CLS, 9, 1, 0, 0, "pop"},
  562. {NFP_3200_CPPTGT_CLS, 9, 2, 0, 0, "get_safe"},
  563. {NFP_3200_CPPTGT_CLS, 9, 3, 0, 0, "pop_safe"},
  564. {NFP_3200_CPPTGT_CLS, 10, 0, 0, 0, "put"},
  565. {NFP_3200_CPPTGT_CLS, 10, 1, 0, 0, "put_offset"},
  566. {NFP_3200_CPPTGT_CLS, 10, 2, 0, 0, "journal"},
  567. {NFP_3200_CPPTGT_CLS, 10, 3, 0, 0, "add_tail"},
  568. {NFP_3200_CPPTGT_CLS, 11, 0, 0, 0, "cam_lookup32"},
  569. {NFP_3200_CPPTGT_CLS, 11, 1, 0, 0, "cam_lookup32_add"},
  570. {NFP_3200_CPPTGT_CLS, 11, 2, 0, 0, "cam_lookup24"},
  571. {NFP_3200_CPPTGT_CLS, 11, 3, 0, 0, "cam_lookup24_add"},
  572. {NFP_3200_CPPTGT_CLS, 12, 0, 0, 0, "cam_lookup8"},
  573. {NFP_3200_CPPTGT_CLS, 12, 1, 0, 0, "cam_lookup8_add"},
  574. {NFP_3200_CPPTGT_CLS, 12, 2, 0, 0, "cam_lookup16"},
  575. {NFP_3200_CPPTGT_CLS, 12, 3, 0, 0, "cam_lookup16_add"},
  576. {NFP_3200_CPPTGT_CLS, 13, 0, 0, 0, "tcam_lookup32"},
  577. {NFP_3200_CPPTGT_CLS, 13, 1, 0, 0, "tcam_lookup24"},
  578. {NFP_3200_CPPTGT_CLS, 13, 2, 0, 0, "tcam_lookup16"},
  579. {NFP_3200_CPPTGT_CLS, 13, 3, 0, 0, "tcam_lookup8"},
  580. {NFP_3200_CPPTGT_CLS, 14, 0, 0, 0, "reflect_from_sig_src"},
  581. {NFP_3200_CPPTGT_CLS, 14, 1, 0, 0, "reflect_from_sig_dst"},
  582. {NFP_3200_CPPTGT_CLS, 14, 2, 0, 0, "reflect_from_sig_both"},
  583. {NFP_3200_CPPTGT_CLS, 15, 0, 0, 0, "reflect_to_sig_src"},
  584. {NFP_3200_CPPTGT_CLS, 15, 1, 0, 0, "reflect_to_sig_dst"},
  585. {NFP_3200_CPPTGT_CLS, 15, 2, 0, 0, "reflect_to_sig_both"}
  586. };
  587. static const nfp_cmd_mnemonic nfp_me28_mnemonics[] =
  588. {
  589. {NFP_6000_CPPTGT_NBI, 0, 0, 0, 0, "read"},
  590. {NFP_6000_CPPTGT_NBI, 1, 0, 0, 0, "write"},
  591. {NFP_6000_CPPTGT_NBI, 3, 0, 0, 0, "packet_ready_drop"},
  592. {NFP_6000_CPPTGT_NBI, 3, 1, 0, 0, "packet_ready_unicast"},
  593. {NFP_6000_CPPTGT_NBI, 3, 2, 0, 0, "packet_ready_multicast_dont_free"},
  594. {NFP_6000_CPPTGT_NBI, 3, 3, 0, 0, "packet_ready_multicast_free_on_last"},
  595. {NFP_6000_CPPTGT_ILA, 0, 0, 0, 0, "read"},
  596. {NFP_6000_CPPTGT_ILA, 0, 1, 0, 0, "read_check_error"},
  597. {NFP_6000_CPPTGT_ILA, 1, 0, 0, 0, "write"},
  598. {NFP_6000_CPPTGT_ILA, 1, 1, 0, 0, "write_check_error"},
  599. {NFP_6000_CPPTGT_ILA, 2, 0, 0, 0, "read_int"},
  600. {NFP_6000_CPPTGT_ILA, 3, 0, 0, 7, "write_int"},
  601. {NFP_6000_CPPTGT_ILA, 3, 0, 3, 7, "write_dma"},
  602. {NFP_6000_CPPTGT_MU, 0, 0, 0, 0, "read"},
  603. {NFP_6000_CPPTGT_MU, 0, 1, 0, 0, "read_le"},
  604. {NFP_6000_CPPTGT_MU, 0, 2, 0, 0, "read_swap"},
  605. {NFP_6000_CPPTGT_MU, 0, 3, 0, 0, "read_swap_le"},
  606. {NFP_6000_CPPTGT_MU, 1, 0, 0, 0, "write"},
  607. {NFP_6000_CPPTGT_MU, 1, 1, 0, 0, "write_le"},
  608. {NFP_6000_CPPTGT_MU, 1, 2, 0, 0, "write_swap"},
  609. {NFP_6000_CPPTGT_MU, 1, 3, 0, 0, "write_swap_le"},
  610. {NFP_6000_CPPTGT_MU, 2, 0, 0, 0, "write8"},
  611. {NFP_6000_CPPTGT_MU, 2, 1, 0, 0, "write8_le"},
  612. {NFP_6000_CPPTGT_MU, 2, 2, 0, 0, "write8_swap"},
  613. {NFP_6000_CPPTGT_MU, 2, 3, 0, 0, "write8_swap_le"},
  614. {NFP_6000_CPPTGT_MU, 3, 0, 0, 0, "atomic_read"},
  615. {NFP_6000_CPPTGT_MU, 3, 1, 0, 0, "read8"},
  616. {NFP_6000_CPPTGT_MU, 3, 2, 0, 0,
  617. "compare_write_or_incr/mask_compare_write"},
  618. {NFP_6000_CPPTGT_MU, 3, 3, 0, 0,
  619. "test_compare_write_or_incr/test_mask_compare_write"},
  620. {NFP_6000_CPPTGT_MU, 4, 0, 0, 0, "atomic_write"},
  621. {NFP_6000_CPPTGT_MU, 4, 1, 0, 0, "swap"},
  622. {NFP_6000_CPPTGT_MU, 4, 2, 0, 0, "atomic_write_imm"},
  623. {NFP_6000_CPPTGT_MU, 4, 3, 0, 0, "swap_imm"},
  624. {NFP_6000_CPPTGT_MU, 5, 0, 0, 0, "set"},
  625. {NFP_6000_CPPTGT_MU, 5, 1, 0, 0, "test_set"},
  626. {NFP_6000_CPPTGT_MU, 5, 2, 0, 0, "set_imm"},
  627. {NFP_6000_CPPTGT_MU, 5, 3, 0, 0, "test_set_imm"},
  628. {NFP_6000_CPPTGT_MU, 6, 0, 0, 0, "clr"},
  629. {NFP_6000_CPPTGT_MU, 6, 1, 0, 0, "test_clr"},
  630. {NFP_6000_CPPTGT_MU, 6, 2, 0, 0, "clr_imm"},
  631. {NFP_6000_CPPTGT_MU, 6, 3, 0, 0, "test_clr_imm"},
  632. {NFP_6000_CPPTGT_MU, 7, 0, 0, 4, "add"},
  633. {NFP_6000_CPPTGT_MU, 7, 0, 4, 4, "add64"},
  634. {NFP_6000_CPPTGT_MU, 7, 1, 0, 4, "test_add"},
  635. {NFP_6000_CPPTGT_MU, 7, 1, 4, 4, "test_add64"},
  636. {NFP_6000_CPPTGT_MU, 7, 2, 0, 4, "add_imm"},
  637. {NFP_6000_CPPTGT_MU, 7, 2, 4, 4, "add64_imm"},
  638. {NFP_6000_CPPTGT_MU, 7, 3, 0, 4, "test_add_imm"},
  639. {NFP_6000_CPPTGT_MU, 7, 3, 4, 4, "test_add64_imm"},
  640. {NFP_6000_CPPTGT_MU, 8, 0, 0, 4, "addsat"},
  641. {NFP_6000_CPPTGT_MU, 8, 0, 4, 4, "addsat64"},
  642. {NFP_6000_CPPTGT_MU, 8, 1, 0, 4, "test_addsat"},
  643. {NFP_6000_CPPTGT_MU, 8, 1, 4, 4, "test_addsat64"},
  644. {NFP_6000_CPPTGT_MU, 8, 2, 0, 4, "addsat_imm"},
  645. {NFP_6000_CPPTGT_MU, 8, 2, 4, 4, "addsat64_imm"},
  646. {NFP_6000_CPPTGT_MU, 8, 3, 0, 4, "test_addsat_imm"},
  647. {NFP_6000_CPPTGT_MU, 8, 3, 4, 4, "test_addsat64_imm"},
  648. {NFP_6000_CPPTGT_MU, 9, 0, 0, 4, "sub"},
  649. {NFP_6000_CPPTGT_MU, 9, 0, 4, 4, "sub64"},
  650. {NFP_6000_CPPTGT_MU, 9, 1, 0, 4, "test_sub"},
  651. {NFP_6000_CPPTGT_MU, 9, 1, 4, 4, "test_sub64"},
  652. {NFP_6000_CPPTGT_MU, 9, 2, 0, 4, "sub_imm"},
  653. {NFP_6000_CPPTGT_MU, 9, 2, 4, 4, "sub64_imm"},
  654. {NFP_6000_CPPTGT_MU, 9, 3, 0, 4, "test_sub_imm"},
  655. {NFP_6000_CPPTGT_MU, 9, 3, 4, 4, "test_sub64_imm"},
  656. {NFP_6000_CPPTGT_MU, 10, 0, 0, 4, "subsat"},
  657. {NFP_6000_CPPTGT_MU, 10, 0, 4, 4, "subsat64"},
  658. {NFP_6000_CPPTGT_MU, 10, 1, 0, 4, "test_subsat"},
  659. {NFP_6000_CPPTGT_MU, 10, 1, 4, 4, "test_subsat64"},
  660. {NFP_6000_CPPTGT_MU, 10, 2, 0, 4, "subsat_imm"},
  661. {NFP_6000_CPPTGT_MU, 10, 2, 4, 4, "subsat64_imm"},
  662. {NFP_6000_CPPTGT_MU, 10, 3, 0, 4, "test_subsat_imm"},
  663. {NFP_6000_CPPTGT_MU, 10, 3, 4, 4, "test_subsat64_imm"},
  664. {NFP_6000_CPPTGT_MU, 11, 0, 0, 0, "ticket_release"},
  665. {NFP_6000_CPPTGT_MU, 11, 1, 0, 0, "ticket_release_ind"},
  666. {NFP_6000_CPPTGT_MU, 12, 0, 0, 7, "cam128_lookup8/cam384_lookup8"},
  667. {NFP_6000_CPPTGT_MU, 12, 0, 1, 7, "cam128_lookup16/cam384_lookup16"},
  668. {NFP_6000_CPPTGT_MU, 12, 0, 2, 7, "cam128_lookup24/cam384_lookup24"},
  669. {NFP_6000_CPPTGT_MU, 12, 0, 3, 7, "cam128_lookup32/cam384_lookup32"},
  670. {NFP_6000_CPPTGT_MU, 12, 0, 4, 7, "cam256_lookup8/cam512_lookup8"},
  671. {NFP_6000_CPPTGT_MU, 12, 0, 5, 7, "cam256_lookup16/cam512_lookup16"},
  672. {NFP_6000_CPPTGT_MU, 12, 0, 6, 7, "cam256_lookup24/cam512_lookup24"},
  673. {NFP_6000_CPPTGT_MU, 12, 0, 7, 7, "cam256_lookup32/cam512_lookup32"},
  674. {NFP_6000_CPPTGT_MU, 12, 1, 0, 7,
  675. "cam128_lookup8_add/cam384_lookup8_add"},
  676. {NFP_6000_CPPTGT_MU, 12, 1, 1, 7,
  677. "cam128_lookup16_add/cam384_lookup16_add"},
  678. {NFP_6000_CPPTGT_MU, 12, 1, 2, 7,
  679. "cam128_lookup24_add/cam384_lookup24_add"},
  680. {NFP_6000_CPPTGT_MU, 12, 1, 3, 7,
  681. "cam128_lookup32_add/cam384_lookup32_add"},
  682. {NFP_6000_CPPTGT_MU, 12, 1, 4, 7,
  683. "cam256_lookup8_add/cam512_lookup8_add"},
  684. {NFP_6000_CPPTGT_MU, 12, 1, 5, 7,
  685. "cam256_lookup16_add/cam512_lookup16_add"},
  686. {NFP_6000_CPPTGT_MU, 12, 1, 6, 7,
  687. "cam256_lookup24_add/cam512_lookup24_add"},
  688. {NFP_6000_CPPTGT_MU, 12, 1, 7, 7,
  689. "cam256_lookup32_add/cam512_lookup32_add"},
  690. {NFP_6000_CPPTGT_MU, 12, 2, 0, 7, "tcam128_lookup8/tcam384_lookup8"},
  691. {NFP_6000_CPPTGT_MU, 12, 2, 1, 7, "tcam128_lookup16/tcam384_lookup16"},
  692. {NFP_6000_CPPTGT_MU, 12, 2, 2, 7, "tcam128_lookup24/tcam384_lookup24"},
  693. {NFP_6000_CPPTGT_MU, 12, 2, 3, 7, "tcam128_lookup32/tcam384_lookup32"},
  694. {NFP_6000_CPPTGT_MU, 12, 2, 4, 7, "tcam256_lookup8/tcam512_lookup8"},
  695. {NFP_6000_CPPTGT_MU, 12, 2, 5, 7, "tcam256_lookup16/tcam512_lookup16"},
  696. {NFP_6000_CPPTGT_MU, 12, 2, 6, 7, "tcam256_lookup24/tcam512_lookup24"},
  697. {NFP_6000_CPPTGT_MU, 12, 2, 7, 7, "tcam256_lookup32/tcam512_lookup32"},
  698. {NFP_6000_CPPTGT_MU, 12, 3, 0, 7, "lock128/lock384"},
  699. {NFP_6000_CPPTGT_MU, 12, 3, 2, 7,
  700. "cam128_lookup24_add_inc/cam384_lookup24_add_inc"},
  701. {NFP_6000_CPPTGT_MU, 12, 3, 4, 7, "lock256/lock512"},
  702. {NFP_6000_CPPTGT_MU, 12, 3, 6, 7,
  703. "cam256_lookup24_add_inc/cam512_lookup24_add_inc"},
  704. {NFP_6000_CPPTGT_MU, 13, 0, 0, 7, "microq128_get"},
  705. {NFP_6000_CPPTGT_MU, 13, 0, 4, 7, "microq256_get"},
  706. {NFP_6000_CPPTGT_MU, 13, 1, 0, 7, "microq128_pop"},
  707. {NFP_6000_CPPTGT_MU, 13, 1, 4, 7, "microq256_pop"},
  708. {NFP_6000_CPPTGT_MU, 13, 2, 0, 7, "microq128_put"},
  709. {NFP_6000_CPPTGT_MU, 13, 2, 4, 7, "microq256_put"},
  710. {NFP_6000_CPPTGT_MU, 14, 0, 0, 7, "queue128_lock"},
  711. {NFP_6000_CPPTGT_MU, 14, 0, 4, 7, "queue256_lock"},
  712. {NFP_6000_CPPTGT_MU, 14, 1, 0, 7, "queue128_unlock"},
  713. {NFP_6000_CPPTGT_MU, 14, 1, 4, 7, "queue256_unlock"},
  714. {NFP_6000_CPPTGT_MU, 15, 0, 0, 0, "xor"},
  715. {NFP_6000_CPPTGT_MU, 15, 1, 0, 0, "test_xor"},
  716. {NFP_6000_CPPTGT_MU, 15, 2, 0, 0, "xor_imm"},
  717. {NFP_6000_CPPTGT_MU, 15, 3, 0, 0, "test_xor_imm"},
  718. {NFP_6000_CPPTGT_MU, 16, 0, 0, 0,
  719. "ctm.packet_wait_packet_status/emem.rd_qdesc/imem.stats_log"},
  720. {NFP_6000_CPPTGT_MU, 16, 1, 0, 0,
  721. "ctm.packet_read_packet_status/emem.wr_qdesc/imem.stats_log_sat"},
  722. {NFP_6000_CPPTGT_MU, 16, 2, 0, 0,
  723. "emem.push_qdesc/imem.stats_log_event"},
  724. {NFP_6000_CPPTGT_MU, 16, 3, 0, 0, "imem.stats_log_sat_event"},
  725. {NFP_6000_CPPTGT_MU, 17, 0, 0, 0,
  726. "ctm.packet_alloc/emem.enqueue/imem.stats_push"},
  727. {NFP_6000_CPPTGT_MU, 17, 1, 0, 0,
  728. "ctm.packet_credit_get/emem.enqueue_tail/imem.stats_push_clear"},
  729. {NFP_6000_CPPTGT_MU, 17, 2, 0, 0, "ctm.packet_alloc_poll/emem.dequeue"},
  730. {NFP_6000_CPPTGT_MU, 17, 3, 0, 0, "ctm.packet_add_thread"},
  731. {NFP_6000_CPPTGT_MU, 18, 0, 0, 0,
  732. "ctm.packet_free/emem.read_queue/imem.lb_write_desc"},
  733. {NFP_6000_CPPTGT_MU, 18, 1, 0, 0,
  734. "ctm.packet_free_and_signal/emem.read_queue_ring/imem.lb_read_desc"},
  735. {NFP_6000_CPPTGT_MU, 18, 2, 0, 0,
  736. "ctm.packet_free_and_return_pointer/emem.write_queue"},
  737. {NFP_6000_CPPTGT_MU, 18, 3, 0, 0,
  738. "ctm.packet_return_pointer/emem.write_queue_ring"},
  739. {NFP_6000_CPPTGT_MU, 19, 0, 0, 0,
  740. "ctm.packet_complete_drop/emem.add_tail/imem.lb_write_idtable"},
  741. {NFP_6000_CPPTGT_MU, 19, 1, 0, 0,
  742. "ctm.packet_complete_unicast/emem.qadd_thread/imem.lb_read_idtable"},
  743. {NFP_6000_CPPTGT_MU, 19, 2, 0, 0,
  744. "ctm.packet_complete_multicast/emem.qadd_work"},
  745. {NFP_6000_CPPTGT_MU, 19, 3, 0, 0,
  746. "ctm.packet_complete_multicast_free/emem.qadd_work_imm"},
  747. {NFP_6000_CPPTGT_MU, 20, 0, 0, 0,
  748. "ctm.pe_dma_to_memory_packet/emem.put/imem.lb_bucket_write_local"},
  749. {NFP_6000_CPPTGT_MU, 20, 1, 0, 0,
  750. "ctm.pe_dma_to_memory_packet_swap/imem.lb_bucket_write_dcache"},
  751. {NFP_6000_CPPTGT_MU, 20, 2, 0, 0,
  752. "ctm.pe_dma_to_memory_packet_free/emem.journal"},
  753. {NFP_6000_CPPTGT_MU, 20, 3, 0, 0,
  754. "ctm.pe_dma_to_memory_packet_free_swap"},
  755. {NFP_6000_CPPTGT_MU, 21, 0, 0, 0,
  756. "ctm.pe_dma_to_memory_indirect/emem.get/imem.lb_bucket_read_local"},
  757. {NFP_6000_CPPTGT_MU, 21, 1, 0, 0,
  758. "ctm.pe_dma_to_memory_indirect_swap/emem.get_eop/"
  759. "imem.lb_bucket_read_dcache"},
  760. {NFP_6000_CPPTGT_MU, 21, 2, 0, 0,
  761. "ctm.pe_dma_to_memory_indirect_free/emem.get_freely"},
  762. {NFP_6000_CPPTGT_MU, 21, 3, 0, 0,
  763. "ctm.pe_dma_to_memory_indirect_free_swap"},
  764. {NFP_6000_CPPTGT_MU, 22, 0, 0, 0,
  765. "ctm.pe_dma_to_memory_buffer/emem.pop/imem.lb_lookup_bundleid"},
  766. {NFP_6000_CPPTGT_MU, 22, 1, 0, 0,
  767. "ctm.pe_dma_to_memory_buffer_le/emem.pop_eop/imem.lb_lookup_dcache"},
  768. {NFP_6000_CPPTGT_MU, 22, 2, 0, 0,
  769. "ctm.pe_dma_to_memory_buffer_swap/emem.pop_freely/imem.lb_lookup_idtable"},
  770. {NFP_6000_CPPTGT_MU, 22, 3, 0, 0, "ctm.pe_dma_to_memory_buffer_le_swap"},
  771. {NFP_6000_CPPTGT_MU, 23, 0, 0, 0,
  772. "ctm.pe_dma_from_memory_buffer/emem.fast_journal/imem.lb_push_stats_local"},
  773. {NFP_6000_CPPTGT_MU, 23, 1, 0, 0,
  774. "ctm.pe_dma_from_memory_buffer_le/emem.fast_journal_sig/"
  775. "imem.lb_push_stats_dcache"},
  776. {NFP_6000_CPPTGT_MU, 23, 2, 0, 0,
  777. "ctm.pe_dma_from_memory_buffer_swap/imem.lb_push_stats_local_clr"},
  778. {NFP_6000_CPPTGT_MU, 23, 3, 0, 0,
  779. "ctm.pe_dma_from_memory_buffer_le_swap/imem.lb_push_stats_dcache_clr"},
  780. {NFP_6000_CPPTGT_MU, 26, 0, 0, 0, "emem.lookup/imem.lookup"},
  781. {NFP_6000_CPPTGT_MU, 28, 0, 0, 0, "read32"},
  782. {NFP_6000_CPPTGT_MU, 28, 1, 0, 0, "read32_le"},
  783. {NFP_6000_CPPTGT_MU, 28, 2, 0, 0, "read32_swap"},
  784. {NFP_6000_CPPTGT_MU, 28, 3, 0, 0, "read32_swap_le"},
  785. {NFP_6000_CPPTGT_MU, 29, 1, 0, 0, "cam_lookup_add_lock"},
  786. {NFP_6000_CPPTGT_MU, 29, 2, 0, 0, "cam_lookup_add_extend"},
  787. {NFP_6000_CPPTGT_MU, 29, 3, 0, 0, "cam_lookup_add_inc"},
  788. {NFP_6000_CPPTGT_MU, 30, 2, 0, 0, "meter"},
  789. {NFP_6000_CPPTGT_MU, 31, 0, 0, 0, "write32"},
  790. {NFP_6000_CPPTGT_MU, 31, 1, 0, 0, "write32_le"},
  791. {NFP_6000_CPPTGT_MU, 31, 2, 0, 0, "write32_swap"},
  792. {NFP_6000_CPPTGT_MU, 31, 3, 0, 0, "write32_swap_le"},
  793. {NFP_6000_CPPTGT_PCIE, 0, 0, 0, 0, "read"},
  794. {NFP_6000_CPPTGT_PCIE, 0, 1, 0, 0, "read_rid"},
  795. {NFP_6000_CPPTGT_PCIE, 1, 0, 0, 0, "write"},
  796. {NFP_6000_CPPTGT_PCIE, 1, 1, 0, 0, "write_rid"},
  797. {NFP_6000_CPPTGT_PCIE, 1, 2, 0, 0, "write_vdm"},
  798. {NFP_6000_CPPTGT_PCIE, 2, 0, 0, 0, "read_int"},
  799. {NFP_6000_CPPTGT_PCIE, 3, 0, 0, 0, "write_int"},
  800. {NFP_6000_CPPTGT_ARM, 0, 0, 0, 0, "read"},
  801. {NFP_6000_CPPTGT_ARM, 1, 0, 0, 0, "write"},
  802. {NFP_6000_CPPTGT_CRYPTO, 0, 0, 0, 0, "read"},
  803. {NFP_6000_CPPTGT_CRYPTO, 1, 0, 0, 0, "write"},
  804. {NFP_6000_CPPTGT_CRYPTO, 2, 0, 0, 0, "write_fifo"},
  805. {NFP_6000_CPPTGT_CTXPB, 0, 0, 0, 0, "xpb_read"},
  806. {NFP_6000_CPPTGT_CTXPB, 0, 1, 0, 0, "ring_get"},
  807. {NFP_6000_CPPTGT_CTXPB, 0, 2, 0, 0, "interthread_signal"},
  808. {NFP_6000_CPPTGT_CTXPB, 1, 0, 0, 0, "xpb_write"},
  809. {NFP_6000_CPPTGT_CTXPB, 1, 1, 0, 0, "ring_put"},
  810. {NFP_6000_CPPTGT_CTXPB, 1, 2, 0, 0, "ctnn_write"},
  811. {NFP_6000_CPPTGT_CTXPB, 2, 0, 0, 0, "reflect_read_none"},
  812. {NFP_6000_CPPTGT_CTXPB, 2, 1, 0, 0, "reflect_read_sig_init"},
  813. {NFP_6000_CPPTGT_CTXPB, 2, 2, 0, 0, "reflect_read_sig_remote"},
  814. {NFP_6000_CPPTGT_CTXPB, 2, 3, 0, 0, "reflect_read_sig_both"},
  815. {NFP_6000_CPPTGT_CTXPB, 3, 0, 0, 0, "reflect_write_none"},
  816. {NFP_6000_CPPTGT_CTXPB, 3, 1, 0, 0, "reflect_write_sig_init"},
  817. {NFP_6000_CPPTGT_CTXPB, 3, 2, 0, 0, "reflect_write_sig_remote"},
  818. {NFP_6000_CPPTGT_CTXPB, 3, 3, 0, 0, "reflect_write_sig_both"},
  819. {NFP_6000_CPPTGT_CLS, 0, 0, 0, 0, "read"},
  820. {NFP_6000_CPPTGT_CLS, 0, 1, 0, 0, "read_le"},
  821. {NFP_6000_CPPTGT_CLS, 0, 2, 0, 0, "swap/test_compare_write"},
  822. {NFP_6000_CPPTGT_CLS, 0, 3, 0, 0, "xor"},
  823. {NFP_6000_CPPTGT_CLS, 1, 0, 0, 0, "write"},
  824. {NFP_6000_CPPTGT_CLS, 1, 1, 0, 0, "write_le"},
  825. {NFP_6000_CPPTGT_CLS, 1, 2, 0, 0, "write8_be"},
  826. {NFP_6000_CPPTGT_CLS, 1, 3, 0, 0, "write8_le"},
  827. {NFP_6000_CPPTGT_CLS, 2, 0, 0, 0, "set"},
  828. {NFP_6000_CPPTGT_CLS, 2, 1, 0, 0, "clr"},
  829. {NFP_6000_CPPTGT_CLS, 2, 2, 0, 0, "test_set"},
  830. {NFP_6000_CPPTGT_CLS, 2, 3, 0, 0, "test_clr"},
  831. {NFP_6000_CPPTGT_CLS, 3, 0, 0, 0, "set_imm"},
  832. {NFP_6000_CPPTGT_CLS, 3, 1, 0, 0, "clr_imm"},
  833. {NFP_6000_CPPTGT_CLS, 3, 2, 0, 0, "test_set_imm"},
  834. {NFP_6000_CPPTGT_CLS, 3, 3, 0, 0, "test_clr_imm"},
  835. {NFP_6000_CPPTGT_CLS, 4, 0, 0, 0, "add"},
  836. {NFP_6000_CPPTGT_CLS, 4, 1, 0, 0, "add64"},
  837. {NFP_6000_CPPTGT_CLS, 4, 2, 0, 0, "addsat"},
  838. {NFP_6000_CPPTGT_CLS, 5, 0, 0, 0, "add_imm"},
  839. {NFP_6000_CPPTGT_CLS, 5, 1, 0, 0, "add64_imm"},
  840. {NFP_6000_CPPTGT_CLS, 5, 2, 0, 0, "addsat_imm"},
  841. {NFP_6000_CPPTGT_CLS, 6, 0, 0, 0, "sub"},
  842. {NFP_6000_CPPTGT_CLS, 6, 1, 0, 0, "sub64"},
  843. {NFP_6000_CPPTGT_CLS, 6, 2, 0, 0, "subsat"},
  844. {NFP_6000_CPPTGT_CLS, 7, 0, 0, 0, "sub_imm"},
  845. {NFP_6000_CPPTGT_CLS, 7, 1, 0, 0, "sub64_imm"},
  846. {NFP_6000_CPPTGT_CLS, 7, 2, 0, 0, "subsat_imm"},
  847. {NFP_6000_CPPTGT_CLS, 8, 0, 0, 0, "queue_lock"},
  848. {NFP_6000_CPPTGT_CLS, 8, 1, 0, 0, "queue_unlock"},
  849. {NFP_6000_CPPTGT_CLS, 8, 2, 0, 0, "hash_mask"},
  850. {NFP_6000_CPPTGT_CLS, 8, 3, 0, 0, "hash_mask_clear"},
  851. {NFP_6000_CPPTGT_CLS, 9, 0, 0, 0, "get"},
  852. {NFP_6000_CPPTGT_CLS, 9, 1, 0, 0, "pop"},
  853. {NFP_6000_CPPTGT_CLS, 9, 2, 0, 0, "get_safe"},
  854. {NFP_6000_CPPTGT_CLS, 9, 3, 0, 0, "pop_safe"},
  855. {NFP_6000_CPPTGT_CLS, 10, 0, 0, 0, "ring_put"},
  856. {NFP_6000_CPPTGT_CLS, 10, 2, 0, 0, "ring_journal"},
  857. {NFP_6000_CPPTGT_CLS, 11, 0, 0, 0, "cam_lookup32"},
  858. {NFP_6000_CPPTGT_CLS, 11, 1, 0, 0, "cam_lookup32_add"},
  859. {NFP_6000_CPPTGT_CLS, 11, 2, 0, 0, "cam_lookup24"},
  860. {NFP_6000_CPPTGT_CLS, 11, 3, 0, 0, "cam_lookup24_add"},
  861. {NFP_6000_CPPTGT_CLS, 12, 0, 0, 0, "cam_lookup8"},
  862. {NFP_6000_CPPTGT_CLS, 12, 1, 0, 0, "cam_lookup8_add"},
  863. {NFP_6000_CPPTGT_CLS, 12, 2, 0, 0, "cam_lookup16"},
  864. {NFP_6000_CPPTGT_CLS, 12, 3, 0, 0, "cam_lookup16_add"},
  865. {NFP_6000_CPPTGT_CLS, 13, 0, 0, 0, "tcam_lookup32"},
  866. {NFP_6000_CPPTGT_CLS, 13, 1, 0, 0, "tcam_lookup24"},
  867. {NFP_6000_CPPTGT_CLS, 13, 2, 0, 0, "tcam_lookup16"},
  868. {NFP_6000_CPPTGT_CLS, 13, 3, 0, 0, "tcam_lookup8"},
  869. {NFP_6000_CPPTGT_CLS, 14, 0, 0, 0, "reflect_write_sig_local"},
  870. {NFP_6000_CPPTGT_CLS, 14, 1, 0, 0, "reflect_write_sig_remote"},
  871. {NFP_6000_CPPTGT_CLS, 14, 2, 0, 0, "reflect_write_sig_both"},
  872. {NFP_6000_CPPTGT_CLS, 15, 0, 0, 0, "reflect_read_sig_remote"},
  873. {NFP_6000_CPPTGT_CLS, 15, 1, 0, 0, "reflect_read_sig_local"},
  874. {NFP_6000_CPPTGT_CLS, 15, 2, 0, 0, "reflect_read_sig_both"},
  875. {NFP_6000_CPPTGT_CLS, 16, 1, 0, 0, "cam_lookup32_add_lock"},
  876. {NFP_6000_CPPTGT_CLS, 16, 2, 0, 0, "cam_lookup24_add_inc"},
  877. {NFP_6000_CPPTGT_CLS, 16, 3, 0, 0, "cam_lookup32_add_extend"},
  878. {NFP_6000_CPPTGT_CLS, 17, 0, 0, 0, "meter"},
  879. {NFP_6000_CPPTGT_CLS, 17, 2, 0, 0, "statistic"},
  880. {NFP_6000_CPPTGT_CLS, 17, 3, 0, 0, "statistic_imm"},
  881. {NFP_6000_CPPTGT_CLS, 20, 0, 0, 0, "test_add"},
  882. {NFP_6000_CPPTGT_CLS, 20, 1, 0, 0, "test_add64"},
  883. {NFP_6000_CPPTGT_CLS, 20, 2, 0, 0, "test_addsat"},
  884. {NFP_6000_CPPTGT_CLS, 21, 0, 0, 0, "test_add_imm"},
  885. {NFP_6000_CPPTGT_CLS, 21, 1, 0, 0, "test_add64_imm"},
  886. {NFP_6000_CPPTGT_CLS, 21, 2, 0, 0, "test_addsat_imm"},
  887. {NFP_6000_CPPTGT_CLS, 22, 0, 0, 0, "test_sub"},
  888. {NFP_6000_CPPTGT_CLS, 22, 1, 0, 0, "test_sub64"},
  889. {NFP_6000_CPPTGT_CLS, 22, 2, 0, 0, "test_subsat"},
  890. {NFP_6000_CPPTGT_CLS, 23, 0, 0, 0, "test_sub_imm"},
  891. {NFP_6000_CPPTGT_CLS, 23, 1, 0, 0, "test_sub64_imm"},
  892. {NFP_6000_CPPTGT_CLS, 23, 2, 0, 0, "test_subsat_imm"},
  893. {NFP_6000_CPPTGT_CLS, 24, 0, 0, 0, "ring_read"},
  894. {NFP_6000_CPPTGT_CLS, 24, 1, 0, 0, "ring_write"},
  895. {NFP_6000_CPPTGT_CLS, 24, 2, 0, 0, "ring_ordered_lock"},
  896. {NFP_6000_CPPTGT_CLS, 24, 3, 0, 0, "ring_ordered_unlock"},
  897. {NFP_6000_CPPTGT_CLS, 25, 0, 0, 0, "ring_workq_add_thread"},
  898. {NFP_6000_CPPTGT_CLS, 25, 1, 0, 0, "ring_workq_add_work"}
  899. };
  900. static int
  901. nfp_me_print_invalid (uint64_t instr, struct disassemble_info *dinfo)
  902. {
  903. const char * err_msg = N_("<invalid_instruction>:");
  904. dinfo->fprintf_func (dinfo->stream, "%s 0x%" PRIx64, err_msg, instr);
  905. return _NFP_ERR_CONT;
  906. }
  907. static bool
  908. nfp_me_is_imm_opnd10 (unsigned int opnd)
  909. {
  910. return _BF (opnd, 9, 8) == 0x3;
  911. }
  912. static bool
  913. nfp_me_is_imm_opnd8 (unsigned int opnd)
  914. {
  915. return _BTST (opnd, 5);
  916. }
  917. static unsigned int
  918. nfp_me_imm_opnd10 (unsigned int opnd)
  919. {
  920. return nfp_me_is_imm_opnd10 (opnd) ? (opnd & 0xff) : ~0U;
  921. }
  922. static unsigned int
  923. nfp_me_imm_opnd8 (unsigned int opnd, unsigned int imm8_msb)
  924. {
  925. unsigned int v = (imm8_msb << 7) | _BFS (opnd, 7, 6, 5) | _BF (opnd, 4, 0);
  926. return nfp_me_is_imm_opnd8 (opnd) ? v : ~0U;
  927. }
  928. /* Print an unrestricted/10-bit operand.
  929. This can mostly be generic across NFP families at the moment. */
  930. static bool
  931. nfp_me_print_opnd10 (unsigned int opnd, char bank, int num_ctx, int lmem_ext,
  932. struct disassemble_info *dinfo)
  933. {
  934. unsigned int n = _BF (opnd, (num_ctx == 8) ? 3 : 4, 0);
  935. /* Absolute GPR. */
  936. if (_BF (opnd, 9, 7) == 0x1)
  937. dinfo->fprintf_func (dinfo->stream, "@gpr%c_%d", bank, _BF (opnd, 6, 0));
  938. /* Relative GPR. */
  939. else if (_BF (opnd, 9, 6) == 0x0)
  940. dinfo->fprintf_func (dinfo->stream, "gpr%c_%d", bank, n);
  941. /* Indexed Xfer. */
  942. else if (_BF (opnd, 9, 7) == 0x2)
  943. {
  944. dinfo->fprintf_func (dinfo->stream, "*$index");
  945. if (_BF (opnd, 2, 1) == 0x1)
  946. dinfo->fprintf_func (dinfo->stream, "++");
  947. else if (_BF (opnd, 2, 1) == 0x2)
  948. dinfo->fprintf_func (dinfo->stream, "--");
  949. }
  950. /* Relative Xfer. */
  951. else if (_BF (opnd, 9, 7) == 0x3)
  952. {
  953. if (_BTST (opnd, 6))
  954. n += (num_ctx == 8 ? 16 : 32);
  955. dinfo->fprintf_func (dinfo->stream, "$xfer_%d", n);
  956. }
  957. /* Indexed Next Neighbour. */
  958. else if (_BF (opnd, 9, 6) == 0x9)
  959. {
  960. dinfo->fprintf_func (dinfo->stream, "*n$index");
  961. if (_BTST (opnd, 1))
  962. dinfo->fprintf_func (dinfo->stream, "++");
  963. }
  964. /* Relative Next Neighbour. */
  965. else if (_BF (opnd, 9, 6) == 0xa)
  966. {
  967. dinfo->fprintf_func (dinfo->stream, "n$reg_%d", n);
  968. }
  969. /* Indexed LMEM. */
  970. else if (_BF (opnd, 9, 6) == 0x8)
  971. {
  972. n = _BF (opnd, 5, 5) + (lmem_ext * 2);
  973. dinfo->fprintf_func (dinfo->stream, "*l$index%d", n);
  974. if (_BTST (opnd, 4))
  975. dinfo->fprintf_func (dinfo->stream, _BTST (opnd, 0) ? "--" : "++");
  976. else if (_BF (opnd, 3, 0))
  977. dinfo->fprintf_func (dinfo->stream, "[%d]", _BF (opnd, 3, 0));
  978. }
  979. /* 8-bit Constant value. */
  980. else if (_BF (opnd, 9, 8) == 0x3)
  981. dinfo->fprintf_func (dinfo->stream, "0x%x", _BF (opnd, 7, 0));
  982. else
  983. {
  984. dinfo->fprintf_func (dinfo->stream, "<opnd:0x%x>", opnd);
  985. return false;
  986. }
  987. return true;
  988. }
  989. /* Print a restricted/8-bit operand.
  990. This can mostly be generic across NFP families at the moment. */
  991. static bool
  992. nfp_me_print_opnd8 (unsigned int opnd, char bank, int num_ctx, int lmem_ext,
  993. unsigned int imm8_msb, struct disassemble_info *dinfo)
  994. {
  995. unsigned int n = _BF (opnd, (num_ctx == 8) ? 3 : 4, 0);
  996. /* Relative GPR. */
  997. if (_BF (opnd, 7, 5) == 0x0)
  998. dinfo->fprintf_func (dinfo->stream, "gpr%c_%d", bank, n);
  999. /* Relative Xfer. */
  1000. else if (_BF (opnd, 7, 5) == 0x4)
  1001. dinfo->fprintf_func (dinfo->stream, "$xfer_%d", n);
  1002. /* Relative Xfer. */
  1003. else if (_BF (opnd, 7, 5) == 0x6)
  1004. {
  1005. n += (num_ctx == 8 ? 16 : 32);
  1006. dinfo->fprintf_func (dinfo->stream, "$xfer_%d", n);
  1007. }
  1008. /* Indexed Xfer. */
  1009. else if ((_BF (opnd, 7, 4) == 0x4) && (!_BTST (opnd, 0)))
  1010. {
  1011. dinfo->fprintf_func (dinfo->stream, "*$index");
  1012. if (_BF (opnd, 2, 1) == 0x1)
  1013. dinfo->fprintf_func (dinfo->stream, "++");
  1014. else if (_BF (opnd, 2, 1) == 0x2)
  1015. dinfo->fprintf_func (dinfo->stream, "--");
  1016. }
  1017. /* Indexed NN. */
  1018. else if ((_BF (opnd, 7, 4) == 0x4) && (_BTST (opnd, 0)))
  1019. {
  1020. dinfo->fprintf_func (dinfo->stream, "*n$index");
  1021. if (_BTST (opnd, 1))
  1022. dinfo->fprintf_func (dinfo->stream, "++");
  1023. }
  1024. /* Indexed LMEM. */
  1025. else if (_BF (opnd, 7, 4) == 0x5)
  1026. {
  1027. n = _BF (opnd, 3, 3) + (lmem_ext * 2);
  1028. dinfo->fprintf_func (dinfo->stream, "*l$index%d", n);
  1029. if (_BF (opnd, 2, 0))
  1030. dinfo->fprintf_func (dinfo->stream, "[%d]", _BF (opnd, 2, 0));
  1031. }
  1032. /* 7+1-bit Constant value. */
  1033. else if (_BTST (opnd, 5))
  1034. {
  1035. n = (imm8_msb << 7) | _BFS (opnd, 7, 6, 5) | _BF (opnd, 4, 0);
  1036. dinfo->fprintf_func (dinfo->stream, "0x%x", n);
  1037. }
  1038. else
  1039. {
  1040. dinfo->fprintf_func (dinfo->stream, "<opnd:0x%x>", opnd);
  1041. return false;
  1042. }
  1043. return true;
  1044. }
  1045. static int
  1046. nfp_me27_28_print_alu_shf (uint64_t instr, unsigned int pred_cc,
  1047. unsigned int dst_lmext, unsigned int src_lmext,
  1048. unsigned int gpr_wrboth,
  1049. int num_ctx, struct disassemble_info *dinfo)
  1050. {
  1051. unsigned int op = _BF (instr, 35, 33);
  1052. unsigned int srcA = _BF (instr, 7, 0);
  1053. unsigned int srcB = _BF (instr, 17, 10);
  1054. unsigned int dst = _BF (instr, 27, 20);
  1055. unsigned int sc = _BF (instr, 9, 8);
  1056. unsigned int imm_msb = _BTST (instr, 18);
  1057. unsigned int swap = _BTST (instr, 19);
  1058. unsigned int shift = _BF (instr, 32, 28);
  1059. char dst_bank = 'A' + _BTST (instr, 36);
  1060. unsigned int nocc = _BTST (instr, 40);
  1061. bool err = false;
  1062. if (swap)
  1063. {
  1064. unsigned int tmp = srcA;
  1065. srcA = srcB;
  1066. srcB = tmp;
  1067. }
  1068. /* alu_shf, dbl_shf, asr. */
  1069. if (op < 7)
  1070. {
  1071. if (sc == 3)
  1072. dinfo->fprintf_func (dinfo->stream, "dbl_shf[");
  1073. else if (op == 6)
  1074. dinfo->fprintf_func (dinfo->stream, "asr[");
  1075. else
  1076. dinfo->fprintf_func (dinfo->stream, "alu_shf[");
  1077. /* dest operand */
  1078. if (nfp_me_is_imm_opnd8 (dst))
  1079. dinfo->fprintf_func (dinfo->stream, "--");
  1080. else
  1081. err = err || !nfp_me_print_opnd8 (dst, dst_bank, num_ctx,
  1082. dst_lmext, imm_msb, dinfo);
  1083. dinfo->fprintf_func (dinfo->stream, ", ");
  1084. /* A operand. */
  1085. if (op != 6)
  1086. {
  1087. if ((op < 2) && (sc != 3)) /* Not dbl_shf. */
  1088. dinfo->fprintf_func (dinfo->stream, "--"); /* B or ~B operator. */
  1089. else
  1090. err = err || !nfp_me_print_opnd8 (srcA, (swap) ? 'B' : 'A',
  1091. num_ctx, src_lmext, imm_msb,
  1092. dinfo);
  1093. dinfo->fprintf_func (dinfo->stream, ", ");
  1094. /* Operator (not for dbl_shf). */
  1095. if (sc != 3)
  1096. {
  1097. dinfo->fprintf_func (dinfo->stream, "%s, ",
  1098. nfp_mealu_shf_op[op]);
  1099. }
  1100. }
  1101. /* B operand. */
  1102. err = err || !nfp_me_print_opnd8 (srcB, (swap) ? 'A' : 'B',
  1103. num_ctx, src_lmext, imm_msb, dinfo);
  1104. dinfo->fprintf_func (dinfo->stream, ", ");
  1105. /* Shift */
  1106. if (sc == 0)
  1107. dinfo->fprintf_func (dinfo->stream, ">>rot%d", shift);
  1108. else if (sc == 2)
  1109. {
  1110. if (shift)
  1111. dinfo->fprintf_func (dinfo->stream, "<<%d", (32 - shift));
  1112. else
  1113. dinfo->fprintf_func (dinfo->stream, "<<indirect");
  1114. }
  1115. else
  1116. {
  1117. if (shift)
  1118. dinfo->fprintf_func (dinfo->stream, ">>%d", shift);
  1119. else
  1120. dinfo->fprintf_func (dinfo->stream, ">>indirect");
  1121. }
  1122. }
  1123. /* Byte Align. */
  1124. else if (op == 7)
  1125. {
  1126. dinfo->fprintf_func (dinfo->stream, "byte_align_%s[",
  1127. ((sc == 2) ? "le" : "be"));
  1128. /* Dest operand. */
  1129. if (nfp_me_is_imm_opnd8 (dst))
  1130. dinfo->fprintf_func (dinfo->stream, "--");
  1131. else
  1132. err = err || !nfp_me_print_opnd8 (dst, dst_bank, num_ctx,
  1133. dst_lmext, imm_msb, dinfo);
  1134. dinfo->fprintf_func (dinfo->stream, ", ");
  1135. if (sc == 2)
  1136. err = err || !nfp_me_print_opnd8 (srcA, (swap) ? 'B' : 'A', num_ctx,
  1137. 0, imm_msb, dinfo);
  1138. else
  1139. err = err || !nfp_me_print_opnd8 (srcB, (swap) ? 'A' : 'B', num_ctx,
  1140. 0, imm_msb, dinfo);
  1141. }
  1142. dinfo->fprintf_func (dinfo->stream, "]");
  1143. if (nocc)
  1144. dinfo->fprintf_func (dinfo->stream, ", no_cc");
  1145. if (gpr_wrboth)
  1146. dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
  1147. if (pred_cc)
  1148. dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
  1149. if (err)
  1150. return _NFP_ERR_CONT;
  1151. return 0;
  1152. }
  1153. static int
  1154. nfp_me27_28_print_alu (uint64_t instr, unsigned int pred_cc,
  1155. unsigned int dst_lmext, unsigned int src_lmext,
  1156. unsigned int gpr_wrboth,
  1157. int num_ctx, struct disassemble_info *dinfo)
  1158. {
  1159. unsigned int op = _BF (instr, 35, 31);
  1160. unsigned int srcA = _BF (instr, 9, 0);
  1161. unsigned int srcB = _BF (instr, 19, 10);
  1162. unsigned int dst = _BF (instr, 29, 20);
  1163. unsigned int swap = _BTST (instr, 30);
  1164. char dst_bank = 'A' + _BTST (instr, 36);
  1165. unsigned int nocc = _BTST (instr, 40);
  1166. int do_close_bracket = 1;
  1167. bool err = false;
  1168. if (swap)
  1169. {
  1170. unsigned int tmp = srcA;
  1171. srcA = srcB;
  1172. srcB = tmp;
  1173. }
  1174. switch (op)
  1175. {
  1176. case 3: /* pop_count3[dst, srcB] */
  1177. case 6: /* pop_count1[srcB] */
  1178. case 7: /* pop_count2[srcB] */
  1179. case 14: /* ffs[dst, srcB] */
  1180. case 15: /* cam_read_tag[dst, srcB] */
  1181. case 31: /* cam_read_state[dst, srcB] */
  1182. dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_alu_op[op]);
  1183. /* No dest for pop_count1/2. */
  1184. if ((op != 6) && (op != 7))
  1185. {
  1186. /* dest operand */
  1187. if (nfp_me_is_imm_opnd10 (dst))
  1188. dinfo->fprintf_func (dinfo->stream, "--");
  1189. else
  1190. err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
  1191. dst_lmext, dinfo);
  1192. dinfo->fprintf_func (dinfo->stream, ", ");
  1193. }
  1194. /* B operand. */
  1195. err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
  1196. num_ctx, src_lmext, dinfo);
  1197. break;
  1198. /* cam_clear. */
  1199. case 11:
  1200. do_close_bracket = 0;
  1201. dinfo->fprintf_func (dinfo->stream, "cam_clear");
  1202. break;
  1203. /* cam_lookup. */
  1204. case 23:
  1205. do_close_bracket = 0;
  1206. dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_alu_op[op]);
  1207. /* Dest operand. */
  1208. if (nfp_me_is_imm_opnd10 (dst))
  1209. dinfo->fprintf_func (dinfo->stream, "--");
  1210. else
  1211. err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
  1212. dst_lmext, dinfo);
  1213. dinfo->fprintf_func (dinfo->stream, ", ");
  1214. /* A operand. */
  1215. err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A',
  1216. num_ctx, src_lmext, dinfo);
  1217. dinfo->fprintf_func (dinfo->stream, "]");
  1218. if (_BF (srcB, 1, 0))
  1219. {
  1220. unsigned int n = _BTST (srcB, 1);
  1221. if (_BTST (srcB, 4)) /* Only for MEv28. */
  1222. n += 2;
  1223. dinfo->fprintf_func (dinfo->stream, ", lm_addr%d[%d]", n,
  1224. _BF (srcB, 3, 2));
  1225. }
  1226. break;
  1227. case 19: /* cam_write. */
  1228. case 27: /* cam_write_state. */
  1229. dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_alu_op[op]);
  1230. err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
  1231. num_ctx, src_lmext, dinfo);
  1232. dinfo->fprintf_func (dinfo->stream, ", ");
  1233. if (op == 19)
  1234. {
  1235. err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A',
  1236. num_ctx, src_lmext, dinfo);
  1237. dinfo->fprintf_func (dinfo->stream, ", ");
  1238. }
  1239. dinfo->fprintf_func (dinfo->stream, "%d", (dst & 0xf));
  1240. break;
  1241. /* CRC. */
  1242. case 18:
  1243. do_close_bracket = 0;
  1244. dinfo->fprintf_func (dinfo->stream, "crc_%s[",
  1245. _BTST (srcA, 3) ? "le" : "be");
  1246. if (!nfp_me27_28_crc_op[_BF (srcA, 7, 5)])
  1247. {
  1248. dinfo->fprintf_func (dinfo->stream, _(", <invalid CRC operator>, "));
  1249. err = true;
  1250. }
  1251. else
  1252. {
  1253. dinfo->fprintf_func (dinfo->stream, "%s, ",
  1254. nfp_me27_28_crc_op[_BF (srcA, 7, 5)]);
  1255. }
  1256. /* Dest operand. */
  1257. if (nfp_me_is_imm_opnd10 (dst))
  1258. dinfo->fprintf_func (dinfo->stream, "--");
  1259. else
  1260. err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
  1261. dst_lmext, dinfo);
  1262. dinfo->fprintf_func (dinfo->stream, ", ");
  1263. /* B operand. */
  1264. err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
  1265. num_ctx, src_lmext, dinfo);
  1266. dinfo->fprintf_func (dinfo->stream, "]");
  1267. if (_BF (srcA, 2, 0))
  1268. dinfo->fprintf_func (dinfo->stream, ", %s",
  1269. nfp_me27_28_crc_bytes[_BF (srcA, 2, 0)]);
  1270. if (_BTST (srcA, 4))
  1271. dinfo->fprintf_func (dinfo->stream, ", bit_swap");
  1272. break;
  1273. default:
  1274. /* s += 'alu[%s, %s, %s, %s]' % (dst, srcAs, op, srcBs). */
  1275. dinfo->fprintf_func (dinfo->stream, "alu[");
  1276. /* Dest operand. */
  1277. if (nfp_me_is_imm_opnd10 (dst))
  1278. dinfo->fprintf_func (dinfo->stream, "--");
  1279. else
  1280. err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
  1281. dst_lmext, dinfo);
  1282. dinfo->fprintf_func (dinfo->stream, ", ");
  1283. /* A operand. */
  1284. if ((op == 0) || (op == 4)) /* B only operators. */
  1285. dinfo->fprintf_func (dinfo->stream, "--");
  1286. else
  1287. err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A',
  1288. num_ctx, src_lmext, dinfo);
  1289. if (!nfp_me27_28_alu_op[op])
  1290. {
  1291. dinfo->fprintf_func (dinfo->stream, ", <operator:0x%x>, ", op);
  1292. err = true;
  1293. }
  1294. else
  1295. {
  1296. dinfo->fprintf_func (dinfo->stream, ", %s, ",
  1297. nfp_me27_28_alu_op[op]);
  1298. }
  1299. /* B operand. */
  1300. err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
  1301. num_ctx, src_lmext, dinfo);
  1302. break;
  1303. }
  1304. if (do_close_bracket)
  1305. dinfo->fprintf_func (dinfo->stream, "]");
  1306. if (nocc)
  1307. dinfo->fprintf_func (dinfo->stream, ", no_cc");
  1308. if (gpr_wrboth)
  1309. dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
  1310. if (pred_cc)
  1311. dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
  1312. if (err)
  1313. return _NFP_ERR_CONT;
  1314. return 0;
  1315. }
  1316. static int
  1317. nfp_me27_28_print_immed (uint64_t instr, unsigned int pred_cc,
  1318. unsigned int dst_lmext,
  1319. unsigned int gpr_wrboth,
  1320. int num_ctx, struct disassemble_info *dinfo)
  1321. {
  1322. unsigned int srcA = _BF (instr, 9, 0);
  1323. unsigned int srcB = _BF (instr, 19, 10);
  1324. unsigned int imm = _BF (instr, 27, 20);
  1325. unsigned int by = _BTST (instr, 29);
  1326. unsigned int wd = _BTST (instr, 30);
  1327. unsigned int inv = _BTST (instr, 31);
  1328. unsigned int byte_shift = _BF (instr, 34, 33);
  1329. bool err = false;
  1330. if (nfp_me_is_imm_opnd10 (srcB))
  1331. {
  1332. imm = (imm << 8) | nfp_me_imm_opnd10 (srcB);
  1333. if (nfp_me_is_imm_opnd10 (srcA) && (imm == 0))
  1334. {
  1335. dinfo->fprintf_func (dinfo->stream, "nop");
  1336. return 0;
  1337. }
  1338. }
  1339. else
  1340. {
  1341. imm = (imm << 8) | nfp_me_imm_opnd10 (srcA);
  1342. }
  1343. if (inv)
  1344. imm = (imm ^ 0xffff) | 0xffff0000U;
  1345. if (by)
  1346. {
  1347. dinfo->fprintf_func (dinfo->stream, "immed_b%d[", byte_shift);
  1348. imm &= 0xff;
  1349. }
  1350. else if (wd)
  1351. {
  1352. dinfo->fprintf_func (dinfo->stream, "immed_w%d[", (byte_shift / 2));
  1353. imm &= 0xffff;
  1354. }
  1355. else
  1356. dinfo->fprintf_func (dinfo->stream, "immed[");
  1357. /* Dest. */
  1358. if (nfp_me_is_imm_opnd10 (srcA) && nfp_me_is_imm_opnd10 (srcB))
  1359. dinfo->fprintf_func (dinfo->stream, "--"); /* No Dest. */
  1360. else if (nfp_me_is_imm_opnd10 (srcA))
  1361. err = err || !nfp_me_print_opnd10 (srcB, 'B', num_ctx, dst_lmext, dinfo);
  1362. else
  1363. err = err || !nfp_me_print_opnd10 (srcA, 'A', num_ctx, dst_lmext, dinfo);
  1364. dinfo->fprintf_func (dinfo->stream, ", 0x%x", imm);
  1365. if ((!by) && (!wd) && (byte_shift))
  1366. dinfo->fprintf_func (dinfo->stream, ", <<%d", (byte_shift * 8));
  1367. dinfo->fprintf_func (dinfo->stream, "]");
  1368. if (gpr_wrboth)
  1369. dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
  1370. if (pred_cc)
  1371. dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
  1372. if (err)
  1373. return _NFP_ERR_CONT;
  1374. return 0;
  1375. }
  1376. static int
  1377. nfp_me27_28_print_ld_field (uint64_t instr, unsigned int pred_cc,
  1378. unsigned int dst_lmext, unsigned int src_lmext,
  1379. unsigned int gpr_wrboth,
  1380. int num_ctx, struct disassemble_info *dinfo)
  1381. {
  1382. unsigned int load_cc = _BTST (instr, 34);
  1383. unsigned int shift = _BF (instr, 32, 28);
  1384. unsigned int byte_mask = _BF (instr, 27, 24);
  1385. unsigned int zerof = _BTST (instr, 20);
  1386. unsigned int swap = _BTST (instr, 19);
  1387. unsigned int imm_msb = _BTST (instr, 18);
  1388. unsigned int src = _BF (instr, 17, 10);
  1389. unsigned int sc = _BF (instr, 9, 8);
  1390. unsigned int dst = _BF (instr, 7, 0);
  1391. bool err = false;
  1392. if (swap)
  1393. {
  1394. unsigned int tmp = src;
  1395. src = dst;
  1396. dst = tmp;
  1397. }
  1398. if (zerof)
  1399. dinfo->fprintf_func (dinfo->stream, "ld_field_w_clr[");
  1400. else
  1401. dinfo->fprintf_func (dinfo->stream, "ld_field[");
  1402. err = err || !nfp_me_print_opnd8 (dst, (swap) ? 'B' : 'A', num_ctx,
  1403. dst_lmext, imm_msb, dinfo);
  1404. dinfo->fprintf_func (dinfo->stream, ", %d%d%d%d, ",
  1405. _BTST (byte_mask, 3),
  1406. _BTST (byte_mask, 2),
  1407. _BTST (byte_mask, 1), _BTST (byte_mask, 0));
  1408. err = err || !nfp_me_print_opnd8 (src, (swap) ? 'A' : 'B', num_ctx,
  1409. src_lmext, imm_msb, dinfo);
  1410. if ((sc == 0) && (shift != 0))
  1411. dinfo->fprintf_func (dinfo->stream, ", >>rot%d", shift);
  1412. else if (sc == 1)
  1413. {
  1414. if (shift)
  1415. dinfo->fprintf_func (dinfo->stream, ", >>%d", shift);
  1416. else
  1417. dinfo->fprintf_func (dinfo->stream, ", >>indirect");
  1418. }
  1419. else if (sc == 2)
  1420. {
  1421. if (shift)
  1422. dinfo->fprintf_func (dinfo->stream, ", <<%d", (32 - shift));
  1423. else
  1424. dinfo->fprintf_func (dinfo->stream, ", <<indirect");
  1425. }
  1426. else if (sc == 3)
  1427. dinfo->fprintf_func (dinfo->stream, ", >>dbl%d", shift);
  1428. dinfo->fprintf_func (dinfo->stream, "]");
  1429. if (load_cc)
  1430. dinfo->fprintf_func (dinfo->stream, ", load_cc");
  1431. if (gpr_wrboth)
  1432. dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
  1433. if (pred_cc)
  1434. dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
  1435. if (err)
  1436. return _NFP_ERR_CONT;
  1437. return 0;
  1438. }
  1439. static int
  1440. nfp_me27_28_print_ctx_arb (uint64_t instr, struct disassemble_info *dinfo)
  1441. {
  1442. unsigned int resume_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
  1443. unsigned int defer = _BF (instr, 21, 20);
  1444. unsigned int no_load = _BTST (instr, 19);
  1445. unsigned int resume = _BTST (instr, 18);
  1446. unsigned int bpt = _BTST (instr, 17);
  1447. unsigned int sig_or = _BTST (instr, 16);
  1448. unsigned int ev_mask = _BF (instr, 15, 0);
  1449. dinfo->fprintf_func (dinfo->stream, "ctx_arb[");
  1450. if (bpt)
  1451. dinfo->fprintf_func (dinfo->stream, "bpt");
  1452. else if (ev_mask == 1)
  1453. dinfo->fprintf_func (dinfo->stream, "voluntary");
  1454. else if ((!no_load) && (ev_mask == 0))
  1455. {
  1456. dinfo->fprintf_func (dinfo->stream, "kill");
  1457. sig_or = 0;
  1458. }
  1459. else if (ev_mask == 0)
  1460. dinfo->fprintf_func (dinfo->stream, "--");
  1461. else
  1462. {
  1463. int first_print = 1;
  1464. unsigned int n;
  1465. for (n = 1; n < 16; n++)
  1466. {
  1467. if (!_BTST (ev_mask, n))
  1468. continue;
  1469. dinfo->fprintf_func (dinfo->stream, "%ssig%d",
  1470. (first_print) ? "" : ", ", n);
  1471. first_print = 0;
  1472. }
  1473. }
  1474. dinfo->fprintf_func (dinfo->stream, "]");
  1475. if (sig_or)
  1476. dinfo->fprintf_func (dinfo->stream, ", any");
  1477. if (resume)
  1478. dinfo->fprintf_func (dinfo->stream, ", br[.%d]", resume_addr);
  1479. if (defer)
  1480. dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
  1481. return 0;
  1482. }
  1483. static int
  1484. nfp_me27_28_print_local_csr (uint64_t instr,
  1485. unsigned int src_lmext,
  1486. int num_ctx, struct disassemble_info *dinfo)
  1487. {
  1488. unsigned int srcA = _BF (instr, 9, 0);
  1489. unsigned int srcB = _BF (instr, 19, 10);
  1490. unsigned int wr = _BTST (instr, 21);
  1491. unsigned int csr_num = _BF (instr, 32, 22);
  1492. unsigned int src = srcA;
  1493. char src_bank = 'A';
  1494. bool err = false;
  1495. if (nfp_me_is_imm_opnd10 (srcA) && !nfp_me_is_imm_opnd10 (srcB))
  1496. {
  1497. src_bank = 'B';
  1498. src = srcB;
  1499. }
  1500. /* MEv28 does not have urd/uwr. */
  1501. if (csr_num == 1)
  1502. {
  1503. if (wr)
  1504. {
  1505. dinfo->fprintf_func (dinfo->stream, "uwr[*u$index%d++, ",
  1506. (int) _BTST (instr, 20));
  1507. err = err || !nfp_me_print_opnd10 (src, src_bank, num_ctx,
  1508. src_lmext, dinfo);
  1509. }
  1510. else
  1511. {
  1512. dinfo->fprintf_func (dinfo->stream, "urd[");
  1513. err = err || !nfp_me_print_opnd10 (src, src_bank, num_ctx,
  1514. src_lmext, dinfo);
  1515. dinfo->fprintf_func (dinfo->stream, ", *u$index%d++",
  1516. (int) _BTST (instr, 20));
  1517. }
  1518. dinfo->fprintf_func (dinfo->stream, "]");
  1519. }
  1520. else
  1521. {
  1522. const char *nm = NULL;
  1523. if (csr_num < ARRAY_SIZE (nfp_me27_28_mecsrs))
  1524. nm = nfp_me27_28_mecsrs[csr_num];
  1525. dinfo->fprintf_func (dinfo->stream, "local_csr_%s[",
  1526. (wr) ? "wr" : "rd");
  1527. if (nm)
  1528. dinfo->fprintf_func (dinfo->stream, "%s", nm);
  1529. else
  1530. dinfo->fprintf_func (dinfo->stream, "0x%x", (csr_num * 4));
  1531. if (wr)
  1532. {
  1533. dinfo->fprintf_func (dinfo->stream, ", ");
  1534. err = err || !nfp_me_print_opnd10 (src, src_bank, num_ctx,
  1535. src_lmext, dinfo);
  1536. }
  1537. dinfo->fprintf_func (dinfo->stream, "]");
  1538. }
  1539. if (err)
  1540. return _NFP_ERR_CONT;
  1541. return 0;
  1542. }
  1543. static int
  1544. nfp_me27_28_print_branch (uint64_t instr,
  1545. const char *br_inpstates[16],
  1546. struct disassemble_info *dinfo)
  1547. {
  1548. unsigned int br_op = _BF (instr, 4, 0);
  1549. unsigned int ctx_sig_state = _BF (instr, 17, 14);
  1550. unsigned int defer = _BF (instr, 21, 20);
  1551. unsigned int br_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
  1552. int ret = 0;
  1553. if (!nfp_me27_28_br_ops[br_op])
  1554. {
  1555. dinfo->fprintf_func (dinfo->stream, _("<invalid branch>["));
  1556. ret = _NFP_ERR_CONT;
  1557. }
  1558. else
  1559. dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_br_ops[br_op]);
  1560. switch (br_op)
  1561. {
  1562. case 16: /* br=ctx */
  1563. case 17: /* br!=ctx */
  1564. case 18: /* br_signal */
  1565. case 19: /* br_!signal */
  1566. dinfo->fprintf_func (dinfo->stream, "%d, ", ctx_sig_state);
  1567. break;
  1568. case 20: /* "br_inp_state" */
  1569. case 21: /* "br_!inp_state" */
  1570. dinfo->fprintf_func (dinfo->stream, "%s, ",
  1571. br_inpstates[ctx_sig_state]);
  1572. break;
  1573. case 22: /* "br_cls_state" */
  1574. case 23: /* "br_!cls_state" */
  1575. dinfo->fprintf_func (dinfo->stream, "cls_ring%d_status, ",
  1576. ctx_sig_state);
  1577. break;
  1578. default:
  1579. break;
  1580. }
  1581. dinfo->fprintf_func (dinfo->stream, ".%d]", br_addr);
  1582. if (defer)
  1583. dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
  1584. return ret;
  1585. }
  1586. static int
  1587. nfp_me27_28_print_br_byte (uint64_t instr,
  1588. unsigned int src_lmext, int num_ctx,
  1589. struct disassemble_info *dinfo)
  1590. {
  1591. unsigned int srcA = _BF (instr, 7, 0);
  1592. unsigned int by = _BF (instr, 9, 8);
  1593. unsigned int srcB = _BF (instr, 17, 10);
  1594. unsigned int imm_msb = _BTST (instr, 18);
  1595. unsigned int eq = _BTST (instr, 19);
  1596. unsigned int defer = _BF (instr, 21, 20);
  1597. unsigned int br_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
  1598. bool err = false;
  1599. if (eq)
  1600. dinfo->fprintf_func (dinfo->stream, "br=byte[");
  1601. else
  1602. dinfo->fprintf_func (dinfo->stream, "br!=byte[");
  1603. if (nfp_me_is_imm_opnd8 (srcA))
  1604. err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx,
  1605. src_lmext, imm_msb, dinfo);
  1606. else
  1607. err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx,
  1608. src_lmext, imm_msb, dinfo);
  1609. dinfo->fprintf_func (dinfo->stream, ", %d, ", by);
  1610. if (nfp_me_is_imm_opnd8 (srcA))
  1611. err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx,
  1612. src_lmext, imm_msb, dinfo);
  1613. else
  1614. err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx,
  1615. src_lmext, imm_msb, dinfo);
  1616. dinfo->fprintf_func (dinfo->stream, ", .%d]", br_addr);
  1617. if (defer)
  1618. dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
  1619. if (err)
  1620. return _NFP_ERR_CONT;
  1621. return 0;
  1622. }
  1623. static int
  1624. nfp_me27_28_print_br_bit (uint64_t instr, unsigned int src_lmext,
  1625. int num_ctx, struct disassemble_info *dinfo)
  1626. {
  1627. unsigned int srcA = _BF (instr, 7, 0);
  1628. unsigned int srcB = _BF (instr, 17, 10);
  1629. unsigned int b = _BTST (instr, 18);
  1630. unsigned int defer = _BF (instr, 21, 20);
  1631. unsigned int br_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
  1632. bool err = false;
  1633. if (b)
  1634. dinfo->fprintf_func (dinfo->stream, "br_bset[");
  1635. else
  1636. dinfo->fprintf_func (dinfo->stream, "br_bclr[");
  1637. if (nfp_me_is_imm_opnd8 (srcA))
  1638. {
  1639. err = err
  1640. || !nfp_me_print_opnd8 (srcB, 'B', num_ctx, src_lmext, 0, dinfo);
  1641. b = (nfp_me_imm_opnd8 (srcA, 0) - 1) & 0x1f;
  1642. }
  1643. else
  1644. {
  1645. err = err
  1646. || !nfp_me_print_opnd8 (srcA, 'A', num_ctx, src_lmext, 0, dinfo);
  1647. b = (nfp_me_imm_opnd8 (srcB, 0) - 1) & 0x1f;
  1648. }
  1649. dinfo->fprintf_func (dinfo->stream, ", %d, .%d]", b, br_addr);
  1650. if (defer)
  1651. dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
  1652. if (err)
  1653. return _NFP_ERR_CONT;
  1654. return 0;
  1655. }
  1656. static int
  1657. nfp_me27_28_print_br_alu (uint64_t instr, unsigned int src_lmext,
  1658. int num_ctx, struct disassemble_info *dinfo)
  1659. {
  1660. unsigned int srcA = _BF (instr, 9, 0);
  1661. unsigned int srcB = _BF (instr, 19, 10);
  1662. unsigned int defer = _BF (instr, 21, 20);
  1663. unsigned int imm = _BF (instr, 30, 22);
  1664. bool err = false;
  1665. if (nfp_me_is_imm_opnd10 (srcA))
  1666. imm = (imm << 8) | nfp_me_imm_opnd10 (srcA);
  1667. else
  1668. imm = (imm << 8) | nfp_me_imm_opnd10 (srcB);
  1669. if (!imm)
  1670. dinfo->fprintf_func (dinfo->stream, "rtn[");
  1671. else
  1672. dinfo->fprintf_func (dinfo->stream, "jump[");
  1673. if (nfp_me_is_imm_opnd10 (srcA))
  1674. err = err || !nfp_me_print_opnd10 (srcB, 'B', num_ctx, src_lmext, dinfo);
  1675. else
  1676. err = err || !nfp_me_print_opnd10 (srcA, 'A', num_ctx, src_lmext, dinfo);
  1677. if (imm)
  1678. dinfo->fprintf_func (dinfo->stream, ", .%d", imm);
  1679. dinfo->fprintf_func (dinfo->stream, "]");
  1680. if (defer)
  1681. dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
  1682. if (err)
  1683. return _NFP_ERR_CONT;
  1684. return 0;
  1685. }
  1686. static int
  1687. nfp_me27_28_print_mult (uint64_t instr, unsigned int pred_cc,
  1688. unsigned int dst_lmext, unsigned int src_lmext,
  1689. unsigned int gpr_wrboth,
  1690. int num_ctx, struct disassemble_info *dinfo)
  1691. {
  1692. unsigned int srcA = _BF (instr, 9, 0);
  1693. unsigned int srcB = _BF (instr, 19, 10);
  1694. unsigned int mstep = _BF (instr, 22, 20);
  1695. char dst_bank = 'A' + _BTST (instr, 23);
  1696. unsigned int swap = _BTST (instr, 30);
  1697. unsigned int mtype = _BF (instr, 32, 31);
  1698. unsigned int nocc = _BTST (instr, 40);
  1699. bool err = false;
  1700. if (swap)
  1701. {
  1702. unsigned int tmp = srcA;
  1703. srcA = srcB;
  1704. srcB = tmp;
  1705. }
  1706. dinfo->fprintf_func (dinfo->stream, "mul_step[");
  1707. if (mstep >= 4)
  1708. err = err
  1709. || !nfp_me_print_opnd10 (srcA, dst_bank, num_ctx, dst_lmext, dinfo);
  1710. else
  1711. err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A', num_ctx,
  1712. src_lmext, dinfo);
  1713. dinfo->fprintf_func (dinfo->stream, ", ");
  1714. if (mstep >= 4)
  1715. dinfo->fprintf_func (dinfo->stream, "--");
  1716. else
  1717. err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B', num_ctx,
  1718. src_lmext, dinfo);
  1719. dinfo->fprintf_func (dinfo->stream, "], %s", nfp_me27_28_mult_types[mtype]);
  1720. if (mtype > 0)
  1721. {
  1722. const char *s = nfp_me27_28_mult_steps[mstep];
  1723. if (!s)
  1724. {
  1725. s = "<invalid mul_step>";
  1726. err = true;
  1727. }
  1728. dinfo->fprintf_func (dinfo->stream, "_%s", s);
  1729. }
  1730. if (nocc)
  1731. dinfo->fprintf_func (dinfo->stream, ", no_cc");
  1732. if (gpr_wrboth)
  1733. dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
  1734. if (pred_cc)
  1735. dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
  1736. if (err)
  1737. return _NFP_ERR_CONT;
  1738. return 0;
  1739. }
  1740. static int
  1741. _nfp_cmp_mnmnc (const void *arg_a, const void *arg_b)
  1742. {
  1743. const nfp_cmd_mnemonic *a = arg_a;
  1744. const nfp_cmd_mnemonic *b = arg_b;
  1745. if (a->cpp_target != b->cpp_target)
  1746. return (a->cpp_target > b->cpp_target) - (a->cpp_target < b->cpp_target);
  1747. if (a->cpp_action != b->cpp_action)
  1748. return (a->cpp_action > b->cpp_action) - (a->cpp_action < b->cpp_action);
  1749. return (a->cpp_token > b->cpp_token) - (a->cpp_token < b->cpp_token);
  1750. }
  1751. static const char *
  1752. nfp_me_find_mnemonic (unsigned int cpp_tgt, unsigned int cpp_act,
  1753. unsigned int cpp_tok, unsigned int cpp_len,
  1754. const nfp_cmd_mnemonic * mnemonics,
  1755. size_t mnemonics_cnt)
  1756. {
  1757. nfp_cmd_mnemonic search_key = { cpp_tgt, cpp_act, cpp_tok, 0, 0, NULL };
  1758. const nfp_cmd_mnemonic *cmd = NULL;
  1759. cmd = bsearch (&search_key, mnemonics, mnemonics_cnt,
  1760. sizeof (nfp_cmd_mnemonic), _nfp_cmp_mnmnc);
  1761. if (!cmd)
  1762. return NULL;
  1763. /* Make sure we backtrack to the first entry that still matches the three
  1764. bsearched fields - then we simply iterate and compare cpp_len. */
  1765. while ((cmd > mnemonics) && (_nfp_cmp_mnmnc (&cmd[-1], &search_key) == 0))
  1766. --cmd;
  1767. /* Now compare by cpp_len and make sure we stay in range. */
  1768. for (; (cmd < (mnemonics + mnemonics_cnt))
  1769. && (_nfp_cmp_mnmnc (cmd, &search_key) == 0); ++cmd)
  1770. {
  1771. if ((cpp_len & cmd->len_mask) == cmd->len_fixed)
  1772. return cmd->mnemonic;
  1773. }
  1774. return NULL;
  1775. }
  1776. /* NFP-32xx (ME Version 2.7). */
  1777. static int
  1778. nfp_me27_print_cmd (uint64_t instr, int third_party_32bit,
  1779. int num_ctx, struct disassemble_info *dinfo)
  1780. {
  1781. unsigned int srcA = _BF (instr, 7, 0);
  1782. unsigned int ctxswap_defer = _BF (instr, 9, 8);
  1783. unsigned int srcB = _BF (instr, 17, 10);
  1784. unsigned int token = _BF (instr, 19, 18);
  1785. unsigned int xfer = _BFS (instr, 40, 40, 5) | _BF (instr, 24, 20);
  1786. unsigned int cpp_len = _BF (instr, 27, 25);
  1787. unsigned int sig = _BF (instr, 31, 28);
  1788. unsigned int tgtcmd = _BF (instr, 38, 32);
  1789. unsigned int indref = _BTST (instr, 41);
  1790. unsigned int mode = _BF (instr, 44, 42);
  1791. bool err = false;
  1792. int cpp_target = -1;
  1793. int cpp_action = -1;
  1794. const char *mnemonic = NULL;
  1795. unsigned int imm;
  1796. unsigned int valBA;
  1797. int visswap = ((mode == 1) || (mode == 3));
  1798. imm = (sig << 10) | (cpp_len << 7) | ((xfer & 0x1f) << 2) | token;
  1799. valBA = (srcB << 8) | srcA;
  1800. if (mode == 6)
  1801. {
  1802. token = 0;
  1803. sig = 0;
  1804. xfer = 0;
  1805. }
  1806. /* Convert tgtcmd to action/token tuple. */
  1807. if (_BF (tgtcmd, 6, 5) == 0x0)
  1808. {
  1809. switch (_BF (tgtcmd, 4, 2))
  1810. {
  1811. case 0:
  1812. cpp_target = NFP_3200_CPPTGT_CAP;
  1813. dinfo->fprintf_func (dinfo->stream, "cap[");
  1814. break;
  1815. case 1:
  1816. cpp_target = NFP_3200_CPPTGT_MSF0;
  1817. dinfo->fprintf_func (dinfo->stream, "msf0[");
  1818. break;
  1819. case 2:
  1820. cpp_target = NFP_3200_CPPTGT_MSF1;
  1821. dinfo->fprintf_func (dinfo->stream, "msf1[");
  1822. break;
  1823. case 3:
  1824. cpp_target = NFP_3200_CPPTGT_PCIE;
  1825. dinfo->fprintf_func (dinfo->stream, "pcie[");
  1826. break;
  1827. case 4:
  1828. cpp_target = NFP_3200_CPPTGT_HASH;
  1829. break;
  1830. case 5:
  1831. cpp_target = NFP_3200_CPPTGT_CRYPTO;
  1832. dinfo->fprintf_func (dinfo->stream, "crypto[");
  1833. break;
  1834. case 6:
  1835. cpp_target = NFP_3200_CPPTGT_ARM;
  1836. dinfo->fprintf_func (dinfo->stream, "arm[");
  1837. break;
  1838. case 7:
  1839. cpp_target = NFP_3200_CPPTGT_CT;
  1840. dinfo->fprintf_func (dinfo->stream, "ct[");
  1841. break;
  1842. }
  1843. cpp_action = _BF (tgtcmd, 1, 0);
  1844. }
  1845. else
  1846. {
  1847. switch (_BF (tgtcmd, 6, 4))
  1848. {
  1849. case 2:
  1850. cpp_target = NFP_3200_CPPTGT_GS;
  1851. dinfo->fprintf_func (dinfo->stream, "scratch[");
  1852. break;
  1853. case 3:
  1854. cpp_target = NFP_3200_CPPTGT_QDR; /* A.k.a. SRAM. */
  1855. dinfo->fprintf_func (dinfo->stream, "sram[");
  1856. break;
  1857. case 4:
  1858. case 5:
  1859. cpp_target = NFP_3200_CPPTGT_MU;
  1860. dinfo->fprintf_func (dinfo->stream, "mem[");
  1861. break;
  1862. case 6:
  1863. case 7:
  1864. cpp_target = NFP_3200_CPPTGT_CLS;
  1865. dinfo->fprintf_func (dinfo->stream, "cls[");
  1866. break;
  1867. }
  1868. cpp_action = _BF (tgtcmd, 3, 0);
  1869. }
  1870. if (cpp_target < 0)
  1871. {
  1872. dinfo->fprintf_func (dinfo->stream, _("<invalid cmd target %d:%d:%d>[]"),
  1873. cpp_target, cpp_action, token);
  1874. return _NFP_ERR_CONT;
  1875. }
  1876. mnemonic = nfp_me_find_mnemonic (cpp_target, cpp_action, token, cpp_len,
  1877. nfp_me27_mnemonics,
  1878. ARRAY_SIZE (nfp_me27_mnemonics));
  1879. if (!mnemonic)
  1880. {
  1881. dinfo->fprintf_func (dinfo->stream, _("<invalid cmd action %d:%d:%d>[]"),
  1882. cpp_target, cpp_action, token);
  1883. return _NFP_ERR_CONT;
  1884. }
  1885. if (cpp_target == NFP_3200_CPPTGT_HASH)
  1886. {
  1887. dinfo->fprintf_func (dinfo->stream, "%s[$xfer_%d, %d",
  1888. mnemonic, xfer, cpp_len);
  1889. goto print_opt_toks;
  1890. }
  1891. dinfo->fprintf_func (dinfo->stream, "%s, ", mnemonic);
  1892. if (visswap)
  1893. {
  1894. unsigned int tmp = srcA;
  1895. srcA = srcB;
  1896. srcB = tmp;
  1897. }
  1898. switch (mode)
  1899. {
  1900. case 0: /* (A << 8) + B. */
  1901. case 1: /* (B << 8) + A. */
  1902. dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
  1903. err = err
  1904. || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
  1905. dinfo->fprintf_func (dinfo->stream, ", <<8, ");
  1906. err = err
  1907. || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
  1908. dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
  1909. break;
  1910. case 2: /* Accelerated 3rd party (A[ << 8]) + B. */
  1911. case 3: /* Accelerated 3rd party (B[ << 8]) + A. */
  1912. dinfo->fprintf_func (dinfo->stream, "0x%x, ", (indref << 6) | xfer);
  1913. err = err
  1914. || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
  1915. if (third_party_32bit)
  1916. dinfo->fprintf_func (dinfo->stream, ", ");
  1917. else
  1918. dinfo->fprintf_func (dinfo->stream, ", <<8, ");
  1919. err = err
  1920. || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
  1921. dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
  1922. break;
  1923. case 4: /* A + B. */
  1924. dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
  1925. err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx, 0, 0, dinfo);
  1926. dinfo->fprintf_func (dinfo->stream, ", ");
  1927. err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx, 0, 0, dinfo);
  1928. dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
  1929. break;
  1930. case 5: /* Immediate address. */
  1931. dinfo->fprintf_func (dinfo->stream, "$xfer_%d, 0x%x, %d", xfer, valBA,
  1932. (cpp_len + 1));
  1933. break;
  1934. case 6: /* Immediate address and data. */
  1935. dinfo->fprintf_func (dinfo->stream, "0x%x, 0x%x", valBA, imm);
  1936. break;
  1937. case 7: /* Immediate data. */
  1938. dinfo->fprintf_func (dinfo->stream, "0x%x, --, %d",
  1939. ((xfer << 16) | valBA), (cpp_len + 1));
  1940. break;
  1941. }
  1942. print_opt_toks:
  1943. dinfo->fprintf_func (dinfo->stream, "]");
  1944. if (indref && (mode != 2) && (mode != 3))
  1945. dinfo->fprintf_func (dinfo->stream, ", indirect_ref");
  1946. if (ctxswap_defer != 3)
  1947. {
  1948. dinfo->fprintf_func (dinfo->stream, ", ctx_swap[");
  1949. if (sig)
  1950. dinfo->fprintf_func (dinfo->stream, "sig%d]", sig);
  1951. else
  1952. dinfo->fprintf_func (dinfo->stream, "--]");
  1953. if (ctxswap_defer != 0)
  1954. dinfo->fprintf_func (dinfo->stream, ", defer[%d]", ctxswap_defer);
  1955. }
  1956. else if (sig)
  1957. dinfo->fprintf_func (dinfo->stream, ", sig_done[sig%d]", sig);
  1958. if (err)
  1959. return _NFP_ERR_CONT;
  1960. return 0;
  1961. }
  1962. static int
  1963. nfp_me27_print_alu_shf (uint64_t instr, int num_ctx,
  1964. struct disassemble_info *dinfo)
  1965. {
  1966. return nfp_me27_28_print_alu_shf (instr, 0, 0, 0, 0, num_ctx, dinfo);
  1967. }
  1968. static int
  1969. nfp_me27_print_alu (uint64_t instr, int num_ctx,
  1970. struct disassemble_info *dinfo)
  1971. {
  1972. return nfp_me27_28_print_alu_shf (instr, 0, 0, 0, 0, num_ctx, dinfo);
  1973. }
  1974. static int
  1975. nfp_me27_print_immed (uint64_t instr, int num_ctx,
  1976. struct disassemble_info *dinfo)
  1977. {
  1978. return nfp_me27_28_print_immed (instr, 0, 0, 0, num_ctx, dinfo);
  1979. }
  1980. static int
  1981. nfp_me27_print_ld_field (uint64_t instr, int num_ctx,
  1982. struct disassemble_info *dinfo)
  1983. {
  1984. return nfp_me27_28_print_ld_field (instr, 0, 0, 0, 0, num_ctx, dinfo);
  1985. }
  1986. static int
  1987. nfp_me27_print_ctx_arb (uint64_t instr, struct disassemble_info *dinfo)
  1988. {
  1989. return nfp_me27_28_print_ctx_arb (instr, dinfo);
  1990. }
  1991. static int
  1992. nfp_me27_print_local_csr (uint64_t instr, int num_ctx,
  1993. struct disassemble_info *dinfo)
  1994. {
  1995. return nfp_me27_28_print_local_csr (instr, 0, num_ctx, dinfo);
  1996. }
  1997. static int
  1998. nfp_me27_print_branch (uint64_t instr, struct disassemble_info *dinfo)
  1999. {
  2000. return nfp_me27_28_print_branch (instr, nfp_me27_br_inpstates, dinfo);
  2001. }
  2002. static int
  2003. nfp_me27_print_br_byte (uint64_t instr, int num_ctx,
  2004. struct disassemble_info *dinfo)
  2005. {
  2006. return nfp_me27_28_print_br_byte (instr, 0, num_ctx, dinfo);
  2007. }
  2008. static int
  2009. nfp_me27_print_br_bit (uint64_t instr, int num_ctx,
  2010. struct disassemble_info *dinfo)
  2011. {
  2012. return nfp_me27_28_print_br_bit (instr, 0, num_ctx, dinfo);
  2013. }
  2014. static int
  2015. nfp_me27_print_br_alu (uint64_t instr, int num_ctx,
  2016. struct disassemble_info *dinfo)
  2017. {
  2018. return nfp_me27_28_print_br_alu (instr, 0, num_ctx, dinfo);
  2019. }
  2020. static int
  2021. nfp_me27_print_mult (uint64_t instr, int num_ctx,
  2022. struct disassemble_info *dinfo)
  2023. {
  2024. return nfp_me27_28_print_mult (instr, 0, 0, 0, 0, num_ctx, dinfo);
  2025. }
  2026. /*NFP-6xxx/4xxx (ME Version 2.8). */
  2027. static int
  2028. nfp_me28_print_cmd (uint64_t instr, int third_party_32bit,
  2029. int num_ctx, struct disassemble_info *dinfo)
  2030. {
  2031. unsigned int srcA = _BF (instr, 7, 0);
  2032. unsigned int ctxswap_defer = _BF (instr, 9, 8);
  2033. unsigned int srcB = _BF (instr, 17, 10);
  2034. unsigned int token = _BF (instr, 19, 18);
  2035. unsigned int xfer = _BFS (instr, 40, 40, 5) | _BF (instr, 24, 20);
  2036. unsigned int cpp_len = _BF (instr, 27, 25);
  2037. unsigned int sig = _BF (instr, 31, 28);
  2038. unsigned int tgtcmd = _BF (instr, 38, 32);
  2039. unsigned int indref = _BTST (instr, 41);
  2040. unsigned int mode = _BF (instr, 44, 42);
  2041. bool err = false;
  2042. int cpp_target = -1;
  2043. int cpp_action = -1;
  2044. const char *mnemonic = NULL;
  2045. unsigned int imm;
  2046. unsigned int valBA;
  2047. int visswap = ((mode == 1) || (mode == 3));
  2048. imm = (sig << 10) | (cpp_len << 7) | ((xfer & 0x1f) << 2) | token;
  2049. valBA = (srcB << 8) | srcA;
  2050. if (mode == 6)
  2051. {
  2052. token = 0;
  2053. sig = 0;
  2054. xfer = 0;
  2055. }
  2056. /* Convert tgtcmd to action/token tuple. */
  2057. if (_BF (tgtcmd, 6, 5) == 0x0)
  2058. {
  2059. switch (_BF (tgtcmd, 4, 2))
  2060. {
  2061. case 0:
  2062. cpp_target = NFP_6000_CPPTGT_ILA;
  2063. dinfo->fprintf_func (dinfo->stream, "ila[");
  2064. break;
  2065. case 1:
  2066. cpp_target = NFP_6000_CPPTGT_NBI;
  2067. dinfo->fprintf_func (dinfo->stream, "nbi[");
  2068. break;
  2069. case 3:
  2070. cpp_target = NFP_6000_CPPTGT_PCIE;
  2071. dinfo->fprintf_func (dinfo->stream, "pcie[");
  2072. break;
  2073. case 5:
  2074. cpp_target = NFP_6000_CPPTGT_CRYPTO;
  2075. dinfo->fprintf_func (dinfo->stream, "crypto[");
  2076. break;
  2077. case 6:
  2078. cpp_target = NFP_6000_CPPTGT_ARM;
  2079. dinfo->fprintf_func (dinfo->stream, "arm[");
  2080. break;
  2081. case 7:
  2082. cpp_target = NFP_6000_CPPTGT_CTXPB;
  2083. dinfo->fprintf_func (dinfo->stream, "ct[");
  2084. break;
  2085. }
  2086. cpp_action = _BF (tgtcmd, 1, 0);
  2087. }
  2088. else
  2089. {
  2090. /* One bit overlap between "t" and "a" fields, for sram it's "t" and
  2091. for mem/cls it's "a". */
  2092. cpp_action = _BF (tgtcmd, 4, 0);
  2093. switch (_BF (tgtcmd, 6, 4))
  2094. {
  2095. case 3:
  2096. cpp_target = NFP_6000_CPPTGT_VQDR;
  2097. cpp_action = _BF (tgtcmd, 3, 0);
  2098. dinfo->fprintf_func (dinfo->stream, "sram[");
  2099. break;
  2100. case 4:
  2101. case 5:
  2102. cpp_target = NFP_6000_CPPTGT_MU;
  2103. dinfo->fprintf_func (dinfo->stream, "mem[");
  2104. break;
  2105. case 6:
  2106. case 7:
  2107. cpp_target = NFP_6000_CPPTGT_CLS;
  2108. dinfo->fprintf_func (dinfo->stream, "cls[");
  2109. break;
  2110. }
  2111. }
  2112. if (cpp_target < 0)
  2113. {
  2114. dinfo->fprintf_func (dinfo->stream, _("<invalid cmd target %d:%d:%d>[]"),
  2115. cpp_target, cpp_action, token);
  2116. return _NFP_ERR_CONT;
  2117. }
  2118. mnemonic = nfp_me_find_mnemonic (cpp_target, cpp_action, token, cpp_len,
  2119. nfp_me28_mnemonics,
  2120. ARRAY_SIZE (nfp_me28_mnemonics));
  2121. if (!mnemonic)
  2122. {
  2123. dinfo->fprintf_func (dinfo->stream, _("<invalid cmd action %d:%d:%d>[]"),
  2124. cpp_target, cpp_action, token);
  2125. return _NFP_ERR_CONT;
  2126. }
  2127. dinfo->fprintf_func (dinfo->stream, "%s, ", mnemonic);
  2128. if (visswap)
  2129. {
  2130. unsigned int tmp = srcA;
  2131. srcA = srcB;
  2132. srcB = tmp;
  2133. }
  2134. switch (mode)
  2135. {
  2136. case 0: /* (A << 8) + B. */
  2137. case 1: /* (B << 8) + A. */
  2138. dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
  2139. err = err
  2140. || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
  2141. dinfo->fprintf_func (dinfo->stream, ", <<8, ");
  2142. err = err
  2143. || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
  2144. dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
  2145. break;
  2146. case 2: /* Accelerated 3rd party (A[ << 8]) + B. */
  2147. case 3: /* Accelerated 3rd party (B[ << 8]) + A. */
  2148. dinfo->fprintf_func (dinfo->stream, "0x%x, ", (indref << 6) | xfer);
  2149. err = err
  2150. || !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
  2151. if (third_party_32bit)
  2152. dinfo->fprintf_func (dinfo->stream, ", ");
  2153. else
  2154. dinfo->fprintf_func (dinfo->stream, ", <<8, ");
  2155. err = err
  2156. || !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
  2157. dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
  2158. break;
  2159. case 4: /* A + B. */
  2160. dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
  2161. err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx, 0, 0, dinfo);
  2162. dinfo->fprintf_func (dinfo->stream, ", ");
  2163. err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx, 0, 0, dinfo);
  2164. dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
  2165. break;
  2166. case 5: /* Immediate address. */
  2167. dinfo->fprintf_func (dinfo->stream, "$xfer_%d, 0x%x, %d", xfer, valBA,
  2168. (cpp_len + 1));
  2169. break;
  2170. case 6: /* Immediate address and data. */
  2171. dinfo->fprintf_func (dinfo->stream, "0x%x, 0x%x", valBA, imm);
  2172. break;
  2173. case 7: /* Immediate data. */
  2174. dinfo->fprintf_func (dinfo->stream, "0x%x, --, %d",
  2175. ((xfer << 16) | valBA), (cpp_len + 1));
  2176. break;
  2177. }
  2178. dinfo->fprintf_func (dinfo->stream, "]");
  2179. if (indref && (mode != 2) && (mode != 3))
  2180. dinfo->fprintf_func (dinfo->stream, ", indirect_ref");
  2181. if (ctxswap_defer != 3)
  2182. {
  2183. dinfo->fprintf_func (dinfo->stream, ", ctx_swap[");
  2184. if (sig)
  2185. dinfo->fprintf_func (dinfo->stream, "sig%d]", sig);
  2186. else
  2187. dinfo->fprintf_func (dinfo->stream, "--]");
  2188. if (ctxswap_defer != 0)
  2189. dinfo->fprintf_func (dinfo->stream, ", defer[%d]", ctxswap_defer);
  2190. }
  2191. else if (sig)
  2192. dinfo->fprintf_func (dinfo->stream, ", sig_done[sig%d]", sig);
  2193. if (err)
  2194. return _NFP_ERR_CONT;
  2195. return 0;
  2196. }
  2197. static int
  2198. nfp_me28_print_alu_shf (uint64_t instr, int num_ctx,
  2199. struct disassemble_info *dinfo)
  2200. {
  2201. unsigned int gpr_wrboth = _BTST (instr, 41);
  2202. unsigned int src_lmext = _BTST (instr, 42);
  2203. unsigned int dst_lmext = _BTST (instr, 43);
  2204. unsigned int pred_cc = _BTST (instr, 44);
  2205. return nfp_me27_28_print_alu_shf (instr, pred_cc, dst_lmext,
  2206. src_lmext, gpr_wrboth, num_ctx, dinfo);
  2207. }
  2208. static int
  2209. nfp_me28_print_alu (uint64_t instr, int num_ctx,
  2210. struct disassemble_info *dinfo)
  2211. {
  2212. unsigned int gpr_wrboth = _BTST (instr, 41);
  2213. unsigned int src_lmext = _BTST (instr, 42);
  2214. unsigned int dst_lmext = _BTST (instr, 43);
  2215. unsigned int pred_cc = _BTST (instr, 44);
  2216. return nfp_me27_28_print_alu (instr, pred_cc, dst_lmext, src_lmext,
  2217. gpr_wrboth, num_ctx, dinfo);
  2218. }
  2219. static int
  2220. nfp_me28_print_immed (uint64_t instr, int num_ctx,
  2221. struct disassemble_info *dinfo)
  2222. {
  2223. unsigned int gpr_wrboth = _BTST (instr, 41);
  2224. unsigned int dst_lmext = _BTST (instr, 43);
  2225. unsigned int pred_cc = _BTST (instr, 44);
  2226. return nfp_me27_28_print_immed (instr, pred_cc, dst_lmext, gpr_wrboth,
  2227. num_ctx, dinfo);
  2228. }
  2229. static int
  2230. nfp_me28_print_ld_field (uint64_t instr, int num_ctx,
  2231. struct disassemble_info *dinfo)
  2232. {
  2233. unsigned int gpr_wrboth = _BTST (instr, 41);
  2234. unsigned int src_lmext = _BTST (instr, 42);
  2235. unsigned int dst_lmext = _BTST (instr, 43);
  2236. unsigned int pred_cc = _BTST (instr, 44);
  2237. return nfp_me27_28_print_ld_field (instr, pred_cc, dst_lmext,
  2238. src_lmext, gpr_wrboth, num_ctx, dinfo);
  2239. }
  2240. static int
  2241. nfp_me28_print_ctx_arb (uint64_t instr, struct disassemble_info *dinfo)
  2242. {
  2243. return nfp_me27_28_print_ctx_arb (instr, dinfo);
  2244. }
  2245. static int
  2246. nfp_me28_print_local_csr (uint64_t instr, int num_ctx,
  2247. struct disassemble_info *dinfo)
  2248. {
  2249. unsigned int src_lmext = _BTST (instr, 42);
  2250. return nfp_me27_28_print_local_csr (instr, src_lmext, num_ctx, dinfo);
  2251. }
  2252. static int
  2253. nfp_me28_print_branch (uint64_t instr, struct disassemble_info *dinfo)
  2254. {
  2255. return nfp_me27_28_print_branch (instr, nfp_me28_br_inpstates, dinfo);
  2256. }
  2257. static int
  2258. nfp_me28_print_br_byte (uint64_t instr, int num_ctx,
  2259. struct disassemble_info *dinfo)
  2260. {
  2261. unsigned int src_lmext = _BTST (instr, 42);
  2262. return nfp_me27_28_print_br_byte (instr, src_lmext, num_ctx, dinfo);
  2263. }
  2264. static int
  2265. nfp_me28_print_br_bit (uint64_t instr, int num_ctx,
  2266. struct disassemble_info *dinfo)
  2267. {
  2268. unsigned int src_lmext = _BTST (instr, 42);
  2269. return nfp_me27_28_print_br_bit (instr, src_lmext, num_ctx, dinfo);
  2270. }
  2271. static int
  2272. nfp_me28_print_br_alu (uint64_t instr, int num_ctx,
  2273. struct disassemble_info *dinfo)
  2274. {
  2275. unsigned int src_lmext = _BTST (instr, 42);
  2276. return nfp_me27_28_print_br_alu (instr, src_lmext, num_ctx, dinfo);
  2277. }
  2278. static int
  2279. nfp_me28_print_mult (uint64_t instr, int num_ctx,
  2280. struct disassemble_info *dinfo)
  2281. {
  2282. unsigned int gpr_wrboth = _BTST (instr, 41);
  2283. unsigned int src_lmext = _BTST (instr, 42);
  2284. unsigned int dst_lmext = _BTST (instr, 43);
  2285. unsigned int pred_cc = _BTST (instr, 44);
  2286. return nfp_me27_28_print_mult (instr, pred_cc, dst_lmext, src_lmext,
  2287. gpr_wrboth, num_ctx, dinfo);
  2288. }
  2289. static bool
  2290. init_nfp3200_priv (nfp_priv_data * priv, struct disassemble_info *dinfo)
  2291. {
  2292. Elf_Internal_Shdr *sec = NULL;
  2293. Elf_Nfp_MeConfig mecfg_ent;
  2294. unsigned char buffer[sizeof (Elf_Nfp_MeConfig)];
  2295. file_ptr roff = 0;
  2296. unsigned int sec_cnt = 0;
  2297. unsigned int sec_idx;
  2298. size_t menum_linear = 0;
  2299. if (!dinfo->section)
  2300. /* No section info, will use default values. */
  2301. return true;
  2302. sec_cnt = elf_numsections (dinfo->section->owner);
  2303. /* Find the MECONFIG section. It's index is also in e_flags, but it has
  2304. a unique SHT and we'll use that. */
  2305. for (sec_idx = 0; sec_idx < sec_cnt; sec_idx++)
  2306. {
  2307. sec = elf_elfsections (dinfo->section->owner)[sec_idx];
  2308. if (sec->sh_type == SHT_NFP_MECONFIG)
  2309. break;
  2310. }
  2311. if (sec_idx == sec_cnt)
  2312. {
  2313. dinfo->fprintf_func (dinfo->stream, _("File has no ME-Config section."));
  2314. return false;
  2315. }
  2316. for (roff = 0; (bfd_size_type) roff < sec->sh_size;
  2317. roff += sec->sh_entsize, menum_linear++)
  2318. {
  2319. nfp_priv_mecfg *mecfg;
  2320. int isl = menum_linear >> 3;
  2321. int menum = menum_linear & 7;
  2322. if (menum_linear >= 40)
  2323. {
  2324. dinfo->fprintf_func (dinfo->stream,
  2325. _("File has invalid ME-Config section."));
  2326. return false;
  2327. }
  2328. mecfg = &priv->mecfgs[isl][menum][1];
  2329. if (!bfd_get_section_contents (dinfo->section->owner, sec->bfd_section,
  2330. buffer, roff, sizeof (buffer)))
  2331. return false;
  2332. mecfg_ent.ctx_enables = bfd_getl32 (buffer + offsetof (Elf_Nfp_MeConfig,
  2333. ctx_enables));
  2334. mecfg_ent.misc_control = bfd_getl32 (buffer
  2335. + offsetof (Elf_Nfp_MeConfig, misc_control));
  2336. mecfg->ctx4_mode = _BTST (mecfg_ent.ctx_enables, 31);
  2337. mecfg->addr_3rdparty32 = _BTST (mecfg_ent.misc_control, 4);
  2338. mecfg->scs_cnt = _BTST (mecfg_ent.misc_control, 2);
  2339. }
  2340. return true;
  2341. }
  2342. static bool
  2343. init_nfp6000_mecsr_sec (nfp_priv_data * priv, Elf_Internal_Shdr * sec,
  2344. bool is_for_text, struct disassemble_info *dinfo)
  2345. {
  2346. Elf_Nfp_InitRegEntry ireg;
  2347. unsigned char buffer[sizeof (Elf_Nfp_InitRegEntry)];
  2348. file_ptr ireg_off = 0;
  2349. size_t isl, menum;
  2350. if (sec->sh_entsize != sizeof (ireg))
  2351. return false;
  2352. isl = SHI_NFP_IREG_ISLAND (sec->sh_info);
  2353. /* For these sections we know that the address will only be 32 bits
  2354. so we only need cpp_offset_lo.
  2355. Address is encoded as follows:
  2356. <31:30> 0
  2357. <29:24> island (already got this from sh_info)
  2358. <23:17> 0
  2359. <16:16> XferCsrRegSel (1 for these sections)
  2360. <15:14> 0
  2361. <13:10> DataMasterID (MEnum = this - 4)
  2362. <9:2> register (index)
  2363. <1:0> 0b0 (register byte address if appened to the previous field). */
  2364. for (ireg_off = 0; (bfd_size_type) ireg_off < sec->sh_size;
  2365. ireg_off += sec->sh_entsize)
  2366. {
  2367. uint32_t csr_off;
  2368. nfp_priv_mecfg *mecfg;
  2369. if (!bfd_get_section_contents (dinfo->section->owner, sec->bfd_section,
  2370. buffer, ireg_off, sizeof (buffer)))
  2371. return false;
  2372. ireg.cpp_offset_lo = bfd_getl32 (buffer
  2373. + offsetof (Elf_Nfp_InitRegEntry, cpp_offset_lo));
  2374. ireg.mask = bfd_getl32 (buffer + offsetof (Elf_Nfp_InitRegEntry, mask));
  2375. ireg.val = bfd_getl32 (buffer + offsetof (Elf_Nfp_InitRegEntry, val));
  2376. ireg.w0 = bfd_getl32 (buffer + offsetof (Elf_Nfp_InitRegEntry, w0));
  2377. if (NFP_IREG_ENTRY_WO_NLW (ireg.w0))
  2378. continue;
  2379. /* Only consider entries that are permanent for runtime. */
  2380. if ((NFP_IREG_ENTRY_WO_VTP (ireg.w0) != NFP_IREG_VTP_CONST)
  2381. && (NFP_IREG_ENTRY_WO_VTP (ireg.w0) != NFP_IREG_VTP_FORCE))
  2382. continue;
  2383. menum = _BF (ireg.cpp_offset_lo, 13, 10) - 4;
  2384. csr_off = _BF (ireg.cpp_offset_lo, 9, 0);
  2385. if (isl >= _NFP_ISLAND_MAX || menum >= _NFP_ME_MAX)
  2386. return false;
  2387. mecfg = &priv->mecfgs[isl][menum][is_for_text];
  2388. switch (csr_off)
  2389. {
  2390. case _NFP_ME27_28_CSR_CTX_ENABLES:
  2391. mecfg->ctx4_mode = _BTST (ireg.val, 31);
  2392. break;
  2393. case _NFP_ME27_28_CSR_MISC_CONTROL:
  2394. mecfg->addr_3rdparty32 = _BTST (ireg.val, 4);
  2395. mecfg->scs_cnt = _BTST (ireg.val, 2);
  2396. break;
  2397. default:
  2398. break;
  2399. }
  2400. }
  2401. return true;
  2402. }
  2403. static bool
  2404. init_nfp6000_priv (nfp_priv_data * priv, struct disassemble_info *dinfo)
  2405. {
  2406. int mecfg_orders[64][2];
  2407. size_t isl;
  2408. unsigned int sec_cnt = 0;
  2409. unsigned int sec_idx;
  2410. bool is_for_text;
  2411. memset (mecfg_orders, -1, sizeof (mecfg_orders));
  2412. if (!dinfo->section)
  2413. /* No section info, will use default values. */
  2414. return true;
  2415. sec_cnt = elf_numsections (dinfo->section->owner);
  2416. /* Go through all MECSR init sections to find ME configs. */
  2417. for (sec_idx = 0; sec_idx < sec_cnt; sec_idx++)
  2418. {
  2419. Elf_Internal_Shdr *sec;
  2420. int sec_order;
  2421. sec = elf_elfsections (dinfo->section->owner)[sec_idx];
  2422. sec_order = (int) SHI_NFP_IREG_ORDER (sec->sh_info);
  2423. is_for_text = (sec->sh_flags & (SHF_NFP_INIT | SHF_NFP_INIT2)) == 0;
  2424. /* If we have an init2 section, that is the one that applies to the
  2425. ME when executing init code. So we make it's order higher than
  2426. any plain init section. */
  2427. if (sec->sh_flags & SHF_NFP_INIT2)
  2428. sec_order += SHI_NFP_IREG_ORDER (~0U) + 1;
  2429. if (sec->sh_type != SHT_NFP_INITREG)
  2430. continue;
  2431. if (!SHI_NFP_6000_IS_IREG_MECSR (sec->sh_info))
  2432. continue;
  2433. isl = SHI_NFP_IREG_ISLAND (sec->sh_info);
  2434. if ((sec_order < mecfg_orders[isl][is_for_text]))
  2435. /* Lower order or transient, skip it. */
  2436. continue;
  2437. mecfg_orders[isl][is_for_text] = sec_order;
  2438. if (!init_nfp6000_mecsr_sec (priv, sec, is_for_text, dinfo))
  2439. {
  2440. dinfo->fprintf_func (dinfo->stream,
  2441. _("Error processing section %u "), sec_idx);
  2442. return false;
  2443. }
  2444. }
  2445. return true;
  2446. }
  2447. static int
  2448. parse_disassembler_options (nfp_opts * opts, struct disassemble_info *dinfo)
  2449. {
  2450. const char *option;
  2451. if (dinfo->disassembler_options == NULL)
  2452. return 0;
  2453. FOR_EACH_DISASSEMBLER_OPTION (option, dinfo->disassembler_options)
  2454. {
  2455. if (disassembler_options_cmp (option, "no-pc") == 0)
  2456. opts->show_pc = 0;
  2457. else if (disassembler_options_cmp (option, "ctx4") == 0)
  2458. {
  2459. if (!opts->ctx_mode)
  2460. opts->ctx_mode = 4;
  2461. }
  2462. else if (disassembler_options_cmp (option, "ctx8") == 0)
  2463. opts->ctx_mode = 8;
  2464. else
  2465. {
  2466. dinfo->fprintf_func (dinfo->stream, _("Invalid NFP option: %s"), option);
  2467. return _NFP_ERR_STOP;
  2468. }
  2469. }
  2470. return 0;
  2471. }
  2472. /* Called on first disassembly attempt so that dinfo->section is valid
  2473. so that we can get the bfd owner to find ME configs. */
  2474. static nfp_priv_data *
  2475. init_nfp_priv (struct disassemble_info *dinfo)
  2476. {
  2477. nfp_priv_data *priv;
  2478. int ret = false;
  2479. if (dinfo->private_data)
  2480. return (nfp_priv_data *) dinfo->private_data;
  2481. #if 0 /* Right now only section-related info is kept in priv.
  2482. So don't even calloc it if we don't need it. */
  2483. if (!dinfo->section)
  2484. return NULL;
  2485. #endif
  2486. /* Alloc with no free, seems to be either this or a static global variable
  2487. and this at least keeps a large struct unallocated until really needed. */
  2488. priv = calloc (1, sizeof (*priv));
  2489. if (!priv)
  2490. return NULL;
  2491. switch (dinfo->mach)
  2492. {
  2493. case E_NFP_MACH_3200:
  2494. ret = init_nfp3200_priv (priv, dinfo);
  2495. break;
  2496. case E_NFP_MACH_6000:
  2497. ret = init_nfp6000_priv (priv, dinfo);
  2498. break;
  2499. }
  2500. if (!ret)
  2501. {
  2502. free (priv);
  2503. return NULL;
  2504. }
  2505. dinfo->private_data = priv;
  2506. return priv;
  2507. }
  2508. static int
  2509. _print_instrs (bfd_vma addr, struct disassemble_info *dinfo, nfp_opts * opts)
  2510. {
  2511. nfp_priv_data *priv = init_nfp_priv (dinfo);
  2512. bfd_byte buffer[8];
  2513. int err;
  2514. uint64_t instr = 0;
  2515. size_t island, menum;
  2516. int num_ctx, scs_cnt, addr_3rdparty32, pc, tmpi, tmpj;
  2517. int is_text = 1;
  2518. err = dinfo->read_memory_func (addr, buffer, 8, dinfo);
  2519. if (err)
  2520. return _NFP_ERR_STOP;
  2521. if (!dinfo->section)
  2522. {
  2523. num_ctx = 8;
  2524. scs_cnt = 0;
  2525. addr_3rdparty32 = 0;
  2526. }
  2527. else
  2528. {
  2529. unsigned int sh_info = 0;
  2530. nfp_priv_mecfg *mecfg;
  2531. /* We have a section, presumably all ELF sections. Try to find
  2532. proper ME configs to produce better disassembly. */
  2533. if (!priv)
  2534. return _NFP_ERR_STOP; /* Sanity check */
  2535. is_text = (elf_section_flags (dinfo->section)
  2536. & (SHF_NFP_INIT | SHF_NFP_INIT2)) == 0;
  2537. sh_info = elf_section_info (dinfo->section);
  2538. switch (dinfo->mach)
  2539. {
  2540. case E_NFP_MACH_3200:
  2541. island = SHI_NFP_3200_ISLAND (sh_info);
  2542. menum = SHI_NFP_3200_MENUM (sh_info);
  2543. break;
  2544. default:
  2545. island = SHI_NFP_ISLAND (sh_info);
  2546. menum = SHI_NFP_MENUM (sh_info);
  2547. break;
  2548. }
  2549. if (island >= _NFP_ISLAND_MAX || menum >= _NFP_ME_MAX)
  2550. {
  2551. dinfo->fprintf_func (dinfo->stream, "Invalid island or me.");
  2552. return _NFP_ERR_STOP;
  2553. }
  2554. mecfg = &priv->mecfgs[island][menum][is_text];
  2555. num_ctx = (mecfg->ctx4_mode) ? 4 : 8;
  2556. addr_3rdparty32 = mecfg->addr_3rdparty32;
  2557. scs_cnt = mecfg->scs_cnt;
  2558. }
  2559. if (opts->ctx_mode)
  2560. num_ctx = opts->ctx_mode;
  2561. dinfo->bytes_per_line = 8;
  2562. dinfo->bytes_per_chunk = 8;
  2563. instr = bfd_getl64 (buffer);
  2564. if (opts->show_pc)
  2565. {
  2566. pc = (int) (addr >> 3);
  2567. /* Guess max PC for formatting */
  2568. tmpj = (int) (dinfo->buffer_length >> 3);
  2569. if (scs_cnt == 1)
  2570. {
  2571. pc *= 2;
  2572. tmpj *= 2;
  2573. if (! !(menum & 1))
  2574. {
  2575. pc++;
  2576. tmpj++;
  2577. }
  2578. }
  2579. for (tmpi = 1; tmpj > 9; tmpj /= 10)
  2580. tmpi++;
  2581. tmpj = pc;
  2582. for (; tmpj > 9; tmpj /= 10)
  2583. tmpi--;
  2584. dinfo->fprintf_func (dinfo->stream, "%*c%d ", tmpi, '.', pc);
  2585. }
  2586. switch (dinfo->mach)
  2587. {
  2588. case E_NFP_MACH_3200:
  2589. if (NFP_ME27_INSTR_IS_CMD (instr))
  2590. err = nfp_me27_print_cmd (instr, addr_3rdparty32, num_ctx, dinfo);
  2591. else if (NFP_ME27_INSTR_IS_ALU_SHF (instr))
  2592. err = nfp_me27_print_alu_shf (instr, num_ctx, dinfo);
  2593. else if (NFP_ME27_INSTR_IS_ALU (instr))
  2594. err = nfp_me27_print_alu (instr, num_ctx, dinfo);
  2595. else if (NFP_ME27_INSTR_IS_IMMED (instr))
  2596. err = nfp_me27_print_immed (instr, num_ctx, dinfo);
  2597. else if (NFP_ME27_INSTR_IS_LD_FIELD (instr))
  2598. err = nfp_me27_print_ld_field (instr, num_ctx, dinfo);
  2599. else if (NFP_ME27_INSTR_IS_CTX_ARB (instr))
  2600. err = nfp_me27_print_ctx_arb (instr, dinfo);
  2601. else if (NFP_ME27_INSTR_IS_LOCAL_CSR (instr))
  2602. err = nfp_me27_print_local_csr (instr, num_ctx, dinfo);
  2603. else if (NFP_ME27_INSTR_IS_BRANCH (instr))
  2604. err = nfp_me27_print_branch (instr, dinfo);
  2605. else if (NFP_ME27_INSTR_IS_BR_BYTE (instr))
  2606. err = nfp_me27_print_br_byte (instr, num_ctx, dinfo);
  2607. else if (NFP_ME27_INSTR_IS_BR_BIT (instr))
  2608. err = nfp_me27_print_br_bit (instr, num_ctx, dinfo);
  2609. else if (NFP_ME27_INSTR_IS_BR_ALU (instr))
  2610. err = nfp_me27_print_br_alu (instr, num_ctx, dinfo);
  2611. else if (NFP_ME27_INSTR_IS_MULT (instr))
  2612. err = nfp_me27_print_mult (instr, num_ctx, dinfo);
  2613. else
  2614. err = nfp_me_print_invalid (instr, dinfo);
  2615. break;
  2616. case E_NFP_MACH_6000:
  2617. if (NFP_ME28_INSTR_IS_CMD (instr))
  2618. err = nfp_me28_print_cmd (instr, addr_3rdparty32, num_ctx, dinfo);
  2619. else if (NFP_ME28_INSTR_IS_ALU_SHF (instr))
  2620. err = nfp_me28_print_alu_shf (instr, num_ctx, dinfo);
  2621. else if (NFP_ME28_INSTR_IS_ALU (instr))
  2622. err = nfp_me28_print_alu (instr, num_ctx, dinfo);
  2623. else if (NFP_ME28_INSTR_IS_IMMED (instr))
  2624. err = nfp_me28_print_immed (instr, num_ctx, dinfo);
  2625. else if (NFP_ME28_INSTR_IS_LD_FIELD (instr))
  2626. err = nfp_me28_print_ld_field (instr, num_ctx, dinfo);
  2627. else if (NFP_ME28_INSTR_IS_CTX_ARB (instr))
  2628. err = nfp_me28_print_ctx_arb (instr, dinfo);
  2629. else if (NFP_ME28_INSTR_IS_LOCAL_CSR (instr))
  2630. err = nfp_me28_print_local_csr (instr, num_ctx, dinfo);
  2631. else if (NFP_ME28_INSTR_IS_BRANCH (instr))
  2632. err = nfp_me28_print_branch (instr, dinfo);
  2633. else if (NFP_ME28_INSTR_IS_BR_BYTE (instr))
  2634. err = nfp_me28_print_br_byte (instr, num_ctx, dinfo);
  2635. else if (NFP_ME28_INSTR_IS_BR_BIT (instr))
  2636. err = nfp_me28_print_br_bit (instr, num_ctx, dinfo);
  2637. else if (NFP_ME28_INSTR_IS_BR_ALU (instr))
  2638. err = nfp_me28_print_br_alu (instr, num_ctx, dinfo);
  2639. else if (NFP_ME28_INSTR_IS_MULT (instr))
  2640. err = nfp_me28_print_mult (instr, num_ctx, dinfo);
  2641. else
  2642. err = nfp_me_print_invalid (instr, dinfo);
  2643. break;
  2644. }
  2645. if (err < 0)
  2646. return err;
  2647. return 8;
  2648. }
  2649. int
  2650. print_insn_nfp (bfd_vma addr, struct disassemble_info *dinfo)
  2651. {
  2652. nfp_opts opts;
  2653. int err;
  2654. opts.show_pc = 1;
  2655. opts.ctx_mode = 0;
  2656. err = parse_disassembler_options (&opts, dinfo);
  2657. if (err < 0)
  2658. goto end;
  2659. err = _print_instrs (addr, dinfo, &opts);
  2660. end:
  2661. if (err != 8)
  2662. dinfo->fprintf_func (dinfo->stream, "\t # ERROR");
  2663. if (err == _NFP_ERR_CONT)
  2664. return 8;
  2665. return err;
  2666. }
  2667. void
  2668. print_nfp_disassembler_options (FILE * stream)
  2669. {
  2670. fprintf (stream, _("\n\
  2671. The following NFP specific disassembler options are supported for use\n\
  2672. with the -M switch (multiple options should be separated by commas):\n"));
  2673. fprintf (stream, _("\n\
  2674. no-pc Don't print program counter prefix.\n\
  2675. ctx4 Force disassembly using 4-context mode.\n\
  2676. ctx8 Force 8-context mode, takes precedence."));
  2677. fprintf (stream, _("\n"));
  2678. }