xref: /linux/kernel/bpf/diagnostics.h (revision d63284e62b3185cafe40d5fab17245ee60b6cffe)
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 enum bpf_diag_mod_reason {
19 	BPF_DIAG_MOD_WRITE,
20 	BPF_DIAG_MOD_SPILL,
21 	BPF_DIAG_MOD_VAR_WRITE,
22 	BPF_DIAG_MOD_REF_RELEASE,
23 	BPF_DIAG_MOD_PKT_DATA_CHANGE,
24 	BPF_DIAG_MOD_NON_OWN_REF,
25 	BPF_DIAG_MOD_CALLER_SAVED,
26 };
27 
28 enum bpf_diag_context_kind {
29 	BPF_DIAG_CONTEXT_NONE,
30 	BPF_DIAG_CONTEXT_RCU,
31 	BPF_DIAG_CONTEXT_PREEMPT,
32 	BPF_DIAG_CONTEXT_IRQ,
33 	BPF_DIAG_CONTEXT_LOCK,
34 };
35 
36 enum bpf_diag_invalid_deref_kind {
37 	BPF_DIAG_DEREF_SCALAR,
38 	BPF_DIAG_DEREF_NULLABLE_PTR,
39 	BPF_DIAG_DEREF_MODIFIED_PTR,
40 	BPF_DIAG_DEREF_INVALID_PTR,
41 };
42 
43 bool bpf_diag_enabled(const struct bpf_verifier_env *env);
44 int bpf_diag_init(struct bpf_verifier_env *env);
45 void bpf_diag_init_frame(struct bpf_verifier_env *env, struct bpf_func_state *state);
46 char *bpf_diag_fmt_buf(struct bpf_verifier_env *env, size_t size);
47 const char *bpf_diag_vfmt(struct bpf_verifier_env *env, const char *fmt, va_list args)
48 	__printf(2, 0);
49 const char *bpf_diag_fmt(struct bpf_verifier_env *env, const char *fmt, ...) __printf(2, 3);
50 const char *bpf_diag_fmt_btf_type(struct bpf_verifier_env *env, const struct btf *btf, u32 type_id);
51 const char *bpf_diag_reg_type_plain(struct bpf_verifier_env *env, enum bpf_reg_type type);
52 u64 bpf_diag_event_log_save(struct bpf_verifier_env *env);
53 void bpf_diag_event_log_restore(struct bpf_verifier_env *env, u64 log_pos);
54 u32 bpf_diag_irq_depth(const struct bpf_verifier_state *state);
55 void bpf_diag_free(struct bpf_verifier_env *env);
56 void bpf_diag_register_type(struct bpf_verifier_env *env, u32 insn_idx, int regno,
57 			    const char *problem, const char *reason, const char *suggestion);
58 void bpf_diag_invalid_deref(struct bpf_verifier_env *env, u32 insn_idx, int regno,
59 			    const char *reg_name, const struct bpf_reg_state *reg,
60 			    enum bpf_diag_invalid_deref_kind kind, s64 offset);
61 void bpf_diag_unreadable_reg(struct bpf_verifier_env *env, u32 insn_idx, int regno);
62 void bpf_diag_stack_arg_uninit(struct bpf_verifier_env *env, u32 insn_idx, int nargs,
63 			       int stack_arg_slot, const char *callee_name,
64 			       const char *arg_name);
65 void bpf_diag_record_branch(struct bpf_verifier_env *env, u32 insn_idx, bool cond_true);
66 void bpf_diag_mod_begin(struct bpf_verifier_env *env, const struct bpf_reg_state *reg,
67 			const struct bpf_reg_state *origin, enum bpf_diag_mod_reason reason);
68 void bpf_diag_mod_end(struct bpf_verifier_env *env);
69 void bpf_diag_record_scrub(struct bpf_verifier_env *env, const struct bpf_reg_state *reg,
70 			   enum bpf_diag_mod_reason reason);
71 void bpf_diag_record_scrub_stack(struct bpf_verifier_env *env,
72 				 const struct bpf_func_state *state, s16 min_off, s16 max_off,
73 				 enum bpf_diag_mod_reason reason);
74 void bpf_diag_record_ref_acquire(struct bpf_verifier_env *env, u32 insn_idx, u32 ref_id);
75 void bpf_diag_record_ref_release(struct bpf_verifier_env *env, u32 insn_idx, u32 ref_id);
76 void bpf_diag_record_context(struct bpf_verifier_env *env, u32 insn_idx,
77 			     enum bpf_diag_context_kind ctx_kind, bool enter, u32 depth);
78 
79 #endif /* __BPF_DIAGNOSTICS_H */
80