xref: /aosp_15_r20/external/bcc/libbpf-tools/ksnoop.h (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
1*387f9dfdSAndroid Build Coastguard Worker /* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
2*387f9dfdSAndroid Build Coastguard Worker /* Copyright (c) 2021, Oracle and/or its affiliates. */
3*387f9dfdSAndroid Build Coastguard Worker 
4*387f9dfdSAndroid Build Coastguard Worker /* maximum number of different functions we can trace at once */
5*387f9dfdSAndroid Build Coastguard Worker #define MAX_FUNC_TRACES			64
6*387f9dfdSAndroid Build Coastguard Worker 
7*387f9dfdSAndroid Build Coastguard Worker enum arg {
8*387f9dfdSAndroid Build Coastguard Worker 	KSNOOP_ARG1,
9*387f9dfdSAndroid Build Coastguard Worker 	KSNOOP_ARG2,
10*387f9dfdSAndroid Build Coastguard Worker 	KSNOOP_ARG3,
11*387f9dfdSAndroid Build Coastguard Worker 	KSNOOP_ARG4,
12*387f9dfdSAndroid Build Coastguard Worker 	KSNOOP_ARG5,
13*387f9dfdSAndroid Build Coastguard Worker 	KSNOOP_RETURN
14*387f9dfdSAndroid Build Coastguard Worker };
15*387f9dfdSAndroid Build Coastguard Worker 
16*387f9dfdSAndroid Build Coastguard Worker /* we choose "return" as the name for the returned value because as
17*387f9dfdSAndroid Build Coastguard Worker  * a C keyword it can't clash with a function entry parameter.
18*387f9dfdSAndroid Build Coastguard Worker  */
19*387f9dfdSAndroid Build Coastguard Worker #define KSNOOP_RETURN_NAME		"return"
20*387f9dfdSAndroid Build Coastguard Worker 
21*387f9dfdSAndroid Build Coastguard Worker /* if we can't get a type id for a type (such as module-specific type)
22*387f9dfdSAndroid Build Coastguard Worker  * mark it as KSNOOP_ID_UNKNOWN since BTF lookup in bpf_snprintf_btf()
23*387f9dfdSAndroid Build Coastguard Worker  * will fail and the data will be simply displayed as a __u64.
24*387f9dfdSAndroid Build Coastguard Worker  */
25*387f9dfdSAndroid Build Coastguard Worker #define KSNOOP_ID_UNKNOWN		0xffffffff
26*387f9dfdSAndroid Build Coastguard Worker 
27*387f9dfdSAndroid Build Coastguard Worker #define MAX_NAME			96
28*387f9dfdSAndroid Build Coastguard Worker #define MAX_STR				256
29*387f9dfdSAndroid Build Coastguard Worker #define MAX_PATH			512
30*387f9dfdSAndroid Build Coastguard Worker #define MAX_VALUES			6
31*387f9dfdSAndroid Build Coastguard Worker #define MAX_ARGS			(MAX_VALUES - 1)
32*387f9dfdSAndroid Build Coastguard Worker #define KSNOOP_F_PTR			0x1	/* value is a pointer */
33*387f9dfdSAndroid Build Coastguard Worker #define KSNOOP_F_MEMBER			0x2	/* member reference */
34*387f9dfdSAndroid Build Coastguard Worker #define KSNOOP_F_ENTRY			0x4
35*387f9dfdSAndroid Build Coastguard Worker #define KSNOOP_F_RETURN			0x8
36*387f9dfdSAndroid Build Coastguard Worker #define KSNOOP_F_CUSTOM			0x10	/* custom trace */
37*387f9dfdSAndroid Build Coastguard Worker #define KSNOOP_F_STASH			0x20	/* store values on entry,
38*387f9dfdSAndroid Build Coastguard Worker 						 * no perf events.
39*387f9dfdSAndroid Build Coastguard Worker 						 */
40*387f9dfdSAndroid Build Coastguard Worker #define KSNOOP_F_STASHED		0x40	/* values stored on entry */
41*387f9dfdSAndroid Build Coastguard Worker 
42*387f9dfdSAndroid Build Coastguard Worker #define KSNOOP_F_PREDICATE_EQ		0x100
43*387f9dfdSAndroid Build Coastguard Worker #define KSNOOP_F_PREDICATE_NOTEQ	0x200
44*387f9dfdSAndroid Build Coastguard Worker #define KSNOOP_F_PREDICATE_GT		0x400
45*387f9dfdSAndroid Build Coastguard Worker #define KSNOOP_F_PREDICATE_LT		0x800
46*387f9dfdSAndroid Build Coastguard Worker 
47*387f9dfdSAndroid Build Coastguard Worker #define KSNOOP_F_PREDICATE_MASK		(KSNOOP_F_PREDICATE_EQ | \
48*387f9dfdSAndroid Build Coastguard Worker 					 KSNOOP_F_PREDICATE_NOTEQ | \
49*387f9dfdSAndroid Build Coastguard Worker 					 KSNOOP_F_PREDICATE_GT | \
50*387f9dfdSAndroid Build Coastguard Worker 					 KSNOOP_F_PREDICATE_LT)
51*387f9dfdSAndroid Build Coastguard Worker 
52*387f9dfdSAndroid Build Coastguard Worker /* for kprobes, entry is function IP + sizeof(kprobe_opcode_t),
53*387f9dfdSAndroid Build Coastguard Worker  * subtract in BPF prog context to get fn address.
54*387f9dfdSAndroid Build Coastguard Worker  */
55*387f9dfdSAndroid Build Coastguard Worker #ifdef __TARGET_ARCH_x86
56*387f9dfdSAndroid Build Coastguard Worker #define KSNOOP_IP_FIX(ip)		(ip - sizeof(kprobe_opcode_t))
57*387f9dfdSAndroid Build Coastguard Worker #else
58*387f9dfdSAndroid Build Coastguard Worker #define KSNOOP_IP_FIX(ip)		ip
59*387f9dfdSAndroid Build Coastguard Worker #endif
60*387f9dfdSAndroid Build Coastguard Worker 
61*387f9dfdSAndroid Build Coastguard Worker struct value {
62*387f9dfdSAndroid Build Coastguard Worker 	char name[MAX_STR];
63*387f9dfdSAndroid Build Coastguard Worker 	enum arg base_arg;
64*387f9dfdSAndroid Build Coastguard Worker 	__u32 offset;
65*387f9dfdSAndroid Build Coastguard Worker 	__u32 size;
66*387f9dfdSAndroid Build Coastguard Worker 	__u64 type_id;
67*387f9dfdSAndroid Build Coastguard Worker 	__u64 flags;
68*387f9dfdSAndroid Build Coastguard Worker 	__u64 predicate_value;
69*387f9dfdSAndroid Build Coastguard Worker };
70*387f9dfdSAndroid Build Coastguard Worker 
71*387f9dfdSAndroid Build Coastguard Worker struct func {
72*387f9dfdSAndroid Build Coastguard Worker 	char name[MAX_NAME];
73*387f9dfdSAndroid Build Coastguard Worker 	char mod[MAX_NAME];
74*387f9dfdSAndroid Build Coastguard Worker 	__s32 id;
75*387f9dfdSAndroid Build Coastguard Worker 	__u8 nr_args;
76*387f9dfdSAndroid Build Coastguard Worker 	__u64 ip;
77*387f9dfdSAndroid Build Coastguard Worker 	struct value args[MAX_VALUES];
78*387f9dfdSAndroid Build Coastguard Worker };
79*387f9dfdSAndroid Build Coastguard Worker 
80*387f9dfdSAndroid Build Coastguard Worker #define MAX_TRACES MAX_VALUES
81*387f9dfdSAndroid Build Coastguard Worker 
82*387f9dfdSAndroid Build Coastguard Worker #define MAX_TRACE_DATA	2048
83*387f9dfdSAndroid Build Coastguard Worker 
84*387f9dfdSAndroid Build Coastguard Worker struct trace_data {
85*387f9dfdSAndroid Build Coastguard Worker 	__u64 raw_value;
86*387f9dfdSAndroid Build Coastguard Worker 	__u32 err_type_id;	/* type id we can't dereference */
87*387f9dfdSAndroid Build Coastguard Worker 	int err;
88*387f9dfdSAndroid Build Coastguard Worker 	__u32 buf_offset;
89*387f9dfdSAndroid Build Coastguard Worker 	__u16 buf_len;
90*387f9dfdSAndroid Build Coastguard Worker };
91*387f9dfdSAndroid Build Coastguard Worker 
92*387f9dfdSAndroid Build Coastguard Worker #define MAX_TRACE_BUF	(MAX_TRACES * MAX_TRACE_DATA)
93*387f9dfdSAndroid Build Coastguard Worker 
94*387f9dfdSAndroid Build Coastguard Worker struct trace {
95*387f9dfdSAndroid Build Coastguard Worker 	/* initial values are readonly in tracing context */
96*387f9dfdSAndroid Build Coastguard Worker 	struct btf *btf;
97*387f9dfdSAndroid Build Coastguard Worker 	struct btf_dump *dump;
98*387f9dfdSAndroid Build Coastguard Worker 	struct func func;
99*387f9dfdSAndroid Build Coastguard Worker 	__u8 nr_traces;
100*387f9dfdSAndroid Build Coastguard Worker 	__u32 filter_pid;
101*387f9dfdSAndroid Build Coastguard Worker 	__u64 prev_ip; /* these are used in stack-mode tracing */
102*387f9dfdSAndroid Build Coastguard Worker 	__u64 next_ip;
103*387f9dfdSAndroid Build Coastguard Worker 	struct value traces[MAX_TRACES];
104*387f9dfdSAndroid Build Coastguard Worker 	__u64 flags;
105*387f9dfdSAndroid Build Coastguard Worker 	/* values below this point are set or modified in tracing context */
106*387f9dfdSAndroid Build Coastguard Worker 	__u64 task;
107*387f9dfdSAndroid Build Coastguard Worker 	__u32 pid;
108*387f9dfdSAndroid Build Coastguard Worker 	__u32 cpu;
109*387f9dfdSAndroid Build Coastguard Worker 	__u64 time;
110*387f9dfdSAndroid Build Coastguard Worker 	__u64 data_flags;
111*387f9dfdSAndroid Build Coastguard Worker 	struct trace_data trace_data[MAX_TRACES];
112*387f9dfdSAndroid Build Coastguard Worker 	__u16 buf_len;
113*387f9dfdSAndroid Build Coastguard Worker 	char buf[MAX_TRACE_BUF];
114*387f9dfdSAndroid Build Coastguard Worker 	char buf_end[0];
115*387f9dfdSAndroid Build Coastguard Worker 	struct bpf_link *links[2];
116*387f9dfdSAndroid Build Coastguard Worker };
117*387f9dfdSAndroid Build Coastguard Worker 
118*387f9dfdSAndroid Build Coastguard Worker #define PAGES_DEFAULT	16
119*387f9dfdSAndroid Build Coastguard Worker 
base_arg_is_entry(enum arg base_arg)120*387f9dfdSAndroid Build Coastguard Worker static inline int base_arg_is_entry(enum arg base_arg)
121*387f9dfdSAndroid Build Coastguard Worker {
122*387f9dfdSAndroid Build Coastguard Worker 	return base_arg != KSNOOP_RETURN;
123*387f9dfdSAndroid Build Coastguard Worker }
124