tools/testing/selftests/bpf/verifier/bpf_loop_inline.c

Source file repositories/reference/linux-study-clean/tools/testing/selftests/bpf/verifier/bpf_loop_inline.c

File Facts

System
Linux kernel
Corpus path
tools/testing/selftests/bpf/verifier/bpf_loop_inline.c
Extension
.c
Size
8293 bytes
Lines
271
Domain
Support Tooling And Documentation
Bucket
tools
Inferred role
Support Tooling And Documentation: implementation source
Status
source implementation candidate

Why This File Exists

Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.

Dependency Surface

Detected Declarations

Annotated Snippet

#define BTF_TYPES \
	.btf_strings = "\0int\0i\0ctx\0callback\0main\0", \
	.btf_types = { \
	/* 1: int   */ BTF_TYPE_INT_ENC(1, BTF_INT_SIGNED, 0, 32, 4), \
	/* 2: int*  */ BTF_PTR_ENC(1), \
	/* 3: void* */ BTF_PTR_ENC(0), \
	/* 4: int __(void*) */ BTF_FUNC_PROTO_ENC(1, 1), \
		BTF_FUNC_PROTO_ARG_ENC(7, 3), \
	/* 5: int __(int, int*) */ BTF_FUNC_PROTO_ENC(1, 2), \
		BTF_FUNC_PROTO_ARG_ENC(5, 1), \
		BTF_FUNC_PROTO_ARG_ENC(7, 2), \
	/* 6: main      */ BTF_FUNC_ENC(20, 4), \
	/* 7: callback  */ BTF_FUNC_ENC(11, 5), \
	BTF_END_RAW \
	}

#define MAIN_TYPE	6
#define CALLBACK_TYPE	7

/* can't use BPF_CALL_REL, jit_subprogs adjusts IMM & OFF
 * fields for pseudo calls
 */
#define PSEUDO_CALL_INSN() \
	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, BPF_PSEUDO_CALL, \
		     INSN_OFF_MASK, INSN_IMM_MASK)

/* can't use BPF_FUNC_loop constant,
 * do_mix_fixups adjusts the IMM field
 */
#define HELPER_CALL_INSN() \
	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, INSN_OFF_MASK, INSN_IMM_MASK)

{
	"inline simple bpf_loop call",
	.insns = {
	/* main */
	/* force verifier state branching to verify logic on first and
	 * subsequent bpf_loop insn processing steps
	 */
	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_jiffies64),
	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 777, 2),
	BPF_ALU64_IMM(BPF_MOV, BPF_REG_1, 1),
	BPF_JMP_IMM(BPF_JA, 0, 0, 1),
	BPF_ALU64_IMM(BPF_MOV, BPF_REG_1, 2),

	BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, BPF_REG_2, BPF_PSEUDO_FUNC, 0, 6),
	BPF_RAW_INSN(0, 0, 0, 0, 0),
	BPF_ALU64_IMM(BPF_MOV, BPF_REG_3, 0),
	BPF_ALU64_IMM(BPF_MOV, BPF_REG_4, 0),
	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_loop),
	BPF_ALU64_IMM(BPF_MOV, BPF_REG_0, 0),
	BPF_EXIT_INSN(),
	/* callback */
	BPF_ALU64_IMM(BPF_MOV, BPF_REG_0, 1),
	BPF_EXIT_INSN(),
	},
	.expected_insns = { PSEUDO_CALL_INSN() },
	.unexpected_insns = { HELPER_CALL_INSN() },
	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
	.flags = F_NEEDS_JIT_ENABLED,
	.result = ACCEPT,
	.runs = 0,
	.func_info = { { 0, MAIN_TYPE }, { 12, CALLBACK_TYPE } },
	.func_info_cnt = 2,
	BTF_TYPES
},
{
	"don't inline bpf_loop call, flags non-zero",
	.insns = {
	/* main */
	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_jiffies64),
	BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_0),
	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_jiffies64),
	BPF_ALU64_REG(BPF_MOV, BPF_REG_7, BPF_REG_0),
	BPF_JMP_IMM(BPF_JNE, BPF_REG_6, 0, 9),
	BPF_ALU64_IMM(BPF_MOV, BPF_REG_4, 0),
	BPF_JMP_IMM(BPF_JNE, BPF_REG_7, 0, 0),
	BPF_ALU64_IMM(BPF_MOV, BPF_REG_1, 1),
	BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, BPF_REG_2, BPF_PSEUDO_FUNC, 0, 7),
	BPF_RAW_INSN(0, 0, 0, 0, 0),
	BPF_ALU64_IMM(BPF_MOV, BPF_REG_3, 0),
	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_loop),
	BPF_ALU64_IMM(BPF_MOV, BPF_REG_0, 0),
	BPF_EXIT_INSN(),
	BPF_ALU64_IMM(BPF_MOV, BPF_REG_4, 1),
	BPF_JMP_IMM(BPF_JA, 0, 0, -10),
	/* callback */
	BPF_ALU64_IMM(BPF_MOV, BPF_REG_0, 1),
	BPF_EXIT_INSN(),
	},

Annotation

Implementation Notes