Lines Matching refs:env
406 s32 (*check_meta)(struct btf_verifier_env *env,
409 int (*resolve)(struct btf_verifier_env *env,
411 int (*check_member)(struct btf_verifier_env *env,
415 int (*check_kflag_member)(struct btf_verifier_env *env,
419 void (*log_details)(struct btf_verifier_env *env,
429 static int btf_resolve(struct btf_verifier_env *env,
432 static int btf_func_check(struct btf_verifier_env *env,
1380 __printf(2, 3) static void btf_verifier_log(struct btf_verifier_env *env, in btf_verifier_log() argument
1383 struct bpf_verifier_log *log = &env->log; in btf_verifier_log()
1394 __printf(4, 5) static void __btf_verifier_log_type(struct btf_verifier_env *env, in __btf_verifier_log_type() argument
1399 struct bpf_verifier_log *log = &env->log; in __btf_verifier_log_type()
1400 struct btf *btf = env->btf; in __btf_verifier_log_type()
1414 env->log_type_id, in __btf_verifier_log_type()
1420 btf_type_ops(t)->log_details(env, t); in __btf_verifier_log_type()
1432 #define btf_verifier_log_type(env, t, ...) \ argument
1433 __btf_verifier_log_type((env), (t), true, __VA_ARGS__)
1434 #define btf_verifier_log_basic(env, t, ...) \ argument
1435 __btf_verifier_log_type((env), (t), false, __VA_ARGS__)
1438 static void btf_verifier_log_member(struct btf_verifier_env *env, in btf_verifier_log_member() argument
1443 struct bpf_verifier_log *log = &env->log; in btf_verifier_log_member()
1444 struct btf *btf = env->btf; in btf_verifier_log_member()
1458 if (env->phase != CHECK_META) in btf_verifier_log_member()
1459 btf_verifier_log_type(env, struct_type, NULL); in btf_verifier_log_member()
1484 static void btf_verifier_log_vsi(struct btf_verifier_env *env, in btf_verifier_log_vsi() argument
1489 struct bpf_verifier_log *log = &env->log; in btf_verifier_log_vsi()
1496 if (env->phase != CHECK_META) in btf_verifier_log_vsi()
1497 btf_verifier_log_type(env, datasec_type, NULL); in btf_verifier_log_vsi()
1511 static void btf_verifier_log_hdr(struct btf_verifier_env *env, in btf_verifier_log_hdr() argument
1514 struct bpf_verifier_log *log = &env->log; in btf_verifier_log_hdr()
1515 const struct btf *btf = env->btf; in btf_verifier_log_hdr()
1535 static int btf_add_type(struct btf_verifier_env *env, struct btf_type *t) in btf_add_type() argument
1537 struct btf *btf = env->btf; in btf_add_type()
1546 btf_verifier_log(env, "Exceeded max num of types"); in btf_add_type()
1676 static int env_resolve_init(struct btf_verifier_env *env) in env_resolve_init() argument
1678 struct btf *btf = env->btf; in env_resolve_init()
1701 env->visit_states = visit_states; in env_resolve_init()
1712 static void btf_verifier_env_free(struct btf_verifier_env *env) in btf_verifier_env_free() argument
1714 kvfree(env->visit_states); in btf_verifier_env_free()
1715 kfree(env); in btf_verifier_env_free()
1718 static bool env_type_is_resolve_sink(const struct btf_verifier_env *env, in env_type_is_resolve_sink() argument
1721 switch (env->resolve_mode) { in env_type_is_resolve_sink()
1743 static bool env_type_is_resolved(const struct btf_verifier_env *env, in env_type_is_resolved() argument
1747 if (type_id < env->btf->start_id) in env_type_is_resolved()
1750 return env->visit_states[type_id - env->btf->start_id] == RESOLVED; in env_type_is_resolved()
1753 static int env_stack_push(struct btf_verifier_env *env, in env_stack_push() argument
1756 const struct btf *btf = env->btf; in env_stack_push()
1759 if (env->top_stack == MAX_RESOLVE_DEPTH) in env_stack_push()
1763 || env->visit_states[type_id - btf->start_id] != NOT_VISITED) in env_stack_push()
1766 env->visit_states[type_id - btf->start_id] = VISITED; in env_stack_push()
1768 v = &env->stack[env->top_stack++]; in env_stack_push()
1773 if (env->resolve_mode == RESOLVE_TBD) { in env_stack_push()
1775 env->resolve_mode = RESOLVE_PTR; in env_stack_push()
1777 env->resolve_mode = RESOLVE_STRUCT_OR_ARRAY; in env_stack_push()
1783 static void env_stack_set_next_member(struct btf_verifier_env *env, in env_stack_set_next_member() argument
1786 env->stack[env->top_stack - 1].next_member = next_member; in env_stack_set_next_member()
1789 static void env_stack_pop_resolved(struct btf_verifier_env *env, in env_stack_pop_resolved() argument
1793 u32 type_id = env->stack[--(env->top_stack)].type_id; in env_stack_pop_resolved()
1794 struct btf *btf = env->btf; in env_stack_pop_resolved()
1799 env->visit_states[type_id] = RESOLVED; in env_stack_pop_resolved()
1802 static const struct resolve_vertex *env_stack_peak(struct btf_verifier_env *env) in env_stack_peak() argument
1804 return env->top_stack ? &env->stack[env->top_stack - 1] : NULL; in env_stack_peak()
1971 static int btf_df_check_member(struct btf_verifier_env *env, in btf_df_check_member() argument
1976 btf_verifier_log_basic(env, struct_type, in btf_df_check_member()
1981 static int btf_df_check_kflag_member(struct btf_verifier_env *env, in btf_df_check_kflag_member() argument
1986 btf_verifier_log_basic(env, struct_type, in btf_df_check_kflag_member()
1994 static int btf_generic_check_kflag_member(struct btf_verifier_env *env, in btf_generic_check_kflag_member() argument
2000 btf_verifier_log_member(env, struct_type, member, in btf_generic_check_kflag_member()
2008 return btf_type_ops(member_type)->check_member(env, struct_type, in btf_generic_check_kflag_member()
2013 static int btf_df_resolve(struct btf_verifier_env *env, in btf_df_resolve() argument
2016 btf_verifier_log_basic(env, v->t, "Unsupported resolve"); in btf_df_resolve()
2027 static int btf_int_check_member(struct btf_verifier_env *env, in btf_int_check_member() argument
2039 btf_verifier_log_member(env, struct_type, member, in btf_int_check_member()
2050 btf_verifier_log_member(env, struct_type, member, in btf_int_check_member()
2057 btf_verifier_log_member(env, struct_type, member, in btf_int_check_member()
2065 static int btf_int_check_kflag_member(struct btf_verifier_env *env, in btf_int_check_kflag_member() argument
2077 btf_verifier_log_member(env, struct_type, member, in btf_int_check_kflag_member()
2091 btf_verifier_log_member(env, struct_type, member, in btf_int_check_kflag_member()
2098 btf_verifier_log_member(env, struct_type, member, in btf_int_check_kflag_member()
2106 btf_verifier_log_member(env, struct_type, member, in btf_int_check_kflag_member()
2113 btf_verifier_log_member(env, struct_type, member, in btf_int_check_kflag_member()
2121 static s32 btf_int_check_meta(struct btf_verifier_env *env, in btf_int_check_meta() argument
2129 btf_verifier_log_basic(env, t, in btf_int_check_meta()
2136 btf_verifier_log_type(env, t, "vlen != 0"); in btf_int_check_meta()
2141 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_int_check_meta()
2147 btf_verifier_log_basic(env, t, "Invalid int_data:%x", in btf_int_check_meta()
2155 btf_verifier_log_type(env, t, "nr_bits exceeds %zu", in btf_int_check_meta()
2161 btf_verifier_log_type(env, t, "nr_bits exceeds type_size"); in btf_int_check_meta()
2176 btf_verifier_log_type(env, t, "Unsupported encoding"); in btf_int_check_meta()
2180 btf_verifier_log_type(env, t, NULL); in btf_int_check_meta()
2185 static void btf_int_log(struct btf_verifier_env *env, in btf_int_log() argument
2190 btf_verifier_log(env, in btf_int_log()
2386 static int btf_modifier_check_member(struct btf_verifier_env *env, in btf_modifier_check_member() argument
2394 struct btf *btf = env->btf; in btf_modifier_check_member()
2398 btf_verifier_log_member(env, struct_type, member, in btf_modifier_check_member()
2406 return btf_type_ops(resolved_type)->check_member(env, struct_type, in btf_modifier_check_member()
2411 static int btf_modifier_check_kflag_member(struct btf_verifier_env *env, in btf_modifier_check_kflag_member() argument
2419 struct btf *btf = env->btf; in btf_modifier_check_kflag_member()
2423 btf_verifier_log_member(env, struct_type, member, in btf_modifier_check_kflag_member()
2431 return btf_type_ops(resolved_type)->check_kflag_member(env, struct_type, in btf_modifier_check_kflag_member()
2436 static int btf_ptr_check_member(struct btf_verifier_env *env, in btf_ptr_check_member() argument
2448 btf_verifier_log_member(env, struct_type, member, in btf_ptr_check_member()
2454 btf_verifier_log_member(env, struct_type, member, in btf_ptr_check_member()
2462 static int btf_ref_type_check_meta(struct btf_verifier_env *env, in btf_ref_type_check_meta() argument
2469 btf_verifier_log_type(env, t, "vlen != 0"); in btf_ref_type_check_meta()
2474 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_ref_type_check_meta()
2479 btf_verifier_log_type(env, t, "Invalid type_id"); in btf_ref_type_check_meta()
2488 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_ref_type_check_meta()
2489 btf_verifier_log_type(env, t, "Invalid name"); in btf_ref_type_check_meta()
2493 value = btf_name_by_offset(env->btf, t->name_off); in btf_ref_type_check_meta()
2495 btf_verifier_log_type(env, t, "Invalid name"); in btf_ref_type_check_meta()
2500 btf_verifier_log_type(env, t, "Invalid name"); in btf_ref_type_check_meta()
2505 btf_verifier_log_type(env, t, NULL); in btf_ref_type_check_meta()
2510 static int btf_modifier_resolve(struct btf_verifier_env *env, in btf_modifier_resolve() argument
2516 struct btf *btf = env->btf; in btf_modifier_resolve()
2520 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_modifier_resolve()
2524 if (!env_type_is_resolve_sink(env, next_type) && in btf_modifier_resolve()
2525 !env_type_is_resolved(env, next_type_id)) in btf_modifier_resolve()
2526 return env_stack_push(env, next_type, next_type_id); in btf_modifier_resolve()
2535 if (env_type_is_resolved(env, next_type_id)) in btf_modifier_resolve()
2542 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_modifier_resolve()
2547 env_stack_pop_resolved(env, next_type_id, 0); in btf_modifier_resolve()
2552 static int btf_var_resolve(struct btf_verifier_env *env, in btf_var_resolve() argument
2558 struct btf *btf = env->btf; in btf_var_resolve()
2562 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_var_resolve()
2566 if (!env_type_is_resolve_sink(env, next_type) && in btf_var_resolve()
2567 !env_type_is_resolved(env, next_type_id)) in btf_var_resolve()
2568 return env_stack_push(env, next_type, next_type_id); in btf_var_resolve()
2578 !env_type_is_resolve_sink(env, resolved_type) && in btf_var_resolve()
2579 !env_type_is_resolved(env, resolved_type_id)) in btf_var_resolve()
2580 return env_stack_push(env, resolved_type, in btf_var_resolve()
2589 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_var_resolve()
2593 env_stack_pop_resolved(env, next_type_id, 0); in btf_var_resolve()
2598 static int btf_ptr_resolve(struct btf_verifier_env *env, in btf_ptr_resolve() argument
2604 struct btf *btf = env->btf; in btf_ptr_resolve()
2608 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_ptr_resolve()
2612 if (!env_type_is_resolve_sink(env, next_type) && in btf_ptr_resolve()
2613 !env_type_is_resolved(env, next_type_id)) in btf_ptr_resolve()
2614 return env_stack_push(env, next_type, next_type_id); in btf_ptr_resolve()
2632 !env_type_is_resolve_sink(env, resolved_type) && in btf_ptr_resolve()
2633 !env_type_is_resolved(env, resolved_type_id)) in btf_ptr_resolve()
2634 return env_stack_push(env, resolved_type, in btf_ptr_resolve()
2639 if (env_type_is_resolved(env, next_type_id)) in btf_ptr_resolve()
2645 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_ptr_resolve()
2650 env_stack_pop_resolved(env, next_type_id, 0); in btf_ptr_resolve()
2695 static void btf_ref_type_log(struct btf_verifier_env *env, in btf_ref_type_log() argument
2698 btf_verifier_log(env, "type_id=%u", t->type); in btf_ref_type_log()
2719 static s32 btf_fwd_check_meta(struct btf_verifier_env *env, in btf_fwd_check_meta() argument
2724 btf_verifier_log_type(env, t, "vlen != 0"); in btf_fwd_check_meta()
2729 btf_verifier_log_type(env, t, "type != 0"); in btf_fwd_check_meta()
2735 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_fwd_check_meta()
2736 btf_verifier_log_type(env, t, "Invalid name"); in btf_fwd_check_meta()
2740 btf_verifier_log_type(env, t, NULL); in btf_fwd_check_meta()
2745 static void btf_fwd_type_log(struct btf_verifier_env *env, in btf_fwd_type_log() argument
2748 btf_verifier_log(env, "%s", btf_type_kflag(t) ? "union" : "struct"); in btf_fwd_type_log()
2760 static int btf_array_check_member(struct btf_verifier_env *env, in btf_array_check_member() argument
2768 struct btf *btf = env->btf; in btf_array_check_member()
2771 btf_verifier_log_member(env, struct_type, member, in btf_array_check_member()
2781 btf_verifier_log_member(env, struct_type, member, in btf_array_check_member()
2789 static s32 btf_array_check_meta(struct btf_verifier_env *env, in btf_array_check_meta() argument
2797 btf_verifier_log_basic(env, t, in btf_array_check_meta()
2805 btf_verifier_log_type(env, t, "Invalid name"); in btf_array_check_meta()
2810 btf_verifier_log_type(env, t, "vlen != 0"); in btf_array_check_meta()
2815 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_array_check_meta()
2820 btf_verifier_log_type(env, t, "size != 0"); in btf_array_check_meta()
2828 btf_verifier_log_type(env, t, "Invalid elem"); in btf_array_check_meta()
2833 btf_verifier_log_type(env, t, "Invalid index"); in btf_array_check_meta()
2837 btf_verifier_log_type(env, t, NULL); in btf_array_check_meta()
2842 static int btf_array_resolve(struct btf_verifier_env *env, in btf_array_resolve() argument
2848 struct btf *btf = env->btf; in btf_array_resolve()
2856 btf_verifier_log_type(env, v->t, "Invalid index"); in btf_array_resolve()
2860 if (!env_type_is_resolve_sink(env, index_type) && in btf_array_resolve()
2861 !env_type_is_resolved(env, index_type_id)) in btf_array_resolve()
2862 return env_stack_push(env, index_type, index_type_id); in btf_array_resolve()
2867 btf_verifier_log_type(env, v->t, "Invalid index"); in btf_array_resolve()
2876 btf_verifier_log_type(env, v->t, in btf_array_resolve()
2881 if (!env_type_is_resolve_sink(env, elem_type) && in btf_array_resolve()
2882 !env_type_is_resolved(env, elem_type_id)) in btf_array_resolve()
2883 return env_stack_push(env, elem_type, elem_type_id); in btf_array_resolve()
2887 btf_verifier_log_type(env, v->t, "Invalid elem"); in btf_array_resolve()
2892 btf_verifier_log_type(env, v->t, "Invalid array of int"); in btf_array_resolve()
2897 btf_verifier_log_type(env, v->t, in btf_array_resolve()
2902 env_stack_pop_resolved(env, elem_type_id, elem_size * array->nelems); in btf_array_resolve()
2907 static void btf_array_log(struct btf_verifier_env *env, in btf_array_log() argument
2912 btf_verifier_log(env, "type_id=%u index_type_id=%u nr_elems=%u", in btf_array_log()
3011 static int btf_struct_check_member(struct btf_verifier_env *env, in btf_struct_check_member() argument
3020 btf_verifier_log_member(env, struct_type, member, in btf_struct_check_member()
3028 btf_verifier_log_member(env, struct_type, member, in btf_struct_check_member()
3036 static s32 btf_struct_check_meta(struct btf_verifier_env *env, in btf_struct_check_meta() argument
3043 struct btf *btf = env->btf; in btf_struct_check_meta()
3050 btf_verifier_log_basic(env, t, in btf_struct_check_meta()
3058 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_struct_check_meta()
3059 btf_verifier_log_type(env, t, "Invalid name"); in btf_struct_check_meta()
3063 btf_verifier_log_type(env, t, NULL); in btf_struct_check_meta()
3068 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
3077 btf_verifier_log_member(env, t, member, "Invalid name"); in btf_struct_check_meta()
3082 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
3089 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
3099 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
3105 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
3110 btf_verifier_log_member(env, t, member, NULL); in btf_struct_check_meta()
3117 static int btf_struct_resolve(struct btf_verifier_env *env, in btf_struct_resolve() argument
3135 if (WARN_ON_ONCE(!env_type_is_resolved(env, in btf_struct_resolve()
3139 last_member_type = btf_type_by_id(env->btf, in btf_struct_resolve()
3142 err = btf_type_ops(last_member_type)->check_kflag_member(env, v->t, in btf_struct_resolve()
3146 err = btf_type_ops(last_member_type)->check_member(env, v->t, in btf_struct_resolve()
3155 const struct btf_type *member_type = btf_type_by_id(env->btf, in btf_struct_resolve()
3160 btf_verifier_log_member(env, v->t, member, in btf_struct_resolve()
3165 if (!env_type_is_resolve_sink(env, member_type) && in btf_struct_resolve()
3166 !env_type_is_resolved(env, member_type_id)) { in btf_struct_resolve()
3167 env_stack_set_next_member(env, i + 1); in btf_struct_resolve()
3168 return env_stack_push(env, member_type, member_type_id); in btf_struct_resolve()
3172 err = btf_type_ops(member_type)->check_kflag_member(env, v->t, in btf_struct_resolve()
3176 err = btf_type_ops(member_type)->check_member(env, v->t, in btf_struct_resolve()
3183 env_stack_pop_resolved(env, 0, 0); in btf_struct_resolve()
3188 static void btf_struct_log(struct btf_verifier_env *env, in btf_struct_log() argument
3191 btf_verifier_log(env, "size=%u vlen=%u", t->size, btf_type_vlen(t)); in btf_struct_log()
3615 static int btf_enum_check_member(struct btf_verifier_env *env, in btf_enum_check_member() argument
3624 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_member()
3632 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_member()
3640 static int btf_enum_check_kflag_member(struct btf_verifier_env *env, in btf_enum_check_kflag_member() argument
3652 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_kflag_member()
3659 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_kflag_member()
3667 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_kflag_member()
3675 static s32 btf_enum_check_meta(struct btf_verifier_env *env, in btf_enum_check_meta() argument
3680 struct btf *btf = env->btf; in btf_enum_check_meta()
3689 btf_verifier_log_basic(env, t, in btf_enum_check_meta()
3696 btf_verifier_log_type(env, t, "Unexpected size"); in btf_enum_check_meta()
3702 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_enum_check_meta()
3703 btf_verifier_log_type(env, t, "Invalid name"); in btf_enum_check_meta()
3707 btf_verifier_log_type(env, t, NULL); in btf_enum_check_meta()
3711 btf_verifier_log(env, "\tInvalid name_offset:%u", in btf_enum_check_meta()
3719 btf_verifier_log_type(env, t, "Invalid name"); in btf_enum_check_meta()
3723 if (env->log.level == BPF_LOG_KERNEL) in btf_enum_check_meta()
3726 btf_verifier_log(env, fmt_str, in btf_enum_check_meta()
3734 static void btf_enum_log(struct btf_verifier_env *env, in btf_enum_log() argument
3737 btf_verifier_log(env, "size=%u vlen=%u", t->size, btf_type_vlen(t)); in btf_enum_log()
3783 static s32 btf_enum64_check_meta(struct btf_verifier_env *env, in btf_enum64_check_meta() argument
3788 struct btf *btf = env->btf; in btf_enum64_check_meta()
3797 btf_verifier_log_basic(env, t, in btf_enum64_check_meta()
3804 btf_verifier_log_type(env, t, "Unexpected size"); in btf_enum64_check_meta()
3810 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_enum64_check_meta()
3811 btf_verifier_log_type(env, t, "Invalid name"); in btf_enum64_check_meta()
3815 btf_verifier_log_type(env, t, NULL); in btf_enum64_check_meta()
3819 btf_verifier_log(env, "\tInvalid name_offset:%u", in btf_enum64_check_meta()
3827 btf_verifier_log_type(env, t, "Invalid name"); in btf_enum64_check_meta()
3831 if (env->log.level == BPF_LOG_KERNEL) in btf_enum64_check_meta()
3835 btf_verifier_log(env, fmt_str, in btf_enum64_check_meta()
3886 static s32 btf_func_proto_check_meta(struct btf_verifier_env *env, in btf_func_proto_check_meta() argument
3893 btf_verifier_log_basic(env, t, in btf_func_proto_check_meta()
3900 btf_verifier_log_type(env, t, "Invalid name"); in btf_func_proto_check_meta()
3905 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_func_proto_check_meta()
3909 btf_verifier_log_type(env, t, NULL); in btf_func_proto_check_meta()
3914 static void btf_func_proto_log(struct btf_verifier_env *env, in btf_func_proto_log() argument
3920 btf_verifier_log(env, "return=%u args=(", t->type); in btf_func_proto_log()
3922 btf_verifier_log(env, "void"); in btf_func_proto_log()
3928 btf_verifier_log(env, "vararg"); in btf_func_proto_log()
3932 btf_verifier_log(env, "%u %s", args[0].type, in btf_func_proto_log()
3933 __btf_name_by_offset(env->btf, in btf_func_proto_log()
3936 btf_verifier_log(env, ", %u %s", args[i].type, in btf_func_proto_log()
3937 __btf_name_by_offset(env->btf, in btf_func_proto_log()
3944 btf_verifier_log(env, ", %u %s", last_arg->type, in btf_func_proto_log()
3945 __btf_name_by_offset(env->btf, in btf_func_proto_log()
3948 btf_verifier_log(env, ", vararg"); in btf_func_proto_log()
3952 btf_verifier_log(env, ")"); in btf_func_proto_log()
3973 static s32 btf_func_check_meta(struct btf_verifier_env *env, in btf_func_check_meta() argument
3978 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_func_check_meta()
3979 btf_verifier_log_type(env, t, "Invalid name"); in btf_func_check_meta()
3984 btf_verifier_log_type(env, t, "Invalid func linkage"); in btf_func_check_meta()
3989 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_func_check_meta()
3993 btf_verifier_log_type(env, t, NULL); in btf_func_check_meta()
3998 static int btf_func_resolve(struct btf_verifier_env *env, in btf_func_resolve() argument
4005 err = btf_func_check(env, t); in btf_func_resolve()
4009 env_stack_pop_resolved(env, next_type_id, 0); in btf_func_resolve()
4022 static s32 btf_var_check_meta(struct btf_verifier_env *env, in btf_var_check_meta() argument
4030 btf_verifier_log_basic(env, t, in btf_var_check_meta()
4037 btf_verifier_log_type(env, t, "vlen != 0"); in btf_var_check_meta()
4042 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_var_check_meta()
4047 !__btf_name_valid(env->btf, t->name_off, true)) { in btf_var_check_meta()
4048 btf_verifier_log_type(env, t, "Invalid name"); in btf_var_check_meta()
4054 btf_verifier_log_type(env, t, "Invalid type_id"); in btf_var_check_meta()
4061 btf_verifier_log_type(env, t, "Linkage not supported"); in btf_var_check_meta()
4065 btf_verifier_log_type(env, t, NULL); in btf_var_check_meta()
4070 static void btf_var_log(struct btf_verifier_env *env, const struct btf_type *t) in btf_var_log() argument
4074 btf_verifier_log(env, "type_id=%u linkage=%u", t->type, var->linkage); in btf_var_log()
4086 static s32 btf_datasec_check_meta(struct btf_verifier_env *env, in btf_datasec_check_meta() argument
4096 btf_verifier_log_basic(env, t, in btf_datasec_check_meta()
4103 btf_verifier_log_type(env, t, "size == 0"); in btf_datasec_check_meta()
4108 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_datasec_check_meta()
4113 !btf_name_valid_section(env->btf, t->name_off)) { in btf_datasec_check_meta()
4114 btf_verifier_log_type(env, t, "Invalid name"); in btf_datasec_check_meta()
4118 btf_verifier_log_type(env, t, NULL); in btf_datasec_check_meta()
4123 btf_verifier_log_vsi(env, t, vsi, in btf_datasec_check_meta()
4129 btf_verifier_log_vsi(env, t, vsi, in btf_datasec_check_meta()
4135 btf_verifier_log_vsi(env, t, vsi, in btf_datasec_check_meta()
4142 btf_verifier_log_vsi(env, t, vsi, in btf_datasec_check_meta()
4147 btf_verifier_log_vsi(env, t, vsi, NULL); in btf_datasec_check_meta()
4152 btf_verifier_log_type(env, t, "Invalid btf_info size"); in btf_datasec_check_meta()
4159 static int btf_datasec_resolve(struct btf_verifier_env *env, in btf_datasec_resolve() argument
4163 struct btf *btf = env->btf; in btf_datasec_resolve()
4168 const struct btf_type *var_type = btf_type_by_id(env->btf, in btf_datasec_resolve()
4171 btf_verifier_log_vsi(env, v->t, vsi, in btf_datasec_resolve()
4176 if (!env_type_is_resolve_sink(env, var_type) && in btf_datasec_resolve()
4177 !env_type_is_resolved(env, var_type_id)) { in btf_datasec_resolve()
4178 env_stack_set_next_member(env, i + 1); in btf_datasec_resolve()
4179 return env_stack_push(env, var_type, var_type_id); in btf_datasec_resolve()
4184 btf_verifier_log_vsi(env, v->t, vsi, "Invalid type"); in btf_datasec_resolve()
4189 btf_verifier_log_vsi(env, v->t, vsi, "Invalid size"); in btf_datasec_resolve()
4194 env_stack_pop_resolved(env, 0, 0); in btf_datasec_resolve()
4198 static void btf_datasec_log(struct btf_verifier_env *env, in btf_datasec_log() argument
4201 btf_verifier_log(env, "size=%u vlen=%u", t->size, btf_type_vlen(t)); in btf_datasec_log()
4237 static s32 btf_float_check_meta(struct btf_verifier_env *env, in btf_float_check_meta() argument
4242 btf_verifier_log_type(env, t, "vlen != 0"); in btf_float_check_meta()
4247 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_float_check_meta()
4253 btf_verifier_log_type(env, t, "Invalid type_size"); in btf_float_check_meta()
4257 btf_verifier_log_type(env, t, NULL); in btf_float_check_meta()
4262 static int btf_float_check_member(struct btf_verifier_env *env, in btf_float_check_member() argument
4281 btf_verifier_log_member(env, struct_type, member, in btf_float_check_member()
4289 btf_verifier_log_member(env, struct_type, member, in btf_float_check_member()
4297 static void btf_float_log(struct btf_verifier_env *env, in btf_float_log() argument
4300 btf_verifier_log(env, "size=%u", t->size); in btf_float_log()
4312 static s32 btf_decl_tag_check_meta(struct btf_verifier_env *env, in btf_decl_tag_check_meta() argument
4322 btf_verifier_log_basic(env, t, in btf_decl_tag_check_meta()
4328 value = btf_name_by_offset(env->btf, t->name_off); in btf_decl_tag_check_meta()
4330 btf_verifier_log_type(env, t, "Invalid value"); in btf_decl_tag_check_meta()
4335 btf_verifier_log_type(env, t, "vlen != 0"); in btf_decl_tag_check_meta()
4340 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_decl_tag_check_meta()
4346 btf_verifier_log_type(env, t, "Invalid component_idx"); in btf_decl_tag_check_meta()
4350 btf_verifier_log_type(env, t, NULL); in btf_decl_tag_check_meta()
4355 static int btf_decl_tag_resolve(struct btf_verifier_env *env, in btf_decl_tag_resolve() argument
4361 struct btf *btf = env->btf; in btf_decl_tag_resolve()
4367 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_decl_tag_resolve()
4371 if (!env_type_is_resolve_sink(env, next_type) && in btf_decl_tag_resolve()
4372 !env_type_is_resolved(env, next_type_id)) in btf_decl_tag_resolve()
4373 return env_stack_push(env, next_type, next_type_id); in btf_decl_tag_resolve()
4378 btf_verifier_log_type(env, v->t, "Invalid component_idx"); in btf_decl_tag_resolve()
4391 btf_verifier_log_type(env, v->t, "Invalid component_idx"); in btf_decl_tag_resolve()
4396 env_stack_pop_resolved(env, next_type_id, 0); in btf_decl_tag_resolve()
4401 static void btf_decl_tag_log(struct btf_verifier_env *env, const struct btf_type *t) in btf_decl_tag_log() argument
4403 btf_verifier_log(env, "type=%u component_idx=%d", t->type, in btf_decl_tag_log()
4416 static int btf_func_proto_check(struct btf_verifier_env *env, in btf_func_proto_check() argument
4425 btf = env->btf; in btf_func_proto_check()
4435 btf_verifier_log_type(env, t, "Invalid return type"); in btf_func_proto_check()
4440 btf_verifier_log_type(env, t, "Invalid return type"); in btf_func_proto_check()
4445 !env_type_is_resolved(env, ret_type_id)) { in btf_func_proto_check()
4446 err = btf_resolve(env, ret_type, ret_type_id); in btf_func_proto_check()
4453 btf_verifier_log_type(env, t, "Invalid return type"); in btf_func_proto_check()
4464 btf_verifier_log_type(env, t, "Invalid arg#%u", in btf_func_proto_check()
4479 btf_verifier_log_type(env, t, "Invalid arg#%u", i + 1); in btf_func_proto_check()
4487 btf_verifier_log_type(env, t, in btf_func_proto_check()
4494 !env_type_is_resolved(env, arg_type_id)) { in btf_func_proto_check()
4495 err = btf_resolve(env, arg_type, arg_type_id); in btf_func_proto_check()
4501 btf_verifier_log_type(env, t, "Invalid arg#%u", i + 1); in btf_func_proto_check()
4510 static int btf_func_check(struct btf_verifier_env *env, in btf_func_check() argument
4518 btf = env->btf; in btf_func_check()
4522 btf_verifier_log_type(env, t, "Invalid type_id"); in btf_func_check()
4530 btf_verifier_log_type(env, t, "Invalid arg#%u", i + 1); in btf_func_check()
4560 static s32 btf_check_meta(struct btf_verifier_env *env, in btf_check_meta() argument
4568 btf_verifier_log(env, "[%u] meta_left:%u meta_needed:%zu", in btf_check_meta()
4569 env->log_type_id, meta_left, sizeof(*t)); in btf_check_meta()
4575 btf_verifier_log(env, "[%u] Invalid btf_info:%x", in btf_check_meta()
4576 env->log_type_id, t->info); in btf_check_meta()
4582 btf_verifier_log(env, "[%u] Invalid kind:%u", in btf_check_meta()
4583 env->log_type_id, BTF_INFO_KIND(t->info)); in btf_check_meta()
4587 if (!btf_name_offset_valid(env->btf, t->name_off)) { in btf_check_meta()
4588 btf_verifier_log(env, "[%u] Invalid name_offset:%u", in btf_check_meta()
4589 env->log_type_id, t->name_off); in btf_check_meta()
4593 var_meta_size = btf_type_ops(t)->check_meta(env, t, meta_left); in btf_check_meta()
4602 static int btf_check_all_metas(struct btf_verifier_env *env) in btf_check_all_metas() argument
4604 struct btf *btf = env->btf; in btf_check_all_metas()
4612 env->log_type_id = btf->base_btf ? btf->start_id : 1; in btf_check_all_metas()
4617 meta_size = btf_check_meta(env, t, end - cur); in btf_check_all_metas()
4621 btf_add_type(env, t); in btf_check_all_metas()
4623 env->log_type_id++; in btf_check_all_metas()
4629 static bool btf_resolve_valid(struct btf_verifier_env *env, in btf_resolve_valid() argument
4633 struct btf *btf = env->btf; in btf_resolve_valid()
4635 if (!env_type_is_resolved(env, type_id)) in btf_resolve_valid()
4670 static int btf_resolve(struct btf_verifier_env *env, in btf_resolve() argument
4673 u32 save_log_type_id = env->log_type_id; in btf_resolve()
4677 env->resolve_mode = RESOLVE_TBD; in btf_resolve()
4678 env_stack_push(env, t, type_id); in btf_resolve()
4679 while (!err && (v = env_stack_peak(env))) { in btf_resolve()
4680 env->log_type_id = v->type_id; in btf_resolve()
4681 err = btf_type_ops(v->t)->resolve(env, v); in btf_resolve()
4684 env->log_type_id = type_id; in btf_resolve()
4686 btf_verifier_log_type(env, t, in btf_resolve()
4690 btf_verifier_log_type(env, t, "Loop detected"); in btf_resolve()
4694 if (!err && !btf_resolve_valid(env, t, type_id)) { in btf_resolve()
4695 btf_verifier_log_type(env, t, "Invalid resolve state"); in btf_resolve()
4699 env->log_type_id = save_log_type_id; in btf_resolve()
4703 static int btf_check_all_types(struct btf_verifier_env *env) in btf_check_all_types() argument
4705 struct btf *btf = env->btf; in btf_check_all_types()
4710 err = env_resolve_init(env); in btf_check_all_types()
4714 env->phase++; in btf_check_all_types()
4719 env->log_type_id = type_id; in btf_check_all_types()
4721 !env_type_is_resolved(env, type_id)) { in btf_check_all_types()
4722 err = btf_resolve(env, t, type_id); in btf_check_all_types()
4728 err = btf_func_proto_check(env, t); in btf_check_all_types()
4737 static int btf_parse_type_sec(struct btf_verifier_env *env) in btf_parse_type_sec() argument
4739 const struct btf_header *hdr = &env->btf->hdr; in btf_parse_type_sec()
4744 btf_verifier_log(env, "Unaligned type_off"); in btf_parse_type_sec()
4748 if (!env->btf->base_btf && !hdr->type_len) { in btf_parse_type_sec()
4749 btf_verifier_log(env, "No type found"); in btf_parse_type_sec()
4753 err = btf_check_all_metas(env); in btf_parse_type_sec()
4757 return btf_check_all_types(env); in btf_parse_type_sec()
4760 static int btf_parse_str_sec(struct btf_verifier_env *env) in btf_parse_str_sec() argument
4763 struct btf *btf = env->btf; in btf_parse_str_sec()
4771 btf_verifier_log(env, "String section is not at the end"); in btf_parse_str_sec()
4780 btf_verifier_log(env, "Invalid string section"); in btf_parse_str_sec()
4784 btf_verifier_log(env, "Invalid string section"); in btf_parse_str_sec()
4804 static int btf_check_sec_info(struct btf_verifier_env *env, in btf_check_sec_info() argument
4812 btf = env->btf; in btf_check_sec_info()
4828 btf_verifier_log(env, "Invalid section offset"); in btf_check_sec_info()
4833 btf_verifier_log(env, "Unsupported section found"); in btf_check_sec_info()
4837 btf_verifier_log(env, "Section overlap found"); in btf_check_sec_info()
4841 btf_verifier_log(env, in btf_check_sec_info()
4850 btf_verifier_log(env, "Unsupported section found"); in btf_check_sec_info()
4857 static int btf_parse_hdr(struct btf_verifier_env *env) in btf_parse_hdr() argument
4863 btf = env->btf; in btf_parse_hdr()
4867 btf_verifier_log(env, "hdr_len not found"); in btf_parse_hdr()
4874 btf_verifier_log(env, "btf_header not found"); in btf_parse_hdr()
4885 btf_verifier_log(env, "Unsupported btf_header"); in btf_parse_hdr()
4896 btf_verifier_log_hdr(env, btf_data_size); in btf_parse_hdr()
4899 btf_verifier_log(env, "Invalid magic"); in btf_parse_hdr()
4904 btf_verifier_log(env, "Unsupported version"); in btf_parse_hdr()
4909 btf_verifier_log(env, "Unsupported flags"); in btf_parse_hdr()
4914 btf_verifier_log(env, "No data"); in btf_parse_hdr()
4918 return btf_check_sec_info(env, btf_data_size); in btf_parse_hdr()
4921 static int btf_check_type_tags(struct btf_verifier_env *env, in btf_check_type_tags() argument
4944 btf_verifier_log(env, "Max chain length or cycle detected"); in btf_check_type_tags()
4949 btf_verifier_log(env, "Type tags don't precede modifiers"); in btf_check_type_tags()
4971 struct btf_verifier_env *env = NULL; in btf_parse() local
4980 env = kzalloc(sizeof(*env), GFP_KERNEL | __GFP_NOWARN); in btf_parse()
4981 if (!env) in btf_parse()
4984 log = &env->log; in btf_parse()
5005 env->btf = btf; in btf_parse()
5021 err = btf_parse_hdr(env); in btf_parse()
5027 err = btf_parse_str_sec(env); in btf_parse()
5031 err = btf_parse_type_sec(env); in btf_parse()
5035 err = btf_check_type_tags(env, btf, 1); in btf_parse()
5044 btf_verifier_env_free(env); in btf_parse()
5049 btf_verifier_env_free(env); in btf_parse()
5167 struct btf_verifier_env *env = NULL; in BTF_ID() local
5172 env = kzalloc(sizeof(*env), GFP_KERNEL | __GFP_NOWARN); in BTF_ID()
5173 if (!env) in BTF_ID()
5176 log = &env->log; in BTF_ID()
5184 env->btf = btf; in BTF_ID()
5191 err = btf_parse_hdr(env); in BTF_ID()
5197 err = btf_parse_str_sec(env); in BTF_ID()
5201 err = btf_check_all_metas(env); in BTF_ID()
5205 err = btf_check_type_tags(env, btf, 1); in BTF_ID()
5220 btf_verifier_env_free(env); in BTF_ID()
5224 btf_verifier_env_free(env); in BTF_ID()
5236 struct btf_verifier_env *env = NULL; in btf_parse_module() local
5247 env = kzalloc(sizeof(*env), GFP_KERNEL | __GFP_NOWARN); in btf_parse_module()
5248 if (!env) in btf_parse_module()
5251 log = &env->log; in btf_parse_module()
5259 env->btf = btf; in btf_parse_module()
5275 err = btf_parse_hdr(env); in btf_parse_module()
5281 err = btf_parse_str_sec(env); in btf_parse_module()
5285 err = btf_check_all_metas(env); in btf_parse_module()
5289 err = btf_check_type_tags(env, btf, btf_nr_types(base_btf)); in btf_parse_module()
5293 btf_verifier_env_free(env); in btf_parse_module()
5298 btf_verifier_env_free(env); in btf_parse_module()
6227 static int btf_check_func_arg_match(struct bpf_verifier_env *env, in btf_check_func_arg_match() argument
6234 enum bpf_prog_type prog_type = resolve_prog_type(env->prog); in btf_check_func_arg_match()
6237 struct bpf_verifier_log *log = &env->log; in btf_check_func_arg_match()
6314 ret = mark_chain_precision(env, regno); in btf_check_func_arg_match()
6353 ret = check_func_arg_reg_off(env, reg, regno, arg_type); in btf_check_func_arg_match()
6494 if (!is_dynptr_reg_valid_init(env, reg)) { in btf_check_func_arg_match()
6502 if (!is_dynptr_type_expected(env, reg, in btf_check_func_arg_match()
6516 if (check_kfunc_mem_size_reg(env, ®s[regno + 1], regno + 1)) { in btf_check_func_arg_match()
6535 if (check_mem_reg(env, reg, regno, type_size)) in btf_check_func_arg_match()
6557 if (sleepable && !env->prog->aux->sleepable) { in btf_check_func_arg_match()
6577 int btf_check_subprog_arg_match(struct bpf_verifier_env *env, int subprog, in btf_check_subprog_arg_match() argument
6580 struct bpf_prog *prog = env->prog; in btf_check_subprog_arg_match()
6597 err = btf_check_func_arg_match(env, btf, btf_id, regs, is_global, NULL, false); in btf_check_subprog_arg_match()
6620 int btf_check_subprog_call(struct bpf_verifier_env *env, int subprog, in btf_check_subprog_call() argument
6623 struct bpf_prog *prog = env->prog; in btf_check_subprog_call()
6640 err = btf_check_func_arg_match(env, btf, btf_id, regs, is_global, NULL, true); in btf_check_subprog_call()
6651 int btf_check_kfunc_arg_match(struct bpf_verifier_env *env, in btf_check_kfunc_arg_match() argument
6656 return btf_check_func_arg_match(env, btf, func_id, regs, true, meta, true); in btf_check_kfunc_arg_match()
6666 int btf_prepare_func_args(struct bpf_verifier_env *env, int subprog, in btf_prepare_func_args() argument
6669 struct bpf_verifier_log *log = &env->log; in btf_prepare_func_args()
6670 struct bpf_prog *prog = env->prog; in btf_prepare_func_args()
6765 reg->id = ++env->id_gen; in btf_prepare_func_args()