xref: /kernel/linux/linux-6.6/tools/testing/selftests/bpf/verifier/atomic_bounds.c
  • Home
  • History
  • Annotate Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
  • only in /kernel/linux/linux-6.6/tools/testing/selftests/bpf/verifier/
162306a36Sopenharmony_ci{
262306a36Sopenharmony_ci	"BPF_ATOMIC bounds propagation, mem->reg",
362306a36Sopenharmony_ci	.insns = {
462306a36Sopenharmony_ci		/* a = 0; */
562306a36Sopenharmony_ci		/*
662306a36Sopenharmony_ci		 * Note this is implemented with two separate instructions,
762306a36Sopenharmony_ci		 * where you might think one would suffice:
862306a36Sopenharmony_ci		 *
962306a36Sopenharmony_ci		 * BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
1062306a36Sopenharmony_ci		 *
1162306a36Sopenharmony_ci		 * This is because BPF_ST_MEM doesn't seem to set the stack slot
1262306a36Sopenharmony_ci		 * type to 0 when storing an immediate.
1362306a36Sopenharmony_ci		 */
1462306a36Sopenharmony_ci		BPF_MOV64_IMM(BPF_REG_0, 0),
1562306a36Sopenharmony_ci		BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
1662306a36Sopenharmony_ci		/* b = atomic_fetch_add(&a, 1); */
1762306a36Sopenharmony_ci		BPF_MOV64_IMM(BPF_REG_1, 1),
1862306a36Sopenharmony_ci		BPF_ATOMIC_OP(BPF_DW, BPF_ADD | BPF_FETCH, BPF_REG_10, BPF_REG_1, -8),
1962306a36Sopenharmony_ci		/* Verifier should be able to tell that this infinite loop isn't reachable. */
2062306a36Sopenharmony_ci		/* if (b) while (true) continue; */
2162306a36Sopenharmony_ci		BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, -1),
2262306a36Sopenharmony_ci		BPF_EXIT_INSN(),
2362306a36Sopenharmony_ci	},
2462306a36Sopenharmony_ci	.result = ACCEPT,
2562306a36Sopenharmony_ci	.result_unpriv = REJECT,
2662306a36Sopenharmony_ci	.errstr_unpriv = "back-edge",
2762306a36Sopenharmony_ci},
28

Indexes created Thu Nov 07 10:32:03 CST 2024