basic_instr.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. {
  2. "add+sub+mul",
  3. .insns = {
  4. BPF_MOV64_IMM(BPF_REG_1, 1),
  5. BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 2),
  6. BPF_MOV64_IMM(BPF_REG_2, 3),
  7. BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_2),
  8. BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -1),
  9. BPF_ALU64_IMM(BPF_MUL, BPF_REG_1, 3),
  10. BPF_MOV64_REG(BPF_REG_0, BPF_REG_1),
  11. BPF_EXIT_INSN(),
  12. },
  13. .result = ACCEPT,
  14. .retval = -3,
  15. },
  16. {
  17. "xor32 zero extend check",
  18. .insns = {
  19. BPF_MOV32_IMM(BPF_REG_2, -1),
  20. BPF_ALU64_IMM(BPF_LSH, BPF_REG_2, 32),
  21. BPF_ALU64_IMM(BPF_OR, BPF_REG_2, 0xffff),
  22. BPF_ALU32_REG(BPF_XOR, BPF_REG_2, BPF_REG_2),
  23. BPF_MOV32_IMM(BPF_REG_0, 2),
  24. BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 0, 1),
  25. BPF_MOV32_IMM(BPF_REG_0, 1),
  26. BPF_EXIT_INSN(),
  27. },
  28. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  29. .result = ACCEPT,
  30. .retval = 1,
  31. },
  32. {
  33. "arsh32 on imm",
  34. .insns = {
  35. BPF_MOV64_IMM(BPF_REG_0, 1),
  36. BPF_ALU32_IMM(BPF_ARSH, BPF_REG_0, 5),
  37. BPF_EXIT_INSN(),
  38. },
  39. .result = ACCEPT,
  40. .retval = 0,
  41. },
  42. {
  43. "arsh32 on imm 2",
  44. .insns = {
  45. BPF_LD_IMM64(BPF_REG_0, 0x1122334485667788),
  46. BPF_ALU32_IMM(BPF_ARSH, BPF_REG_0, 7),
  47. BPF_EXIT_INSN(),
  48. },
  49. .result = ACCEPT,
  50. .retval = -16069393,
  51. },
  52. {
  53. "arsh32 on reg",
  54. .insns = {
  55. BPF_MOV64_IMM(BPF_REG_0, 1),
  56. BPF_MOV64_IMM(BPF_REG_1, 5),
  57. BPF_ALU32_REG(BPF_ARSH, BPF_REG_0, BPF_REG_1),
  58. BPF_EXIT_INSN(),
  59. },
  60. .result = ACCEPT,
  61. .retval = 0,
  62. },
  63. {
  64. "arsh32 on reg 2",
  65. .insns = {
  66. BPF_LD_IMM64(BPF_REG_0, 0xffff55667788),
  67. BPF_MOV64_IMM(BPF_REG_1, 15),
  68. BPF_ALU32_REG(BPF_ARSH, BPF_REG_0, BPF_REG_1),
  69. BPF_EXIT_INSN(),
  70. },
  71. .result = ACCEPT,
  72. .retval = 43724,
  73. },
  74. {
  75. "arsh64 on imm",
  76. .insns = {
  77. BPF_MOV64_IMM(BPF_REG_0, 1),
  78. BPF_ALU64_IMM(BPF_ARSH, BPF_REG_0, 5),
  79. BPF_EXIT_INSN(),
  80. },
  81. .result = ACCEPT,
  82. },
  83. {
  84. "arsh64 on reg",
  85. .insns = {
  86. BPF_MOV64_IMM(BPF_REG_0, 1),
  87. BPF_MOV64_IMM(BPF_REG_1, 5),
  88. BPF_ALU64_REG(BPF_ARSH, BPF_REG_0, BPF_REG_1),
  89. BPF_EXIT_INSN(),
  90. },
  91. .result = ACCEPT,
  92. },
  93. {
  94. "lsh64 by 0 imm",
  95. .insns = {
  96. BPF_LD_IMM64(BPF_REG_0, 1),
  97. BPF_LD_IMM64(BPF_REG_1, 1),
  98. BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 0),
  99. BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 1, 1),
  100. BPF_MOV64_IMM(BPF_REG_0, 2),
  101. BPF_EXIT_INSN(),
  102. },
  103. .result = ACCEPT,
  104. .retval = 1,
  105. },
  106. {
  107. "rsh64 by 0 imm",
  108. .insns = {
  109. BPF_LD_IMM64(BPF_REG_0, 1),
  110. BPF_LD_IMM64(BPF_REG_1, 0x100000000LL),
  111. BPF_ALU64_REG(BPF_MOV, BPF_REG_2, BPF_REG_1),
  112. BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 0),
  113. BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1),
  114. BPF_MOV64_IMM(BPF_REG_0, 2),
  115. BPF_EXIT_INSN(),
  116. },
  117. .result = ACCEPT,
  118. .retval = 1,
  119. },
  120. {
  121. "arsh64 by 0 imm",
  122. .insns = {
  123. BPF_LD_IMM64(BPF_REG_0, 1),
  124. BPF_LD_IMM64(BPF_REG_1, 0x100000000LL),
  125. BPF_ALU64_REG(BPF_MOV, BPF_REG_2, BPF_REG_1),
  126. BPF_ALU64_IMM(BPF_ARSH, BPF_REG_1, 0),
  127. BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1),
  128. BPF_MOV64_IMM(BPF_REG_0, 2),
  129. BPF_EXIT_INSN(),
  130. },
  131. .result = ACCEPT,
  132. .retval = 1,
  133. },
  134. {
  135. "lsh64 by 0 reg",
  136. .insns = {
  137. BPF_LD_IMM64(BPF_REG_0, 1),
  138. BPF_LD_IMM64(BPF_REG_1, 1),
  139. BPF_LD_IMM64(BPF_REG_2, 0),
  140. BPF_ALU64_REG(BPF_LSH, BPF_REG_1, BPF_REG_2),
  141. BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 1, 1),
  142. BPF_MOV64_IMM(BPF_REG_0, 2),
  143. BPF_EXIT_INSN(),
  144. },
  145. .result = ACCEPT,
  146. .retval = 1,
  147. },
  148. {
  149. "rsh64 by 0 reg",
  150. .insns = {
  151. BPF_LD_IMM64(BPF_REG_0, 1),
  152. BPF_LD_IMM64(BPF_REG_1, 0x100000000LL),
  153. BPF_ALU64_REG(BPF_MOV, BPF_REG_2, BPF_REG_1),
  154. BPF_LD_IMM64(BPF_REG_3, 0),
  155. BPF_ALU64_REG(BPF_RSH, BPF_REG_1, BPF_REG_3),
  156. BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1),
  157. BPF_MOV64_IMM(BPF_REG_0, 2),
  158. BPF_EXIT_INSN(),
  159. },
  160. .result = ACCEPT,
  161. .retval = 1,
  162. },
  163. {
  164. "arsh64 by 0 reg",
  165. .insns = {
  166. BPF_LD_IMM64(BPF_REG_0, 1),
  167. BPF_LD_IMM64(BPF_REG_1, 0x100000000LL),
  168. BPF_ALU64_REG(BPF_MOV, BPF_REG_2, BPF_REG_1),
  169. BPF_LD_IMM64(BPF_REG_3, 0),
  170. BPF_ALU64_REG(BPF_ARSH, BPF_REG_1, BPF_REG_3),
  171. BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1),
  172. BPF_MOV64_IMM(BPF_REG_0, 2),
  173. BPF_EXIT_INSN(),
  174. },
  175. .result = ACCEPT,
  176. .retval = 1,
  177. },
  178. {
  179. "invalid 64-bit BPF_END with BPF_TO_BE",
  180. .insns = {
  181. BPF_MOV32_IMM(BPF_REG_0, 0),
  182. {
  183. .code = BPF_ALU64 | BPF_END | BPF_TO_BE,
  184. .dst_reg = BPF_REG_0,
  185. .src_reg = 0,
  186. .off = 0,
  187. .imm = 32,
  188. },
  189. BPF_EXIT_INSN(),
  190. },
  191. .errstr = "unknown opcode df",
  192. .result = REJECT,
  193. },
  194. {
  195. "mov64 src == dst",
  196. .insns = {
  197. BPF_MOV64_IMM(BPF_REG_2, 0),
  198. BPF_MOV64_REG(BPF_REG_2, BPF_REG_2),
  199. // Check bounds are OK
  200. BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2),
  201. BPF_MOV64_IMM(BPF_REG_0, 0),
  202. BPF_EXIT_INSN(),
  203. },
  204. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  205. .result = ACCEPT,
  206. },
  207. {
  208. "mov64 src != dst",
  209. .insns = {
  210. BPF_MOV64_IMM(BPF_REG_3, 0),
  211. BPF_MOV64_REG(BPF_REG_2, BPF_REG_3),
  212. // Check bounds are OK
  213. BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2),
  214. BPF_MOV64_IMM(BPF_REG_0, 0),
  215. BPF_EXIT_INSN(),
  216. },
  217. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  218. .result = ACCEPT,
  219. },