test_bpf.c 44 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624
  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_IND",
  152. .u.insns = {
  153. BPF_STMT(BPF_LDX | BPF_LEN, 0),
  154. BPF_STMT(BPF_LD | BPF_H | BPF_IND, MAX_K),
  155. BPF_STMT(BPF_RET | BPF_K, 1)
  156. },
  157. CLASSIC,
  158. { },
  159. { { 1, 0 }, { 10, 0 }, { 60, 0 } },
  160. },
  161. {
  162. "LD_ABS",
  163. .u.insns = {
  164. BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 1000),
  165. BPF_STMT(BPF_RET | BPF_K, 1)
  166. },
  167. CLASSIC,
  168. { },
  169. { { 1, 0 }, { 10, 0 }, { 60, 0 } },
  170. },
  171. {
  172. "LD_ABS_LL",
  173. .u.insns = {
  174. BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_LL_OFF),
  175. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  176. BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_LL_OFF + 1),
  177. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  178. BPF_STMT(BPF_RET | BPF_A, 0)
  179. },
  180. CLASSIC,
  181. { 1, 2, 3 },
  182. { { 1, 0 }, { 2, 3 } },
  183. },
  184. {
  185. "LD_IND_LL",
  186. .u.insns = {
  187. BPF_STMT(BPF_LD | BPF_IMM, SKF_LL_OFF - 1),
  188. BPF_STMT(BPF_LDX | BPF_LEN, 0),
  189. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  190. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  191. BPF_STMT(BPF_LD | BPF_B | BPF_IND, 0),
  192. BPF_STMT(BPF_RET | BPF_A, 0)
  193. },
  194. CLASSIC,
  195. { 1, 2, 3, 0xff },
  196. { { 1, 1 }, { 3, 3 }, { 4, 0xff } },
  197. },
  198. {
  199. "LD_ABS_NET",
  200. .u.insns = {
  201. BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_NET_OFF),
  202. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  203. BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_NET_OFF + 1),
  204. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  205. BPF_STMT(BPF_RET | BPF_A, 0)
  206. },
  207. CLASSIC,
  208. { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3 },
  209. { { 15, 0 }, { 16, 3 } },
  210. },
  211. {
  212. "LD_IND_NET",
  213. .u.insns = {
  214. BPF_STMT(BPF_LD | BPF_IMM, SKF_NET_OFF - 15),
  215. BPF_STMT(BPF_LDX | BPF_LEN, 0),
  216. BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
  217. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  218. BPF_STMT(BPF_LD | BPF_B | BPF_IND, 0),
  219. BPF_STMT(BPF_RET | BPF_A, 0)
  220. },
  221. CLASSIC,
  222. { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3 },
  223. { { 14, 0 }, { 15, 1 }, { 17, 3 } },
  224. },
  225. {
  226. "LD_PKTTYPE",
  227. .u.insns = {
  228. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  229. SKF_AD_OFF + SKF_AD_PKTTYPE),
  230. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
  231. BPF_STMT(BPF_RET | BPF_K, 1),
  232. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  233. SKF_AD_OFF + SKF_AD_PKTTYPE),
  234. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
  235. BPF_STMT(BPF_RET | BPF_K, 1),
  236. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  237. SKF_AD_OFF + SKF_AD_PKTTYPE),
  238. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
  239. BPF_STMT(BPF_RET | BPF_K, 1),
  240. BPF_STMT(BPF_RET | BPF_A, 0)
  241. },
  242. CLASSIC,
  243. { },
  244. { { 1, 3 }, { 10, 3 } },
  245. },
  246. {
  247. "LD_MARK",
  248. .u.insns = {
  249. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  250. SKF_AD_OFF + SKF_AD_MARK),
  251. BPF_STMT(BPF_RET | BPF_A, 0)
  252. },
  253. CLASSIC,
  254. { },
  255. { { 1, SKB_MARK}, { 10, SKB_MARK} },
  256. },
  257. {
  258. "LD_RXHASH",
  259. .u.insns = {
  260. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  261. SKF_AD_OFF + SKF_AD_RXHASH),
  262. BPF_STMT(BPF_RET | BPF_A, 0)
  263. },
  264. CLASSIC,
  265. { },
  266. { { 1, SKB_HASH}, { 10, SKB_HASH} },
  267. },
  268. {
  269. "LD_QUEUE",
  270. .u.insns = {
  271. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  272. SKF_AD_OFF + SKF_AD_QUEUE),
  273. BPF_STMT(BPF_RET | BPF_A, 0)
  274. },
  275. CLASSIC,
  276. { },
  277. { { 1, SKB_QUEUE_MAP }, { 10, SKB_QUEUE_MAP } },
  278. },
  279. {
  280. "LD_PROTOCOL",
  281. .u.insns = {
  282. BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 1),
  283. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 20, 1, 0),
  284. BPF_STMT(BPF_RET | BPF_K, 0),
  285. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  286. SKF_AD_OFF + SKF_AD_PROTOCOL),
  287. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  288. BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
  289. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 30, 1, 0),
  290. BPF_STMT(BPF_RET | BPF_K, 0),
  291. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  292. BPF_STMT(BPF_RET | BPF_A, 0)
  293. },
  294. CLASSIC,
  295. { 10, 20, 30 },
  296. { { 10, ETH_P_IP }, { 100, ETH_P_IP } },
  297. },
  298. {
  299. "LD_VLAN_TAG",
  300. .u.insns = {
  301. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  302. SKF_AD_OFF + SKF_AD_VLAN_TAG),
  303. BPF_STMT(BPF_RET | BPF_A, 0)
  304. },
  305. CLASSIC,
  306. { },
  307. {
  308. { 1, SKB_VLAN_TCI & ~VLAN_TAG_PRESENT },
  309. { 10, SKB_VLAN_TCI & ~VLAN_TAG_PRESENT }
  310. },
  311. },
  312. {
  313. "LD_VLAN_TAG_PRESENT",
  314. .u.insns = {
  315. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  316. SKF_AD_OFF + SKF_AD_VLAN_TAG_PRESENT),
  317. BPF_STMT(BPF_RET | BPF_A, 0)
  318. },
  319. CLASSIC,
  320. { },
  321. {
  322. { 1, !!(SKB_VLAN_TCI & VLAN_TAG_PRESENT) },
  323. { 10, !!(SKB_VLAN_TCI & VLAN_TAG_PRESENT) }
  324. },
  325. },
  326. {
  327. "LD_IFINDEX",
  328. .u.insns = {
  329. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  330. SKF_AD_OFF + SKF_AD_IFINDEX),
  331. BPF_STMT(BPF_RET | BPF_A, 0)
  332. },
  333. CLASSIC,
  334. { },
  335. { { 1, SKB_DEV_IFINDEX }, { 10, SKB_DEV_IFINDEX } },
  336. },
  337. {
  338. "LD_HATYPE",
  339. .u.insns = {
  340. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  341. SKF_AD_OFF + SKF_AD_HATYPE),
  342. BPF_STMT(BPF_RET | BPF_A, 0)
  343. },
  344. CLASSIC,
  345. { },
  346. { { 1, SKB_DEV_TYPE }, { 10, SKB_DEV_TYPE } },
  347. },
  348. {
  349. "LD_CPU",
  350. .u.insns = {
  351. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  352. SKF_AD_OFF + SKF_AD_CPU),
  353. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  354. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  355. SKF_AD_OFF + SKF_AD_CPU),
  356. BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
  357. BPF_STMT(BPF_RET | BPF_A, 0)
  358. },
  359. CLASSIC,
  360. { },
  361. { { 1, 0 }, { 10, 0 } },
  362. },
  363. {
  364. "LD_NLATTR",
  365. .u.insns = {
  366. BPF_STMT(BPF_LDX | BPF_IMM, 1),
  367. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  368. BPF_STMT(BPF_LDX | BPF_IMM, 3),
  369. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  370. SKF_AD_OFF + SKF_AD_NLATTR),
  371. BPF_STMT(BPF_RET | BPF_A, 0)
  372. },
  373. CLASSIC,
  374. { 0xff, 4, 0, 2, 0, 4, 0, 3, 0 },
  375. { { 4, 0 }, { 20, 5 } },
  376. },
  377. {
  378. "LD_NLATTR_NEST",
  379. .u.insns = {
  380. BPF_STMT(BPF_LD | BPF_IMM, 1),
  381. BPF_STMT(BPF_LDX | BPF_IMM, 3),
  382. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  383. SKF_AD_OFF + SKF_AD_NLATTR_NEST),
  384. BPF_STMT(BPF_LD | BPF_IMM, 1),
  385. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  386. SKF_AD_OFF + SKF_AD_NLATTR_NEST),
  387. BPF_STMT(BPF_LD | BPF_IMM, 1),
  388. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  389. SKF_AD_OFF + SKF_AD_NLATTR_NEST),
  390. BPF_STMT(BPF_LD | BPF_IMM, 1),
  391. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  392. SKF_AD_OFF + SKF_AD_NLATTR_NEST),
  393. BPF_STMT(BPF_LD | BPF_IMM, 1),
  394. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  395. SKF_AD_OFF + SKF_AD_NLATTR_NEST),
  396. BPF_STMT(BPF_LD | BPF_IMM, 1),
  397. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  398. SKF_AD_OFF + SKF_AD_NLATTR_NEST),
  399. BPF_STMT(BPF_LD | BPF_IMM, 1),
  400. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  401. SKF_AD_OFF + SKF_AD_NLATTR_NEST),
  402. BPF_STMT(BPF_LD | BPF_IMM, 1),
  403. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  404. SKF_AD_OFF + SKF_AD_NLATTR_NEST),
  405. BPF_STMT(BPF_RET | BPF_A, 0)
  406. },
  407. CLASSIC,
  408. { 0xff, 12, 0, 1, 0, 4, 0, 2, 0, 4, 0, 3, 0 },
  409. { { 4, 0 }, { 20, 9 } },
  410. },
  411. {
  412. "LD_PAYLOAD_OFF",
  413. .u.insns = {
  414. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  415. SKF_AD_OFF + SKF_AD_PAY_OFFSET),
  416. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  417. SKF_AD_OFF + SKF_AD_PAY_OFFSET),
  418. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  419. SKF_AD_OFF + SKF_AD_PAY_OFFSET),
  420. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  421. SKF_AD_OFF + SKF_AD_PAY_OFFSET),
  422. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  423. SKF_AD_OFF + SKF_AD_PAY_OFFSET),
  424. BPF_STMT(BPF_RET | BPF_A, 0)
  425. },
  426. CLASSIC,
  427. /* 00:00:00:00:00:00 > 00:00:00:00:00:00, ethtype IPv4 (0x0800),
  428. * length 98: 127.0.0.1 > 127.0.0.1: ICMP echo request,
  429. * id 9737, seq 1, length 64
  430. */
  431. { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  432. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  433. 0x08, 0x00,
  434. 0x45, 0x00, 0x00, 0x54, 0xac, 0x8b, 0x40, 0x00, 0x40,
  435. 0x01, 0x90, 0x1b, 0x7f, 0x00, 0x00, 0x01 },
  436. { { 30, 0 }, { 100, 42 } },
  437. },
  438. {
  439. "LD_ANC_XOR",
  440. .u.insns = {
  441. BPF_STMT(BPF_LD | BPF_IMM, 10),
  442. BPF_STMT(BPF_LDX | BPF_IMM, 300),
  443. BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
  444. SKF_AD_OFF + SKF_AD_ALU_XOR_X),
  445. BPF_STMT(BPF_RET | BPF_A, 0)
  446. },
  447. CLASSIC,
  448. { },
  449. { { 4, 10 ^ 300 }, { 20, 10 ^ 300 } },
  450. },
  451. {
  452. "SPILL_FILL",
  453. .u.insns = {
  454. BPF_STMT(BPF_LDX | BPF_LEN, 0),
  455. BPF_STMT(BPF_LD | BPF_IMM, 2),
  456. BPF_STMT(BPF_ALU | BPF_RSH, 1),
  457. BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
  458. BPF_STMT(BPF_ST, 1), /* M1 = 1 ^ len */
  459. BPF_STMT(BPF_ALU | BPF_XOR | BPF_K, 0x80000000),
  460. BPF_STMT(BPF_ST, 2), /* M2 = 1 ^ len ^ 0x80000000 */
  461. BPF_STMT(BPF_STX, 15), /* M3 = len */
  462. BPF_STMT(BPF_LDX | BPF_MEM, 1),
  463. BPF_STMT(BPF_LD | BPF_MEM, 2),
  464. BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
  465. BPF_STMT(BPF_LDX | BPF_MEM, 15),
  466. BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
  467. BPF_STMT(BPF_RET | BPF_A, 0)
  468. },
  469. CLASSIC,
  470. { },
  471. { { 1, 0x80000001 }, { 2, 0x80000002 }, { 60, 0x80000000 ^ 60 } }
  472. },
  473. {
  474. "JEQ",
  475. .u.insns = {
  476. BPF_STMT(BPF_LDX | BPF_LEN, 0),
  477. BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
  478. BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0, 0, 1),
  479. BPF_STMT(BPF_RET | BPF_K, 1),
  480. BPF_STMT(BPF_RET | BPF_K, MAX_K)
  481. },
  482. CLASSIC,
  483. { 3, 3, 3, 3, 3 },
  484. { { 1, 0 }, { 3, 1 }, { 4, MAX_K } },
  485. },
  486. {
  487. "JGT",
  488. .u.insns = {
  489. BPF_STMT(BPF_LDX | BPF_LEN, 0),
  490. BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
  491. BPF_JUMP(BPF_JMP | BPF_JGT | BPF_X, 0, 0, 1),
  492. BPF_STMT(BPF_RET | BPF_K, 1),
  493. BPF_STMT(BPF_RET | BPF_K, MAX_K)
  494. },
  495. CLASSIC,
  496. { 4, 4, 4, 3, 3 },
  497. { { 2, 0 }, { 3, 1 }, { 4, MAX_K } },
  498. },
  499. {
  500. "JGE",
  501. .u.insns = {
  502. BPF_STMT(BPF_LDX | BPF_LEN, 0),
  503. BPF_STMT(BPF_LD | BPF_B | BPF_IND, MAX_K),
  504. BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 1, 1, 0),
  505. BPF_STMT(BPF_RET | BPF_K, 10),
  506. BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 2, 1, 0),
  507. BPF_STMT(BPF_RET | BPF_K, 20),
  508. BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 3, 1, 0),
  509. BPF_STMT(BPF_RET | BPF_K, 30),
  510. BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 4, 1, 0),
  511. BPF_STMT(BPF_RET | BPF_K, 40),
  512. BPF_STMT(BPF_RET | BPF_K, MAX_K)
  513. },
  514. CLASSIC,
  515. { 1, 2, 3, 4, 5 },
  516. { { 1, 20 }, { 3, 40 }, { 5, MAX_K } },
  517. },
  518. {
  519. "JSET",
  520. .u.insns = {
  521. BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
  522. BPF_JUMP(BPF_JMP | BPF_JA, 1, 1, 1),
  523. BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
  524. BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
  525. BPF_STMT(BPF_LDX | BPF_LEN, 0),
  526. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  527. BPF_STMT(BPF_ALU | BPF_SUB | BPF_K, 4),
  528. BPF_STMT(BPF_MISC | BPF_TAX, 0),
  529. BPF_STMT(BPF_LD | BPF_W | BPF_IND, 0),
  530. BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 1, 0, 1),
  531. BPF_STMT(BPF_RET | BPF_K, 10),
  532. BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x80000000, 0, 1),
  533. BPF_STMT(BPF_RET | BPF_K, 20),
  534. BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
  535. BPF_STMT(BPF_RET | BPF_K, 30),
  536. BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
  537. BPF_STMT(BPF_RET | BPF_K, 30),
  538. BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
  539. BPF_STMT(BPF_RET | BPF_K, 30),
  540. BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
  541. BPF_STMT(BPF_RET | BPF_K, 30),
  542. BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
  543. BPF_STMT(BPF_RET | BPF_K, 30),
  544. BPF_STMT(BPF_RET | BPF_K, MAX_K)
  545. },
  546. CLASSIC,
  547. { 0, 0xAA, 0x55, 1 },
  548. { { 4, 10 }, { 5, 20 }, { 6, MAX_K } },
  549. },
  550. {
  551. "tcpdump port 22",
  552. .u.insns = {
  553. { 0x28, 0, 0, 0x0000000c },
  554. { 0x15, 0, 8, 0x000086dd },
  555. { 0x30, 0, 0, 0x00000014 },
  556. { 0x15, 2, 0, 0x00000084 },
  557. { 0x15, 1, 0, 0x00000006 },
  558. { 0x15, 0, 17, 0x00000011 },
  559. { 0x28, 0, 0, 0x00000036 },
  560. { 0x15, 14, 0, 0x00000016 },
  561. { 0x28, 0, 0, 0x00000038 },
  562. { 0x15, 12, 13, 0x00000016 },
  563. { 0x15, 0, 12, 0x00000800 },
  564. { 0x30, 0, 0, 0x00000017 },
  565. { 0x15, 2, 0, 0x00000084 },
  566. { 0x15, 1, 0, 0x00000006 },
  567. { 0x15, 0, 8, 0x00000011 },
  568. { 0x28, 0, 0, 0x00000014 },
  569. { 0x45, 6, 0, 0x00001fff },
  570. { 0xb1, 0, 0, 0x0000000e },
  571. { 0x48, 0, 0, 0x0000000e },
  572. { 0x15, 2, 0, 0x00000016 },
  573. { 0x48, 0, 0, 0x00000010 },
  574. { 0x15, 0, 1, 0x00000016 },
  575. { 0x06, 0, 0, 0x0000ffff },
  576. { 0x06, 0, 0, 0x00000000 },
  577. },
  578. CLASSIC,
  579. /* 3c:07:54:43:e5:76 > 10:bf:48:d6:43:d6, ethertype IPv4(0x0800)
  580. * length 114: 10.1.1.149.49700 > 10.1.2.10.22: Flags [P.],
  581. * seq 1305692979:1305693027, ack 3650467037, win 65535,
  582. * options [nop,nop,TS val 2502645400 ecr 3971138], length 48
  583. */
  584. { 0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6,
  585. 0x3c, 0x07, 0x54, 0x43, 0xe5, 0x76,
  586. 0x08, 0x00,
  587. 0x45, 0x10, 0x00, 0x64, 0x75, 0xb5,
  588. 0x40, 0x00, 0x40, 0x06, 0xad, 0x2e, /* IP header */
  589. 0x0a, 0x01, 0x01, 0x95, /* ip src */
  590. 0x0a, 0x01, 0x02, 0x0a, /* ip dst */
  591. 0xc2, 0x24,
  592. 0x00, 0x16 /* dst port */ },
  593. { { 10, 0 }, { 30, 0 }, { 100, 65535 } },
  594. },
  595. {
  596. "tcpdump complex",
  597. .u.insns = {
  598. /* tcpdump -nei eth0 'tcp port 22 and (((ip[2:2] -
  599. * ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0) and
  600. * (len > 115 or len < 30000000000)' -d
  601. */
  602. { 0x28, 0, 0, 0x0000000c },
  603. { 0x15, 30, 0, 0x000086dd },
  604. { 0x15, 0, 29, 0x00000800 },
  605. { 0x30, 0, 0, 0x00000017 },
  606. { 0x15, 0, 27, 0x00000006 },
  607. { 0x28, 0, 0, 0x00000014 },
  608. { 0x45, 25, 0, 0x00001fff },
  609. { 0xb1, 0, 0, 0x0000000e },
  610. { 0x48, 0, 0, 0x0000000e },
  611. { 0x15, 2, 0, 0x00000016 },
  612. { 0x48, 0, 0, 0x00000010 },
  613. { 0x15, 0, 20, 0x00000016 },
  614. { 0x28, 0, 0, 0x00000010 },
  615. { 0x02, 0, 0, 0x00000001 },
  616. { 0x30, 0, 0, 0x0000000e },
  617. { 0x54, 0, 0, 0x0000000f },
  618. { 0x64, 0, 0, 0x00000002 },
  619. { 0x07, 0, 0, 0x00000005 },
  620. { 0x60, 0, 0, 0x00000001 },
  621. { 0x1c, 0, 0, 0x00000000 },
  622. { 0x02, 0, 0, 0x00000005 },
  623. { 0xb1, 0, 0, 0x0000000e },
  624. { 0x50, 0, 0, 0x0000001a },
  625. { 0x54, 0, 0, 0x000000f0 },
  626. { 0x74, 0, 0, 0x00000002 },
  627. { 0x07, 0, 0, 0x00000009 },
  628. { 0x60, 0, 0, 0x00000005 },
  629. { 0x1d, 4, 0, 0x00000000 },
  630. { 0x80, 0, 0, 0x00000000 },
  631. { 0x25, 1, 0, 0x00000073 },
  632. { 0x35, 1, 0, 0xfc23ac00 },
  633. { 0x06, 0, 0, 0x0000ffff },
  634. { 0x06, 0, 0, 0x00000000 },
  635. },
  636. CLASSIC,
  637. { 0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6,
  638. 0x3c, 0x07, 0x54, 0x43, 0xe5, 0x76,
  639. 0x08, 0x00,
  640. 0x45, 0x10, 0x00, 0x64, 0x75, 0xb5,
  641. 0x40, 0x00, 0x40, 0x06, 0xad, 0x2e, /* IP header */
  642. 0x0a, 0x01, 0x01, 0x95, /* ip src */
  643. 0x0a, 0x01, 0x02, 0x0a, /* ip dst */
  644. 0xc2, 0x24,
  645. 0x00, 0x16 /* dst port */ },
  646. { { 10, 0 }, { 30, 0 }, { 100, 65535 } },
  647. },
  648. {
  649. "RET_A",
  650. .u.insns = {
  651. /* check that unitialized X and A contain zeros */
  652. BPF_STMT(BPF_MISC | BPF_TXA, 0),
  653. BPF_STMT(BPF_RET | BPF_A, 0)
  654. },
  655. CLASSIC,
  656. { },
  657. { {1, 0}, {2, 0} },
  658. },
  659. {
  660. "INT: ADD trivial",
  661. .u.insns_int = {
  662. BPF_ALU64_IMM(BPF_MOV, R1, 1),
  663. BPF_ALU64_IMM(BPF_ADD, R1, 2),
  664. BPF_ALU64_IMM(BPF_MOV, R2, 3),
  665. BPF_ALU64_REG(BPF_SUB, R1, R2),
  666. BPF_ALU64_IMM(BPF_ADD, R1, -1),
  667. BPF_ALU64_IMM(BPF_MUL, R1, 3),
  668. BPF_ALU64_REG(BPF_MOV, R0, R1),
  669. BPF_EXIT_INSN(),
  670. },
  671. INTERNAL,
  672. { },
  673. { { 0, 0xfffffffd } }
  674. },
  675. {
  676. "INT: MUL_X",
  677. .u.insns_int = {
  678. BPF_ALU64_IMM(BPF_MOV, R0, -1),
  679. BPF_ALU64_IMM(BPF_MOV, R1, -1),
  680. BPF_ALU64_IMM(BPF_MOV, R2, 3),
  681. BPF_ALU64_REG(BPF_MUL, R1, R2),
  682. BPF_JMP_IMM(BPF_JEQ, R1, 0xfffffffd, 1),
  683. BPF_EXIT_INSN(),
  684. BPF_ALU64_IMM(BPF_MOV, R0, 1),
  685. BPF_EXIT_INSN(),
  686. },
  687. INTERNAL,
  688. { },
  689. { { 0, 1 } }
  690. },
  691. {
  692. "INT: MUL_X2",
  693. .u.insns_int = {
  694. BPF_ALU32_IMM(BPF_MOV, R0, -1),
  695. BPF_ALU32_IMM(BPF_MOV, R1, -1),
  696. BPF_ALU32_IMM(BPF_MOV, R2, 3),
  697. BPF_ALU64_REG(BPF_MUL, R1, R2),
  698. BPF_ALU64_IMM(BPF_RSH, R1, 8),
  699. BPF_JMP_IMM(BPF_JEQ, R1, 0x2ffffff, 1),
  700. BPF_EXIT_INSN(),
  701. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  702. BPF_EXIT_INSN(),
  703. },
  704. INTERNAL,
  705. { },
  706. { { 0, 1 } }
  707. },
  708. {
  709. "INT: MUL32_X",
  710. .u.insns_int = {
  711. BPF_ALU32_IMM(BPF_MOV, R0, -1),
  712. BPF_ALU64_IMM(BPF_MOV, R1, -1),
  713. BPF_ALU32_IMM(BPF_MOV, R2, 3),
  714. BPF_ALU32_REG(BPF_MUL, R1, R2),
  715. BPF_ALU64_IMM(BPF_RSH, R1, 8),
  716. BPF_JMP_IMM(BPF_JEQ, R1, 0xffffff, 1),
  717. BPF_EXIT_INSN(),
  718. BPF_ALU32_IMM(BPF_MOV, R0, 1),
  719. BPF_EXIT_INSN(),
  720. },
  721. INTERNAL,
  722. { },
  723. { { 0, 1 } }
  724. },
  725. {
  726. /* Have to test all register combinations, since
  727. * JITing of different registers will produce
  728. * different asm code.
  729. */
  730. "INT: ADD 64-bit",
  731. .u.insns_int = {
  732. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  733. BPF_ALU64_IMM(BPF_MOV, R1, 1),
  734. BPF_ALU64_IMM(BPF_MOV, R2, 2),
  735. BPF_ALU64_IMM(BPF_MOV, R3, 3),
  736. BPF_ALU64_IMM(BPF_MOV, R4, 4),
  737. BPF_ALU64_IMM(BPF_MOV, R5, 5),
  738. BPF_ALU64_IMM(BPF_MOV, R6, 6),
  739. BPF_ALU64_IMM(BPF_MOV, R7, 7),
  740. BPF_ALU64_IMM(BPF_MOV, R8, 8),
  741. BPF_ALU64_IMM(BPF_MOV, R9, 9),
  742. BPF_ALU64_IMM(BPF_ADD, R0, 20),
  743. BPF_ALU64_IMM(BPF_ADD, R1, 20),
  744. BPF_ALU64_IMM(BPF_ADD, R2, 20),
  745. BPF_ALU64_IMM(BPF_ADD, R3, 20),
  746. BPF_ALU64_IMM(BPF_ADD, R4, 20),
  747. BPF_ALU64_IMM(BPF_ADD, R5, 20),
  748. BPF_ALU64_IMM(BPF_ADD, R6, 20),
  749. BPF_ALU64_IMM(BPF_ADD, R7, 20),
  750. BPF_ALU64_IMM(BPF_ADD, R8, 20),
  751. BPF_ALU64_IMM(BPF_ADD, R9, 20),
  752. BPF_ALU64_IMM(BPF_SUB, R0, 10),
  753. BPF_ALU64_IMM(BPF_SUB, R1, 10),
  754. BPF_ALU64_IMM(BPF_SUB, R2, 10),
  755. BPF_ALU64_IMM(BPF_SUB, R3, 10),
  756. BPF_ALU64_IMM(BPF_SUB, R4, 10),
  757. BPF_ALU64_IMM(BPF_SUB, R5, 10),
  758. BPF_ALU64_IMM(BPF_SUB, R6, 10),
  759. BPF_ALU64_IMM(BPF_SUB, R7, 10),
  760. BPF_ALU64_IMM(BPF_SUB, R8, 10),
  761. BPF_ALU64_IMM(BPF_SUB, R9, 10),
  762. BPF_ALU64_REG(BPF_ADD, R0, R0),
  763. BPF_ALU64_REG(BPF_ADD, R0, R1),
  764. BPF_ALU64_REG(BPF_ADD, R0, R2),
  765. BPF_ALU64_REG(BPF_ADD, R0, R3),
  766. BPF_ALU64_REG(BPF_ADD, R0, R4),
  767. BPF_ALU64_REG(BPF_ADD, R0, R5),
  768. BPF_ALU64_REG(BPF_ADD, R0, R6),
  769. BPF_ALU64_REG(BPF_ADD, R0, R7),
  770. BPF_ALU64_REG(BPF_ADD, R0, R8),
  771. BPF_ALU64_REG(BPF_ADD, R0, R9), /* R0 == 155 */
  772. BPF_JMP_IMM(BPF_JEQ, R0, 155, 1),
  773. BPF_EXIT_INSN(),
  774. BPF_ALU64_REG(BPF_ADD, R1, R0),
  775. BPF_ALU64_REG(BPF_ADD, R1, R1),
  776. BPF_ALU64_REG(BPF_ADD, R1, R2),
  777. BPF_ALU64_REG(BPF_ADD, R1, R3),
  778. BPF_ALU64_REG(BPF_ADD, R1, R4),
  779. BPF_ALU64_REG(BPF_ADD, R1, R5),
  780. BPF_ALU64_REG(BPF_ADD, R1, R6),
  781. BPF_ALU64_REG(BPF_ADD, R1, R7),
  782. BPF_ALU64_REG(BPF_ADD, R1, R8),
  783. BPF_ALU64_REG(BPF_ADD, R1, R9), /* R1 == 456 */
  784. BPF_JMP_IMM(BPF_JEQ, R1, 456, 1),
  785. BPF_EXIT_INSN(),
  786. BPF_ALU64_REG(BPF_ADD, R2, R0),
  787. BPF_ALU64_REG(BPF_ADD, R2, R1),
  788. BPF_ALU64_REG(BPF_ADD, R2, R2),
  789. BPF_ALU64_REG(BPF_ADD, R2, R3),
  790. BPF_ALU64_REG(BPF_ADD, R2, R4),
  791. BPF_ALU64_REG(BPF_ADD, R2, R5),
  792. BPF_ALU64_REG(BPF_ADD, R2, R6),
  793. BPF_ALU64_REG(BPF_ADD, R2, R7),
  794. BPF_ALU64_REG(BPF_ADD, R2, R8),
  795. BPF_ALU64_REG(BPF_ADD, R2, R9), /* R2 == 1358 */
  796. BPF_JMP_IMM(BPF_JEQ, R2, 1358, 1),
  797. BPF_EXIT_INSN(),
  798. BPF_ALU64_REG(BPF_ADD, R3, R0),
  799. BPF_ALU64_REG(BPF_ADD, R3, R1),
  800. BPF_ALU64_REG(BPF_ADD, R3, R2),
  801. BPF_ALU64_REG(BPF_ADD, R3, R3),
  802. BPF_ALU64_REG(BPF_ADD, R3, R4),
  803. BPF_ALU64_REG(BPF_ADD, R3, R5),
  804. BPF_ALU64_REG(BPF_ADD, R3, R6),
  805. BPF_ALU64_REG(BPF_ADD, R3, R7),
  806. BPF_ALU64_REG(BPF_ADD, R3, R8),
  807. BPF_ALU64_REG(BPF_ADD, R3, R9), /* R3 == 4063 */
  808. BPF_JMP_IMM(BPF_JEQ, R3, 4063, 1),
  809. BPF_EXIT_INSN(),
  810. BPF_ALU64_REG(BPF_ADD, R4, R0),
  811. BPF_ALU64_REG(BPF_ADD, R4, R1),
  812. BPF_ALU64_REG(BPF_ADD, R4, R2),
  813. BPF_ALU64_REG(BPF_ADD, R4, R3),
  814. BPF_ALU64_REG(BPF_ADD, R4, R4),
  815. BPF_ALU64_REG(BPF_ADD, R4, R5),
  816. BPF_ALU64_REG(BPF_ADD, R4, R6),
  817. BPF_ALU64_REG(BPF_ADD, R4, R7),
  818. BPF_ALU64_REG(BPF_ADD, R4, R8),
  819. BPF_ALU64_REG(BPF_ADD, R4, R9), /* R4 == 12177 */
  820. BPF_JMP_IMM(BPF_JEQ, R4, 12177, 1),
  821. BPF_EXIT_INSN(),
  822. BPF_ALU64_REG(BPF_ADD, R5, R0),
  823. BPF_ALU64_REG(BPF_ADD, R5, R1),
  824. BPF_ALU64_REG(BPF_ADD, R5, R2),
  825. BPF_ALU64_REG(BPF_ADD, R5, R3),
  826. BPF_ALU64_REG(BPF_ADD, R5, R4),
  827. BPF_ALU64_REG(BPF_ADD, R5, R5),
  828. BPF_ALU64_REG(BPF_ADD, R5, R6),
  829. BPF_ALU64_REG(BPF_ADD, R5, R7),
  830. BPF_ALU64_REG(BPF_ADD, R5, R8),
  831. BPF_ALU64_REG(BPF_ADD, R5, R9), /* R5 == 36518 */
  832. BPF_JMP_IMM(BPF_JEQ, R5, 36518, 1),
  833. BPF_EXIT_INSN(),
  834. BPF_ALU64_REG(BPF_ADD, R6, R0),
  835. BPF_ALU64_REG(BPF_ADD, R6, R1),
  836. BPF_ALU64_REG(BPF_ADD, R6, R2),
  837. BPF_ALU64_REG(BPF_ADD, R6, R3),
  838. BPF_ALU64_REG(BPF_ADD, R6, R4),
  839. BPF_ALU64_REG(BPF_ADD, R6, R5),
  840. BPF_ALU64_REG(BPF_ADD, R6, R6),
  841. BPF_ALU64_REG(BPF_ADD, R6, R7),
  842. BPF_ALU64_REG(BPF_ADD, R6, R8),
  843. BPF_ALU64_REG(BPF_ADD, R6, R9), /* R6 == 109540 */
  844. BPF_JMP_IMM(BPF_JEQ, R6, 109540, 1),
  845. BPF_EXIT_INSN(),
  846. BPF_ALU64_REG(BPF_ADD, R7, R0),
  847. BPF_ALU64_REG(BPF_ADD, R7, R1),
  848. BPF_ALU64_REG(BPF_ADD, R7, R2),
  849. BPF_ALU64_REG(BPF_ADD, R7, R3),
  850. BPF_ALU64_REG(BPF_ADD, R7, R4),
  851. BPF_ALU64_REG(BPF_ADD, R7, R5),
  852. BPF_ALU64_REG(BPF_ADD, R7, R6),
  853. BPF_ALU64_REG(BPF_ADD, R7, R7),
  854. BPF_ALU64_REG(BPF_ADD, R7, R8),
  855. BPF_ALU64_REG(BPF_ADD, R7, R9), /* R7 == 328605 */
  856. BPF_JMP_IMM(BPF_JEQ, R7, 328605, 1),
  857. BPF_EXIT_INSN(),
  858. BPF_ALU64_REG(BPF_ADD, R8, R0),
  859. BPF_ALU64_REG(BPF_ADD, R8, R1),
  860. BPF_ALU64_REG(BPF_ADD, R8, R2),
  861. BPF_ALU64_REG(BPF_ADD, R8, R3),
  862. BPF_ALU64_REG(BPF_ADD, R8, R4),
  863. BPF_ALU64_REG(BPF_ADD, R8, R5),
  864. BPF_ALU64_REG(BPF_ADD, R8, R6),
  865. BPF_ALU64_REG(BPF_ADD, R8, R7),
  866. BPF_ALU64_REG(BPF_ADD, R8, R8),
  867. BPF_ALU64_REG(BPF_ADD, R8, R9), /* R8 == 985799 */
  868. BPF_JMP_IMM(BPF_JEQ, R8, 985799, 1),
  869. BPF_EXIT_INSN(),
  870. BPF_ALU64_REG(BPF_ADD, R9, R0),
  871. BPF_ALU64_REG(BPF_ADD, R9, R1),
  872. BPF_ALU64_REG(BPF_ADD, R9, R2),
  873. BPF_ALU64_REG(BPF_ADD, R9, R3),
  874. BPF_ALU64_REG(BPF_ADD, R9, R4),
  875. BPF_ALU64_REG(BPF_ADD, R9, R5),
  876. BPF_ALU64_REG(BPF_ADD, R9, R6),
  877. BPF_ALU64_REG(BPF_ADD, R9, R7),
  878. BPF_ALU64_REG(BPF_ADD, R9, R8),
  879. BPF_ALU64_REG(BPF_ADD, R9, R9), /* R9 == 2957380 */
  880. BPF_ALU64_REG(BPF_MOV, R0, R9),
  881. BPF_EXIT_INSN(),
  882. },
  883. INTERNAL,
  884. { },
  885. { { 0, 2957380 } }
  886. },
  887. {
  888. "INT: ADD 32-bit",
  889. .u.insns_int = {
  890. BPF_ALU32_IMM(BPF_MOV, R0, 20),
  891. BPF_ALU32_IMM(BPF_MOV, R1, 1),
  892. BPF_ALU32_IMM(BPF_MOV, R2, 2),
  893. BPF_ALU32_IMM(BPF_MOV, R3, 3),
  894. BPF_ALU32_IMM(BPF_MOV, R4, 4),
  895. BPF_ALU32_IMM(BPF_MOV, R5, 5),
  896. BPF_ALU32_IMM(BPF_MOV, R6, 6),
  897. BPF_ALU32_IMM(BPF_MOV, R7, 7),
  898. BPF_ALU32_IMM(BPF_MOV, R8, 8),
  899. BPF_ALU32_IMM(BPF_MOV, R9, 9),
  900. BPF_ALU64_IMM(BPF_ADD, R1, 10),
  901. BPF_ALU64_IMM(BPF_ADD, R2, 10),
  902. BPF_ALU64_IMM(BPF_ADD, R3, 10),
  903. BPF_ALU64_IMM(BPF_ADD, R4, 10),
  904. BPF_ALU64_IMM(BPF_ADD, R5, 10),
  905. BPF_ALU64_IMM(BPF_ADD, R6, 10),
  906. BPF_ALU64_IMM(BPF_ADD, R7, 10),
  907. BPF_ALU64_IMM(BPF_ADD, R8, 10),
  908. BPF_ALU64_IMM(BPF_ADD, R9, 10),
  909. BPF_ALU32_REG(BPF_ADD, R0, R1),
  910. BPF_ALU32_REG(BPF_ADD, R0, R2),
  911. BPF_ALU32_REG(BPF_ADD, R0, R3),
  912. BPF_ALU32_REG(BPF_ADD, R0, R4),
  913. BPF_ALU32_REG(BPF_ADD, R0, R5),
  914. BPF_ALU32_REG(BPF_ADD, R0, R6),
  915. BPF_ALU32_REG(BPF_ADD, R0, R7),
  916. BPF_ALU32_REG(BPF_ADD, R0, R8),
  917. BPF_ALU32_REG(BPF_ADD, R0, R9), /* R0 == 155 */
  918. BPF_JMP_IMM(BPF_JEQ, R0, 155, 1),
  919. BPF_EXIT_INSN(),
  920. BPF_ALU32_REG(BPF_ADD, R1, R0),
  921. BPF_ALU32_REG(BPF_ADD, R1, R1),
  922. BPF_ALU32_REG(BPF_ADD, R1, R2),
  923. BPF_ALU32_REG(BPF_ADD, R1, R3),
  924. BPF_ALU32_REG(BPF_ADD, R1, R4),
  925. BPF_ALU32_REG(BPF_ADD, R1, R5),
  926. BPF_ALU32_REG(BPF_ADD, R1, R6),
  927. BPF_ALU32_REG(BPF_ADD, R1, R7),
  928. BPF_ALU32_REG(BPF_ADD, R1, R8),
  929. BPF_ALU32_REG(BPF_ADD, R1, R9), /* R1 == 456 */
  930. BPF_JMP_IMM(BPF_JEQ, R1, 456, 1),
  931. BPF_EXIT_INSN(),
  932. BPF_ALU32_REG(BPF_ADD, R2, R0),
  933. BPF_ALU32_REG(BPF_ADD, R2, R1),
  934. BPF_ALU32_REG(BPF_ADD, R2, R2),
  935. BPF_ALU32_REG(BPF_ADD, R2, R3),
  936. BPF_ALU32_REG(BPF_ADD, R2, R4),
  937. BPF_ALU32_REG(BPF_ADD, R2, R5),
  938. BPF_ALU32_REG(BPF_ADD, R2, R6),
  939. BPF_ALU32_REG(BPF_ADD, R2, R7),
  940. BPF_ALU32_REG(BPF_ADD, R2, R8),
  941. BPF_ALU32_REG(BPF_ADD, R2, R9), /* R2 == 1358 */
  942. BPF_JMP_IMM(BPF_JEQ, R2, 1358, 1),
  943. BPF_EXIT_INSN(),
  944. BPF_ALU32_REG(BPF_ADD, R3, R0),
  945. BPF_ALU32_REG(BPF_ADD, R3, R1),
  946. BPF_ALU32_REG(BPF_ADD, R3, R2),
  947. BPF_ALU32_REG(BPF_ADD, R3, R3),
  948. BPF_ALU32_REG(BPF_ADD, R3, R4),
  949. BPF_ALU32_REG(BPF_ADD, R3, R5),
  950. BPF_ALU32_REG(BPF_ADD, R3, R6),
  951. BPF_ALU32_REG(BPF_ADD, R3, R7),
  952. BPF_ALU32_REG(BPF_ADD, R3, R8),
  953. BPF_ALU32_REG(BPF_ADD, R3, R9), /* R3 == 4063 */
  954. BPF_JMP_IMM(BPF_JEQ, R3, 4063, 1),
  955. BPF_EXIT_INSN(),
  956. BPF_ALU32_REG(BPF_ADD, R4, R0),
  957. BPF_ALU32_REG(BPF_ADD, R4, R1),
  958. BPF_ALU32_REG(BPF_ADD, R4, R2),
  959. BPF_ALU32_REG(BPF_ADD, R4, R3),
  960. BPF_ALU32_REG(BPF_ADD, R4, R4),
  961. BPF_ALU32_REG(BPF_ADD, R4, R5),
  962. BPF_ALU32_REG(BPF_ADD, R4, R6),
  963. BPF_ALU32_REG(BPF_ADD, R4, R7),
  964. BPF_ALU32_REG(BPF_ADD, R4, R8),
  965. BPF_ALU32_REG(BPF_ADD, R4, R9), /* R4 == 12177 */
  966. BPF_JMP_IMM(BPF_JEQ, R4, 12177, 1),
  967. BPF_EXIT_INSN(),
  968. BPF_ALU32_REG(BPF_ADD, R5, R0),
  969. BPF_ALU32_REG(BPF_ADD, R5, R1),
  970. BPF_ALU32_REG(BPF_ADD, R5, R2),
  971. BPF_ALU32_REG(BPF_ADD, R5, R3),
  972. BPF_ALU32_REG(BPF_ADD, R5, R4),
  973. BPF_ALU32_REG(BPF_ADD, R5, R5),
  974. BPF_ALU32_REG(BPF_ADD, R5, R6),
  975. BPF_ALU32_REG(BPF_ADD, R5, R7),
  976. BPF_ALU32_REG(BPF_ADD, R5, R8),
  977. BPF_ALU32_REG(BPF_ADD, R5, R9), /* R5 == 36518 */
  978. BPF_JMP_IMM(BPF_JEQ, R5, 36518, 1),
  979. BPF_EXIT_INSN(),
  980. BPF_ALU32_REG(BPF_ADD, R6, R0),
  981. BPF_ALU32_REG(BPF_ADD, R6, R1),
  982. BPF_ALU32_REG(BPF_ADD, R6, R2),
  983. BPF_ALU32_REG(BPF_ADD, R6, R3),
  984. BPF_ALU32_REG(BPF_ADD, R6, R4),
  985. BPF_ALU32_REG(BPF_ADD, R6, R5),
  986. BPF_ALU32_REG(BPF_ADD, R6, R6),
  987. BPF_ALU32_REG(BPF_ADD, R6, R7),
  988. BPF_ALU32_REG(BPF_ADD, R6, R8),
  989. BPF_ALU32_REG(BPF_ADD, R6, R9), /* R6 == 109540 */
  990. BPF_JMP_IMM(BPF_JEQ, R6, 109540, 1),
  991. BPF_EXIT_INSN(),
  992. BPF_ALU32_REG(BPF_ADD, R7, R0),
  993. BPF_ALU32_REG(BPF_ADD, R7, R1),
  994. BPF_ALU32_REG(BPF_ADD, R7, R2),
  995. BPF_ALU32_REG(BPF_ADD, R7, R3),
  996. BPF_ALU32_REG(BPF_ADD, R7, R4),
  997. BPF_ALU32_REG(BPF_ADD, R7, R5),
  998. BPF_ALU32_REG(BPF_ADD, R7, R6),
  999. BPF_ALU32_REG(BPF_ADD, R7, R7),
  1000. BPF_ALU32_REG(BPF_ADD, R7, R8),
  1001. BPF_ALU32_REG(BPF_ADD, R7, R9), /* R7 == 328605 */
  1002. BPF_JMP_IMM(BPF_JEQ, R7, 328605, 1),
  1003. BPF_EXIT_INSN(),
  1004. BPF_ALU32_REG(BPF_ADD, R8, R0),
  1005. BPF_ALU32_REG(BPF_ADD, R8, R1),
  1006. BPF_ALU32_REG(BPF_ADD, R8, R2),
  1007. BPF_ALU32_REG(BPF_ADD, R8, R3),
  1008. BPF_ALU32_REG(BPF_ADD, R8, R4),
  1009. BPF_ALU32_REG(BPF_ADD, R8, R5),
  1010. BPF_ALU32_REG(BPF_ADD, R8, R6),
  1011. BPF_ALU32_REG(BPF_ADD, R8, R7),
  1012. BPF_ALU32_REG(BPF_ADD, R8, R8),
  1013. BPF_ALU32_REG(BPF_ADD, R8, R9), /* R8 == 985799 */
  1014. BPF_JMP_IMM(BPF_JEQ, R8, 985799, 1),
  1015. BPF_EXIT_INSN(),
  1016. BPF_ALU32_REG(BPF_ADD, R9, R0),
  1017. BPF_ALU32_REG(BPF_ADD, R9, R1),
  1018. BPF_ALU32_REG(BPF_ADD, R9, R2),
  1019. BPF_ALU32_REG(BPF_ADD, R9, R3),
  1020. BPF_ALU32_REG(BPF_ADD, R9, R4),
  1021. BPF_ALU32_REG(BPF_ADD, R9, R5),
  1022. BPF_ALU32_REG(BPF_ADD, R9, R6),
  1023. BPF_ALU32_REG(BPF_ADD, R9, R7),
  1024. BPF_ALU32_REG(BPF_ADD, R9, R8),
  1025. BPF_ALU32_REG(BPF_ADD, R9, R9), /* R9 == 2957380 */
  1026. BPF_ALU32_REG(BPF_MOV, R0, R9),
  1027. BPF_EXIT_INSN(),
  1028. },
  1029. INTERNAL,
  1030. { },
  1031. { { 0, 2957380 } }
  1032. },
  1033. { /* Mainly checking JIT here. */
  1034. "INT: SUB",
  1035. .u.insns_int = {
  1036. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  1037. BPF_ALU64_IMM(BPF_MOV, R1, 1),
  1038. BPF_ALU64_IMM(BPF_MOV, R2, 2),
  1039. BPF_ALU64_IMM(BPF_MOV, R3, 3),
  1040. BPF_ALU64_IMM(BPF_MOV, R4, 4),
  1041. BPF_ALU64_IMM(BPF_MOV, R5, 5),
  1042. BPF_ALU64_IMM(BPF_MOV, R6, 6),
  1043. BPF_ALU64_IMM(BPF_MOV, R7, 7),
  1044. BPF_ALU64_IMM(BPF_MOV, R8, 8),
  1045. BPF_ALU64_IMM(BPF_MOV, R9, 9),
  1046. BPF_ALU64_REG(BPF_SUB, R0, R0),
  1047. BPF_ALU64_REG(BPF_SUB, R0, R1),
  1048. BPF_ALU64_REG(BPF_SUB, R0, R2),
  1049. BPF_ALU64_REG(BPF_SUB, R0, R3),
  1050. BPF_ALU64_REG(BPF_SUB, R0, R4),
  1051. BPF_ALU64_REG(BPF_SUB, R0, R5),
  1052. BPF_ALU64_REG(BPF_SUB, R0, R6),
  1053. BPF_ALU64_REG(BPF_SUB, R0, R7),
  1054. BPF_ALU64_REG(BPF_SUB, R0, R8),
  1055. BPF_ALU64_REG(BPF_SUB, R0, R9),
  1056. BPF_ALU64_IMM(BPF_SUB, R0, 10),
  1057. BPF_JMP_IMM(BPF_JEQ, R0, -55, 1),
  1058. BPF_EXIT_INSN(),
  1059. BPF_ALU64_REG(BPF_SUB, R1, R0),
  1060. BPF_ALU64_REG(BPF_SUB, R1, R2),
  1061. BPF_ALU64_REG(BPF_SUB, R1, R3),
  1062. BPF_ALU64_REG(BPF_SUB, R1, R4),
  1063. BPF_ALU64_REG(BPF_SUB, R1, R5),
  1064. BPF_ALU64_REG(BPF_SUB, R1, R6),
  1065. BPF_ALU64_REG(BPF_SUB, R1, R7),
  1066. BPF_ALU64_REG(BPF_SUB, R1, R8),
  1067. BPF_ALU64_REG(BPF_SUB, R1, R9),
  1068. BPF_ALU64_IMM(BPF_SUB, R1, 10),
  1069. BPF_ALU64_REG(BPF_SUB, R2, R0),
  1070. BPF_ALU64_REG(BPF_SUB, R2, R1),
  1071. BPF_ALU64_REG(BPF_SUB, R2, R3),
  1072. BPF_ALU64_REG(BPF_SUB, R2, R4),
  1073. BPF_ALU64_REG(BPF_SUB, R2, R5),
  1074. BPF_ALU64_REG(BPF_SUB, R2, R6),
  1075. BPF_ALU64_REG(BPF_SUB, R2, R7),
  1076. BPF_ALU64_REG(BPF_SUB, R2, R8),
  1077. BPF_ALU64_REG(BPF_SUB, R2, R9),
  1078. BPF_ALU64_IMM(BPF_SUB, R2, 10),
  1079. BPF_ALU64_REG(BPF_SUB, R3, R0),
  1080. BPF_ALU64_REG(BPF_SUB, R3, R1),
  1081. BPF_ALU64_REG(BPF_SUB, R3, R2),
  1082. BPF_ALU64_REG(BPF_SUB, R3, R4),
  1083. BPF_ALU64_REG(BPF_SUB, R3, R5),
  1084. BPF_ALU64_REG(BPF_SUB, R3, R6),
  1085. BPF_ALU64_REG(BPF_SUB, R3, R7),
  1086. BPF_ALU64_REG(BPF_SUB, R3, R8),
  1087. BPF_ALU64_REG(BPF_SUB, R3, R9),
  1088. BPF_ALU64_IMM(BPF_SUB, R3, 10),
  1089. BPF_ALU64_REG(BPF_SUB, R4, R0),
  1090. BPF_ALU64_REG(BPF_SUB, R4, R1),
  1091. BPF_ALU64_REG(BPF_SUB, R4, R2),
  1092. BPF_ALU64_REG(BPF_SUB, R4, R3),
  1093. BPF_ALU64_REG(BPF_SUB, R4, R5),
  1094. BPF_ALU64_REG(BPF_SUB, R4, R6),
  1095. BPF_ALU64_REG(BPF_SUB, R4, R7),
  1096. BPF_ALU64_REG(BPF_SUB, R4, R8),
  1097. BPF_ALU64_REG(BPF_SUB, R4, R9),
  1098. BPF_ALU64_IMM(BPF_SUB, R4, 10),
  1099. BPF_ALU64_REG(BPF_SUB, R5, R0),
  1100. BPF_ALU64_REG(BPF_SUB, R5, R1),
  1101. BPF_ALU64_REG(BPF_SUB, R5, R2),
  1102. BPF_ALU64_REG(BPF_SUB, R5, R3),
  1103. BPF_ALU64_REG(BPF_SUB, R5, R4),
  1104. BPF_ALU64_REG(BPF_SUB, R5, R6),
  1105. BPF_ALU64_REG(BPF_SUB, R5, R7),
  1106. BPF_ALU64_REG(BPF_SUB, R5, R8),
  1107. BPF_ALU64_REG(BPF_SUB, R5, R9),
  1108. BPF_ALU64_IMM(BPF_SUB, R5, 10),
  1109. BPF_ALU64_REG(BPF_SUB, R6, R0),
  1110. BPF_ALU64_REG(BPF_SUB, R6, R1),
  1111. BPF_ALU64_REG(BPF_SUB, R6, R2),
  1112. BPF_ALU64_REG(BPF_SUB, R6, R3),
  1113. BPF_ALU64_REG(BPF_SUB, R6, R4),
  1114. BPF_ALU64_REG(BPF_SUB, R6, R5),
  1115. BPF_ALU64_REG(BPF_SUB, R6, R7),
  1116. BPF_ALU64_REG(BPF_SUB, R6, R8),
  1117. BPF_ALU64_REG(BPF_SUB, R6, R9),
  1118. BPF_ALU64_IMM(BPF_SUB, R6, 10),
  1119. BPF_ALU64_REG(BPF_SUB, R7, R0),
  1120. BPF_ALU64_REG(BPF_SUB, R7, R1),
  1121. BPF_ALU64_REG(BPF_SUB, R7, R2),
  1122. BPF_ALU64_REG(BPF_SUB, R7, R3),
  1123. BPF_ALU64_REG(BPF_SUB, R7, R4),
  1124. BPF_ALU64_REG(BPF_SUB, R7, R5),
  1125. BPF_ALU64_REG(BPF_SUB, R7, R6),
  1126. BPF_ALU64_REG(BPF_SUB, R7, R8),
  1127. BPF_ALU64_REG(BPF_SUB, R7, R9),
  1128. BPF_ALU64_IMM(BPF_SUB, R7, 10),
  1129. BPF_ALU64_REG(BPF_SUB, R8, R0),
  1130. BPF_ALU64_REG(BPF_SUB, R8, R1),
  1131. BPF_ALU64_REG(BPF_SUB, R8, R2),
  1132. BPF_ALU64_REG(BPF_SUB, R8, R3),
  1133. BPF_ALU64_REG(BPF_SUB, R8, R4),
  1134. BPF_ALU64_REG(BPF_SUB, R8, R5),
  1135. BPF_ALU64_REG(BPF_SUB, R8, R6),
  1136. BPF_ALU64_REG(BPF_SUB, R8, R7),
  1137. BPF_ALU64_REG(BPF_SUB, R8, R9),
  1138. BPF_ALU64_IMM(BPF_SUB, R8, 10),
  1139. BPF_ALU64_REG(BPF_SUB, R9, R0),
  1140. BPF_ALU64_REG(BPF_SUB, R9, R1),
  1141. BPF_ALU64_REG(BPF_SUB, R9, R2),
  1142. BPF_ALU64_REG(BPF_SUB, R9, R3),
  1143. BPF_ALU64_REG(BPF_SUB, R9, R4),
  1144. BPF_ALU64_REG(BPF_SUB, R9, R5),
  1145. BPF_ALU64_REG(BPF_SUB, R9, R6),
  1146. BPF_ALU64_REG(BPF_SUB, R9, R7),
  1147. BPF_ALU64_REG(BPF_SUB, R9, R8),
  1148. BPF_ALU64_IMM(BPF_SUB, R9, 10),
  1149. BPF_ALU64_IMM(BPF_SUB, R0, 10),
  1150. BPF_ALU64_IMM(BPF_NEG, R0, 0),
  1151. BPF_ALU64_REG(BPF_SUB, R0, R1),
  1152. BPF_ALU64_REG(BPF_SUB, R0, R2),
  1153. BPF_ALU64_REG(BPF_SUB, R0, R3),
  1154. BPF_ALU64_REG(BPF_SUB, R0, R4),
  1155. BPF_ALU64_REG(BPF_SUB, R0, R5),
  1156. BPF_ALU64_REG(BPF_SUB, R0, R6),
  1157. BPF_ALU64_REG(BPF_SUB, R0, R7),
  1158. BPF_ALU64_REG(BPF_SUB, R0, R8),
  1159. BPF_ALU64_REG(BPF_SUB, R0, R9),
  1160. BPF_EXIT_INSN(),
  1161. },
  1162. INTERNAL,
  1163. { },
  1164. { { 0, 11 } }
  1165. },
  1166. { /* Mainly checking JIT here. */
  1167. "INT: XOR",
  1168. .u.insns_int = {
  1169. BPF_ALU64_REG(BPF_SUB, R0, R0),
  1170. BPF_ALU64_REG(BPF_XOR, R1, R1),
  1171. BPF_JMP_REG(BPF_JEQ, R0, R1, 1),
  1172. BPF_EXIT_INSN(),
  1173. BPF_ALU64_IMM(BPF_MOV, R0, 10),
  1174. BPF_ALU64_IMM(BPF_MOV, R1, -1),
  1175. BPF_ALU64_REG(BPF_SUB, R1, R1),
  1176. BPF_ALU64_REG(BPF_XOR, R2, R2),
  1177. BPF_JMP_REG(BPF_JEQ, R1, R2, 1),
  1178. BPF_EXIT_INSN(),
  1179. BPF_ALU64_REG(BPF_SUB, R2, R2),
  1180. BPF_ALU64_REG(BPF_XOR, R3, R3),
  1181. BPF_ALU64_IMM(BPF_MOV, R0, 10),
  1182. BPF_ALU64_IMM(BPF_MOV, R1, -1),
  1183. BPF_JMP_REG(BPF_JEQ, R2, R3, 1),
  1184. BPF_EXIT_INSN(),
  1185. BPF_ALU64_REG(BPF_SUB, R3, R3),
  1186. BPF_ALU64_REG(BPF_XOR, R4, R4),
  1187. BPF_ALU64_IMM(BPF_MOV, R2, 1),
  1188. BPF_ALU64_IMM(BPF_MOV, R5, -1),
  1189. BPF_JMP_REG(BPF_JEQ, R3, R4, 1),
  1190. BPF_EXIT_INSN(),
  1191. BPF_ALU64_REG(BPF_SUB, R4, R4),
  1192. BPF_ALU64_REG(BPF_XOR, R5, R5),
  1193. BPF_ALU64_IMM(BPF_MOV, R3, 1),
  1194. BPF_ALU64_IMM(BPF_MOV, R7, -1),
  1195. BPF_JMP_REG(BPF_JEQ, R5, R4, 1),
  1196. BPF_EXIT_INSN(),
  1197. BPF_ALU64_IMM(BPF_MOV, R5, 1),
  1198. BPF_ALU64_REG(BPF_SUB, R5, R5),
  1199. BPF_ALU64_REG(BPF_XOR, R6, R6),
  1200. BPF_ALU64_IMM(BPF_MOV, R1, 1),
  1201. BPF_ALU64_IMM(BPF_MOV, R8, -1),
  1202. BPF_JMP_REG(BPF_JEQ, R5, R6, 1),
  1203. BPF_EXIT_INSN(),
  1204. BPF_ALU64_REG(BPF_SUB, R6, R6),
  1205. BPF_ALU64_REG(BPF_XOR, R7, R7),
  1206. BPF_JMP_REG(BPF_JEQ, R7, R6, 1),
  1207. BPF_EXIT_INSN(),
  1208. BPF_ALU64_REG(BPF_SUB, R7, R7),
  1209. BPF_ALU64_REG(BPF_XOR, R8, R8),
  1210. BPF_JMP_REG(BPF_JEQ, R7, R8, 1),
  1211. BPF_EXIT_INSN(),
  1212. BPF_ALU64_REG(BPF_SUB, R8, R8),
  1213. BPF_ALU64_REG(BPF_XOR, R9, R9),
  1214. BPF_JMP_REG(BPF_JEQ, R9, R8, 1),
  1215. BPF_EXIT_INSN(),
  1216. BPF_ALU64_REG(BPF_SUB, R9, R9),
  1217. BPF_ALU64_REG(BPF_XOR, R0, R0),
  1218. BPF_JMP_REG(BPF_JEQ, R9, R0, 1),
  1219. BPF_EXIT_INSN(),
  1220. BPF_ALU64_REG(BPF_SUB, R1, R1),
  1221. BPF_ALU64_REG(BPF_XOR, R0, R0),
  1222. BPF_JMP_REG(BPF_JEQ, R9, R0, 2),
  1223. BPF_ALU64_IMM(BPF_MOV, R0, 0),
  1224. BPF_EXIT_INSN(),
  1225. BPF_ALU64_IMM(BPF_MOV, R0, 1),
  1226. BPF_EXIT_INSN(),
  1227. },
  1228. INTERNAL,
  1229. { },
  1230. { { 0, 1 } }
  1231. },
  1232. { /* Mainly checking JIT here. */
  1233. "INT: MUL",
  1234. .u.insns_int = {
  1235. BPF_ALU64_IMM(BPF_MOV, R0, 11),
  1236. BPF_ALU64_IMM(BPF_MOV, R1, 1),
  1237. BPF_ALU64_IMM(BPF_MOV, R2, 2),
  1238. BPF_ALU64_IMM(BPF_MOV, R3, 3),
  1239. BPF_ALU64_IMM(BPF_MOV, R4, 4),
  1240. BPF_ALU64_IMM(BPF_MOV, R5, 5),
  1241. BPF_ALU64_IMM(BPF_MOV, R6, 6),
  1242. BPF_ALU64_IMM(BPF_MOV, R7, 7),
  1243. BPF_ALU64_IMM(BPF_MOV, R8, 8),
  1244. BPF_ALU64_IMM(BPF_MOV, R9, 9),
  1245. BPF_ALU64_REG(BPF_MUL, R0, R0),
  1246. BPF_ALU64_REG(BPF_MUL, R0, R1),
  1247. BPF_ALU64_REG(BPF_MUL, R0, R2),
  1248. BPF_ALU64_REG(BPF_MUL, R0, R3),
  1249. BPF_ALU64_REG(BPF_MUL, R0, R4),
  1250. BPF_ALU64_REG(BPF_MUL, R0, R5),
  1251. BPF_ALU64_REG(BPF_MUL, R0, R6),
  1252. BPF_ALU64_REG(BPF_MUL, R0, R7),
  1253. BPF_ALU64_REG(BPF_MUL, R0, R8),
  1254. BPF_ALU64_REG(BPF_MUL, R0, R9),
  1255. BPF_ALU64_IMM(BPF_MUL, R0, 10),
  1256. BPF_JMP_IMM(BPF_JEQ, R0, 439084800, 1),
  1257. BPF_EXIT_INSN(),
  1258. BPF_ALU64_REG(BPF_MUL, R1, R0),
  1259. BPF_ALU64_REG(BPF_MUL, R1, R2),
  1260. BPF_ALU64_REG(BPF_MUL, R1, R3),
  1261. BPF_ALU64_REG(BPF_MUL, R1, R4),
  1262. BPF_ALU64_REG(BPF_MUL, R1, R5),
  1263. BPF_ALU64_REG(BPF_MUL, R1, R6),
  1264. BPF_ALU64_REG(BPF_MUL, R1, R7),
  1265. BPF_ALU64_REG(BPF_MUL, R1, R8),
  1266. BPF_ALU64_REG(BPF_MUL, R1, R9),
  1267. BPF_ALU64_IMM(BPF_MUL, R1, 10),
  1268. BPF_ALU64_REG(BPF_MOV, R2, R1),
  1269. BPF_ALU64_IMM(BPF_RSH, R2, 32),
  1270. BPF_JMP_IMM(BPF_JEQ, R2, 0x5a924, 1),
  1271. BPF_EXIT_INSN(),
  1272. BPF_ALU64_IMM(BPF_LSH, R1, 32),
  1273. BPF_ALU64_IMM(BPF_ARSH, R1, 32),
  1274. BPF_JMP_IMM(BPF_JEQ, R1, 0xebb90000, 1),
  1275. BPF_EXIT_INSN(),
  1276. BPF_ALU64_REG(BPF_MUL, R2, R0),
  1277. BPF_ALU64_REG(BPF_MUL, R2, R1),
  1278. BPF_ALU64_REG(BPF_MUL, R2, R3),
  1279. BPF_ALU64_REG(BPF_MUL, R2, R4),
  1280. BPF_ALU64_REG(BPF_MUL, R2, R5),
  1281. BPF_ALU64_REG(BPF_MUL, R2, R6),
  1282. BPF_ALU64_REG(BPF_MUL, R2, R7),
  1283. BPF_ALU64_REG(BPF_MUL, R2, R8),
  1284. BPF_ALU64_REG(BPF_MUL, R2, R9),
  1285. BPF_ALU64_IMM(BPF_MUL, R2, 10),
  1286. BPF_ALU64_IMM(BPF_RSH, R2, 32),
  1287. BPF_ALU64_REG(BPF_MOV, R0, R2),
  1288. BPF_EXIT_INSN(),
  1289. },
  1290. INTERNAL,
  1291. { },
  1292. { { 0, 0x35d97ef2 } }
  1293. },
  1294. {
  1295. "INT: ALU MIX",
  1296. .u.insns_int = {
  1297. BPF_ALU64_IMM(BPF_MOV, R0, 11),
  1298. BPF_ALU64_IMM(BPF_ADD, R0, -1),
  1299. BPF_ALU64_IMM(BPF_MOV, R2, 2),
  1300. BPF_ALU64_IMM(BPF_XOR, R2, 3),
  1301. BPF_ALU64_REG(BPF_DIV, R0, R2),
  1302. BPF_JMP_IMM(BPF_JEQ, R0, 10, 1),
  1303. BPF_EXIT_INSN(),
  1304. BPF_ALU64_IMM(BPF_MOD, R0, 3),
  1305. BPF_JMP_IMM(BPF_JEQ, R0, 1, 1),
  1306. BPF_EXIT_INSN(),
  1307. BPF_ALU64_IMM(BPF_MOV, R0, -1),
  1308. BPF_EXIT_INSN(),
  1309. },
  1310. INTERNAL,
  1311. { },
  1312. { { 0, -1 } }
  1313. },
  1314. {
  1315. "INT: DIV + ABS",
  1316. .u.insns_int = {
  1317. BPF_ALU64_REG(BPF_MOV, R6, R1),
  1318. BPF_LD_ABS(BPF_B, 3),
  1319. BPF_ALU64_IMM(BPF_MOV, R2, 2),
  1320. BPF_ALU32_REG(BPF_DIV, R0, R2),
  1321. BPF_ALU64_REG(BPF_MOV, R8, R0),
  1322. BPF_LD_ABS(BPF_B, 4),
  1323. BPF_ALU64_REG(BPF_ADD, R8, R0),
  1324. BPF_LD_IND(BPF_B, R8, -70),
  1325. BPF_EXIT_INSN(),
  1326. },
  1327. INTERNAL,
  1328. { 10, 20, 30, 40, 50 },
  1329. { { 4, 0 }, { 5, 10 } }
  1330. },
  1331. {
  1332. "INT: DIV by zero",
  1333. .u.insns_int = {
  1334. BPF_ALU64_REG(BPF_MOV, R6, R1),
  1335. BPF_ALU64_IMM(BPF_MOV, R7, 0),
  1336. BPF_LD_ABS(BPF_B, 3),
  1337. BPF_ALU32_REG(BPF_DIV, R0, R7),
  1338. BPF_EXIT_INSN(),
  1339. },
  1340. INTERNAL,
  1341. { 10, 20, 30, 40, 50 },
  1342. { { 3, 0 }, { 4, 0 } }
  1343. },
  1344. {
  1345. "check: missing ret",
  1346. .u.insns = {
  1347. BPF_STMT(BPF_LD | BPF_IMM, 1),
  1348. },
  1349. CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
  1350. { },
  1351. { }
  1352. },
  1353. {
  1354. "check: div_k_0",
  1355. .u.insns = {
  1356. BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 0),
  1357. BPF_STMT(BPF_RET | BPF_K, 0)
  1358. },
  1359. CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
  1360. { },
  1361. { }
  1362. },
  1363. {
  1364. "check: unknown insn",
  1365. .u.insns = {
  1366. /* seccomp insn, rejected in socket filter */
  1367. BPF_STMT(BPF_LDX | BPF_W | BPF_ABS, 0),
  1368. BPF_STMT(BPF_RET | BPF_K, 0)
  1369. },
  1370. CLASSIC | FLAG_EXPECTED_FAIL,
  1371. { },
  1372. { }
  1373. },
  1374. {
  1375. "check: out of range spill/fill",
  1376. .u.insns = {
  1377. BPF_STMT(BPF_STX, 16),
  1378. BPF_STMT(BPF_RET | BPF_K, 0)
  1379. },
  1380. CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
  1381. { },
  1382. { }
  1383. },
  1384. };
  1385. static struct net_device dev;
  1386. static struct sk_buff *populate_skb(char *buf, int size)
  1387. {
  1388. struct sk_buff *skb;
  1389. if (size >= MAX_DATA)
  1390. return NULL;
  1391. skb = alloc_skb(MAX_DATA, GFP_KERNEL);
  1392. if (!skb)
  1393. return NULL;
  1394. memcpy(__skb_put(skb, size), buf, size);
  1395. /* Initialize a fake skb with test pattern. */
  1396. skb_reset_mac_header(skb);
  1397. skb->protocol = htons(ETH_P_IP);
  1398. skb->pkt_type = SKB_TYPE;
  1399. skb->mark = SKB_MARK;
  1400. skb->hash = SKB_HASH;
  1401. skb->queue_mapping = SKB_QUEUE_MAP;
  1402. skb->vlan_tci = SKB_VLAN_TCI;
  1403. skb->dev = &dev;
  1404. skb->dev->ifindex = SKB_DEV_IFINDEX;
  1405. skb->dev->type = SKB_DEV_TYPE;
  1406. skb_set_network_header(skb, min(size, ETH_HLEN));
  1407. return skb;
  1408. }
  1409. static void *generate_test_data(struct bpf_test *test, int sub)
  1410. {
  1411. if (test->aux & FLAG_NO_DATA)
  1412. return NULL;
  1413. /* Test case expects an skb, so populate one. Various
  1414. * subtests generate skbs of different sizes based on
  1415. * the same data.
  1416. */
  1417. return populate_skb(test->data, test->test[sub].data_size);
  1418. }
  1419. static void release_test_data(const struct bpf_test *test, void *data)
  1420. {
  1421. if (test->aux & FLAG_NO_DATA)
  1422. return;
  1423. kfree_skb(data);
  1424. }
  1425. static int probe_filter_length(struct sock_filter *fp)
  1426. {
  1427. int len = 0;
  1428. while (fp->code != 0 || fp->k != 0) {
  1429. fp++;
  1430. len++;
  1431. }
  1432. return len;
  1433. }
  1434. static struct sk_filter *generate_filter(int which, int *err)
  1435. {
  1436. struct sk_filter *fp;
  1437. struct sock_fprog_kern fprog;
  1438. unsigned int flen = probe_filter_length(tests[which].u.insns);
  1439. __u8 test_type = tests[which].aux & TEST_TYPE_MASK;
  1440. switch (test_type) {
  1441. case CLASSIC:
  1442. fprog.filter = tests[which].u.insns;
  1443. fprog.len = flen;
  1444. *err = sk_unattached_filter_create(&fp, &fprog);
  1445. if (tests[which].aux & FLAG_EXPECTED_FAIL) {
  1446. if (*err == -EINVAL) {
  1447. pr_cont("PASS\n");
  1448. /* Verifier rejected filter as expected. */
  1449. *err = 0;
  1450. return NULL;
  1451. } else {
  1452. pr_cont("UNEXPECTED_PASS\n");
  1453. /* Verifier didn't reject the test that's
  1454. * bad enough, just return!
  1455. */
  1456. *err = -EINVAL;
  1457. return NULL;
  1458. }
  1459. }
  1460. /* We don't expect to fail. */
  1461. if (*err) {
  1462. pr_cont("FAIL to attach err=%d len=%d\n",
  1463. *err, fprog.len);
  1464. return NULL;
  1465. }
  1466. break;
  1467. case INTERNAL:
  1468. fp = kzalloc(sk_filter_size(flen), GFP_KERNEL);
  1469. if (fp == NULL) {
  1470. pr_cont("UNEXPECTED_FAIL no memory left\n");
  1471. *err = -ENOMEM;
  1472. return NULL;
  1473. }
  1474. fp->len = flen;
  1475. memcpy(fp->insnsi, tests[which].u.insns_int,
  1476. fp->len * sizeof(struct sock_filter_int));
  1477. sk_filter_select_runtime(fp);
  1478. break;
  1479. }
  1480. *err = 0;
  1481. return fp;
  1482. }
  1483. static void release_filter(struct sk_filter *fp, int which)
  1484. {
  1485. __u8 test_type = tests[which].aux & TEST_TYPE_MASK;
  1486. switch (test_type) {
  1487. case CLASSIC:
  1488. sk_unattached_filter_destroy(fp);
  1489. break;
  1490. case INTERNAL:
  1491. sk_filter_free(fp);
  1492. break;
  1493. }
  1494. }
  1495. static int __run_one(const struct sk_filter *fp, const void *data,
  1496. int runs, u64 *duration)
  1497. {
  1498. u64 start, finish;
  1499. int ret, i;
  1500. start = ktime_to_us(ktime_get());
  1501. for (i = 0; i < runs; i++)
  1502. ret = SK_RUN_FILTER(fp, data);
  1503. finish = ktime_to_us(ktime_get());
  1504. *duration = (finish - start) * 1000ULL;
  1505. do_div(*duration, runs);
  1506. return ret;
  1507. }
  1508. static int run_one(const struct sk_filter *fp, struct bpf_test *test)
  1509. {
  1510. int err_cnt = 0, i, runs = MAX_TESTRUNS;
  1511. for (i = 0; i < MAX_SUBTESTS; i++) {
  1512. void *data;
  1513. u64 duration;
  1514. u32 ret;
  1515. if (test->test[i].data_size == 0 &&
  1516. test->test[i].result == 0)
  1517. break;
  1518. data = generate_test_data(test, i);
  1519. ret = __run_one(fp, data, runs, &duration);
  1520. release_test_data(test, data);
  1521. if (ret == test->test[i].result) {
  1522. pr_cont("%lld ", duration);
  1523. } else {
  1524. pr_cont("ret %d != %d ", ret,
  1525. test->test[i].result);
  1526. err_cnt++;
  1527. }
  1528. }
  1529. return err_cnt;
  1530. }
  1531. static __init int test_bpf(void)
  1532. {
  1533. int i, err_cnt = 0, pass_cnt = 0;
  1534. for (i = 0; i < ARRAY_SIZE(tests); i++) {
  1535. struct sk_filter *fp;
  1536. int err;
  1537. pr_info("#%d %s ", i, tests[i].descr);
  1538. fp = generate_filter(i, &err);
  1539. if (fp == NULL) {
  1540. if (err == 0) {
  1541. pass_cnt++;
  1542. continue;
  1543. }
  1544. return err;
  1545. }
  1546. err = run_one(fp, &tests[i]);
  1547. release_filter(fp, i);
  1548. if (err) {
  1549. pr_cont("FAIL (%d times)\n", err);
  1550. err_cnt++;
  1551. } else {
  1552. pr_cont("PASS\n");
  1553. pass_cnt++;
  1554. }
  1555. }
  1556. pr_info("Summary: %d PASSED, %d FAILED\n", pass_cnt, err_cnt);
  1557. return err_cnt ? -EINVAL : 0;
  1558. }
  1559. static int __init test_bpf_init(void)
  1560. {
  1561. return test_bpf();
  1562. }
  1563. static void __exit test_bpf_exit(void)
  1564. {
  1565. }
  1566. module_init(test_bpf_init);
  1567. module_exit(test_bpf_exit);
  1568. MODULE_LICENSE("GPL");