test_bpf.c 54 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929
  1. /*
  2. * Testsuite for BPF interpreter and BPF JIT compiler
  3. *
  4. * Copyright (c) 2011-2014 PLUMgrid, http://plumgrid.com
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of version 2 of the GNU General Public
  8. * License as published by the Free Software Foundation.
  9. *
  10. * This program is distributed in the hope that it will be useful, but
  11. * WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13. * General Public License for more details.
  14. */
  15. #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  16. #include <linux/init.h>
  17. #include <linux/module.h>
  18. #include <linux/filter.h>
  19. #include <linux/skbuff.h>
  20. #include <linux/netdevice.h>
  21. #include <linux/if_vlan.h>
  22. /* General test specific settings */
  23. #define MAX_SUBTESTS 3
  24. #define MAX_TESTRUNS 10000
  25. #define MAX_DATA 128
  26. #define MAX_INSNS 512
  27. #define MAX_K 0xffffFFFF
  28. /* Few constants used to init test 'skb' */
  29. #define SKB_TYPE 3
  30. #define SKB_MARK 0x1234aaaa
  31. #define SKB_HASH 0x1234aaab
  32. #define SKB_QUEUE_MAP 123
  33. #define SKB_VLAN_TCI 0xffff
  34. #define SKB_DEV_IFINDEX 577
  35. #define SKB_DEV_TYPE 588
  36. /* Redefine REGs to make tests less verbose */
  37. #define R0 BPF_REG_0
  38. #define R1 BPF_REG_1
  39. #define R2 BPF_REG_2
  40. #define R3 BPF_REG_3
  41. #define R4 BPF_REG_4
  42. #define R5 BPF_REG_5
  43. #define R6 BPF_REG_6
  44. #define R7 BPF_REG_7
  45. #define R8 BPF_REG_8
  46. #define R9 BPF_REG_9
  47. #define R10 BPF_REG_10
  48. /* Flags that can be passed to test cases */
  49. #define FLAG_NO_DATA BIT(0)
  50. #define FLAG_EXPECTED_FAIL BIT(1)
  51. enum {
  52. CLASSIC = BIT(6), /* Old BPF instructions only. */
  53. INTERNAL = BIT(7), /* Extended instruction set. */
  54. };
  55. #define TEST_TYPE_MASK (CLASSIC | INTERNAL)
  56. struct bpf_test {
  57. const char *descr;
  58. union {
  59. struct sock_filter insns[MAX_INSNS];
  60. struct sock_filter_int insns_int[MAX_INSNS];
  61. } u;
  62. __u8 aux;
  63. __u8 data[MAX_DATA];
  64. struct {
  65. int data_size;
  66. __u32 result;
  67. } test[MAX_SUBTESTS];
  68. };
  69. static struct bpf_test tests[] = {
  70. {
  71. "TAX",
  72. .u.insns = {
  73. BPF_STMT(BPF_LD | BPF_IMM, 1),
  74. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  75. BPF_STMT(BPF_LD | BPF_IMM, 2),
  76. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  77. BPF_STMT(BPF_ALU | BPF_NEG, 0), /* A == -3 */
  78. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  79. BPF_STMT(BPF_LD | BPF_LEN, 0),
  80. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  81. BPF_STMT(BPF_MISC | BPF_TAX, 0), /* X == len - 3 */
  82. BPF_STMT(BPF_LD | BPF_B | BPF_IND, 1),
  83. BPF_STMT(BPF_RET | BPF_A, 0)
  84. },
  85. CLASSIC,
  86. { 10, 20, 30, 40, 50 },
  87. { { 2, 10 }, { 3, 20 }, { 4, 30 } },
  88. },
  89. {
  90. "TXA",
  91. .u.insns = {
  92. BPF_STMT(BPF_LDX | BPF_LEN, 0),
  93. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  94. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  95. BPF_STMT(BPF_RET | BPF_A, 0) /* A == len * 2 */
  96. },
  97. CLASSIC,
  98. { 10, 20, 30, 40, 50 },
  99. { { 1, 2 }, { 3, 6 }, { 4, 8 } },
  100. },
  101. {
  102. "ADD_SUB_MUL_K",
  103. .u.insns = {
  104. BPF_STMT(BPF_LD | BPF_IMM, 1),
  105. BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 2),
  106. BPF_STMT(BPF_LDX | BPF_IMM, 3),
  107. BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
  108. BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 0xffffffff),
  109. BPF_STMT(BPF_ALU | BPF_MUL | BPF_K, 3),
  110. BPF_STMT(BPF_RET | BPF_A, 0)
  111. },
  112. CLASSIC | FLAG_NO_DATA,
  113. { },
  114. { { 0, 0xfffffffd } }
  115. },
  116. {
  117. "DIV_KX",
  118. .u.insns = {
  119. BPF_STMT(BPF_LD | BPF_IMM, 8),
  120. BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 2),
  121. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  122. BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
  123. BPF_STMT(BPF_ALU | BPF_DIV | BPF_X, 0),
  124. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  125. BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
  126. BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 0x70000000),
  127. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  128. BPF_STMT(BPF_RET | BPF_A, 0)
  129. },
  130. CLASSIC | FLAG_NO_DATA,
  131. { },
  132. { { 0, 0x40000001 } }
  133. },
  134. {
  135. "AND_OR_LSH_K",
  136. .u.insns = {
  137. BPF_STMT(BPF_LD | BPF_IMM, 0xff),
  138. BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf0),
  139. BPF_STMT(BPF_ALU | BPF_LSH | BPF_K, 27),
  140. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  141. BPF_STMT(BPF_LD | BPF_IMM, 0xf),
  142. BPF_STMT(BPF_ALU | BPF_OR | BPF_K, 0xf0),
  143. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  144. BPF_STMT(BPF_RET | BPF_A, 0)
  145. },
  146. CLASSIC | FLAG_NO_DATA,
  147. { },
  148. { { 0, 0x800000ff }, { 1, 0x800000ff } },
  149. },
  150. {
  151. "LD_IMM_0",
  152. .u.insns = {
  153. BPF_STMT(BPF_LD | BPF_IMM, 0), /* ld #0 */
  154. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0, 1, 0),
  155. BPF_STMT(BPF_RET | BPF_K, 0),
  156. BPF_STMT(BPF_RET | BPF_K, 1),
  157. },
  158. CLASSIC,
  159. { },
  160. { { 1, 1 } },
  161. },
  162. {
  163. "LD_IND",
  164. .u.insns = {
  165. BPF_STMT(BPF_LDX | BPF_LEN, 0),
  166. BPF_STMT(BPF_LD | BPF_H | BPF_IND, MAX_K),
  167. BPF_STMT(BPF_RET | BPF_K, 1)
  168. },
  169. CLASSIC,
  170. { },
  171. { { 1, 0 }, { 10, 0 }, { 60, 0 } },
  172. },
  173. {
  174. "LD_ABS",
  175. .u.insns = {
  176. BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 1000),
  177. BPF_STMT(BPF_RET | BPF_K, 1)
  178. },
  179. CLASSIC,
  180. { },
  181. { { 1, 0 }, { 10, 0 }, { 60, 0 } },
  182. },
  183. {
  184. "LD_ABS_LL",
  185. .u.insns = {
  186. BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_LL_OFF),
  187. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  188. BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_LL_OFF + 1),
  189. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  190. BPF_STMT(BPF_RET | BPF_A, 0)
  191. },
  192. CLASSIC,
  193. { 1, 2, 3 },
  194. { { 1, 0 }, { 2, 3 } },
  195. },
  196. {
  197. "LD_IND_LL",
  198. .u.insns = {
  199. BPF_STMT(BPF_LD | BPF_IMM, SKF_LL_OFF - 1),
  200. BPF_STMT(BPF_LDX | BPF_LEN, 0),
  201. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  202. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  203. BPF_STMT(BPF_LD | BPF_B | BPF_IND, 0),
  204. BPF_STMT(BPF_RET | BPF_A, 0)
  205. },
  206. CLASSIC,
  207. { 1, 2, 3, 0xff },
  208. { { 1, 1 }, { 3, 3 }, { 4, 0xff } },
  209. },
  210. {
  211. "LD_ABS_NET",
  212. .u.insns = {
  213. BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_NET_OFF),
  214. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  215. BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_NET_OFF + 1),
  216. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  217. BPF_STMT(BPF_RET | BPF_A, 0)
  218. },
  219. CLASSIC,
  220. { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3 },
  221. { { 15, 0 }, { 16, 3 } },
  222. },
  223. {
  224. "LD_IND_NET",
  225. .u.insns = {
  226. BPF_STMT(BPF_LD | BPF_IMM, SKF_NET_OFF - 15),
  227. BPF_STMT(BPF_LDX | BPF_LEN, 0),
  228. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  229. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  230. BPF_STMT(BPF_LD | BPF_B | BPF_IND, 0),
  231. BPF_STMT(BPF_RET | BPF_A, 0)
  232. },
  233. CLASSIC,
  234. { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3 },
  235. { { 14, 0 }, { 15, 1 }, { 17, 3 } },
  236. },
  237. {
  238. "LD_PKTTYPE",
  239. .u.insns = {
  240. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  241. SKF_AD_OFF + SKF_AD_PKTTYPE),
  242. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
  243. BPF_STMT(BPF_RET | BPF_K, 1),
  244. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  245. SKF_AD_OFF + SKF_AD_PKTTYPE),
  246. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
  247. BPF_STMT(BPF_RET | BPF_K, 1),
  248. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  249. SKF_AD_OFF + SKF_AD_PKTTYPE),
  250. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
  251. BPF_STMT(BPF_RET | BPF_K, 1),
  252. BPF_STMT(BPF_RET | BPF_A, 0)
  253. },
  254. CLASSIC,
  255. { },
  256. { { 1, 3 }, { 10, 3 } },
  257. },
  258. {
  259. "LD_MARK",
  260. .u.insns = {
  261. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  262. SKF_AD_OFF + SKF_AD_MARK),
  263. BPF_STMT(BPF_RET | BPF_A, 0)
  264. },
  265. CLASSIC,
  266. { },
  267. { { 1, SKB_MARK}, { 10, SKB_MARK} },
  268. },
  269. {
  270. "LD_RXHASH",
  271. .u.insns = {
  272. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  273. SKF_AD_OFF + SKF_AD_RXHASH),
  274. BPF_STMT(BPF_RET | BPF_A, 0)
  275. },
  276. CLASSIC,
  277. { },
  278. { { 1, SKB_HASH}, { 10, SKB_HASH} },
  279. },
  280. {
  281. "LD_QUEUE",
  282. .u.insns = {
  283. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  284. SKF_AD_OFF + SKF_AD_QUEUE),
  285. BPF_STMT(BPF_RET | BPF_A, 0)
  286. },
  287. CLASSIC,
  288. { },
  289. { { 1, SKB_QUEUE_MAP }, { 10, SKB_QUEUE_MAP } },
  290. },
  291. {
  292. "LD_PROTOCOL",
  293. .u.insns = {
  294. BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 1),
  295. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 20, 1, 0),
  296. BPF_STMT(BPF_RET | BPF_K, 0),
  297. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  298. SKF_AD_OFF + SKF_AD_PROTOCOL),
  299. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  300. BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
  301. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 30, 1, 0),
  302. BPF_STMT(BPF_RET | BPF_K, 0),
  303. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  304. BPF_STMT(BPF_RET | BPF_A, 0)
  305. },
  306. CLASSIC,
  307. { 10, 20, 30 },
  308. { { 10, ETH_P_IP }, { 100, ETH_P_IP } },
  309. },
  310. {
  311. "LD_VLAN_TAG",
  312. .u.insns = {
  313. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  314. SKF_AD_OFF + SKF_AD_VLAN_TAG),
  315. BPF_STMT(BPF_RET | BPF_A, 0)
  316. },
  317. CLASSIC,
  318. { },
  319. {
  320. { 1, SKB_VLAN_TCI & ~VLAN_TAG_PRESENT },
  321. { 10, SKB_VLAN_TCI & ~VLAN_TAG_PRESENT }
  322. },
  323. },
  324. {
  325. "LD_VLAN_TAG_PRESENT",
  326. .u.insns = {
  327. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  328. SKF_AD_OFF + SKF_AD_VLAN_TAG_PRESENT),
  329. BPF_STMT(BPF_RET | BPF_A, 0)
  330. },
  331. CLASSIC,
  332. { },
  333. {
  334. { 1, !!(SKB_VLAN_TCI & VLAN_TAG_PRESENT) },
  335. { 10, !!(SKB_VLAN_TCI & VLAN_TAG_PRESENT) }
  336. },
  337. },
  338. {
  339. "LD_IFINDEX",
  340. .u.insns = {
  341. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  342. SKF_AD_OFF + SKF_AD_IFINDEX),
  343. BPF_STMT(BPF_RET | BPF_A, 0)
  344. },
  345. CLASSIC,
  346. { },
  347. { { 1, SKB_DEV_IFINDEX }, { 10, SKB_DEV_IFINDEX } },
  348. },
  349. {
  350. "LD_HATYPE",
  351. .u.insns = {
  352. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  353. SKF_AD_OFF + SKF_AD_HATYPE),
  354. BPF_STMT(BPF_RET | BPF_A, 0)
  355. },
  356. CLASSIC,
  357. { },
  358. { { 1, SKB_DEV_TYPE }, { 10, SKB_DEV_TYPE } },
  359. },
  360. {
  361. "LD_CPU",
  362. .u.insns = {
  363. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  364. SKF_AD_OFF + SKF_AD_CPU),
  365. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  366. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  367. SKF_AD_OFF + SKF_AD_CPU),
  368. BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
  369. BPF_STMT(BPF_RET | BPF_A, 0)
  370. },
  371. CLASSIC,
  372. { },
  373. { { 1, 0 }, { 10, 0 } },
  374. },
  375. {
  376. "LD_NLATTR",
  377. .u.insns = {
  378. BPF_STMT(BPF_LDX | BPF_IMM, 2),
  379. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  380. BPF_STMT(BPF_LDX | BPF_IMM, 3),
  381. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  382. SKF_AD_OFF + SKF_AD_NLATTR),
  383. BPF_STMT(BPF_RET | BPF_A, 0)
  384. },
  385. CLASSIC,
  386. #ifdef __BIG_ENDIAN
  387. { 0xff, 0xff, 0, 4, 0, 2, 0, 4, 0, 3 },
  388. #else
  389. { 0xff, 0xff, 4, 0, 2, 0, 4, 0, 3, 0 },
  390. #endif
  391. { { 4, 0 }, { 20, 6 } },
  392. },
  393. {
  394. "LD_NLATTR_NEST",
  395. .u.insns = {
  396. BPF_STMT(BPF_LD | BPF_IMM, 2),
  397. BPF_STMT(BPF_LDX | BPF_IMM, 3),
  398. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  399. SKF_AD_OFF + SKF_AD_NLATTR_NEST),
  400. BPF_STMT(BPF_LD | BPF_IMM, 2),
  401. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  402. SKF_AD_OFF + SKF_AD_NLATTR_NEST),
  403. BPF_STMT(BPF_LD | BPF_IMM, 2),
  404. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  405. SKF_AD_OFF + SKF_AD_NLATTR_NEST),
  406. BPF_STMT(BPF_LD | BPF_IMM, 2),
  407. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  408. SKF_AD_OFF + SKF_AD_NLATTR_NEST),
  409. BPF_STMT(BPF_LD | BPF_IMM, 2),
  410. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  411. SKF_AD_OFF + SKF_AD_NLATTR_NEST),
  412. BPF_STMT(BPF_LD | BPF_IMM, 2),
  413. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  414. SKF_AD_OFF + SKF_AD_NLATTR_NEST),
  415. BPF_STMT(BPF_LD | BPF_IMM, 2),
  416. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  417. SKF_AD_OFF + SKF_AD_NLATTR_NEST),
  418. BPF_STMT(BPF_LD | BPF_IMM, 2),
  419. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  420. SKF_AD_OFF + SKF_AD_NLATTR_NEST),
  421. BPF_STMT(BPF_RET | BPF_A, 0)
  422. },
  423. CLASSIC,
  424. #ifdef __BIG_ENDIAN
  425. { 0xff, 0xff, 0, 12, 0, 1, 0, 4, 0, 2, 0, 4, 0, 3 },
  426. #else
  427. { 0xff, 0xff, 12, 0, 1, 0, 4, 0, 2, 0, 4, 0, 3, 0 },
  428. #endif
  429. { { 4, 0 }, { 20, 10 } },
  430. },
  431. {
  432. "LD_PAYLOAD_OFF",
  433. .u.insns = {
  434. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  435. SKF_AD_OFF + SKF_AD_PAY_OFFSET),
  436. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  437. SKF_AD_OFF + SKF_AD_PAY_OFFSET),
  438. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  439. SKF_AD_OFF + SKF_AD_PAY_OFFSET),
  440. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  441. SKF_AD_OFF + SKF_AD_PAY_OFFSET),
  442. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  443. SKF_AD_OFF + SKF_AD_PAY_OFFSET),
  444. BPF_STMT(BPF_RET | BPF_A, 0)
  445. },
  446. CLASSIC,
  447. /* 00:00:00:00:00:00 > 00:00:00:00:00:00, ethtype IPv4 (0x0800),
  448. * length 98: 127.0.0.1 > 127.0.0.1: ICMP echo request,
  449. * id 9737, seq 1, length 64
  450. */
  451. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  452. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  453. 0x08, 0x00,
  454. 0x45, 0x00, 0x00, 0x54, 0xac, 0x8b, 0x40, 0x00, 0x40,
  455. 0x01, 0x90, 0x1b, 0x7f, 0x00, 0x00, 0x01 },
  456. { { 30, 0 }, { 100, 42 } },
  457. },
  458. {
  459. "LD_ANC_XOR",
  460. .u.insns = {
  461. BPF_STMT(BPF_LD | BPF_IMM, 10),
  462. BPF_STMT(BPF_LDX | BPF_IMM, 300),
  463. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  464. SKF_AD_OFF + SKF_AD_ALU_XOR_X),
  465. BPF_STMT(BPF_RET | BPF_A, 0)
  466. },
  467. CLASSIC,
  468. { },
  469. { { 4, 10 ^ 300 }, { 20, 10 ^ 300 } },
  470. },
  471. {
  472. "SPILL_FILL",
  473. .u.insns = {
  474. BPF_STMT(BPF_LDX | BPF_LEN, 0),
  475. BPF_STMT(BPF_LD | BPF_IMM, 2),
  476. BPF_STMT(BPF_ALU | BPF_RSH, 1),
  477. BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
  478. BPF_STMT(BPF_ST, 1), /* M1 = 1 ^ len */
  479. BPF_STMT(BPF_ALU | BPF_XOR | BPF_K, 0x80000000),
  480. BPF_STMT(BPF_ST, 2), /* M2 = 1 ^ len ^ 0x80000000 */
  481. BPF_STMT(BPF_STX, 15), /* M3 = len */
  482. BPF_STMT(BPF_LDX | BPF_MEM, 1),
  483. BPF_STMT(BPF_LD | BPF_MEM, 2),
  484. BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
  485. BPF_STMT(BPF_LDX | BPF_MEM, 15),
  486. BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
  487. BPF_STMT(BPF_RET | BPF_A, 0)
  488. },
  489. CLASSIC,
  490. { },
  491. { { 1, 0x80000001 }, { 2, 0x80000002 }, { 60, 0x80000000 ^ 60 } }
  492. },
  493. {
  494. "JEQ",
  495. .u.insns = {
  496. BPF_STMT(BPF_LDX | BPF_LEN, 0),
  497. BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
  498. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0, 0, 1),
  499. BPF_STMT(BPF_RET | BPF_K, 1),
  500. BPF_STMT(BPF_RET | BPF_K, MAX_K)
  501. },
  502. CLASSIC,
  503. { 3, 3, 3, 3, 3 },
  504. { { 1, 0 }, { 3, 1 }, { 4, MAX_K } },
  505. },
  506. {
  507. "JGT",
  508. .u.insns = {
  509. BPF_STMT(BPF_LDX | BPF_LEN, 0),
  510. BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
  511. BPF_JUMP(BPF_JMP | BPF_JGT | BPF_X, 0, 0, 1),
  512. BPF_STMT(BPF_RET | BPF_K, 1),
  513. BPF_STMT(BPF_RET | BPF_K, MAX_K)
  514. },
  515. CLASSIC,
  516. { 4, 4, 4, 3, 3 },
  517. { { 2, 0 }, { 3, 1 }, { 4, MAX_K } },
  518. },
  519. {
  520. "JGE",
  521. .u.insns = {
  522. BPF_STMT(BPF_LDX | BPF_LEN, 0),
  523. BPF_STMT(BPF_LD | BPF_B | BPF_IND, MAX_K),
  524. BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 1, 1, 0),
  525. BPF_STMT(BPF_RET | BPF_K, 10),
  526. BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 2, 1, 0),
  527. BPF_STMT(BPF_RET | BPF_K, 20),
  528. BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 3, 1, 0),
  529. BPF_STMT(BPF_RET | BPF_K, 30),
  530. BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 4, 1, 0),
  531. BPF_STMT(BPF_RET | BPF_K, 40),
  532. BPF_STMT(BPF_RET | BPF_K, MAX_K)
  533. },
  534. CLASSIC,
  535. { 1, 2, 3, 4, 5 },
  536. { { 1, 20 }, { 3, 40 }, { 5, MAX_K } },
  537. },
  538. {
  539. "JSET",
  540. .u.insns = {
  541. BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
  542. BPF_JUMP(BPF_JMP | BPF_JA, 1, 1, 1),
  543. BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
  544. BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
  545. BPF_STMT(BPF_LDX | BPF_LEN, 0),
  546. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  547. BPF_STMT(BPF_ALU | BPF_SUB | BPF_K, 4),
  548. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  549. BPF_STMT(BPF_LD | BPF_W | BPF_IND, 0),
  550. BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 1, 0, 1),
  551. BPF_STMT(BPF_RET | BPF_K, 10),
  552. BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x80000000, 0, 1),
  553. BPF_STMT(BPF_RET | BPF_K, 20),
  554. BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
  555. BPF_STMT(BPF_RET | BPF_K, 30),
  556. BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
  557. BPF_STMT(BPF_RET | BPF_K, 30),
  558. BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
  559. BPF_STMT(BPF_RET | BPF_K, 30),
  560. BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
  561. BPF_STMT(BPF_RET | BPF_K, 30),
  562. BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
  563. BPF_STMT(BPF_RET | BPF_K, 30),
  564. BPF_STMT(BPF_RET | BPF_K, MAX_K)
  565. },
  566. CLASSIC,
  567. { 0, 0xAA, 0x55, 1 },
  568. { { 4, 10 }, { 5, 20 }, { 6, MAX_K } },
  569. },
  570. {
  571. "tcpdump port 22",
  572. .u.insns = {
  573. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 12),
  574. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x86dd, 0, 8), /* IPv6 */
  575. BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 20),
  576. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x84, 2, 0),
  577. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 1, 0),
  578. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x11, 0, 17),
  579. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 54),
  580. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 14, 0),
  581. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 56),
  582. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 12, 13),
  583. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x0800, 0, 12), /* IPv4 */
  584. BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 23),
  585. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x84, 2, 0),
  586. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 1, 0),
  587. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x11, 0, 8),
  588. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 20),
  589. BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x1fff, 6, 0),
  590. BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14),
  591. BPF_STMT(BPF_LD | BPF_H | BPF_IND, 14),
  592. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 2, 0),
  593. BPF_STMT(BPF_LD | BPF_H | BPF_IND, 16),
  594. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 0, 1),
  595. BPF_STMT(BPF_RET | BPF_K, 0xffff),
  596. BPF_STMT(BPF_RET | BPF_K, 0),
  597. },
  598. CLASSIC,
  599. /* 3c:07:54:43:e5:76 > 10:bf:48:d6:43:d6, ethertype IPv4(0x0800)
  600. * length 114: 10.1.1.149.49700 > 10.1.2.10.22: Flags [P.],
  601. * seq 1305692979:1305693027, ack 3650467037, win 65535,
  602. * options [nop,nop,TS val 2502645400 ecr 3971138], length 48
  603. */
  604. { 0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6,
  605. 0x3c, 0x07, 0x54, 0x43, 0xe5, 0x76,
  606. 0x08, 0x00,
  607. 0x45, 0x10, 0x00, 0x64, 0x75, 0xb5,
  608. 0x40, 0x00, 0x40, 0x06, 0xad, 0x2e, /* IP header */
  609. 0x0a, 0x01, 0x01, 0x95, /* ip src */
  610. 0x0a, 0x01, 0x02, 0x0a, /* ip dst */
  611. 0xc2, 0x24,
  612. 0x00, 0x16 /* dst port */ },
  613. { { 10, 0 }, { 30, 0 }, { 100, 65535 } },
  614. },
  615. {
  616. "tcpdump complex",
  617. .u.insns = {
  618. /* tcpdump -nei eth0 'tcp port 22 and (((ip[2:2] -
  619. * ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0) and
  620. * (len > 115 or len < 30000000000)' -d
  621. */
  622. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 12),
  623. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x86dd, 30, 0),
  624. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x800, 0, 29),
  625. BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 23),
  626. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 0, 27),
  627. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 20),
  628. BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x1fff, 25, 0),
  629. BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14),
  630. BPF_STMT(BPF_LD | BPF_H | BPF_IND, 14),
  631. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 2, 0),
  632. BPF_STMT(BPF_LD | BPF_H | BPF_IND, 16),
  633. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 0, 20),
  634. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 16),
  635. BPF_STMT(BPF_ST, 1),
  636. BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 14),
  637. BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf),
  638. BPF_STMT(BPF_ALU | BPF_LSH | BPF_K, 2),
  639. BPF_STMT(BPF_MISC | BPF_TAX, 0x5), /* libpcap emits K on TAX */
  640. BPF_STMT(BPF_LD | BPF_MEM, 1),
  641. BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
  642. BPF_STMT(BPF_ST, 5),
  643. BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14),
  644. BPF_STMT(BPF_LD | BPF_B | BPF_IND, 26),
  645. BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf0),
  646. BPF_STMT(BPF_ALU | BPF_RSH | BPF_K, 2),
  647. BPF_STMT(BPF_MISC | BPF_TAX, 0x9), /* libpcap emits K on TAX */
  648. BPF_STMT(BPF_LD | BPF_MEM, 5),
  649. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0, 4, 0),
  650. BPF_STMT(BPF_LD | BPF_LEN, 0),
  651. BPF_JUMP(BPF_JMP | BPF_JGT | BPF_K, 0x73, 1, 0),
  652. BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 0xfc23ac00, 1, 0),
  653. BPF_STMT(BPF_RET | BPF_K, 0xffff),
  654. BPF_STMT(BPF_RET | BPF_K, 0),
  655. },
  656. CLASSIC,
  657. { 0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6,
  658. 0x3c, 0x07, 0x54, 0x43, 0xe5, 0x76,
  659. 0x08, 0x00,
  660. 0x45, 0x10, 0x00, 0x64, 0x75, 0xb5,
  661. 0x40, 0x00, 0x40, 0x06, 0xad, 0x2e, /* IP header */
  662. 0x0a, 0x01, 0x01, 0x95, /* ip src */
  663. 0x0a, 0x01, 0x02, 0x0a, /* ip dst */
  664. 0xc2, 0x24,
  665. 0x00, 0x16 /* dst port */ },
  666. { { 10, 0 }, { 30, 0 }, { 100, 65535 } },
  667. },
  668. {
  669. "RET_A",
  670. .u.insns = {
  671. /* check that unitialized X and A contain zeros */
  672. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  673. BPF_STMT(BPF_RET | BPF_A, 0)
  674. },
  675. CLASSIC,
  676. { },
  677. { {1, 0}, {2, 0} },
  678. },
  679. {
  680. "INT: ADD trivial",
  681. .u.insns_int = {
  682. BPF_ALU64_IMM(BPF_MOV, R1, 1),
  683. BPF_ALU64_IMM(BPF_ADD, R1, 2),
  684. BPF_ALU64_IMM(BPF_MOV, R2, 3),
  685. BPF_ALU64_REG(BPF_SUB, R1, R2),
  686. BPF_ALU64_IMM(BPF_ADD, R1, -1),
  687. BPF_ALU64_IMM(BPF_MUL, R1, 3),
  688. BPF_ALU64_REG(BPF_MOV, R0, R1),
  689. BPF_EXIT_INSN(),
  690. },
  691. INTERNAL,
  692. { },
  693. { { 0, 0xfffffffd } }
  694. },
  695. {
  696. "INT: MUL_X",
  697. .u.insns_int = {
  698. BPF_ALU64_IMM(BPF_MOV, R0, -1),
  699. BPF_ALU64_IMM(BPF_MOV, R1, -1),
  700. BPF_ALU64_IMM(BPF_MOV, R2, 3),
  701. BPF_ALU64_REG(BPF_MUL, R1, R2),
  702. BPF_JMP_IMM(BPF_JEQ, R1, 0xfffffffd, 1),
  703. BPF_EXIT_INSN(),
  704. BPF_ALU64_IMM(BPF_MOV, R0, 1),
  705. BPF_EXIT_INSN(),
  706. },
  707. INTERNAL,
  708. { },
  709. { { 0, 1 } }
  710. },
  711. {
  712. "INT: MUL_X2",
  713. .u.insns_int = {
  714. BPF_ALU32_IMM(BPF_MOV, R0, -1),
  715. BPF_ALU32_IMM(BPF_MOV, R1, -1),
  716. BPF_ALU32_IMM(BPF_MOV, R2, 3),
  717. BPF_ALU64_REG(BPF_MUL, R1, R2),
  718. BPF_ALU64_IMM(BPF_RSH, R1, 8),
  719. BPF_JMP_IMM(BPF_JEQ, R1, 0x2ffffff, 1),
  720. BPF_EXIT_INSN(),
  721. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  722. BPF_EXIT_INSN(),
  723. },
  724. INTERNAL,
  725. { },
  726. { { 0, 1 } }
  727. },
  728. {
  729. "INT: MUL32_X",
  730. .u.insns_int = {
  731. BPF_ALU32_IMM(BPF_MOV, R0, -1),
  732. BPF_ALU64_IMM(BPF_MOV, R1, -1),
  733. BPF_ALU32_IMM(BPF_MOV, R2, 3),
  734. BPF_ALU32_REG(BPF_MUL, R1, R2),
  735. BPF_ALU64_IMM(BPF_RSH, R1, 8),
  736. BPF_JMP_IMM(BPF_JEQ, R1, 0xffffff, 1),
  737. BPF_EXIT_INSN(),
  738. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  739. BPF_EXIT_INSN(),
  740. },
  741. INTERNAL,
  742. { },
  743. { { 0, 1 } }
  744. },
  745. {
  746. /* Have to test all register combinations, since
  747. * JITing of different registers will produce
  748. * different asm code.
  749. */
  750. "INT: ADD 64-bit",
  751. .u.insns_int = {
  752. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  753. BPF_ALU64_IMM(BPF_MOV, R1, 1),
  754. BPF_ALU64_IMM(BPF_MOV, R2, 2),
  755. BPF_ALU64_IMM(BPF_MOV, R3, 3),
  756. BPF_ALU64_IMM(BPF_MOV, R4, 4),
  757. BPF_ALU64_IMM(BPF_MOV, R5, 5),
  758. BPF_ALU64_IMM(BPF_MOV, R6, 6),
  759. BPF_ALU64_IMM(BPF_MOV, R7, 7),
  760. BPF_ALU64_IMM(BPF_MOV, R8, 8),
  761. BPF_ALU64_IMM(BPF_MOV, R9, 9),
  762. BPF_ALU64_IMM(BPF_ADD, R0, 20),
  763. BPF_ALU64_IMM(BPF_ADD, R1, 20),
  764. BPF_ALU64_IMM(BPF_ADD, R2, 20),
  765. BPF_ALU64_IMM(BPF_ADD, R3, 20),
  766. BPF_ALU64_IMM(BPF_ADD, R4, 20),
  767. BPF_ALU64_IMM(BPF_ADD, R5, 20),
  768. BPF_ALU64_IMM(BPF_ADD, R6, 20),
  769. BPF_ALU64_IMM(BPF_ADD, R7, 20),
  770. BPF_ALU64_IMM(BPF_ADD, R8, 20),
  771. BPF_ALU64_IMM(BPF_ADD, R9, 20),
  772. BPF_ALU64_IMM(BPF_SUB, R0, 10),
  773. BPF_ALU64_IMM(BPF_SUB, R1, 10),
  774. BPF_ALU64_IMM(BPF_SUB, R2, 10),
  775. BPF_ALU64_IMM(BPF_SUB, R3, 10),
  776. BPF_ALU64_IMM(BPF_SUB, R4, 10),
  777. BPF_ALU64_IMM(BPF_SUB, R5, 10),
  778. BPF_ALU64_IMM(BPF_SUB, R6, 10),
  779. BPF_ALU64_IMM(BPF_SUB, R7, 10),
  780. BPF_ALU64_IMM(BPF_SUB, R8, 10),
  781. BPF_ALU64_IMM(BPF_SUB, R9, 10),
  782. BPF_ALU64_REG(BPF_ADD, R0, R0),
  783. BPF_ALU64_REG(BPF_ADD, R0, R1),
  784. BPF_ALU64_REG(BPF_ADD, R0, R2),
  785. BPF_ALU64_REG(BPF_ADD, R0, R3),
  786. BPF_ALU64_REG(BPF_ADD, R0, R4),
  787. BPF_ALU64_REG(BPF_ADD, R0, R5),
  788. BPF_ALU64_REG(BPF_ADD, R0, R6),
  789. BPF_ALU64_REG(BPF_ADD, R0, R7),
  790. BPF_ALU64_REG(BPF_ADD, R0, R8),
  791. BPF_ALU64_REG(BPF_ADD, R0, R9), /* R0 == 155 */
  792. BPF_JMP_IMM(BPF_JEQ, R0, 155, 1),
  793. BPF_EXIT_INSN(),
  794. BPF_ALU64_REG(BPF_ADD, R1, R0),
  795. BPF_ALU64_REG(BPF_ADD, R1, R1),
  796. BPF_ALU64_REG(BPF_ADD, R1, R2),
  797. BPF_ALU64_REG(BPF_ADD, R1, R3),
  798. BPF_ALU64_REG(BPF_ADD, R1, R4),
  799. BPF_ALU64_REG(BPF_ADD, R1, R5),
  800. BPF_ALU64_REG(BPF_ADD, R1, R6),
  801. BPF_ALU64_REG(BPF_ADD, R1, R7),
  802. BPF_ALU64_REG(BPF_ADD, R1, R8),
  803. BPF_ALU64_REG(BPF_ADD, R1, R9), /* R1 == 456 */
  804. BPF_JMP_IMM(BPF_JEQ, R1, 456, 1),
  805. BPF_EXIT_INSN(),
  806. BPF_ALU64_REG(BPF_ADD, R2, R0),
  807. BPF_ALU64_REG(BPF_ADD, R2, R1),
  808. BPF_ALU64_REG(BPF_ADD, R2, R2),
  809. BPF_ALU64_REG(BPF_ADD, R2, R3),
  810. BPF_ALU64_REG(BPF_ADD, R2, R4),
  811. BPF_ALU64_REG(BPF_ADD, R2, R5),
  812. BPF_ALU64_REG(BPF_ADD, R2, R6),
  813. BPF_ALU64_REG(BPF_ADD, R2, R7),
  814. BPF_ALU64_REG(BPF_ADD, R2, R8),
  815. BPF_ALU64_REG(BPF_ADD, R2, R9), /* R2 == 1358 */
  816. BPF_JMP_IMM(BPF_JEQ, R2, 1358, 1),
  817. BPF_EXIT_INSN(),
  818. BPF_ALU64_REG(BPF_ADD, R3, R0),
  819. BPF_ALU64_REG(BPF_ADD, R3, R1),
  820. BPF_ALU64_REG(BPF_ADD, R3, R2),
  821. BPF_ALU64_REG(BPF_ADD, R3, R3),
  822. BPF_ALU64_REG(BPF_ADD, R3, R4),
  823. BPF_ALU64_REG(BPF_ADD, R3, R5),
  824. BPF_ALU64_REG(BPF_ADD, R3, R6),
  825. BPF_ALU64_REG(BPF_ADD, R3, R7),
  826. BPF_ALU64_REG(BPF_ADD, R3, R8),
  827. BPF_ALU64_REG(BPF_ADD, R3, R9), /* R3 == 4063 */
  828. BPF_JMP_IMM(BPF_JEQ, R3, 4063, 1),
  829. BPF_EXIT_INSN(),
  830. BPF_ALU64_REG(BPF_ADD, R4, R0),
  831. BPF_ALU64_REG(BPF_ADD, R4, R1),
  832. BPF_ALU64_REG(BPF_ADD, R4, R2),
  833. BPF_ALU64_REG(BPF_ADD, R4, R3),
  834. BPF_ALU64_REG(BPF_ADD, R4, R4),
  835. BPF_ALU64_REG(BPF_ADD, R4, R5),
  836. BPF_ALU64_REG(BPF_ADD, R4, R6),
  837. BPF_ALU64_REG(BPF_ADD, R4, R7),
  838. BPF_ALU64_REG(BPF_ADD, R4, R8),
  839. BPF_ALU64_REG(BPF_ADD, R4, R9), /* R4 == 12177 */
  840. BPF_JMP_IMM(BPF_JEQ, R4, 12177, 1),
  841. BPF_EXIT_INSN(),
  842. BPF_ALU64_REG(BPF_ADD, R5, R0),
  843. BPF_ALU64_REG(BPF_ADD, R5, R1),
  844. BPF_ALU64_REG(BPF_ADD, R5, R2),
  845. BPF_ALU64_REG(BPF_ADD, R5, R3),
  846. BPF_ALU64_REG(BPF_ADD, R5, R4),
  847. BPF_ALU64_REG(BPF_ADD, R5, R5),
  848. BPF_ALU64_REG(BPF_ADD, R5, R6),
  849. BPF_ALU64_REG(BPF_ADD, R5, R7),
  850. BPF_ALU64_REG(BPF_ADD, R5, R8),
  851. BPF_ALU64_REG(BPF_ADD, R5, R9), /* R5 == 36518 */
  852. BPF_JMP_IMM(BPF_JEQ, R5, 36518, 1),
  853. BPF_EXIT_INSN(),
  854. BPF_ALU64_REG(BPF_ADD, R6, R0),
  855. BPF_ALU64_REG(BPF_ADD, R6, R1),
  856. BPF_ALU64_REG(BPF_ADD, R6, R2),
  857. BPF_ALU64_REG(BPF_ADD, R6, R3),
  858. BPF_ALU64_REG(BPF_ADD, R6, R4),
  859. BPF_ALU64_REG(BPF_ADD, R6, R5),
  860. BPF_ALU64_REG(BPF_ADD, R6, R6),
  861. BPF_ALU64_REG(BPF_ADD, R6, R7),
  862. BPF_ALU64_REG(BPF_ADD, R6, R8),
  863. BPF_ALU64_REG(BPF_ADD, R6, R9), /* R6 == 109540 */
  864. BPF_JMP_IMM(BPF_JEQ, R6, 109540, 1),
  865. BPF_EXIT_INSN(),
  866. BPF_ALU64_REG(BPF_ADD, R7, R0),
  867. BPF_ALU64_REG(BPF_ADD, R7, R1),
  868. BPF_ALU64_REG(BPF_ADD, R7, R2),
  869. BPF_ALU64_REG(BPF_ADD, R7, R3),
  870. BPF_ALU64_REG(BPF_ADD, R7, R4),
  871. BPF_ALU64_REG(BPF_ADD, R7, R5),
  872. BPF_ALU64_REG(BPF_ADD, R7, R6),
  873. BPF_ALU64_REG(BPF_ADD, R7, R7),
  874. BPF_ALU64_REG(BPF_ADD, R7, R8),
  875. BPF_ALU64_REG(BPF_ADD, R7, R9), /* R7 == 328605 */
  876. BPF_JMP_IMM(BPF_JEQ, R7, 328605, 1),
  877. BPF_EXIT_INSN(),
  878. BPF_ALU64_REG(BPF_ADD, R8, R0),
  879. BPF_ALU64_REG(BPF_ADD, R8, R1),
  880. BPF_ALU64_REG(BPF_ADD, R8, R2),
  881. BPF_ALU64_REG(BPF_ADD, R8, R3),
  882. BPF_ALU64_REG(BPF_ADD, R8, R4),
  883. BPF_ALU64_REG(BPF_ADD, R8, R5),
  884. BPF_ALU64_REG(BPF_ADD, R8, R6),
  885. BPF_ALU64_REG(BPF_ADD, R8, R7),
  886. BPF_ALU64_REG(BPF_ADD, R8, R8),
  887. BPF_ALU64_REG(BPF_ADD, R8, R9), /* R8 == 985799 */
  888. BPF_JMP_IMM(BPF_JEQ, R8, 985799, 1),
  889. BPF_EXIT_INSN(),
  890. BPF_ALU64_REG(BPF_ADD, R9, R0),
  891. BPF_ALU64_REG(BPF_ADD, R9, R1),
  892. BPF_ALU64_REG(BPF_ADD, R9, R2),
  893. BPF_ALU64_REG(BPF_ADD, R9, R3),
  894. BPF_ALU64_REG(BPF_ADD, R9, R4),
  895. BPF_ALU64_REG(BPF_ADD, R9, R5),
  896. BPF_ALU64_REG(BPF_ADD, R9, R6),
  897. BPF_ALU64_REG(BPF_ADD, R9, R7),
  898. BPF_ALU64_REG(BPF_ADD, R9, R8),
  899. BPF_ALU64_REG(BPF_ADD, R9, R9), /* R9 == 2957380 */
  900. BPF_ALU64_REG(BPF_MOV, R0, R9),
  901. BPF_EXIT_INSN(),
  902. },
  903. INTERNAL,
  904. { },
  905. { { 0, 2957380 } }
  906. },
  907. {
  908. "INT: ADD 32-bit",
  909. .u.insns_int = {
  910. BPF_ALU32_IMM(BPF_MOV, R0, 20),
  911. BPF_ALU32_IMM(BPF_MOV, R1, 1),
  912. BPF_ALU32_IMM(BPF_MOV, R2, 2),
  913. BPF_ALU32_IMM(BPF_MOV, R3, 3),
  914. BPF_ALU32_IMM(BPF_MOV, R4, 4),
  915. BPF_ALU32_IMM(BPF_MOV, R5, 5),
  916. BPF_ALU32_IMM(BPF_MOV, R6, 6),
  917. BPF_ALU32_IMM(BPF_MOV, R7, 7),
  918. BPF_ALU32_IMM(BPF_MOV, R8, 8),
  919. BPF_ALU32_IMM(BPF_MOV, R9, 9),
  920. BPF_ALU64_IMM(BPF_ADD, R1, 10),
  921. BPF_ALU64_IMM(BPF_ADD, R2, 10),
  922. BPF_ALU64_IMM(BPF_ADD, R3, 10),
  923. BPF_ALU64_IMM(BPF_ADD, R4, 10),
  924. BPF_ALU64_IMM(BPF_ADD, R5, 10),
  925. BPF_ALU64_IMM(BPF_ADD, R6, 10),
  926. BPF_ALU64_IMM(BPF_ADD, R7, 10),
  927. BPF_ALU64_IMM(BPF_ADD, R8, 10),
  928. BPF_ALU64_IMM(BPF_ADD, R9, 10),
  929. BPF_ALU32_REG(BPF_ADD, R0, R1),
  930. BPF_ALU32_REG(BPF_ADD, R0, R2),
  931. BPF_ALU32_REG(BPF_ADD, R0, R3),
  932. BPF_ALU32_REG(BPF_ADD, R0, R4),
  933. BPF_ALU32_REG(BPF_ADD, R0, R5),
  934. BPF_ALU32_REG(BPF_ADD, R0, R6),
  935. BPF_ALU32_REG(BPF_ADD, R0, R7),
  936. BPF_ALU32_REG(BPF_ADD, R0, R8),
  937. BPF_ALU32_REG(BPF_ADD, R0, R9), /* R0 == 155 */
  938. BPF_JMP_IMM(BPF_JEQ, R0, 155, 1),
  939. BPF_EXIT_INSN(),
  940. BPF_ALU32_REG(BPF_ADD, R1, R0),
  941. BPF_ALU32_REG(BPF_ADD, R1, R1),
  942. BPF_ALU32_REG(BPF_ADD, R1, R2),
  943. BPF_ALU32_REG(BPF_ADD, R1, R3),
  944. BPF_ALU32_REG(BPF_ADD, R1, R4),
  945. BPF_ALU32_REG(BPF_ADD, R1, R5),
  946. BPF_ALU32_REG(BPF_ADD, R1, R6),
  947. BPF_ALU32_REG(BPF_ADD, R1, R7),
  948. BPF_ALU32_REG(BPF_ADD, R1, R8),
  949. BPF_ALU32_REG(BPF_ADD, R1, R9), /* R1 == 456 */
  950. BPF_JMP_IMM(BPF_JEQ, R1, 456, 1),
  951. BPF_EXIT_INSN(),
  952. BPF_ALU32_REG(BPF_ADD, R2, R0),
  953. BPF_ALU32_REG(BPF_ADD, R2, R1),
  954. BPF_ALU32_REG(BPF_ADD, R2, R2),
  955. BPF_ALU32_REG(BPF_ADD, R2, R3),
  956. BPF_ALU32_REG(BPF_ADD, R2, R4),
  957. BPF_ALU32_REG(BPF_ADD, R2, R5),
  958. BPF_ALU32_REG(BPF_ADD, R2, R6),
  959. BPF_ALU32_REG(BPF_ADD, R2, R7),
  960. BPF_ALU32_REG(BPF_ADD, R2, R8),
  961. BPF_ALU32_REG(BPF_ADD, R2, R9), /* R2 == 1358 */
  962. BPF_JMP_IMM(BPF_JEQ, R2, 1358, 1),
  963. BPF_EXIT_INSN(),
  964. BPF_ALU32_REG(BPF_ADD, R3, R0),
  965. BPF_ALU32_REG(BPF_ADD, R3, R1),
  966. BPF_ALU32_REG(BPF_ADD, R3, R2),
  967. BPF_ALU32_REG(BPF_ADD, R3, R3),
  968. BPF_ALU32_REG(BPF_ADD, R3, R4),
  969. BPF_ALU32_REG(BPF_ADD, R3, R5),
  970. BPF_ALU32_REG(BPF_ADD, R3, R6),
  971. BPF_ALU32_REG(BPF_ADD, R3, R7),
  972. BPF_ALU32_REG(BPF_ADD, R3, R8),
  973. BPF_ALU32_REG(BPF_ADD, R3, R9), /* R3 == 4063 */
  974. BPF_JMP_IMM(BPF_JEQ, R3, 4063, 1),
  975. BPF_EXIT_INSN(),
  976. BPF_ALU32_REG(BPF_ADD, R4, R0),
  977. BPF_ALU32_REG(BPF_ADD, R4, R1),
  978. BPF_ALU32_REG(BPF_ADD, R4, R2),
  979. BPF_ALU32_REG(BPF_ADD, R4, R3),
  980. BPF_ALU32_REG(BPF_ADD, R4, R4),
  981. BPF_ALU32_REG(BPF_ADD, R4, R5),
  982. BPF_ALU32_REG(BPF_ADD, R4, R6),
  983. BPF_ALU32_REG(BPF_ADD, R4, R7),
  984. BPF_ALU32_REG(BPF_ADD, R4, R8),
  985. BPF_ALU32_REG(BPF_ADD, R4, R9), /* R4 == 12177 */
  986. BPF_JMP_IMM(BPF_JEQ, R4, 12177, 1),
  987. BPF_EXIT_INSN(),
  988. BPF_ALU32_REG(BPF_ADD, R5, R0),
  989. BPF_ALU32_REG(BPF_ADD, R5, R1),
  990. BPF_ALU32_REG(BPF_ADD, R5, R2),
  991. BPF_ALU32_REG(BPF_ADD, R5, R3),
  992. BPF_ALU32_REG(BPF_ADD, R5, R4),
  993. BPF_ALU32_REG(BPF_ADD, R5, R5),
  994. BPF_ALU32_REG(BPF_ADD, R5, R6),
  995. BPF_ALU32_REG(BPF_ADD, R5, R7),
  996. BPF_ALU32_REG(BPF_ADD, R5, R8),
  997. BPF_ALU32_REG(BPF_ADD, R5, R9), /* R5 == 36518 */
  998. BPF_JMP_IMM(BPF_JEQ, R5, 36518, 1),
  999. BPF_EXIT_INSN(),
  1000. BPF_ALU32_REG(BPF_ADD, R6, R0),
  1001. BPF_ALU32_REG(BPF_ADD, R6, R1),
  1002. BPF_ALU32_REG(BPF_ADD, R6, R2),
  1003. BPF_ALU32_REG(BPF_ADD, R6, R3),
  1004. BPF_ALU32_REG(BPF_ADD, R6, R4),
  1005. BPF_ALU32_REG(BPF_ADD, R6, R5),
  1006. BPF_ALU32_REG(BPF_ADD, R6, R6),
  1007. BPF_ALU32_REG(BPF_ADD, R6, R7),
  1008. BPF_ALU32_REG(BPF_ADD, R6, R8),
  1009. BPF_ALU32_REG(BPF_ADD, R6, R9), /* R6 == 109540 */
  1010. BPF_JMP_IMM(BPF_JEQ, R6, 109540, 1),
  1011. BPF_EXIT_INSN(),
  1012. BPF_ALU32_REG(BPF_ADD, R7, R0),
  1013. BPF_ALU32_REG(BPF_ADD, R7, R1),
  1014. BPF_ALU32_REG(BPF_ADD, R7, R2),
  1015. BPF_ALU32_REG(BPF_ADD, R7, R3),
  1016. BPF_ALU32_REG(BPF_ADD, R7, R4),
  1017. BPF_ALU32_REG(BPF_ADD, R7, R5),
  1018. BPF_ALU32_REG(BPF_ADD, R7, R6),
  1019. BPF_ALU32_REG(BPF_ADD, R7, R7),
  1020. BPF_ALU32_REG(BPF_ADD, R7, R8),
  1021. BPF_ALU32_REG(BPF_ADD, R7, R9), /* R7 == 328605 */
  1022. BPF_JMP_IMM(BPF_JEQ, R7, 328605, 1),
  1023. BPF_EXIT_INSN(),
  1024. BPF_ALU32_REG(BPF_ADD, R8, R0),
  1025. BPF_ALU32_REG(BPF_ADD, R8, R1),
  1026. BPF_ALU32_REG(BPF_ADD, R8, R2),
  1027. BPF_ALU32_REG(BPF_ADD, R8, R3),
  1028. BPF_ALU32_REG(BPF_ADD, R8, R4),
  1029. BPF_ALU32_REG(BPF_ADD, R8, R5),
  1030. BPF_ALU32_REG(BPF_ADD, R8, R6),
  1031. BPF_ALU32_REG(BPF_ADD, R8, R7),
  1032. BPF_ALU32_REG(BPF_ADD, R8, R8),
  1033. BPF_ALU32_REG(BPF_ADD, R8, R9), /* R8 == 985799 */
  1034. BPF_JMP_IMM(BPF_JEQ, R8, 985799, 1),
  1035. BPF_EXIT_INSN(),
  1036. BPF_ALU32_REG(BPF_ADD, R9, R0),
  1037. BPF_ALU32_REG(BPF_ADD, R9, R1),
  1038. BPF_ALU32_REG(BPF_ADD, R9, R2),
  1039. BPF_ALU32_REG(BPF_ADD, R9, R3),
  1040. BPF_ALU32_REG(BPF_ADD, R9, R4),
  1041. BPF_ALU32_REG(BPF_ADD, R9, R5),
  1042. BPF_ALU32_REG(BPF_ADD, R9, R6),
  1043. BPF_ALU32_REG(BPF_ADD, R9, R7),
  1044. BPF_ALU32_REG(BPF_ADD, R9, R8),
  1045. BPF_ALU32_REG(BPF_ADD, R9, R9), /* R9 == 2957380 */
  1046. BPF_ALU32_REG(BPF_MOV, R0, R9),
  1047. BPF_EXIT_INSN(),
  1048. },
  1049. INTERNAL,
  1050. { },
  1051. { { 0, 2957380 } }
  1052. },
  1053. { /* Mainly checking JIT here. */
  1054. "INT: SUB",
  1055. .u.insns_int = {
  1056. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  1057. BPF_ALU64_IMM(BPF_MOV, R1, 1),
  1058. BPF_ALU64_IMM(BPF_MOV, R2, 2),
  1059. BPF_ALU64_IMM(BPF_MOV, R3, 3),
  1060. BPF_ALU64_IMM(BPF_MOV, R4, 4),
  1061. BPF_ALU64_IMM(BPF_MOV, R5, 5),
  1062. BPF_ALU64_IMM(BPF_MOV, R6, 6),
  1063. BPF_ALU64_IMM(BPF_MOV, R7, 7),
  1064. BPF_ALU64_IMM(BPF_MOV, R8, 8),
  1065. BPF_ALU64_IMM(BPF_MOV, R9, 9),
  1066. BPF_ALU64_REG(BPF_SUB, R0, R0),
  1067. BPF_ALU64_REG(BPF_SUB, R0, R1),
  1068. BPF_ALU64_REG(BPF_SUB, R0, R2),
  1069. BPF_ALU64_REG(BPF_SUB, R0, R3),
  1070. BPF_ALU64_REG(BPF_SUB, R0, R4),
  1071. BPF_ALU64_REG(BPF_SUB, R0, R5),
  1072. BPF_ALU64_REG(BPF_SUB, R0, R6),
  1073. BPF_ALU64_REG(BPF_SUB, R0, R7),
  1074. BPF_ALU64_REG(BPF_SUB, R0, R8),
  1075. BPF_ALU64_REG(BPF_SUB, R0, R9),
  1076. BPF_ALU64_IMM(BPF_SUB, R0, 10),
  1077. BPF_JMP_IMM(BPF_JEQ, R0, -55, 1),
  1078. BPF_EXIT_INSN(),
  1079. BPF_ALU64_REG(BPF_SUB, R1, R0),
  1080. BPF_ALU64_REG(BPF_SUB, R1, R2),
  1081. BPF_ALU64_REG(BPF_SUB, R1, R3),
  1082. BPF_ALU64_REG(BPF_SUB, R1, R4),
  1083. BPF_ALU64_REG(BPF_SUB, R1, R5),
  1084. BPF_ALU64_REG(BPF_SUB, R1, R6),
  1085. BPF_ALU64_REG(BPF_SUB, R1, R7),
  1086. BPF_ALU64_REG(BPF_SUB, R1, R8),
  1087. BPF_ALU64_REG(BPF_SUB, R1, R9),
  1088. BPF_ALU64_IMM(BPF_SUB, R1, 10),
  1089. BPF_ALU64_REG(BPF_SUB, R2, R0),
  1090. BPF_ALU64_REG(BPF_SUB, R2, R1),
  1091. BPF_ALU64_REG(BPF_SUB, R2, R3),
  1092. BPF_ALU64_REG(BPF_SUB, R2, R4),
  1093. BPF_ALU64_REG(BPF_SUB, R2, R5),
  1094. BPF_ALU64_REG(BPF_SUB, R2, R6),
  1095. BPF_ALU64_REG(BPF_SUB, R2, R7),
  1096. BPF_ALU64_REG(BPF_SUB, R2, R8),
  1097. BPF_ALU64_REG(BPF_SUB, R2, R9),
  1098. BPF_ALU64_IMM(BPF_SUB, R2, 10),
  1099. BPF_ALU64_REG(BPF_SUB, R3, R0),
  1100. BPF_ALU64_REG(BPF_SUB, R3, R1),
  1101. BPF_ALU64_REG(BPF_SUB, R3, R2),
  1102. BPF_ALU64_REG(BPF_SUB, R3, R4),
  1103. BPF_ALU64_REG(BPF_SUB, R3, R5),
  1104. BPF_ALU64_REG(BPF_SUB, R3, R6),
  1105. BPF_ALU64_REG(BPF_SUB, R3, R7),
  1106. BPF_ALU64_REG(BPF_SUB, R3, R8),
  1107. BPF_ALU64_REG(BPF_SUB, R3, R9),
  1108. BPF_ALU64_IMM(BPF_SUB, R3, 10),
  1109. BPF_ALU64_REG(BPF_SUB, R4, R0),
  1110. BPF_ALU64_REG(BPF_SUB, R4, R1),
  1111. BPF_ALU64_REG(BPF_SUB, R4, R2),
  1112. BPF_ALU64_REG(BPF_SUB, R4, R3),
  1113. BPF_ALU64_REG(BPF_SUB, R4, R5),
  1114. BPF_ALU64_REG(BPF_SUB, R4, R6),
  1115. BPF_ALU64_REG(BPF_SUB, R4, R7),
  1116. BPF_ALU64_REG(BPF_SUB, R4, R8),
  1117. BPF_ALU64_REG(BPF_SUB, R4, R9),
  1118. BPF_ALU64_IMM(BPF_SUB, R4, 10),
  1119. BPF_ALU64_REG(BPF_SUB, R5, R0),
  1120. BPF_ALU64_REG(BPF_SUB, R5, R1),
  1121. BPF_ALU64_REG(BPF_SUB, R5, R2),
  1122. BPF_ALU64_REG(BPF_SUB, R5, R3),
  1123. BPF_ALU64_REG(BPF_SUB, R5, R4),
  1124. BPF_ALU64_REG(BPF_SUB, R5, R6),
  1125. BPF_ALU64_REG(BPF_SUB, R5, R7),
  1126. BPF_ALU64_REG(BPF_SUB, R5, R8),
  1127. BPF_ALU64_REG(BPF_SUB, R5, R9),
  1128. BPF_ALU64_IMM(BPF_SUB, R5, 10),
  1129. BPF_ALU64_REG(BPF_SUB, R6, R0),
  1130. BPF_ALU64_REG(BPF_SUB, R6, R1),
  1131. BPF_ALU64_REG(BPF_SUB, R6, R2),
  1132. BPF_ALU64_REG(BPF_SUB, R6, R3),
  1133. BPF_ALU64_REG(BPF_SUB, R6, R4),
  1134. BPF_ALU64_REG(BPF_SUB, R6, R5),
  1135. BPF_ALU64_REG(BPF_SUB, R6, R7),
  1136. BPF_ALU64_REG(BPF_SUB, R6, R8),
  1137. BPF_ALU64_REG(BPF_SUB, R6, R9),
  1138. BPF_ALU64_IMM(BPF_SUB, R6, 10),
  1139. BPF_ALU64_REG(BPF_SUB, R7, R0),
  1140. BPF_ALU64_REG(BPF_SUB, R7, R1),
  1141. BPF_ALU64_REG(BPF_SUB, R7, R2),
  1142. BPF_ALU64_REG(BPF_SUB, R7, R3),
  1143. BPF_ALU64_REG(BPF_SUB, R7, R4),
  1144. BPF_ALU64_REG(BPF_SUB, R7, R5),
  1145. BPF_ALU64_REG(BPF_SUB, R7, R6),
  1146. BPF_ALU64_REG(BPF_SUB, R7, R8),
  1147. BPF_ALU64_REG(BPF_SUB, R7, R9),
  1148. BPF_ALU64_IMM(BPF_SUB, R7, 10),
  1149. BPF_ALU64_REG(BPF_SUB, R8, R0),
  1150. BPF_ALU64_REG(BPF_SUB, R8, R1),
  1151. BPF_ALU64_REG(BPF_SUB, R8, R2),
  1152. BPF_ALU64_REG(BPF_SUB, R8, R3),
  1153. BPF_ALU64_REG(BPF_SUB, R8, R4),
  1154. BPF_ALU64_REG(BPF_SUB, R8, R5),
  1155. BPF_ALU64_REG(BPF_SUB, R8, R6),
  1156. BPF_ALU64_REG(BPF_SUB, R8, R7),
  1157. BPF_ALU64_REG(BPF_SUB, R8, R9),
  1158. BPF_ALU64_IMM(BPF_SUB, R8, 10),
  1159. BPF_ALU64_REG(BPF_SUB, R9, R0),
  1160. BPF_ALU64_REG(BPF_SUB, R9, R1),
  1161. BPF_ALU64_REG(BPF_SUB, R9, R2),
  1162. BPF_ALU64_REG(BPF_SUB, R9, R3),
  1163. BPF_ALU64_REG(BPF_SUB, R9, R4),
  1164. BPF_ALU64_REG(BPF_SUB, R9, R5),
  1165. BPF_ALU64_REG(BPF_SUB, R9, R6),
  1166. BPF_ALU64_REG(BPF_SUB, R9, R7),
  1167. BPF_ALU64_REG(BPF_SUB, R9, R8),
  1168. BPF_ALU64_IMM(BPF_SUB, R9, 10),
  1169. BPF_ALU64_IMM(BPF_SUB, R0, 10),
  1170. BPF_ALU64_IMM(BPF_NEG, R0, 0),
  1171. BPF_ALU64_REG(BPF_SUB, R0, R1),
  1172. BPF_ALU64_REG(BPF_SUB, R0, R2),
  1173. BPF_ALU64_REG(BPF_SUB, R0, R3),
  1174. BPF_ALU64_REG(BPF_SUB, R0, R4),
  1175. BPF_ALU64_REG(BPF_SUB, R0, R5),
  1176. BPF_ALU64_REG(BPF_SUB, R0, R6),
  1177. BPF_ALU64_REG(BPF_SUB, R0, R7),
  1178. BPF_ALU64_REG(BPF_SUB, R0, R8),
  1179. BPF_ALU64_REG(BPF_SUB, R0, R9),
  1180. BPF_EXIT_INSN(),
  1181. },
  1182. INTERNAL,
  1183. { },
  1184. { { 0, 11 } }
  1185. },
  1186. { /* Mainly checking JIT here. */
  1187. "INT: XOR",
  1188. .u.insns_int = {
  1189. BPF_ALU64_REG(BPF_SUB, R0, R0),
  1190. BPF_ALU64_REG(BPF_XOR, R1, R1),
  1191. BPF_JMP_REG(BPF_JEQ, R0, R1, 1),
  1192. BPF_EXIT_INSN(),
  1193. BPF_ALU64_IMM(BPF_MOV, R0, 10),
  1194. BPF_ALU64_IMM(BPF_MOV, R1, -1),
  1195. BPF_ALU64_REG(BPF_SUB, R1, R1),
  1196. BPF_ALU64_REG(BPF_XOR, R2, R2),
  1197. BPF_JMP_REG(BPF_JEQ, R1, R2, 1),
  1198. BPF_EXIT_INSN(),
  1199. BPF_ALU64_REG(BPF_SUB, R2, R2),
  1200. BPF_ALU64_REG(BPF_XOR, R3, R3),
  1201. BPF_ALU64_IMM(BPF_MOV, R0, 10),
  1202. BPF_ALU64_IMM(BPF_MOV, R1, -1),
  1203. BPF_JMP_REG(BPF_JEQ, R2, R3, 1),
  1204. BPF_EXIT_INSN(),
  1205. BPF_ALU64_REG(BPF_SUB, R3, R3),
  1206. BPF_ALU64_REG(BPF_XOR, R4, R4),
  1207. BPF_ALU64_IMM(BPF_MOV, R2, 1),
  1208. BPF_ALU64_IMM(BPF_MOV, R5, -1),
  1209. BPF_JMP_REG(BPF_JEQ, R3, R4, 1),
  1210. BPF_EXIT_INSN(),
  1211. BPF_ALU64_REG(BPF_SUB, R4, R4),
  1212. BPF_ALU64_REG(BPF_XOR, R5, R5),
  1213. BPF_ALU64_IMM(BPF_MOV, R3, 1),
  1214. BPF_ALU64_IMM(BPF_MOV, R7, -1),
  1215. BPF_JMP_REG(BPF_JEQ, R5, R4, 1),
  1216. BPF_EXIT_INSN(),
  1217. BPF_ALU64_IMM(BPF_MOV, R5, 1),
  1218. BPF_ALU64_REG(BPF_SUB, R5, R5),
  1219. BPF_ALU64_REG(BPF_XOR, R6, R6),
  1220. BPF_ALU64_IMM(BPF_MOV, R1, 1),
  1221. BPF_ALU64_IMM(BPF_MOV, R8, -1),
  1222. BPF_JMP_REG(BPF_JEQ, R5, R6, 1),
  1223. BPF_EXIT_INSN(),
  1224. BPF_ALU64_REG(BPF_SUB, R6, R6),
  1225. BPF_ALU64_REG(BPF_XOR, R7, R7),
  1226. BPF_JMP_REG(BPF_JEQ, R7, R6, 1),
  1227. BPF_EXIT_INSN(),
  1228. BPF_ALU64_REG(BPF_SUB, R7, R7),
  1229. BPF_ALU64_REG(BPF_XOR, R8, R8),
  1230. BPF_JMP_REG(BPF_JEQ, R7, R8, 1),
  1231. BPF_EXIT_INSN(),
  1232. BPF_ALU64_REG(BPF_SUB, R8, R8),
  1233. BPF_ALU64_REG(BPF_XOR, R9, R9),
  1234. BPF_JMP_REG(BPF_JEQ, R9, R8, 1),
  1235. BPF_EXIT_INSN(),
  1236. BPF_ALU64_REG(BPF_SUB, R9, R9),
  1237. BPF_ALU64_REG(BPF_XOR, R0, R0),
  1238. BPF_JMP_REG(BPF_JEQ, R9, R0, 1),
  1239. BPF_EXIT_INSN(),
  1240. BPF_ALU64_REG(BPF_SUB, R1, R1),
  1241. BPF_ALU64_REG(BPF_XOR, R0, R0),
  1242. BPF_JMP_REG(BPF_JEQ, R9, R0, 2),
  1243. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  1244. BPF_EXIT_INSN(),
  1245. BPF_ALU64_IMM(BPF_MOV, R0, 1),
  1246. BPF_EXIT_INSN(),
  1247. },
  1248. INTERNAL,
  1249. { },
  1250. { { 0, 1 } }
  1251. },
  1252. { /* Mainly checking JIT here. */
  1253. "INT: MUL",
  1254. .u.insns_int = {
  1255. BPF_ALU64_IMM(BPF_MOV, R0, 11),
  1256. BPF_ALU64_IMM(BPF_MOV, R1, 1),
  1257. BPF_ALU64_IMM(BPF_MOV, R2, 2),
  1258. BPF_ALU64_IMM(BPF_MOV, R3, 3),
  1259. BPF_ALU64_IMM(BPF_MOV, R4, 4),
  1260. BPF_ALU64_IMM(BPF_MOV, R5, 5),
  1261. BPF_ALU64_IMM(BPF_MOV, R6, 6),
  1262. BPF_ALU64_IMM(BPF_MOV, R7, 7),
  1263. BPF_ALU64_IMM(BPF_MOV, R8, 8),
  1264. BPF_ALU64_IMM(BPF_MOV, R9, 9),
  1265. BPF_ALU64_REG(BPF_MUL, R0, R0),
  1266. BPF_ALU64_REG(BPF_MUL, R0, R1),
  1267. BPF_ALU64_REG(BPF_MUL, R0, R2),
  1268. BPF_ALU64_REG(BPF_MUL, R0, R3),
  1269. BPF_ALU64_REG(BPF_MUL, R0, R4),
  1270. BPF_ALU64_REG(BPF_MUL, R0, R5),
  1271. BPF_ALU64_REG(BPF_MUL, R0, R6),
  1272. BPF_ALU64_REG(BPF_MUL, R0, R7),
  1273. BPF_ALU64_REG(BPF_MUL, R0, R8),
  1274. BPF_ALU64_REG(BPF_MUL, R0, R9),
  1275. BPF_ALU64_IMM(BPF_MUL, R0, 10),
  1276. BPF_JMP_IMM(BPF_JEQ, R0, 439084800, 1),
  1277. BPF_EXIT_INSN(),
  1278. BPF_ALU64_REG(BPF_MUL, R1, R0),
  1279. BPF_ALU64_REG(BPF_MUL, R1, R2),
  1280. BPF_ALU64_REG(BPF_MUL, R1, R3),
  1281. BPF_ALU64_REG(BPF_MUL, R1, R4),
  1282. BPF_ALU64_REG(BPF_MUL, R1, R5),
  1283. BPF_ALU64_REG(BPF_MUL, R1, R6),
  1284. BPF_ALU64_REG(BPF_MUL, R1, R7),
  1285. BPF_ALU64_REG(BPF_MUL, R1, R8),
  1286. BPF_ALU64_REG(BPF_MUL, R1, R9),
  1287. BPF_ALU64_IMM(BPF_MUL, R1, 10),
  1288. BPF_ALU64_REG(BPF_MOV, R2, R1),
  1289. BPF_ALU64_IMM(BPF_RSH, R2, 32),
  1290. BPF_JMP_IMM(BPF_JEQ, R2, 0x5a924, 1),
  1291. BPF_EXIT_INSN(),
  1292. BPF_ALU64_IMM(BPF_LSH, R1, 32),
  1293. BPF_ALU64_IMM(BPF_ARSH, R1, 32),
  1294. BPF_JMP_IMM(BPF_JEQ, R1, 0xebb90000, 1),
  1295. BPF_EXIT_INSN(),
  1296. BPF_ALU64_REG(BPF_MUL, R2, R0),
  1297. BPF_ALU64_REG(BPF_MUL, R2, R1),
  1298. BPF_ALU64_REG(BPF_MUL, R2, R3),
  1299. BPF_ALU64_REG(BPF_MUL, R2, R4),
  1300. BPF_ALU64_REG(BPF_MUL, R2, R5),
  1301. BPF_ALU64_REG(BPF_MUL, R2, R6),
  1302. BPF_ALU64_REG(BPF_MUL, R2, R7),
  1303. BPF_ALU64_REG(BPF_MUL, R2, R8),
  1304. BPF_ALU64_REG(BPF_MUL, R2, R9),
  1305. BPF_ALU64_IMM(BPF_MUL, R2, 10),
  1306. BPF_ALU64_IMM(BPF_RSH, R2, 32),
  1307. BPF_ALU64_REG(BPF_MOV, R0, R2),
  1308. BPF_EXIT_INSN(),
  1309. },
  1310. INTERNAL,
  1311. { },
  1312. { { 0, 0x35d97ef2 } }
  1313. },
  1314. {
  1315. "INT: ALU MIX",
  1316. .u.insns_int = {
  1317. BPF_ALU64_IMM(BPF_MOV, R0, 11),
  1318. BPF_ALU64_IMM(BPF_ADD, R0, -1),
  1319. BPF_ALU64_IMM(BPF_MOV, R2, 2),
  1320. BPF_ALU64_IMM(BPF_XOR, R2, 3),
  1321. BPF_ALU64_REG(BPF_DIV, R0, R2),
  1322. BPF_JMP_IMM(BPF_JEQ, R0, 10, 1),
  1323. BPF_EXIT_INSN(),
  1324. BPF_ALU64_IMM(BPF_MOD, R0, 3),
  1325. BPF_JMP_IMM(BPF_JEQ, R0, 1, 1),
  1326. BPF_EXIT_INSN(),
  1327. BPF_ALU64_IMM(BPF_MOV, R0, -1),
  1328. BPF_EXIT_INSN(),
  1329. },
  1330. INTERNAL,
  1331. { },
  1332. { { 0, -1 } }
  1333. },
  1334. {
  1335. "INT: DIV + ABS",
  1336. .u.insns_int = {
  1337. BPF_ALU64_REG(BPF_MOV, R6, R1),
  1338. BPF_LD_ABS(BPF_B, 3),
  1339. BPF_ALU64_IMM(BPF_MOV, R2, 2),
  1340. BPF_ALU32_REG(BPF_DIV, R0, R2),
  1341. BPF_ALU64_REG(BPF_MOV, R8, R0),
  1342. BPF_LD_ABS(BPF_B, 4),
  1343. BPF_ALU64_REG(BPF_ADD, R8, R0),
  1344. BPF_LD_IND(BPF_B, R8, -70),
  1345. BPF_EXIT_INSN(),
  1346. },
  1347. INTERNAL,
  1348. { 10, 20, 30, 40, 50 },
  1349. { { 4, 0 }, { 5, 10 } }
  1350. },
  1351. {
  1352. "INT: DIV by zero",
  1353. .u.insns_int = {
  1354. BPF_ALU64_REG(BPF_MOV, R6, R1),
  1355. BPF_ALU64_IMM(BPF_MOV, R7, 0),
  1356. BPF_LD_ABS(BPF_B, 3),
  1357. BPF_ALU32_REG(BPF_DIV, R0, R7),
  1358. BPF_EXIT_INSN(),
  1359. },
  1360. INTERNAL,
  1361. { 10, 20, 30, 40, 50 },
  1362. { { 3, 0 }, { 4, 0 } }
  1363. },
  1364. {
  1365. "check: missing ret",
  1366. .u.insns = {
  1367. BPF_STMT(BPF_LD | BPF_IMM, 1),
  1368. },
  1369. CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
  1370. { },
  1371. { }
  1372. },
  1373. {
  1374. "check: div_k_0",
  1375. .u.insns = {
  1376. BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 0),
  1377. BPF_STMT(BPF_RET | BPF_K, 0)
  1378. },
  1379. CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
  1380. { },
  1381. { }
  1382. },
  1383. {
  1384. "check: unknown insn",
  1385. .u.insns = {
  1386. /* seccomp insn, rejected in socket filter */
  1387. BPF_STMT(BPF_LDX | BPF_W | BPF_ABS, 0),
  1388. BPF_STMT(BPF_RET | BPF_K, 0)
  1389. },
  1390. CLASSIC | FLAG_EXPECTED_FAIL,
  1391. { },
  1392. { }
  1393. },
  1394. {
  1395. "check: out of range spill/fill",
  1396. .u.insns = {
  1397. BPF_STMT(BPF_STX, 16),
  1398. BPF_STMT(BPF_RET | BPF_K, 0)
  1399. },
  1400. CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
  1401. { },
  1402. { }
  1403. },
  1404. {
  1405. "JUMPS + HOLES",
  1406. .u.insns = {
  1407. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1408. BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 15),
  1409. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1410. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1411. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1412. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1413. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1414. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1415. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1416. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1417. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1418. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1419. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1420. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1421. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1422. BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90c2894d, 3, 4),
  1423. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1424. BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90c2894d, 1, 2),
  1425. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1426. BPF_JUMP(BPF_JMP | BPF_JGE, 0, 14, 15),
  1427. BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 14),
  1428. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1429. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1430. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1431. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1432. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1433. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1434. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1435. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1436. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1437. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1438. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1439. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1440. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1441. BPF_JUMP(BPF_JMP | BPF_JEQ, 0x2ac28349, 2, 3),
  1442. BPF_JUMP(BPF_JMP | BPF_JEQ, 0x2ac28349, 1, 2),
  1443. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1444. BPF_JUMP(BPF_JMP | BPF_JGE, 0, 14, 15),
  1445. BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 14),
  1446. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1447. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1448. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1449. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1450. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1451. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1452. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1453. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1454. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1455. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1456. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1457. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1458. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1459. BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90d2ff41, 2, 3),
  1460. BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90d2ff41, 1, 2),
  1461. BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
  1462. BPF_STMT(BPF_RET | BPF_A, 0),
  1463. BPF_STMT(BPF_RET | BPF_A, 0),
  1464. },
  1465. CLASSIC,
  1466. { 0x00, 0x1b, 0x21, 0x3c, 0x9d, 0xf8,
  1467. 0x90, 0xe2, 0xba, 0x0a, 0x56, 0xb4,
  1468. 0x08, 0x00,
  1469. 0x45, 0x00, 0x00, 0x28, 0x00, 0x00,
  1470. 0x20, 0x00, 0x40, 0x11, 0x00, 0x00, /* IP header */
  1471. 0xc0, 0xa8, 0x33, 0x01,
  1472. 0xc0, 0xa8, 0x33, 0x02,
  1473. 0xbb, 0xb6,
  1474. 0xa9, 0xfa,
  1475. 0x00, 0x14, 0x00, 0x00,
  1476. 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
  1477. 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
  1478. 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
  1479. 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
  1480. 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
  1481. 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
  1482. 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
  1483. 0xcc, 0xcc, 0xcc, 0xcc },
  1484. { { 88, 0x001b } }
  1485. },
  1486. {
  1487. "check: RET X",
  1488. .u.insns = {
  1489. BPF_STMT(BPF_RET | BPF_X, 0),
  1490. },
  1491. CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
  1492. { },
  1493. { },
  1494. },
  1495. {
  1496. "check: LDX + RET X",
  1497. .u.insns = {
  1498. BPF_STMT(BPF_LDX | BPF_IMM, 42),
  1499. BPF_STMT(BPF_RET | BPF_X, 0),
  1500. },
  1501. CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
  1502. { },
  1503. { },
  1504. },
  1505. { /* Mainly checking JIT here. */
  1506. "M[]: alt STX + LDX",
  1507. .u.insns = {
  1508. BPF_STMT(BPF_LDX | BPF_IMM, 100),
  1509. BPF_STMT(BPF_STX, 0),
  1510. BPF_STMT(BPF_LDX | BPF_MEM, 0),
  1511. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  1512. BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
  1513. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  1514. BPF_STMT(BPF_STX, 1),
  1515. BPF_STMT(BPF_LDX | BPF_MEM, 1),
  1516. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  1517. BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
  1518. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  1519. BPF_STMT(BPF_STX, 2),
  1520. BPF_STMT(BPF_LDX | BPF_MEM, 2),
  1521. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  1522. BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
  1523. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  1524. BPF_STMT(BPF_STX, 3),
  1525. BPF_STMT(BPF_LDX | BPF_MEM, 3),
  1526. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  1527. BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
  1528. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  1529. BPF_STMT(BPF_STX, 4),
  1530. BPF_STMT(BPF_LDX | BPF_MEM, 4),
  1531. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  1532. BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
  1533. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  1534. BPF_STMT(BPF_STX, 5),
  1535. BPF_STMT(BPF_LDX | BPF_MEM, 5),
  1536. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  1537. BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
  1538. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  1539. BPF_STMT(BPF_STX, 6),
  1540. BPF_STMT(BPF_LDX | BPF_MEM, 6),
  1541. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  1542. BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
  1543. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  1544. BPF_STMT(BPF_STX, 7),
  1545. BPF_STMT(BPF_LDX | BPF_MEM, 7),
  1546. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  1547. BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
  1548. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  1549. BPF_STMT(BPF_STX, 8),
  1550. BPF_STMT(BPF_LDX | BPF_MEM, 8),
  1551. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  1552. BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
  1553. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  1554. BPF_STMT(BPF_STX, 9),
  1555. BPF_STMT(BPF_LDX | BPF_MEM, 9),
  1556. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  1557. BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
  1558. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  1559. BPF_STMT(BPF_STX, 10),
  1560. BPF_STMT(BPF_LDX | BPF_MEM, 10),
  1561. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  1562. BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
  1563. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  1564. BPF_STMT(BPF_STX, 11),
  1565. BPF_STMT(BPF_LDX | BPF_MEM, 11),
  1566. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  1567. BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
  1568. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  1569. BPF_STMT(BPF_STX, 12),
  1570. BPF_STMT(BPF_LDX | BPF_MEM, 12),
  1571. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  1572. BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
  1573. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  1574. BPF_STMT(BPF_STX, 13),
  1575. BPF_STMT(BPF_LDX | BPF_MEM, 13),
  1576. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  1577. BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
  1578. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  1579. BPF_STMT(BPF_STX, 14),
  1580. BPF_STMT(BPF_LDX | BPF_MEM, 14),
  1581. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  1582. BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
  1583. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  1584. BPF_STMT(BPF_STX, 15),
  1585. BPF_STMT(BPF_LDX | BPF_MEM, 15),
  1586. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  1587. BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
  1588. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  1589. BPF_STMT(BPF_RET | BPF_A, 0),
  1590. },
  1591. CLASSIC | FLAG_NO_DATA,
  1592. { },
  1593. { { 0, 116 } },
  1594. },
  1595. { /* Mainly checking JIT here. */
  1596. "M[]: full STX + full LDX",
  1597. .u.insns = {
  1598. BPF_STMT(BPF_LDX | BPF_IMM, 0xbadfeedb),
  1599. BPF_STMT(BPF_STX, 0),
  1600. BPF_STMT(BPF_LDX | BPF_IMM, 0xecabedae),
  1601. BPF_STMT(BPF_STX, 1),
  1602. BPF_STMT(BPF_LDX | BPF_IMM, 0xafccfeaf),
  1603. BPF_STMT(BPF_STX, 2),
  1604. BPF_STMT(BPF_LDX | BPF_IMM, 0xbffdcedc),
  1605. BPF_STMT(BPF_STX, 3),
  1606. BPF_STMT(BPF_LDX | BPF_IMM, 0xfbbbdccb),
  1607. BPF_STMT(BPF_STX, 4),
  1608. BPF_STMT(BPF_LDX | BPF_IMM, 0xfbabcbda),
  1609. BPF_STMT(BPF_STX, 5),
  1610. BPF_STMT(BPF_LDX | BPF_IMM, 0xaedecbdb),
  1611. BPF_STMT(BPF_STX, 6),
  1612. BPF_STMT(BPF_LDX | BPF_IMM, 0xadebbade),
  1613. BPF_STMT(BPF_STX, 7),
  1614. BPF_STMT(BPF_LDX | BPF_IMM, 0xfcfcfaec),
  1615. BPF_STMT(BPF_STX, 8),
  1616. BPF_STMT(BPF_LDX | BPF_IMM, 0xbcdddbdc),
  1617. BPF_STMT(BPF_STX, 9),
  1618. BPF_STMT(BPF_LDX | BPF_IMM, 0xfeefdfac),
  1619. BPF_STMT(BPF_STX, 10),
  1620. BPF_STMT(BPF_LDX | BPF_IMM, 0xcddcdeea),
  1621. BPF_STMT(BPF_STX, 11),
  1622. BPF_STMT(BPF_LDX | BPF_IMM, 0xaccfaebb),
  1623. BPF_STMT(BPF_STX, 12),
  1624. BPF_STMT(BPF_LDX | BPF_IMM, 0xbdcccdcf),
  1625. BPF_STMT(BPF_STX, 13),
  1626. BPF_STMT(BPF_LDX | BPF_IMM, 0xaaedecde),
  1627. BPF_STMT(BPF_STX, 14),
  1628. BPF_STMT(BPF_LDX | BPF_IMM, 0xfaeacdad),
  1629. BPF_STMT(BPF_STX, 15),
  1630. BPF_STMT(BPF_LDX | BPF_MEM, 0),
  1631. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  1632. BPF_STMT(BPF_LDX | BPF_MEM, 1),
  1633. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  1634. BPF_STMT(BPF_LDX | BPF_MEM, 2),
  1635. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  1636. BPF_STMT(BPF_LDX | BPF_MEM, 3),
  1637. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  1638. BPF_STMT(BPF_LDX | BPF_MEM, 4),
  1639. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  1640. BPF_STMT(BPF_LDX | BPF_MEM, 5),
  1641. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  1642. BPF_STMT(BPF_LDX | BPF_MEM, 6),
  1643. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  1644. BPF_STMT(BPF_LDX | BPF_MEM, 7),
  1645. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  1646. BPF_STMT(BPF_LDX | BPF_MEM, 8),
  1647. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  1648. BPF_STMT(BPF_LDX | BPF_MEM, 9),
  1649. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  1650. BPF_STMT(BPF_LDX | BPF_MEM, 10),
  1651. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  1652. BPF_STMT(BPF_LDX | BPF_MEM, 11),
  1653. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  1654. BPF_STMT(BPF_LDX | BPF_MEM, 12),
  1655. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  1656. BPF_STMT(BPF_LDX | BPF_MEM, 13),
  1657. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  1658. BPF_STMT(BPF_LDX | BPF_MEM, 14),
  1659. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  1660. BPF_STMT(BPF_LDX | BPF_MEM, 15),
  1661. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  1662. BPF_STMT(BPF_RET | BPF_A, 0),
  1663. },
  1664. CLASSIC | FLAG_NO_DATA,
  1665. { },
  1666. { { 0, 0x2a5a5e5 } },
  1667. },
  1668. {
  1669. "check: SKF_AD_MAX",
  1670. .u.insns = {
  1671. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  1672. SKF_AD_OFF + SKF_AD_MAX),
  1673. BPF_STMT(BPF_RET | BPF_A, 0),
  1674. },
  1675. CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
  1676. { },
  1677. { },
  1678. },
  1679. { /* Passes checker but fails during runtime. */
  1680. "LD [SKF_AD_OFF-1]",
  1681. .u.insns = {
  1682. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  1683. SKF_AD_OFF - 1),
  1684. BPF_STMT(BPF_RET | BPF_K, 1),
  1685. },
  1686. CLASSIC,
  1687. { },
  1688. { { 1, 0 } },
  1689. },
  1690. };
  1691. static struct net_device dev;
  1692. static struct sk_buff *populate_skb(char *buf, int size)
  1693. {
  1694. struct sk_buff *skb;
  1695. if (size >= MAX_DATA)
  1696. return NULL;
  1697. skb = alloc_skb(MAX_DATA, GFP_KERNEL);
  1698. if (!skb)
  1699. return NULL;
  1700. memcpy(__skb_put(skb, size), buf, size);
  1701. /* Initialize a fake skb with test pattern. */
  1702. skb_reset_mac_header(skb);
  1703. skb->protocol = htons(ETH_P_IP);
  1704. skb->pkt_type = SKB_TYPE;
  1705. skb->mark = SKB_MARK;
  1706. skb->hash = SKB_HASH;
  1707. skb->queue_mapping = SKB_QUEUE_MAP;
  1708. skb->vlan_tci = SKB_VLAN_TCI;
  1709. skb->dev = &dev;
  1710. skb->dev->ifindex = SKB_DEV_IFINDEX;
  1711. skb->dev->type = SKB_DEV_TYPE;
  1712. skb_set_network_header(skb, min(size, ETH_HLEN));
  1713. return skb;
  1714. }
  1715. static void *generate_test_data(struct bpf_test *test, int sub)
  1716. {
  1717. if (test->aux & FLAG_NO_DATA)
  1718. return NULL;
  1719. /* Test case expects an skb, so populate one. Various
  1720. * subtests generate skbs of different sizes based on
  1721. * the same data.
  1722. */
  1723. return populate_skb(test->data, test->test[sub].data_size);
  1724. }
  1725. static void release_test_data(const struct bpf_test *test, void *data)
  1726. {
  1727. if (test->aux & FLAG_NO_DATA)
  1728. return;
  1729. kfree_skb(data);
  1730. }
  1731. static int probe_filter_length(struct sock_filter *fp)
  1732. {
  1733. int len = 0;
  1734. for (len = MAX_INSNS - 1; len > 0; --len)
  1735. if (fp[len].code != 0 || fp[len].k != 0)
  1736. break;
  1737. return len + 1;
  1738. }
  1739. static struct sk_filter *generate_filter(int which, int *err)
  1740. {
  1741. struct sk_filter *fp;
  1742. struct sock_fprog_kern fprog;
  1743. unsigned int flen = probe_filter_length(tests[which].u.insns);
  1744. __u8 test_type = tests[which].aux & TEST_TYPE_MASK;
  1745. switch (test_type) {
  1746. case CLASSIC:
  1747. fprog.filter = tests[which].u.insns;
  1748. fprog.len = flen;
  1749. *err = sk_unattached_filter_create(&fp, &fprog);
  1750. if (tests[which].aux & FLAG_EXPECTED_FAIL) {
  1751. if (*err == -EINVAL) {
  1752. pr_cont("PASS\n");
  1753. /* Verifier rejected filter as expected. */
  1754. *err = 0;
  1755. return NULL;
  1756. } else {
  1757. pr_cont("UNEXPECTED_PASS\n");
  1758. /* Verifier didn't reject the test that's
  1759. * bad enough, just return!
  1760. */
  1761. *err = -EINVAL;
  1762. return NULL;
  1763. }
  1764. }
  1765. /* We don't expect to fail. */
  1766. if (*err) {
  1767. pr_cont("FAIL to attach err=%d len=%d\n",
  1768. *err, fprog.len);
  1769. return NULL;
  1770. }
  1771. break;
  1772. case INTERNAL:
  1773. fp = kzalloc(sk_filter_size(flen), GFP_KERNEL);
  1774. if (fp == NULL) {
  1775. pr_cont("UNEXPECTED_FAIL no memory left\n");
  1776. *err = -ENOMEM;
  1777. return NULL;
  1778. }
  1779. fp->len = flen;
  1780. memcpy(fp->insnsi, tests[which].u.insns_int,
  1781. fp->len * sizeof(struct sock_filter_int));
  1782. sk_filter_select_runtime(fp);
  1783. break;
  1784. }
  1785. *err = 0;
  1786. return fp;
  1787. }
  1788. static void release_filter(struct sk_filter *fp, int which)
  1789. {
  1790. __u8 test_type = tests[which].aux & TEST_TYPE_MASK;
  1791. switch (test_type) {
  1792. case CLASSIC:
  1793. sk_unattached_filter_destroy(fp);
  1794. break;
  1795. case INTERNAL:
  1796. sk_filter_free(fp);
  1797. break;
  1798. }
  1799. }
  1800. static int __run_one(const struct sk_filter *fp, const void *data,
  1801. int runs, u64 *duration)
  1802. {
  1803. u64 start, finish;
  1804. int ret, i;
  1805. start = ktime_to_us(ktime_get());
  1806. for (i = 0; i < runs; i++)
  1807. ret = SK_RUN_FILTER(fp, data);
  1808. finish = ktime_to_us(ktime_get());
  1809. *duration = (finish - start) * 1000ULL;
  1810. do_div(*duration, runs);
  1811. return ret;
  1812. }
  1813. static int run_one(const struct sk_filter *fp, struct bpf_test *test)
  1814. {
  1815. int err_cnt = 0, i, runs = MAX_TESTRUNS;
  1816. for (i = 0; i < MAX_SUBTESTS; i++) {
  1817. void *data;
  1818. u64 duration;
  1819. u32 ret;
  1820. if (test->test[i].data_size == 0 &&
  1821. test->test[i].result == 0)
  1822. break;
  1823. data = generate_test_data(test, i);
  1824. ret = __run_one(fp, data, runs, &duration);
  1825. release_test_data(test, data);
  1826. if (ret == test->test[i].result) {
  1827. pr_cont("%lld ", duration);
  1828. } else {
  1829. pr_cont("ret %d != %d ", ret,
  1830. test->test[i].result);
  1831. err_cnt++;
  1832. }
  1833. }
  1834. return err_cnt;
  1835. }
  1836. static __init int test_bpf(void)
  1837. {
  1838. int i, err_cnt = 0, pass_cnt = 0;
  1839. for (i = 0; i < ARRAY_SIZE(tests); i++) {
  1840. struct sk_filter *fp;
  1841. int err;
  1842. pr_info("#%d %s ", i, tests[i].descr);
  1843. fp = generate_filter(i, &err);
  1844. if (fp == NULL) {
  1845. if (err == 0) {
  1846. pass_cnt++;
  1847. continue;
  1848. }
  1849. return err;
  1850. }
  1851. err = run_one(fp, &tests[i]);
  1852. release_filter(fp, i);
  1853. if (err) {
  1854. pr_cont("FAIL (%d times)\n", err);
  1855. err_cnt++;
  1856. } else {
  1857. pr_cont("PASS\n");
  1858. pass_cnt++;
  1859. }
  1860. }
  1861. pr_info("Summary: %d PASSED, %d FAILED\n", pass_cnt, err_cnt);
  1862. return err_cnt ? -EINVAL : 0;
  1863. }
  1864. static int __init test_bpf_init(void)
  1865. {
  1866. return test_bpf();
  1867. }
  1868. static void __exit test_bpf_exit(void)
  1869. {
  1870. }
  1871. module_init(test_bpf_init);
  1872. module_exit(test_bpf_exit);
  1873. MODULE_LICENSE("GPL");