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,
1416 __printf(2, 3) static void btf_verifier_log(struct btf_verifier_env *env, in btf_verifier_log() argument
1419 struct bpf_verifier_log *log = &env->log; in btf_verifier_log()
1430 __printf(4, 5) static void __btf_verifier_log_type(struct btf_verifier_env *env, in __btf_verifier_log_type() argument
1435 struct bpf_verifier_log *log = &env->log; in __btf_verifier_log_type()
1436 struct btf *btf = env->btf; in __btf_verifier_log_type()
1451 if (env->btf->base_btf && IS_ENABLED(CONFIG_MODULE_ALLOW_BTF_MISMATCH)) in __btf_verifier_log_type()
1456 env->log_type_id, in __btf_verifier_log_type()
1462 btf_type_ops(t)->log_details(env, t); in __btf_verifier_log_type()
1474 #define btf_verifier_log_type(env, t, ...) \ argument
1475 __btf_verifier_log_type((env), (t), true, __VA_ARGS__)
1476 #define btf_verifier_log_basic(env, t, ...) \ argument
1477 __btf_verifier_log_type((env), (t), false, __VA_ARGS__)
1480 static void btf_verifier_log_member(struct btf_verifier_env *env, in btf_verifier_log_member() argument
1485 struct bpf_verifier_log *log = &env->log; in btf_verifier_log_member()
1486 struct btf *btf = env->btf; in btf_verifier_log_member()
1497 if (env->btf->base_btf && IS_ENABLED(CONFIG_MODULE_ALLOW_BTF_MISMATCH)) in btf_verifier_log_member()
1507 if (env->phase != CHECK_META) in btf_verifier_log_member()
1508 btf_verifier_log_type(env, struct_type, NULL); in btf_verifier_log_member()
1533 static void btf_verifier_log_vsi(struct btf_verifier_env *env, in btf_verifier_log_vsi() argument
1538 struct bpf_verifier_log *log = &env->log; in btf_verifier_log_vsi()
1545 if (env->phase != CHECK_META) in btf_verifier_log_vsi()
1546 btf_verifier_log_type(env, datasec_type, NULL); in btf_verifier_log_vsi()
1560 static void btf_verifier_log_hdr(struct btf_verifier_env *env, in btf_verifier_log_hdr() argument
1563 struct bpf_verifier_log *log = &env->log; in btf_verifier_log_hdr()
1564 const struct btf *btf = env->btf; in btf_verifier_log_hdr()
1584 static int btf_add_type(struct btf_verifier_env *env, struct btf_type *t) in btf_add_type() argument
1586 struct btf *btf = env->btf; in btf_add_type()
1595 btf_verifier_log(env, "Exceeded max num of types"); in btf_add_type()
1782 static int env_resolve_init(struct btf_verifier_env *env) in env_resolve_init() argument
1784 struct btf *btf = env->btf; in env_resolve_init()
1807 env->visit_states = visit_states; in env_resolve_init()
1818 static void btf_verifier_env_free(struct btf_verifier_env *env) in btf_verifier_env_free() argument
1820 kvfree(env->visit_states); in btf_verifier_env_free()
1821 kfree(env); in btf_verifier_env_free()
1824 static bool env_type_is_resolve_sink(const struct btf_verifier_env *env, in env_type_is_resolve_sink() argument
1827 switch (env->resolve_mode) { in env_type_is_resolve_sink()
1849 static bool env_type_is_resolved(const struct btf_verifier_env *env, in env_type_is_resolved() argument
1853 if (type_id < env->btf->start_id) in env_type_is_resolved()
1856 return env->visit_states[type_id - env->btf->start_id] == RESOLVED; in env_type_is_resolved()
1859 static int env_stack_push(struct btf_verifier_env *env, in env_stack_push() argument
1862 const struct btf *btf = env->btf; in env_stack_push()
1865 if (env->top_stack == MAX_RESOLVE_DEPTH) in env_stack_push()
1869 || env->visit_states[type_id - btf->start_id] != NOT_VISITED) in env_stack_push()
1872 env->visit_states[type_id - btf->start_id] = VISITED; in env_stack_push()
1874 v = &env->stack[env->top_stack++]; in env_stack_push()
1879 if (env->resolve_mode == RESOLVE_TBD) { in env_stack_push()
1881 env->resolve_mode = RESOLVE_PTR; in env_stack_push()
1883 env->resolve_mode = RESOLVE_STRUCT_OR_ARRAY; in env_stack_push()
1889 static void env_stack_set_next_member(struct btf_verifier_env *env, in env_stack_set_next_member() argument
1892 env->stack[env->top_stack - 1].next_member = next_member; in env_stack_set_next_member()
1895 static void env_stack_pop_resolved(struct btf_verifier_env *env, in env_stack_pop_resolved() argument
1899 u32 type_id = env->stack[--(env->top_stack)].type_id; in env_stack_pop_resolved()
1900 struct btf *btf = env->btf; in env_stack_pop_resolved()
1905 env->visit_states[type_id] = RESOLVED; in env_stack_pop_resolved()
1908 static const struct resolve_vertex *env_stack_peak(struct btf_verifier_env *env) in env_stack_peak() argument
1910 return env->top_stack ? &env->stack[env->top_stack - 1] : NULL; in env_stack_peak()
2077 static int btf_df_check_member(struct btf_verifier_env *env, in btf_df_check_member() argument
2082 btf_verifier_log_basic(env, struct_type, in btf_df_check_member()
2087 static int btf_df_check_kflag_member(struct btf_verifier_env *env, in btf_df_check_kflag_member() argument
2092 btf_verifier_log_basic(env, struct_type, in btf_df_check_kflag_member()
2100 static int btf_generic_check_kflag_member(struct btf_verifier_env *env, in btf_generic_check_kflag_member() argument
2106 btf_verifier_log_member(env, struct_type, member, in btf_generic_check_kflag_member()
2114 return btf_type_ops(member_type)->check_member(env, struct_type, in btf_generic_check_kflag_member()
2119 static int btf_df_resolve(struct btf_verifier_env *env, in btf_df_resolve() argument
2122 btf_verifier_log_basic(env, v->t, "Unsupported resolve"); in btf_df_resolve()
2133 static int btf_int_check_member(struct btf_verifier_env *env, in btf_int_check_member() argument
2145 btf_verifier_log_member(env, struct_type, member, in btf_int_check_member()
2156 btf_verifier_log_member(env, struct_type, member, in btf_int_check_member()
2163 btf_verifier_log_member(env, struct_type, member, in btf_int_check_member()
2171 static int btf_int_check_kflag_member(struct btf_verifier_env *env, in btf_int_check_kflag_member() argument
2183 btf_verifier_log_member(env, struct_type, member, in btf_int_check_kflag_member()
2197 btf_verifier_log_member(env, struct_type, member, in btf_int_check_kflag_member()
2204 btf_verifier_log_member(env, struct_type, member, in btf_int_check_kflag_member()
2212 btf_verifier_log_member(env, struct_type, member, in btf_int_check_kflag_member()
2219 btf_verifier_log_member(env, struct_type, member, in btf_int_check_kflag_member()
2227 static s32 btf_int_check_meta(struct btf_verifier_env *env, in btf_int_check_meta() argument
2235 btf_verifier_log_basic(env, t, in btf_int_check_meta()
2242 btf_verifier_log_type(env, t, "vlen != 0"); in btf_int_check_meta()
2247 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_int_check_meta()
2253 btf_verifier_log_basic(env, t, "Invalid int_data:%x", in btf_int_check_meta()
2261 btf_verifier_log_type(env, t, "nr_bits exceeds %zu", in btf_int_check_meta()
2267 btf_verifier_log_type(env, t, "nr_bits exceeds type_size"); in btf_int_check_meta()
2282 btf_verifier_log_type(env, t, "Unsupported encoding"); in btf_int_check_meta()
2286 btf_verifier_log_type(env, t, NULL); in btf_int_check_meta()
2291 static void btf_int_log(struct btf_verifier_env *env, in btf_int_log() argument
2296 btf_verifier_log(env, in btf_int_log()
2492 static int btf_modifier_check_member(struct btf_verifier_env *env, in btf_modifier_check_member() argument
2500 struct btf *btf = env->btf; in btf_modifier_check_member()
2504 btf_verifier_log_member(env, struct_type, member, in btf_modifier_check_member()
2512 return btf_type_ops(resolved_type)->check_member(env, struct_type, in btf_modifier_check_member()
2517 static int btf_modifier_check_kflag_member(struct btf_verifier_env *env, in btf_modifier_check_kflag_member() argument
2525 struct btf *btf = env->btf; in btf_modifier_check_kflag_member()
2529 btf_verifier_log_member(env, struct_type, member, in btf_modifier_check_kflag_member()
2537 return btf_type_ops(resolved_type)->check_kflag_member(env, struct_type, in btf_modifier_check_kflag_member()
2542 static int btf_ptr_check_member(struct btf_verifier_env *env, in btf_ptr_check_member() argument
2554 btf_verifier_log_member(env, struct_type, member, in btf_ptr_check_member()
2560 btf_verifier_log_member(env, struct_type, member, in btf_ptr_check_member()
2568 static int btf_ref_type_check_meta(struct btf_verifier_env *env, in btf_ref_type_check_meta() argument
2575 btf_verifier_log_type(env, t, "vlen != 0"); in btf_ref_type_check_meta()
2580 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_ref_type_check_meta()
2585 btf_verifier_log_type(env, t, "Invalid type_id"); in btf_ref_type_check_meta()
2594 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_ref_type_check_meta()
2595 btf_verifier_log_type(env, t, "Invalid name"); in btf_ref_type_check_meta()
2599 value = btf_name_by_offset(env->btf, t->name_off); in btf_ref_type_check_meta()
2601 btf_verifier_log_type(env, t, "Invalid name"); in btf_ref_type_check_meta()
2606 btf_verifier_log_type(env, t, "Invalid name"); in btf_ref_type_check_meta()
2611 btf_verifier_log_type(env, t, NULL); in btf_ref_type_check_meta()
2616 static int btf_modifier_resolve(struct btf_verifier_env *env, in btf_modifier_resolve() argument
2622 struct btf *btf = env->btf; in btf_modifier_resolve()
2626 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_modifier_resolve()
2630 if (!env_type_is_resolve_sink(env, next_type) && in btf_modifier_resolve()
2631 !env_type_is_resolved(env, next_type_id)) in btf_modifier_resolve()
2632 return env_stack_push(env, next_type, next_type_id); in btf_modifier_resolve()
2641 if (env_type_is_resolved(env, next_type_id)) in btf_modifier_resolve()
2648 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_modifier_resolve()
2653 env_stack_pop_resolved(env, next_type_id, 0); in btf_modifier_resolve()
2658 static int btf_var_resolve(struct btf_verifier_env *env, in btf_var_resolve() argument
2664 struct btf *btf = env->btf; in btf_var_resolve()
2668 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_var_resolve()
2672 if (!env_type_is_resolve_sink(env, next_type) && in btf_var_resolve()
2673 !env_type_is_resolved(env, next_type_id)) in btf_var_resolve()
2674 return env_stack_push(env, next_type, next_type_id); in btf_var_resolve()
2684 !env_type_is_resolve_sink(env, resolved_type) && in btf_var_resolve()
2685 !env_type_is_resolved(env, resolved_type_id)) in btf_var_resolve()
2686 return env_stack_push(env, resolved_type, in btf_var_resolve()
2695 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_var_resolve()
2699 env_stack_pop_resolved(env, next_type_id, 0); in btf_var_resolve()
2704 static int btf_ptr_resolve(struct btf_verifier_env *env, in btf_ptr_resolve() argument
2710 struct btf *btf = env->btf; in btf_ptr_resolve()
2714 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_ptr_resolve()
2718 if (!env_type_is_resolve_sink(env, next_type) && in btf_ptr_resolve()
2719 !env_type_is_resolved(env, next_type_id)) in btf_ptr_resolve()
2720 return env_stack_push(env, next_type, next_type_id); in btf_ptr_resolve()
2738 !env_type_is_resolve_sink(env, resolved_type) && in btf_ptr_resolve()
2739 !env_type_is_resolved(env, resolved_type_id)) in btf_ptr_resolve()
2740 return env_stack_push(env, resolved_type, in btf_ptr_resolve()
2745 if (env_type_is_resolved(env, next_type_id)) in btf_ptr_resolve()
2751 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_ptr_resolve()
2756 env_stack_pop_resolved(env, next_type_id, 0); in btf_ptr_resolve()
2801 static void btf_ref_type_log(struct btf_verifier_env *env, in btf_ref_type_log() argument
2804 btf_verifier_log(env, "type_id=%u", t->type); in btf_ref_type_log()
2825 static s32 btf_fwd_check_meta(struct btf_verifier_env *env, in btf_fwd_check_meta() argument
2830 btf_verifier_log_type(env, t, "vlen != 0"); in btf_fwd_check_meta()
2835 btf_verifier_log_type(env, t, "type != 0"); in btf_fwd_check_meta()
2841 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_fwd_check_meta()
2842 btf_verifier_log_type(env, t, "Invalid name"); in btf_fwd_check_meta()
2846 btf_verifier_log_type(env, t, NULL); in btf_fwd_check_meta()
2851 static void btf_fwd_type_log(struct btf_verifier_env *env, in btf_fwd_type_log() argument
2854 btf_verifier_log(env, "%s", btf_type_kflag(t) ? "union" : "struct"); in btf_fwd_type_log()
2866 static int btf_array_check_member(struct btf_verifier_env *env, in btf_array_check_member() argument
2874 struct btf *btf = env->btf; in btf_array_check_member()
2877 btf_verifier_log_member(env, struct_type, member, in btf_array_check_member()
2887 btf_verifier_log_member(env, struct_type, member, in btf_array_check_member()
2895 static s32 btf_array_check_meta(struct btf_verifier_env *env, in btf_array_check_meta() argument
2903 btf_verifier_log_basic(env, t, in btf_array_check_meta()
2911 btf_verifier_log_type(env, t, "Invalid name"); in btf_array_check_meta()
2916 btf_verifier_log_type(env, t, "vlen != 0"); in btf_array_check_meta()
2921 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_array_check_meta()
2926 btf_verifier_log_type(env, t, "size != 0"); in btf_array_check_meta()
2934 btf_verifier_log_type(env, t, "Invalid elem"); in btf_array_check_meta()
2939 btf_verifier_log_type(env, t, "Invalid index"); in btf_array_check_meta()
2943 btf_verifier_log_type(env, t, NULL); in btf_array_check_meta()
2948 static int btf_array_resolve(struct btf_verifier_env *env, in btf_array_resolve() argument
2954 struct btf *btf = env->btf; in btf_array_resolve()
2962 btf_verifier_log_type(env, v->t, "Invalid index"); in btf_array_resolve()
2966 if (!env_type_is_resolve_sink(env, index_type) && in btf_array_resolve()
2967 !env_type_is_resolved(env, index_type_id)) in btf_array_resolve()
2968 return env_stack_push(env, index_type, index_type_id); in btf_array_resolve()
2973 btf_verifier_log_type(env, v->t, "Invalid index"); in btf_array_resolve()
2982 btf_verifier_log_type(env, v->t, in btf_array_resolve()
2987 if (!env_type_is_resolve_sink(env, elem_type) && in btf_array_resolve()
2988 !env_type_is_resolved(env, elem_type_id)) in btf_array_resolve()
2989 return env_stack_push(env, elem_type, elem_type_id); in btf_array_resolve()
2993 btf_verifier_log_type(env, v->t, "Invalid elem"); in btf_array_resolve()
2998 btf_verifier_log_type(env, v->t, "Invalid array of int"); in btf_array_resolve()
3003 btf_verifier_log_type(env, v->t, in btf_array_resolve()
3008 env_stack_pop_resolved(env, elem_type_id, elem_size * array->nelems); in btf_array_resolve()
3013 static void btf_array_log(struct btf_verifier_env *env, in btf_array_log() argument
3018 btf_verifier_log(env, "type_id=%u index_type_id=%u nr_elems=%u", in btf_array_log()
3117 static int btf_struct_check_member(struct btf_verifier_env *env, in btf_struct_check_member() argument
3126 btf_verifier_log_member(env, struct_type, member, in btf_struct_check_member()
3134 btf_verifier_log_member(env, struct_type, member, in btf_struct_check_member()
3142 static s32 btf_struct_check_meta(struct btf_verifier_env *env, in btf_struct_check_meta() argument
3149 struct btf *btf = env->btf; in btf_struct_check_meta()
3156 btf_verifier_log_basic(env, t, in btf_struct_check_meta()
3164 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_struct_check_meta()
3165 btf_verifier_log_type(env, t, "Invalid name"); in btf_struct_check_meta()
3169 btf_verifier_log_type(env, t, NULL); in btf_struct_check_meta()
3174 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
3183 btf_verifier_log_member(env, t, member, "Invalid name"); in btf_struct_check_meta()
3188 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
3195 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
3205 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
3211 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
3216 btf_verifier_log_member(env, t, member, NULL); in btf_struct_check_meta()
3223 static int btf_struct_resolve(struct btf_verifier_env *env, in btf_struct_resolve() argument
3241 if (WARN_ON_ONCE(!env_type_is_resolved(env, in btf_struct_resolve()
3245 last_member_type = btf_type_by_id(env->btf, in btf_struct_resolve()
3248 err = btf_type_ops(last_member_type)->check_kflag_member(env, v->t, in btf_struct_resolve()
3252 err = btf_type_ops(last_member_type)->check_member(env, v->t, in btf_struct_resolve()
3261 const struct btf_type *member_type = btf_type_by_id(env->btf, in btf_struct_resolve()
3266 btf_verifier_log_member(env, v->t, member, in btf_struct_resolve()
3271 if (!env_type_is_resolve_sink(env, member_type) && in btf_struct_resolve()
3272 !env_type_is_resolved(env, member_type_id)) { in btf_struct_resolve()
3273 env_stack_set_next_member(env, i + 1); in btf_struct_resolve()
3274 return env_stack_push(env, member_type, member_type_id); in btf_struct_resolve()
3278 err = btf_type_ops(member_type)->check_kflag_member(env, v->t, in btf_struct_resolve()
3282 err = btf_type_ops(member_type)->check_member(env, v->t, in btf_struct_resolve()
3289 env_stack_pop_resolved(env, 0, 0); in btf_struct_resolve()
3294 static void btf_struct_log(struct btf_verifier_env *env, in btf_struct_log() argument
3297 btf_verifier_log(env, "size=%u vlen=%u", t->size, btf_type_vlen(t)); in btf_struct_log()
4248 static int btf_enum_check_member(struct btf_verifier_env *env, in btf_enum_check_member() argument
4257 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_member()
4265 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_member()
4273 static int btf_enum_check_kflag_member(struct btf_verifier_env *env, in btf_enum_check_kflag_member() argument
4285 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_kflag_member()
4292 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_kflag_member()
4300 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_kflag_member()
4308 static s32 btf_enum_check_meta(struct btf_verifier_env *env, in btf_enum_check_meta() argument
4313 struct btf *btf = env->btf; in btf_enum_check_meta()
4322 btf_verifier_log_basic(env, t, in btf_enum_check_meta()
4329 btf_verifier_log_type(env, t, "Unexpected size"); in btf_enum_check_meta()
4335 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_enum_check_meta()
4336 btf_verifier_log_type(env, t, "Invalid name"); in btf_enum_check_meta()
4340 btf_verifier_log_type(env, t, NULL); in btf_enum_check_meta()
4344 btf_verifier_log(env, "\tInvalid name_offset:%u", in btf_enum_check_meta()
4352 btf_verifier_log_type(env, t, "Invalid name"); in btf_enum_check_meta()
4356 if (env->log.level == BPF_LOG_KERNEL) in btf_enum_check_meta()
4359 btf_verifier_log(env, fmt_str, in btf_enum_check_meta()
4367 static void btf_enum_log(struct btf_verifier_env *env, in btf_enum_log() argument
4370 btf_verifier_log(env, "size=%u vlen=%u", t->size, btf_type_vlen(t)); in btf_enum_log()
4416 static s32 btf_enum64_check_meta(struct btf_verifier_env *env, in btf_enum64_check_meta() argument
4421 struct btf *btf = env->btf; in btf_enum64_check_meta()
4430 btf_verifier_log_basic(env, t, in btf_enum64_check_meta()
4437 btf_verifier_log_type(env, t, "Unexpected size"); in btf_enum64_check_meta()
4443 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_enum64_check_meta()
4444 btf_verifier_log_type(env, t, "Invalid name"); in btf_enum64_check_meta()
4448 btf_verifier_log_type(env, t, NULL); in btf_enum64_check_meta()
4452 btf_verifier_log(env, "\tInvalid name_offset:%u", in btf_enum64_check_meta()
4460 btf_verifier_log_type(env, t, "Invalid name"); in btf_enum64_check_meta()
4464 if (env->log.level == BPF_LOG_KERNEL) in btf_enum64_check_meta()
4468 btf_verifier_log(env, fmt_str, in btf_enum64_check_meta()
4519 static s32 btf_func_proto_check_meta(struct btf_verifier_env *env, in btf_func_proto_check_meta() argument
4526 btf_verifier_log_basic(env, t, in btf_func_proto_check_meta()
4533 btf_verifier_log_type(env, t, "Invalid name"); in btf_func_proto_check_meta()
4538 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_func_proto_check_meta()
4542 btf_verifier_log_type(env, t, NULL); in btf_func_proto_check_meta()
4547 static void btf_func_proto_log(struct btf_verifier_env *env, in btf_func_proto_log() argument
4553 btf_verifier_log(env, "return=%u args=(", t->type); in btf_func_proto_log()
4555 btf_verifier_log(env, "void"); in btf_func_proto_log()
4561 btf_verifier_log(env, "vararg"); in btf_func_proto_log()
4565 btf_verifier_log(env, "%u %s", args[0].type, in btf_func_proto_log()
4566 __btf_name_by_offset(env->btf, in btf_func_proto_log()
4569 btf_verifier_log(env, ", %u %s", args[i].type, in btf_func_proto_log()
4570 __btf_name_by_offset(env->btf, in btf_func_proto_log()
4577 btf_verifier_log(env, ", %u %s", last_arg->type, in btf_func_proto_log()
4578 __btf_name_by_offset(env->btf, in btf_func_proto_log()
4581 btf_verifier_log(env, ", vararg"); in btf_func_proto_log()
4585 btf_verifier_log(env, ")"); in btf_func_proto_log()
4606 static s32 btf_func_check_meta(struct btf_verifier_env *env, in btf_func_check_meta() argument
4611 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_func_check_meta()
4612 btf_verifier_log_type(env, t, "Invalid name"); in btf_func_check_meta()
4617 btf_verifier_log_type(env, t, "Invalid func linkage"); in btf_func_check_meta()
4622 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_func_check_meta()
4626 btf_verifier_log_type(env, t, NULL); in btf_func_check_meta()
4631 static int btf_func_resolve(struct btf_verifier_env *env, in btf_func_resolve() argument
4638 err = btf_func_check(env, t); in btf_func_resolve()
4642 env_stack_pop_resolved(env, next_type_id, 0); in btf_func_resolve()
4655 static s32 btf_var_check_meta(struct btf_verifier_env *env, in btf_var_check_meta() argument
4663 btf_verifier_log_basic(env, t, in btf_var_check_meta()
4670 btf_verifier_log_type(env, t, "vlen != 0"); in btf_var_check_meta()
4675 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_var_check_meta()
4680 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_var_check_meta()
4681 btf_verifier_log_type(env, t, "Invalid name"); in btf_var_check_meta()
4687 btf_verifier_log_type(env, t, "Invalid type_id"); in btf_var_check_meta()
4694 btf_verifier_log_type(env, t, "Linkage not supported"); in btf_var_check_meta()
4698 btf_verifier_log_type(env, t, NULL); in btf_var_check_meta()
4703 static void btf_var_log(struct btf_verifier_env *env, const struct btf_type *t) in btf_var_log() argument
4707 btf_verifier_log(env, "type_id=%u linkage=%u", t->type, var->linkage); in btf_var_log()
4719 static s32 btf_datasec_check_meta(struct btf_verifier_env *env, in btf_datasec_check_meta() argument
4729 btf_verifier_log_basic(env, t, in btf_datasec_check_meta()
4736 btf_verifier_log_type(env, t, "size == 0"); in btf_datasec_check_meta()
4741 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_datasec_check_meta()
4746 !btf_name_valid_section(env->btf, t->name_off)) { in btf_datasec_check_meta()
4747 btf_verifier_log_type(env, t, "Invalid name"); in btf_datasec_check_meta()
4751 btf_verifier_log_type(env, t, NULL); in btf_datasec_check_meta()
4756 btf_verifier_log_vsi(env, t, vsi, in btf_datasec_check_meta()
4762 btf_verifier_log_vsi(env, t, vsi, in btf_datasec_check_meta()
4768 btf_verifier_log_vsi(env, t, vsi, in btf_datasec_check_meta()
4775 btf_verifier_log_vsi(env, t, vsi, in btf_datasec_check_meta()
4780 btf_verifier_log_vsi(env, t, vsi, NULL); in btf_datasec_check_meta()
4785 btf_verifier_log_type(env, t, "Invalid btf_info size"); in btf_datasec_check_meta()
4792 static int btf_datasec_resolve(struct btf_verifier_env *env, in btf_datasec_resolve() argument
4796 struct btf *btf = env->btf; in btf_datasec_resolve()
4799 env->resolve_mode = RESOLVE_TBD; in btf_datasec_resolve()
4802 const struct btf_type *var_type = btf_type_by_id(env->btf, in btf_datasec_resolve()
4805 btf_verifier_log_vsi(env, v->t, vsi, in btf_datasec_resolve()
4810 if (!env_type_is_resolve_sink(env, var_type) && in btf_datasec_resolve()
4811 !env_type_is_resolved(env, var_type_id)) { in btf_datasec_resolve()
4812 env_stack_set_next_member(env, i + 1); in btf_datasec_resolve()
4813 return env_stack_push(env, var_type, var_type_id); in btf_datasec_resolve()
4818 btf_verifier_log_vsi(env, v->t, vsi, "Invalid type"); in btf_datasec_resolve()
4823 btf_verifier_log_vsi(env, v->t, vsi, "Invalid size"); in btf_datasec_resolve()
4828 env_stack_pop_resolved(env, 0, 0); in btf_datasec_resolve()
4832 static void btf_datasec_log(struct btf_verifier_env *env, in btf_datasec_log() argument
4835 btf_verifier_log(env, "size=%u vlen=%u", t->size, btf_type_vlen(t)); in btf_datasec_log()
4871 static s32 btf_float_check_meta(struct btf_verifier_env *env, in btf_float_check_meta() argument
4876 btf_verifier_log_type(env, t, "vlen != 0"); in btf_float_check_meta()
4881 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_float_check_meta()
4887 btf_verifier_log_type(env, t, "Invalid type_size"); in btf_float_check_meta()
4891 btf_verifier_log_type(env, t, NULL); in btf_float_check_meta()
4896 static int btf_float_check_member(struct btf_verifier_env *env, in btf_float_check_member() argument
4915 btf_verifier_log_member(env, struct_type, member, in btf_float_check_member()
4923 btf_verifier_log_member(env, struct_type, member, in btf_float_check_member()
4931 static void btf_float_log(struct btf_verifier_env *env, in btf_float_log() argument
4934 btf_verifier_log(env, "size=%u", t->size); in btf_float_log()
4946 static s32 btf_decl_tag_check_meta(struct btf_verifier_env *env, in btf_decl_tag_check_meta() argument
4956 btf_verifier_log_basic(env, t, in btf_decl_tag_check_meta()
4962 value = btf_name_by_offset(env->btf, t->name_off); in btf_decl_tag_check_meta()
4964 btf_verifier_log_type(env, t, "Invalid value"); in btf_decl_tag_check_meta()
4969 btf_verifier_log_type(env, t, "vlen != 0"); in btf_decl_tag_check_meta()
4975 btf_verifier_log_type(env, t, "Invalid component_idx"); in btf_decl_tag_check_meta()
4979 btf_verifier_log_type(env, t, NULL); in btf_decl_tag_check_meta()
4984 static int btf_decl_tag_resolve(struct btf_verifier_env *env, in btf_decl_tag_resolve() argument
4990 struct btf *btf = env->btf; in btf_decl_tag_resolve()
4996 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_decl_tag_resolve()
5000 if (!env_type_is_resolve_sink(env, next_type) && in btf_decl_tag_resolve()
5001 !env_type_is_resolved(env, next_type_id)) in btf_decl_tag_resolve()
5002 return env_stack_push(env, next_type, next_type_id); in btf_decl_tag_resolve()
5007 btf_verifier_log_type(env, v->t, "Invalid component_idx"); in btf_decl_tag_resolve()
5020 btf_verifier_log_type(env, v->t, "Invalid component_idx"); in btf_decl_tag_resolve()
5025 env_stack_pop_resolved(env, next_type_id, 0); in btf_decl_tag_resolve()
5030 static void btf_decl_tag_log(struct btf_verifier_env *env, const struct btf_type *t) in btf_decl_tag_log() argument
5032 btf_verifier_log(env, "type=%u component_idx=%d", t->type, in btf_decl_tag_log()
5045 static int btf_func_proto_check(struct btf_verifier_env *env, in btf_func_proto_check() argument
5054 btf = env->btf; in btf_func_proto_check()
5064 btf_verifier_log_type(env, t, "Invalid return type"); in btf_func_proto_check()
5069 btf_verifier_log_type(env, t, "Invalid return type"); in btf_func_proto_check()
5074 !env_type_is_resolved(env, ret_type_id)) { in btf_func_proto_check()
5075 err = btf_resolve(env, ret_type, ret_type_id); in btf_func_proto_check()
5082 btf_verifier_log_type(env, t, "Invalid return type"); in btf_func_proto_check()
5093 btf_verifier_log_type(env, t, "Invalid arg#%u", in btf_func_proto_check()
5107 btf_verifier_log_type(env, t, "Invalid arg#%u", i + 1); in btf_func_proto_check()
5112 btf_verifier_log_type(env, t, "Invalid arg#%u", i + 1); in btf_func_proto_check()
5119 btf_verifier_log_type(env, t, in btf_func_proto_check()
5125 !env_type_is_resolved(env, arg_type_id)) { in btf_func_proto_check()
5126 err = btf_resolve(env, arg_type, arg_type_id); in btf_func_proto_check()
5132 btf_verifier_log_type(env, t, "Invalid arg#%u", i + 1); in btf_func_proto_check()
5140 static int btf_func_check(struct btf_verifier_env *env, in btf_func_check() argument
5148 btf = env->btf; in btf_func_check()
5152 btf_verifier_log_type(env, t, "Invalid type_id"); in btf_func_check()
5160 btf_verifier_log_type(env, t, "Invalid arg#%u", i + 1); in btf_func_check()
5190 static s32 btf_check_meta(struct btf_verifier_env *env, in btf_check_meta() argument
5198 btf_verifier_log(env, "[%u] meta_left:%u meta_needed:%zu", in btf_check_meta()
5199 env->log_type_id, meta_left, sizeof(*t)); in btf_check_meta()
5205 btf_verifier_log(env, "[%u] Invalid btf_info:%x", in btf_check_meta()
5206 env->log_type_id, t->info); in btf_check_meta()
5212 btf_verifier_log(env, "[%u] Invalid kind:%u", in btf_check_meta()
5213 env->log_type_id, BTF_INFO_KIND(t->info)); in btf_check_meta()
5217 if (!btf_name_offset_valid(env->btf, t->name_off)) { in btf_check_meta()
5218 btf_verifier_log(env, "[%u] Invalid name_offset:%u", in btf_check_meta()
5219 env->log_type_id, t->name_off); in btf_check_meta()
5223 var_meta_size = btf_type_ops(t)->check_meta(env, t, meta_left); in btf_check_meta()
5232 static int btf_check_all_metas(struct btf_verifier_env *env) in btf_check_all_metas() argument
5234 struct btf *btf = env->btf; in btf_check_all_metas()
5242 env->log_type_id = btf->base_btf ? btf->start_id : 1; in btf_check_all_metas()
5247 meta_size = btf_check_meta(env, t, end - cur); in btf_check_all_metas()
5251 btf_add_type(env, t); in btf_check_all_metas()
5253 env->log_type_id++; in btf_check_all_metas()
5259 static bool btf_resolve_valid(struct btf_verifier_env *env, in btf_resolve_valid() argument
5263 struct btf *btf = env->btf; in btf_resolve_valid()
5265 if (!env_type_is_resolved(env, type_id)) in btf_resolve_valid()
5300 static int btf_resolve(struct btf_verifier_env *env, in btf_resolve() argument
5303 u32 save_log_type_id = env->log_type_id; in btf_resolve()
5307 env->resolve_mode = RESOLVE_TBD; in btf_resolve()
5308 env_stack_push(env, t, type_id); in btf_resolve()
5309 while (!err && (v = env_stack_peak(env))) { in btf_resolve()
5310 env->log_type_id = v->type_id; in btf_resolve()
5311 err = btf_type_ops(v->t)->resolve(env, v); in btf_resolve()
5314 env->log_type_id = type_id; in btf_resolve()
5316 btf_verifier_log_type(env, t, in btf_resolve()
5320 btf_verifier_log_type(env, t, "Loop detected"); in btf_resolve()
5324 if (!err && !btf_resolve_valid(env, t, type_id)) { in btf_resolve()
5325 btf_verifier_log_type(env, t, "Invalid resolve state"); in btf_resolve()
5329 env->log_type_id = save_log_type_id; in btf_resolve()
5333 static int btf_check_all_types(struct btf_verifier_env *env) in btf_check_all_types() argument
5335 struct btf *btf = env->btf; in btf_check_all_types()
5340 err = env_resolve_init(env); in btf_check_all_types()
5344 env->phase++; in btf_check_all_types()
5349 env->log_type_id = type_id; in btf_check_all_types()
5351 !env_type_is_resolved(env, type_id)) { in btf_check_all_types()
5352 err = btf_resolve(env, t, type_id); in btf_check_all_types()
5358 err = btf_func_proto_check(env, t); in btf_check_all_types()
5367 static int btf_parse_type_sec(struct btf_verifier_env *env) in btf_parse_type_sec() argument
5369 const struct btf_header *hdr = &env->btf->hdr; in btf_parse_type_sec()
5374 btf_verifier_log(env, "Unaligned type_off"); in btf_parse_type_sec()
5378 if (!env->btf->base_btf && !hdr->type_len) { in btf_parse_type_sec()
5379 btf_verifier_log(env, "No type found"); in btf_parse_type_sec()
5383 err = btf_check_all_metas(env); in btf_parse_type_sec()
5387 return btf_check_all_types(env); in btf_parse_type_sec()
5390 static int btf_parse_str_sec(struct btf_verifier_env *env) in btf_parse_str_sec() argument
5393 struct btf *btf = env->btf; in btf_parse_str_sec()
5401 btf_verifier_log(env, "String section is not at the end"); in btf_parse_str_sec()
5410 btf_verifier_log(env, "Invalid string section"); in btf_parse_str_sec()
5414 btf_verifier_log(env, "Invalid string section"); in btf_parse_str_sec()
5434 static int btf_check_sec_info(struct btf_verifier_env *env, in btf_check_sec_info() argument
5442 btf = env->btf; in btf_check_sec_info()
5458 btf_verifier_log(env, "Invalid section offset"); in btf_check_sec_info()
5463 btf_verifier_log(env, "Unsupported section found"); in btf_check_sec_info()
5467 btf_verifier_log(env, "Section overlap found"); in btf_check_sec_info()
5471 btf_verifier_log(env, in btf_check_sec_info()
5480 btf_verifier_log(env, "Unsupported section found"); in btf_check_sec_info()
5487 static int btf_parse_hdr(struct btf_verifier_env *env) in btf_parse_hdr() argument
5493 btf = env->btf; in btf_parse_hdr()
5497 btf_verifier_log(env, "hdr_len not found"); in btf_parse_hdr()
5504 btf_verifier_log(env, "btf_header not found"); in btf_parse_hdr()
5515 btf_verifier_log(env, "Unsupported btf_header"); in btf_parse_hdr()
5526 btf_verifier_log_hdr(env, btf_data_size); in btf_parse_hdr()
5529 btf_verifier_log(env, "Invalid magic"); in btf_parse_hdr()
5534 btf_verifier_log(env, "Unsupported version"); in btf_parse_hdr()
5539 btf_verifier_log(env, "Unsupported flags"); in btf_parse_hdr()
5544 btf_verifier_log(env, "No data"); in btf_parse_hdr()
5548 return btf_check_sec_info(env, btf_data_size); in btf_parse_hdr()
5693 static int btf_check_type_tags(struct btf_verifier_env *env, in btf_check_type_tags() argument
5716 btf_verifier_log(env, "Max chain length or cycle detected"); in btf_check_type_tags()
5721 btf_verifier_log(env, "Type tags don't precede modifiers"); in btf_check_type_tags()
5760 struct btf_verifier_env *env = NULL; in btf_parse() local
5768 env = kzalloc(sizeof(*env), GFP_KERNEL | __GFP_NOWARN); in btf_parse()
5769 if (!env) in btf_parse()
5775 err = bpf_vlog_init(&env->log, attr->btf_log_level, in btf_parse()
5785 env->btf = btf; in btf_parse()
5801 err = btf_parse_hdr(env); in btf_parse()
5807 err = btf_parse_str_sec(env); in btf_parse()
5811 err = btf_parse_type_sec(env); in btf_parse()
5815 err = btf_check_type_tags(env, btf, 1); in btf_parse()
5819 struct_meta_tab = btf_parse_struct_metas(&env->log, btf); in btf_parse()
5836 err = finalize_log(&env->log, uattr, uattr_size); in btf_parse()
5840 btf_verifier_env_free(env); in btf_parse()
5848 ret = finalize_log(&env->log, uattr, uattr_size); in btf_parse()
5852 btf_verifier_env_free(env); in btf_parse()
6187 static struct btf *btf_parse_base(struct btf_verifier_env *env, const char *name, in BTF_ID()
6201 env->btf = btf; in BTF_ID()
6208 err = btf_parse_hdr(env); in BTF_ID()
6214 err = btf_parse_str_sec(env); in BTF_ID()
6218 err = btf_check_all_metas(env); in BTF_ID()
6222 err = btf_check_type_tags(env, btf, 1); in BTF_ID()
6240 struct btf_verifier_env *env = NULL; in btf_parse_vmlinux() local
6245 env = kzalloc(sizeof(*env), GFP_KERNEL | __GFP_NOWARN); in btf_parse_vmlinux()
6246 if (!env) in btf_parse_vmlinux()
6249 log = &env->log; in btf_parse_vmlinux()
6251 btf = btf_parse_base(env, "vmlinux", __start_BTF, __stop_BTF - __start_BTF); in btf_parse_vmlinux()
6263 btf_verifier_env_free(env); in btf_parse_vmlinux()
6285 struct btf_verifier_env *env = NULL; in btf_parse_module() local
6295 env = kzalloc(sizeof(*env), GFP_KERNEL | __GFP_NOWARN); in btf_parse_module()
6296 if (!env) in btf_parse_module()
6299 log = &env->log; in btf_parse_module()
6303 base_btf = btf_parse_base(env, ".BTF.base", base_data, base_data_size); in btf_parse_module()
6317 env->btf = btf; in btf_parse_module()
6332 err = btf_parse_hdr(env); in btf_parse_module()
6338 err = btf_parse_str_sec(env); in btf_parse_module()
6342 err = btf_check_all_metas(env); in btf_parse_module()
6346 err = btf_check_type_tags(env, btf, btf_nr_types(base_btf)); in btf_parse_module()
6358 btf_verifier_env_free(env); in btf_parse_module()
6363 btf_verifier_env_free(env); in btf_parse_module()
7648 int btf_prepare_func_args(struct bpf_verifier_env *env, int subprog) in btf_prepare_func_args() argument
7650 bool is_global = subprog_aux(env, subprog)->linkage == BTF_FUNC_GLOBAL; in btf_prepare_func_args()
7651 struct bpf_subprog_info *sub = subprog_info(env, subprog); in btf_prepare_func_args()
7652 struct bpf_verifier_log *log = &env->log; in btf_prepare_func_args()
7653 struct bpf_prog *prog = env->prog; in btf_prepare_func_args()