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 Workerstatic 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