Home
last modified time | relevance | path

Searched refs:insn_idx (Results 1 - 25 of 25) sorted by relevance

/kernel/linux/linux-6.6/tools/lib/bpf/
H A Drelo_core.c970 int insn_idx, struct bpf_insn *insn) in bpf_core_poison_insn()
973 prog_name, relo_idx, insn_idx); in bpf_core_poison_insn()
1025 int insn_idx, const struct bpf_core_relo *relo, in bpf_core_patch_insn()
1039 bpf_core_poison_insn(prog_name, relo_idx, insn_idx + 1, insn + 1); in bpf_core_patch_insn()
1040 bpf_core_poison_insn(prog_name, relo_idx, insn_idx, insn); in bpf_core_patch_insn()
1055 insn_idx, insn->imm, (unsigned long long)orig_val, in bpf_core_patch_insn()
1062 prog_name, relo_idx, insn_idx, in bpf_core_patch_insn()
1070 prog_name, relo_idx, insn_idx, insn->off, (unsigned long long)orig_val, in bpf_core_patch_insn()
1076 prog_name, relo_idx, insn_idx, (unsigned long long)new_val); in bpf_core_patch_insn()
1082 prog_name, relo_idx, insn_idx); in bpf_core_patch_insn()
969 bpf_core_poison_insn(const char *prog_name, int relo_idx, int insn_idx, struct bpf_insn *insn) bpf_core_poison_insn() argument
1024 bpf_core_patch_insn(const char *prog_name, struct bpf_insn *insn, int insn_idx, const struct bpf_core_relo *relo, int relo_idx, const struct bpf_core_relo_res *res) bpf_core_patch_insn() argument
[all...]
H A Dbpf_gen_internal.h11 int insn_idx; member
70 bool is_typeless, bool is_ld64, int kind, int insn_idx);
H A Dlibbpf.c339 int insn_idx; member
4050 __u32 insn_idx, const char *sym_name, in bpf_program__record_reloc()
4053 struct bpf_insn *insn = &prog->insns[insn_idx]; in bpf_program__record_reloc()
4063 prog->name, sym_name, insn_idx, insn->code); in bpf_program__record_reloc()
4083 prog->name, i, ext->name, ext->sym_idx, insn_idx); in bpf_program__record_reloc()
4088 reloc_desc->insn_idx = insn_idx; in bpf_program__record_reloc()
4112 reloc_desc->insn_idx = insn_idx; in bpf_program__record_reloc()
4135 reloc_desc->insn_idx in bpf_program__record_reloc()
4048 bpf_program__record_reloc(struct bpf_program *prog, struct reloc_desc *reloc_desc, __u32 insn_idx, const char *sym_name, const Elf64_Sym *sym, const Elf64_Rel *rel) bpf_program__record_reloc() argument
4201 prog_contains_insn(const struct bpf_program *prog, size_t insn_idx) prog_contains_insn() argument
4207 find_prog_by_sec_insn(const struct bpf_object *obj, size_t sec_idx, size_t insn_idx) find_prog_by_sec_insn() argument
4244 __u32 insn_idx; bpf_object__collect_prog_relos() local
5705 record_relo_core(struct bpf_program *prog, const struct bpf_core_relo *core_relo, int insn_idx) record_relo_core() argument
5723 find_relo_core(struct bpf_program *prog, int insn_idx) find_relo_core() argument
5794 int i, err = 0, insn_idx, sec_idx, sec_num; bpf_object__relocate_core() local
5905 poison_map_ldimm64(struct bpf_program *prog, int relo_idx, int insn_idx, struct bpf_insn *insn, int map_idx, const struct bpf_map *map) poison_map_ldimm64() argument
5935 poison_kfunc_call(struct bpf_program *prog, int relo_idx, int insn_idx, struct bpf_insn *insn, int ext_idx, const struct extern_desc *ext) poison_kfunc_call() argument
6198 size_t insn_idx = *(const size_t *)key; cmp_relo_by_insn_idx() local
6206 find_prog_insn_relo(const struct bpf_program *prog, size_t insn_idx) find_prog_insn_relo() argument
6247 size_t sub_insn_idx, insn_idx, new_cnt; bpf_object__reloc_code() local
7121 int insn_idx, err, spec_len; fixup_log_failed_core_relo() local
7157 int insn_idx, map_idx; fixup_log_missing_map_load() local
7190 int insn_idx, ext_idx; fixup_log_missing_kfunc_call() local
9134 unsigned int moff, insn_idx; bpf_object__collect_st_ops_relos() local
[all...]
H A Drelo_core.h90 int insn_idx, const struct bpf_core_relo *relo,
H A Dgen_loader.c563 bool is_typeless, bool is_ld64, int kind, int insn_idx) in bpf_gen__record_extern()
579 relo->insn_idx = insn_idx; in bpf_gen__record_extern()
701 /* store btf_id into insn[insn_idx].imm */ in emit_relo_kfunc_btf()
711 /* jump to insn[insn_idx].off store if fd denotes module BTF */ in emit_relo_kfunc_btf()
717 /* store index into insn[insn_idx].off */ in emit_relo_kfunc_btf()
777 /* store lower half of addr into insn[insn_idx].imm */ in emit_relo_ksym_typeless()
779 /* store upper half of addr into insn[insn_idx + 1].imm */ in emit_relo_ksym_typeless()
828 /* set values for insn[insn_idx].imm, insn[insn_idx in emit_relo_ksym_btf()
562 bpf_gen__record_extern(struct bpf_gen *gen, const char *name, bool is_weak, bool is_typeless, bool is_ld64, int kind, int insn_idx) bpf_gen__record_extern() argument
[all...]
/kernel/linux/linux-5.10/kernel/bpf/
H A Dverifier.c164 /* verifier_state + insn_idx are pushed to stack when branch is encountered */
167 * before processing instruction 'insn_idx'
171 int insn_idx; member
787 static int acquire_reference_state(struct bpf_verifier_env *env, int insn_idx) in acquire_reference_state() argument
798 state->refs[new_ofs].insn_idx = insn_idx; in acquire_reference_state()
944 int *insn_idx, bool pop_log) in pop_stack()
960 if (insn_idx) in pop_stack()
961 *insn_idx = head->insn_idx; in pop_stack()
943 pop_stack(struct bpf_verifier_env *env, int *prev_insn_idx, int *insn_idx, bool pop_log) pop_stack() argument
972 push_stack(struct bpf_verifier_env *env, int insn_idx, int prev_insn_idx, bool speculative) push_stack() argument
2468 check_stack_write_fixed_off(struct bpf_verifier_env *env, struct bpf_func_state *state, int off, int size, int value_regno, int insn_idx) check_stack_write_fixed_off() argument
2607 check_stack_write_var_off(struct bpf_verifier_env *env, struct bpf_func_state *state, int ptr_regno, int off, int size, int value_regno, int insn_idx) check_stack_write_var_off() argument
2967 check_stack_write(struct bpf_verifier_env *env, int ptr_regno, int off, int size, int value_regno, int insn_idx) check_stack_write() argument
3227 check_ctx_access(struct bpf_verifier_env *env, int insn_idx, int off, int size, enum bpf_access_type t, enum bpf_reg_type *reg_type, u32 *btf_id) check_ctx_access() argument
3273 check_sock_access(struct bpf_verifier_env *env, int insn_idx, u32 regno, int off, int size, enum bpf_access_type t) check_sock_access() argument
3971 check_mem_access(struct bpf_verifier_env *env, int insn_idx, u32 regno, int off, int bpf_size, enum bpf_access_type t, int value_regno, bool strict_alignment_once) check_mem_access() argument
4186 check_xadd(struct bpf_verifier_env *env, int insn_idx, struct bpf_insn *insn) check_xadd() argument
5349 check_func_call(struct bpf_verifier_env *env, struct bpf_insn *insn, int *insn_idx) check_func_call() argument
5449 prepare_func_exit(struct bpf_verifier_env *env, int *insn_idx) prepare_func_exit() argument
5513 record_func_map(struct bpf_verifier_env *env, struct bpf_call_arg_meta *meta, int func_id, int insn_idx) record_func_map() argument
5556 record_func_key(struct bpf_verifier_env *env, struct bpf_call_arg_meta *meta, int func_id, int insn_idx) record_func_key() argument
5604 check_helper_call(struct bpf_verifier_env *env, int func_id, int insn_idx) check_helper_call() argument
8214 check_cond_jmp_op(struct bpf_verifier_env *env, struct bpf_insn *insn, int *insn_idx) check_cond_jmp_op() argument
9809 is_state_visited(struct bpf_verifier_env *env, int insn_idx) is_state_visited() argument
[all...]
H A Doffload.c144 int insn_idx, int prev_insn_idx) in bpf_prog_offload_verify_insn()
152 ret = offload->offdev->ops->insn_hook(env, insn_idx, in bpf_prog_offload_verify_insn()
143 bpf_prog_offload_verify_insn(struct bpf_verifier_env *env, int insn_idx, int prev_insn_idx) bpf_prog_offload_verify_insn() argument
/kernel/linux/linux-6.6/kernel/bpf/
H A Dverifier.c169 /* verifier_state + insn_idx are pushed to stack when branch is encountered */
172 * before processing instruction 'insn_idx'
176 int insn_idx; member
194 static int acquire_reference_state(struct bpf_verifier_env *env, int insn_idx);
895 enum bpf_arg_type arg_type, int insn_idx, int clone_ref_obj_id) in mark_stack_slots_dynptr()
940 id = acquire_reference_state(env, insn_idx); in mark_stack_slots_dynptr()
1187 struct bpf_reg_state *reg, int insn_idx, in mark_stack_slots_iter()
1197 id = acquire_reference_state(env, insn_idx); in mark_stack_slots_iter()
1547 verbose(env, "%d:", env->insn_idx); in print_insn_state()
1674 static int acquire_reference_state(struct bpf_verifier_env *env, int insn_idx) in acquire_reference_state() argument
894 mark_stack_slots_dynptr(struct bpf_verifier_env *env, struct bpf_reg_state *reg, enum bpf_arg_type arg_type, int insn_idx, int clone_ref_obj_id) mark_stack_slots_dynptr() argument
1186 mark_stack_slots_iter(struct bpf_verifier_env *env, struct bpf_reg_state *reg, int insn_idx, struct btf *btf, u32 btf_id, int nr_slots) mark_stack_slots_iter() argument
2012 pop_stack(struct bpf_verifier_env *env, int *prev_insn_idx, int *insn_idx, bool pop_log) pop_stack() argument
2041 push_stack(struct bpf_verifier_env *env, int insn_idx, int prev_insn_idx, bool speculative) push_stack() argument
2578 push_async_cb(struct bpf_verifier_env *env, int insn_idx, int prev_insn_idx, int subprog) push_async_cb() argument
3395 is_jmp_point(struct bpf_verifier_env *env, int insn_idx) is_jmp_point() argument
4542 check_stack_write_fixed_off(struct bpf_verifier_env *env, struct bpf_func_state *state, int off, int size, int value_regno, int insn_idx) check_stack_write_fixed_off() argument
4682 check_stack_write_var_off(struct bpf_verifier_env *env, struct bpf_func_state *state, int ptr_regno, int off, int size, int value_regno, int insn_idx) check_stack_write_var_off() argument
5055 check_stack_write(struct bpf_verifier_env *env, int ptr_regno, int off, int size, int value_regno, int insn_idx) check_stack_write() argument
5336 check_map_kptr_access(struct bpf_verifier_env *env, u32 regno, int value_regno, int insn_idx, struct btf_field *kptr_field) check_map_kptr_access() argument
5542 check_ctx_access(struct bpf_verifier_env *env, int insn_idx, int off, int size, enum bpf_access_type t, enum bpf_reg_type *reg_type, struct btf **btf, u32 *btf_id) check_ctx_access() argument
5590 check_sock_access(struct bpf_verifier_env *env, int insn_idx, u32 regno, int off, int size, enum bpf_access_type t) check_sock_access() argument
6664 check_mem_access(struct bpf_verifier_env *env, int insn_idx, u32 regno, int off, int bpf_size, enum bpf_access_type t, int value_regno, bool strict_alignment_once, bool is_ldsx) check_mem_access() argument
6900 check_atomic(struct bpf_verifier_env *env, int insn_idx, struct bpf_insn *insn) check_atomic() argument
7578 process_dynptr_func(struct bpf_verifier_env *env, int regno, int insn_idx, enum bpf_arg_type arg_type, int clone_ref_obj_id) process_dynptr_func() argument
7686 process_iter_arg(struct bpf_verifier_env *env, int regno, int insn_idx, struct bpf_kfunc_call_arg_meta *meta) process_iter_arg() argument
7753 find_prev_entry(struct bpf_verifier_env *env, struct bpf_verifier_state *cur, int insn_idx) find_prev_entry() argument
7903 process_iter_next_call(struct bpf_verifier_env *env, int insn_idx, struct bpf_kfunc_call_arg_meta *meta) process_iter_next_call() argument
8426 check_func_arg(struct bpf_verifier_env *env, u32 arg, struct bpf_call_arg_meta *meta, const struct bpf_func_proto *fn, int insn_idx) check_func_arg() argument
9240 push_callback_call(struct bpf_verifier_env *env, struct bpf_insn *insn, int insn_idx, int subprog, set_callee_state_fn set_callee_state_cb) push_callback_call() argument
9309 check_func_call(struct bpf_verifier_env *env, struct bpf_insn *insn, int *insn_idx) check_func_call() argument
9394 set_callee_state(struct bpf_verifier_env *env, struct bpf_func_state *caller, struct bpf_func_state *callee, int insn_idx) set_callee_state() argument
9408 set_map_elem_callback_state(struct bpf_verifier_env *env, struct bpf_func_state *caller, struct bpf_func_state *callee, int insn_idx) set_map_elem_callback_state() argument
9438 set_loop_callback_state(struct bpf_verifier_env *env, struct bpf_func_state *caller, struct bpf_func_state *callee, int insn_idx) set_loop_callback_state() argument
9460 set_timer_callback_state(struct bpf_verifier_env *env, struct bpf_func_state *caller, struct bpf_func_state *callee, int insn_idx) set_timer_callback_state() argument
9490 set_find_vma_callback_state(struct bpf_verifier_env *env, struct bpf_func_state *caller, struct bpf_func_state *callee, int insn_idx) set_find_vma_callback_state() argument
9518 set_user_ringbuf_callback_state(struct bpf_verifier_env *env, struct bpf_func_state *caller, struct bpf_func_state *callee, int insn_idx) set_user_ringbuf_callback_state() argument
9541 set_rbtree_add_callback_state(struct bpf_verifier_env *env, struct bpf_func_state *caller, struct bpf_func_state *callee, int insn_idx) set_rbtree_add_callback_state() argument
9598 prepare_func_exit(struct bpf_verifier_env *env, int *insn_idx) prepare_func_exit() argument
9737 record_func_map(struct bpf_verifier_env *env, struct bpf_call_arg_meta *meta, int func_id, int insn_idx) record_func_map() argument
9783 record_func_key(struct bpf_verifier_env *env, struct bpf_call_arg_meta *meta, int func_id, int insn_idx) record_func_key() argument
9941 int insn_idx = *insn_idx_p; check_helper_call() local
11251 check_kfunc_args(struct bpf_verifier_env *env, struct bpf_kfunc_call_arg_meta *meta, int insn_idx) check_kfunc_args() argument
11713 int err, insn_idx = *insn_idx_p; check_kfunc_call() local
14457 check_cond_jmp_op(struct bpf_verifier_env *env, struct bpf_insn *insn, int *insn_idx) check_cond_jmp_op() argument
15116 is_prune_point(struct bpf_verifier_env *env, int insn_idx) is_prune_point() argument
15126 is_force_checkpoint(struct bpf_verifier_env *env, int insn_idx) is_force_checkpoint() argument
15136 calls_callback(struct bpf_verifier_env *env, int insn_idx) calls_callback() argument
16467 is_iter_next_insn(struct bpf_verifier_env *env, int insn_idx) is_iter_next_insn() argument
16554 is_state_visited(struct bpf_verifier_env *env, int insn_idx) is_state_visited() argument
18769 fixup_kfunc_call(struct bpf_verifier_env *env, struct bpf_insn *insn, struct bpf_insn *insn_buf, int insn_idx, int *cnt) fixup_kfunc_call() argument
[all...]
H A Doffload.c306 int insn_idx, int prev_insn_idx) in bpf_prog_offload_verify_insn()
314 ret = offload->offdev->ops->insn_hook(env, insn_idx, in bpf_prog_offload_verify_insn()
305 bpf_prog_offload_verify_insn(struct bpf_verifier_env *env, int insn_idx, int prev_insn_idx) bpf_prog_offload_verify_insn() argument
/kernel/linux/linux-5.10/samples/bpf/
H A Dbpf_load.c350 unsigned int insn_idx; in parse_relo_and_apply() local
356 insn_idx = rel.r_offset / sizeof(struct bpf_insn); in parse_relo_and_apply()
360 if (insn[insn_idx].code != (BPF_LD | BPF_IMM | BPF_DW)) { in parse_relo_and_apply()
362 insn_idx, insn[insn_idx].code); in parse_relo_and_apply()
365 insn[insn_idx].src_reg = BPF_PSEUDO_MAP_FD; in parse_relo_and_apply()
375 insn[insn_idx].imm = maps[map_idx].fd; in parse_relo_and_apply()
378 insn_idx); in parse_relo_and_apply()
/kernel/linux/linux-5.10/drivers/net/ethernet/netronome/nfp/bpf/
H A Dverifier.c21 unsigned int insn_idx) in nfp_bpf_goto_meta()
25 backward = meta->n - insn_idx; in nfp_bpf_goto_meta()
26 forward = insn_idx - meta->n; in nfp_bpf_goto_meta()
28 if (min(forward, backward) > nfp_prog->n_insns - insn_idx - 1) { in nfp_bpf_goto_meta()
29 backward = nfp_prog->n_insns - insn_idx - 1; in nfp_bpf_goto_meta()
32 if (min(forward, backward) > insn_idx && backward > insn_idx) { in nfp_bpf_goto_meta()
33 forward = insn_idx; in nfp_bpf_goto_meta()
626 int nfp_verify_insn(struct bpf_verifier_env *env, int insn_idx, in nfp_verify_insn() argument
632 meta = nfp_bpf_goto_meta(nfp_prog, meta, insn_idx); in nfp_verify_insn()
20 nfp_bpf_goto_meta(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta, unsigned int insn_idx) nfp_bpf_goto_meta() argument
[all...]
H A Dmain.h566 int nfp_verify_insn(struct bpf_verifier_env *env, int insn_idx,
587 unsigned int insn_idx);
/kernel/linux/linux-6.6/drivers/net/ethernet/netronome/nfp/bpf/
H A Dverifier.c21 unsigned int insn_idx) in nfp_bpf_goto_meta()
25 backward = meta->n - insn_idx; in nfp_bpf_goto_meta()
26 forward = insn_idx - meta->n; in nfp_bpf_goto_meta()
28 if (min(forward, backward) > nfp_prog->n_insns - insn_idx - 1) { in nfp_bpf_goto_meta()
29 backward = nfp_prog->n_insns - insn_idx - 1; in nfp_bpf_goto_meta()
32 if (min(forward, backward) > insn_idx && backward > insn_idx) { in nfp_bpf_goto_meta()
33 forward = insn_idx; in nfp_bpf_goto_meta()
631 int nfp_verify_insn(struct bpf_verifier_env *env, int insn_idx, in nfp_verify_insn() argument
637 meta = nfp_bpf_goto_meta(nfp_prog, meta, insn_idx); in nfp_verify_insn()
20 nfp_bpf_goto_meta(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta, unsigned int insn_idx) nfp_bpf_goto_meta() argument
[all...]
H A Dmain.h566 int nfp_verify_insn(struct bpf_verifier_env *env, int insn_idx,
587 unsigned int insn_idx);
/kernel/linux/linux-5.10/include/linux/
H A Dbpf_verifier.h145 /* Tracks subreg definition. The stored value is the insn_idx of the
177 int insn_idx; member
267 u32 insn_idx; member
416 u32 insn_idx; member
492 int insn_idx, int prev_insn_idx);
H A Dbpf.h530 int insn_idx, int prev_insn_idx);
831 u32 insn_idx; member
/kernel/linux/linux-5.10/tools/lib/bpf/
H A Dlibbpf.c193 int insn_idx; member
3337 __u32 insn_idx, const char *sym_name, in bpf_program__record_reloc()
3340 struct bpf_insn *insn = &prog->insns[insn_idx]; in bpf_program__record_reloc()
3369 reloc_desc->insn_idx = insn_idx; in bpf_program__record_reloc()
3376 prog->name, sym_name, insn_idx, insn->code); in bpf_program__record_reloc()
3396 prog->name, i, ext->name, ext->sym_idx, insn_idx); in bpf_program__record_reloc()
3398 reloc_desc->insn_idx = insn_idx; in bpf_program__record_reloc()
3427 map->sec_offset, insn_idx); in bpf_program__record_reloc()
3335 bpf_program__record_reloc(struct bpf_program *prog, struct reloc_desc *reloc_desc, __u32 insn_idx, const char *sym_name, const GElf_Sym *sym, const GElf_Rel *rel) bpf_program__record_reloc() argument
3470 prog_contains_insn(const struct bpf_program *prog, size_t insn_idx) prog_contains_insn() argument
3476 find_prog_by_sec_insn(const struct bpf_object *obj, size_t sec_idx, size_t insn_idx) find_prog_by_sec_insn() argument
3514 __u32 insn_idx; bpf_object__collect_prog_relos() local
5411 bpf_core_poison_insn(struct bpf_program *prog, int relo_idx, int insn_idx, struct bpf_insn *insn) bpf_core_poison_insn() argument
5478 int insn_idx; bpf_core_patch_insn() local
5904 int i, err = 0, insn_idx, sec_idx; bpf_object__relocate_core() local
6198 size_t insn_idx = *(const size_t *)key; cmp_relo_by_insn_idx() local
6206 find_prog_insn_relo(const struct bpf_program *prog, size_t insn_idx) find_prog_insn_relo() argument
6216 size_t sub_insn_idx, insn_idx, new_cnt; bpf_object__reloc_code() local
8567 unsigned int moff, insn_idx; bpf_object__collect_st_ops_relos() local
[all...]
/kernel/linux/linux-6.6/include/linux/
H A Dbpf_verifier.h220 /* Tracks subreg definition. The stored value is the insn_idx of the
264 int insn_idx; member
380 u32 insn_idx; member
606 u32 insn_idx; member
702 int insn_idx, int prev_insn_idx);
H A Dbpf.h959 int insn_idx, int prev_insn_idx);
1372 u32 insn_idx; member
/kernel/linux/linux-6.6/arch/powerpc/net/
H A Dbpf_jit_comp.c234 int insn_idx, int jmp_off, int dst_reg) in bpf_add_extable_entry()
249 pc = (unsigned long)&image[insn_idx]; in bpf_add_extable_entry()
233 bpf_add_extable_entry(struct bpf_prog *fp, u32 *image, int pass, struct codegen_context *ctx, int insn_idx, int jmp_off, int dst_reg) bpf_add_extable_entry() argument
H A Dbpf_jit.h181 int insn_idx, int jmp_off, int dst_reg);
H A Dbpf_jit_comp32.c981 int insn_idx = ctx->idx - 1; in bpf_jit_build_body() local
996 insn_idx -= 1; in bpf_jit_build_body()
1000 ret = bpf_add_extable_entry(fp, image, pass, ctx, insn_idx, in bpf_jit_build_body()
/kernel/linux/linux-5.10/drivers/net/netdevsim/
H A Dbpf.c63 nsim_bpf_verify_insn(struct bpf_verifier_env *env, int insn_idx, int prev_insn) in nsim_bpf_verify_insn() argument
69 if (state->nsim_dev->bpf_bind_verifier_delay && !insn_idx) in nsim_bpf_verify_insn()
72 if (insn_idx == env->prog->len - 1) { in nsim_bpf_verify_insn()
/kernel/linux/linux-6.6/drivers/net/netdevsim/
H A Dbpf.c63 nsim_bpf_verify_insn(struct bpf_verifier_env *env, int insn_idx, int prev_insn) in nsim_bpf_verify_insn() argument
69 if (state->nsim_dev->bpf_bind_verifier_delay && !insn_idx) in nsim_bpf_verify_insn()
72 if (insn_idx == env->prog->len - 1) { in nsim_bpf_verify_insn()
/kernel/linux/linux-6.6/tools/testing/selftests/bpf/
H A Dtest_verifier.c83 int insn_idx; member
999 prog[fixup_kfunc_btf_id->insn_idx].off = 1; in fixup_prog_kfuncs()
1004 prog[fixup_kfunc_btf_id->insn_idx].imm = btf_id; in fixup_prog_kfuncs()

Completed in 66 milliseconds