Lines Matching refs:env

433 	s32 (*check_meta)(struct btf_verifier_env *env,
436 int (*resolve)(struct btf_verifier_env *env,
438 int (*check_member)(struct btf_verifier_env *env,
442 int (*check_kflag_member)(struct btf_verifier_env *env,
446 void (*log_details)(struct btf_verifier_env *env,
456 static int btf_resolve(struct btf_verifier_env *env,
459 static int btf_func_check(struct btf_verifier_env *env,
1394 __printf(2, 3) static void btf_verifier_log(struct btf_verifier_env *env, in btf_verifier_log() argument
1397 struct bpf_verifier_log *log = &env->log; in btf_verifier_log()
1408 __printf(4, 5) static void __btf_verifier_log_type(struct btf_verifier_env *env, in __btf_verifier_log_type() argument
1413 struct bpf_verifier_log *log = &env->log; in __btf_verifier_log_type()
1414 struct btf *btf = env->btf; in __btf_verifier_log_type()
1429 if (env->btf->base_btf && IS_ENABLED(CONFIG_MODULE_ALLOW_BTF_MISMATCH)) in __btf_verifier_log_type()
1434 env->log_type_id, in __btf_verifier_log_type()
1440 btf_type_ops(t)->log_details(env, t); in __btf_verifier_log_type()
1452 #define btf_verifier_log_type(env, t, ...) \ argument
1453 __btf_verifier_log_type((env), (t), true, __VA_ARGS__)
1454 #define btf_verifier_log_basic(env, t, ...) \ argument
1455 __btf_verifier_log_type((env), (t), false, __VA_ARGS__)
1458 static void btf_verifier_log_member(struct btf_verifier_env *env, in btf_verifier_log_member() argument
1463 struct bpf_verifier_log *log = &env->log; in btf_verifier_log_member()
1464 struct btf *btf = env->btf; in btf_verifier_log_member()
1475 if (env->btf->base_btf && IS_ENABLED(CONFIG_MODULE_ALLOW_BTF_MISMATCH)) in btf_verifier_log_member()
1485 if (env->phase != CHECK_META) in btf_verifier_log_member()
1486 btf_verifier_log_type(env, struct_type, NULL); in btf_verifier_log_member()
1511 static void btf_verifier_log_vsi(struct btf_verifier_env *env, in btf_verifier_log_vsi() argument
1516 struct bpf_verifier_log *log = &env->log; in btf_verifier_log_vsi()
1523 if (env->phase != CHECK_META) in btf_verifier_log_vsi()
1524 btf_verifier_log_type(env, datasec_type, NULL); in btf_verifier_log_vsi()
1538 static void btf_verifier_log_hdr(struct btf_verifier_env *env, in btf_verifier_log_hdr() argument
1541 struct bpf_verifier_log *log = &env->log; in btf_verifier_log_hdr()
1542 const struct btf *btf = env->btf; in btf_verifier_log_hdr()
1562 static int btf_add_type(struct btf_verifier_env *env, struct btf_type *t) in btf_add_type() argument
1564 struct btf *btf = env->btf; in btf_add_type()
1573 btf_verifier_log(env, "Exceeded max num of types"); in btf_add_type()
1723 static int env_resolve_init(struct btf_verifier_env *env) in env_resolve_init() argument
1725 struct btf *btf = env->btf; in env_resolve_init()
1748 env->visit_states = visit_states; in env_resolve_init()
1759 static void btf_verifier_env_free(struct btf_verifier_env *env) in btf_verifier_env_free() argument
1761 kvfree(env->visit_states); in btf_verifier_env_free()
1762 kfree(env); in btf_verifier_env_free()
1765 static bool env_type_is_resolve_sink(const struct btf_verifier_env *env, in env_type_is_resolve_sink() argument
1768 switch (env->resolve_mode) { in env_type_is_resolve_sink()
1790 static bool env_type_is_resolved(const struct btf_verifier_env *env, in env_type_is_resolved() argument
1794 if (type_id < env->btf->start_id) in env_type_is_resolved()
1797 return env->visit_states[type_id - env->btf->start_id] == RESOLVED; in env_type_is_resolved()
1800 static int env_stack_push(struct btf_verifier_env *env, in env_stack_push() argument
1803 const struct btf *btf = env->btf; in env_stack_push()
1806 if (env->top_stack == MAX_RESOLVE_DEPTH) in env_stack_push()
1810 || env->visit_states[type_id - btf->start_id] != NOT_VISITED) in env_stack_push()
1813 env->visit_states[type_id - btf->start_id] = VISITED; in env_stack_push()
1815 v = &env->stack[env->top_stack++]; in env_stack_push()
1820 if (env->resolve_mode == RESOLVE_TBD) { in env_stack_push()
1822 env->resolve_mode = RESOLVE_PTR; in env_stack_push()
1824 env->resolve_mode = RESOLVE_STRUCT_OR_ARRAY; in env_stack_push()
1830 static void env_stack_set_next_member(struct btf_verifier_env *env, in env_stack_set_next_member() argument
1833 env->stack[env->top_stack - 1].next_member = next_member; in env_stack_set_next_member()
1836 static void env_stack_pop_resolved(struct btf_verifier_env *env, in env_stack_pop_resolved() argument
1840 u32 type_id = env->stack[--(env->top_stack)].type_id; in env_stack_pop_resolved()
1841 struct btf *btf = env->btf; in env_stack_pop_resolved()
1846 env->visit_states[type_id] = RESOLVED; in env_stack_pop_resolved()
1849 static const struct resolve_vertex *env_stack_peak(struct btf_verifier_env *env) in env_stack_peak() argument
1851 return env->top_stack ? &env->stack[env->top_stack - 1] : NULL; in env_stack_peak()
2018 static int btf_df_check_member(struct btf_verifier_env *env, in btf_df_check_member() argument
2023 btf_verifier_log_basic(env, struct_type, in btf_df_check_member()
2028 static int btf_df_check_kflag_member(struct btf_verifier_env *env, in btf_df_check_kflag_member() argument
2033 btf_verifier_log_basic(env, struct_type, in btf_df_check_kflag_member()
2041 static int btf_generic_check_kflag_member(struct btf_verifier_env *env, in btf_generic_check_kflag_member() argument
2047 btf_verifier_log_member(env, struct_type, member, in btf_generic_check_kflag_member()
2055 return btf_type_ops(member_type)->check_member(env, struct_type, in btf_generic_check_kflag_member()
2060 static int btf_df_resolve(struct btf_verifier_env *env, in btf_df_resolve() argument
2063 btf_verifier_log_basic(env, v->t, "Unsupported resolve"); in btf_df_resolve()
2074 static int btf_int_check_member(struct btf_verifier_env *env, in btf_int_check_member() argument
2086 btf_verifier_log_member(env, struct_type, member, in btf_int_check_member()
2097 btf_verifier_log_member(env, struct_type, member, in btf_int_check_member()
2104 btf_verifier_log_member(env, struct_type, member, in btf_int_check_member()
2112 static int btf_int_check_kflag_member(struct btf_verifier_env *env, in btf_int_check_kflag_member() argument
2124 btf_verifier_log_member(env, struct_type, member, in btf_int_check_kflag_member()
2138 btf_verifier_log_member(env, struct_type, member, in btf_int_check_kflag_member()
2145 btf_verifier_log_member(env, struct_type, member, in btf_int_check_kflag_member()
2153 btf_verifier_log_member(env, struct_type, member, in btf_int_check_kflag_member()
2160 btf_verifier_log_member(env, struct_type, member, in btf_int_check_kflag_member()
2168 static s32 btf_int_check_meta(struct btf_verifier_env *env, in btf_int_check_meta() argument
2176 btf_verifier_log_basic(env, t, in btf_int_check_meta()
2183 btf_verifier_log_type(env, t, "vlen != 0"); in btf_int_check_meta()
2188 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_int_check_meta()
2194 btf_verifier_log_basic(env, t, "Invalid int_data:%x", in btf_int_check_meta()
2202 btf_verifier_log_type(env, t, "nr_bits exceeds %zu", in btf_int_check_meta()
2208 btf_verifier_log_type(env, t, "nr_bits exceeds type_size"); in btf_int_check_meta()
2223 btf_verifier_log_type(env, t, "Unsupported encoding"); in btf_int_check_meta()
2227 btf_verifier_log_type(env, t, NULL); in btf_int_check_meta()
2232 static void btf_int_log(struct btf_verifier_env *env, in btf_int_log() argument
2237 btf_verifier_log(env, in btf_int_log()
2433 static int btf_modifier_check_member(struct btf_verifier_env *env, in btf_modifier_check_member() argument
2441 struct btf *btf = env->btf; in btf_modifier_check_member()
2445 btf_verifier_log_member(env, struct_type, member, in btf_modifier_check_member()
2453 return btf_type_ops(resolved_type)->check_member(env, struct_type, in btf_modifier_check_member()
2458 static int btf_modifier_check_kflag_member(struct btf_verifier_env *env, in btf_modifier_check_kflag_member() argument
2466 struct btf *btf = env->btf; in btf_modifier_check_kflag_member()
2470 btf_verifier_log_member(env, struct_type, member, in btf_modifier_check_kflag_member()
2478 return btf_type_ops(resolved_type)->check_kflag_member(env, struct_type, in btf_modifier_check_kflag_member()
2483 static int btf_ptr_check_member(struct btf_verifier_env *env, in btf_ptr_check_member() argument
2495 btf_verifier_log_member(env, struct_type, member, in btf_ptr_check_member()
2501 btf_verifier_log_member(env, struct_type, member, in btf_ptr_check_member()
2509 static int btf_ref_type_check_meta(struct btf_verifier_env *env, in btf_ref_type_check_meta() argument
2516 btf_verifier_log_type(env, t, "vlen != 0"); in btf_ref_type_check_meta()
2521 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_ref_type_check_meta()
2526 btf_verifier_log_type(env, t, "Invalid type_id"); in btf_ref_type_check_meta()
2535 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_ref_type_check_meta()
2536 btf_verifier_log_type(env, t, "Invalid name"); in btf_ref_type_check_meta()
2540 value = btf_name_by_offset(env->btf, t->name_off); in btf_ref_type_check_meta()
2542 btf_verifier_log_type(env, t, "Invalid name"); in btf_ref_type_check_meta()
2547 btf_verifier_log_type(env, t, "Invalid name"); in btf_ref_type_check_meta()
2552 btf_verifier_log_type(env, t, NULL); in btf_ref_type_check_meta()
2557 static int btf_modifier_resolve(struct btf_verifier_env *env, in btf_modifier_resolve() argument
2563 struct btf *btf = env->btf; in btf_modifier_resolve()
2567 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_modifier_resolve()
2571 if (!env_type_is_resolve_sink(env, next_type) && in btf_modifier_resolve()
2572 !env_type_is_resolved(env, next_type_id)) in btf_modifier_resolve()
2573 return env_stack_push(env, next_type, next_type_id); in btf_modifier_resolve()
2582 if (env_type_is_resolved(env, next_type_id)) in btf_modifier_resolve()
2589 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_modifier_resolve()
2594 env_stack_pop_resolved(env, next_type_id, 0); in btf_modifier_resolve()
2599 static int btf_var_resolve(struct btf_verifier_env *env, in btf_var_resolve() argument
2605 struct btf *btf = env->btf; in btf_var_resolve()
2609 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_var_resolve()
2613 if (!env_type_is_resolve_sink(env, next_type) && in btf_var_resolve()
2614 !env_type_is_resolved(env, next_type_id)) in btf_var_resolve()
2615 return env_stack_push(env, next_type, next_type_id); in btf_var_resolve()
2625 !env_type_is_resolve_sink(env, resolved_type) && in btf_var_resolve()
2626 !env_type_is_resolved(env, resolved_type_id)) in btf_var_resolve()
2627 return env_stack_push(env, resolved_type, in btf_var_resolve()
2636 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_var_resolve()
2640 env_stack_pop_resolved(env, next_type_id, 0); in btf_var_resolve()
2645 static int btf_ptr_resolve(struct btf_verifier_env *env, in btf_ptr_resolve() argument
2651 struct btf *btf = env->btf; in btf_ptr_resolve()
2655 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_ptr_resolve()
2659 if (!env_type_is_resolve_sink(env, next_type) && in btf_ptr_resolve()
2660 !env_type_is_resolved(env, next_type_id)) in btf_ptr_resolve()
2661 return env_stack_push(env, next_type, next_type_id); in btf_ptr_resolve()
2679 !env_type_is_resolve_sink(env, resolved_type) && in btf_ptr_resolve()
2680 !env_type_is_resolved(env, resolved_type_id)) in btf_ptr_resolve()
2681 return env_stack_push(env, resolved_type, in btf_ptr_resolve()
2686 if (env_type_is_resolved(env, next_type_id)) in btf_ptr_resolve()
2692 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_ptr_resolve()
2697 env_stack_pop_resolved(env, next_type_id, 0); in btf_ptr_resolve()
2742 static void btf_ref_type_log(struct btf_verifier_env *env, in btf_ref_type_log() argument
2745 btf_verifier_log(env, "type_id=%u", t->type); in btf_ref_type_log()
2766 static s32 btf_fwd_check_meta(struct btf_verifier_env *env, in btf_fwd_check_meta() argument
2771 btf_verifier_log_type(env, t, "vlen != 0"); in btf_fwd_check_meta()
2776 btf_verifier_log_type(env, t, "type != 0"); in btf_fwd_check_meta()
2782 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_fwd_check_meta()
2783 btf_verifier_log_type(env, t, "Invalid name"); in btf_fwd_check_meta()
2787 btf_verifier_log_type(env, t, NULL); in btf_fwd_check_meta()
2792 static void btf_fwd_type_log(struct btf_verifier_env *env, in btf_fwd_type_log() argument
2795 btf_verifier_log(env, "%s", btf_type_kflag(t) ? "union" : "struct"); in btf_fwd_type_log()
2807 static int btf_array_check_member(struct btf_verifier_env *env, in btf_array_check_member() argument
2815 struct btf *btf = env->btf; in btf_array_check_member()
2818 btf_verifier_log_member(env, struct_type, member, in btf_array_check_member()
2828 btf_verifier_log_member(env, struct_type, member, in btf_array_check_member()
2836 static s32 btf_array_check_meta(struct btf_verifier_env *env, in btf_array_check_meta() argument
2844 btf_verifier_log_basic(env, t, in btf_array_check_meta()
2852 btf_verifier_log_type(env, t, "Invalid name"); in btf_array_check_meta()
2857 btf_verifier_log_type(env, t, "vlen != 0"); in btf_array_check_meta()
2862 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_array_check_meta()
2867 btf_verifier_log_type(env, t, "size != 0"); in btf_array_check_meta()
2875 btf_verifier_log_type(env, t, "Invalid elem"); in btf_array_check_meta()
2880 btf_verifier_log_type(env, t, "Invalid index"); in btf_array_check_meta()
2884 btf_verifier_log_type(env, t, NULL); in btf_array_check_meta()
2889 static int btf_array_resolve(struct btf_verifier_env *env, in btf_array_resolve() argument
2895 struct btf *btf = env->btf; in btf_array_resolve()
2903 btf_verifier_log_type(env, v->t, "Invalid index"); in btf_array_resolve()
2907 if (!env_type_is_resolve_sink(env, index_type) && in btf_array_resolve()
2908 !env_type_is_resolved(env, index_type_id)) in btf_array_resolve()
2909 return env_stack_push(env, index_type, index_type_id); in btf_array_resolve()
2914 btf_verifier_log_type(env, v->t, "Invalid index"); in btf_array_resolve()
2923 btf_verifier_log_type(env, v->t, in btf_array_resolve()
2928 if (!env_type_is_resolve_sink(env, elem_type) && in btf_array_resolve()
2929 !env_type_is_resolved(env, elem_type_id)) in btf_array_resolve()
2930 return env_stack_push(env, elem_type, elem_type_id); in btf_array_resolve()
2934 btf_verifier_log_type(env, v->t, "Invalid elem"); in btf_array_resolve()
2939 btf_verifier_log_type(env, v->t, "Invalid array of int"); in btf_array_resolve()
2944 btf_verifier_log_type(env, v->t, in btf_array_resolve()
2949 env_stack_pop_resolved(env, elem_type_id, elem_size * array->nelems); in btf_array_resolve()
2954 static void btf_array_log(struct btf_verifier_env *env, in btf_array_log() argument
2959 btf_verifier_log(env, "type_id=%u index_type_id=%u nr_elems=%u", in btf_array_log()
3058 static int btf_struct_check_member(struct btf_verifier_env *env, in btf_struct_check_member() argument
3067 btf_verifier_log_member(env, struct_type, member, in btf_struct_check_member()
3075 btf_verifier_log_member(env, struct_type, member, in btf_struct_check_member()
3083 static s32 btf_struct_check_meta(struct btf_verifier_env *env, in btf_struct_check_meta() argument
3090 struct btf *btf = env->btf; in btf_struct_check_meta()
3097 btf_verifier_log_basic(env, t, in btf_struct_check_meta()
3105 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_struct_check_meta()
3106 btf_verifier_log_type(env, t, "Invalid name"); in btf_struct_check_meta()
3110 btf_verifier_log_type(env, t, NULL); in btf_struct_check_meta()
3115 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
3124 btf_verifier_log_member(env, t, member, "Invalid name"); in btf_struct_check_meta()
3129 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
3136 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
3146 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
3152 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
3157 btf_verifier_log_member(env, t, member, NULL); in btf_struct_check_meta()
3164 static int btf_struct_resolve(struct btf_verifier_env *env, in btf_struct_resolve() argument
3182 if (WARN_ON_ONCE(!env_type_is_resolved(env, in btf_struct_resolve()
3186 last_member_type = btf_type_by_id(env->btf, in btf_struct_resolve()
3189 err = btf_type_ops(last_member_type)->check_kflag_member(env, v->t, in btf_struct_resolve()
3193 err = btf_type_ops(last_member_type)->check_member(env, v->t, in btf_struct_resolve()
3202 const struct btf_type *member_type = btf_type_by_id(env->btf, in btf_struct_resolve()
3207 btf_verifier_log_member(env, v->t, member, in btf_struct_resolve()
3212 if (!env_type_is_resolve_sink(env, member_type) && in btf_struct_resolve()
3213 !env_type_is_resolved(env, member_type_id)) { in btf_struct_resolve()
3214 env_stack_set_next_member(env, i + 1); in btf_struct_resolve()
3215 return env_stack_push(env, member_type, member_type_id); in btf_struct_resolve()
3219 err = btf_type_ops(member_type)->check_kflag_member(env, v->t, in btf_struct_resolve()
3223 err = btf_type_ops(member_type)->check_member(env, v->t, in btf_struct_resolve()
3230 env_stack_pop_resolved(env, 0, 0); in btf_struct_resolve()
3235 static void btf_struct_log(struct btf_verifier_env *env, in btf_struct_log() argument
3238 btf_verifier_log(env, "size=%u vlen=%u", t->size, btf_type_vlen(t)); in btf_struct_log()
3998 static int btf_enum_check_member(struct btf_verifier_env *env, in btf_enum_check_member() argument
4007 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_member()
4015 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_member()
4023 static int btf_enum_check_kflag_member(struct btf_verifier_env *env, in btf_enum_check_kflag_member() argument
4035 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_kflag_member()
4042 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_kflag_member()
4050 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_kflag_member()
4058 static s32 btf_enum_check_meta(struct btf_verifier_env *env, in btf_enum_check_meta() argument
4063 struct btf *btf = env->btf; in btf_enum_check_meta()
4072 btf_verifier_log_basic(env, t, in btf_enum_check_meta()
4079 btf_verifier_log_type(env, t, "Unexpected size"); in btf_enum_check_meta()
4085 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_enum_check_meta()
4086 btf_verifier_log_type(env, t, "Invalid name"); in btf_enum_check_meta()
4090 btf_verifier_log_type(env, t, NULL); in btf_enum_check_meta()
4094 btf_verifier_log(env, "\tInvalid name_offset:%u", in btf_enum_check_meta()
4102 btf_verifier_log_type(env, t, "Invalid name"); in btf_enum_check_meta()
4106 if (env->log.level == BPF_LOG_KERNEL) in btf_enum_check_meta()
4109 btf_verifier_log(env, fmt_str, in btf_enum_check_meta()
4117 static void btf_enum_log(struct btf_verifier_env *env, in btf_enum_log() argument
4120 btf_verifier_log(env, "size=%u vlen=%u", t->size, btf_type_vlen(t)); in btf_enum_log()
4166 static s32 btf_enum64_check_meta(struct btf_verifier_env *env, in btf_enum64_check_meta() argument
4171 struct btf *btf = env->btf; in btf_enum64_check_meta()
4180 btf_verifier_log_basic(env, t, in btf_enum64_check_meta()
4187 btf_verifier_log_type(env, t, "Unexpected size"); in btf_enum64_check_meta()
4193 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_enum64_check_meta()
4194 btf_verifier_log_type(env, t, "Invalid name"); in btf_enum64_check_meta()
4198 btf_verifier_log_type(env, t, NULL); in btf_enum64_check_meta()
4202 btf_verifier_log(env, "\tInvalid name_offset:%u", in btf_enum64_check_meta()
4210 btf_verifier_log_type(env, t, "Invalid name"); in btf_enum64_check_meta()
4214 if (env->log.level == BPF_LOG_KERNEL) in btf_enum64_check_meta()
4218 btf_verifier_log(env, fmt_str, in btf_enum64_check_meta()
4269 static s32 btf_func_proto_check_meta(struct btf_verifier_env *env, in btf_func_proto_check_meta() argument
4276 btf_verifier_log_basic(env, t, in btf_func_proto_check_meta()
4283 btf_verifier_log_type(env, t, "Invalid name"); in btf_func_proto_check_meta()
4288 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_func_proto_check_meta()
4292 btf_verifier_log_type(env, t, NULL); in btf_func_proto_check_meta()
4297 static void btf_func_proto_log(struct btf_verifier_env *env, in btf_func_proto_log() argument
4303 btf_verifier_log(env, "return=%u args=(", t->type); in btf_func_proto_log()
4305 btf_verifier_log(env, "void"); in btf_func_proto_log()
4311 btf_verifier_log(env, "vararg"); in btf_func_proto_log()
4315 btf_verifier_log(env, "%u %s", args[0].type, in btf_func_proto_log()
4316 __btf_name_by_offset(env->btf, in btf_func_proto_log()
4319 btf_verifier_log(env, ", %u %s", args[i].type, in btf_func_proto_log()
4320 __btf_name_by_offset(env->btf, in btf_func_proto_log()
4327 btf_verifier_log(env, ", %u %s", last_arg->type, in btf_func_proto_log()
4328 __btf_name_by_offset(env->btf, in btf_func_proto_log()
4331 btf_verifier_log(env, ", vararg"); in btf_func_proto_log()
4335 btf_verifier_log(env, ")"); in btf_func_proto_log()
4356 static s32 btf_func_check_meta(struct btf_verifier_env *env, in btf_func_check_meta() argument
4361 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_func_check_meta()
4362 btf_verifier_log_type(env, t, "Invalid name"); in btf_func_check_meta()
4367 btf_verifier_log_type(env, t, "Invalid func linkage"); in btf_func_check_meta()
4372 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_func_check_meta()
4376 btf_verifier_log_type(env, t, NULL); in btf_func_check_meta()
4381 static int btf_func_resolve(struct btf_verifier_env *env, in btf_func_resolve() argument
4388 err = btf_func_check(env, t); in btf_func_resolve()
4392 env_stack_pop_resolved(env, next_type_id, 0); in btf_func_resolve()
4405 static s32 btf_var_check_meta(struct btf_verifier_env *env, in btf_var_check_meta() argument
4413 btf_verifier_log_basic(env, t, in btf_var_check_meta()
4420 btf_verifier_log_type(env, t, "vlen != 0"); in btf_var_check_meta()
4425 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_var_check_meta()
4430 !__btf_name_valid(env->btf, t->name_off)) { in btf_var_check_meta()
4431 btf_verifier_log_type(env, t, "Invalid name"); in btf_var_check_meta()
4437 btf_verifier_log_type(env, t, "Invalid type_id"); in btf_var_check_meta()
4444 btf_verifier_log_type(env, t, "Linkage not supported"); in btf_var_check_meta()
4448 btf_verifier_log_type(env, t, NULL); in btf_var_check_meta()
4453 static void btf_var_log(struct btf_verifier_env *env, const struct btf_type *t) in btf_var_log() argument
4457 btf_verifier_log(env, "type_id=%u linkage=%u", t->type, var->linkage); in btf_var_log()
4469 static s32 btf_datasec_check_meta(struct btf_verifier_env *env, in btf_datasec_check_meta() argument
4479 btf_verifier_log_basic(env, t, in btf_datasec_check_meta()
4486 btf_verifier_log_type(env, t, "size == 0"); in btf_datasec_check_meta()
4491 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_datasec_check_meta()
4496 !btf_name_valid_section(env->btf, t->name_off)) { in btf_datasec_check_meta()
4497 btf_verifier_log_type(env, t, "Invalid name"); in btf_datasec_check_meta()
4501 btf_verifier_log_type(env, t, NULL); in btf_datasec_check_meta()
4506 btf_verifier_log_vsi(env, t, vsi, in btf_datasec_check_meta()
4512 btf_verifier_log_vsi(env, t, vsi, in btf_datasec_check_meta()
4518 btf_verifier_log_vsi(env, t, vsi, in btf_datasec_check_meta()
4525 btf_verifier_log_vsi(env, t, vsi, in btf_datasec_check_meta()
4530 btf_verifier_log_vsi(env, t, vsi, NULL); in btf_datasec_check_meta()
4535 btf_verifier_log_type(env, t, "Invalid btf_info size"); in btf_datasec_check_meta()
4542 static int btf_datasec_resolve(struct btf_verifier_env *env, in btf_datasec_resolve() argument
4546 struct btf *btf = env->btf; in btf_datasec_resolve()
4549 env->resolve_mode = RESOLVE_TBD; in btf_datasec_resolve()
4552 const struct btf_type *var_type = btf_type_by_id(env->btf, in btf_datasec_resolve()
4555 btf_verifier_log_vsi(env, v->t, vsi, in btf_datasec_resolve()
4560 if (!env_type_is_resolve_sink(env, var_type) && in btf_datasec_resolve()
4561 !env_type_is_resolved(env, var_type_id)) { in btf_datasec_resolve()
4562 env_stack_set_next_member(env, i + 1); in btf_datasec_resolve()
4563 return env_stack_push(env, var_type, var_type_id); in btf_datasec_resolve()
4568 btf_verifier_log_vsi(env, v->t, vsi, "Invalid type"); in btf_datasec_resolve()
4573 btf_verifier_log_vsi(env, v->t, vsi, "Invalid size"); in btf_datasec_resolve()
4578 env_stack_pop_resolved(env, 0, 0); in btf_datasec_resolve()
4582 static void btf_datasec_log(struct btf_verifier_env *env, in btf_datasec_log() argument
4585 btf_verifier_log(env, "size=%u vlen=%u", t->size, btf_type_vlen(t)); in btf_datasec_log()
4621 static s32 btf_float_check_meta(struct btf_verifier_env *env, in btf_float_check_meta() argument
4626 btf_verifier_log_type(env, t, "vlen != 0"); in btf_float_check_meta()
4631 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_float_check_meta()
4637 btf_verifier_log_type(env, t, "Invalid type_size"); in btf_float_check_meta()
4641 btf_verifier_log_type(env, t, NULL); in btf_float_check_meta()
4646 static int btf_float_check_member(struct btf_verifier_env *env, in btf_float_check_member() argument
4665 btf_verifier_log_member(env, struct_type, member, in btf_float_check_member()
4673 btf_verifier_log_member(env, struct_type, member, in btf_float_check_member()
4681 static void btf_float_log(struct btf_verifier_env *env, in btf_float_log() argument
4684 btf_verifier_log(env, "size=%u", t->size); in btf_float_log()
4696 static s32 btf_decl_tag_check_meta(struct btf_verifier_env *env, in btf_decl_tag_check_meta() argument
4706 btf_verifier_log_basic(env, t, in btf_decl_tag_check_meta()
4712 value = btf_name_by_offset(env->btf, t->name_off); in btf_decl_tag_check_meta()
4714 btf_verifier_log_type(env, t, "Invalid value"); in btf_decl_tag_check_meta()
4719 btf_verifier_log_type(env, t, "vlen != 0"); in btf_decl_tag_check_meta()
4724 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_decl_tag_check_meta()
4730 btf_verifier_log_type(env, t, "Invalid component_idx"); in btf_decl_tag_check_meta()
4734 btf_verifier_log_type(env, t, NULL); in btf_decl_tag_check_meta()
4739 static int btf_decl_tag_resolve(struct btf_verifier_env *env, in btf_decl_tag_resolve() argument
4745 struct btf *btf = env->btf; in btf_decl_tag_resolve()
4751 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_decl_tag_resolve()
4755 if (!env_type_is_resolve_sink(env, next_type) && in btf_decl_tag_resolve()
4756 !env_type_is_resolved(env, next_type_id)) in btf_decl_tag_resolve()
4757 return env_stack_push(env, next_type, next_type_id); in btf_decl_tag_resolve()
4762 btf_verifier_log_type(env, v->t, "Invalid component_idx"); in btf_decl_tag_resolve()
4775 btf_verifier_log_type(env, v->t, "Invalid component_idx"); in btf_decl_tag_resolve()
4780 env_stack_pop_resolved(env, next_type_id, 0); in btf_decl_tag_resolve()
4785 static void btf_decl_tag_log(struct btf_verifier_env *env, const struct btf_type *t) in btf_decl_tag_log() argument
4787 btf_verifier_log(env, "type=%u component_idx=%d", t->type, in btf_decl_tag_log()
4800 static int btf_func_proto_check(struct btf_verifier_env *env, in btf_func_proto_check() argument
4809 btf = env->btf; in btf_func_proto_check()
4819 btf_verifier_log_type(env, t, "Invalid return type"); in btf_func_proto_check()
4824 btf_verifier_log_type(env, t, "Invalid return type"); in btf_func_proto_check()
4829 !env_type_is_resolved(env, ret_type_id)) { in btf_func_proto_check()
4830 err = btf_resolve(env, ret_type, ret_type_id); in btf_func_proto_check()
4837 btf_verifier_log_type(env, t, "Invalid return type"); in btf_func_proto_check()
4848 btf_verifier_log_type(env, t, "Invalid arg#%u", in btf_func_proto_check()
4862 btf_verifier_log_type(env, t, "Invalid arg#%u", i + 1); in btf_func_proto_check()
4867 btf_verifier_log_type(env, t, "Invalid arg#%u", i + 1); in btf_func_proto_check()
4874 btf_verifier_log_type(env, t, in btf_func_proto_check()
4880 !env_type_is_resolved(env, arg_type_id)) { in btf_func_proto_check()
4881 err = btf_resolve(env, arg_type, arg_type_id); in btf_func_proto_check()
4887 btf_verifier_log_type(env, t, "Invalid arg#%u", i + 1); in btf_func_proto_check()
4895 static int btf_func_check(struct btf_verifier_env *env, in btf_func_check() argument
4903 btf = env->btf; in btf_func_check()
4907 btf_verifier_log_type(env, t, "Invalid type_id"); in btf_func_check()
4915 btf_verifier_log_type(env, t, "Invalid arg#%u", i + 1); in btf_func_check()
4945 static s32 btf_check_meta(struct btf_verifier_env *env, in btf_check_meta() argument
4953 btf_verifier_log(env, "[%u] meta_left:%u meta_needed:%zu", in btf_check_meta()
4954 env->log_type_id, meta_left, sizeof(*t)); in btf_check_meta()
4960 btf_verifier_log(env, "[%u] Invalid btf_info:%x", in btf_check_meta()
4961 env->log_type_id, t->info); in btf_check_meta()
4967 btf_verifier_log(env, "[%u] Invalid kind:%u", in btf_check_meta()
4968 env->log_type_id, BTF_INFO_KIND(t->info)); in btf_check_meta()
4972 if (!btf_name_offset_valid(env->btf, t->name_off)) { in btf_check_meta()
4973 btf_verifier_log(env, "[%u] Invalid name_offset:%u", in btf_check_meta()
4974 env->log_type_id, t->name_off); in btf_check_meta()
4978 var_meta_size = btf_type_ops(t)->check_meta(env, t, meta_left); in btf_check_meta()
4987 static int btf_check_all_metas(struct btf_verifier_env *env) in btf_check_all_metas() argument
4989 struct btf *btf = env->btf; in btf_check_all_metas()
4997 env->log_type_id = btf->base_btf ? btf->start_id : 1; in btf_check_all_metas()
5002 meta_size = btf_check_meta(env, t, end - cur); in btf_check_all_metas()
5006 btf_add_type(env, t); in btf_check_all_metas()
5008 env->log_type_id++; in btf_check_all_metas()
5014 static bool btf_resolve_valid(struct btf_verifier_env *env, in btf_resolve_valid() argument
5018 struct btf *btf = env->btf; in btf_resolve_valid()
5020 if (!env_type_is_resolved(env, type_id)) in btf_resolve_valid()
5055 static int btf_resolve(struct btf_verifier_env *env, in btf_resolve() argument
5058 u32 save_log_type_id = env->log_type_id; in btf_resolve()
5062 env->resolve_mode = RESOLVE_TBD; in btf_resolve()
5063 env_stack_push(env, t, type_id); in btf_resolve()
5064 while (!err && (v = env_stack_peak(env))) { in btf_resolve()
5065 env->log_type_id = v->type_id; in btf_resolve()
5066 err = btf_type_ops(v->t)->resolve(env, v); in btf_resolve()
5069 env->log_type_id = type_id; in btf_resolve()
5071 btf_verifier_log_type(env, t, in btf_resolve()
5075 btf_verifier_log_type(env, t, "Loop detected"); in btf_resolve()
5079 if (!err && !btf_resolve_valid(env, t, type_id)) { in btf_resolve()
5080 btf_verifier_log_type(env, t, "Invalid resolve state"); in btf_resolve()
5084 env->log_type_id = save_log_type_id; in btf_resolve()
5088 static int btf_check_all_types(struct btf_verifier_env *env) in btf_check_all_types() argument
5090 struct btf *btf = env->btf; in btf_check_all_types()
5095 err = env_resolve_init(env); in btf_check_all_types()
5099 env->phase++; in btf_check_all_types()
5104 env->log_type_id = type_id; in btf_check_all_types()
5106 !env_type_is_resolved(env, type_id)) { in btf_check_all_types()
5107 err = btf_resolve(env, t, type_id); in btf_check_all_types()
5113 err = btf_func_proto_check(env, t); in btf_check_all_types()
5122 static int btf_parse_type_sec(struct btf_verifier_env *env) in btf_parse_type_sec() argument
5124 const struct btf_header *hdr = &env->btf->hdr; in btf_parse_type_sec()
5129 btf_verifier_log(env, "Unaligned type_off"); in btf_parse_type_sec()
5133 if (!env->btf->base_btf && !hdr->type_len) { in btf_parse_type_sec()
5134 btf_verifier_log(env, "No type found"); in btf_parse_type_sec()
5138 err = btf_check_all_metas(env); in btf_parse_type_sec()
5142 return btf_check_all_types(env); in btf_parse_type_sec()
5145 static int btf_parse_str_sec(struct btf_verifier_env *env) in btf_parse_str_sec() argument
5148 struct btf *btf = env->btf; in btf_parse_str_sec()
5156 btf_verifier_log(env, "String section is not at the end"); in btf_parse_str_sec()
5165 btf_verifier_log(env, "Invalid string section"); in btf_parse_str_sec()
5169 btf_verifier_log(env, "Invalid string section"); in btf_parse_str_sec()
5189 static int btf_check_sec_info(struct btf_verifier_env *env, in btf_check_sec_info() argument
5197 btf = env->btf; in btf_check_sec_info()
5213 btf_verifier_log(env, "Invalid section offset"); in btf_check_sec_info()
5218 btf_verifier_log(env, "Unsupported section found"); in btf_check_sec_info()
5222 btf_verifier_log(env, "Section overlap found"); in btf_check_sec_info()
5226 btf_verifier_log(env, in btf_check_sec_info()
5235 btf_verifier_log(env, "Unsupported section found"); in btf_check_sec_info()
5242 static int btf_parse_hdr(struct btf_verifier_env *env) in btf_parse_hdr() argument
5248 btf = env->btf; in btf_parse_hdr()
5252 btf_verifier_log(env, "hdr_len not found"); in btf_parse_hdr()
5259 btf_verifier_log(env, "btf_header not found"); in btf_parse_hdr()
5270 btf_verifier_log(env, "Unsupported btf_header"); in btf_parse_hdr()
5281 btf_verifier_log_hdr(env, btf_data_size); in btf_parse_hdr()
5284 btf_verifier_log(env, "Invalid magic"); in btf_parse_hdr()
5289 btf_verifier_log(env, "Unsupported version"); in btf_parse_hdr()
5294 btf_verifier_log(env, "Unsupported flags"); in btf_parse_hdr()
5299 btf_verifier_log(env, "No data"); in btf_parse_hdr()
5303 return btf_check_sec_info(env, btf_data_size); in btf_parse_hdr()
5412 static int btf_check_type_tags(struct btf_verifier_env *env, in btf_check_type_tags() argument
5435 btf_verifier_log(env, "Max chain length or cycle detected"); in btf_check_type_tags()
5440 btf_verifier_log(env, "Type tags don't precede modifiers"); in btf_check_type_tags()
5479 struct btf_verifier_env *env = NULL; in btf_parse() local
5487 env = kzalloc(sizeof(*env), GFP_KERNEL | __GFP_NOWARN); in btf_parse()
5488 if (!env) in btf_parse()
5494 err = bpf_vlog_init(&env->log, attr->btf_log_level, in btf_parse()
5504 env->btf = btf; in btf_parse()
5520 err = btf_parse_hdr(env); in btf_parse()
5526 err = btf_parse_str_sec(env); in btf_parse()
5530 err = btf_parse_type_sec(env); in btf_parse()
5534 err = btf_check_type_tags(env, btf, 1); in btf_parse()
5538 struct_meta_tab = btf_parse_struct_metas(&env->log, btf); in btf_parse()
5555 err = finalize_log(&env->log, uattr, uattr_size); in btf_parse()
5559 btf_verifier_env_free(env); in btf_parse()
5567 ret = finalize_log(&env->log, uattr, uattr_size); in btf_parse()
5571 btf_verifier_env_free(env); in btf_parse()
5722 struct btf_verifier_env *env = NULL; in BTF_ID() local
5727 env = kzalloc(sizeof(*env), GFP_KERNEL | __GFP_NOWARN); in BTF_ID()
5728 if (!env) in BTF_ID()
5731 log = &env->log; in BTF_ID()
5739 env->btf = btf; in BTF_ID()
5746 err = btf_parse_hdr(env); in BTF_ID()
5752 err = btf_parse_str_sec(env); in BTF_ID()
5756 err = btf_check_all_metas(env); in BTF_ID()
5760 err = btf_check_type_tags(env, btf, 1); in BTF_ID()
5775 btf_verifier_env_free(env); in BTF_ID()
5779 btf_verifier_env_free(env); in BTF_ID()
5791 struct btf_verifier_env *env = NULL; in btf_parse_module() local
5802 env = kzalloc(sizeof(*env), GFP_KERNEL | __GFP_NOWARN); in btf_parse_module()
5803 if (!env) in btf_parse_module()
5806 log = &env->log; in btf_parse_module()
5814 env->btf = btf; in btf_parse_module()
5830 err = btf_parse_hdr(env); in btf_parse_module()
5836 err = btf_parse_str_sec(env); in btf_parse_module()
5840 err = btf_check_all_metas(env); in btf_parse_module()
5844 err = btf_check_type_tags(env, btf, btf_nr_types(base_btf)); in btf_parse_module()
5848 btf_verifier_env_free(env); in btf_parse_module()
5853 btf_verifier_env_free(env); in btf_parse_module()
6761 static int btf_check_func_arg_match(struct bpf_verifier_env *env, in btf_check_func_arg_match() argument
6767 enum bpf_prog_type prog_type = resolve_prog_type(env->prog); in btf_check_func_arg_match()
6768 struct bpf_verifier_log *log = &env->log; in btf_check_func_arg_match()
6824 ret = check_func_arg_reg_off(env, reg, regno, arg_type); in btf_check_func_arg_match()
6851 if (check_mem_reg(env, reg, regno, type_size)) in btf_check_func_arg_match()
6870 int btf_check_subprog_arg_match(struct bpf_verifier_env *env, int subprog, in btf_check_subprog_arg_match() argument
6873 struct bpf_prog *prog = env->prog; in btf_check_subprog_arg_match()
6890 err = btf_check_func_arg_match(env, btf, btf_id, regs, is_global, false); in btf_check_subprog_arg_match()
6913 int btf_check_subprog_call(struct bpf_verifier_env *env, int subprog, in btf_check_subprog_call() argument
6916 struct bpf_prog *prog = env->prog; in btf_check_subprog_call()
6933 err = btf_check_func_arg_match(env, btf, btf_id, regs, is_global, true); in btf_check_subprog_call()
6951 int btf_prepare_func_args(struct bpf_verifier_env *env, int subprog, in btf_prepare_func_args() argument
6954 struct bpf_verifier_log *log = &env->log; in btf_prepare_func_args()
6955 struct bpf_prog *prog = env->prog; in btf_prepare_func_args()
7050 reg->id = ++env->id_gen; in btf_prepare_func_args()