jit.c 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. {
  2. "jit: lsh, rsh, arsh by 1",
  3. .insns = {
  4. BPF_MOV64_IMM(BPF_REG_0, 1),
  5. BPF_MOV64_IMM(BPF_REG_1, 0xff),
  6. BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 1),
  7. BPF_ALU32_IMM(BPF_LSH, BPF_REG_1, 1),
  8. BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0x3fc, 1),
  9. BPF_EXIT_INSN(),
  10. BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 1),
  11. BPF_ALU32_IMM(BPF_RSH, BPF_REG_1, 1),
  12. BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0xff, 1),
  13. BPF_EXIT_INSN(),
  14. BPF_ALU64_IMM(BPF_ARSH, BPF_REG_1, 1),
  15. BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0x7f, 1),
  16. BPF_EXIT_INSN(),
  17. BPF_MOV64_IMM(BPF_REG_0, 2),
  18. BPF_EXIT_INSN(),
  19. },
  20. .result = ACCEPT,
  21. .retval = 2,
  22. },
  23. {
  24. "jit: lsh, rsh, arsh by reg",
  25. .insns = {
  26. BPF_MOV64_IMM(BPF_REG_0, 1),
  27. BPF_MOV64_IMM(BPF_REG_4, 1),
  28. BPF_MOV64_IMM(BPF_REG_1, 0xff),
  29. BPF_ALU64_REG(BPF_LSH, BPF_REG_1, BPF_REG_0),
  30. BPF_ALU32_REG(BPF_LSH, BPF_REG_1, BPF_REG_4),
  31. BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0x3fc, 1),
  32. BPF_EXIT_INSN(),
  33. BPF_ALU64_REG(BPF_RSH, BPF_REG_1, BPF_REG_4),
  34. BPF_MOV64_REG(BPF_REG_4, BPF_REG_1),
  35. BPF_ALU32_REG(BPF_RSH, BPF_REG_4, BPF_REG_0),
  36. BPF_JMP_IMM(BPF_JEQ, BPF_REG_4, 0xff, 1),
  37. BPF_EXIT_INSN(),
  38. BPF_ALU64_REG(BPF_ARSH, BPF_REG_4, BPF_REG_4),
  39. BPF_JMP_IMM(BPF_JEQ, BPF_REG_4, 0, 1),
  40. BPF_EXIT_INSN(),
  41. BPF_MOV64_IMM(BPF_REG_0, 2),
  42. BPF_EXIT_INSN(),
  43. },
  44. .result = ACCEPT,
  45. .retval = 2,
  46. },
  47. {
  48. "jit: mov32 for ldimm64, 1",
  49. .insns = {
  50. BPF_MOV64_IMM(BPF_REG_0, 2),
  51. BPF_LD_IMM64(BPF_REG_1, 0xfeffffffffffffffULL),
  52. BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 32),
  53. BPF_LD_IMM64(BPF_REG_2, 0xfeffffffULL),
  54. BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1),
  55. BPF_MOV64_IMM(BPF_REG_0, 1),
  56. BPF_EXIT_INSN(),
  57. },
  58. .result = ACCEPT,
  59. .retval = 2,
  60. },
  61. {
  62. "jit: mov32 for ldimm64, 2",
  63. .insns = {
  64. BPF_MOV64_IMM(BPF_REG_0, 1),
  65. BPF_LD_IMM64(BPF_REG_1, 0x1ffffffffULL),
  66. BPF_LD_IMM64(BPF_REG_2, 0xffffffffULL),
  67. BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1),
  68. BPF_MOV64_IMM(BPF_REG_0, 2),
  69. BPF_EXIT_INSN(),
  70. },
  71. .result = ACCEPT,
  72. .retval = 2,
  73. },
  74. {
  75. "jit: various mul tests",
  76. .insns = {
  77. BPF_LD_IMM64(BPF_REG_2, 0xeeff0d413122ULL),
  78. BPF_LD_IMM64(BPF_REG_0, 0xfefefeULL),
  79. BPF_LD_IMM64(BPF_REG_1, 0xefefefULL),
  80. BPF_ALU64_REG(BPF_MUL, BPF_REG_0, BPF_REG_1),
  81. BPF_JMP_REG(BPF_JEQ, BPF_REG_0, BPF_REG_2, 2),
  82. BPF_MOV64_IMM(BPF_REG_0, 1),
  83. BPF_EXIT_INSN(),
  84. BPF_LD_IMM64(BPF_REG_3, 0xfefefeULL),
  85. BPF_ALU64_REG(BPF_MUL, BPF_REG_3, BPF_REG_1),
  86. BPF_JMP_REG(BPF_JEQ, BPF_REG_3, BPF_REG_2, 2),
  87. BPF_MOV64_IMM(BPF_REG_0, 1),
  88. BPF_EXIT_INSN(),
  89. BPF_LD_IMM64(BPF_REG_3, 0xfefefeULL),
  90. BPF_ALU64_IMM(BPF_MUL, BPF_REG_3, 0xefefef),
  91. BPF_JMP_REG(BPF_JEQ, BPF_REG_3, BPF_REG_2, 2),
  92. BPF_MOV64_IMM(BPF_REG_0, 1),
  93. BPF_EXIT_INSN(),
  94. BPF_MOV32_REG(BPF_REG_2, BPF_REG_2),
  95. BPF_LD_IMM64(BPF_REG_0, 0xfefefeULL),
  96. BPF_ALU32_REG(BPF_MUL, BPF_REG_0, BPF_REG_1),
  97. BPF_JMP_REG(BPF_JEQ, BPF_REG_0, BPF_REG_2, 2),
  98. BPF_MOV64_IMM(BPF_REG_0, 1),
  99. BPF_EXIT_INSN(),
  100. BPF_LD_IMM64(BPF_REG_3, 0xfefefeULL),
  101. BPF_ALU32_REG(BPF_MUL, BPF_REG_3, BPF_REG_1),
  102. BPF_JMP_REG(BPF_JEQ, BPF_REG_3, BPF_REG_2, 2),
  103. BPF_MOV64_IMM(BPF_REG_0, 1),
  104. BPF_EXIT_INSN(),
  105. BPF_LD_IMM64(BPF_REG_3, 0xfefefeULL),
  106. BPF_ALU32_IMM(BPF_MUL, BPF_REG_3, 0xefefef),
  107. BPF_JMP_REG(BPF_JEQ, BPF_REG_3, BPF_REG_2, 2),
  108. BPF_MOV64_IMM(BPF_REG_0, 1),
  109. BPF_EXIT_INSN(),
  110. BPF_LD_IMM64(BPF_REG_0, 0xfefefeULL),
  111. BPF_LD_IMM64(BPF_REG_2, 0x2ad4d4aaULL),
  112. BPF_ALU32_IMM(BPF_MUL, BPF_REG_0, 0x2b),
  113. BPF_JMP_REG(BPF_JEQ, BPF_REG_0, BPF_REG_2, 2),
  114. BPF_MOV64_IMM(BPF_REG_0, 1),
  115. BPF_EXIT_INSN(),
  116. BPF_LD_IMM64(BPF_REG_0, 0x952a7bbcULL),
  117. BPF_LD_IMM64(BPF_REG_1, 0xfefefeULL),
  118. BPF_LD_IMM64(BPF_REG_5, 0xeeff0d413122ULL),
  119. BPF_ALU32_REG(BPF_MUL, BPF_REG_5, BPF_REG_1),
  120. BPF_JMP_REG(BPF_JEQ, BPF_REG_5, BPF_REG_0, 2),
  121. BPF_MOV64_IMM(BPF_REG_0, 1),
  122. BPF_EXIT_INSN(),
  123. BPF_MOV64_IMM(BPF_REG_0, 2),
  124. BPF_EXIT_INSN(),
  125. },
  126. .result = ACCEPT,
  127. .retval = 2,
  128. },
  129. {
  130. "jit: various div tests",
  131. .insns = {
  132. BPF_LD_IMM64(BPF_REG_2, 0xefeffeULL),
  133. BPF_LD_IMM64(BPF_REG_0, 0xeeff0d413122ULL),
  134. BPF_LD_IMM64(BPF_REG_1, 0xfefeeeULL),
  135. BPF_ALU64_REG(BPF_DIV, BPF_REG_0, BPF_REG_1),
  136. BPF_JMP_REG(BPF_JEQ, BPF_REG_0, BPF_REG_2, 2),
  137. BPF_MOV64_IMM(BPF_REG_0, 1),
  138. BPF_EXIT_INSN(),
  139. BPF_LD_IMM64(BPF_REG_3, 0xeeff0d413122ULL),
  140. BPF_ALU64_IMM(BPF_DIV, BPF_REG_3, 0xfefeeeULL),
  141. BPF_JMP_REG(BPF_JEQ, BPF_REG_3, BPF_REG_2, 2),
  142. BPF_MOV64_IMM(BPF_REG_0, 1),
  143. BPF_EXIT_INSN(),
  144. BPF_LD_IMM64(BPF_REG_2, 0xaa93ULL),
  145. BPF_ALU64_IMM(BPF_MOD, BPF_REG_1, 0xbeefULL),
  146. BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 2),
  147. BPF_MOV64_IMM(BPF_REG_0, 1),
  148. BPF_EXIT_INSN(),
  149. BPF_LD_IMM64(BPF_REG_1, 0xfefeeeULL),
  150. BPF_LD_IMM64(BPF_REG_3, 0xbeefULL),
  151. BPF_ALU64_REG(BPF_MOD, BPF_REG_1, BPF_REG_3),
  152. BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 2),
  153. BPF_MOV64_IMM(BPF_REG_0, 1),
  154. BPF_EXIT_INSN(),
  155. BPF_LD_IMM64(BPF_REG_2, 0x5ee1dULL),
  156. BPF_LD_IMM64(BPF_REG_1, 0xfefeeeULL),
  157. BPF_LD_IMM64(BPF_REG_3, 0x2bULL),
  158. BPF_ALU32_REG(BPF_DIV, BPF_REG_1, BPF_REG_3),
  159. BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 2),
  160. BPF_MOV64_IMM(BPF_REG_0, 1),
  161. BPF_EXIT_INSN(),
  162. BPF_ALU32_REG(BPF_DIV, BPF_REG_1, BPF_REG_1),
  163. BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 1, 2),
  164. BPF_MOV64_IMM(BPF_REG_0, 1),
  165. BPF_EXIT_INSN(),
  166. BPF_ALU64_REG(BPF_MOD, BPF_REG_2, BPF_REG_2),
  167. BPF_JMP_IMM(BPF_JEQ, BPF_REG_2, 0, 2),
  168. BPF_MOV64_IMM(BPF_REG_0, 1),
  169. BPF_EXIT_INSN(),
  170. BPF_MOV64_IMM(BPF_REG_0, 2),
  171. BPF_EXIT_INSN(),
  172. },
  173. .result = ACCEPT,
  174. .retval = 2,
  175. },
  176. {
  177. "jit: jsgt, jslt",
  178. .insns = {
  179. BPF_LD_IMM64(BPF_REG_1, 0x80000000ULL),
  180. BPF_LD_IMM64(BPF_REG_2, 0x0ULL),
  181. BPF_JMP_REG(BPF_JSGT, BPF_REG_1, BPF_REG_2, 2),
  182. BPF_MOV64_IMM(BPF_REG_0, 1),
  183. BPF_EXIT_INSN(),
  184. BPF_JMP_REG(BPF_JSLT, BPF_REG_2, BPF_REG_1, 2),
  185. BPF_MOV64_IMM(BPF_REG_0, 1),
  186. BPF_EXIT_INSN(),
  187. BPF_MOV64_IMM(BPF_REG_0, 2),
  188. BPF_EXIT_INSN(),
  189. },
  190. .result = ACCEPT,
  191. .retval = 2,
  192. },
  193. {
  194. "jit: torturous jumps, imm8 nop jmp and pure jump padding",
  195. .insns = { },
  196. .fill_helper = bpf_fill_torturous_jumps,
  197. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  198. .result = ACCEPT,
  199. .retval = 1,
  200. },
  201. {
  202. "jit: torturous jumps, imm32 nop jmp and jmp_cond padding",
  203. .insns = { },
  204. .fill_helper = bpf_fill_torturous_jumps,
  205. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  206. .result = ACCEPT,
  207. .retval = 2,
  208. },
  209. {
  210. "jit: torturous jumps in subprog",
  211. .insns = { },
  212. .fill_helper = bpf_fill_torturous_jumps,
  213. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  214. .result = ACCEPT,
  215. .retval = 3,
  216. },