jmp32.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887
  1. {
  2. "jset32: BPF_K",
  3. .insns = {
  4. BPF_DIRECT_PKT_R2,
  5. BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
  6. /* reg, high bits shouldn't be tested */
  7. BPF_JMP32_IMM(BPF_JSET, BPF_REG_7, -2, 1),
  8. BPF_JMP_IMM(BPF_JA, 0, 0, 1),
  9. BPF_EXIT_INSN(),
  10. BPF_JMP32_IMM(BPF_JSET, BPF_REG_7, 1, 1),
  11. BPF_EXIT_INSN(),
  12. BPF_MOV64_IMM(BPF_REG_0, 2),
  13. BPF_EXIT_INSN(),
  14. },
  15. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  16. .result = ACCEPT,
  17. .runs = 3,
  18. .retvals = {
  19. { .retval = 0,
  20. .data64 = { 1ULL << 63, }
  21. },
  22. { .retval = 2,
  23. .data64 = { 1, }
  24. },
  25. { .retval = 2,
  26. .data64 = { 1ULL << 63 | 1, }
  27. },
  28. },
  29. .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
  30. },
  31. {
  32. "jset32: BPF_X",
  33. .insns = {
  34. BPF_DIRECT_PKT_R2,
  35. BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
  36. BPF_LD_IMM64(BPF_REG_8, 0x8000000000000000),
  37. BPF_JMP32_REG(BPF_JSET, BPF_REG_7, BPF_REG_8, 1),
  38. BPF_JMP_IMM(BPF_JA, 0, 0, 1),
  39. BPF_EXIT_INSN(),
  40. BPF_LD_IMM64(BPF_REG_8, 0x8000000000000001),
  41. BPF_JMP32_REG(BPF_JSET, BPF_REG_7, BPF_REG_8, 1),
  42. BPF_EXIT_INSN(),
  43. BPF_MOV64_IMM(BPF_REG_0, 2),
  44. BPF_EXIT_INSN(),
  45. },
  46. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  47. .result = ACCEPT,
  48. .runs = 3,
  49. .retvals = {
  50. { .retval = 0,
  51. .data64 = { 1ULL << 63, }
  52. },
  53. { .retval = 2,
  54. .data64 = { 1, }
  55. },
  56. { .retval = 2,
  57. .data64 = { 1ULL << 63 | 1, }
  58. },
  59. },
  60. .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
  61. },
  62. {
  63. "jset32: ignores upper bits",
  64. .insns = {
  65. BPF_MOV64_IMM(BPF_REG_0, 0),
  66. BPF_LD_IMM64(BPF_REG_7, 0x8000000000000000),
  67. BPF_LD_IMM64(BPF_REG_8, 0x8000000000000000),
  68. BPF_JMP_REG(BPF_JSET, BPF_REG_7, BPF_REG_8, 1),
  69. BPF_EXIT_INSN(),
  70. BPF_JMP32_REG(BPF_JSET, BPF_REG_7, BPF_REG_8, 1),
  71. BPF_MOV64_IMM(BPF_REG_0, 2),
  72. BPF_EXIT_INSN(),
  73. },
  74. .result = ACCEPT,
  75. .retval = 2,
  76. },
  77. {
  78. "jset32: min/max deduction",
  79. .insns = {
  80. BPF_RAND_UEXT_R7,
  81. BPF_MOV64_IMM(BPF_REG_0, 0),
  82. BPF_JMP32_IMM(BPF_JSET, BPF_REG_7, 0x10, 1),
  83. BPF_EXIT_INSN(),
  84. BPF_JMP32_IMM(BPF_JGE, BPF_REG_7, 0x10, 1),
  85. BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
  86. BPF_EXIT_INSN(),
  87. },
  88. .errstr_unpriv = "R9 !read_ok",
  89. .result_unpriv = REJECT,
  90. .result = ACCEPT,
  91. },
  92. {
  93. "jeq32: BPF_K",
  94. .insns = {
  95. BPF_DIRECT_PKT_R2,
  96. BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
  97. BPF_JMP32_IMM(BPF_JEQ, BPF_REG_7, -1, 1),
  98. BPF_EXIT_INSN(),
  99. BPF_MOV64_IMM(BPF_REG_0, 2),
  100. BPF_EXIT_INSN(),
  101. },
  102. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  103. .result = ACCEPT,
  104. .runs = 2,
  105. .retvals = {
  106. { .retval = 0,
  107. .data64 = { -2, }
  108. },
  109. { .retval = 2,
  110. .data64 = { -1, }
  111. },
  112. },
  113. .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
  114. },
  115. {
  116. "jeq32: BPF_X",
  117. .insns = {
  118. BPF_DIRECT_PKT_R2,
  119. BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
  120. BPF_LD_IMM64(BPF_REG_8, 0x7000000000000001),
  121. BPF_JMP32_REG(BPF_JEQ, BPF_REG_7, BPF_REG_8, 1),
  122. BPF_EXIT_INSN(),
  123. BPF_MOV64_IMM(BPF_REG_0, 2),
  124. BPF_EXIT_INSN(),
  125. },
  126. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  127. .result = ACCEPT,
  128. .runs = 3,
  129. .retvals = {
  130. { .retval = 0,
  131. .data64 = { 2, }
  132. },
  133. { .retval = 2,
  134. .data64 = { 1, }
  135. },
  136. { .retval = 2,
  137. .data64 = { 1ULL << 63 | 1, }
  138. },
  139. },
  140. .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
  141. },
  142. {
  143. "jeq32: min/max deduction",
  144. .insns = {
  145. BPF_RAND_UEXT_R7,
  146. BPF_MOV64_IMM(BPF_REG_0, 0),
  147. BPF_JMP32_IMM(BPF_JEQ, BPF_REG_7, 0x10, 1),
  148. BPF_EXIT_INSN(),
  149. BPF_JMP32_IMM(BPF_JSGE, BPF_REG_7, 0xf, 1),
  150. BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
  151. BPF_EXIT_INSN(),
  152. },
  153. .errstr_unpriv = "R9 !read_ok",
  154. .result_unpriv = REJECT,
  155. .result = ACCEPT,
  156. },
  157. {
  158. "jne32: BPF_K",
  159. .insns = {
  160. BPF_DIRECT_PKT_R2,
  161. BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
  162. BPF_JMP32_IMM(BPF_JNE, BPF_REG_7, -1, 1),
  163. BPF_EXIT_INSN(),
  164. BPF_MOV64_IMM(BPF_REG_0, 2),
  165. BPF_EXIT_INSN(),
  166. },
  167. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  168. .result = ACCEPT,
  169. .runs = 2,
  170. .retvals = {
  171. { .retval = 2,
  172. .data64 = { 1, }
  173. },
  174. { .retval = 0,
  175. .data64 = { -1, }
  176. },
  177. },
  178. .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
  179. },
  180. {
  181. "jne32: BPF_X",
  182. .insns = {
  183. BPF_DIRECT_PKT_R2,
  184. BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
  185. BPF_LD_IMM64(BPF_REG_8, 0x8000000000000001),
  186. BPF_JMP32_REG(BPF_JNE, BPF_REG_7, BPF_REG_8, 1),
  187. BPF_EXIT_INSN(),
  188. BPF_MOV64_IMM(BPF_REG_0, 2),
  189. BPF_EXIT_INSN(),
  190. },
  191. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  192. .result = ACCEPT,
  193. .runs = 3,
  194. .retvals = {
  195. { .retval = 0,
  196. .data64 = { 1, }
  197. },
  198. { .retval = 2,
  199. .data64 = { 2, }
  200. },
  201. { .retval = 2,
  202. .data64 = { 1ULL << 63 | 2, }
  203. },
  204. },
  205. .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
  206. },
  207. {
  208. "jne32: min/max deduction",
  209. .insns = {
  210. BPF_RAND_UEXT_R7,
  211. BPF_MOV64_IMM(BPF_REG_0, 0),
  212. BPF_JMP32_IMM(BPF_JNE, BPF_REG_7, 0x10, 1),
  213. BPF_JMP_IMM(BPF_JNE, BPF_REG_7, 0x10, 1),
  214. BPF_EXIT_INSN(),
  215. BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
  216. BPF_EXIT_INSN(),
  217. },
  218. .errstr_unpriv = "R9 !read_ok",
  219. .result_unpriv = REJECT,
  220. .result = ACCEPT,
  221. },
  222. {
  223. "jge32: BPF_K",
  224. .insns = {
  225. BPF_DIRECT_PKT_R2,
  226. BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
  227. BPF_JMP32_IMM(BPF_JGE, BPF_REG_7, UINT_MAX - 1, 1),
  228. BPF_EXIT_INSN(),
  229. BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
  230. BPF_EXIT_INSN(),
  231. },
  232. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  233. .result = ACCEPT,
  234. .runs = 3,
  235. .retvals = {
  236. { .retval = 2,
  237. .data64 = { UINT_MAX, }
  238. },
  239. { .retval = 2,
  240. .data64 = { UINT_MAX - 1, }
  241. },
  242. { .retval = 0,
  243. .data64 = { 0, }
  244. },
  245. },
  246. .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
  247. },
  248. {
  249. "jge32: BPF_X",
  250. .insns = {
  251. BPF_DIRECT_PKT_R2,
  252. BPF_LD_IMM64(BPF_REG_8, UINT_MAX | 1ULL << 32),
  253. BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
  254. BPF_JMP32_REG(BPF_JGE, BPF_REG_7, BPF_REG_8, 1),
  255. BPF_EXIT_INSN(),
  256. BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
  257. BPF_EXIT_INSN(),
  258. },
  259. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  260. .result = ACCEPT,
  261. .runs = 3,
  262. .retvals = {
  263. { .retval = 2,
  264. .data64 = { UINT_MAX, }
  265. },
  266. { .retval = 0,
  267. .data64 = { INT_MAX, }
  268. },
  269. { .retval = 0,
  270. .data64 = { (UINT_MAX - 1) | 2ULL << 32, }
  271. },
  272. },
  273. .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
  274. },
  275. {
  276. "jge32: min/max deduction",
  277. .insns = {
  278. BPF_RAND_UEXT_R7,
  279. BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
  280. BPF_LD_IMM64(BPF_REG_8, 0x7ffffff0 | 1ULL << 32),
  281. BPF_JMP32_REG(BPF_JGE, BPF_REG_7, BPF_REG_8, 1),
  282. BPF_EXIT_INSN(),
  283. BPF_JMP32_IMM(BPF_JGE, BPF_REG_7, 0x7ffffff0, 1),
  284. BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
  285. BPF_EXIT_INSN(),
  286. },
  287. .errstr_unpriv = "R0 invalid mem access 'scalar'",
  288. .result_unpriv = REJECT,
  289. .result = ACCEPT,
  290. .retval = 2,
  291. },
  292. {
  293. "jgt32: BPF_K",
  294. .insns = {
  295. BPF_DIRECT_PKT_R2,
  296. BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
  297. BPF_JMP32_IMM(BPF_JGT, BPF_REG_7, UINT_MAX - 1, 1),
  298. BPF_EXIT_INSN(),
  299. BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
  300. BPF_EXIT_INSN(),
  301. },
  302. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  303. .result = ACCEPT,
  304. .runs = 3,
  305. .retvals = {
  306. { .retval = 2,
  307. .data64 = { UINT_MAX, }
  308. },
  309. { .retval = 0,
  310. .data64 = { UINT_MAX - 1, }
  311. },
  312. { .retval = 0,
  313. .data64 = { 0, }
  314. },
  315. },
  316. .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
  317. },
  318. {
  319. "jgt32: BPF_X",
  320. .insns = {
  321. BPF_DIRECT_PKT_R2,
  322. BPF_LD_IMM64(BPF_REG_8, (UINT_MAX - 1) | 1ULL << 32),
  323. BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
  324. BPF_JMP32_REG(BPF_JGT, BPF_REG_7, BPF_REG_8, 1),
  325. BPF_EXIT_INSN(),
  326. BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
  327. BPF_EXIT_INSN(),
  328. },
  329. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  330. .result = ACCEPT,
  331. .runs = 3,
  332. .retvals = {
  333. { .retval = 2,
  334. .data64 = { UINT_MAX, }
  335. },
  336. { .retval = 0,
  337. .data64 = { UINT_MAX - 1, }
  338. },
  339. { .retval = 0,
  340. .data64 = { (UINT_MAX - 1) | 2ULL << 32, }
  341. },
  342. },
  343. .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
  344. },
  345. {
  346. "jgt32: min/max deduction",
  347. .insns = {
  348. BPF_RAND_UEXT_R7,
  349. BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
  350. BPF_LD_IMM64(BPF_REG_8, 0x7ffffff0 | 1ULL << 32),
  351. BPF_JMP32_REG(BPF_JGT, BPF_REG_7, BPF_REG_8, 1),
  352. BPF_EXIT_INSN(),
  353. BPF_JMP_IMM(BPF_JGT, BPF_REG_7, 0x7ffffff0, 1),
  354. BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
  355. BPF_EXIT_INSN(),
  356. },
  357. .errstr_unpriv = "R0 invalid mem access 'scalar'",
  358. .result_unpriv = REJECT,
  359. .result = ACCEPT,
  360. .retval = 2,
  361. },
  362. {
  363. "jle32: BPF_K",
  364. .insns = {
  365. BPF_DIRECT_PKT_R2,
  366. BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
  367. BPF_JMP32_IMM(BPF_JLE, BPF_REG_7, INT_MAX, 1),
  368. BPF_EXIT_INSN(),
  369. BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
  370. BPF_EXIT_INSN(),
  371. },
  372. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  373. .result = ACCEPT,
  374. .runs = 3,
  375. .retvals = {
  376. { .retval = 2,
  377. .data64 = { INT_MAX - 1, }
  378. },
  379. { .retval = 0,
  380. .data64 = { UINT_MAX, }
  381. },
  382. { .retval = 2,
  383. .data64 = { INT_MAX, }
  384. },
  385. },
  386. .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
  387. },
  388. {
  389. "jle32: BPF_X",
  390. .insns = {
  391. BPF_DIRECT_PKT_R2,
  392. BPF_LD_IMM64(BPF_REG_8, (INT_MAX - 1) | 2ULL << 32),
  393. BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
  394. BPF_JMP32_REG(BPF_JLE, BPF_REG_7, BPF_REG_8, 1),
  395. BPF_EXIT_INSN(),
  396. BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
  397. BPF_EXIT_INSN(),
  398. },
  399. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  400. .result = ACCEPT,
  401. .runs = 3,
  402. .retvals = {
  403. { .retval = 0,
  404. .data64 = { INT_MAX | 1ULL << 32, }
  405. },
  406. { .retval = 2,
  407. .data64 = { INT_MAX - 2, }
  408. },
  409. { .retval = 0,
  410. .data64 = { UINT_MAX, }
  411. },
  412. },
  413. .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
  414. },
  415. {
  416. "jle32: min/max deduction",
  417. .insns = {
  418. BPF_RAND_UEXT_R7,
  419. BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
  420. BPF_LD_IMM64(BPF_REG_8, 0x7ffffff0 | 1ULL << 32),
  421. BPF_JMP32_REG(BPF_JLE, BPF_REG_7, BPF_REG_8, 1),
  422. BPF_EXIT_INSN(),
  423. BPF_JMP32_IMM(BPF_JLE, BPF_REG_7, 0x7ffffff0, 1),
  424. BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
  425. BPF_EXIT_INSN(),
  426. },
  427. .errstr_unpriv = "R0 invalid mem access 'scalar'",
  428. .result_unpriv = REJECT,
  429. .result = ACCEPT,
  430. .retval = 2,
  431. },
  432. {
  433. "jlt32: BPF_K",
  434. .insns = {
  435. BPF_DIRECT_PKT_R2,
  436. BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
  437. BPF_JMP32_IMM(BPF_JLT, BPF_REG_7, INT_MAX, 1),
  438. BPF_EXIT_INSN(),
  439. BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
  440. BPF_EXIT_INSN(),
  441. },
  442. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  443. .result = ACCEPT,
  444. .runs = 3,
  445. .retvals = {
  446. { .retval = 0,
  447. .data64 = { INT_MAX, }
  448. },
  449. { .retval = 0,
  450. .data64 = { UINT_MAX, }
  451. },
  452. { .retval = 2,
  453. .data64 = { INT_MAX - 1, }
  454. },
  455. },
  456. .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
  457. },
  458. {
  459. "jlt32: BPF_X",
  460. .insns = {
  461. BPF_DIRECT_PKT_R2,
  462. BPF_LD_IMM64(BPF_REG_8, INT_MAX | 2ULL << 32),
  463. BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
  464. BPF_JMP32_REG(BPF_JLT, BPF_REG_7, BPF_REG_8, 1),
  465. BPF_EXIT_INSN(),
  466. BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
  467. BPF_EXIT_INSN(),
  468. },
  469. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  470. .result = ACCEPT,
  471. .runs = 3,
  472. .retvals = {
  473. { .retval = 0,
  474. .data64 = { INT_MAX | 1ULL << 32, }
  475. },
  476. { .retval = 0,
  477. .data64 = { UINT_MAX, }
  478. },
  479. { .retval = 2,
  480. .data64 = { (INT_MAX - 1) | 3ULL << 32, }
  481. },
  482. },
  483. .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
  484. },
  485. {
  486. "jlt32: min/max deduction",
  487. .insns = {
  488. BPF_RAND_UEXT_R7,
  489. BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
  490. BPF_LD_IMM64(BPF_REG_8, 0x7ffffff0 | 1ULL << 32),
  491. BPF_JMP32_REG(BPF_JLT, BPF_REG_7, BPF_REG_8, 1),
  492. BPF_EXIT_INSN(),
  493. BPF_JMP_IMM(BPF_JSLT, BPF_REG_7, 0x7ffffff0, 1),
  494. BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
  495. BPF_EXIT_INSN(),
  496. },
  497. .errstr_unpriv = "R0 invalid mem access 'scalar'",
  498. .result_unpriv = REJECT,
  499. .result = ACCEPT,
  500. .retval = 2,
  501. },
  502. {
  503. "jsge32: BPF_K",
  504. .insns = {
  505. BPF_DIRECT_PKT_R2,
  506. BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
  507. BPF_JMP32_IMM(BPF_JSGE, BPF_REG_7, -1, 1),
  508. BPF_EXIT_INSN(),
  509. BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
  510. BPF_EXIT_INSN(),
  511. },
  512. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  513. .result = ACCEPT,
  514. .runs = 3,
  515. .retvals = {
  516. { .retval = 2,
  517. .data64 = { 0, }
  518. },
  519. { .retval = 2,
  520. .data64 = { -1, }
  521. },
  522. { .retval = 0,
  523. .data64 = { -2, }
  524. },
  525. },
  526. .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
  527. },
  528. {
  529. "jsge32: BPF_X",
  530. .insns = {
  531. BPF_DIRECT_PKT_R2,
  532. BPF_LD_IMM64(BPF_REG_8, (__u32)-1 | 2ULL << 32),
  533. BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
  534. BPF_JMP32_REG(BPF_JSGE, BPF_REG_7, BPF_REG_8, 1),
  535. BPF_EXIT_INSN(),
  536. BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
  537. BPF_EXIT_INSN(),
  538. },
  539. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  540. .result = ACCEPT,
  541. .runs = 3,
  542. .retvals = {
  543. { .retval = 2,
  544. .data64 = { -1, }
  545. },
  546. { .retval = 2,
  547. .data64 = { 0x7fffffff | 1ULL << 32, }
  548. },
  549. { .retval = 0,
  550. .data64 = { -2, }
  551. },
  552. },
  553. .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
  554. },
  555. {
  556. "jsge32: min/max deduction",
  557. .insns = {
  558. BPF_RAND_UEXT_R7,
  559. BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
  560. BPF_LD_IMM64(BPF_REG_8, 0x7ffffff0 | 1ULL << 32),
  561. BPF_JMP32_REG(BPF_JSGE, BPF_REG_7, BPF_REG_8, 1),
  562. BPF_EXIT_INSN(),
  563. BPF_JMP_IMM(BPF_JSGE, BPF_REG_7, 0x7ffffff0, 1),
  564. BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
  565. BPF_EXIT_INSN(),
  566. },
  567. .errstr_unpriv = "R0 invalid mem access 'scalar'",
  568. .result_unpriv = REJECT,
  569. .result = ACCEPT,
  570. .retval = 2,
  571. },
  572. {
  573. "jsgt32: BPF_K",
  574. .insns = {
  575. BPF_DIRECT_PKT_R2,
  576. BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
  577. BPF_JMP32_IMM(BPF_JSGT, BPF_REG_7, -1, 1),
  578. BPF_EXIT_INSN(),
  579. BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
  580. BPF_EXIT_INSN(),
  581. },
  582. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  583. .result = ACCEPT,
  584. .runs = 3,
  585. .retvals = {
  586. { .retval = 0,
  587. .data64 = { (__u32)-2, }
  588. },
  589. { .retval = 0,
  590. .data64 = { -1, }
  591. },
  592. { .retval = 2,
  593. .data64 = { 1, }
  594. },
  595. },
  596. .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
  597. },
  598. {
  599. "jsgt32: BPF_X",
  600. .insns = {
  601. BPF_DIRECT_PKT_R2,
  602. BPF_LD_IMM64(BPF_REG_8, 0x7ffffffe | 1ULL << 32),
  603. BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
  604. BPF_JMP32_REG(BPF_JSGT, BPF_REG_7, BPF_REG_8, 1),
  605. BPF_EXIT_INSN(),
  606. BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
  607. BPF_EXIT_INSN(),
  608. },
  609. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  610. .result = ACCEPT,
  611. .runs = 3,
  612. .retvals = {
  613. { .retval = 0,
  614. .data64 = { 0x7ffffffe, }
  615. },
  616. { .retval = 0,
  617. .data64 = { 0x1ffffffffULL, }
  618. },
  619. { .retval = 2,
  620. .data64 = { 0x7fffffff, }
  621. },
  622. },
  623. .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
  624. },
  625. {
  626. "jsgt32: min/max deduction",
  627. .insns = {
  628. BPF_RAND_SEXT_R7,
  629. BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
  630. BPF_LD_IMM64(BPF_REG_8, (__u32)(-2) | 1ULL << 32),
  631. BPF_JMP32_REG(BPF_JSGT, BPF_REG_7, BPF_REG_8, 1),
  632. BPF_EXIT_INSN(),
  633. BPF_JMP_IMM(BPF_JSGT, BPF_REG_7, -2, 1),
  634. BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
  635. BPF_EXIT_INSN(),
  636. },
  637. .errstr_unpriv = "R0 invalid mem access 'scalar'",
  638. .result_unpriv = REJECT,
  639. .result = ACCEPT,
  640. .retval = 2,
  641. },
  642. {
  643. "jsle32: BPF_K",
  644. .insns = {
  645. BPF_DIRECT_PKT_R2,
  646. BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
  647. BPF_JMP32_IMM(BPF_JSLE, BPF_REG_7, -1, 1),
  648. BPF_EXIT_INSN(),
  649. BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
  650. BPF_EXIT_INSN(),
  651. },
  652. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  653. .result = ACCEPT,
  654. .runs = 3,
  655. .retvals = {
  656. { .retval = 2,
  657. .data64 = { (__u32)-2, }
  658. },
  659. { .retval = 2,
  660. .data64 = { -1, }
  661. },
  662. { .retval = 0,
  663. .data64 = { 1, }
  664. },
  665. },
  666. .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
  667. },
  668. {
  669. "jsle32: BPF_X",
  670. .insns = {
  671. BPF_DIRECT_PKT_R2,
  672. BPF_LD_IMM64(BPF_REG_8, 0x7ffffffe | 1ULL << 32),
  673. BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
  674. BPF_JMP32_REG(BPF_JSLE, BPF_REG_7, BPF_REG_8, 1),
  675. BPF_EXIT_INSN(),
  676. BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
  677. BPF_EXIT_INSN(),
  678. },
  679. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  680. .result = ACCEPT,
  681. .runs = 3,
  682. .retvals = {
  683. { .retval = 2,
  684. .data64 = { 0x7ffffffe, }
  685. },
  686. { .retval = 2,
  687. .data64 = { (__u32)-1, }
  688. },
  689. { .retval = 0,
  690. .data64 = { 0x7fffffff | 2ULL << 32, }
  691. },
  692. },
  693. .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
  694. },
  695. {
  696. "jsle32: min/max deduction",
  697. .insns = {
  698. BPF_RAND_UEXT_R7,
  699. BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
  700. BPF_LD_IMM64(BPF_REG_8, 0x7ffffff0 | 1ULL << 32),
  701. BPF_JMP32_REG(BPF_JSLE, BPF_REG_7, BPF_REG_8, 1),
  702. BPF_EXIT_INSN(),
  703. BPF_JMP_IMM(BPF_JSLE, BPF_REG_7, 0x7ffffff0, 1),
  704. BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
  705. BPF_EXIT_INSN(),
  706. },
  707. .errstr_unpriv = "R0 invalid mem access 'scalar'",
  708. .result_unpriv = REJECT,
  709. .result = ACCEPT,
  710. .retval = 2,
  711. },
  712. {
  713. "jslt32: BPF_K",
  714. .insns = {
  715. BPF_DIRECT_PKT_R2,
  716. BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
  717. BPF_JMP32_IMM(BPF_JSLT, BPF_REG_7, -1, 1),
  718. BPF_EXIT_INSN(),
  719. BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
  720. BPF_EXIT_INSN(),
  721. },
  722. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  723. .result = ACCEPT,
  724. .runs = 3,
  725. .retvals = {
  726. { .retval = 2,
  727. .data64 = { (__u32)-2, }
  728. },
  729. { .retval = 0,
  730. .data64 = { -1, }
  731. },
  732. { .retval = 0,
  733. .data64 = { 1, }
  734. },
  735. },
  736. .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
  737. },
  738. {
  739. "jslt32: BPF_X",
  740. .insns = {
  741. BPF_DIRECT_PKT_R2,
  742. BPF_LD_IMM64(BPF_REG_8, 0x7fffffff | 1ULL << 32),
  743. BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
  744. BPF_JMP32_REG(BPF_JSLT, BPF_REG_7, BPF_REG_8, 1),
  745. BPF_EXIT_INSN(),
  746. BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
  747. BPF_EXIT_INSN(),
  748. },
  749. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  750. .result = ACCEPT,
  751. .runs = 3,
  752. .retvals = {
  753. { .retval = 2,
  754. .data64 = { 0x7ffffffe, }
  755. },
  756. { .retval = 2,
  757. .data64 = { 0xffffffff, }
  758. },
  759. { .retval = 0,
  760. .data64 = { 0x7fffffff | 2ULL << 32, }
  761. },
  762. },
  763. .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
  764. },
  765. {
  766. "jslt32: min/max deduction",
  767. .insns = {
  768. BPF_RAND_SEXT_R7,
  769. BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 2),
  770. BPF_LD_IMM64(BPF_REG_8, (__u32)(-1) | 1ULL << 32),
  771. BPF_JMP32_REG(BPF_JSLT, BPF_REG_7, BPF_REG_8, 1),
  772. BPF_EXIT_INSN(),
  773. BPF_JMP32_IMM(BPF_JSLT, BPF_REG_7, -1, 1),
  774. BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
  775. BPF_EXIT_INSN(),
  776. },
  777. .errstr_unpriv = "R0 invalid mem access 'scalar'",
  778. .result_unpriv = REJECT,
  779. .result = ACCEPT,
  780. .retval = 2,
  781. },
  782. {
  783. "jgt32: range bound deduction, reg op imm",
  784. .insns = {
  785. BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
  786. BPF_MOV64_REG(BPF_REG_8, BPF_REG_1),
  787. BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
  788. BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
  789. BPF_LD_MAP_FD(BPF_REG_1, 0),
  790. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
  791. BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 9),
  792. BPF_MOV64_REG(BPF_REG_1, BPF_REG_8),
  793. BPF_MOV64_REG(BPF_REG_8, BPF_REG_0),
  794. BPF_EMIT_CALL(BPF_FUNC_get_cgroup_classid),
  795. BPF_JMP32_IMM(BPF_JGT, BPF_REG_0, 1, 5),
  796. BPF_MOV32_REG(BPF_REG_6, BPF_REG_0),
  797. BPF_ALU64_IMM(BPF_LSH, BPF_REG_6, 32),
  798. BPF_ALU64_IMM(BPF_RSH, BPF_REG_6, 32),
  799. BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_6),
  800. BPF_ST_MEM(BPF_B, BPF_REG_8, 0, 0),
  801. BPF_MOV32_IMM(BPF_REG_0, 0),
  802. BPF_EXIT_INSN(),
  803. },
  804. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  805. .fixup_map_hash_48b = { 4 },
  806. .result = ACCEPT,
  807. .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
  808. },
  809. {
  810. "jgt32: range bound deduction, reg1 op reg2, reg1 unknown",
  811. .insns = {
  812. BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
  813. BPF_MOV64_REG(BPF_REG_8, BPF_REG_1),
  814. BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
  815. BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
  816. BPF_LD_MAP_FD(BPF_REG_1, 0),
  817. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
  818. BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 10),
  819. BPF_MOV64_REG(BPF_REG_1, BPF_REG_8),
  820. BPF_MOV64_REG(BPF_REG_8, BPF_REG_0),
  821. BPF_EMIT_CALL(BPF_FUNC_get_cgroup_classid),
  822. BPF_MOV32_IMM(BPF_REG_2, 1),
  823. BPF_JMP32_REG(BPF_JGT, BPF_REG_0, BPF_REG_2, 5),
  824. BPF_MOV32_REG(BPF_REG_6, BPF_REG_0),
  825. BPF_ALU64_IMM(BPF_LSH, BPF_REG_6, 32),
  826. BPF_ALU64_IMM(BPF_RSH, BPF_REG_6, 32),
  827. BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_6),
  828. BPF_ST_MEM(BPF_B, BPF_REG_8, 0, 0),
  829. BPF_MOV32_IMM(BPF_REG_0, 0),
  830. BPF_EXIT_INSN(),
  831. },
  832. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  833. .fixup_map_hash_48b = { 4 },
  834. .result = ACCEPT,
  835. .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
  836. },
  837. {
  838. "jle32: range bound deduction, reg1 op reg2, reg2 unknown",
  839. .insns = {
  840. BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
  841. BPF_MOV64_REG(BPF_REG_8, BPF_REG_1),
  842. BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
  843. BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
  844. BPF_LD_MAP_FD(BPF_REG_1, 0),
  845. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
  846. BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 10),
  847. BPF_MOV64_REG(BPF_REG_1, BPF_REG_8),
  848. BPF_MOV64_REG(BPF_REG_8, BPF_REG_0),
  849. BPF_EMIT_CALL(BPF_FUNC_get_cgroup_classid),
  850. BPF_MOV32_IMM(BPF_REG_2, 1),
  851. BPF_JMP32_REG(BPF_JLE, BPF_REG_2, BPF_REG_0, 5),
  852. BPF_MOV32_REG(BPF_REG_6, BPF_REG_0),
  853. BPF_ALU64_IMM(BPF_LSH, BPF_REG_6, 32),
  854. BPF_ALU64_IMM(BPF_RSH, BPF_REG_6, 32),
  855. BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_6),
  856. BPF_ST_MEM(BPF_B, BPF_REG_8, 0, 0),
  857. BPF_MOV32_IMM(BPF_REG_0, 0),
  858. BPF_EXIT_INSN(),
  859. },
  860. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  861. .fixup_map_hash_48b = { 4 },
  862. .result = ACCEPT,
  863. .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
  864. },
  865. {
  866. "jeq32/jne32: bounds checking",
  867. .insns = {
  868. BPF_MOV64_IMM(BPF_REG_6, 563),
  869. BPF_MOV64_IMM(BPF_REG_2, 0),
  870. BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0),
  871. BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0),
  872. BPF_ALU32_REG(BPF_OR, BPF_REG_2, BPF_REG_6),
  873. BPF_JMP32_IMM(BPF_JNE, BPF_REG_2, 8, 5),
  874. BPF_JMP_IMM(BPF_JSGE, BPF_REG_2, 500, 2),
  875. BPF_MOV64_IMM(BPF_REG_0, 2),
  876. BPF_EXIT_INSN(),
  877. BPF_MOV64_REG(BPF_REG_0, BPF_REG_4),
  878. BPF_EXIT_INSN(),
  879. BPF_MOV64_IMM(BPF_REG_0, 1),
  880. BPF_EXIT_INSN(),
  881. },
  882. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  883. .result = ACCEPT,
  884. .retval = 1,
  885. },