jit.c 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  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: mov32 for ldimm64, 1",
  25. .insns = {
  26. BPF_MOV64_IMM(BPF_REG_0, 2),
  27. BPF_LD_IMM64(BPF_REG_1, 0xfeffffffffffffffULL),
  28. BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 32),
  29. BPF_LD_IMM64(BPF_REG_2, 0xfeffffffULL),
  30. BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1),
  31. BPF_MOV64_IMM(BPF_REG_0, 1),
  32. BPF_EXIT_INSN(),
  33. },
  34. .result = ACCEPT,
  35. .retval = 2,
  36. },
  37. {
  38. "jit: mov32 for ldimm64, 2",
  39. .insns = {
  40. BPF_MOV64_IMM(BPF_REG_0, 1),
  41. BPF_LD_IMM64(BPF_REG_1, 0x1ffffffffULL),
  42. BPF_LD_IMM64(BPF_REG_2, 0xffffffffULL),
  43. BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1),
  44. BPF_MOV64_IMM(BPF_REG_0, 2),
  45. BPF_EXIT_INSN(),
  46. },
  47. .result = ACCEPT,
  48. .retval = 2,
  49. },
  50. {
  51. "jit: various mul tests",
  52. .insns = {
  53. BPF_LD_IMM64(BPF_REG_2, 0xeeff0d413122ULL),
  54. BPF_LD_IMM64(BPF_REG_0, 0xfefefeULL),
  55. BPF_LD_IMM64(BPF_REG_1, 0xefefefULL),
  56. BPF_ALU64_REG(BPF_MUL, BPF_REG_0, BPF_REG_1),
  57. BPF_JMP_REG(BPF_JEQ, BPF_REG_0, BPF_REG_2, 2),
  58. BPF_MOV64_IMM(BPF_REG_0, 1),
  59. BPF_EXIT_INSN(),
  60. BPF_LD_IMM64(BPF_REG_3, 0xfefefeULL),
  61. BPF_ALU64_REG(BPF_MUL, BPF_REG_3, BPF_REG_1),
  62. BPF_JMP_REG(BPF_JEQ, BPF_REG_3, BPF_REG_2, 2),
  63. BPF_MOV64_IMM(BPF_REG_0, 1),
  64. BPF_EXIT_INSN(),
  65. BPF_LD_IMM64(BPF_REG_3, 0xfefefeULL),
  66. BPF_ALU64_IMM(BPF_MUL, BPF_REG_3, 0xefefef),
  67. BPF_JMP_REG(BPF_JEQ, BPF_REG_3, BPF_REG_2, 2),
  68. BPF_MOV64_IMM(BPF_REG_0, 1),
  69. BPF_EXIT_INSN(),
  70. BPF_MOV32_REG(BPF_REG_2, BPF_REG_2),
  71. BPF_LD_IMM64(BPF_REG_0, 0xfefefeULL),
  72. BPF_ALU32_REG(BPF_MUL, BPF_REG_0, BPF_REG_1),
  73. BPF_JMP_REG(BPF_JEQ, BPF_REG_0, BPF_REG_2, 2),
  74. BPF_MOV64_IMM(BPF_REG_0, 1),
  75. BPF_EXIT_INSN(),
  76. BPF_LD_IMM64(BPF_REG_3, 0xfefefeULL),
  77. BPF_ALU32_REG(BPF_MUL, BPF_REG_3, BPF_REG_1),
  78. BPF_JMP_REG(BPF_JEQ, BPF_REG_3, BPF_REG_2, 2),
  79. BPF_MOV64_IMM(BPF_REG_0, 1),
  80. BPF_EXIT_INSN(),
  81. BPF_LD_IMM64(BPF_REG_3, 0xfefefeULL),
  82. BPF_ALU32_IMM(BPF_MUL, BPF_REG_3, 0xefefef),
  83. BPF_JMP_REG(BPF_JEQ, BPF_REG_3, BPF_REG_2, 2),
  84. BPF_MOV64_IMM(BPF_REG_0, 1),
  85. BPF_EXIT_INSN(),
  86. BPF_LD_IMM64(BPF_REG_0, 0xfefefeULL),
  87. BPF_LD_IMM64(BPF_REG_2, 0x2ad4d4aaULL),
  88. BPF_ALU32_IMM(BPF_MUL, BPF_REG_0, 0x2b),
  89. BPF_JMP_REG(BPF_JEQ, BPF_REG_0, BPF_REG_2, 2),
  90. BPF_MOV64_IMM(BPF_REG_0, 1),
  91. BPF_EXIT_INSN(),
  92. BPF_LD_IMM64(BPF_REG_0, 0x952a7bbcULL),
  93. BPF_LD_IMM64(BPF_REG_1, 0xfefefeULL),
  94. BPF_LD_IMM64(BPF_REG_5, 0xeeff0d413122ULL),
  95. BPF_ALU32_REG(BPF_MUL, BPF_REG_5, BPF_REG_1),
  96. BPF_JMP_REG(BPF_JEQ, BPF_REG_5, BPF_REG_0, 2),
  97. BPF_MOV64_IMM(BPF_REG_0, 1),
  98. BPF_EXIT_INSN(),
  99. BPF_MOV64_IMM(BPF_REG_0, 2),
  100. BPF_EXIT_INSN(),
  101. },
  102. .result = ACCEPT,
  103. .retval = 2,
  104. },
  105. {
  106. "jit: various div tests",
  107. .insns = {
  108. BPF_LD_IMM64(BPF_REG_2, 0xefeffeULL),
  109. BPF_LD_IMM64(BPF_REG_0, 0xeeff0d413122ULL),
  110. BPF_LD_IMM64(BPF_REG_1, 0xfefeeeULL),
  111. BPF_ALU64_REG(BPF_DIV, BPF_REG_0, BPF_REG_1),
  112. BPF_JMP_REG(BPF_JEQ, BPF_REG_0, BPF_REG_2, 2),
  113. BPF_MOV64_IMM(BPF_REG_0, 1),
  114. BPF_EXIT_INSN(),
  115. BPF_LD_IMM64(BPF_REG_3, 0xeeff0d413122ULL),
  116. BPF_ALU64_IMM(BPF_DIV, BPF_REG_3, 0xfefeeeULL),
  117. BPF_JMP_REG(BPF_JEQ, BPF_REG_3, BPF_REG_2, 2),
  118. BPF_MOV64_IMM(BPF_REG_0, 1),
  119. BPF_EXIT_INSN(),
  120. BPF_LD_IMM64(BPF_REG_2, 0xaa93ULL),
  121. BPF_ALU64_IMM(BPF_MOD, BPF_REG_1, 0xbeefULL),
  122. BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 2),
  123. BPF_MOV64_IMM(BPF_REG_0, 1),
  124. BPF_EXIT_INSN(),
  125. BPF_LD_IMM64(BPF_REG_1, 0xfefeeeULL),
  126. BPF_LD_IMM64(BPF_REG_3, 0xbeefULL),
  127. BPF_ALU64_REG(BPF_MOD, BPF_REG_1, BPF_REG_3),
  128. BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 2),
  129. BPF_MOV64_IMM(BPF_REG_0, 1),
  130. BPF_EXIT_INSN(),
  131. BPF_LD_IMM64(BPF_REG_2, 0x5ee1dULL),
  132. BPF_LD_IMM64(BPF_REG_1, 0xfefeeeULL),
  133. BPF_LD_IMM64(BPF_REG_3, 0x2bULL),
  134. BPF_ALU32_REG(BPF_DIV, BPF_REG_1, BPF_REG_3),
  135. BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 2),
  136. BPF_MOV64_IMM(BPF_REG_0, 1),
  137. BPF_EXIT_INSN(),
  138. BPF_ALU32_REG(BPF_DIV, BPF_REG_1, BPF_REG_1),
  139. BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 1, 2),
  140. BPF_MOV64_IMM(BPF_REG_0, 1),
  141. BPF_EXIT_INSN(),
  142. BPF_ALU64_REG(BPF_MOD, BPF_REG_2, BPF_REG_2),
  143. BPF_JMP_IMM(BPF_JEQ, BPF_REG_2, 0, 2),
  144. BPF_MOV64_IMM(BPF_REG_0, 1),
  145. BPF_EXIT_INSN(),
  146. BPF_MOV64_IMM(BPF_REG_0, 2),
  147. BPF_EXIT_INSN(),
  148. },
  149. .result = ACCEPT,
  150. .retval = 2,
  151. },
  152. {
  153. "jit: jsgt, jslt",
  154. .insns = {
  155. BPF_LD_IMM64(BPF_REG_1, 0x80000000ULL),
  156. BPF_LD_IMM64(BPF_REG_2, 0x0ULL),
  157. BPF_JMP_REG(BPF_JSGT, BPF_REG_1, BPF_REG_2, 2),
  158. BPF_MOV64_IMM(BPF_REG_0, 1),
  159. BPF_EXIT_INSN(),
  160. BPF_JMP_REG(BPF_JSLT, BPF_REG_2, BPF_REG_1, 2),
  161. BPF_MOV64_IMM(BPF_REG_0, 1),
  162. BPF_EXIT_INSN(),
  163. BPF_MOV64_IMM(BPF_REG_0, 2),
  164. BPF_EXIT_INSN(),
  165. },
  166. .result = ACCEPT,
  167. .retval = 2,
  168. },
  169. {
  170. "jit: torturous jumps, imm8 nop jmp and pure jump padding",
  171. .insns = { },
  172. .fill_helper = bpf_fill_torturous_jumps,
  173. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  174. .result = ACCEPT,
  175. .retval = 1,
  176. },
  177. {
  178. "jit: torturous jumps, imm32 nop jmp and jmp_cond padding",
  179. .insns = { },
  180. .fill_helper = bpf_fill_torturous_jumps,
  181. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  182. .result = ACCEPT,
  183. .retval = 2,
  184. },
  185. {
  186. "jit: torturous jumps in subprog",
  187. .insns = { },
  188. .fill_helper = bpf_fill_torturous_jumps,
  189. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  190. .result = ACCEPT,
  191. .retval = 3,
  192. },