Lines Matching refs:env
378 s32 (*check_meta)(struct btf_verifier_env *env,
381 int (*resolve)(struct btf_verifier_env *env,
383 int (*check_member)(struct btf_verifier_env *env,
387 int (*check_kflag_member)(struct btf_verifier_env *env,
391 void (*log_details)(struct btf_verifier_env *env,
401 static int btf_resolve(struct btf_verifier_env *env,
1294 __printf(2, 3) static void btf_verifier_log(struct btf_verifier_env *env, in btf_verifier_log() argument
1297 struct bpf_verifier_log *log = &env->log; in btf_verifier_log()
1308 __printf(4, 5) static void __btf_verifier_log_type(struct btf_verifier_env *env, in __btf_verifier_log_type() argument
1313 struct bpf_verifier_log *log = &env->log; in __btf_verifier_log_type()
1315 struct btf *btf = env->btf; in __btf_verifier_log_type()
1329 env->log_type_id, in __btf_verifier_log_type()
1335 btf_type_ops(t)->log_details(env, t); in __btf_verifier_log_type()
1347 #define btf_verifier_log_type(env, t, ...) \ argument
1348 __btf_verifier_log_type((env), (t), true, __VA_ARGS__)
1349 #define btf_verifier_log_basic(env, t, ...) \ argument
1350 __btf_verifier_log_type((env), (t), false, __VA_ARGS__)
1353 static void btf_verifier_log_member(struct btf_verifier_env *env, in btf_verifier_log_member() argument
1358 struct bpf_verifier_log *log = &env->log; in btf_verifier_log_member()
1359 struct btf *btf = env->btf; in btf_verifier_log_member()
1373 if (env->phase != CHECK_META) in btf_verifier_log_member()
1374 btf_verifier_log_type(env, struct_type, NULL); in btf_verifier_log_member()
1399 static void btf_verifier_log_vsi(struct btf_verifier_env *env, in btf_verifier_log_vsi() argument
1404 struct bpf_verifier_log *log = &env->log; in btf_verifier_log_vsi()
1411 if (env->phase != CHECK_META) in btf_verifier_log_vsi()
1412 btf_verifier_log_type(env, datasec_type, NULL); in btf_verifier_log_vsi()
1426 static void btf_verifier_log_hdr(struct btf_verifier_env *env, in btf_verifier_log_hdr() argument
1429 struct bpf_verifier_log *log = &env->log; in btf_verifier_log_hdr()
1430 const struct btf *btf = env->btf; in btf_verifier_log_hdr()
1450 static int btf_add_type(struct btf_verifier_env *env, struct btf_type *t) in btf_add_type() argument
1452 struct btf *btf = env->btf; in btf_add_type()
1461 btf_verifier_log(env, "Exceeded max num of types"); in btf_add_type()
1560 static int env_resolve_init(struct btf_verifier_env *env) in env_resolve_init() argument
1562 struct btf *btf = env->btf; in env_resolve_init()
1585 env->visit_states = visit_states; in env_resolve_init()
1596 static void btf_verifier_env_free(struct btf_verifier_env *env) in btf_verifier_env_free() argument
1598 kvfree(env->visit_states); in btf_verifier_env_free()
1599 kfree(env); in btf_verifier_env_free()
1602 static bool env_type_is_resolve_sink(const struct btf_verifier_env *env, in env_type_is_resolve_sink() argument
1605 switch (env->resolve_mode) { in env_type_is_resolve_sink()
1627 static bool env_type_is_resolved(const struct btf_verifier_env *env, in env_type_is_resolved() argument
1631 if (type_id < env->btf->start_id) in env_type_is_resolved()
1634 return env->visit_states[type_id - env->btf->start_id] == RESOLVED; in env_type_is_resolved()
1637 static int env_stack_push(struct btf_verifier_env *env, in env_stack_push() argument
1640 const struct btf *btf = env->btf; in env_stack_push()
1643 if (env->top_stack == MAX_RESOLVE_DEPTH) in env_stack_push()
1647 || env->visit_states[type_id - btf->start_id] != NOT_VISITED) in env_stack_push()
1650 env->visit_states[type_id - btf->start_id] = VISITED; in env_stack_push()
1652 v = &env->stack[env->top_stack++]; in env_stack_push()
1657 if (env->resolve_mode == RESOLVE_TBD) { in env_stack_push()
1659 env->resolve_mode = RESOLVE_PTR; in env_stack_push()
1661 env->resolve_mode = RESOLVE_STRUCT_OR_ARRAY; in env_stack_push()
1667 static void env_stack_set_next_member(struct btf_verifier_env *env, in env_stack_set_next_member() argument
1670 env->stack[env->top_stack - 1].next_member = next_member; in env_stack_set_next_member()
1673 static void env_stack_pop_resolved(struct btf_verifier_env *env, in env_stack_pop_resolved() argument
1677 u32 type_id = env->stack[--(env->top_stack)].type_id; in env_stack_pop_resolved()
1678 struct btf *btf = env->btf; in env_stack_pop_resolved()
1683 env->visit_states[type_id] = RESOLVED; in env_stack_pop_resolved()
1686 static const struct resolve_vertex *env_stack_peak(struct btf_verifier_env *env) in env_stack_peak() argument
1688 return env->top_stack ? &env->stack[env->top_stack - 1] : NULL; in env_stack_peak()
1853 static int btf_df_check_member(struct btf_verifier_env *env, in btf_df_check_member() argument
1858 btf_verifier_log_basic(env, struct_type, in btf_df_check_member()
1863 static int btf_df_check_kflag_member(struct btf_verifier_env *env, in btf_df_check_kflag_member() argument
1868 btf_verifier_log_basic(env, struct_type, in btf_df_check_kflag_member()
1876 static int btf_generic_check_kflag_member(struct btf_verifier_env *env, in btf_generic_check_kflag_member() argument
1882 btf_verifier_log_member(env, struct_type, member, in btf_generic_check_kflag_member()
1890 return btf_type_ops(member_type)->check_member(env, struct_type, in btf_generic_check_kflag_member()
1895 static int btf_df_resolve(struct btf_verifier_env *env, in btf_df_resolve() argument
1898 btf_verifier_log_basic(env, v->t, "Unsupported resolve"); in btf_df_resolve()
1909 static int btf_int_check_member(struct btf_verifier_env *env, in btf_int_check_member() argument
1921 btf_verifier_log_member(env, struct_type, member, in btf_int_check_member()
1932 btf_verifier_log_member(env, struct_type, member, in btf_int_check_member()
1939 btf_verifier_log_member(env, struct_type, member, in btf_int_check_member()
1947 static int btf_int_check_kflag_member(struct btf_verifier_env *env, in btf_int_check_kflag_member() argument
1959 btf_verifier_log_member(env, struct_type, member, in btf_int_check_kflag_member()
1973 btf_verifier_log_member(env, struct_type, member, in btf_int_check_kflag_member()
1980 btf_verifier_log_member(env, struct_type, member, in btf_int_check_kflag_member()
1988 btf_verifier_log_member(env, struct_type, member, in btf_int_check_kflag_member()
1995 btf_verifier_log_member(env, struct_type, member, in btf_int_check_kflag_member()
2003 static s32 btf_int_check_meta(struct btf_verifier_env *env, in btf_int_check_meta() argument
2011 btf_verifier_log_basic(env, t, in btf_int_check_meta()
2018 btf_verifier_log_type(env, t, "vlen != 0"); in btf_int_check_meta()
2023 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_int_check_meta()
2029 btf_verifier_log_basic(env, t, "Invalid int_data:%x", in btf_int_check_meta()
2037 btf_verifier_log_type(env, t, "nr_bits exceeds %zu", in btf_int_check_meta()
2043 btf_verifier_log_type(env, t, "nr_bits exceeds type_size"); in btf_int_check_meta()
2058 btf_verifier_log_type(env, t, "Unsupported encoding"); in btf_int_check_meta()
2062 btf_verifier_log_type(env, t, NULL); in btf_int_check_meta()
2067 static void btf_int_log(struct btf_verifier_env *env, in btf_int_log() argument
2072 btf_verifier_log(env, in btf_int_log()
2268 static int btf_modifier_check_member(struct btf_verifier_env *env, in btf_modifier_check_member() argument
2276 struct btf *btf = env->btf; in btf_modifier_check_member()
2280 btf_verifier_log_member(env, struct_type, member, in btf_modifier_check_member()
2288 return btf_type_ops(resolved_type)->check_member(env, struct_type, in btf_modifier_check_member()
2293 static int btf_modifier_check_kflag_member(struct btf_verifier_env *env, in btf_modifier_check_kflag_member() argument
2301 struct btf *btf = env->btf; in btf_modifier_check_kflag_member()
2305 btf_verifier_log_member(env, struct_type, member, in btf_modifier_check_kflag_member()
2313 return btf_type_ops(resolved_type)->check_kflag_member(env, struct_type, in btf_modifier_check_kflag_member()
2318 static int btf_ptr_check_member(struct btf_verifier_env *env, in btf_ptr_check_member() argument
2330 btf_verifier_log_member(env, struct_type, member, in btf_ptr_check_member()
2336 btf_verifier_log_member(env, struct_type, member, in btf_ptr_check_member()
2344 static int btf_ref_type_check_meta(struct btf_verifier_env *env, in btf_ref_type_check_meta() argument
2349 btf_verifier_log_type(env, t, "vlen != 0"); in btf_ref_type_check_meta()
2354 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_ref_type_check_meta()
2359 btf_verifier_log_type(env, t, "Invalid type_id"); in btf_ref_type_check_meta()
2368 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_ref_type_check_meta()
2369 btf_verifier_log_type(env, t, "Invalid name"); in btf_ref_type_check_meta()
2374 btf_verifier_log_type(env, t, "Invalid name"); in btf_ref_type_check_meta()
2379 btf_verifier_log_type(env, t, NULL); in btf_ref_type_check_meta()
2384 static int btf_modifier_resolve(struct btf_verifier_env *env, in btf_modifier_resolve() argument
2390 struct btf *btf = env->btf; in btf_modifier_resolve()
2394 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_modifier_resolve()
2398 if (!env_type_is_resolve_sink(env, next_type) && in btf_modifier_resolve()
2399 !env_type_is_resolved(env, next_type_id)) in btf_modifier_resolve()
2400 return env_stack_push(env, next_type, next_type_id); in btf_modifier_resolve()
2409 if (env_type_is_resolved(env, next_type_id)) in btf_modifier_resolve()
2416 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_modifier_resolve()
2421 env_stack_pop_resolved(env, next_type_id, 0); in btf_modifier_resolve()
2426 static int btf_var_resolve(struct btf_verifier_env *env, in btf_var_resolve() argument
2432 struct btf *btf = env->btf; in btf_var_resolve()
2436 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_var_resolve()
2440 if (!env_type_is_resolve_sink(env, next_type) && in btf_var_resolve()
2441 !env_type_is_resolved(env, next_type_id)) in btf_var_resolve()
2442 return env_stack_push(env, next_type, next_type_id); in btf_var_resolve()
2452 !env_type_is_resolve_sink(env, resolved_type) && in btf_var_resolve()
2453 !env_type_is_resolved(env, resolved_type_id)) in btf_var_resolve()
2454 return env_stack_push(env, resolved_type, in btf_var_resolve()
2463 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_var_resolve()
2467 env_stack_pop_resolved(env, next_type_id, 0); in btf_var_resolve()
2472 static int btf_ptr_resolve(struct btf_verifier_env *env, in btf_ptr_resolve() argument
2478 struct btf *btf = env->btf; in btf_ptr_resolve()
2482 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_ptr_resolve()
2486 if (!env_type_is_resolve_sink(env, next_type) && in btf_ptr_resolve()
2487 !env_type_is_resolved(env, next_type_id)) in btf_ptr_resolve()
2488 return env_stack_push(env, next_type, next_type_id); in btf_ptr_resolve()
2506 !env_type_is_resolve_sink(env, resolved_type) && in btf_ptr_resolve()
2507 !env_type_is_resolved(env, resolved_type_id)) in btf_ptr_resolve()
2508 return env_stack_push(env, resolved_type, in btf_ptr_resolve()
2513 if (env_type_is_resolved(env, next_type_id)) in btf_ptr_resolve()
2519 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_ptr_resolve()
2524 env_stack_pop_resolved(env, next_type_id, 0); in btf_ptr_resolve()
2569 static void btf_ref_type_log(struct btf_verifier_env *env, in btf_ref_type_log() argument
2572 btf_verifier_log(env, "type_id=%u", t->type); in btf_ref_type_log()
2593 static s32 btf_fwd_check_meta(struct btf_verifier_env *env, in btf_fwd_check_meta() argument
2598 btf_verifier_log_type(env, t, "vlen != 0"); in btf_fwd_check_meta()
2603 btf_verifier_log_type(env, t, "type != 0"); in btf_fwd_check_meta()
2609 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_fwd_check_meta()
2610 btf_verifier_log_type(env, t, "Invalid name"); in btf_fwd_check_meta()
2614 btf_verifier_log_type(env, t, NULL); in btf_fwd_check_meta()
2619 static void btf_fwd_type_log(struct btf_verifier_env *env, in btf_fwd_type_log() argument
2622 btf_verifier_log(env, "%s", btf_type_kflag(t) ? "union" : "struct"); in btf_fwd_type_log()
2634 static int btf_array_check_member(struct btf_verifier_env *env, in btf_array_check_member() argument
2642 struct btf *btf = env->btf; in btf_array_check_member()
2645 btf_verifier_log_member(env, struct_type, member, in btf_array_check_member()
2655 btf_verifier_log_member(env, struct_type, member, in btf_array_check_member()
2663 static s32 btf_array_check_meta(struct btf_verifier_env *env, in btf_array_check_meta() argument
2671 btf_verifier_log_basic(env, t, in btf_array_check_meta()
2679 btf_verifier_log_type(env, t, "Invalid name"); in btf_array_check_meta()
2684 btf_verifier_log_type(env, t, "vlen != 0"); in btf_array_check_meta()
2689 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_array_check_meta()
2694 btf_verifier_log_type(env, t, "size != 0"); in btf_array_check_meta()
2702 btf_verifier_log_type(env, t, "Invalid elem"); in btf_array_check_meta()
2707 btf_verifier_log_type(env, t, "Invalid index"); in btf_array_check_meta()
2711 btf_verifier_log_type(env, t, NULL); in btf_array_check_meta()
2716 static int btf_array_resolve(struct btf_verifier_env *env, in btf_array_resolve() argument
2722 struct btf *btf = env->btf; in btf_array_resolve()
2730 btf_verifier_log_type(env, v->t, "Invalid index"); in btf_array_resolve()
2734 if (!env_type_is_resolve_sink(env, index_type) && in btf_array_resolve()
2735 !env_type_is_resolved(env, index_type_id)) in btf_array_resolve()
2736 return env_stack_push(env, index_type, index_type_id); in btf_array_resolve()
2741 btf_verifier_log_type(env, v->t, "Invalid index"); in btf_array_resolve()
2750 btf_verifier_log_type(env, v->t, in btf_array_resolve()
2755 if (!env_type_is_resolve_sink(env, elem_type) && in btf_array_resolve()
2756 !env_type_is_resolved(env, elem_type_id)) in btf_array_resolve()
2757 return env_stack_push(env, elem_type, elem_type_id); in btf_array_resolve()
2761 btf_verifier_log_type(env, v->t, "Invalid elem"); in btf_array_resolve()
2766 btf_verifier_log_type(env, v->t, "Invalid array of int"); in btf_array_resolve()
2771 btf_verifier_log_type(env, v->t, in btf_array_resolve()
2776 env_stack_pop_resolved(env, elem_type_id, elem_size * array->nelems); in btf_array_resolve()
2781 static void btf_array_log(struct btf_verifier_env *env, in btf_array_log() argument
2786 btf_verifier_log(env, "type_id=%u index_type_id=%u nr_elems=%u", in btf_array_log()
2885 static int btf_struct_check_member(struct btf_verifier_env *env, in btf_struct_check_member() argument
2894 btf_verifier_log_member(env, struct_type, member, in btf_struct_check_member()
2902 btf_verifier_log_member(env, struct_type, member, in btf_struct_check_member()
2910 static s32 btf_struct_check_meta(struct btf_verifier_env *env, in btf_struct_check_meta() argument
2917 struct btf *btf = env->btf; in btf_struct_check_meta()
2924 btf_verifier_log_basic(env, t, in btf_struct_check_meta()
2932 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_struct_check_meta()
2933 btf_verifier_log_type(env, t, "Invalid name"); in btf_struct_check_meta()
2937 btf_verifier_log_type(env, t, NULL); in btf_struct_check_meta()
2942 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
2951 btf_verifier_log_member(env, t, member, "Invalid name"); in btf_struct_check_meta()
2956 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
2963 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
2973 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
2979 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
2984 btf_verifier_log_member(env, t, member, NULL); in btf_struct_check_meta()
2991 static int btf_struct_resolve(struct btf_verifier_env *env, in btf_struct_resolve() argument
3009 if (WARN_ON_ONCE(!env_type_is_resolved(env, in btf_struct_resolve()
3013 last_member_type = btf_type_by_id(env->btf, in btf_struct_resolve()
3016 err = btf_type_ops(last_member_type)->check_kflag_member(env, v->t, in btf_struct_resolve()
3020 err = btf_type_ops(last_member_type)->check_member(env, v->t, in btf_struct_resolve()
3029 const struct btf_type *member_type = btf_type_by_id(env->btf, in btf_struct_resolve()
3034 btf_verifier_log_member(env, v->t, member, in btf_struct_resolve()
3039 if (!env_type_is_resolve_sink(env, member_type) && in btf_struct_resolve()
3040 !env_type_is_resolved(env, member_type_id)) { in btf_struct_resolve()
3041 env_stack_set_next_member(env, i + 1); in btf_struct_resolve()
3042 return env_stack_push(env, member_type, member_type_id); in btf_struct_resolve()
3046 err = btf_type_ops(member_type)->check_kflag_member(env, v->t, in btf_struct_resolve()
3050 err = btf_type_ops(member_type)->check_member(env, v->t, in btf_struct_resolve()
3057 env_stack_pop_resolved(env, 0, 0); in btf_struct_resolve()
3062 static void btf_struct_log(struct btf_verifier_env *env, in btf_struct_log() argument
3065 btf_verifier_log(env, "size=%u vlen=%u", t->size, btf_type_vlen(t)); in btf_struct_log()
3244 static int btf_enum_check_member(struct btf_verifier_env *env, in btf_enum_check_member() argument
3253 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_member()
3261 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_member()
3269 static int btf_enum_check_kflag_member(struct btf_verifier_env *env, in btf_enum_check_kflag_member() argument
3281 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_kflag_member()
3288 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_kflag_member()
3296 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_kflag_member()
3304 static s32 btf_enum_check_meta(struct btf_verifier_env *env, in btf_enum_check_meta() argument
3309 struct btf *btf = env->btf; in btf_enum_check_meta()
3317 btf_verifier_log_basic(env, t, in btf_enum_check_meta()
3324 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_enum_check_meta()
3329 btf_verifier_log_type(env, t, "Unexpected size"); in btf_enum_check_meta()
3335 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_enum_check_meta()
3336 btf_verifier_log_type(env, t, "Invalid name"); in btf_enum_check_meta()
3340 btf_verifier_log_type(env, t, NULL); in btf_enum_check_meta()
3344 btf_verifier_log(env, "\tInvalid name_offset:%u", in btf_enum_check_meta()
3352 btf_verifier_log_type(env, t, "Invalid name"); in btf_enum_check_meta()
3356 if (env->log.level == BPF_LOG_KERNEL) in btf_enum_check_meta()
3358 btf_verifier_log(env, "\t%s val=%d\n", in btf_enum_check_meta()
3366 static void btf_enum_log(struct btf_verifier_env *env, in btf_enum_log() argument
3369 btf_verifier_log(env, "size=%u vlen=%u", t->size, btf_type_vlen(t)); in btf_enum_log()
3412 static s32 btf_func_proto_check_meta(struct btf_verifier_env *env, in btf_func_proto_check_meta() argument
3419 btf_verifier_log_basic(env, t, in btf_func_proto_check_meta()
3426 btf_verifier_log_type(env, t, "Invalid name"); in btf_func_proto_check_meta()
3431 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_func_proto_check_meta()
3435 btf_verifier_log_type(env, t, NULL); in btf_func_proto_check_meta()
3440 static void btf_func_proto_log(struct btf_verifier_env *env, in btf_func_proto_log() argument
3446 btf_verifier_log(env, "return=%u args=(", t->type); in btf_func_proto_log()
3448 btf_verifier_log(env, "void"); in btf_func_proto_log()
3454 btf_verifier_log(env, "vararg"); in btf_func_proto_log()
3458 btf_verifier_log(env, "%u %s", args[0].type, in btf_func_proto_log()
3459 __btf_name_by_offset(env->btf, in btf_func_proto_log()
3462 btf_verifier_log(env, ", %u %s", args[i].type, in btf_func_proto_log()
3463 __btf_name_by_offset(env->btf, in btf_func_proto_log()
3470 btf_verifier_log(env, ", %u %s", last_arg->type, in btf_func_proto_log()
3471 __btf_name_by_offset(env->btf, in btf_func_proto_log()
3474 btf_verifier_log(env, ", vararg"); in btf_func_proto_log()
3478 btf_verifier_log(env, ")"); in btf_func_proto_log()
3499 static s32 btf_func_check_meta(struct btf_verifier_env *env, in btf_func_check_meta() argument
3504 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_func_check_meta()
3505 btf_verifier_log_type(env, t, "Invalid name"); in btf_func_check_meta()
3510 btf_verifier_log_type(env, t, "Invalid func linkage"); in btf_func_check_meta()
3515 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_func_check_meta()
3519 btf_verifier_log_type(env, t, NULL); in btf_func_check_meta()
3533 static s32 btf_var_check_meta(struct btf_verifier_env *env, in btf_var_check_meta() argument
3541 btf_verifier_log_basic(env, t, in btf_var_check_meta()
3548 btf_verifier_log_type(env, t, "vlen != 0"); in btf_var_check_meta()
3553 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_var_check_meta()
3558 !__btf_name_valid(env->btf, t->name_off, true)) { in btf_var_check_meta()
3559 btf_verifier_log_type(env, t, "Invalid name"); in btf_var_check_meta()
3565 btf_verifier_log_type(env, t, "Invalid type_id"); in btf_var_check_meta()
3572 btf_verifier_log_type(env, t, "Linkage not supported"); in btf_var_check_meta()
3576 btf_verifier_log_type(env, t, NULL); in btf_var_check_meta()
3581 static void btf_var_log(struct btf_verifier_env *env, const struct btf_type *t) in btf_var_log() argument
3585 btf_verifier_log(env, "type_id=%u linkage=%u", t->type, var->linkage); in btf_var_log()
3597 static s32 btf_datasec_check_meta(struct btf_verifier_env *env, in btf_datasec_check_meta() argument
3607 btf_verifier_log_basic(env, t, in btf_datasec_check_meta()
3614 btf_verifier_log_type(env, t, "size == 0"); in btf_datasec_check_meta()
3619 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_datasec_check_meta()
3624 !btf_name_valid_section(env->btf, t->name_off)) { in btf_datasec_check_meta()
3625 btf_verifier_log_type(env, t, "Invalid name"); in btf_datasec_check_meta()
3629 btf_verifier_log_type(env, t, NULL); in btf_datasec_check_meta()
3634 btf_verifier_log_vsi(env, t, vsi, in btf_datasec_check_meta()
3640 btf_verifier_log_vsi(env, t, vsi, in btf_datasec_check_meta()
3646 btf_verifier_log_vsi(env, t, vsi, in btf_datasec_check_meta()
3653 btf_verifier_log_vsi(env, t, vsi, in btf_datasec_check_meta()
3658 btf_verifier_log_vsi(env, t, vsi, NULL); in btf_datasec_check_meta()
3663 btf_verifier_log_type(env, t, "Invalid btf_info size"); in btf_datasec_check_meta()
3670 static int btf_datasec_resolve(struct btf_verifier_env *env, in btf_datasec_resolve() argument
3674 struct btf *btf = env->btf; in btf_datasec_resolve()
3679 const struct btf_type *var_type = btf_type_by_id(env->btf, in btf_datasec_resolve()
3682 btf_verifier_log_vsi(env, v->t, vsi, in btf_datasec_resolve()
3687 if (!env_type_is_resolve_sink(env, var_type) && in btf_datasec_resolve()
3688 !env_type_is_resolved(env, var_type_id)) { in btf_datasec_resolve()
3689 env_stack_set_next_member(env, i + 1); in btf_datasec_resolve()
3690 return env_stack_push(env, var_type, var_type_id); in btf_datasec_resolve()
3695 btf_verifier_log_vsi(env, v->t, vsi, "Invalid type"); in btf_datasec_resolve()
3700 btf_verifier_log_vsi(env, v->t, vsi, "Invalid size"); in btf_datasec_resolve()
3705 env_stack_pop_resolved(env, 0, 0); in btf_datasec_resolve()
3709 static void btf_datasec_log(struct btf_verifier_env *env, in btf_datasec_log() argument
3712 btf_verifier_log(env, "size=%u vlen=%u", t->size, btf_type_vlen(t)); in btf_datasec_log()
3748 static s32 btf_float_check_meta(struct btf_verifier_env *env, in btf_float_check_meta() argument
3753 btf_verifier_log_type(env, t, "vlen != 0"); in btf_float_check_meta()
3758 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_float_check_meta()
3764 btf_verifier_log_type(env, t, "Invalid type_size"); in btf_float_check_meta()
3768 btf_verifier_log_type(env, t, NULL); in btf_float_check_meta()
3773 static int btf_float_check_member(struct btf_verifier_env *env, in btf_float_check_member() argument
3792 btf_verifier_log_member(env, struct_type, member, in btf_float_check_member()
3800 btf_verifier_log_member(env, struct_type, member, in btf_float_check_member()
3808 static void btf_float_log(struct btf_verifier_env *env, in btf_float_log() argument
3811 btf_verifier_log(env, "size=%u", t->size); in btf_float_log()
3823 static s32 btf_decl_tag_check_meta(struct btf_verifier_env *env, in btf_decl_tag_check_meta() argument
3833 btf_verifier_log_basic(env, t, in btf_decl_tag_check_meta()
3839 value = btf_name_by_offset(env->btf, t->name_off); in btf_decl_tag_check_meta()
3841 btf_verifier_log_type(env, t, "Invalid value"); in btf_decl_tag_check_meta()
3846 btf_verifier_log_type(env, t, "vlen != 0"); in btf_decl_tag_check_meta()
3851 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_decl_tag_check_meta()
3857 btf_verifier_log_type(env, t, "Invalid component_idx"); in btf_decl_tag_check_meta()
3861 btf_verifier_log_type(env, t, NULL); in btf_decl_tag_check_meta()
3866 static int btf_decl_tag_resolve(struct btf_verifier_env *env, in btf_decl_tag_resolve() argument
3872 struct btf *btf = env->btf; in btf_decl_tag_resolve()
3878 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_decl_tag_resolve()
3882 if (!env_type_is_resolve_sink(env, next_type) && in btf_decl_tag_resolve()
3883 !env_type_is_resolved(env, next_type_id)) in btf_decl_tag_resolve()
3884 return env_stack_push(env, next_type, next_type_id); in btf_decl_tag_resolve()
3889 btf_verifier_log_type(env, v->t, "Invalid component_idx"); in btf_decl_tag_resolve()
3902 btf_verifier_log_type(env, v->t, "Invalid component_idx"); in btf_decl_tag_resolve()
3907 env_stack_pop_resolved(env, next_type_id, 0); in btf_decl_tag_resolve()
3912 static void btf_decl_tag_log(struct btf_verifier_env *env, const struct btf_type *t) in btf_decl_tag_log() argument
3914 btf_verifier_log(env, "type=%u component_idx=%d", t->type, in btf_decl_tag_log()
3927 static int btf_func_proto_check(struct btf_verifier_env *env, in btf_func_proto_check() argument
3936 btf = env->btf; in btf_func_proto_check()
3946 btf_verifier_log_type(env, t, "Invalid return type"); in btf_func_proto_check()
3951 !env_type_is_resolved(env, ret_type_id)) { in btf_func_proto_check()
3952 err = btf_resolve(env, ret_type, ret_type_id); in btf_func_proto_check()
3959 btf_verifier_log_type(env, t, "Invalid return type"); in btf_func_proto_check()
3970 btf_verifier_log_type(env, t, "Invalid arg#%u", in btf_func_proto_check()
3985 btf_verifier_log_type(env, t, "Invalid arg#%u", i + 1); in btf_func_proto_check()
3993 btf_verifier_log_type(env, t, in btf_func_proto_check()
4000 !env_type_is_resolved(env, arg_type_id)) { in btf_func_proto_check()
4001 err = btf_resolve(env, arg_type, arg_type_id); in btf_func_proto_check()
4007 btf_verifier_log_type(env, t, "Invalid arg#%u", i + 1); in btf_func_proto_check()
4016 static int btf_func_check(struct btf_verifier_env *env, in btf_func_check() argument
4024 btf = env->btf; in btf_func_check()
4028 btf_verifier_log_type(env, t, "Invalid type_id"); in btf_func_check()
4036 btf_verifier_log_type(env, t, "Invalid arg#%u", i + 1); in btf_func_check()
4064 static s32 btf_check_meta(struct btf_verifier_env *env, in btf_check_meta() argument
4072 btf_verifier_log(env, "[%u] meta_left:%u meta_needed:%zu", in btf_check_meta()
4073 env->log_type_id, meta_left, sizeof(*t)); in btf_check_meta()
4079 btf_verifier_log(env, "[%u] Invalid btf_info:%x", in btf_check_meta()
4080 env->log_type_id, t->info); in btf_check_meta()
4086 btf_verifier_log(env, "[%u] Invalid kind:%u", in btf_check_meta()
4087 env->log_type_id, BTF_INFO_KIND(t->info)); in btf_check_meta()
4091 if (!btf_name_offset_valid(env->btf, t->name_off)) { in btf_check_meta()
4092 btf_verifier_log(env, "[%u] Invalid name_offset:%u", in btf_check_meta()
4093 env->log_type_id, t->name_off); in btf_check_meta()
4097 var_meta_size = btf_type_ops(t)->check_meta(env, t, meta_left); in btf_check_meta()
4106 static int btf_check_all_metas(struct btf_verifier_env *env) in btf_check_all_metas() argument
4108 struct btf *btf = env->btf; in btf_check_all_metas()
4116 env->log_type_id = btf->base_btf ? btf->start_id : 1; in btf_check_all_metas()
4121 meta_size = btf_check_meta(env, t, end - cur); in btf_check_all_metas()
4125 btf_add_type(env, t); in btf_check_all_metas()
4127 env->log_type_id++; in btf_check_all_metas()
4133 static bool btf_resolve_valid(struct btf_verifier_env *env, in btf_resolve_valid() argument
4137 struct btf *btf = env->btf; in btf_resolve_valid()
4139 if (!env_type_is_resolved(env, type_id)) in btf_resolve_valid()
4174 static int btf_resolve(struct btf_verifier_env *env, in btf_resolve() argument
4177 u32 save_log_type_id = env->log_type_id; in btf_resolve()
4181 env->resolve_mode = RESOLVE_TBD; in btf_resolve()
4182 env_stack_push(env, t, type_id); in btf_resolve()
4183 while (!err && (v = env_stack_peak(env))) { in btf_resolve()
4184 env->log_type_id = v->type_id; in btf_resolve()
4185 err = btf_type_ops(v->t)->resolve(env, v); in btf_resolve()
4188 env->log_type_id = type_id; in btf_resolve()
4190 btf_verifier_log_type(env, t, in btf_resolve()
4194 btf_verifier_log_type(env, t, "Loop detected"); in btf_resolve()
4198 if (!err && !btf_resolve_valid(env, t, type_id)) { in btf_resolve()
4199 btf_verifier_log_type(env, t, "Invalid resolve state"); in btf_resolve()
4203 env->log_type_id = save_log_type_id; in btf_resolve()
4207 static int btf_check_all_types(struct btf_verifier_env *env) in btf_check_all_types() argument
4209 struct btf *btf = env->btf; in btf_check_all_types()
4214 err = env_resolve_init(env); in btf_check_all_types()
4218 env->phase++; in btf_check_all_types()
4223 env->log_type_id = type_id; in btf_check_all_types()
4225 !env_type_is_resolved(env, type_id)) { in btf_check_all_types()
4226 err = btf_resolve(env, t, type_id); in btf_check_all_types()
4232 err = btf_func_proto_check(env, t); in btf_check_all_types()
4238 err = btf_func_check(env, t); in btf_check_all_types()
4247 static int btf_parse_type_sec(struct btf_verifier_env *env) in btf_parse_type_sec() argument
4249 const struct btf_header *hdr = &env->btf->hdr; in btf_parse_type_sec()
4254 btf_verifier_log(env, "Unaligned type_off"); in btf_parse_type_sec()
4258 if (!env->btf->base_btf && !hdr->type_len) { in btf_parse_type_sec()
4259 btf_verifier_log(env, "No type found"); in btf_parse_type_sec()
4263 err = btf_check_all_metas(env); in btf_parse_type_sec()
4267 return btf_check_all_types(env); in btf_parse_type_sec()
4270 static int btf_parse_str_sec(struct btf_verifier_env *env) in btf_parse_str_sec() argument
4273 struct btf *btf = env->btf; in btf_parse_str_sec()
4281 btf_verifier_log(env, "String section is not at the end"); in btf_parse_str_sec()
4290 btf_verifier_log(env, "Invalid string section"); in btf_parse_str_sec()
4294 btf_verifier_log(env, "Invalid string section"); in btf_parse_str_sec()
4314 static int btf_check_sec_info(struct btf_verifier_env *env, in btf_check_sec_info() argument
4322 btf = env->btf; in btf_check_sec_info()
4338 btf_verifier_log(env, "Invalid section offset"); in btf_check_sec_info()
4343 btf_verifier_log(env, "Unsupported section found"); in btf_check_sec_info()
4347 btf_verifier_log(env, "Section overlap found"); in btf_check_sec_info()
4351 btf_verifier_log(env, in btf_check_sec_info()
4360 btf_verifier_log(env, "Unsupported section found"); in btf_check_sec_info()
4367 static int btf_parse_hdr(struct btf_verifier_env *env) in btf_parse_hdr() argument
4374 btf = env->btf; in btf_parse_hdr()
4379 btf_verifier_log(env, "hdr_len not found"); in btf_parse_hdr()
4386 btf_verifier_log(env, "btf_header not found"); in btf_parse_hdr()
4397 btf_verifier_log(env, "Unsupported btf_header"); in btf_parse_hdr()
4408 btf_verifier_log_hdr(env, btf_data_size); in btf_parse_hdr()
4411 btf_verifier_log(env, "Invalid magic"); in btf_parse_hdr()
4416 btf_verifier_log(env, "Unsupported version"); in btf_parse_hdr()
4421 btf_verifier_log(env, "Unsupported flags"); in btf_parse_hdr()
4426 btf_verifier_log(env, "No data"); in btf_parse_hdr()
4430 err = btf_check_sec_info(env, btf_data_size); in btf_parse_hdr()
4440 struct btf_verifier_env *env = NULL; in btf_parse() local
4449 env = kzalloc(sizeof(*env), GFP_KERNEL | __GFP_NOWARN); in btf_parse()
4450 if (!env) in btf_parse()
4453 log = &env->log; in btf_parse()
4475 env->btf = btf; in btf_parse()
4491 err = btf_parse_hdr(env); in btf_parse()
4497 err = btf_parse_str_sec(env); in btf_parse()
4501 err = btf_parse_type_sec(env); in btf_parse()
4510 btf_verifier_env_free(env); in btf_parse()
4515 btf_verifier_env_free(env); in btf_parse()
4668 struct btf_verifier_env *env = NULL; in BTF_ID() local
4673 env = kzalloc(sizeof(*env), GFP_KERNEL | __GFP_NOWARN); in BTF_ID()
4674 if (!env) in BTF_ID()
4677 log = &env->log; in BTF_ID()
4685 env->btf = btf; in BTF_ID()
4692 err = btf_parse_hdr(env); in BTF_ID()
4698 err = btf_parse_str_sec(env); in BTF_ID()
4702 err = btf_check_all_metas(env); in BTF_ID()
4722 btf_verifier_env_free(env); in BTF_ID()
4726 btf_verifier_env_free(env); in BTF_ID()
4738 struct btf_verifier_env *env = NULL; in btf_parse_module() local
4749 env = kzalloc(sizeof(*env), GFP_KERNEL | __GFP_NOWARN); in btf_parse_module()
4750 if (!env) in btf_parse_module()
4753 log = &env->log; in btf_parse_module()
4761 env->btf = btf; in btf_parse_module()
4777 err = btf_parse_hdr(env); in btf_parse_module()
4783 err = btf_parse_str_sec(env); in btf_parse_module()
4787 err = btf_check_all_metas(env); in btf_parse_module()
4791 btf_verifier_env_free(env); in btf_parse_module()
4796 btf_verifier_env_free(env); in btf_parse_module()
5566 static int btf_check_func_arg_match(struct bpf_verifier_env *env, in btf_check_func_arg_match() argument
5571 struct bpf_verifier_log *log = &env->log; in btf_check_func_arg_match()
5664 env->prog->type, i)) { in btf_check_func_arg_match()
5674 if (check_ctx_reg(env, reg, regno)) in btf_check_func_arg_match()
5689 if (check_mem_reg(env, reg, regno, type_size)) in btf_check_func_arg_match()
5706 int btf_check_subprog_arg_match(struct bpf_verifier_env *env, int subprog, in btf_check_subprog_arg_match() argument
5709 struct bpf_prog *prog = env->prog; in btf_check_subprog_arg_match()
5726 err = btf_check_func_arg_match(env, btf, btf_id, regs, is_global); in btf_check_subprog_arg_match()
5737 int btf_check_kfunc_arg_match(struct bpf_verifier_env *env, in btf_check_kfunc_arg_match() argument
5741 return btf_check_func_arg_match(env, btf, func_id, regs, false); in btf_check_kfunc_arg_match()
5751 int btf_prepare_func_args(struct bpf_verifier_env *env, int subprog, in btf_prepare_func_args() argument
5754 struct bpf_verifier_log *log = &env->log; in btf_prepare_func_args()
5755 struct bpf_prog *prog = env->prog; in btf_prepare_func_args()
5850 reg->id = ++env->id_gen; in btf_prepare_func_args()