Lines Matching refs:env

377 	s32 (*check_meta)(struct btf_verifier_env *env,
380 int (*resolve)(struct btf_verifier_env *env,
382 int (*check_member)(struct btf_verifier_env *env,
386 int (*check_kflag_member)(struct btf_verifier_env *env,
390 void (*log_details)(struct btf_verifier_env *env,
400 static int btf_resolve(struct btf_verifier_env *env,
1275 __printf(2, 3) static void btf_verifier_log(struct btf_verifier_env *env, in btf_verifier_log() argument
1278 struct bpf_verifier_log *log = &env->log; in btf_verifier_log()
1289 __printf(4, 5) static void __btf_verifier_log_type(struct btf_verifier_env *env, in __btf_verifier_log_type() argument
1294 struct bpf_verifier_log *log = &env->log; in __btf_verifier_log_type()
1296 struct btf *btf = env->btf; in __btf_verifier_log_type()
1310 env->log_type_id, in __btf_verifier_log_type()
1316 btf_type_ops(t)->log_details(env, t); in __btf_verifier_log_type()
1328 #define btf_verifier_log_type(env, t, ...) \ argument
1329 __btf_verifier_log_type((env), (t), true, __VA_ARGS__)
1330 #define btf_verifier_log_basic(env, t, ...) \ argument
1331 __btf_verifier_log_type((env), (t), false, __VA_ARGS__)
1334 static void btf_verifier_log_member(struct btf_verifier_env *env, in btf_verifier_log_member() argument
1339 struct bpf_verifier_log *log = &env->log; in btf_verifier_log_member()
1340 struct btf *btf = env->btf; in btf_verifier_log_member()
1354 if (env->phase != CHECK_META) in btf_verifier_log_member()
1355 btf_verifier_log_type(env, struct_type, NULL); in btf_verifier_log_member()
1380 static void btf_verifier_log_vsi(struct btf_verifier_env *env, in btf_verifier_log_vsi() argument
1385 struct bpf_verifier_log *log = &env->log; in btf_verifier_log_vsi()
1392 if (env->phase != CHECK_META) in btf_verifier_log_vsi()
1393 btf_verifier_log_type(env, datasec_type, NULL); in btf_verifier_log_vsi()
1407 static void btf_verifier_log_hdr(struct btf_verifier_env *env, in btf_verifier_log_hdr() argument
1410 struct bpf_verifier_log *log = &env->log; in btf_verifier_log_hdr()
1411 const struct btf *btf = env->btf; in btf_verifier_log_hdr()
1431 static int btf_add_type(struct btf_verifier_env *env, struct btf_type *t) in btf_add_type() argument
1433 struct btf *btf = env->btf; in btf_add_type()
1442 btf_verifier_log(env, "Exceeded max num of types"); in btf_add_type()
1541 static int env_resolve_init(struct btf_verifier_env *env) in env_resolve_init() argument
1543 struct btf *btf = env->btf; in env_resolve_init()
1566 env->visit_states = visit_states; in env_resolve_init()
1577 static void btf_verifier_env_free(struct btf_verifier_env *env) in btf_verifier_env_free() argument
1579 kvfree(env->visit_states); in btf_verifier_env_free()
1580 kfree(env); in btf_verifier_env_free()
1583 static bool env_type_is_resolve_sink(const struct btf_verifier_env *env, in env_type_is_resolve_sink() argument
1586 switch (env->resolve_mode) { in env_type_is_resolve_sink()
1608 static bool env_type_is_resolved(const struct btf_verifier_env *env, in env_type_is_resolved() argument
1612 if (type_id < env->btf->start_id) in env_type_is_resolved()
1615 return env->visit_states[type_id - env->btf->start_id] == RESOLVED; in env_type_is_resolved()
1618 static int env_stack_push(struct btf_verifier_env *env, in env_stack_push() argument
1621 const struct btf *btf = env->btf; in env_stack_push()
1624 if (env->top_stack == MAX_RESOLVE_DEPTH) in env_stack_push()
1628 || env->visit_states[type_id - btf->start_id] != NOT_VISITED) in env_stack_push()
1631 env->visit_states[type_id - btf->start_id] = VISITED; in env_stack_push()
1633 v = &env->stack[env->top_stack++]; in env_stack_push()
1638 if (env->resolve_mode == RESOLVE_TBD) { in env_stack_push()
1640 env->resolve_mode = RESOLVE_PTR; in env_stack_push()
1642 env->resolve_mode = RESOLVE_STRUCT_OR_ARRAY; in env_stack_push()
1648 static void env_stack_set_next_member(struct btf_verifier_env *env, in env_stack_set_next_member() argument
1651 env->stack[env->top_stack - 1].next_member = next_member; in env_stack_set_next_member()
1654 static void env_stack_pop_resolved(struct btf_verifier_env *env, in env_stack_pop_resolved() argument
1658 u32 type_id = env->stack[--(env->top_stack)].type_id; in env_stack_pop_resolved()
1659 struct btf *btf = env->btf; in env_stack_pop_resolved()
1664 env->visit_states[type_id] = RESOLVED; in env_stack_pop_resolved()
1667 static const struct resolve_vertex *env_stack_peak(struct btf_verifier_env *env) in env_stack_peak() argument
1669 return env->top_stack ? &env->stack[env->top_stack - 1] : NULL; in env_stack_peak()
1834 static int btf_df_check_member(struct btf_verifier_env *env, in btf_df_check_member() argument
1839 btf_verifier_log_basic(env, struct_type, in btf_df_check_member()
1844 static int btf_df_check_kflag_member(struct btf_verifier_env *env, in btf_df_check_kflag_member() argument
1849 btf_verifier_log_basic(env, struct_type, in btf_df_check_kflag_member()
1857 static int btf_generic_check_kflag_member(struct btf_verifier_env *env, in btf_generic_check_kflag_member() argument
1863 btf_verifier_log_member(env, struct_type, member, in btf_generic_check_kflag_member()
1871 return btf_type_ops(member_type)->check_member(env, struct_type, in btf_generic_check_kflag_member()
1876 static int btf_df_resolve(struct btf_verifier_env *env, in btf_df_resolve() argument
1879 btf_verifier_log_basic(env, v->t, "Unsupported resolve"); in btf_df_resolve()
1890 static int btf_int_check_member(struct btf_verifier_env *env, in btf_int_check_member() argument
1902 btf_verifier_log_member(env, struct_type, member, in btf_int_check_member()
1913 btf_verifier_log_member(env, struct_type, member, in btf_int_check_member()
1920 btf_verifier_log_member(env, struct_type, member, in btf_int_check_member()
1928 static int btf_int_check_kflag_member(struct btf_verifier_env *env, in btf_int_check_kflag_member() argument
1940 btf_verifier_log_member(env, struct_type, member, in btf_int_check_kflag_member()
1954 btf_verifier_log_member(env, struct_type, member, in btf_int_check_kflag_member()
1961 btf_verifier_log_member(env, struct_type, member, in btf_int_check_kflag_member()
1969 btf_verifier_log_member(env, struct_type, member, in btf_int_check_kflag_member()
1976 btf_verifier_log_member(env, struct_type, member, in btf_int_check_kflag_member()
1984 static s32 btf_int_check_meta(struct btf_verifier_env *env, in btf_int_check_meta() argument
1992 btf_verifier_log_basic(env, t, in btf_int_check_meta()
1999 btf_verifier_log_type(env, t, "vlen != 0"); in btf_int_check_meta()
2004 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_int_check_meta()
2010 btf_verifier_log_basic(env, t, "Invalid int_data:%x", in btf_int_check_meta()
2018 btf_verifier_log_type(env, t, "nr_bits exceeds %zu", in btf_int_check_meta()
2024 btf_verifier_log_type(env, t, "nr_bits exceeds type_size"); in btf_int_check_meta()
2039 btf_verifier_log_type(env, t, "Unsupported encoding"); in btf_int_check_meta()
2043 btf_verifier_log_type(env, t, NULL); in btf_int_check_meta()
2048 static void btf_int_log(struct btf_verifier_env *env, in btf_int_log() argument
2053 btf_verifier_log(env, in btf_int_log()
2249 static int btf_modifier_check_member(struct btf_verifier_env *env, in btf_modifier_check_member() argument
2257 struct btf *btf = env->btf; in btf_modifier_check_member()
2261 btf_verifier_log_member(env, struct_type, member, in btf_modifier_check_member()
2269 return btf_type_ops(resolved_type)->check_member(env, struct_type, in btf_modifier_check_member()
2274 static int btf_modifier_check_kflag_member(struct btf_verifier_env *env, in btf_modifier_check_kflag_member() argument
2282 struct btf *btf = env->btf; in btf_modifier_check_kflag_member()
2286 btf_verifier_log_member(env, struct_type, member, in btf_modifier_check_kflag_member()
2294 return btf_type_ops(resolved_type)->check_kflag_member(env, struct_type, in btf_modifier_check_kflag_member()
2299 static int btf_ptr_check_member(struct btf_verifier_env *env, in btf_ptr_check_member() argument
2311 btf_verifier_log_member(env, struct_type, member, in btf_ptr_check_member()
2317 btf_verifier_log_member(env, struct_type, member, in btf_ptr_check_member()
2325 static int btf_ref_type_check_meta(struct btf_verifier_env *env, in btf_ref_type_check_meta() argument
2330 btf_verifier_log_type(env, t, "vlen != 0"); in btf_ref_type_check_meta()
2335 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_ref_type_check_meta()
2340 btf_verifier_log_type(env, t, "Invalid type_id"); in btf_ref_type_check_meta()
2349 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_ref_type_check_meta()
2350 btf_verifier_log_type(env, t, "Invalid name"); in btf_ref_type_check_meta()
2355 btf_verifier_log_type(env, t, "Invalid name"); in btf_ref_type_check_meta()
2360 btf_verifier_log_type(env, t, NULL); in btf_ref_type_check_meta()
2365 static int btf_modifier_resolve(struct btf_verifier_env *env, in btf_modifier_resolve() argument
2371 struct btf *btf = env->btf; in btf_modifier_resolve()
2375 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_modifier_resolve()
2379 if (!env_type_is_resolve_sink(env, next_type) && in btf_modifier_resolve()
2380 !env_type_is_resolved(env, next_type_id)) in btf_modifier_resolve()
2381 return env_stack_push(env, next_type, next_type_id); in btf_modifier_resolve()
2390 if (env_type_is_resolved(env, next_type_id)) in btf_modifier_resolve()
2397 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_modifier_resolve()
2402 env_stack_pop_resolved(env, next_type_id, 0); in btf_modifier_resolve()
2407 static int btf_var_resolve(struct btf_verifier_env *env, in btf_var_resolve() argument
2413 struct btf *btf = env->btf; in btf_var_resolve()
2417 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_var_resolve()
2421 if (!env_type_is_resolve_sink(env, next_type) && in btf_var_resolve()
2422 !env_type_is_resolved(env, next_type_id)) in btf_var_resolve()
2423 return env_stack_push(env, next_type, next_type_id); in btf_var_resolve()
2433 !env_type_is_resolve_sink(env, resolved_type) && in btf_var_resolve()
2434 !env_type_is_resolved(env, resolved_type_id)) in btf_var_resolve()
2435 return env_stack_push(env, resolved_type, in btf_var_resolve()
2444 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_var_resolve()
2448 env_stack_pop_resolved(env, next_type_id, 0); in btf_var_resolve()
2453 static int btf_ptr_resolve(struct btf_verifier_env *env, in btf_ptr_resolve() argument
2459 struct btf *btf = env->btf; in btf_ptr_resolve()
2463 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_ptr_resolve()
2467 if (!env_type_is_resolve_sink(env, next_type) && in btf_ptr_resolve()
2468 !env_type_is_resolved(env, next_type_id)) in btf_ptr_resolve()
2469 return env_stack_push(env, next_type, next_type_id); in btf_ptr_resolve()
2487 !env_type_is_resolve_sink(env, resolved_type) && in btf_ptr_resolve()
2488 !env_type_is_resolved(env, resolved_type_id)) in btf_ptr_resolve()
2489 return env_stack_push(env, resolved_type, in btf_ptr_resolve()
2494 if (env_type_is_resolved(env, next_type_id)) in btf_ptr_resolve()
2500 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_ptr_resolve()
2505 env_stack_pop_resolved(env, next_type_id, 0); in btf_ptr_resolve()
2550 static void btf_ref_type_log(struct btf_verifier_env *env, in btf_ref_type_log() argument
2553 btf_verifier_log(env, "type_id=%u", t->type); in btf_ref_type_log()
2574 static s32 btf_fwd_check_meta(struct btf_verifier_env *env, in btf_fwd_check_meta() argument
2579 btf_verifier_log_type(env, t, "vlen != 0"); in btf_fwd_check_meta()
2584 btf_verifier_log_type(env, t, "type != 0"); in btf_fwd_check_meta()
2590 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_fwd_check_meta()
2591 btf_verifier_log_type(env, t, "Invalid name"); in btf_fwd_check_meta()
2595 btf_verifier_log_type(env, t, NULL); in btf_fwd_check_meta()
2600 static void btf_fwd_type_log(struct btf_verifier_env *env, in btf_fwd_type_log() argument
2603 btf_verifier_log(env, "%s", btf_type_kflag(t) ? "union" : "struct"); in btf_fwd_type_log()
2615 static int btf_array_check_member(struct btf_verifier_env *env, in btf_array_check_member() argument
2623 struct btf *btf = env->btf; in btf_array_check_member()
2626 btf_verifier_log_member(env, struct_type, member, in btf_array_check_member()
2636 btf_verifier_log_member(env, struct_type, member, in btf_array_check_member()
2644 static s32 btf_array_check_meta(struct btf_verifier_env *env, in btf_array_check_meta() argument
2652 btf_verifier_log_basic(env, t, in btf_array_check_meta()
2660 btf_verifier_log_type(env, t, "Invalid name"); in btf_array_check_meta()
2665 btf_verifier_log_type(env, t, "vlen != 0"); in btf_array_check_meta()
2670 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_array_check_meta()
2675 btf_verifier_log_type(env, t, "size != 0"); in btf_array_check_meta()
2683 btf_verifier_log_type(env, t, "Invalid elem"); in btf_array_check_meta()
2688 btf_verifier_log_type(env, t, "Invalid index"); in btf_array_check_meta()
2692 btf_verifier_log_type(env, t, NULL); in btf_array_check_meta()
2697 static int btf_array_resolve(struct btf_verifier_env *env, in btf_array_resolve() argument
2703 struct btf *btf = env->btf; in btf_array_resolve()
2711 btf_verifier_log_type(env, v->t, "Invalid index"); in btf_array_resolve()
2715 if (!env_type_is_resolve_sink(env, index_type) && in btf_array_resolve()
2716 !env_type_is_resolved(env, index_type_id)) in btf_array_resolve()
2717 return env_stack_push(env, index_type, index_type_id); in btf_array_resolve()
2722 btf_verifier_log_type(env, v->t, "Invalid index"); in btf_array_resolve()
2731 btf_verifier_log_type(env, v->t, in btf_array_resolve()
2736 if (!env_type_is_resolve_sink(env, elem_type) && in btf_array_resolve()
2737 !env_type_is_resolved(env, elem_type_id)) in btf_array_resolve()
2738 return env_stack_push(env, elem_type, elem_type_id); in btf_array_resolve()
2742 btf_verifier_log_type(env, v->t, "Invalid elem"); in btf_array_resolve()
2747 btf_verifier_log_type(env, v->t, "Invalid array of int"); in btf_array_resolve()
2752 btf_verifier_log_type(env, v->t, in btf_array_resolve()
2757 env_stack_pop_resolved(env, elem_type_id, elem_size * array->nelems); in btf_array_resolve()
2762 static void btf_array_log(struct btf_verifier_env *env, in btf_array_log() argument
2767 btf_verifier_log(env, "type_id=%u index_type_id=%u nr_elems=%u", in btf_array_log()
2866 static int btf_struct_check_member(struct btf_verifier_env *env, in btf_struct_check_member() argument
2875 btf_verifier_log_member(env, struct_type, member, in btf_struct_check_member()
2883 btf_verifier_log_member(env, struct_type, member, in btf_struct_check_member()
2891 static s32 btf_struct_check_meta(struct btf_verifier_env *env, in btf_struct_check_meta() argument
2898 struct btf *btf = env->btf; in btf_struct_check_meta()
2905 btf_verifier_log_basic(env, t, in btf_struct_check_meta()
2913 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_struct_check_meta()
2914 btf_verifier_log_type(env, t, "Invalid name"); in btf_struct_check_meta()
2918 btf_verifier_log_type(env, t, NULL); in btf_struct_check_meta()
2923 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
2932 btf_verifier_log_member(env, t, member, "Invalid name"); in btf_struct_check_meta()
2937 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
2944 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
2954 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
2960 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
2965 btf_verifier_log_member(env, t, member, NULL); in btf_struct_check_meta()
2972 static int btf_struct_resolve(struct btf_verifier_env *env, in btf_struct_resolve() argument
2990 if (WARN_ON_ONCE(!env_type_is_resolved(env, in btf_struct_resolve()
2994 last_member_type = btf_type_by_id(env->btf, in btf_struct_resolve()
2997 err = btf_type_ops(last_member_type)->check_kflag_member(env, v->t, in btf_struct_resolve()
3001 err = btf_type_ops(last_member_type)->check_member(env, v->t, in btf_struct_resolve()
3010 const struct btf_type *member_type = btf_type_by_id(env->btf, in btf_struct_resolve()
3015 btf_verifier_log_member(env, v->t, member, in btf_struct_resolve()
3020 if (!env_type_is_resolve_sink(env, member_type) && in btf_struct_resolve()
3021 !env_type_is_resolved(env, member_type_id)) { in btf_struct_resolve()
3022 env_stack_set_next_member(env, i + 1); in btf_struct_resolve()
3023 return env_stack_push(env, member_type, member_type_id); in btf_struct_resolve()
3027 err = btf_type_ops(member_type)->check_kflag_member(env, v->t, in btf_struct_resolve()
3031 err = btf_type_ops(member_type)->check_member(env, v->t, in btf_struct_resolve()
3038 env_stack_pop_resolved(env, 0, 0); in btf_struct_resolve()
3043 static void btf_struct_log(struct btf_verifier_env *env, in btf_struct_log() argument
3046 btf_verifier_log(env, "size=%u vlen=%u", t->size, btf_type_vlen(t)); in btf_struct_log()
3225 static int btf_enum_check_member(struct btf_verifier_env *env, in btf_enum_check_member() argument
3234 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_member()
3242 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_member()
3250 static int btf_enum_check_kflag_member(struct btf_verifier_env *env, in btf_enum_check_kflag_member() argument
3262 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_kflag_member()
3269 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_kflag_member()
3277 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_kflag_member()
3285 static s32 btf_enum_check_meta(struct btf_verifier_env *env, in btf_enum_check_meta() argument
3290 struct btf *btf = env->btf; in btf_enum_check_meta()
3298 btf_verifier_log_basic(env, t, in btf_enum_check_meta()
3305 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_enum_check_meta()
3310 btf_verifier_log_type(env, t, "Unexpected size"); in btf_enum_check_meta()
3316 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_enum_check_meta()
3317 btf_verifier_log_type(env, t, "Invalid name"); in btf_enum_check_meta()
3321 btf_verifier_log_type(env, t, NULL); in btf_enum_check_meta()
3325 btf_verifier_log(env, "\tInvalid name_offset:%u", in btf_enum_check_meta()
3333 btf_verifier_log_type(env, t, "Invalid name"); in btf_enum_check_meta()
3337 if (env->log.level == BPF_LOG_KERNEL) in btf_enum_check_meta()
3339 btf_verifier_log(env, "\t%s val=%d\n", in btf_enum_check_meta()
3347 static void btf_enum_log(struct btf_verifier_env *env, in btf_enum_log() argument
3350 btf_verifier_log(env, "size=%u vlen=%u", t->size, btf_type_vlen(t)); in btf_enum_log()
3393 static s32 btf_func_proto_check_meta(struct btf_verifier_env *env, in btf_func_proto_check_meta() argument
3400 btf_verifier_log_basic(env, t, in btf_func_proto_check_meta()
3407 btf_verifier_log_type(env, t, "Invalid name"); in btf_func_proto_check_meta()
3412 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_func_proto_check_meta()
3416 btf_verifier_log_type(env, t, NULL); in btf_func_proto_check_meta()
3421 static void btf_func_proto_log(struct btf_verifier_env *env, in btf_func_proto_log() argument
3427 btf_verifier_log(env, "return=%u args=(", t->type); in btf_func_proto_log()
3429 btf_verifier_log(env, "void"); in btf_func_proto_log()
3435 btf_verifier_log(env, "vararg"); in btf_func_proto_log()
3439 btf_verifier_log(env, "%u %s", args[0].type, in btf_func_proto_log()
3440 __btf_name_by_offset(env->btf, in btf_func_proto_log()
3443 btf_verifier_log(env, ", %u %s", args[i].type, in btf_func_proto_log()
3444 __btf_name_by_offset(env->btf, in btf_func_proto_log()
3451 btf_verifier_log(env, ", %u %s", last_arg->type, in btf_func_proto_log()
3452 __btf_name_by_offset(env->btf, in btf_func_proto_log()
3455 btf_verifier_log(env, ", vararg"); in btf_func_proto_log()
3459 btf_verifier_log(env, ")"); in btf_func_proto_log()
3480 static s32 btf_func_check_meta(struct btf_verifier_env *env, in btf_func_check_meta() argument
3485 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_func_check_meta()
3486 btf_verifier_log_type(env, t, "Invalid name"); in btf_func_check_meta()
3491 btf_verifier_log_type(env, t, "Invalid func linkage"); in btf_func_check_meta()
3496 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_func_check_meta()
3500 btf_verifier_log_type(env, t, NULL); in btf_func_check_meta()
3514 static s32 btf_var_check_meta(struct btf_verifier_env *env, in btf_var_check_meta() argument
3522 btf_verifier_log_basic(env, t, in btf_var_check_meta()
3529 btf_verifier_log_type(env, t, "vlen != 0"); in btf_var_check_meta()
3534 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_var_check_meta()
3539 !__btf_name_valid(env->btf, t->name_off, true)) { in btf_var_check_meta()
3540 btf_verifier_log_type(env, t, "Invalid name"); in btf_var_check_meta()
3546 btf_verifier_log_type(env, t, "Invalid type_id"); in btf_var_check_meta()
3553 btf_verifier_log_type(env, t, "Linkage not supported"); in btf_var_check_meta()
3557 btf_verifier_log_type(env, t, NULL); in btf_var_check_meta()
3562 static void btf_var_log(struct btf_verifier_env *env, const struct btf_type *t) in btf_var_log() argument
3566 btf_verifier_log(env, "type_id=%u linkage=%u", t->type, var->linkage); in btf_var_log()
3578 static s32 btf_datasec_check_meta(struct btf_verifier_env *env, in btf_datasec_check_meta() argument
3588 btf_verifier_log_basic(env, t, in btf_datasec_check_meta()
3595 btf_verifier_log_type(env, t, "size == 0"); in btf_datasec_check_meta()
3600 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_datasec_check_meta()
3605 !btf_name_valid_section(env->btf, t->name_off)) { in btf_datasec_check_meta()
3606 btf_verifier_log_type(env, t, "Invalid name"); in btf_datasec_check_meta()
3610 btf_verifier_log_type(env, t, NULL); in btf_datasec_check_meta()
3615 btf_verifier_log_vsi(env, t, vsi, in btf_datasec_check_meta()
3621 btf_verifier_log_vsi(env, t, vsi, in btf_datasec_check_meta()
3627 btf_verifier_log_vsi(env, t, vsi, in btf_datasec_check_meta()
3634 btf_verifier_log_vsi(env, t, vsi, in btf_datasec_check_meta()
3639 btf_verifier_log_vsi(env, t, vsi, NULL); in btf_datasec_check_meta()
3644 btf_verifier_log_type(env, t, "Invalid btf_info size"); in btf_datasec_check_meta()
3651 static int btf_datasec_resolve(struct btf_verifier_env *env, in btf_datasec_resolve() argument
3655 struct btf *btf = env->btf; in btf_datasec_resolve()
3660 const struct btf_type *var_type = btf_type_by_id(env->btf, in btf_datasec_resolve()
3663 btf_verifier_log_vsi(env, v->t, vsi, in btf_datasec_resolve()
3668 if (!env_type_is_resolve_sink(env, var_type) && in btf_datasec_resolve()
3669 !env_type_is_resolved(env, var_type_id)) { in btf_datasec_resolve()
3670 env_stack_set_next_member(env, i + 1); in btf_datasec_resolve()
3671 return env_stack_push(env, var_type, var_type_id); in btf_datasec_resolve()
3676 btf_verifier_log_vsi(env, v->t, vsi, "Invalid type"); in btf_datasec_resolve()
3681 btf_verifier_log_vsi(env, v->t, vsi, "Invalid size"); in btf_datasec_resolve()
3686 env_stack_pop_resolved(env, 0, 0); in btf_datasec_resolve()
3690 static void btf_datasec_log(struct btf_verifier_env *env, in btf_datasec_log() argument
3693 btf_verifier_log(env, "size=%u vlen=%u", t->size, btf_type_vlen(t)); in btf_datasec_log()
3729 static s32 btf_float_check_meta(struct btf_verifier_env *env, in btf_float_check_meta() argument
3734 btf_verifier_log_type(env, t, "vlen != 0"); in btf_float_check_meta()
3739 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_float_check_meta()
3745 btf_verifier_log_type(env, t, "Invalid type_size"); in btf_float_check_meta()
3749 btf_verifier_log_type(env, t, NULL); in btf_float_check_meta()
3754 static int btf_float_check_member(struct btf_verifier_env *env, in btf_float_check_member() argument
3773 btf_verifier_log_member(env, struct_type, member, in btf_float_check_member()
3781 btf_verifier_log_member(env, struct_type, member, in btf_float_check_member()
3789 static void btf_float_log(struct btf_verifier_env *env, in btf_float_log() argument
3792 btf_verifier_log(env, "size=%u", t->size); in btf_float_log()
3804 static int btf_func_proto_check(struct btf_verifier_env *env, in btf_func_proto_check() argument
3813 btf = env->btf; in btf_func_proto_check()
3823 btf_verifier_log_type(env, t, "Invalid return type"); in btf_func_proto_check()
3828 !env_type_is_resolved(env, ret_type_id)) { in btf_func_proto_check()
3829 err = btf_resolve(env, ret_type, ret_type_id); in btf_func_proto_check()
3836 btf_verifier_log_type(env, t, "Invalid return type"); in btf_func_proto_check()
3847 btf_verifier_log_type(env, t, "Invalid arg#%u", in btf_func_proto_check()
3862 btf_verifier_log_type(env, t, "Invalid arg#%u", i + 1); in btf_func_proto_check()
3870 btf_verifier_log_type(env, t, in btf_func_proto_check()
3877 !env_type_is_resolved(env, arg_type_id)) { in btf_func_proto_check()
3878 err = btf_resolve(env, arg_type, arg_type_id); in btf_func_proto_check()
3884 btf_verifier_log_type(env, t, "Invalid arg#%u", i + 1); in btf_func_proto_check()
3893 static int btf_func_check(struct btf_verifier_env *env, in btf_func_check() argument
3901 btf = env->btf; in btf_func_check()
3905 btf_verifier_log_type(env, t, "Invalid type_id"); in btf_func_check()
3913 btf_verifier_log_type(env, t, "Invalid arg#%u", i + 1); in btf_func_check()
3940 static s32 btf_check_meta(struct btf_verifier_env *env, in btf_check_meta() argument
3948 btf_verifier_log(env, "[%u] meta_left:%u meta_needed:%zu", in btf_check_meta()
3949 env->log_type_id, meta_left, sizeof(*t)); in btf_check_meta()
3955 btf_verifier_log(env, "[%u] Invalid btf_info:%x", in btf_check_meta()
3956 env->log_type_id, t->info); in btf_check_meta()
3962 btf_verifier_log(env, "[%u] Invalid kind:%u", in btf_check_meta()
3963 env->log_type_id, BTF_INFO_KIND(t->info)); in btf_check_meta()
3967 if (!btf_name_offset_valid(env->btf, t->name_off)) { in btf_check_meta()
3968 btf_verifier_log(env, "[%u] Invalid name_offset:%u", in btf_check_meta()
3969 env->log_type_id, t->name_off); in btf_check_meta()
3973 var_meta_size = btf_type_ops(t)->check_meta(env, t, meta_left); in btf_check_meta()
3982 static int btf_check_all_metas(struct btf_verifier_env *env) in btf_check_all_metas() argument
3984 struct btf *btf = env->btf; in btf_check_all_metas()
3992 env->log_type_id = btf->base_btf ? btf->start_id : 1; in btf_check_all_metas()
3997 meta_size = btf_check_meta(env, t, end - cur); in btf_check_all_metas()
4001 btf_add_type(env, t); in btf_check_all_metas()
4003 env->log_type_id++; in btf_check_all_metas()
4009 static bool btf_resolve_valid(struct btf_verifier_env *env, in btf_resolve_valid() argument
4013 struct btf *btf = env->btf; in btf_resolve_valid()
4015 if (!env_type_is_resolved(env, type_id)) in btf_resolve_valid()
4046 static int btf_resolve(struct btf_verifier_env *env, in btf_resolve() argument
4049 u32 save_log_type_id = env->log_type_id; in btf_resolve()
4053 env->resolve_mode = RESOLVE_TBD; in btf_resolve()
4054 env_stack_push(env, t, type_id); in btf_resolve()
4055 while (!err && (v = env_stack_peak(env))) { in btf_resolve()
4056 env->log_type_id = v->type_id; in btf_resolve()
4057 err = btf_type_ops(v->t)->resolve(env, v); in btf_resolve()
4060 env->log_type_id = type_id; in btf_resolve()
4062 btf_verifier_log_type(env, t, in btf_resolve()
4066 btf_verifier_log_type(env, t, "Loop detected"); in btf_resolve()
4070 if (!err && !btf_resolve_valid(env, t, type_id)) { in btf_resolve()
4071 btf_verifier_log_type(env, t, "Invalid resolve state"); in btf_resolve()
4075 env->log_type_id = save_log_type_id; in btf_resolve()
4079 static int btf_check_all_types(struct btf_verifier_env *env) in btf_check_all_types() argument
4081 struct btf *btf = env->btf; in btf_check_all_types()
4086 err = env_resolve_init(env); in btf_check_all_types()
4090 env->phase++; in btf_check_all_types()
4095 env->log_type_id = type_id; in btf_check_all_types()
4097 !env_type_is_resolved(env, type_id)) { in btf_check_all_types()
4098 err = btf_resolve(env, t, type_id); in btf_check_all_types()
4104 err = btf_func_proto_check(env, t); in btf_check_all_types()
4110 err = btf_func_check(env, t); in btf_check_all_types()
4119 static int btf_parse_type_sec(struct btf_verifier_env *env) in btf_parse_type_sec() argument
4121 const struct btf_header *hdr = &env->btf->hdr; in btf_parse_type_sec()
4126 btf_verifier_log(env, "Unaligned type_off"); in btf_parse_type_sec()
4130 if (!env->btf->base_btf && !hdr->type_len) { in btf_parse_type_sec()
4131 btf_verifier_log(env, "No type found"); in btf_parse_type_sec()
4135 err = btf_check_all_metas(env); in btf_parse_type_sec()
4139 return btf_check_all_types(env); in btf_parse_type_sec()
4142 static int btf_parse_str_sec(struct btf_verifier_env *env) in btf_parse_str_sec() argument
4145 struct btf *btf = env->btf; in btf_parse_str_sec()
4153 btf_verifier_log(env, "String section is not at the end"); in btf_parse_str_sec()
4162 btf_verifier_log(env, "Invalid string section"); in btf_parse_str_sec()
4166 btf_verifier_log(env, "Invalid string section"); in btf_parse_str_sec()
4186 static int btf_check_sec_info(struct btf_verifier_env *env, in btf_check_sec_info() argument
4194 btf = env->btf; in btf_check_sec_info()
4210 btf_verifier_log(env, "Invalid section offset"); in btf_check_sec_info()
4215 btf_verifier_log(env, "Unsupported section found"); in btf_check_sec_info()
4219 btf_verifier_log(env, "Section overlap found"); in btf_check_sec_info()
4223 btf_verifier_log(env, in btf_check_sec_info()
4232 btf_verifier_log(env, "Unsupported section found"); in btf_check_sec_info()
4239 static int btf_parse_hdr(struct btf_verifier_env *env) in btf_parse_hdr() argument
4246 btf = env->btf; in btf_parse_hdr()
4251 btf_verifier_log(env, "hdr_len not found"); in btf_parse_hdr()
4258 btf_verifier_log(env, "btf_header not found"); in btf_parse_hdr()
4269 btf_verifier_log(env, "Unsupported btf_header"); in btf_parse_hdr()
4280 btf_verifier_log_hdr(env, btf_data_size); in btf_parse_hdr()
4283 btf_verifier_log(env, "Invalid magic"); in btf_parse_hdr()
4288 btf_verifier_log(env, "Unsupported version"); in btf_parse_hdr()
4293 btf_verifier_log(env, "Unsupported flags"); in btf_parse_hdr()
4298 btf_verifier_log(env, "No data"); in btf_parse_hdr()
4302 err = btf_check_sec_info(env, btf_data_size); in btf_parse_hdr()
4312 struct btf_verifier_env *env = NULL; in btf_parse() local
4321 env = kzalloc(sizeof(*env), GFP_KERNEL | __GFP_NOWARN); in btf_parse()
4322 if (!env) in btf_parse()
4325 log = &env->log; in btf_parse()
4347 env->btf = btf; in btf_parse()
4363 err = btf_parse_hdr(env); in btf_parse()
4369 err = btf_parse_str_sec(env); in btf_parse()
4373 err = btf_parse_type_sec(env); in btf_parse()
4382 btf_verifier_env_free(env); in btf_parse()
4387 btf_verifier_env_free(env); in btf_parse()
4540 struct btf_verifier_env *env = NULL; in BTF_ID() local
4545 env = kzalloc(sizeof(*env), GFP_KERNEL | __GFP_NOWARN); in BTF_ID()
4546 if (!env) in BTF_ID()
4549 log = &env->log; in BTF_ID()
4557 env->btf = btf; in BTF_ID()
4564 err = btf_parse_hdr(env); in BTF_ID()
4570 err = btf_parse_str_sec(env); in BTF_ID()
4574 err = btf_check_all_metas(env); in BTF_ID()
4594 btf_verifier_env_free(env); in BTF_ID()
4598 btf_verifier_env_free(env); in BTF_ID()
4610 struct btf_verifier_env *env = NULL; in btf_parse_module() local
4621 env = kzalloc(sizeof(*env), GFP_KERNEL | __GFP_NOWARN); in btf_parse_module()
4622 if (!env) in btf_parse_module()
4625 log = &env->log; in btf_parse_module()
4633 env->btf = btf; in btf_parse_module()
4649 err = btf_parse_hdr(env); in btf_parse_module()
4655 err = btf_parse_str_sec(env); in btf_parse_module()
4659 err = btf_check_all_metas(env); in btf_parse_module()
4663 btf_verifier_env_free(env); in btf_parse_module()
4668 btf_verifier_env_free(env); in btf_parse_module()
5438 static int btf_check_func_arg_match(struct bpf_verifier_env *env, in btf_check_func_arg_match() argument
5443 struct bpf_verifier_log *log = &env->log; in btf_check_func_arg_match()
5536 env->prog->type, i)) { in btf_check_func_arg_match()
5546 if (check_ctx_reg(env, reg, regno)) in btf_check_func_arg_match()
5561 if (check_mem_reg(env, reg, regno, type_size)) in btf_check_func_arg_match()
5578 int btf_check_subprog_arg_match(struct bpf_verifier_env *env, int subprog, in btf_check_subprog_arg_match() argument
5581 struct bpf_prog *prog = env->prog; in btf_check_subprog_arg_match()
5598 err = btf_check_func_arg_match(env, btf, btf_id, regs, is_global); in btf_check_subprog_arg_match()
5609 int btf_check_kfunc_arg_match(struct bpf_verifier_env *env, in btf_check_kfunc_arg_match() argument
5613 return btf_check_func_arg_match(env, btf, func_id, regs, false); in btf_check_kfunc_arg_match()
5623 int btf_prepare_func_args(struct bpf_verifier_env *env, int subprog, in btf_prepare_func_args() argument
5626 struct bpf_verifier_log *log = &env->log; in btf_prepare_func_args()
5627 struct bpf_prog *prog = env->prog; in btf_prepare_func_args()
5722 reg->id = ++env->id_gen; in btf_prepare_func_args()