1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* Copyright (c) 2026 Meta Platforms, Inc. and affiliates. */ 3 4 #ifndef __BPF_DIAGNOSTICS_H 5 #define __BPF_DIAGNOSTICS_H 6 7 #include <linux/bpf.h> 8 #include <linux/compiler_attributes.h> 9 #include <linux/stdarg.h> 10 #include <linux/types.h> 11 12 struct bpf_func_state; 13 struct bpf_reg_state; 14 struct bpf_verifier_env; 15 struct bpf_verifier_state; 16 struct btf; 17 18 const char *bpf_diag_fmt_s64_sum(struct bpf_verifier_env *env, s64 value, int addend); 19 enum bpf_diag_mod_reason { 20 BPF_DIAG_MOD_WRITE, 21 BPF_DIAG_MOD_SPILL, 22 BPF_DIAG_MOD_VAR_WRITE, 23 BPF_DIAG_MOD_REF_RELEASE, 24 BPF_DIAG_MOD_PKT_DATA_CHANGE, 25 BPF_DIAG_MOD_NON_OWN_REF, 26 BPF_DIAG_MOD_CALLER_SAVED, 27 }; 28 29 enum bpf_diag_context_kind { 30 BPF_DIAG_CONTEXT_NONE, 31 BPF_DIAG_CONTEXT_RCU, 32 BPF_DIAG_CONTEXT_PREEMPT, 33 BPF_DIAG_CONTEXT_IRQ, 34 BPF_DIAG_CONTEXT_LOCK, 35 }; 36 37 enum bpf_diag_invalid_deref_kind { 38 BPF_DIAG_DEREF_SCALAR, 39 BPF_DIAG_DEREF_NULLABLE_PTR, 40 BPF_DIAG_DEREF_MODIFIED_PTR, 41 BPF_DIAG_DEREF_INVALID_PTR, 42 }; 43 44 bool bpf_diag_enabled(const struct bpf_verifier_env *env); 45 int bpf_diag_init(struct bpf_verifier_env *env); 46 void bpf_diag_init_frame(struct bpf_verifier_env *env, struct bpf_func_state *state); 47 char *bpf_diag_fmt_buf(struct bpf_verifier_env *env, size_t size); 48 const char *bpf_diag_vfmt(struct bpf_verifier_env *env, const char *fmt, va_list args) 49 __printf(2, 0); 50 const char *bpf_diag_fmt(struct bpf_verifier_env *env, const char *fmt, ...) __printf(2, 3); 51 const char *bpf_diag_fmt_btf_type(struct bpf_verifier_env *env, const struct btf *btf, u32 type_id); 52 const char *bpf_diag_reg_type_plain(struct bpf_verifier_env *env, enum bpf_reg_type type); 53 u64 bpf_diag_event_log_save(struct bpf_verifier_env *env); 54 void bpf_diag_event_log_restore(struct bpf_verifier_env *env, u64 log_pos); 55 u32 bpf_diag_irq_depth(const struct bpf_verifier_state *state); 56 void bpf_diag_free(struct bpf_verifier_env *env); 57 void bpf_diag_register_type(struct bpf_verifier_env *env, u32 insn_idx, int regno, 58 const char *problem, const char *reason, const char *suggestion); 59 void bpf_diag_invalid_deref(struct bpf_verifier_env *env, u32 insn_idx, int regno, 60 const char *reg_name, const struct bpf_reg_state *reg, 61 enum bpf_diag_invalid_deref_kind kind, s64 offset); 62 void bpf_diag_unreadable_reg(struct bpf_verifier_env *env, u32 insn_idx, int regno); 63 void bpf_diag_stack_arg_uninit(struct bpf_verifier_env *env, u32 insn_idx, int nargs, 64 int stack_arg_slot, const char *callee_name, 65 const char *arg_name); 66 void bpf_diag_memory(struct bpf_verifier_env *env, u32 insn_idx, const char *problem, 67 const char *reason, const char *suggestion); 68 void bpf_diag_mem_bounds(struct bpf_verifier_env *env, u32 insn_idx, int regno, 69 const char *reg_name, const char *type_name, const char *proof, 70 int off, int size, u32 mem_size, const struct bpf_reg_state *reg); 71 void bpf_diag_record_branch(struct bpf_verifier_env *env, u32 insn_idx, bool cond_true); 72 void bpf_diag_mod_begin(struct bpf_verifier_env *env, const struct bpf_reg_state *reg, 73 const struct bpf_reg_state *origin, enum bpf_diag_mod_reason reason); 74 void bpf_diag_mod_end(struct bpf_verifier_env *env); 75 void bpf_diag_record_scrub(struct bpf_verifier_env *env, const struct bpf_reg_state *reg, 76 enum bpf_diag_mod_reason reason); 77 void bpf_diag_record_scrub_stack(struct bpf_verifier_env *env, 78 const struct bpf_func_state *state, s16 min_off, s16 max_off, 79 enum bpf_diag_mod_reason reason); 80 void bpf_diag_record_ref_acquire(struct bpf_verifier_env *env, u32 insn_idx, u32 ref_id); 81 void bpf_diag_record_ref_release(struct bpf_verifier_env *env, u32 insn_idx, u32 ref_id); 82 void bpf_diag_record_context(struct bpf_verifier_env *env, u32 insn_idx, 83 enum bpf_diag_context_kind ctx_kind, bool enter, u32 depth); 84 85 #endif /* __BPF_DIAGNOSTICS_H */ 86