函数逻辑报告 |
Source Code:kernel\bpf\verifier.c |
Create Date:2022-07-27 14:21:03 |
| Last Modify:2022-05-19 20:02:10 | Copyright©Brick |
| 首页 | 函数Tree |
| 注解内核,赢得工具 | 下载SCCT | English |
函数名称:bpf_check
函数原型:int bpf_check(struct bpf_prog **prog, union bpf_attr *attr, union bpf_attr __user *uattr)
返回类型:int
参数:
| 类型 | 参数 | 名称 |
|---|---|---|
| struct bpf_prog ** | prog | |
| union bpf_attr * | attr | |
| union bpf_attr __user * | uattr |
| 9677 | start_time等于ktime_get_ns() |
| 9684 | 如果ARRAY_SIZE - get the number of elements in array @arr*@arr: array to be sized(bpf_verifier_ops)恒等于0则返回:负EINVAL |
| 9695 | len等于 Number of filter blocks |
| 9699 | 如果非array of per-insn state 则转到:err_free_env |
| 9701 | 以i小于len循环 original instruction index 等于i |
| 9703 | BPF program being verified 等于prog |
| 9704 | ops等于bpf_verifier_ops[ Type of BPF program ] |
| 9708 | mutex_lock( & bpf_verifier_lock) |
| 9709 | 如果非btf_vmlinux则btf_vmlinux等于btf_parse_vmlinux() |
| 9715 | 如果非is_priv则mutex_lock( & bpf_verifier_lock) |
| 9718 | 如果 verbosity level of verifier 或log_buf或 size of user buffer 则 |
| 9722 | level等于 verbosity level of verifier |
| 9724 | len_total等于 size of user buffer |
| 9728 | 如果len_total小于128或len_total大于UINT_MAX右移2位或非level或非ubuf或level按位与BPF_LOG_MASK的反则转到:err_unlock |
| 9733 | 如果是错误则 |
| 9740 | ret等于check_attach_btf_id(env) |
| 9741 | 如果ret则转到:skip_full_check |
| 9745 | 如果非IS_ENABLED(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'y' or 'm',* 0 otherwise.(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS)则perform strict pointer alignment checks = true |
| 9750 | allow_ptr_leaks等于is_priv |
| 9752 | 如果is_priv则st verifier with different pruning frequency 等于prog_flags按位与The verifier internal test flag. Behavior is undefined |
| 9755 | ret等于look for pseudo eBPF instructions that access map FDs and* replace them with actual map pointers |
| 9756 | 如果ret小于0则转到:skip_full_check |
| 9759 | 如果bpf_prog_is_dev_bound( Auxiliary fields )则 |
| 9761 | 如果ret则转到:skip_full_check |
| 9765 | search pruning optimization 等于kvcalloc(state_htab_size(env), *的长度, GFP_USER) |
| 9769 | 如果非search pruning optimization 则转到:skip_full_check |
| 9772 | ret等于check_subprogs(env) |
| 9773 | 如果ret小于0则转到:skip_full_check |
| 9776 | ret等于check_btf_info(env, attr, uattr) |
| 9777 | 如果ret小于0则转到:skip_full_check |
| 9780 | ret等于-recursive depth-first-search to detect loops in BPF program* loop == back-edge in directed graph |
| 9781 | 如果ret小于0则转到:skip_full_check |
| 9785 | 如果current verifier state 则 |
| 9786 | free_verifier_state(current verifier state , true) |
| 9787 | current verifier state = NULL |
| 9790 | 如果ret恒等于0且bpf_prog_is_dev_bound( Auxiliary fields )则ret等于bpf_prog_offload_finalize(env) |
| 9793 | skip_full_check : |
| 9795 | free_states(env) |
| 9797 | 如果ret恒等于0则ret等于starting from main bpf function walk all instructions of the function* and recursively walk all callees that given function can call |
| 9801 | 如果is_priv则 |
| 9802 | 如果ret恒等于0则opt_hard_wire_dead_code_branches(env) |
| 9804 | 如果ret恒等于0则ret等于opt_remove_dead_code(env) |
| 9806 | 如果ret恒等于0则ret等于opt_remove_nops(env) |
| 9808 | 否则 |
| 9817 | 如果ret恒等于0则ret等于xup insn->imm field of bpf_call instructions* and inline eligible helpers as explicit sequence of BPF instructions* this function is called after eBPF program passed verification |
| 9823 | 如果ret恒等于0且非bpf_prog_is_dev_bound( Auxiliary fields )则 |
| 9824 | ret等于opt_subreg_zext_lo32_rnd_hi32(env, attr) |
| 9829 | 如果ret恒等于0则ret等于fixup_call_args(env) |
| 9832 | al verification time 等于ktime_get_ns()减start_time |
| 9833 | print_verification_stats(env) |
| 9835 | 如果level且bpf_verifier_log_full(log)则ret等于负ENOSPC |
| 9839 | 转到:err_release_maps |
| 9842 | 如果ret恒等于0且umber of used maps 则 |
| 9848 | 如果非used_maps则 |
| 9850 | 转到:err_release_maps |
| 9863 | 如果ret恒等于0则adjust_btf_func(env) |
| 9866 | err_release_maps : |
| 9873 | err_unlock : |
| 9876 | vfree(array of per-insn state ) |
| 9877 | err_free_env : |
| 9879 | 返回:ret |
| 名称 | 描述 |
|---|---|
| bpf_prog_load |
| 源代码转换工具 开放的插件接口 | X |
|---|---|
| 支持:c/c++/esqlc/java Oracle/Informix/Mysql 插件可实现:逻辑报告 代码生成和批量转换代码 |