File: atomic_bounds.c

package info (click to toggle)
linux 6.18.9-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,742,212 kB
  • sloc: ansic: 26,783,651; asm: 272,129; sh: 148,799; python: 79,242; makefile: 57,742; perl: 36,527; xml: 19,542; cpp: 5,911; yacc: 4,939; lex: 2,950; awk: 1,607; sed: 30; ruby: 25
file content (27 lines) | stat: -rw-r--r-- 840 bytes parent folder | download | duplicates (23)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
	"BPF_ATOMIC bounds propagation, mem->reg",
	.insns = {
		/* a = 0; */
		/*
		 * Note this is implemented with two separate instructions,
		 * where you might think one would suffice:
		 *
		 * BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
		 *
		 * This is because BPF_ST_MEM doesn't seem to set the stack slot
		 * type to 0 when storing an immediate.
		 */
		BPF_MOV64_IMM(BPF_REG_0, 0),
		BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
		/* b = atomic_fetch_add(&a, 1); */
		BPF_MOV64_IMM(BPF_REG_1, 1),
		BPF_ATOMIC_OP(BPF_DW, BPF_ADD | BPF_FETCH, BPF_REG_10, BPF_REG_1, -8),
		/* Verifier should be able to tell that this infinite loop isn't reachable. */
		/* if (b) while (true) continue; */
		BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, -1),
		BPF_EXIT_INSN(),
	},
	.result = ACCEPT,
	.result_unpriv = REJECT,
	.errstr_unpriv = "back-edge",
},