Lines Matching refs:env

443 	s32 (*check_meta)(struct btf_verifier_env *env,
446 int (*resolve)(struct btf_verifier_env *env,
448 int (*check_member)(struct btf_verifier_env *env,
452 int (*check_kflag_member)(struct btf_verifier_env *env,
456 void (*log_details)(struct btf_verifier_env *env,
466 static int btf_resolve(struct btf_verifier_env *env,
469 static int btf_func_check(struct btf_verifier_env *env,
1415 __printf(2, 3) static void btf_verifier_log(struct btf_verifier_env *env, in btf_verifier_log() argument
1418 struct bpf_verifier_log *log = &env->log; in btf_verifier_log()
1429 __printf(4, 5) static void __btf_verifier_log_type(struct btf_verifier_env *env, in __btf_verifier_log_type() argument
1434 struct bpf_verifier_log *log = &env->log; in __btf_verifier_log_type()
1435 struct btf *btf = env->btf; in __btf_verifier_log_type()
1450 if (env->btf->base_btf && IS_ENABLED(CONFIG_MODULE_ALLOW_BTF_MISMATCH)) in __btf_verifier_log_type()
1455 env->log_type_id, in __btf_verifier_log_type()
1461 btf_type_ops(t)->log_details(env, t); in __btf_verifier_log_type()
1473 #define btf_verifier_log_type(env, t, ...) \ argument
1474 __btf_verifier_log_type((env), (t), true, __VA_ARGS__)
1475 #define btf_verifier_log_basic(env, t, ...) \ argument
1476 __btf_verifier_log_type((env), (t), false, __VA_ARGS__)
1479 static void btf_verifier_log_member(struct btf_verifier_env *env, in btf_verifier_log_member() argument
1484 struct bpf_verifier_log *log = &env->log; in btf_verifier_log_member()
1485 struct btf *btf = env->btf; in btf_verifier_log_member()
1496 if (env->btf->base_btf && IS_ENABLED(CONFIG_MODULE_ALLOW_BTF_MISMATCH)) in btf_verifier_log_member()
1506 if (env->phase != CHECK_META) in btf_verifier_log_member()
1507 btf_verifier_log_type(env, struct_type, NULL); in btf_verifier_log_member()
1532 static void btf_verifier_log_vsi(struct btf_verifier_env *env, in btf_verifier_log_vsi() argument
1537 struct bpf_verifier_log *log = &env->log; in btf_verifier_log_vsi()
1544 if (env->phase != CHECK_META) in btf_verifier_log_vsi()
1545 btf_verifier_log_type(env, datasec_type, NULL); in btf_verifier_log_vsi()
1559 static void btf_verifier_log_hdr(struct btf_verifier_env *env, in btf_verifier_log_hdr() argument
1562 struct bpf_verifier_log *log = &env->log; in btf_verifier_log_hdr()
1563 const struct btf *btf = env->btf; in btf_verifier_log_hdr()
1583 static int btf_add_type(struct btf_verifier_env *env, struct btf_type *t) in btf_add_type() argument
1585 struct btf *btf = env->btf; in btf_add_type()
1594 btf_verifier_log(env, "Exceeded max num of types"); in btf_add_type()
1781 static int env_resolve_init(struct btf_verifier_env *env) in env_resolve_init() argument
1783 struct btf *btf = env->btf; in env_resolve_init()
1806 env->visit_states = visit_states; in env_resolve_init()
1817 static void btf_verifier_env_free(struct btf_verifier_env *env) in btf_verifier_env_free() argument
1819 kvfree(env->visit_states); in btf_verifier_env_free()
1820 kfree(env); in btf_verifier_env_free()
1823 static bool env_type_is_resolve_sink(const struct btf_verifier_env *env, in env_type_is_resolve_sink() argument
1826 switch (env->resolve_mode) { in env_type_is_resolve_sink()
1848 static bool env_type_is_resolved(const struct btf_verifier_env *env, in env_type_is_resolved() argument
1852 if (type_id < env->btf->start_id) in env_type_is_resolved()
1855 return env->visit_states[type_id - env->btf->start_id] == RESOLVED; in env_type_is_resolved()
1858 static int env_stack_push(struct btf_verifier_env *env, in env_stack_push() argument
1861 const struct btf *btf = env->btf; in env_stack_push()
1864 if (env->top_stack == MAX_RESOLVE_DEPTH) in env_stack_push()
1868 || env->visit_states[type_id - btf->start_id] != NOT_VISITED) in env_stack_push()
1871 env->visit_states[type_id - btf->start_id] = VISITED; in env_stack_push()
1873 v = &env->stack[env->top_stack++]; in env_stack_push()
1878 if (env->resolve_mode == RESOLVE_TBD) { in env_stack_push()
1880 env->resolve_mode = RESOLVE_PTR; in env_stack_push()
1882 env->resolve_mode = RESOLVE_STRUCT_OR_ARRAY; in env_stack_push()
1888 static void env_stack_set_next_member(struct btf_verifier_env *env, in env_stack_set_next_member() argument
1891 env->stack[env->top_stack - 1].next_member = next_member; in env_stack_set_next_member()
1894 static void env_stack_pop_resolved(struct btf_verifier_env *env, in env_stack_pop_resolved() argument
1898 u32 type_id = env->stack[--(env->top_stack)].type_id; in env_stack_pop_resolved()
1899 struct btf *btf = env->btf; in env_stack_pop_resolved()
1904 env->visit_states[type_id] = RESOLVED; in env_stack_pop_resolved()
1907 static const struct resolve_vertex *env_stack_peak(struct btf_verifier_env *env) in env_stack_peak() argument
1909 return env->top_stack ? &env->stack[env->top_stack - 1] : NULL; in env_stack_peak()
2076 static int btf_df_check_member(struct btf_verifier_env *env, in btf_df_check_member() argument
2081 btf_verifier_log_basic(env, struct_type, in btf_df_check_member()
2086 static int btf_df_check_kflag_member(struct btf_verifier_env *env, in btf_df_check_kflag_member() argument
2091 btf_verifier_log_basic(env, struct_type, in btf_df_check_kflag_member()
2099 static int btf_generic_check_kflag_member(struct btf_verifier_env *env, in btf_generic_check_kflag_member() argument
2105 btf_verifier_log_member(env, struct_type, member, in btf_generic_check_kflag_member()
2113 return btf_type_ops(member_type)->check_member(env, struct_type, in btf_generic_check_kflag_member()
2118 static int btf_df_resolve(struct btf_verifier_env *env, in btf_df_resolve() argument
2121 btf_verifier_log_basic(env, v->t, "Unsupported resolve"); in btf_df_resolve()
2132 static int btf_int_check_member(struct btf_verifier_env *env, in btf_int_check_member() argument
2144 btf_verifier_log_member(env, struct_type, member, in btf_int_check_member()
2155 btf_verifier_log_member(env, struct_type, member, in btf_int_check_member()
2162 btf_verifier_log_member(env, struct_type, member, in btf_int_check_member()
2170 static int btf_int_check_kflag_member(struct btf_verifier_env *env, in btf_int_check_kflag_member() argument
2182 btf_verifier_log_member(env, struct_type, member, in btf_int_check_kflag_member()
2196 btf_verifier_log_member(env, struct_type, member, in btf_int_check_kflag_member()
2203 btf_verifier_log_member(env, struct_type, member, in btf_int_check_kflag_member()
2211 btf_verifier_log_member(env, struct_type, member, in btf_int_check_kflag_member()
2218 btf_verifier_log_member(env, struct_type, member, in btf_int_check_kflag_member()
2226 static s32 btf_int_check_meta(struct btf_verifier_env *env, in btf_int_check_meta() argument
2234 btf_verifier_log_basic(env, t, in btf_int_check_meta()
2241 btf_verifier_log_type(env, t, "vlen != 0"); in btf_int_check_meta()
2246 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_int_check_meta()
2252 btf_verifier_log_basic(env, t, "Invalid int_data:%x", in btf_int_check_meta()
2260 btf_verifier_log_type(env, t, "nr_bits exceeds %zu", in btf_int_check_meta()
2266 btf_verifier_log_type(env, t, "nr_bits exceeds type_size"); in btf_int_check_meta()
2281 btf_verifier_log_type(env, t, "Unsupported encoding"); in btf_int_check_meta()
2285 btf_verifier_log_type(env, t, NULL); in btf_int_check_meta()
2290 static void btf_int_log(struct btf_verifier_env *env, in btf_int_log() argument
2295 btf_verifier_log(env, in btf_int_log()
2491 static int btf_modifier_check_member(struct btf_verifier_env *env, in btf_modifier_check_member() argument
2499 struct btf *btf = env->btf; in btf_modifier_check_member()
2503 btf_verifier_log_member(env, struct_type, member, in btf_modifier_check_member()
2511 return btf_type_ops(resolved_type)->check_member(env, struct_type, in btf_modifier_check_member()
2516 static int btf_modifier_check_kflag_member(struct btf_verifier_env *env, in btf_modifier_check_kflag_member() argument
2524 struct btf *btf = env->btf; in btf_modifier_check_kflag_member()
2528 btf_verifier_log_member(env, struct_type, member, in btf_modifier_check_kflag_member()
2536 return btf_type_ops(resolved_type)->check_kflag_member(env, struct_type, in btf_modifier_check_kflag_member()
2541 static int btf_ptr_check_member(struct btf_verifier_env *env, in btf_ptr_check_member() argument
2553 btf_verifier_log_member(env, struct_type, member, in btf_ptr_check_member()
2559 btf_verifier_log_member(env, struct_type, member, in btf_ptr_check_member()
2567 static int btf_ref_type_check_meta(struct btf_verifier_env *env, in btf_ref_type_check_meta() argument
2574 btf_verifier_log_type(env, t, "vlen != 0"); in btf_ref_type_check_meta()
2579 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_ref_type_check_meta()
2584 btf_verifier_log_type(env, t, "Invalid type_id"); in btf_ref_type_check_meta()
2593 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_ref_type_check_meta()
2594 btf_verifier_log_type(env, t, "Invalid name"); in btf_ref_type_check_meta()
2598 value = btf_name_by_offset(env->btf, t->name_off); in btf_ref_type_check_meta()
2600 btf_verifier_log_type(env, t, "Invalid name"); in btf_ref_type_check_meta()
2605 btf_verifier_log_type(env, t, "Invalid name"); in btf_ref_type_check_meta()
2610 btf_verifier_log_type(env, t, NULL); in btf_ref_type_check_meta()
2615 static int btf_modifier_resolve(struct btf_verifier_env *env, in btf_modifier_resolve() argument
2621 struct btf *btf = env->btf; in btf_modifier_resolve()
2625 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_modifier_resolve()
2629 if (!env_type_is_resolve_sink(env, next_type) && in btf_modifier_resolve()
2630 !env_type_is_resolved(env, next_type_id)) in btf_modifier_resolve()
2631 return env_stack_push(env, next_type, next_type_id); in btf_modifier_resolve()
2640 if (env_type_is_resolved(env, next_type_id)) in btf_modifier_resolve()
2647 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_modifier_resolve()
2652 env_stack_pop_resolved(env, next_type_id, 0); in btf_modifier_resolve()
2657 static int btf_var_resolve(struct btf_verifier_env *env, in btf_var_resolve() argument
2663 struct btf *btf = env->btf; in btf_var_resolve()
2667 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_var_resolve()
2671 if (!env_type_is_resolve_sink(env, next_type) && in btf_var_resolve()
2672 !env_type_is_resolved(env, next_type_id)) in btf_var_resolve()
2673 return env_stack_push(env, next_type, next_type_id); in btf_var_resolve()
2683 !env_type_is_resolve_sink(env, resolved_type) && in btf_var_resolve()
2684 !env_type_is_resolved(env, resolved_type_id)) in btf_var_resolve()
2685 return env_stack_push(env, resolved_type, in btf_var_resolve()
2694 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_var_resolve()
2698 env_stack_pop_resolved(env, next_type_id, 0); in btf_var_resolve()
2703 static int btf_ptr_resolve(struct btf_verifier_env *env, in btf_ptr_resolve() argument
2709 struct btf *btf = env->btf; in btf_ptr_resolve()
2713 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_ptr_resolve()
2717 if (!env_type_is_resolve_sink(env, next_type) && in btf_ptr_resolve()
2718 !env_type_is_resolved(env, next_type_id)) in btf_ptr_resolve()
2719 return env_stack_push(env, next_type, next_type_id); in btf_ptr_resolve()
2737 !env_type_is_resolve_sink(env, resolved_type) && in btf_ptr_resolve()
2738 !env_type_is_resolved(env, resolved_type_id)) in btf_ptr_resolve()
2739 return env_stack_push(env, resolved_type, in btf_ptr_resolve()
2744 if (env_type_is_resolved(env, next_type_id)) in btf_ptr_resolve()
2750 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_ptr_resolve()
2755 env_stack_pop_resolved(env, next_type_id, 0); in btf_ptr_resolve()
2800 static void btf_ref_type_log(struct btf_verifier_env *env, in btf_ref_type_log() argument
2803 btf_verifier_log(env, "type_id=%u", t->type); in btf_ref_type_log()
2824 static s32 btf_fwd_check_meta(struct btf_verifier_env *env, in btf_fwd_check_meta() argument
2829 btf_verifier_log_type(env, t, "vlen != 0"); in btf_fwd_check_meta()
2834 btf_verifier_log_type(env, t, "type != 0"); in btf_fwd_check_meta()
2840 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_fwd_check_meta()
2841 btf_verifier_log_type(env, t, "Invalid name"); in btf_fwd_check_meta()
2845 btf_verifier_log_type(env, t, NULL); in btf_fwd_check_meta()
2850 static void btf_fwd_type_log(struct btf_verifier_env *env, in btf_fwd_type_log() argument
2853 btf_verifier_log(env, "%s", btf_type_kflag(t) ? "union" : "struct"); in btf_fwd_type_log()
2865 static int btf_array_check_member(struct btf_verifier_env *env, in btf_array_check_member() argument
2873 struct btf *btf = env->btf; in btf_array_check_member()
2876 btf_verifier_log_member(env, struct_type, member, in btf_array_check_member()
2886 btf_verifier_log_member(env, struct_type, member, in btf_array_check_member()
2894 static s32 btf_array_check_meta(struct btf_verifier_env *env, in btf_array_check_meta() argument
2902 btf_verifier_log_basic(env, t, in btf_array_check_meta()
2910 btf_verifier_log_type(env, t, "Invalid name"); in btf_array_check_meta()
2915 btf_verifier_log_type(env, t, "vlen != 0"); in btf_array_check_meta()
2920 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_array_check_meta()
2925 btf_verifier_log_type(env, t, "size != 0"); in btf_array_check_meta()
2933 btf_verifier_log_type(env, t, "Invalid elem"); in btf_array_check_meta()
2938 btf_verifier_log_type(env, t, "Invalid index"); in btf_array_check_meta()
2942 btf_verifier_log_type(env, t, NULL); in btf_array_check_meta()
2947 static int btf_array_resolve(struct btf_verifier_env *env, in btf_array_resolve() argument
2953 struct btf *btf = env->btf; in btf_array_resolve()
2961 btf_verifier_log_type(env, v->t, "Invalid index"); in btf_array_resolve()
2965 if (!env_type_is_resolve_sink(env, index_type) && in btf_array_resolve()
2966 !env_type_is_resolved(env, index_type_id)) in btf_array_resolve()
2967 return env_stack_push(env, index_type, index_type_id); in btf_array_resolve()
2972 btf_verifier_log_type(env, v->t, "Invalid index"); in btf_array_resolve()
2981 btf_verifier_log_type(env, v->t, in btf_array_resolve()
2986 if (!env_type_is_resolve_sink(env, elem_type) && in btf_array_resolve()
2987 !env_type_is_resolved(env, elem_type_id)) in btf_array_resolve()
2988 return env_stack_push(env, elem_type, elem_type_id); in btf_array_resolve()
2992 btf_verifier_log_type(env, v->t, "Invalid elem"); in btf_array_resolve()
2997 btf_verifier_log_type(env, v->t, "Invalid array of int"); in btf_array_resolve()
3002 btf_verifier_log_type(env, v->t, in btf_array_resolve()
3007 env_stack_pop_resolved(env, elem_type_id, elem_size * array->nelems); in btf_array_resolve()
3012 static void btf_array_log(struct btf_verifier_env *env, in btf_array_log() argument
3017 btf_verifier_log(env, "type_id=%u index_type_id=%u nr_elems=%u", in btf_array_log()
3116 static int btf_struct_check_member(struct btf_verifier_env *env, in btf_struct_check_member() argument
3125 btf_verifier_log_member(env, struct_type, member, in btf_struct_check_member()
3133 btf_verifier_log_member(env, struct_type, member, in btf_struct_check_member()
3141 static s32 btf_struct_check_meta(struct btf_verifier_env *env, in btf_struct_check_meta() argument
3148 struct btf *btf = env->btf; in btf_struct_check_meta()
3155 btf_verifier_log_basic(env, t, in btf_struct_check_meta()
3163 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_struct_check_meta()
3164 btf_verifier_log_type(env, t, "Invalid name"); in btf_struct_check_meta()
3168 btf_verifier_log_type(env, t, NULL); in btf_struct_check_meta()
3173 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
3182 btf_verifier_log_member(env, t, member, "Invalid name"); in btf_struct_check_meta()
3187 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
3194 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
3204 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
3210 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
3215 btf_verifier_log_member(env, t, member, NULL); in btf_struct_check_meta()
3222 static int btf_struct_resolve(struct btf_verifier_env *env, in btf_struct_resolve() argument
3240 if (WARN_ON_ONCE(!env_type_is_resolved(env, in btf_struct_resolve()
3244 last_member_type = btf_type_by_id(env->btf, in btf_struct_resolve()
3247 err = btf_type_ops(last_member_type)->check_kflag_member(env, v->t, in btf_struct_resolve()
3251 err = btf_type_ops(last_member_type)->check_member(env, v->t, in btf_struct_resolve()
3260 const struct btf_type *member_type = btf_type_by_id(env->btf, in btf_struct_resolve()
3265 btf_verifier_log_member(env, v->t, member, in btf_struct_resolve()
3270 if (!env_type_is_resolve_sink(env, member_type) && in btf_struct_resolve()
3271 !env_type_is_resolved(env, member_type_id)) { in btf_struct_resolve()
3272 env_stack_set_next_member(env, i + 1); in btf_struct_resolve()
3273 return env_stack_push(env, member_type, member_type_id); in btf_struct_resolve()
3277 err = btf_type_ops(member_type)->check_kflag_member(env, v->t, in btf_struct_resolve()
3281 err = btf_type_ops(member_type)->check_member(env, v->t, in btf_struct_resolve()
3288 env_stack_pop_resolved(env, 0, 0); in btf_struct_resolve()
3293 static void btf_struct_log(struct btf_verifier_env *env, in btf_struct_log() argument
3296 btf_verifier_log(env, "size=%u vlen=%u", t->size, btf_type_vlen(t)); in btf_struct_log()
4222 static int btf_enum_check_member(struct btf_verifier_env *env, in btf_enum_check_member() argument
4231 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_member()
4239 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_member()
4247 static int btf_enum_check_kflag_member(struct btf_verifier_env *env, in btf_enum_check_kflag_member() argument
4259 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_kflag_member()
4266 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_kflag_member()
4274 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_kflag_member()
4282 static s32 btf_enum_check_meta(struct btf_verifier_env *env, in btf_enum_check_meta() argument
4287 struct btf *btf = env->btf; in btf_enum_check_meta()
4296 btf_verifier_log_basic(env, t, in btf_enum_check_meta()
4303 btf_verifier_log_type(env, t, "Unexpected size"); in btf_enum_check_meta()
4309 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_enum_check_meta()
4310 btf_verifier_log_type(env, t, "Invalid name"); in btf_enum_check_meta()
4314 btf_verifier_log_type(env, t, NULL); in btf_enum_check_meta()
4318 btf_verifier_log(env, "\tInvalid name_offset:%u", in btf_enum_check_meta()
4326 btf_verifier_log_type(env, t, "Invalid name"); in btf_enum_check_meta()
4330 if (env->log.level == BPF_LOG_KERNEL) in btf_enum_check_meta()
4333 btf_verifier_log(env, fmt_str, in btf_enum_check_meta()
4341 static void btf_enum_log(struct btf_verifier_env *env, in btf_enum_log() argument
4344 btf_verifier_log(env, "size=%u vlen=%u", t->size, btf_type_vlen(t)); in btf_enum_log()
4390 static s32 btf_enum64_check_meta(struct btf_verifier_env *env, in btf_enum64_check_meta() argument
4395 struct btf *btf = env->btf; in btf_enum64_check_meta()
4404 btf_verifier_log_basic(env, t, in btf_enum64_check_meta()
4411 btf_verifier_log_type(env, t, "Unexpected size"); in btf_enum64_check_meta()
4417 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_enum64_check_meta()
4418 btf_verifier_log_type(env, t, "Invalid name"); in btf_enum64_check_meta()
4422 btf_verifier_log_type(env, t, NULL); in btf_enum64_check_meta()
4426 btf_verifier_log(env, "\tInvalid name_offset:%u", in btf_enum64_check_meta()
4434 btf_verifier_log_type(env, t, "Invalid name"); in btf_enum64_check_meta()
4438 if (env->log.level == BPF_LOG_KERNEL) in btf_enum64_check_meta()
4442 btf_verifier_log(env, fmt_str, in btf_enum64_check_meta()
4493 static s32 btf_func_proto_check_meta(struct btf_verifier_env *env, in btf_func_proto_check_meta() argument
4500 btf_verifier_log_basic(env, t, in btf_func_proto_check_meta()
4507 btf_verifier_log_type(env, t, "Invalid name"); in btf_func_proto_check_meta()
4512 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_func_proto_check_meta()
4516 btf_verifier_log_type(env, t, NULL); in btf_func_proto_check_meta()
4521 static void btf_func_proto_log(struct btf_verifier_env *env, in btf_func_proto_log() argument
4527 btf_verifier_log(env, "return=%u args=(", t->type); in btf_func_proto_log()
4529 btf_verifier_log(env, "void"); in btf_func_proto_log()
4535 btf_verifier_log(env, "vararg"); in btf_func_proto_log()
4539 btf_verifier_log(env, "%u %s", args[0].type, in btf_func_proto_log()
4540 __btf_name_by_offset(env->btf, in btf_func_proto_log()
4543 btf_verifier_log(env, ", %u %s", args[i].type, in btf_func_proto_log()
4544 __btf_name_by_offset(env->btf, in btf_func_proto_log()
4551 btf_verifier_log(env, ", %u %s", last_arg->type, in btf_func_proto_log()
4552 __btf_name_by_offset(env->btf, in btf_func_proto_log()
4555 btf_verifier_log(env, ", vararg"); in btf_func_proto_log()
4559 btf_verifier_log(env, ")"); in btf_func_proto_log()
4580 static s32 btf_func_check_meta(struct btf_verifier_env *env, in btf_func_check_meta() argument
4585 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_func_check_meta()
4586 btf_verifier_log_type(env, t, "Invalid name"); in btf_func_check_meta()
4591 btf_verifier_log_type(env, t, "Invalid func linkage"); in btf_func_check_meta()
4596 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_func_check_meta()
4600 btf_verifier_log_type(env, t, NULL); in btf_func_check_meta()
4605 static int btf_func_resolve(struct btf_verifier_env *env, in btf_func_resolve() argument
4612 err = btf_func_check(env, t); in btf_func_resolve()
4616 env_stack_pop_resolved(env, next_type_id, 0); in btf_func_resolve()
4629 static s32 btf_var_check_meta(struct btf_verifier_env *env, in btf_var_check_meta() argument
4637 btf_verifier_log_basic(env, t, in btf_var_check_meta()
4644 btf_verifier_log_type(env, t, "vlen != 0"); in btf_var_check_meta()
4649 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_var_check_meta()
4654 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_var_check_meta()
4655 btf_verifier_log_type(env, t, "Invalid name"); in btf_var_check_meta()
4661 btf_verifier_log_type(env, t, "Invalid type_id"); in btf_var_check_meta()
4668 btf_verifier_log_type(env, t, "Linkage not supported"); in btf_var_check_meta()
4672 btf_verifier_log_type(env, t, NULL); in btf_var_check_meta()
4677 static void btf_var_log(struct btf_verifier_env *env, const struct btf_type *t) in btf_var_log() argument
4681 btf_verifier_log(env, "type_id=%u linkage=%u", t->type, var->linkage); in btf_var_log()
4693 static s32 btf_datasec_check_meta(struct btf_verifier_env *env, in btf_datasec_check_meta() argument
4703 btf_verifier_log_basic(env, t, in btf_datasec_check_meta()
4710 btf_verifier_log_type(env, t, "size == 0"); in btf_datasec_check_meta()
4715 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_datasec_check_meta()
4720 !btf_name_valid_section(env->btf, t->name_off)) { in btf_datasec_check_meta()
4721 btf_verifier_log_type(env, t, "Invalid name"); in btf_datasec_check_meta()
4725 btf_verifier_log_type(env, t, NULL); in btf_datasec_check_meta()
4730 btf_verifier_log_vsi(env, t, vsi, in btf_datasec_check_meta()
4736 btf_verifier_log_vsi(env, t, vsi, in btf_datasec_check_meta()
4742 btf_verifier_log_vsi(env, t, vsi, in btf_datasec_check_meta()
4749 btf_verifier_log_vsi(env, t, vsi, in btf_datasec_check_meta()
4754 btf_verifier_log_vsi(env, t, vsi, NULL); in btf_datasec_check_meta()
4759 btf_verifier_log_type(env, t, "Invalid btf_info size"); in btf_datasec_check_meta()
4766 static int btf_datasec_resolve(struct btf_verifier_env *env, in btf_datasec_resolve() argument
4770 struct btf *btf = env->btf; in btf_datasec_resolve()
4773 env->resolve_mode = RESOLVE_TBD; in btf_datasec_resolve()
4776 const struct btf_type *var_type = btf_type_by_id(env->btf, in btf_datasec_resolve()
4779 btf_verifier_log_vsi(env, v->t, vsi, in btf_datasec_resolve()
4784 if (!env_type_is_resolve_sink(env, var_type) && in btf_datasec_resolve()
4785 !env_type_is_resolved(env, var_type_id)) { in btf_datasec_resolve()
4786 env_stack_set_next_member(env, i + 1); in btf_datasec_resolve()
4787 return env_stack_push(env, var_type, var_type_id); in btf_datasec_resolve()
4792 btf_verifier_log_vsi(env, v->t, vsi, "Invalid type"); in btf_datasec_resolve()
4797 btf_verifier_log_vsi(env, v->t, vsi, "Invalid size"); in btf_datasec_resolve()
4802 env_stack_pop_resolved(env, 0, 0); in btf_datasec_resolve()
4806 static void btf_datasec_log(struct btf_verifier_env *env, in btf_datasec_log() argument
4809 btf_verifier_log(env, "size=%u vlen=%u", t->size, btf_type_vlen(t)); in btf_datasec_log()
4845 static s32 btf_float_check_meta(struct btf_verifier_env *env, in btf_float_check_meta() argument
4850 btf_verifier_log_type(env, t, "vlen != 0"); in btf_float_check_meta()
4855 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_float_check_meta()
4861 btf_verifier_log_type(env, t, "Invalid type_size"); in btf_float_check_meta()
4865 btf_verifier_log_type(env, t, NULL); in btf_float_check_meta()
4870 static int btf_float_check_member(struct btf_verifier_env *env, in btf_float_check_member() argument
4889 btf_verifier_log_member(env, struct_type, member, in btf_float_check_member()
4897 btf_verifier_log_member(env, struct_type, member, in btf_float_check_member()
4905 static void btf_float_log(struct btf_verifier_env *env, in btf_float_log() argument
4908 btf_verifier_log(env, "size=%u", t->size); in btf_float_log()
4920 static s32 btf_decl_tag_check_meta(struct btf_verifier_env *env, in btf_decl_tag_check_meta() argument
4930 btf_verifier_log_basic(env, t, in btf_decl_tag_check_meta()
4936 value = btf_name_by_offset(env->btf, t->name_off); in btf_decl_tag_check_meta()
4938 btf_verifier_log_type(env, t, "Invalid value"); in btf_decl_tag_check_meta()
4943 btf_verifier_log_type(env, t, "vlen != 0"); in btf_decl_tag_check_meta()
4948 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_decl_tag_check_meta()
4954 btf_verifier_log_type(env, t, "Invalid component_idx"); in btf_decl_tag_check_meta()
4958 btf_verifier_log_type(env, t, NULL); in btf_decl_tag_check_meta()
4963 static int btf_decl_tag_resolve(struct btf_verifier_env *env, in btf_decl_tag_resolve() argument
4969 struct btf *btf = env->btf; in btf_decl_tag_resolve()
4975 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_decl_tag_resolve()
4979 if (!env_type_is_resolve_sink(env, next_type) && in btf_decl_tag_resolve()
4980 !env_type_is_resolved(env, next_type_id)) in btf_decl_tag_resolve()
4981 return env_stack_push(env, next_type, next_type_id); in btf_decl_tag_resolve()
4986 btf_verifier_log_type(env, v->t, "Invalid component_idx"); in btf_decl_tag_resolve()
4999 btf_verifier_log_type(env, v->t, "Invalid component_idx"); in btf_decl_tag_resolve()
5004 env_stack_pop_resolved(env, next_type_id, 0); in btf_decl_tag_resolve()
5009 static void btf_decl_tag_log(struct btf_verifier_env *env, const struct btf_type *t) in btf_decl_tag_log() argument
5011 btf_verifier_log(env, "type=%u component_idx=%d", t->type, in btf_decl_tag_log()
5024 static int btf_func_proto_check(struct btf_verifier_env *env, in btf_func_proto_check() argument
5033 btf = env->btf; in btf_func_proto_check()
5043 btf_verifier_log_type(env, t, "Invalid return type"); in btf_func_proto_check()
5048 btf_verifier_log_type(env, t, "Invalid return type"); in btf_func_proto_check()
5053 !env_type_is_resolved(env, ret_type_id)) { in btf_func_proto_check()
5054 err = btf_resolve(env, ret_type, ret_type_id); in btf_func_proto_check()
5061 btf_verifier_log_type(env, t, "Invalid return type"); in btf_func_proto_check()
5072 btf_verifier_log_type(env, t, "Invalid arg#%u", in btf_func_proto_check()
5086 btf_verifier_log_type(env, t, "Invalid arg#%u", i + 1); in btf_func_proto_check()
5091 btf_verifier_log_type(env, t, "Invalid arg#%u", i + 1); in btf_func_proto_check()
5098 btf_verifier_log_type(env, t, in btf_func_proto_check()
5104 !env_type_is_resolved(env, arg_type_id)) { in btf_func_proto_check()
5105 err = btf_resolve(env, arg_type, arg_type_id); in btf_func_proto_check()
5111 btf_verifier_log_type(env, t, "Invalid arg#%u", i + 1); in btf_func_proto_check()
5119 static int btf_func_check(struct btf_verifier_env *env, in btf_func_check() argument
5127 btf = env->btf; in btf_func_check()
5131 btf_verifier_log_type(env, t, "Invalid type_id"); in btf_func_check()
5139 btf_verifier_log_type(env, t, "Invalid arg#%u", i + 1); in btf_func_check()
5169 static s32 btf_check_meta(struct btf_verifier_env *env, in btf_check_meta() argument
5177 btf_verifier_log(env, "[%u] meta_left:%u meta_needed:%zu", in btf_check_meta()
5178 env->log_type_id, meta_left, sizeof(*t)); in btf_check_meta()
5184 btf_verifier_log(env, "[%u] Invalid btf_info:%x", in btf_check_meta()
5185 env->log_type_id, t->info); in btf_check_meta()
5191 btf_verifier_log(env, "[%u] Invalid kind:%u", in btf_check_meta()
5192 env->log_type_id, BTF_INFO_KIND(t->info)); in btf_check_meta()
5196 if (!btf_name_offset_valid(env->btf, t->name_off)) { in btf_check_meta()
5197 btf_verifier_log(env, "[%u] Invalid name_offset:%u", in btf_check_meta()
5198 env->log_type_id, t->name_off); in btf_check_meta()
5202 var_meta_size = btf_type_ops(t)->check_meta(env, t, meta_left); in btf_check_meta()
5211 static int btf_check_all_metas(struct btf_verifier_env *env) in btf_check_all_metas() argument
5213 struct btf *btf = env->btf; in btf_check_all_metas()
5221 env->log_type_id = btf->base_btf ? btf->start_id : 1; in btf_check_all_metas()
5226 meta_size = btf_check_meta(env, t, end - cur); in btf_check_all_metas()
5230 btf_add_type(env, t); in btf_check_all_metas()
5232 env->log_type_id++; in btf_check_all_metas()
5238 static bool btf_resolve_valid(struct btf_verifier_env *env, in btf_resolve_valid() argument
5242 struct btf *btf = env->btf; in btf_resolve_valid()
5244 if (!env_type_is_resolved(env, type_id)) in btf_resolve_valid()
5279 static int btf_resolve(struct btf_verifier_env *env, in btf_resolve() argument
5282 u32 save_log_type_id = env->log_type_id; in btf_resolve()
5286 env->resolve_mode = RESOLVE_TBD; in btf_resolve()
5287 env_stack_push(env, t, type_id); in btf_resolve()
5288 while (!err && (v = env_stack_peak(env))) { in btf_resolve()
5289 env->log_type_id = v->type_id; in btf_resolve()
5290 err = btf_type_ops(v->t)->resolve(env, v); in btf_resolve()
5293 env->log_type_id = type_id; in btf_resolve()
5295 btf_verifier_log_type(env, t, in btf_resolve()
5299 btf_verifier_log_type(env, t, "Loop detected"); in btf_resolve()
5303 if (!err && !btf_resolve_valid(env, t, type_id)) { in btf_resolve()
5304 btf_verifier_log_type(env, t, "Invalid resolve state"); in btf_resolve()
5308 env->log_type_id = save_log_type_id; in btf_resolve()
5312 static int btf_check_all_types(struct btf_verifier_env *env) in btf_check_all_types() argument
5314 struct btf *btf = env->btf; in btf_check_all_types()
5319 err = env_resolve_init(env); in btf_check_all_types()
5323 env->phase++; in btf_check_all_types()
5328 env->log_type_id = type_id; in btf_check_all_types()
5330 !env_type_is_resolved(env, type_id)) { in btf_check_all_types()
5331 err = btf_resolve(env, t, type_id); in btf_check_all_types()
5337 err = btf_func_proto_check(env, t); in btf_check_all_types()
5346 static int btf_parse_type_sec(struct btf_verifier_env *env) in btf_parse_type_sec() argument
5348 const struct btf_header *hdr = &env->btf->hdr; in btf_parse_type_sec()
5353 btf_verifier_log(env, "Unaligned type_off"); in btf_parse_type_sec()
5357 if (!env->btf->base_btf && !hdr->type_len) { in btf_parse_type_sec()
5358 btf_verifier_log(env, "No type found"); in btf_parse_type_sec()
5362 err = btf_check_all_metas(env); in btf_parse_type_sec()
5366 return btf_check_all_types(env); in btf_parse_type_sec()
5369 static int btf_parse_str_sec(struct btf_verifier_env *env) in btf_parse_str_sec() argument
5372 struct btf *btf = env->btf; in btf_parse_str_sec()
5380 btf_verifier_log(env, "String section is not at the end"); in btf_parse_str_sec()
5389 btf_verifier_log(env, "Invalid string section"); in btf_parse_str_sec()
5393 btf_verifier_log(env, "Invalid string section"); in btf_parse_str_sec()
5413 static int btf_check_sec_info(struct btf_verifier_env *env, in btf_check_sec_info() argument
5421 btf = env->btf; in btf_check_sec_info()
5437 btf_verifier_log(env, "Invalid section offset"); in btf_check_sec_info()
5442 btf_verifier_log(env, "Unsupported section found"); in btf_check_sec_info()
5446 btf_verifier_log(env, "Section overlap found"); in btf_check_sec_info()
5450 btf_verifier_log(env, in btf_check_sec_info()
5459 btf_verifier_log(env, "Unsupported section found"); in btf_check_sec_info()
5466 static int btf_parse_hdr(struct btf_verifier_env *env) in btf_parse_hdr() argument
5472 btf = env->btf; in btf_parse_hdr()
5476 btf_verifier_log(env, "hdr_len not found"); in btf_parse_hdr()
5483 btf_verifier_log(env, "btf_header not found"); in btf_parse_hdr()
5494 btf_verifier_log(env, "Unsupported btf_header"); in btf_parse_hdr()
5505 btf_verifier_log_hdr(env, btf_data_size); in btf_parse_hdr()
5508 btf_verifier_log(env, "Invalid magic"); in btf_parse_hdr()
5513 btf_verifier_log(env, "Unsupported version"); in btf_parse_hdr()
5518 btf_verifier_log(env, "Unsupported flags"); in btf_parse_hdr()
5523 btf_verifier_log(env, "No data"); in btf_parse_hdr()
5527 return btf_check_sec_info(env, btf_data_size); in btf_parse_hdr()
5672 static int btf_check_type_tags(struct btf_verifier_env *env, in btf_check_type_tags() argument
5695 btf_verifier_log(env, "Max chain length or cycle detected"); in btf_check_type_tags()
5700 btf_verifier_log(env, "Type tags don't precede modifiers"); in btf_check_type_tags()
5739 struct btf_verifier_env *env = NULL; in btf_parse() local
5747 env = kzalloc(sizeof(*env), GFP_KERNEL | __GFP_NOWARN); in btf_parse()
5748 if (!env) in btf_parse()
5754 err = bpf_vlog_init(&env->log, attr->btf_log_level, in btf_parse()
5764 env->btf = btf; in btf_parse()
5780 err = btf_parse_hdr(env); in btf_parse()
5786 err = btf_parse_str_sec(env); in btf_parse()
5790 err = btf_parse_type_sec(env); in btf_parse()
5794 err = btf_check_type_tags(env, btf, 1); in btf_parse()
5798 struct_meta_tab = btf_parse_struct_metas(&env->log, btf); in btf_parse()
5815 err = finalize_log(&env->log, uattr, uattr_size); in btf_parse()
5819 btf_verifier_env_free(env); in btf_parse()
5827 ret = finalize_log(&env->log, uattr, uattr_size); in btf_parse()
5831 btf_verifier_env_free(env); in btf_parse()
6166 static struct btf *btf_parse_base(struct btf_verifier_env *env, const char *name, in BTF_ID()
6180 env->btf = btf; in BTF_ID()
6187 err = btf_parse_hdr(env); in BTF_ID()
6193 err = btf_parse_str_sec(env); in BTF_ID()
6197 err = btf_check_all_metas(env); in BTF_ID()
6201 err = btf_check_type_tags(env, btf, 1); in BTF_ID()
6219 struct btf_verifier_env *env = NULL; in btf_parse_vmlinux() local
6224 env = kzalloc(sizeof(*env), GFP_KERNEL | __GFP_NOWARN); in btf_parse_vmlinux()
6225 if (!env) in btf_parse_vmlinux()
6228 log = &env->log; in btf_parse_vmlinux()
6230 btf = btf_parse_base(env, "vmlinux", __start_BTF, __stop_BTF - __start_BTF); in btf_parse_vmlinux()
6242 btf_verifier_env_free(env); in btf_parse_vmlinux()
6264 struct btf_verifier_env *env = NULL; in btf_parse_module() local
6274 env = kzalloc(sizeof(*env), GFP_KERNEL | __GFP_NOWARN); in btf_parse_module()
6275 if (!env) in btf_parse_module()
6278 log = &env->log; in btf_parse_module()
6282 base_btf = btf_parse_base(env, ".BTF.base", base_data, base_data_size); in btf_parse_module()
6296 env->btf = btf; in btf_parse_module()
6311 err = btf_parse_hdr(env); in btf_parse_module()
6317 err = btf_parse_str_sec(env); in btf_parse_module()
6321 err = btf_check_all_metas(env); in btf_parse_module()
6325 err = btf_check_type_tags(env, btf, btf_nr_types(base_btf)); in btf_parse_module()
6337 btf_verifier_env_free(env); in btf_parse_module()
6342 btf_verifier_env_free(env); in btf_parse_module()
7527 int btf_prepare_func_args(struct bpf_verifier_env *env, int subprog) in btf_prepare_func_args() argument
7529 bool is_global = subprog_aux(env, subprog)->linkage == BTF_FUNC_GLOBAL; in btf_prepare_func_args()
7530 struct bpf_subprog_info *sub = subprog_info(env, subprog); in btf_prepare_func_args()
7531 struct bpf_verifier_log *log = &env->log; in btf_prepare_func_args()
7532 struct bpf_prog *prog = env->prog; in btf_prepare_func_args()