Quellcodebibliothek Statistik Leitseite products/sources/formale Sprachen/C/Linux/tools/testing/selftests/bpf/verifier/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 8 kB image not shown  

Quelle  bpf_loop_inline.c   Sprache: C

 
#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(),
 },
 .expected_insns = { HELPER_CALL_INSN() },
 .unexpected_insns = { PSEUDO_CALL_INSN() },
 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
 .flags = F_NEEDS_JIT_ENABLED,
 .result = ACCEPT,
 .runs = 0,
 .func_info = { { 0, MAIN_TYPE }, { 16, CALLBACK_TYPE } },
 .func_info_cnt = 2,
 BTF_TYPES
},
{
 "don't inline bpf_loop call, callback non-constant",
 .insns = {
 /* main */
 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_jiffies64),
 BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 777, 4), /* pick a random callback */

 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, 10),
 BPF_RAW_INSN(0, 0, 0, 0, 0),
 BPF_JMP_IMM(BPF_JA, 0, 0, 3),

 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, 8),
 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(),
 /* callback #2 */
 BPF_ALU64_IMM(BPF_MOV, BPF_REG_0, 1),
 BPF_EXIT_INSN(),
 },
 .expected_insns = { HELPER_CALL_INSN() },
 .unexpected_insns = { PSEUDO_CALL_INSN() },
 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
 .flags = F_NEEDS_JIT_ENABLED,
 .result = ACCEPT,
 .runs = 0,
 .func_info = {
  { 0, MAIN_TYPE },
  { 14, CALLBACK_TYPE },
  { 16, CALLBACK_TYPE }
 },
 .func_info_cnt = 3,
 BTF_TYPES
},
{
 "bpf_loop_inline and a dead func",
 .insns = {
 /* main */

 /* A reference to callback #1 to make verifier count it as a func.
 * This reference is overwritten below and callback #1 is dead.
 */

 BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, BPF_REG_2, BPF_PSEUDO_FUNC, 0, 9),
 BPF_RAW_INSN(0, 0, 0, 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, 8),
 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(),
 /* callback #2 */
 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 },
  { 10, CALLBACK_TYPE },
  { 12, CALLBACK_TYPE }
 },
 .func_info_cnt = 3,
 BTF_TYPES
},
{
 "bpf_loop_inline stack locations for loop vars",
 .insns = {
 /* main */
 BPF_ST_MEM(BPF_W, BPF_REG_10, -12, 0x77),
 /* bpf_loop call #1 */
 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, 22),
 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_loop call #2 */
 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, 16),
 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),
 /* call func and exit */
 BPF_CALL_REL(2),
 BPF_ALU64_IMM(BPF_MOV, BPF_REG_0, 0),
 BPF_EXIT_INSN(),
 /* func */
 BPF_ST_MEM(BPF_DW, BPF_REG_10, -32, 0x55),
 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 = {
 BPF_ST_MEM(BPF_W, BPF_REG_10, -12, 0x77),
 SKIP_INSNS(),
 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_6, -40),
 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_7, -32),
 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_8, -24),
 SKIP_INSNS(),
 /* offsets are the same as in the first call */
 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_6, -40),
 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_7, -32),
 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_8, -24),
 SKIP_INSNS(),
 BPF_ST_MEM(BPF_DW, BPF_REG_10, -32, 0x55),
 SKIP_INSNS(),
 /* offsets differ from main because of different offset
 * in BPF_ST_MEM instruction
 */

 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_6, -56),
 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_7, -48),
 BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_8, -40),
 },
 .unexpected_insns = { HELPER_CALL_INSN() },
 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
 .flags = F_NEEDS_JIT_ENABLED,
 .result = ACCEPT,
 .func_info = {
  { 0, MAIN_TYPE },
  { 16, MAIN_TYPE },
  { 25, CALLBACK_TYPE },
 },
 .func_info_cnt = 3,
 BTF_TYPES
},
{
 "inline bpf_loop call in a big program",
 .insns = {},
 .fill_helper = bpf_fill_big_prog_with_loop_1,
 .expected_insns = { PSEUDO_CALL_INSN() },
 .unexpected_insns = { HELPER_CALL_INSN() },
 .result = ACCEPT,
 .prog_type = BPF_PROG_TYPE_TRACEPOINT,
 .flags = F_NEEDS_JIT_ENABLED,
 .func_info = { { 0, MAIN_TYPE }, { 16, CALLBACK_TYPE } },
 .func_info_cnt = 2,
 BTF_TYPES
},

#undef HELPER_CALL_INSN
#undef PSEUDO_CALL_INSN
#undef CALLBACK_TYPE
#undef MAIN_TYPE
#undef BTF_TYPES

Messung V0.5
C=89 H=83 G=85

¤ Dauer der Verarbeitung: 0.4 Sekunden  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.