Lines Matching refs:env
416 s32 (*check_meta)(struct btf_verifier_env *env,
419 int (*resolve)(struct btf_verifier_env *env,
421 int (*check_member)(struct btf_verifier_env *env,
425 int (*check_kflag_member)(struct btf_verifier_env *env,
429 void (*log_details)(struct btf_verifier_env *env,
439 static int btf_resolve(struct btf_verifier_env *env,
442 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()
1415 if (env->btf->base_btf && IS_ENABLED(CONFIG_MODULE_ALLOW_BTF_MISMATCH)) in __btf_verifier_log_type()
1420 env->log_type_id, in __btf_verifier_log_type()
1426 btf_type_ops(t)->log_details(env, t); in __btf_verifier_log_type()
1438 #define btf_verifier_log_type(env, t, ...) \ argument
1439 __btf_verifier_log_type((env), (t), true, __VA_ARGS__)
1440 #define btf_verifier_log_basic(env, t, ...) \ argument
1441 __btf_verifier_log_type((env), (t), false, __VA_ARGS__)
1444 static void btf_verifier_log_member(struct btf_verifier_env *env, in btf_verifier_log_member() argument
1449 struct bpf_verifier_log *log = &env->log; in btf_verifier_log_member()
1450 struct btf *btf = env->btf; in btf_verifier_log_member()
1461 if (env->btf->base_btf && IS_ENABLED(CONFIG_MODULE_ALLOW_BTF_MISMATCH)) in btf_verifier_log_member()
1471 if (env->phase != CHECK_META) in btf_verifier_log_member()
1472 btf_verifier_log_type(env, struct_type, NULL); in btf_verifier_log_member()
1497 static void btf_verifier_log_vsi(struct btf_verifier_env *env, in btf_verifier_log_vsi() argument
1502 struct bpf_verifier_log *log = &env->log; in btf_verifier_log_vsi()
1509 if (env->phase != CHECK_META) in btf_verifier_log_vsi()
1510 btf_verifier_log_type(env, datasec_type, NULL); in btf_verifier_log_vsi()
1524 static void btf_verifier_log_hdr(struct btf_verifier_env *env, in btf_verifier_log_hdr() argument
1527 struct bpf_verifier_log *log = &env->log; in btf_verifier_log_hdr()
1528 const struct btf *btf = env->btf; in btf_verifier_log_hdr()
1548 static int btf_add_type(struct btf_verifier_env *env, struct btf_type *t) in btf_add_type() argument
1550 struct btf *btf = env->btf; in btf_add_type()
1559 btf_verifier_log(env, "Exceeded max num of types"); in btf_add_type()
1711 static int env_resolve_init(struct btf_verifier_env *env) in env_resolve_init() argument
1713 struct btf *btf = env->btf; in env_resolve_init()
1736 env->visit_states = visit_states; in env_resolve_init()
1747 static void btf_verifier_env_free(struct btf_verifier_env *env) in btf_verifier_env_free() argument
1749 kvfree(env->visit_states); in btf_verifier_env_free()
1750 kfree(env); in btf_verifier_env_free()
1753 static bool env_type_is_resolve_sink(const struct btf_verifier_env *env, in env_type_is_resolve_sink() argument
1756 switch (env->resolve_mode) { in env_type_is_resolve_sink()
1778 static bool env_type_is_resolved(const struct btf_verifier_env *env, in env_type_is_resolved() argument
1782 if (type_id < env->btf->start_id) in env_type_is_resolved()
1785 return env->visit_states[type_id - env->btf->start_id] == RESOLVED; in env_type_is_resolved()
1788 static int env_stack_push(struct btf_verifier_env *env, in env_stack_push() argument
1791 const struct btf *btf = env->btf; in env_stack_push()
1794 if (env->top_stack == MAX_RESOLVE_DEPTH) in env_stack_push()
1798 || env->visit_states[type_id - btf->start_id] != NOT_VISITED) in env_stack_push()
1801 env->visit_states[type_id - btf->start_id] = VISITED; in env_stack_push()
1803 v = &env->stack[env->top_stack++]; in env_stack_push()
1808 if (env->resolve_mode == RESOLVE_TBD) { in env_stack_push()
1810 env->resolve_mode = RESOLVE_PTR; in env_stack_push()
1812 env->resolve_mode = RESOLVE_STRUCT_OR_ARRAY; in env_stack_push()
1818 static void env_stack_set_next_member(struct btf_verifier_env *env, in env_stack_set_next_member() argument
1821 env->stack[env->top_stack - 1].next_member = next_member; in env_stack_set_next_member()
1824 static void env_stack_pop_resolved(struct btf_verifier_env *env, in env_stack_pop_resolved() argument
1828 u32 type_id = env->stack[--(env->top_stack)].type_id; in env_stack_pop_resolved()
1829 struct btf *btf = env->btf; in env_stack_pop_resolved()
1834 env->visit_states[type_id] = RESOLVED; in env_stack_pop_resolved()
1837 static const struct resolve_vertex *env_stack_peak(struct btf_verifier_env *env) in env_stack_peak() argument
1839 return env->top_stack ? &env->stack[env->top_stack - 1] : NULL; in env_stack_peak()
2006 static int btf_df_check_member(struct btf_verifier_env *env, in btf_df_check_member() argument
2011 btf_verifier_log_basic(env, struct_type, in btf_df_check_member()
2016 static int btf_df_check_kflag_member(struct btf_verifier_env *env, in btf_df_check_kflag_member() argument
2021 btf_verifier_log_basic(env, struct_type, in btf_df_check_kflag_member()
2029 static int btf_generic_check_kflag_member(struct btf_verifier_env *env, in btf_generic_check_kflag_member() argument
2035 btf_verifier_log_member(env, struct_type, member, in btf_generic_check_kflag_member()
2043 return btf_type_ops(member_type)->check_member(env, struct_type, in btf_generic_check_kflag_member()
2048 static int btf_df_resolve(struct btf_verifier_env *env, in btf_df_resolve() argument
2051 btf_verifier_log_basic(env, v->t, "Unsupported resolve"); in btf_df_resolve()
2062 static int btf_int_check_member(struct btf_verifier_env *env, in btf_int_check_member() argument
2074 btf_verifier_log_member(env, struct_type, member, in btf_int_check_member()
2085 btf_verifier_log_member(env, struct_type, member, in btf_int_check_member()
2092 btf_verifier_log_member(env, struct_type, member, in btf_int_check_member()
2100 static int btf_int_check_kflag_member(struct btf_verifier_env *env, in btf_int_check_kflag_member() argument
2112 btf_verifier_log_member(env, struct_type, member, in btf_int_check_kflag_member()
2126 btf_verifier_log_member(env, struct_type, member, in btf_int_check_kflag_member()
2133 btf_verifier_log_member(env, struct_type, member, in btf_int_check_kflag_member()
2141 btf_verifier_log_member(env, struct_type, member, in btf_int_check_kflag_member()
2148 btf_verifier_log_member(env, struct_type, member, in btf_int_check_kflag_member()
2156 static s32 btf_int_check_meta(struct btf_verifier_env *env, in btf_int_check_meta() argument
2164 btf_verifier_log_basic(env, t, in btf_int_check_meta()
2171 btf_verifier_log_type(env, t, "vlen != 0"); in btf_int_check_meta()
2176 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_int_check_meta()
2182 btf_verifier_log_basic(env, t, "Invalid int_data:%x", in btf_int_check_meta()
2190 btf_verifier_log_type(env, t, "nr_bits exceeds %zu", in btf_int_check_meta()
2196 btf_verifier_log_type(env, t, "nr_bits exceeds type_size"); in btf_int_check_meta()
2211 btf_verifier_log_type(env, t, "Unsupported encoding"); in btf_int_check_meta()
2215 btf_verifier_log_type(env, t, NULL); in btf_int_check_meta()
2220 static void btf_int_log(struct btf_verifier_env *env, in btf_int_log() argument
2225 btf_verifier_log(env, in btf_int_log()
2421 static int btf_modifier_check_member(struct btf_verifier_env *env, in btf_modifier_check_member() argument
2429 struct btf *btf = env->btf; in btf_modifier_check_member()
2433 btf_verifier_log_member(env, struct_type, member, in btf_modifier_check_member()
2441 return btf_type_ops(resolved_type)->check_member(env, struct_type, in btf_modifier_check_member()
2446 static int btf_modifier_check_kflag_member(struct btf_verifier_env *env, in btf_modifier_check_kflag_member() argument
2454 struct btf *btf = env->btf; in btf_modifier_check_kflag_member()
2458 btf_verifier_log_member(env, struct_type, member, in btf_modifier_check_kflag_member()
2466 return btf_type_ops(resolved_type)->check_kflag_member(env, struct_type, in btf_modifier_check_kflag_member()
2471 static int btf_ptr_check_member(struct btf_verifier_env *env, in btf_ptr_check_member() argument
2483 btf_verifier_log_member(env, struct_type, member, in btf_ptr_check_member()
2489 btf_verifier_log_member(env, struct_type, member, in btf_ptr_check_member()
2497 static int btf_ref_type_check_meta(struct btf_verifier_env *env, in btf_ref_type_check_meta() argument
2504 btf_verifier_log_type(env, t, "vlen != 0"); in btf_ref_type_check_meta()
2509 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_ref_type_check_meta()
2514 btf_verifier_log_type(env, t, "Invalid type_id"); in btf_ref_type_check_meta()
2523 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_ref_type_check_meta()
2524 btf_verifier_log_type(env, t, "Invalid name"); in btf_ref_type_check_meta()
2528 value = btf_name_by_offset(env->btf, t->name_off); in btf_ref_type_check_meta()
2530 btf_verifier_log_type(env, t, "Invalid name"); in btf_ref_type_check_meta()
2535 btf_verifier_log_type(env, t, "Invalid name"); in btf_ref_type_check_meta()
2540 btf_verifier_log_type(env, t, NULL); in btf_ref_type_check_meta()
2545 static int btf_modifier_resolve(struct btf_verifier_env *env, in btf_modifier_resolve() argument
2551 struct btf *btf = env->btf; in btf_modifier_resolve()
2555 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_modifier_resolve()
2559 if (!env_type_is_resolve_sink(env, next_type) && in btf_modifier_resolve()
2560 !env_type_is_resolved(env, next_type_id)) in btf_modifier_resolve()
2561 return env_stack_push(env, next_type, next_type_id); in btf_modifier_resolve()
2570 if (env_type_is_resolved(env, next_type_id)) in btf_modifier_resolve()
2577 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_modifier_resolve()
2582 env_stack_pop_resolved(env, next_type_id, 0); in btf_modifier_resolve()
2587 static int btf_var_resolve(struct btf_verifier_env *env, in btf_var_resolve() argument
2593 struct btf *btf = env->btf; in btf_var_resolve()
2597 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_var_resolve()
2601 if (!env_type_is_resolve_sink(env, next_type) && in btf_var_resolve()
2602 !env_type_is_resolved(env, next_type_id)) in btf_var_resolve()
2603 return env_stack_push(env, next_type, next_type_id); in btf_var_resolve()
2613 !env_type_is_resolve_sink(env, resolved_type) && in btf_var_resolve()
2614 !env_type_is_resolved(env, resolved_type_id)) in btf_var_resolve()
2615 return env_stack_push(env, resolved_type, in btf_var_resolve()
2624 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_var_resolve()
2628 env_stack_pop_resolved(env, next_type_id, 0); in btf_var_resolve()
2633 static int btf_ptr_resolve(struct btf_verifier_env *env, in btf_ptr_resolve() argument
2639 struct btf *btf = env->btf; in btf_ptr_resolve()
2643 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_ptr_resolve()
2647 if (!env_type_is_resolve_sink(env, next_type) && in btf_ptr_resolve()
2648 !env_type_is_resolved(env, next_type_id)) in btf_ptr_resolve()
2649 return env_stack_push(env, next_type, next_type_id); in btf_ptr_resolve()
2667 !env_type_is_resolve_sink(env, resolved_type) && in btf_ptr_resolve()
2668 !env_type_is_resolved(env, resolved_type_id)) in btf_ptr_resolve()
2669 return env_stack_push(env, resolved_type, in btf_ptr_resolve()
2674 if (env_type_is_resolved(env, next_type_id)) in btf_ptr_resolve()
2680 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_ptr_resolve()
2685 env_stack_pop_resolved(env, next_type_id, 0); in btf_ptr_resolve()
2730 static void btf_ref_type_log(struct btf_verifier_env *env, in btf_ref_type_log() argument
2733 btf_verifier_log(env, "type_id=%u", t->type); in btf_ref_type_log()
2754 static s32 btf_fwd_check_meta(struct btf_verifier_env *env, in btf_fwd_check_meta() argument
2759 btf_verifier_log_type(env, t, "vlen != 0"); in btf_fwd_check_meta()
2764 btf_verifier_log_type(env, t, "type != 0"); in btf_fwd_check_meta()
2770 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_fwd_check_meta()
2771 btf_verifier_log_type(env, t, "Invalid name"); in btf_fwd_check_meta()
2775 btf_verifier_log_type(env, t, NULL); in btf_fwd_check_meta()
2780 static void btf_fwd_type_log(struct btf_verifier_env *env, in btf_fwd_type_log() argument
2783 btf_verifier_log(env, "%s", btf_type_kflag(t) ? "union" : "struct"); in btf_fwd_type_log()
2795 static int btf_array_check_member(struct btf_verifier_env *env, in btf_array_check_member() argument
2803 struct btf *btf = env->btf; in btf_array_check_member()
2806 btf_verifier_log_member(env, struct_type, member, in btf_array_check_member()
2816 btf_verifier_log_member(env, struct_type, member, in btf_array_check_member()
2824 static s32 btf_array_check_meta(struct btf_verifier_env *env, in btf_array_check_meta() argument
2832 btf_verifier_log_basic(env, t, in btf_array_check_meta()
2840 btf_verifier_log_type(env, t, "Invalid name"); in btf_array_check_meta()
2845 btf_verifier_log_type(env, t, "vlen != 0"); in btf_array_check_meta()
2850 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_array_check_meta()
2855 btf_verifier_log_type(env, t, "size != 0"); in btf_array_check_meta()
2863 btf_verifier_log_type(env, t, "Invalid elem"); in btf_array_check_meta()
2868 btf_verifier_log_type(env, t, "Invalid index"); in btf_array_check_meta()
2872 btf_verifier_log_type(env, t, NULL); in btf_array_check_meta()
2877 static int btf_array_resolve(struct btf_verifier_env *env, in btf_array_resolve() argument
2883 struct btf *btf = env->btf; in btf_array_resolve()
2891 btf_verifier_log_type(env, v->t, "Invalid index"); in btf_array_resolve()
2895 if (!env_type_is_resolve_sink(env, index_type) && in btf_array_resolve()
2896 !env_type_is_resolved(env, index_type_id)) in btf_array_resolve()
2897 return env_stack_push(env, index_type, index_type_id); in btf_array_resolve()
2902 btf_verifier_log_type(env, v->t, "Invalid index"); in btf_array_resolve()
2911 btf_verifier_log_type(env, v->t, in btf_array_resolve()
2916 if (!env_type_is_resolve_sink(env, elem_type) && in btf_array_resolve()
2917 !env_type_is_resolved(env, elem_type_id)) in btf_array_resolve()
2918 return env_stack_push(env, elem_type, elem_type_id); in btf_array_resolve()
2922 btf_verifier_log_type(env, v->t, "Invalid elem"); in btf_array_resolve()
2927 btf_verifier_log_type(env, v->t, "Invalid array of int"); in btf_array_resolve()
2932 btf_verifier_log_type(env, v->t, in btf_array_resolve()
2937 env_stack_pop_resolved(env, elem_type_id, elem_size * array->nelems); in btf_array_resolve()
2942 static void btf_array_log(struct btf_verifier_env *env, in btf_array_log() argument
2947 btf_verifier_log(env, "type_id=%u index_type_id=%u nr_elems=%u", in btf_array_log()
3046 static int btf_struct_check_member(struct btf_verifier_env *env, in btf_struct_check_member() argument
3055 btf_verifier_log_member(env, struct_type, member, in btf_struct_check_member()
3063 btf_verifier_log_member(env, struct_type, member, in btf_struct_check_member()
3071 static s32 btf_struct_check_meta(struct btf_verifier_env *env, in btf_struct_check_meta() argument
3078 struct btf *btf = env->btf; in btf_struct_check_meta()
3085 btf_verifier_log_basic(env, t, in btf_struct_check_meta()
3093 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_struct_check_meta()
3094 btf_verifier_log_type(env, t, "Invalid name"); in btf_struct_check_meta()
3098 btf_verifier_log_type(env, t, NULL); in btf_struct_check_meta()
3103 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
3112 btf_verifier_log_member(env, t, member, "Invalid name"); in btf_struct_check_meta()
3117 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
3124 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
3134 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
3140 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
3145 btf_verifier_log_member(env, t, member, NULL); in btf_struct_check_meta()
3152 static int btf_struct_resolve(struct btf_verifier_env *env, in btf_struct_resolve() argument
3170 if (WARN_ON_ONCE(!env_type_is_resolved(env, in btf_struct_resolve()
3174 last_member_type = btf_type_by_id(env->btf, in btf_struct_resolve()
3177 err = btf_type_ops(last_member_type)->check_kflag_member(env, v->t, in btf_struct_resolve()
3181 err = btf_type_ops(last_member_type)->check_member(env, v->t, in btf_struct_resolve()
3190 const struct btf_type *member_type = btf_type_by_id(env->btf, in btf_struct_resolve()
3195 btf_verifier_log_member(env, v->t, member, in btf_struct_resolve()
3200 if (!env_type_is_resolve_sink(env, member_type) && in btf_struct_resolve()
3201 !env_type_is_resolved(env, member_type_id)) { in btf_struct_resolve()
3202 env_stack_set_next_member(env, i + 1); in btf_struct_resolve()
3203 return env_stack_push(env, member_type, member_type_id); in btf_struct_resolve()
3207 err = btf_type_ops(member_type)->check_kflag_member(env, v->t, in btf_struct_resolve()
3211 err = btf_type_ops(member_type)->check_member(env, v->t, in btf_struct_resolve()
3218 env_stack_pop_resolved(env, 0, 0); in btf_struct_resolve()
3223 static void btf_struct_log(struct btf_verifier_env *env, in btf_struct_log() argument
3226 btf_verifier_log(env, "size=%u vlen=%u", t->size, btf_type_vlen(t)); in btf_struct_log()
4021 static int btf_enum_check_member(struct btf_verifier_env *env, in btf_enum_check_member() argument
4030 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_member()
4038 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_member()
4046 static int btf_enum_check_kflag_member(struct btf_verifier_env *env, in btf_enum_check_kflag_member() argument
4058 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_kflag_member()
4065 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_kflag_member()
4073 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_kflag_member()
4081 static s32 btf_enum_check_meta(struct btf_verifier_env *env, in btf_enum_check_meta() argument
4086 struct btf *btf = env->btf; in btf_enum_check_meta()
4095 btf_verifier_log_basic(env, t, in btf_enum_check_meta()
4102 btf_verifier_log_type(env, t, "Unexpected size"); in btf_enum_check_meta()
4108 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_enum_check_meta()
4109 btf_verifier_log_type(env, t, "Invalid name"); in btf_enum_check_meta()
4113 btf_verifier_log_type(env, t, NULL); in btf_enum_check_meta()
4117 btf_verifier_log(env, "\tInvalid name_offset:%u", in btf_enum_check_meta()
4125 btf_verifier_log_type(env, t, "Invalid name"); in btf_enum_check_meta()
4129 if (env->log.level == BPF_LOG_KERNEL) in btf_enum_check_meta()
4132 btf_verifier_log(env, fmt_str, in btf_enum_check_meta()
4140 static void btf_enum_log(struct btf_verifier_env *env, in btf_enum_log() argument
4143 btf_verifier_log(env, "size=%u vlen=%u", t->size, btf_type_vlen(t)); in btf_enum_log()
4189 static s32 btf_enum64_check_meta(struct btf_verifier_env *env, in btf_enum64_check_meta() argument
4194 struct btf *btf = env->btf; in btf_enum64_check_meta()
4203 btf_verifier_log_basic(env, t, in btf_enum64_check_meta()
4210 btf_verifier_log_type(env, t, "Unexpected size"); in btf_enum64_check_meta()
4216 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_enum64_check_meta()
4217 btf_verifier_log_type(env, t, "Invalid name"); in btf_enum64_check_meta()
4221 btf_verifier_log_type(env, t, NULL); in btf_enum64_check_meta()
4225 btf_verifier_log(env, "\tInvalid name_offset:%u", in btf_enum64_check_meta()
4233 btf_verifier_log_type(env, t, "Invalid name"); in btf_enum64_check_meta()
4237 if (env->log.level == BPF_LOG_KERNEL) in btf_enum64_check_meta()
4241 btf_verifier_log(env, fmt_str, in btf_enum64_check_meta()
4292 static s32 btf_func_proto_check_meta(struct btf_verifier_env *env, in btf_func_proto_check_meta() argument
4299 btf_verifier_log_basic(env, t, in btf_func_proto_check_meta()
4306 btf_verifier_log_type(env, t, "Invalid name"); in btf_func_proto_check_meta()
4311 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_func_proto_check_meta()
4315 btf_verifier_log_type(env, t, NULL); in btf_func_proto_check_meta()
4320 static void btf_func_proto_log(struct btf_verifier_env *env, in btf_func_proto_log() argument
4326 btf_verifier_log(env, "return=%u args=(", t->type); in btf_func_proto_log()
4328 btf_verifier_log(env, "void"); in btf_func_proto_log()
4334 btf_verifier_log(env, "vararg"); in btf_func_proto_log()
4338 btf_verifier_log(env, "%u %s", args[0].type, in btf_func_proto_log()
4339 __btf_name_by_offset(env->btf, in btf_func_proto_log()
4342 btf_verifier_log(env, ", %u %s", args[i].type, in btf_func_proto_log()
4343 __btf_name_by_offset(env->btf, in btf_func_proto_log()
4350 btf_verifier_log(env, ", %u %s", last_arg->type, in btf_func_proto_log()
4351 __btf_name_by_offset(env->btf, in btf_func_proto_log()
4354 btf_verifier_log(env, ", vararg"); in btf_func_proto_log()
4358 btf_verifier_log(env, ")"); in btf_func_proto_log()
4379 static s32 btf_func_check_meta(struct btf_verifier_env *env, in btf_func_check_meta() argument
4384 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_func_check_meta()
4385 btf_verifier_log_type(env, t, "Invalid name"); in btf_func_check_meta()
4390 btf_verifier_log_type(env, t, "Invalid func linkage"); in btf_func_check_meta()
4395 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_func_check_meta()
4399 btf_verifier_log_type(env, t, NULL); in btf_func_check_meta()
4404 static int btf_func_resolve(struct btf_verifier_env *env, in btf_func_resolve() argument
4411 err = btf_func_check(env, t); in btf_func_resolve()
4415 env_stack_pop_resolved(env, next_type_id, 0); in btf_func_resolve()
4428 static s32 btf_var_check_meta(struct btf_verifier_env *env, in btf_var_check_meta() argument
4436 btf_verifier_log_basic(env, t, in btf_var_check_meta()
4443 btf_verifier_log_type(env, t, "vlen != 0"); in btf_var_check_meta()
4448 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_var_check_meta()
4453 !__btf_name_valid(env->btf, t->name_off, true)) { in btf_var_check_meta()
4454 btf_verifier_log_type(env, t, "Invalid name"); in btf_var_check_meta()
4460 btf_verifier_log_type(env, t, "Invalid type_id"); in btf_var_check_meta()
4467 btf_verifier_log_type(env, t, "Linkage not supported"); in btf_var_check_meta()
4471 btf_verifier_log_type(env, t, NULL); in btf_var_check_meta()
4476 static void btf_var_log(struct btf_verifier_env *env, const struct btf_type *t) in btf_var_log() argument
4480 btf_verifier_log(env, "type_id=%u linkage=%u", t->type, var->linkage); in btf_var_log()
4492 static s32 btf_datasec_check_meta(struct btf_verifier_env *env, in btf_datasec_check_meta() argument
4502 btf_verifier_log_basic(env, t, in btf_datasec_check_meta()
4509 btf_verifier_log_type(env, t, "size == 0"); in btf_datasec_check_meta()
4514 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_datasec_check_meta()
4519 !btf_name_valid_section(env->btf, t->name_off)) { in btf_datasec_check_meta()
4520 btf_verifier_log_type(env, t, "Invalid name"); in btf_datasec_check_meta()
4524 btf_verifier_log_type(env, t, NULL); in btf_datasec_check_meta()
4529 btf_verifier_log_vsi(env, t, vsi, in btf_datasec_check_meta()
4535 btf_verifier_log_vsi(env, t, vsi, in btf_datasec_check_meta()
4541 btf_verifier_log_vsi(env, t, vsi, in btf_datasec_check_meta()
4548 btf_verifier_log_vsi(env, t, vsi, in btf_datasec_check_meta()
4553 btf_verifier_log_vsi(env, t, vsi, NULL); in btf_datasec_check_meta()
4558 btf_verifier_log_type(env, t, "Invalid btf_info size"); in btf_datasec_check_meta()
4565 static int btf_datasec_resolve(struct btf_verifier_env *env, in btf_datasec_resolve() argument
4569 struct btf *btf = env->btf; in btf_datasec_resolve()
4572 env->resolve_mode = RESOLVE_TBD; in btf_datasec_resolve()
4575 const struct btf_type *var_type = btf_type_by_id(env->btf, in btf_datasec_resolve()
4578 btf_verifier_log_vsi(env, v->t, vsi, in btf_datasec_resolve()
4583 if (!env_type_is_resolve_sink(env, var_type) && in btf_datasec_resolve()
4584 !env_type_is_resolved(env, var_type_id)) { in btf_datasec_resolve()
4585 env_stack_set_next_member(env, i + 1); in btf_datasec_resolve()
4586 return env_stack_push(env, var_type, var_type_id); in btf_datasec_resolve()
4591 btf_verifier_log_vsi(env, v->t, vsi, "Invalid type"); in btf_datasec_resolve()
4596 btf_verifier_log_vsi(env, v->t, vsi, "Invalid size"); in btf_datasec_resolve()
4601 env_stack_pop_resolved(env, 0, 0); in btf_datasec_resolve()
4605 static void btf_datasec_log(struct btf_verifier_env *env, in btf_datasec_log() argument
4608 btf_verifier_log(env, "size=%u vlen=%u", t->size, btf_type_vlen(t)); in btf_datasec_log()
4644 static s32 btf_float_check_meta(struct btf_verifier_env *env, in btf_float_check_meta() argument
4649 btf_verifier_log_type(env, t, "vlen != 0"); in btf_float_check_meta()
4654 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_float_check_meta()
4660 btf_verifier_log_type(env, t, "Invalid type_size"); in btf_float_check_meta()
4664 btf_verifier_log_type(env, t, NULL); in btf_float_check_meta()
4669 static int btf_float_check_member(struct btf_verifier_env *env, in btf_float_check_member() argument
4688 btf_verifier_log_member(env, struct_type, member, in btf_float_check_member()
4696 btf_verifier_log_member(env, struct_type, member, in btf_float_check_member()
4704 static void btf_float_log(struct btf_verifier_env *env, in btf_float_log() argument
4707 btf_verifier_log(env, "size=%u", t->size); in btf_float_log()
4719 static s32 btf_decl_tag_check_meta(struct btf_verifier_env *env, in btf_decl_tag_check_meta() argument
4729 btf_verifier_log_basic(env, t, in btf_decl_tag_check_meta()
4735 value = btf_name_by_offset(env->btf, t->name_off); in btf_decl_tag_check_meta()
4737 btf_verifier_log_type(env, t, "Invalid value"); in btf_decl_tag_check_meta()
4742 btf_verifier_log_type(env, t, "vlen != 0"); in btf_decl_tag_check_meta()
4747 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_decl_tag_check_meta()
4753 btf_verifier_log_type(env, t, "Invalid component_idx"); in btf_decl_tag_check_meta()
4757 btf_verifier_log_type(env, t, NULL); in btf_decl_tag_check_meta()
4762 static int btf_decl_tag_resolve(struct btf_verifier_env *env, in btf_decl_tag_resolve() argument
4768 struct btf *btf = env->btf; in btf_decl_tag_resolve()
4774 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_decl_tag_resolve()
4778 if (!env_type_is_resolve_sink(env, next_type) && in btf_decl_tag_resolve()
4779 !env_type_is_resolved(env, next_type_id)) in btf_decl_tag_resolve()
4780 return env_stack_push(env, next_type, next_type_id); in btf_decl_tag_resolve()
4785 btf_verifier_log_type(env, v->t, "Invalid component_idx"); in btf_decl_tag_resolve()
4798 btf_verifier_log_type(env, v->t, "Invalid component_idx"); in btf_decl_tag_resolve()
4803 env_stack_pop_resolved(env, next_type_id, 0); in btf_decl_tag_resolve()
4808 static void btf_decl_tag_log(struct btf_verifier_env *env, const struct btf_type *t) in btf_decl_tag_log() argument
4810 btf_verifier_log(env, "type=%u component_idx=%d", t->type, in btf_decl_tag_log()
4823 static int btf_func_proto_check(struct btf_verifier_env *env, in btf_func_proto_check() argument
4832 btf = env->btf; in btf_func_proto_check()
4842 btf_verifier_log_type(env, t, "Invalid return type"); in btf_func_proto_check()
4847 btf_verifier_log_type(env, t, "Invalid return type"); in btf_func_proto_check()
4852 !env_type_is_resolved(env, ret_type_id)) { in btf_func_proto_check()
4853 err = btf_resolve(env, ret_type, ret_type_id); in btf_func_proto_check()
4860 btf_verifier_log_type(env, t, "Invalid return type"); in btf_func_proto_check()
4871 btf_verifier_log_type(env, t, "Invalid arg#%u", in btf_func_proto_check()
4885 btf_verifier_log_type(env, t, "Invalid arg#%u", i + 1); in btf_func_proto_check()
4890 btf_verifier_log_type(env, t, "Invalid arg#%u", i + 1); in btf_func_proto_check()
4897 btf_verifier_log_type(env, t, in btf_func_proto_check()
4903 !env_type_is_resolved(env, arg_type_id)) { in btf_func_proto_check()
4904 err = btf_resolve(env, arg_type, arg_type_id); in btf_func_proto_check()
4910 btf_verifier_log_type(env, t, "Invalid arg#%u", i + 1); in btf_func_proto_check()
4918 static int btf_func_check(struct btf_verifier_env *env, in btf_func_check() argument
4926 btf = env->btf; in btf_func_check()
4930 btf_verifier_log_type(env, t, "Invalid type_id"); in btf_func_check()
4938 btf_verifier_log_type(env, t, "Invalid arg#%u", i + 1); in btf_func_check()
4968 static s32 btf_check_meta(struct btf_verifier_env *env, in btf_check_meta() argument
4976 btf_verifier_log(env, "[%u] meta_left:%u meta_needed:%zu", in btf_check_meta()
4977 env->log_type_id, meta_left, sizeof(*t)); in btf_check_meta()
4983 btf_verifier_log(env, "[%u] Invalid btf_info:%x", in btf_check_meta()
4984 env->log_type_id, t->info); in btf_check_meta()
4990 btf_verifier_log(env, "[%u] Invalid kind:%u", in btf_check_meta()
4991 env->log_type_id, BTF_INFO_KIND(t->info)); in btf_check_meta()
4995 if (!btf_name_offset_valid(env->btf, t->name_off)) { in btf_check_meta()
4996 btf_verifier_log(env, "[%u] Invalid name_offset:%u", in btf_check_meta()
4997 env->log_type_id, t->name_off); in btf_check_meta()
5001 var_meta_size = btf_type_ops(t)->check_meta(env, t, meta_left); in btf_check_meta()
5010 static int btf_check_all_metas(struct btf_verifier_env *env) in btf_check_all_metas() argument
5012 struct btf *btf = env->btf; in btf_check_all_metas()
5020 env->log_type_id = btf->base_btf ? btf->start_id : 1; in btf_check_all_metas()
5025 meta_size = btf_check_meta(env, t, end - cur); in btf_check_all_metas()
5029 btf_add_type(env, t); in btf_check_all_metas()
5031 env->log_type_id++; in btf_check_all_metas()
5037 static bool btf_resolve_valid(struct btf_verifier_env *env, in btf_resolve_valid() argument
5041 struct btf *btf = env->btf; in btf_resolve_valid()
5043 if (!env_type_is_resolved(env, type_id)) in btf_resolve_valid()
5078 static int btf_resolve(struct btf_verifier_env *env, in btf_resolve() argument
5081 u32 save_log_type_id = env->log_type_id; in btf_resolve()
5085 env->resolve_mode = RESOLVE_TBD; in btf_resolve()
5086 env_stack_push(env, t, type_id); in btf_resolve()
5087 while (!err && (v = env_stack_peak(env))) { in btf_resolve()
5088 env->log_type_id = v->type_id; in btf_resolve()
5089 err = btf_type_ops(v->t)->resolve(env, v); in btf_resolve()
5092 env->log_type_id = type_id; in btf_resolve()
5094 btf_verifier_log_type(env, t, in btf_resolve()
5098 btf_verifier_log_type(env, t, "Loop detected"); in btf_resolve()
5102 if (!err && !btf_resolve_valid(env, t, type_id)) { in btf_resolve()
5103 btf_verifier_log_type(env, t, "Invalid resolve state"); in btf_resolve()
5107 env->log_type_id = save_log_type_id; in btf_resolve()
5111 static int btf_check_all_types(struct btf_verifier_env *env) in btf_check_all_types() argument
5113 struct btf *btf = env->btf; in btf_check_all_types()
5118 err = env_resolve_init(env); in btf_check_all_types()
5122 env->phase++; in btf_check_all_types()
5127 env->log_type_id = type_id; in btf_check_all_types()
5129 !env_type_is_resolved(env, type_id)) { in btf_check_all_types()
5130 err = btf_resolve(env, t, type_id); in btf_check_all_types()
5136 err = btf_func_proto_check(env, t); in btf_check_all_types()
5145 static int btf_parse_type_sec(struct btf_verifier_env *env) in btf_parse_type_sec() argument
5147 const struct btf_header *hdr = &env->btf->hdr; in btf_parse_type_sec()
5152 btf_verifier_log(env, "Unaligned type_off"); in btf_parse_type_sec()
5156 if (!env->btf->base_btf && !hdr->type_len) { in btf_parse_type_sec()
5157 btf_verifier_log(env, "No type found"); in btf_parse_type_sec()
5161 err = btf_check_all_metas(env); in btf_parse_type_sec()
5165 return btf_check_all_types(env); in btf_parse_type_sec()
5168 static int btf_parse_str_sec(struct btf_verifier_env *env) in btf_parse_str_sec() argument
5171 struct btf *btf = env->btf; in btf_parse_str_sec()
5179 btf_verifier_log(env, "String section is not at the end"); in btf_parse_str_sec()
5188 btf_verifier_log(env, "Invalid string section"); in btf_parse_str_sec()
5192 btf_verifier_log(env, "Invalid string section"); in btf_parse_str_sec()
5212 static int btf_check_sec_info(struct btf_verifier_env *env, in btf_check_sec_info() argument
5220 btf = env->btf; in btf_check_sec_info()
5236 btf_verifier_log(env, "Invalid section offset"); in btf_check_sec_info()
5241 btf_verifier_log(env, "Unsupported section found"); in btf_check_sec_info()
5245 btf_verifier_log(env, "Section overlap found"); in btf_check_sec_info()
5249 btf_verifier_log(env, in btf_check_sec_info()
5258 btf_verifier_log(env, "Unsupported section found"); in btf_check_sec_info()
5265 static int btf_parse_hdr(struct btf_verifier_env *env) in btf_parse_hdr() argument
5271 btf = env->btf; in btf_parse_hdr()
5275 btf_verifier_log(env, "hdr_len not found"); in btf_parse_hdr()
5282 btf_verifier_log(env, "btf_header not found"); in btf_parse_hdr()
5293 btf_verifier_log(env, "Unsupported btf_header"); in btf_parse_hdr()
5304 btf_verifier_log_hdr(env, btf_data_size); in btf_parse_hdr()
5307 btf_verifier_log(env, "Invalid magic"); in btf_parse_hdr()
5312 btf_verifier_log(env, "Unsupported version"); in btf_parse_hdr()
5317 btf_verifier_log(env, "Unsupported flags"); in btf_parse_hdr()
5322 btf_verifier_log(env, "No data"); in btf_parse_hdr()
5326 return btf_check_sec_info(env, btf_data_size); in btf_parse_hdr()
5445 static int btf_check_type_tags(struct btf_verifier_env *env, in btf_check_type_tags() argument
5468 btf_verifier_log(env, "Max chain length or cycle detected"); in btf_check_type_tags()
5473 btf_verifier_log(env, "Type tags don't precede modifiers"); in btf_check_type_tags()
5496 struct btf_verifier_env *env = NULL; in btf_parse() local
5505 env = kzalloc(sizeof(*env), GFP_KERNEL | __GFP_NOWARN); in btf_parse()
5506 if (!env) in btf_parse()
5509 log = &env->log; in btf_parse()
5530 env->btf = btf; in btf_parse()
5546 err = btf_parse_hdr(env); in btf_parse()
5552 err = btf_parse_str_sec(env); in btf_parse()
5556 err = btf_parse_type_sec(env); in btf_parse()
5560 err = btf_check_type_tags(env, btf, 1); in btf_parse()
5586 btf_verifier_env_free(env); in btf_parse()
5593 btf_verifier_env_free(env); in btf_parse()
5740 struct btf_verifier_env *env = NULL; in BTF_ID() local
5745 env = kzalloc(sizeof(*env), GFP_KERNEL | __GFP_NOWARN); in BTF_ID()
5746 if (!env) in BTF_ID()
5749 log = &env->log; in BTF_ID()
5757 env->btf = btf; in BTF_ID()
5764 err = btf_parse_hdr(env); in BTF_ID()
5770 err = btf_parse_str_sec(env); in BTF_ID()
5774 err = btf_check_all_metas(env); in BTF_ID()
5778 err = btf_check_type_tags(env, btf, 1); in BTF_ID()
5793 btf_verifier_env_free(env); in BTF_ID()
5797 btf_verifier_env_free(env); in BTF_ID()
5809 struct btf_verifier_env *env = NULL; in btf_parse_module() local
5820 env = kzalloc(sizeof(*env), GFP_KERNEL | __GFP_NOWARN); in btf_parse_module()
5821 if (!env) in btf_parse_module()
5824 log = &env->log; in btf_parse_module()
5832 env->btf = btf; in btf_parse_module()
5848 err = btf_parse_hdr(env); in btf_parse_module()
5854 err = btf_parse_str_sec(env); in btf_parse_module()
5858 err = btf_check_all_metas(env); in btf_parse_module()
5862 err = btf_check_type_tags(env, btf, btf_nr_types(base_btf)); in btf_parse_module()
5866 btf_verifier_env_free(env); in btf_parse_module()
5871 btf_verifier_env_free(env); in btf_parse_module()
6767 static int btf_check_func_arg_match(struct bpf_verifier_env *env, in btf_check_func_arg_match() argument
6773 enum bpf_prog_type prog_type = resolve_prog_type(env->prog); in btf_check_func_arg_match()
6774 struct bpf_verifier_log *log = &env->log; in btf_check_func_arg_match()
6830 ret = check_func_arg_reg_off(env, reg, regno, arg_type); in btf_check_func_arg_match()
6857 if (check_mem_reg(env, reg, regno, type_size)) in btf_check_func_arg_match()
6876 int btf_check_subprog_arg_match(struct bpf_verifier_env *env, int subprog, in btf_check_subprog_arg_match() argument
6879 struct bpf_prog *prog = env->prog; in btf_check_subprog_arg_match()
6896 err = btf_check_func_arg_match(env, btf, btf_id, regs, is_global, false); in btf_check_subprog_arg_match()
6919 int btf_check_subprog_call(struct bpf_verifier_env *env, int subprog, in btf_check_subprog_call() argument
6922 struct bpf_prog *prog = env->prog; in btf_check_subprog_call()
6939 err = btf_check_func_arg_match(env, btf, btf_id, regs, is_global, true); in btf_check_subprog_call()
6957 int btf_prepare_func_args(struct bpf_verifier_env *env, int subprog, in btf_prepare_func_args() argument
6960 struct bpf_verifier_log *log = &env->log; in btf_prepare_func_args()
6961 struct bpf_prog *prog = env->prog; in btf_prepare_func_args()
7056 reg->id = ++env->id_gen; in btf_prepare_func_args()