jset.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. {
  2. "jset: functional",
  3. .insns = {
  4. BPF_DIRECT_PKT_R2,
  5. BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
  6. /* reg, bit 63 or bit 0 set, taken */
  7. BPF_LD_IMM64(BPF_REG_8, 0x8000000000000001),
  8. BPF_JMP_REG(BPF_JSET, BPF_REG_7, BPF_REG_8, 1),
  9. BPF_EXIT_INSN(),
  10. /* reg, bit 62, not taken */
  11. BPF_LD_IMM64(BPF_REG_8, 0x4000000000000000),
  12. BPF_JMP_REG(BPF_JSET, BPF_REG_7, BPF_REG_8, 1),
  13. BPF_JMP_IMM(BPF_JA, 0, 0, 1),
  14. BPF_EXIT_INSN(),
  15. /* imm, any bit set, taken */
  16. BPF_JMP_IMM(BPF_JSET, BPF_REG_7, -1, 1),
  17. BPF_EXIT_INSN(),
  18. /* imm, bit 31 set, taken */
  19. BPF_JMP_IMM(BPF_JSET, BPF_REG_7, 0x80000000, 1),
  20. BPF_EXIT_INSN(),
  21. /* all good - return r0 == 2 */
  22. BPF_MOV64_IMM(BPF_REG_0, 2),
  23. BPF_EXIT_INSN(),
  24. },
  25. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  26. .result = ACCEPT,
  27. .runs = 7,
  28. .retvals = {
  29. { .retval = 2,
  30. .data64 = { (1ULL << 63) | (1U << 31) | (1U << 0), }
  31. },
  32. { .retval = 2,
  33. .data64 = { (1ULL << 63) | (1U << 31), }
  34. },
  35. { .retval = 2,
  36. .data64 = { (1ULL << 31) | (1U << 0), }
  37. },
  38. { .retval = 2,
  39. .data64 = { (__u32)-1, }
  40. },
  41. { .retval = 2,
  42. .data64 = { ~0x4000000000000000ULL, }
  43. },
  44. { .retval = 0,
  45. .data64 = { 0, }
  46. },
  47. { .retval = 0,
  48. .data64 = { ~0ULL, }
  49. },
  50. },
  51. .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
  52. },
  53. {
  54. "jset: sign-extend",
  55. .insns = {
  56. BPF_DIRECT_PKT_R2,
  57. BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
  58. BPF_JMP_IMM(BPF_JSET, BPF_REG_7, 0x80000000, 1),
  59. BPF_EXIT_INSN(),
  60. BPF_MOV64_IMM(BPF_REG_0, 2),
  61. BPF_EXIT_INSN(),
  62. },
  63. .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  64. .result = ACCEPT,
  65. .retval = 2,
  66. .data = { 1, 0, 0, 0, 0, 0, 0, 1, },
  67. .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
  68. },
  69. {
  70. "jset: known const compare",
  71. .insns = {
  72. BPF_MOV64_IMM(BPF_REG_0, 1),
  73. BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 1, 1),
  74. BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
  75. BPF_EXIT_INSN(),
  76. },
  77. .prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
  78. .errstr_unpriv = "R9 !read_ok",
  79. .result_unpriv = REJECT,
  80. .retval = 1,
  81. .result = ACCEPT,
  82. },
  83. {
  84. "jset: known const compare bad",
  85. .insns = {
  86. BPF_MOV64_IMM(BPF_REG_0, 0),
  87. BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 1, 1),
  88. BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
  89. BPF_EXIT_INSN(),
  90. },
  91. .prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
  92. .errstr_unpriv = "!read_ok",
  93. .result_unpriv = REJECT,
  94. .errstr = "!read_ok",
  95. .result = REJECT,
  96. },
  97. {
  98. "jset: unknown const compare taken",
  99. .insns = {
  100. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
  101. BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 1, 1),
  102. BPF_JMP_IMM(BPF_JA, 0, 0, 1),
  103. BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
  104. BPF_EXIT_INSN(),
  105. },
  106. .prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
  107. .errstr_unpriv = "!read_ok",
  108. .result_unpriv = REJECT,
  109. .errstr = "!read_ok",
  110. .result = REJECT,
  111. },
  112. {
  113. "jset: unknown const compare not taken",
  114. .insns = {
  115. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
  116. BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 1, 1),
  117. BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
  118. BPF_EXIT_INSN(),
  119. },
  120. .prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
  121. .errstr_unpriv = "!read_ok",
  122. .result_unpriv = REJECT,
  123. .errstr = "!read_ok",
  124. .result = REJECT,
  125. },
  126. {
  127. "jset: half-known const compare",
  128. .insns = {
  129. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
  130. BPF_ALU64_IMM(BPF_OR, BPF_REG_0, 2),
  131. BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 3, 1),
  132. BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
  133. BPF_MOV64_IMM(BPF_REG_0, 0),
  134. BPF_EXIT_INSN(),
  135. },
  136. .prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
  137. .errstr_unpriv = "R9 !read_ok",
  138. .result_unpriv = REJECT,
  139. .result = ACCEPT,
  140. },
  141. {
  142. "jset: range",
  143. .insns = {
  144. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
  145. BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
  146. BPF_MOV64_IMM(BPF_REG_0, 0),
  147. BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xff),
  148. BPF_JMP_IMM(BPF_JSET, BPF_REG_1, 0xf0, 3),
  149. BPF_JMP_IMM(BPF_JLT, BPF_REG_1, 0x10, 1),
  150. BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
  151. BPF_EXIT_INSN(),
  152. BPF_JMP_IMM(BPF_JSET, BPF_REG_1, 0x10, 1),
  153. BPF_EXIT_INSN(),
  154. BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0x10, 1),
  155. BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
  156. BPF_EXIT_INSN(),
  157. },
  158. .prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
  159. .errstr_unpriv = "R9 !read_ok",
  160. .result_unpriv = REJECT,
  161. .result = ACCEPT,
  162. },