| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270 |
- #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
|