Lines Matching refs:env
280 s32 (*check_meta)(struct btf_verifier_env *env,
283 int (*resolve)(struct btf_verifier_env *env,
285 int (*check_member)(struct btf_verifier_env *env,
289 int (*check_kflag_member)(struct btf_verifier_env *env,
293 void (*log_details)(struct btf_verifier_env *env,
303 static int btf_resolve(struct btf_verifier_env *env,
674 __printf(2, 3) static void btf_verifier_log(struct btf_verifier_env *env, in btf_verifier_log() argument
677 struct bpf_verifier_log *log = &env->log; in btf_verifier_log()
688 __printf(4, 5) static void __btf_verifier_log_type(struct btf_verifier_env *env, in __btf_verifier_log_type() argument
693 struct bpf_verifier_log *log = &env->log; in __btf_verifier_log_type()
695 struct btf *btf = env->btf; in __btf_verifier_log_type()
702 env->log_type_id, in __btf_verifier_log_type()
708 btf_type_ops(t)->log_details(env, t); in __btf_verifier_log_type()
720 #define btf_verifier_log_type(env, t, ...) \ argument
721 __btf_verifier_log_type((env), (t), true, __VA_ARGS__)
722 #define btf_verifier_log_basic(env, t, ...) \ argument
723 __btf_verifier_log_type((env), (t), false, __VA_ARGS__)
726 static void btf_verifier_log_member(struct btf_verifier_env *env, in btf_verifier_log_member() argument
731 struct bpf_verifier_log *log = &env->log; in btf_verifier_log_member()
732 struct btf *btf = env->btf; in btf_verifier_log_member()
744 if (env->phase != CHECK_META) in btf_verifier_log_member()
745 btf_verifier_log_type(env, struct_type, NULL); in btf_verifier_log_member()
770 static void btf_verifier_log_vsi(struct btf_verifier_env *env, in btf_verifier_log_vsi() argument
775 struct bpf_verifier_log *log = &env->log; in btf_verifier_log_vsi()
780 if (env->phase != CHECK_META) in btf_verifier_log_vsi()
781 btf_verifier_log_type(env, datasec_type, NULL); in btf_verifier_log_vsi()
795 static void btf_verifier_log_hdr(struct btf_verifier_env *env, in btf_verifier_log_hdr() argument
798 struct bpf_verifier_log *log = &env->log; in btf_verifier_log_hdr()
799 const struct btf *btf = env->btf; in btf_verifier_log_hdr()
817 static int btf_add_type(struct btf_verifier_env *env, struct btf_type *t) in btf_add_type() argument
819 struct btf *btf = env->btf; in btf_add_type()
832 btf_verifier_log(env, "Exceeded max num of types"); in btf_add_type()
921 static int env_resolve_init(struct btf_verifier_env *env) in env_resolve_init() argument
923 struct btf *btf = env->btf; in env_resolve_init()
947 env->visit_states = visit_states; in env_resolve_init()
958 static void btf_verifier_env_free(struct btf_verifier_env *env) in btf_verifier_env_free() argument
960 kvfree(env->visit_states); in btf_verifier_env_free()
961 kfree(env); in btf_verifier_env_free()
964 static bool env_type_is_resolve_sink(const struct btf_verifier_env *env, in env_type_is_resolve_sink() argument
967 switch (env->resolve_mode) { in env_type_is_resolve_sink()
989 static bool env_type_is_resolved(const struct btf_verifier_env *env, in env_type_is_resolved() argument
992 return env->visit_states[type_id] == RESOLVED; in env_type_is_resolved()
995 static int env_stack_push(struct btf_verifier_env *env, in env_stack_push() argument
1000 if (env->top_stack == MAX_RESOLVE_DEPTH) in env_stack_push()
1003 if (env->visit_states[type_id] != NOT_VISITED) in env_stack_push()
1006 env->visit_states[type_id] = VISITED; in env_stack_push()
1008 v = &env->stack[env->top_stack++]; in env_stack_push()
1013 if (env->resolve_mode == RESOLVE_TBD) { in env_stack_push()
1015 env->resolve_mode = RESOLVE_PTR; in env_stack_push()
1017 env->resolve_mode = RESOLVE_STRUCT_OR_ARRAY; in env_stack_push()
1023 static void env_stack_set_next_member(struct btf_verifier_env *env, in env_stack_set_next_member() argument
1026 env->stack[env->top_stack - 1].next_member = next_member; in env_stack_set_next_member()
1029 static void env_stack_pop_resolved(struct btf_verifier_env *env, in env_stack_pop_resolved() argument
1033 u32 type_id = env->stack[--(env->top_stack)].type_id; in env_stack_pop_resolved()
1034 struct btf *btf = env->btf; in env_stack_pop_resolved()
1038 env->visit_states[type_id] = RESOLVED; in env_stack_pop_resolved()
1041 static const struct resolve_vertex *env_stack_peak(struct btf_verifier_env *env) in env_stack_peak() argument
1043 return env->top_stack ? &env->stack[env->top_stack - 1] : NULL; in env_stack_peak()
1097 static int btf_df_check_member(struct btf_verifier_env *env, in btf_df_check_member() argument
1102 btf_verifier_log_basic(env, struct_type, in btf_df_check_member()
1107 static int btf_df_check_kflag_member(struct btf_verifier_env *env, in btf_df_check_kflag_member() argument
1112 btf_verifier_log_basic(env, struct_type, in btf_df_check_kflag_member()
1120 static int btf_generic_check_kflag_member(struct btf_verifier_env *env, in btf_generic_check_kflag_member() argument
1126 btf_verifier_log_member(env, struct_type, member, in btf_generic_check_kflag_member()
1134 return btf_type_ops(member_type)->check_member(env, struct_type, in btf_generic_check_kflag_member()
1139 static int btf_df_resolve(struct btf_verifier_env *env, in btf_df_resolve() argument
1142 btf_verifier_log_basic(env, v->t, "Unsupported resolve"); in btf_df_resolve()
1153 static int btf_int_check_member(struct btf_verifier_env *env, in btf_int_check_member() argument
1165 btf_verifier_log_member(env, struct_type, member, in btf_int_check_member()
1176 btf_verifier_log_member(env, struct_type, member, in btf_int_check_member()
1183 btf_verifier_log_member(env, struct_type, member, in btf_int_check_member()
1191 static int btf_int_check_kflag_member(struct btf_verifier_env *env, in btf_int_check_kflag_member() argument
1203 btf_verifier_log_member(env, struct_type, member, in btf_int_check_kflag_member()
1217 btf_verifier_log_member(env, struct_type, member, in btf_int_check_kflag_member()
1224 btf_verifier_log_member(env, struct_type, member, in btf_int_check_kflag_member()
1232 btf_verifier_log_member(env, struct_type, member, in btf_int_check_kflag_member()
1239 btf_verifier_log_member(env, struct_type, member, in btf_int_check_kflag_member()
1247 static s32 btf_int_check_meta(struct btf_verifier_env *env, in btf_int_check_meta() argument
1255 btf_verifier_log_basic(env, t, in btf_int_check_meta()
1262 btf_verifier_log_type(env, t, "vlen != 0"); in btf_int_check_meta()
1267 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_int_check_meta()
1273 btf_verifier_log_basic(env, t, "Invalid int_data:%x", in btf_int_check_meta()
1281 btf_verifier_log_type(env, t, "nr_bits exceeds %zu", in btf_int_check_meta()
1287 btf_verifier_log_type(env, t, "nr_bits exceeds type_size"); in btf_int_check_meta()
1302 btf_verifier_log_type(env, t, "Unsupported encoding"); in btf_int_check_meta()
1306 btf_verifier_log_type(env, t, NULL); in btf_int_check_meta()
1311 static void btf_int_log(struct btf_verifier_env *env, in btf_int_log() argument
1316 btf_verifier_log(env, in btf_int_log()
1489 static int btf_modifier_check_member(struct btf_verifier_env *env, in btf_modifier_check_member() argument
1497 struct btf *btf = env->btf; in btf_modifier_check_member()
1501 btf_verifier_log_member(env, struct_type, member, in btf_modifier_check_member()
1509 return btf_type_ops(resolved_type)->check_member(env, struct_type, in btf_modifier_check_member()
1514 static int btf_modifier_check_kflag_member(struct btf_verifier_env *env, in btf_modifier_check_kflag_member() argument
1522 struct btf *btf = env->btf; in btf_modifier_check_kflag_member()
1526 btf_verifier_log_member(env, struct_type, member, in btf_modifier_check_kflag_member()
1534 return btf_type_ops(resolved_type)->check_kflag_member(env, struct_type, in btf_modifier_check_kflag_member()
1539 static int btf_ptr_check_member(struct btf_verifier_env *env, in btf_ptr_check_member() argument
1551 btf_verifier_log_member(env, struct_type, member, in btf_ptr_check_member()
1557 btf_verifier_log_member(env, struct_type, member, in btf_ptr_check_member()
1565 static int btf_ref_type_check_meta(struct btf_verifier_env *env, in btf_ref_type_check_meta() argument
1570 btf_verifier_log_type(env, t, "vlen != 0"); in btf_ref_type_check_meta()
1575 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_ref_type_check_meta()
1580 btf_verifier_log_type(env, t, "Invalid type_id"); in btf_ref_type_check_meta()
1589 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_ref_type_check_meta()
1590 btf_verifier_log_type(env, t, "Invalid name"); in btf_ref_type_check_meta()
1595 btf_verifier_log_type(env, t, "Invalid name"); in btf_ref_type_check_meta()
1600 btf_verifier_log_type(env, t, NULL); in btf_ref_type_check_meta()
1605 static int btf_modifier_resolve(struct btf_verifier_env *env, in btf_modifier_resolve() argument
1611 struct btf *btf = env->btf; in btf_modifier_resolve()
1615 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_modifier_resolve()
1619 if (!env_type_is_resolve_sink(env, next_type) && in btf_modifier_resolve()
1620 !env_type_is_resolved(env, next_type_id)) in btf_modifier_resolve()
1621 return env_stack_push(env, next_type, next_type_id); in btf_modifier_resolve()
1630 if (env_type_is_resolved(env, next_type_id)) in btf_modifier_resolve()
1637 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_modifier_resolve()
1642 env_stack_pop_resolved(env, next_type_id, 0); in btf_modifier_resolve()
1647 static int btf_var_resolve(struct btf_verifier_env *env, in btf_var_resolve() argument
1653 struct btf *btf = env->btf; in btf_var_resolve()
1657 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_var_resolve()
1661 if (!env_type_is_resolve_sink(env, next_type) && in btf_var_resolve()
1662 !env_type_is_resolved(env, next_type_id)) in btf_var_resolve()
1663 return env_stack_push(env, next_type, next_type_id); in btf_var_resolve()
1673 !env_type_is_resolve_sink(env, resolved_type) && in btf_var_resolve()
1674 !env_type_is_resolved(env, resolved_type_id)) in btf_var_resolve()
1675 return env_stack_push(env, resolved_type, in btf_var_resolve()
1684 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_var_resolve()
1688 env_stack_pop_resolved(env, next_type_id, 0); in btf_var_resolve()
1693 static int btf_ptr_resolve(struct btf_verifier_env *env, in btf_ptr_resolve() argument
1699 struct btf *btf = env->btf; in btf_ptr_resolve()
1703 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_ptr_resolve()
1707 if (!env_type_is_resolve_sink(env, next_type) && in btf_ptr_resolve()
1708 !env_type_is_resolved(env, next_type_id)) in btf_ptr_resolve()
1709 return env_stack_push(env, next_type, next_type_id); in btf_ptr_resolve()
1727 !env_type_is_resolve_sink(env, resolved_type) && in btf_ptr_resolve()
1728 !env_type_is_resolved(env, resolved_type_id)) in btf_ptr_resolve()
1729 return env_stack_push(env, resolved_type, in btf_ptr_resolve()
1734 if (env_type_is_resolved(env, next_type_id)) in btf_ptr_resolve()
1740 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_ptr_resolve()
1745 env_stack_pop_resolved(env, next_type_id, 0); in btf_ptr_resolve()
1777 static void btf_ref_type_log(struct btf_verifier_env *env, in btf_ref_type_log() argument
1780 btf_verifier_log(env, "type_id=%u", t->type); in btf_ref_type_log()
1801 static s32 btf_fwd_check_meta(struct btf_verifier_env *env, in btf_fwd_check_meta() argument
1806 btf_verifier_log_type(env, t, "vlen != 0"); in btf_fwd_check_meta()
1811 btf_verifier_log_type(env, t, "type != 0"); in btf_fwd_check_meta()
1817 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_fwd_check_meta()
1818 btf_verifier_log_type(env, t, "Invalid name"); in btf_fwd_check_meta()
1822 btf_verifier_log_type(env, t, NULL); in btf_fwd_check_meta()
1827 static void btf_fwd_type_log(struct btf_verifier_env *env, in btf_fwd_type_log() argument
1830 btf_verifier_log(env, "%s", btf_type_kflag(t) ? "union" : "struct"); in btf_fwd_type_log()
1842 static int btf_array_check_member(struct btf_verifier_env *env, in btf_array_check_member() argument
1850 struct btf *btf = env->btf; in btf_array_check_member()
1853 btf_verifier_log_member(env, struct_type, member, in btf_array_check_member()
1863 btf_verifier_log_member(env, struct_type, member, in btf_array_check_member()
1871 static s32 btf_array_check_meta(struct btf_verifier_env *env, in btf_array_check_meta() argument
1879 btf_verifier_log_basic(env, t, in btf_array_check_meta()
1887 btf_verifier_log_type(env, t, "Invalid name"); in btf_array_check_meta()
1892 btf_verifier_log_type(env, t, "vlen != 0"); in btf_array_check_meta()
1897 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_array_check_meta()
1902 btf_verifier_log_type(env, t, "size != 0"); in btf_array_check_meta()
1910 btf_verifier_log_type(env, t, "Invalid elem"); in btf_array_check_meta()
1915 btf_verifier_log_type(env, t, "Invalid index"); in btf_array_check_meta()
1919 btf_verifier_log_type(env, t, NULL); in btf_array_check_meta()
1924 static int btf_array_resolve(struct btf_verifier_env *env, in btf_array_resolve() argument
1930 struct btf *btf = env->btf; in btf_array_resolve()
1938 btf_verifier_log_type(env, v->t, "Invalid index"); in btf_array_resolve()
1942 if (!env_type_is_resolve_sink(env, index_type) && in btf_array_resolve()
1943 !env_type_is_resolved(env, index_type_id)) in btf_array_resolve()
1944 return env_stack_push(env, index_type, index_type_id); in btf_array_resolve()
1949 btf_verifier_log_type(env, v->t, "Invalid index"); in btf_array_resolve()
1958 btf_verifier_log_type(env, v->t, in btf_array_resolve()
1963 if (!env_type_is_resolve_sink(env, elem_type) && in btf_array_resolve()
1964 !env_type_is_resolved(env, elem_type_id)) in btf_array_resolve()
1965 return env_stack_push(env, elem_type, elem_type_id); in btf_array_resolve()
1969 btf_verifier_log_type(env, v->t, "Invalid elem"); in btf_array_resolve()
1974 btf_verifier_log_type(env, v->t, "Invalid array of int"); in btf_array_resolve()
1979 btf_verifier_log_type(env, v->t, in btf_array_resolve()
1984 env_stack_pop_resolved(env, elem_type_id, elem_size * array->nelems); in btf_array_resolve()
1989 static void btf_array_log(struct btf_verifier_env *env, in btf_array_log() argument
1994 btf_verifier_log(env, "type_id=%u index_type_id=%u nr_elems=%u", in btf_array_log()
2031 static int btf_struct_check_member(struct btf_verifier_env *env, in btf_struct_check_member() argument
2040 btf_verifier_log_member(env, struct_type, member, in btf_struct_check_member()
2048 btf_verifier_log_member(env, struct_type, member, in btf_struct_check_member()
2056 static s32 btf_struct_check_meta(struct btf_verifier_env *env, in btf_struct_check_meta() argument
2063 struct btf *btf = env->btf; in btf_struct_check_meta()
2070 btf_verifier_log_basic(env, t, in btf_struct_check_meta()
2078 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_struct_check_meta()
2079 btf_verifier_log_type(env, t, "Invalid name"); in btf_struct_check_meta()
2083 btf_verifier_log_type(env, t, NULL); in btf_struct_check_meta()
2088 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
2097 btf_verifier_log_member(env, t, member, "Invalid name"); in btf_struct_check_meta()
2102 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
2109 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
2119 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
2125 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
2130 btf_verifier_log_member(env, t, member, NULL); in btf_struct_check_meta()
2137 static int btf_struct_resolve(struct btf_verifier_env *env, in btf_struct_resolve() argument
2155 if (WARN_ON_ONCE(!env_type_is_resolved(env, in btf_struct_resolve()
2159 last_member_type = btf_type_by_id(env->btf, in btf_struct_resolve()
2162 err = btf_type_ops(last_member_type)->check_kflag_member(env, v->t, in btf_struct_resolve()
2166 err = btf_type_ops(last_member_type)->check_member(env, v->t, in btf_struct_resolve()
2175 const struct btf_type *member_type = btf_type_by_id(env->btf, in btf_struct_resolve()
2180 btf_verifier_log_member(env, v->t, member, in btf_struct_resolve()
2185 if (!env_type_is_resolve_sink(env, member_type) && in btf_struct_resolve()
2186 !env_type_is_resolved(env, member_type_id)) { in btf_struct_resolve()
2187 env_stack_set_next_member(env, i + 1); in btf_struct_resolve()
2188 return env_stack_push(env, member_type, member_type_id); in btf_struct_resolve()
2192 err = btf_type_ops(member_type)->check_kflag_member(env, v->t, in btf_struct_resolve()
2196 err = btf_type_ops(member_type)->check_member(env, v->t, in btf_struct_resolve()
2203 env_stack_pop_resolved(env, 0, 0); in btf_struct_resolve()
2208 static void btf_struct_log(struct btf_verifier_env *env, in btf_struct_log() argument
2211 btf_verifier_log(env, "size=%u vlen=%u", t->size, btf_type_vlen(t)); in btf_struct_log()
2296 static int btf_enum_check_member(struct btf_verifier_env *env, in btf_enum_check_member() argument
2305 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_member()
2313 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_member()
2321 static int btf_enum_check_kflag_member(struct btf_verifier_env *env, in btf_enum_check_kflag_member() argument
2333 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_kflag_member()
2340 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_kflag_member()
2348 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_kflag_member()
2356 static s32 btf_enum_check_meta(struct btf_verifier_env *env, in btf_enum_check_meta() argument
2361 struct btf *btf = env->btf; in btf_enum_check_meta()
2369 btf_verifier_log_basic(env, t, in btf_enum_check_meta()
2376 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_enum_check_meta()
2381 btf_verifier_log_type(env, t, "Unexpected size"); in btf_enum_check_meta()
2387 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_enum_check_meta()
2388 btf_verifier_log_type(env, t, "Invalid name"); in btf_enum_check_meta()
2392 btf_verifier_log_type(env, t, NULL); in btf_enum_check_meta()
2396 btf_verifier_log(env, "\tInvalid name_offset:%u", in btf_enum_check_meta()
2404 btf_verifier_log_type(env, t, "Invalid name"); in btf_enum_check_meta()
2409 btf_verifier_log(env, "\t%s val=%d\n", in btf_enum_check_meta()
2417 static void btf_enum_log(struct btf_verifier_env *env, in btf_enum_log() argument
2420 btf_verifier_log(env, "size=%u vlen=%u", t->size, btf_type_vlen(t)); in btf_enum_log()
2452 static s32 btf_func_proto_check_meta(struct btf_verifier_env *env, in btf_func_proto_check_meta() argument
2459 btf_verifier_log_basic(env, t, in btf_func_proto_check_meta()
2466 btf_verifier_log_type(env, t, "Invalid name"); in btf_func_proto_check_meta()
2471 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_func_proto_check_meta()
2475 btf_verifier_log_type(env, t, NULL); in btf_func_proto_check_meta()
2480 static void btf_func_proto_log(struct btf_verifier_env *env, in btf_func_proto_log() argument
2486 btf_verifier_log(env, "return=%u args=(", t->type); in btf_func_proto_log()
2488 btf_verifier_log(env, "void"); in btf_func_proto_log()
2494 btf_verifier_log(env, "vararg"); in btf_func_proto_log()
2498 btf_verifier_log(env, "%u %s", args[0].type, in btf_func_proto_log()
2499 __btf_name_by_offset(env->btf, in btf_func_proto_log()
2502 btf_verifier_log(env, ", %u %s", args[i].type, in btf_func_proto_log()
2503 __btf_name_by_offset(env->btf, in btf_func_proto_log()
2510 btf_verifier_log(env, ", %u %s", last_arg->type, in btf_func_proto_log()
2511 __btf_name_by_offset(env->btf, in btf_func_proto_log()
2514 btf_verifier_log(env, ", vararg"); in btf_func_proto_log()
2518 btf_verifier_log(env, ")"); in btf_func_proto_log()
2539 static s32 btf_func_check_meta(struct btf_verifier_env *env, in btf_func_check_meta() argument
2544 !btf_name_valid_identifier(env->btf, t->name_off)) { in btf_func_check_meta()
2545 btf_verifier_log_type(env, t, "Invalid name"); in btf_func_check_meta()
2550 btf_verifier_log_type(env, t, "vlen != 0"); in btf_func_check_meta()
2555 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_func_check_meta()
2559 btf_verifier_log_type(env, t, NULL); in btf_func_check_meta()
2573 static s32 btf_var_check_meta(struct btf_verifier_env *env, in btf_var_check_meta() argument
2581 btf_verifier_log_basic(env, t, in btf_var_check_meta()
2588 btf_verifier_log_type(env, t, "vlen != 0"); in btf_var_check_meta()
2593 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_var_check_meta()
2598 !__btf_name_valid(env->btf, t->name_off, true)) { in btf_var_check_meta()
2599 btf_verifier_log_type(env, t, "Invalid name"); in btf_var_check_meta()
2605 btf_verifier_log_type(env, t, "Invalid type_id"); in btf_var_check_meta()
2612 btf_verifier_log_type(env, t, "Linkage not supported"); in btf_var_check_meta()
2616 btf_verifier_log_type(env, t, NULL); in btf_var_check_meta()
2621 static void btf_var_log(struct btf_verifier_env *env, const struct btf_type *t) in btf_var_log() argument
2625 btf_verifier_log(env, "type_id=%u linkage=%u", t->type, var->linkage); in btf_var_log()
2637 static s32 btf_datasec_check_meta(struct btf_verifier_env *env, in btf_datasec_check_meta() argument
2647 btf_verifier_log_basic(env, t, in btf_datasec_check_meta()
2654 btf_verifier_log_type(env, t, "vlen == 0"); in btf_datasec_check_meta()
2659 btf_verifier_log_type(env, t, "size == 0"); in btf_datasec_check_meta()
2664 btf_verifier_log_type(env, t, "Invalid btf_info kind_flag"); in btf_datasec_check_meta()
2669 !btf_name_valid_section(env->btf, t->name_off)) { in btf_datasec_check_meta()
2670 btf_verifier_log_type(env, t, "Invalid name"); in btf_datasec_check_meta()
2674 btf_verifier_log_type(env, t, NULL); in btf_datasec_check_meta()
2679 btf_verifier_log_vsi(env, t, vsi, in btf_datasec_check_meta()
2685 btf_verifier_log_vsi(env, t, vsi, in btf_datasec_check_meta()
2691 btf_verifier_log_vsi(env, t, vsi, in btf_datasec_check_meta()
2698 btf_verifier_log_vsi(env, t, vsi, in btf_datasec_check_meta()
2703 btf_verifier_log_vsi(env, t, vsi, NULL); in btf_datasec_check_meta()
2708 btf_verifier_log_type(env, t, "Invalid btf_info size"); in btf_datasec_check_meta()
2715 static int btf_datasec_resolve(struct btf_verifier_env *env, in btf_datasec_resolve() argument
2719 struct btf *btf = env->btf; in btf_datasec_resolve()
2724 const struct btf_type *var_type = btf_type_by_id(env->btf, in btf_datasec_resolve()
2727 btf_verifier_log_vsi(env, v->t, vsi, in btf_datasec_resolve()
2732 if (!env_type_is_resolve_sink(env, var_type) && in btf_datasec_resolve()
2733 !env_type_is_resolved(env, var_type_id)) { in btf_datasec_resolve()
2734 env_stack_set_next_member(env, i + 1); in btf_datasec_resolve()
2735 return env_stack_push(env, var_type, var_type_id); in btf_datasec_resolve()
2740 btf_verifier_log_vsi(env, v->t, vsi, "Invalid type"); in btf_datasec_resolve()
2745 btf_verifier_log_vsi(env, v->t, vsi, "Invalid size"); in btf_datasec_resolve()
2750 env_stack_pop_resolved(env, 0, 0); in btf_datasec_resolve()
2754 static void btf_datasec_log(struct btf_verifier_env *env, in btf_datasec_log() argument
2757 btf_verifier_log(env, "size=%u vlen=%u", t->size, btf_type_vlen(t)); in btf_datasec_log()
2789 static int btf_func_proto_check(struct btf_verifier_env *env, in btf_func_proto_check() argument
2798 btf = env->btf; in btf_func_proto_check()
2808 btf_verifier_log_type(env, t, "Invalid return type"); in btf_func_proto_check()
2813 !env_type_is_resolved(env, ret_type_id)) { in btf_func_proto_check()
2814 err = btf_resolve(env, ret_type, ret_type_id); in btf_func_proto_check()
2821 btf_verifier_log_type(env, t, "Invalid return type"); in btf_func_proto_check()
2832 btf_verifier_log_type(env, t, "Invalid arg#%u", in btf_func_proto_check()
2847 btf_verifier_log_type(env, t, "Invalid arg#%u", i + 1); in btf_func_proto_check()
2855 btf_verifier_log_type(env, t, in btf_func_proto_check()
2862 !env_type_is_resolved(env, arg_type_id)) { in btf_func_proto_check()
2863 err = btf_resolve(env, arg_type, arg_type_id); in btf_func_proto_check()
2869 btf_verifier_log_type(env, t, "Invalid arg#%u", i + 1); in btf_func_proto_check()
2878 static int btf_func_check(struct btf_verifier_env *env, in btf_func_check() argument
2886 btf = env->btf; in btf_func_check()
2890 btf_verifier_log_type(env, t, "Invalid type_id"); in btf_func_check()
2898 btf_verifier_log_type(env, t, "Invalid arg#%u", i + 1); in btf_func_check()
2924 static s32 btf_check_meta(struct btf_verifier_env *env, in btf_check_meta() argument
2932 btf_verifier_log(env, "[%u] meta_left:%u meta_needed:%zu", in btf_check_meta()
2933 env->log_type_id, meta_left, sizeof(*t)); in btf_check_meta()
2939 btf_verifier_log(env, "[%u] Invalid btf_info:%x", in btf_check_meta()
2940 env->log_type_id, t->info); in btf_check_meta()
2946 btf_verifier_log(env, "[%u] Invalid kind:%u", in btf_check_meta()
2947 env->log_type_id, BTF_INFO_KIND(t->info)); in btf_check_meta()
2951 if (!btf_name_offset_valid(env->btf, t->name_off)) { in btf_check_meta()
2952 btf_verifier_log(env, "[%u] Invalid name_offset:%u", in btf_check_meta()
2953 env->log_type_id, t->name_off); in btf_check_meta()
2957 var_meta_size = btf_type_ops(t)->check_meta(env, t, meta_left); in btf_check_meta()
2966 static int btf_check_all_metas(struct btf_verifier_env *env) in btf_check_all_metas() argument
2968 struct btf *btf = env->btf; in btf_check_all_metas()
2976 env->log_type_id = 1; in btf_check_all_metas()
2981 meta_size = btf_check_meta(env, t, end - cur); in btf_check_all_metas()
2985 btf_add_type(env, t); in btf_check_all_metas()
2987 env->log_type_id++; in btf_check_all_metas()
2993 static bool btf_resolve_valid(struct btf_verifier_env *env, in btf_resolve_valid() argument
2997 struct btf *btf = env->btf; in btf_resolve_valid()
2999 if (!env_type_is_resolved(env, type_id)) in btf_resolve_valid()
3030 static int btf_resolve(struct btf_verifier_env *env, in btf_resolve() argument
3033 u32 save_log_type_id = env->log_type_id; in btf_resolve()
3037 env->resolve_mode = RESOLVE_TBD; in btf_resolve()
3038 env_stack_push(env, t, type_id); in btf_resolve()
3039 while (!err && (v = env_stack_peak(env))) { in btf_resolve()
3040 env->log_type_id = v->type_id; in btf_resolve()
3041 err = btf_type_ops(v->t)->resolve(env, v); in btf_resolve()
3044 env->log_type_id = type_id; in btf_resolve()
3046 btf_verifier_log_type(env, t, in btf_resolve()
3050 btf_verifier_log_type(env, t, "Loop detected"); in btf_resolve()
3054 if (!err && !btf_resolve_valid(env, t, type_id)) { in btf_resolve()
3055 btf_verifier_log_type(env, t, "Invalid resolve state"); in btf_resolve()
3059 env->log_type_id = save_log_type_id; in btf_resolve()
3063 static int btf_check_all_types(struct btf_verifier_env *env) in btf_check_all_types() argument
3065 struct btf *btf = env->btf; in btf_check_all_types()
3069 err = env_resolve_init(env); in btf_check_all_types()
3073 env->phase++; in btf_check_all_types()
3077 env->log_type_id = type_id; in btf_check_all_types()
3079 !env_type_is_resolved(env, type_id)) { in btf_check_all_types()
3080 err = btf_resolve(env, t, type_id); in btf_check_all_types()
3086 err = btf_func_proto_check(env, t); in btf_check_all_types()
3092 err = btf_func_check(env, t); in btf_check_all_types()
3101 static int btf_parse_type_sec(struct btf_verifier_env *env) in btf_parse_type_sec() argument
3103 const struct btf_header *hdr = &env->btf->hdr; in btf_parse_type_sec()
3108 btf_verifier_log(env, "Unaligned type_off"); in btf_parse_type_sec()
3113 btf_verifier_log(env, "No type found"); in btf_parse_type_sec()
3117 err = btf_check_all_metas(env); in btf_parse_type_sec()
3121 return btf_check_all_types(env); in btf_parse_type_sec()
3124 static int btf_parse_str_sec(struct btf_verifier_env *env) in btf_parse_str_sec() argument
3127 struct btf *btf = env->btf; in btf_parse_str_sec()
3135 btf_verifier_log(env, "String section is not at the end"); in btf_parse_str_sec()
3141 btf_verifier_log(env, "Invalid string section"); in btf_parse_str_sec()
3163 static int btf_check_sec_info(struct btf_verifier_env *env, in btf_check_sec_info() argument
3171 btf = env->btf; in btf_check_sec_info()
3187 btf_verifier_log(env, "Invalid section offset"); in btf_check_sec_info()
3192 btf_verifier_log(env, "Unsupported section found"); in btf_check_sec_info()
3196 btf_verifier_log(env, "Section overlap found"); in btf_check_sec_info()
3200 btf_verifier_log(env, in btf_check_sec_info()
3209 btf_verifier_log(env, "Unsupported section found"); in btf_check_sec_info()
3216 static int btf_parse_hdr(struct btf_verifier_env *env) in btf_parse_hdr() argument
3223 btf = env->btf; in btf_parse_hdr()
3228 btf_verifier_log(env, "hdr_len not found"); in btf_parse_hdr()
3235 btf_verifier_log(env, "btf_header not found"); in btf_parse_hdr()
3246 btf_verifier_log(env, "Unsupported btf_header"); in btf_parse_hdr()
3257 btf_verifier_log_hdr(env, btf_data_size); in btf_parse_hdr()
3260 btf_verifier_log(env, "Invalid magic"); in btf_parse_hdr()
3265 btf_verifier_log(env, "Unsupported version"); in btf_parse_hdr()
3270 btf_verifier_log(env, "Unsupported flags"); in btf_parse_hdr()
3275 btf_verifier_log(env, "No data"); in btf_parse_hdr()
3279 err = btf_check_sec_info(env, btf_data_size); in btf_parse_hdr()
3289 struct btf_verifier_env *env = NULL; in btf_parse() local
3298 env = kzalloc(sizeof(*env), GFP_KERNEL | __GFP_NOWARN); in btf_parse()
3299 if (!env) in btf_parse()
3302 log = &env->log; in btf_parse()
3324 env->btf = btf; in btf_parse()
3340 err = btf_parse_hdr(env); in btf_parse()
3346 err = btf_parse_str_sec(env); in btf_parse()
3350 err = btf_parse_type_sec(env); in btf_parse()
3359 btf_verifier_env_free(env); in btf_parse()
3364 btf_verifier_env_free(env); in btf_parse()