Lines Matching refs:env

265 	s32 (*check_meta)(struct btf_verifier_env *env,
268 int (*resolve)(struct btf_verifier_env *env,
270 int (*check_member)(struct btf_verifier_env *env,
274 void (*log_details)(struct btf_verifier_env *env,
479 __printf(2, 3) static void btf_verifier_log(struct btf_verifier_env *env, in btf_verifier_log() argument
482 struct bpf_verifier_log *log = &env->log; in btf_verifier_log()
493 __printf(4, 5) static void __btf_verifier_log_type(struct btf_verifier_env *env, in __btf_verifier_log_type() argument
498 struct bpf_verifier_log *log = &env->log; in __btf_verifier_log_type()
500 struct btf *btf = env->btf; in __btf_verifier_log_type()
507 env->log_type_id, in __btf_verifier_log_type()
513 btf_type_ops(t)->log_details(env, t); in __btf_verifier_log_type()
525 #define btf_verifier_log_type(env, t, ...) \ argument
526 __btf_verifier_log_type((env), (t), true, __VA_ARGS__)
527 #define btf_verifier_log_basic(env, t, ...) \ argument
528 __btf_verifier_log_type((env), (t), false, __VA_ARGS__)
531 static void btf_verifier_log_member(struct btf_verifier_env *env, in btf_verifier_log_member() argument
536 struct bpf_verifier_log *log = &env->log; in btf_verifier_log_member()
537 struct btf *btf = env->btf; in btf_verifier_log_member()
549 if (env->phase != CHECK_META) in btf_verifier_log_member()
550 btf_verifier_log_type(env, struct_type, NULL); in btf_verifier_log_member()
566 static void btf_verifier_log_hdr(struct btf_verifier_env *env, in btf_verifier_log_hdr() argument
569 struct bpf_verifier_log *log = &env->log; in btf_verifier_log_hdr()
570 const struct btf *btf = env->btf; in btf_verifier_log_hdr()
588 static int btf_add_type(struct btf_verifier_env *env, struct btf_type *t) in btf_add_type() argument
590 struct btf *btf = env->btf; in btf_add_type()
603 btf_verifier_log(env, "Exceeded max num of types"); in btf_add_type()
692 static int env_resolve_init(struct btf_verifier_env *env) in env_resolve_init() argument
694 struct btf *btf = env->btf; in env_resolve_init()
718 env->visit_states = visit_states; in env_resolve_init()
729 static void btf_verifier_env_free(struct btf_verifier_env *env) in btf_verifier_env_free() argument
731 kvfree(env->visit_states); in btf_verifier_env_free()
732 kfree(env); in btf_verifier_env_free()
735 static bool env_type_is_resolve_sink(const struct btf_verifier_env *env, in env_type_is_resolve_sink() argument
738 switch (env->resolve_mode) { in env_type_is_resolve_sink()
756 static bool env_type_is_resolved(const struct btf_verifier_env *env, in env_type_is_resolved() argument
759 return env->visit_states[type_id] == RESOLVED; in env_type_is_resolved()
762 static int env_stack_push(struct btf_verifier_env *env, in env_stack_push() argument
767 if (env->top_stack == MAX_RESOLVE_DEPTH) in env_stack_push()
770 if (env->visit_states[type_id] != NOT_VISITED) in env_stack_push()
773 env->visit_states[type_id] = VISITED; in env_stack_push()
775 v = &env->stack[env->top_stack++]; in env_stack_push()
780 if (env->resolve_mode == RESOLVE_TBD) { in env_stack_push()
782 env->resolve_mode = RESOLVE_PTR; in env_stack_push()
784 env->resolve_mode = RESOLVE_STRUCT_OR_ARRAY; in env_stack_push()
790 static void env_stack_set_next_member(struct btf_verifier_env *env, in env_stack_set_next_member() argument
793 env->stack[env->top_stack - 1].next_member = next_member; in env_stack_set_next_member()
796 static void env_stack_pop_resolved(struct btf_verifier_env *env, in env_stack_pop_resolved() argument
800 u32 type_id = env->stack[--(env->top_stack)].type_id; in env_stack_pop_resolved()
801 struct btf *btf = env->btf; in env_stack_pop_resolved()
805 env->visit_states[type_id] = RESOLVED; in env_stack_pop_resolved()
808 static const struct resolve_vertex *env_stack_peak(struct btf_verifier_env *env) in env_stack_peak() argument
810 return env->top_stack ? &env->stack[env->top_stack - 1] : NULL; in env_stack_peak()
856 static int btf_df_check_member(struct btf_verifier_env *env, in btf_df_check_member() argument
861 btf_verifier_log_basic(env, struct_type, in btf_df_check_member()
866 static int btf_df_resolve(struct btf_verifier_env *env, in btf_df_resolve() argument
869 btf_verifier_log_basic(env, v->t, "Unsupported resolve"); in btf_df_resolve()
880 static int btf_int_check_member(struct btf_verifier_env *env, in btf_int_check_member() argument
892 btf_verifier_log_member(env, struct_type, member, in btf_int_check_member()
903 btf_verifier_log_member(env, struct_type, member, in btf_int_check_member()
910 btf_verifier_log_member(env, struct_type, member, in btf_int_check_member()
918 static s32 btf_int_check_meta(struct btf_verifier_env *env, in btf_int_check_meta() argument
926 btf_verifier_log_basic(env, t, in btf_int_check_meta()
933 btf_verifier_log_type(env, t, "vlen != 0"); in btf_int_check_meta()
939 btf_verifier_log_basic(env, t, "Invalid int_data:%x", in btf_int_check_meta()
947 btf_verifier_log_type(env, t, "nr_bits exceeds %zu", in btf_int_check_meta()
953 btf_verifier_log_type(env, t, "nr_bits exceeds type_size"); in btf_int_check_meta()
968 btf_verifier_log_type(env, t, "Unsupported encoding"); in btf_int_check_meta()
972 btf_verifier_log_type(env, t, NULL); in btf_int_check_meta()
977 static void btf_int_log(struct btf_verifier_env *env, in btf_int_log() argument
982 btf_verifier_log(env, in btf_int_log()
1081 static int btf_modifier_check_member(struct btf_verifier_env *env, in btf_modifier_check_member() argument
1089 struct btf *btf = env->btf; in btf_modifier_check_member()
1093 btf_verifier_log_member(env, struct_type, member, in btf_modifier_check_member()
1101 return btf_type_ops(resolved_type)->check_member(env, struct_type, in btf_modifier_check_member()
1106 static int btf_ptr_check_member(struct btf_verifier_env *env, in btf_ptr_check_member() argument
1118 btf_verifier_log_member(env, struct_type, member, in btf_ptr_check_member()
1124 btf_verifier_log_member(env, struct_type, member, in btf_ptr_check_member()
1132 static int btf_ref_type_check_meta(struct btf_verifier_env *env, in btf_ref_type_check_meta() argument
1137 btf_verifier_log_type(env, t, "vlen != 0"); in btf_ref_type_check_meta()
1142 btf_verifier_log_type(env, t, "Invalid type_id"); in btf_ref_type_check_meta()
1146 btf_verifier_log_type(env, t, NULL); in btf_ref_type_check_meta()
1151 static int btf_modifier_resolve(struct btf_verifier_env *env, in btf_modifier_resolve() argument
1157 struct btf *btf = env->btf; in btf_modifier_resolve()
1162 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_modifier_resolve()
1170 if (!env_type_is_resolve_sink(env, next_type) && in btf_modifier_resolve()
1171 !env_type_is_resolved(env, next_type_id)) in btf_modifier_resolve()
1172 return env_stack_push(env, next_type, next_type_id); in btf_modifier_resolve()
1182 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_modifier_resolve()
1187 env_stack_pop_resolved(env, next_type_id, next_type_size); in btf_modifier_resolve()
1192 static int btf_ptr_resolve(struct btf_verifier_env *env, in btf_ptr_resolve() argument
1198 struct btf *btf = env->btf; in btf_ptr_resolve()
1203 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_ptr_resolve()
1211 if (!env_type_is_resolve_sink(env, next_type) && in btf_ptr_resolve()
1212 !env_type_is_resolved(env, next_type_id)) in btf_ptr_resolve()
1213 return env_stack_push(env, next_type, next_type_id); in btf_ptr_resolve()
1231 !env_type_is_resolve_sink(env, resolved_type) && in btf_ptr_resolve()
1232 !env_type_is_resolved(env, resolved_type_id)) in btf_ptr_resolve()
1233 return env_stack_push(env, resolved_type, in btf_ptr_resolve()
1239 btf_verifier_log_type(env, v->t, "Invalid type_id"); in btf_ptr_resolve()
1244 env_stack_pop_resolved(env, next_type_id, 0); in btf_ptr_resolve()
1267 static void btf_ref_type_log(struct btf_verifier_env *env, in btf_ref_type_log() argument
1270 btf_verifier_log(env, "type_id=%u", t->type); in btf_ref_type_log()
1289 static s32 btf_fwd_check_meta(struct btf_verifier_env *env, in btf_fwd_check_meta() argument
1294 btf_verifier_log_type(env, t, "vlen != 0"); in btf_fwd_check_meta()
1299 btf_verifier_log_type(env, t, "type != 0"); in btf_fwd_check_meta()
1303 btf_verifier_log_type(env, t, NULL); in btf_fwd_check_meta()
1316 static int btf_array_check_member(struct btf_verifier_env *env, in btf_array_check_member() argument
1324 struct btf *btf = env->btf; in btf_array_check_member()
1327 btf_verifier_log_member(env, struct_type, member, in btf_array_check_member()
1337 btf_verifier_log_member(env, struct_type, member, in btf_array_check_member()
1345 static s32 btf_array_check_meta(struct btf_verifier_env *env, in btf_array_check_meta() argument
1353 btf_verifier_log_basic(env, t, in btf_array_check_meta()
1360 btf_verifier_log_type(env, t, "vlen != 0"); in btf_array_check_meta()
1365 btf_verifier_log_type(env, t, "size != 0"); in btf_array_check_meta()
1373 btf_verifier_log_type(env, t, "Invalid elem"); in btf_array_check_meta()
1378 btf_verifier_log_type(env, t, "Invalid index"); in btf_array_check_meta()
1382 btf_verifier_log_type(env, t, NULL); in btf_array_check_meta()
1387 static int btf_array_resolve(struct btf_verifier_env *env, in btf_array_resolve() argument
1393 struct btf *btf = env->btf; in btf_array_resolve()
1400 btf_verifier_log_type(env, v->t, "Invalid index"); in btf_array_resolve()
1404 if (!env_type_is_resolve_sink(env, index_type) && in btf_array_resolve()
1405 !env_type_is_resolved(env, index_type_id)) in btf_array_resolve()
1406 return env_stack_push(env, index_type, index_type_id); in btf_array_resolve()
1411 btf_verifier_log_type(env, v->t, "Invalid index"); in btf_array_resolve()
1419 btf_verifier_log_type(env, v->t, in btf_array_resolve()
1424 if (!env_type_is_resolve_sink(env, elem_type) && in btf_array_resolve()
1425 !env_type_is_resolved(env, elem_type_id)) in btf_array_resolve()
1426 return env_stack_push(env, elem_type, elem_type_id); in btf_array_resolve()
1430 btf_verifier_log_type(env, v->t, "Invalid elem"); in btf_array_resolve()
1435 btf_verifier_log_type(env, v->t, "Invalid array of int"); in btf_array_resolve()
1440 btf_verifier_log_type(env, v->t, in btf_array_resolve()
1445 env_stack_pop_resolved(env, elem_type_id, elem_size * array->nelems); in btf_array_resolve()
1450 static void btf_array_log(struct btf_verifier_env *env, in btf_array_log() argument
1455 btf_verifier_log(env, "type_id=%u index_type_id=%u nr_elems=%u", in btf_array_log()
1491 static int btf_struct_check_member(struct btf_verifier_env *env, in btf_struct_check_member() argument
1500 btf_verifier_log_member(env, struct_type, member, in btf_struct_check_member()
1508 btf_verifier_log_member(env, struct_type, member, in btf_struct_check_member()
1516 static s32 btf_struct_check_meta(struct btf_verifier_env *env, in btf_struct_check_meta() argument
1523 struct btf *btf = env->btf; in btf_struct_check_meta()
1529 btf_verifier_log_basic(env, t, in btf_struct_check_meta()
1535 btf_verifier_log_type(env, t, NULL); in btf_struct_check_meta()
1540 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
1548 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
1554 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
1564 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
1570 btf_verifier_log_member(env, t, member, in btf_struct_check_meta()
1575 btf_verifier_log_member(env, t, member, NULL); in btf_struct_check_meta()
1582 static int btf_struct_resolve(struct btf_verifier_env *env, in btf_struct_resolve() argument
1600 if (WARN_ON_ONCE(!env_type_is_resolved(env, in btf_struct_resolve()
1604 last_member_type = btf_type_by_id(env->btf, in btf_struct_resolve()
1606 err = btf_type_ops(last_member_type)->check_member(env, v->t, in btf_struct_resolve()
1615 const struct btf_type *member_type = btf_type_by_id(env->btf, in btf_struct_resolve()
1619 btf_verifier_log_member(env, v->t, member, in btf_struct_resolve()
1624 if (!env_type_is_resolve_sink(env, member_type) && in btf_struct_resolve()
1625 !env_type_is_resolved(env, member_type_id)) { in btf_struct_resolve()
1626 env_stack_set_next_member(env, i + 1); in btf_struct_resolve()
1627 return env_stack_push(env, member_type, member_type_id); in btf_struct_resolve()
1630 err = btf_type_ops(member_type)->check_member(env, v->t, in btf_struct_resolve()
1637 env_stack_pop_resolved(env, 0, 0); in btf_struct_resolve()
1642 static void btf_struct_log(struct btf_verifier_env *env, in btf_struct_log() argument
1645 btf_verifier_log(env, "size=%u vlen=%u", t->size, btf_type_vlen(t)); in btf_struct_log()
1683 static int btf_enum_check_member(struct btf_verifier_env *env, in btf_enum_check_member() argument
1692 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_member()
1700 btf_verifier_log_member(env, struct_type, member, in btf_enum_check_member()
1708 static s32 btf_enum_check_meta(struct btf_verifier_env *env, in btf_enum_check_meta() argument
1713 struct btf *btf = env->btf; in btf_enum_check_meta()
1721 btf_verifier_log_basic(env, t, in btf_enum_check_meta()
1728 btf_verifier_log_type(env, t, "Expected size:%zu", in btf_enum_check_meta()
1733 btf_verifier_log_type(env, t, NULL); in btf_enum_check_meta()
1737 btf_verifier_log(env, "\tInvalid name_offset:%u", in btf_enum_check_meta()
1742 btf_verifier_log(env, "\t%s val=%d\n", in btf_enum_check_meta()
1750 static void btf_enum_log(struct btf_verifier_env *env, in btf_enum_log() argument
1753 btf_verifier_log(env, "size=%u vlen=%u", t->size, btf_type_vlen(t)); in btf_enum_log()
1797 static s32 btf_check_meta(struct btf_verifier_env *env, in btf_check_meta() argument
1805 btf_verifier_log(env, "[%u] meta_left:%u meta_needed:%zu", in btf_check_meta()
1806 env->log_type_id, meta_left, sizeof(*t)); in btf_check_meta()
1812 btf_verifier_log(env, "[%u] Invalid btf_info:%x", in btf_check_meta()
1813 env->log_type_id, t->info); in btf_check_meta()
1819 btf_verifier_log(env, "[%u] Invalid kind:%u", in btf_check_meta()
1820 env->log_type_id, BTF_INFO_KIND(t->info)); in btf_check_meta()
1824 if (!btf_name_offset_valid(env->btf, t->name_off)) { in btf_check_meta()
1825 btf_verifier_log(env, "[%u] Invalid name_offset:%u", in btf_check_meta()
1826 env->log_type_id, t->name_off); in btf_check_meta()
1830 var_meta_size = btf_type_ops(t)->check_meta(env, t, meta_left); in btf_check_meta()
1839 static int btf_check_all_metas(struct btf_verifier_env *env) in btf_check_all_metas() argument
1841 struct btf *btf = env->btf; in btf_check_all_metas()
1849 env->log_type_id = 1; in btf_check_all_metas()
1854 meta_size = btf_check_meta(env, t, end - cur); in btf_check_all_metas()
1858 btf_add_type(env, t); in btf_check_all_metas()
1860 env->log_type_id++; in btf_check_all_metas()
1866 static int btf_resolve(struct btf_verifier_env *env, in btf_resolve() argument
1872 env->resolve_mode = RESOLVE_TBD; in btf_resolve()
1873 env_stack_push(env, t, type_id); in btf_resolve()
1874 while (!err && (v = env_stack_peak(env))) { in btf_resolve()
1875 env->log_type_id = v->type_id; in btf_resolve()
1876 err = btf_type_ops(v->t)->resolve(env, v); in btf_resolve()
1879 env->log_type_id = type_id; in btf_resolve()
1881 btf_verifier_log_type(env, t, in btf_resolve()
1885 btf_verifier_log_type(env, t, "Loop detected"); in btf_resolve()
1890 static bool btf_resolve_valid(struct btf_verifier_env *env, in btf_resolve_valid() argument
1894 struct btf *btf = env->btf; in btf_resolve_valid()
1896 if (!env_type_is_resolved(env, type_id)) in btf_resolve_valid()
1923 static int btf_check_all_types(struct btf_verifier_env *env) in btf_check_all_types() argument
1925 struct btf *btf = env->btf; in btf_check_all_types()
1929 err = env_resolve_init(env); in btf_check_all_types()
1933 env->phase++; in btf_check_all_types()
1937 env->log_type_id = type_id; in btf_check_all_types()
1939 !env_type_is_resolved(env, type_id)) { in btf_check_all_types()
1940 err = btf_resolve(env, t, type_id); in btf_check_all_types()
1946 !btf_resolve_valid(env, t, type_id)) { in btf_check_all_types()
1947 btf_verifier_log_type(env, t, "Invalid resolve state"); in btf_check_all_types()
1955 static int btf_parse_type_sec(struct btf_verifier_env *env) in btf_parse_type_sec() argument
1957 const struct btf_header *hdr = &env->btf->hdr; in btf_parse_type_sec()
1962 btf_verifier_log(env, "Unaligned type_off"); in btf_parse_type_sec()
1967 btf_verifier_log(env, "No type found"); in btf_parse_type_sec()
1971 err = btf_check_all_metas(env); in btf_parse_type_sec()
1975 return btf_check_all_types(env); in btf_parse_type_sec()
1978 static int btf_parse_str_sec(struct btf_verifier_env *env) in btf_parse_str_sec() argument
1981 struct btf *btf = env->btf; in btf_parse_str_sec()
1989 btf_verifier_log(env, "String section is not at the end"); in btf_parse_str_sec()
1995 btf_verifier_log(env, "Invalid string section"); in btf_parse_str_sec()
2017 static int btf_check_sec_info(struct btf_verifier_env *env, in btf_check_sec_info() argument
2025 btf = env->btf; in btf_check_sec_info()
2041 btf_verifier_log(env, "Invalid section offset"); in btf_check_sec_info()
2046 btf_verifier_log(env, "Unsupported section found"); in btf_check_sec_info()
2050 btf_verifier_log(env, "Section overlap found"); in btf_check_sec_info()
2054 btf_verifier_log(env, in btf_check_sec_info()
2063 btf_verifier_log(env, "Unsupported section found"); in btf_check_sec_info()
2070 static int btf_parse_hdr(struct btf_verifier_env *env, void __user *btf_data, in btf_parse_hdr() argument
2088 btf = env->btf; in btf_parse_hdr()
2092 btf_verifier_log(env, "hdr_len not found"); in btf_parse_hdr()
2100 btf_verifier_log(env, "btf_header not found"); in btf_parse_hdr()
2107 btf_verifier_log(env, "Unsupported btf_header"); in btf_parse_hdr()
2117 btf_verifier_log_hdr(env, btf_data_size); in btf_parse_hdr()
2120 btf_verifier_log(env, "Invalid magic"); in btf_parse_hdr()
2125 btf_verifier_log(env, "Unsupported version"); in btf_parse_hdr()
2130 btf_verifier_log(env, "Unsupported flags"); in btf_parse_hdr()
2135 btf_verifier_log(env, "No data"); in btf_parse_hdr()
2139 err = btf_check_sec_info(env, btf_data_size); in btf_parse_hdr()
2149 struct btf_verifier_env *env = NULL; in btf_parse() local
2158 env = kzalloc(sizeof(*env), GFP_KERNEL | __GFP_NOWARN); in btf_parse()
2159 if (!env) in btf_parse()
2162 log = &env->log; in btf_parse()
2184 env->btf = btf; in btf_parse()
2186 err = btf_parse_hdr(env, btf_data, btf_data_size); in btf_parse()
2205 err = btf_parse_str_sec(env); in btf_parse()
2209 err = btf_parse_type_sec(env); in btf_parse()
2218 btf_verifier_env_free(env); in btf_parse()
2223 btf_verifier_env_free(env); in btf_parse()