ringbuf.c 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. {
  2. "ringbuf: invalid reservation offset 1",
  3. .insns = {
  4. /* reserve 8 byte ringbuf memory */
  5. BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
  6. BPF_LD_MAP_FD(BPF_REG_1, 0),
  7. BPF_MOV64_IMM(BPF_REG_2, 8),
  8. BPF_MOV64_IMM(BPF_REG_3, 0),
  9. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_ringbuf_reserve),
  10. /* store a pointer to the reserved memory in R6 */
  11. BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
  12. /* check whether the reservation was successful */
  13. BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
  14. /* spill R6(mem) into the stack */
  15. BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_6, -8),
  16. /* fill it back in R7 */
  17. BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_10, -8),
  18. /* should be able to access *(R7) = 0 */
  19. BPF_ST_MEM(BPF_DW, BPF_REG_7, 0, 0),
  20. /* submit the reserved ringbuf memory */
  21. BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
  22. /* add invalid offset to reserved ringbuf memory */
  23. BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0xcafe),
  24. BPF_MOV64_IMM(BPF_REG_2, 0),
  25. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_ringbuf_submit),
  26. BPF_MOV64_IMM(BPF_REG_0, 0),
  27. BPF_EXIT_INSN(),
  28. },
  29. .fixup_map_ringbuf = { 1 },
  30. .result = REJECT,
  31. .errstr = "dereference of modified alloc_mem ptr R1",
  32. },
  33. {
  34. "ringbuf: invalid reservation offset 2",
  35. .insns = {
  36. /* reserve 8 byte ringbuf memory */
  37. BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
  38. BPF_LD_MAP_FD(BPF_REG_1, 0),
  39. BPF_MOV64_IMM(BPF_REG_2, 8),
  40. BPF_MOV64_IMM(BPF_REG_3, 0),
  41. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_ringbuf_reserve),
  42. /* store a pointer to the reserved memory in R6 */
  43. BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
  44. /* check whether the reservation was successful */
  45. BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7),
  46. /* spill R6(mem) into the stack */
  47. BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_6, -8),
  48. /* fill it back in R7 */
  49. BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_10, -8),
  50. /* add invalid offset to reserved ringbuf memory */
  51. BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, 0xcafe),
  52. /* should be able to access *(R7) = 0 */
  53. BPF_ST_MEM(BPF_DW, BPF_REG_7, 0, 0),
  54. /* submit the reserved ringbuf memory */
  55. BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
  56. BPF_MOV64_IMM(BPF_REG_2, 0),
  57. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_ringbuf_submit),
  58. BPF_MOV64_IMM(BPF_REG_0, 0),
  59. BPF_EXIT_INSN(),
  60. },
  61. .fixup_map_ringbuf = { 1 },
  62. .result = REJECT,
  63. .errstr = "R7 min value is outside of the allowed memory range",
  64. },
  65. {
  66. "ringbuf: check passing rb mem to helpers",
  67. .insns = {
  68. BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
  69. /* reserve 8 byte ringbuf memory */
  70. BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
  71. BPF_LD_MAP_FD(BPF_REG_1, 0),
  72. BPF_MOV64_IMM(BPF_REG_2, 8),
  73. BPF_MOV64_IMM(BPF_REG_3, 0),
  74. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_ringbuf_reserve),
  75. BPF_MOV64_REG(BPF_REG_7, BPF_REG_0),
  76. /* check whether the reservation was successful */
  77. BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
  78. BPF_EXIT_INSN(),
  79. /* pass allocated ring buffer memory to fib lookup */
  80. BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
  81. BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
  82. BPF_MOV64_IMM(BPF_REG_3, 8),
  83. BPF_MOV64_IMM(BPF_REG_4, 0),
  84. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_fib_lookup),
  85. /* submit the ringbuf memory */
  86. BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
  87. BPF_MOV64_IMM(BPF_REG_2, 0),
  88. BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_ringbuf_submit),
  89. BPF_MOV64_IMM(BPF_REG_0, 0),
  90. BPF_EXIT_INSN(),
  91. },
  92. .fixup_map_ringbuf = { 2 },
  93. .prog_type = BPF_PROG_TYPE_XDP,
  94. .result = ACCEPT,
  95. },