github.com/castai/kvisor@v1.7.1-0.20240516114728-b3572a2607b5/pkg/ebpftracer/c/headers/common/debug.h (about) 1 #ifndef __DEBUG_H__ 2 #define __DEBUG_H__ 3 4 #define DEBUG_NAME_LEN 16 5 #define TASK_COMM_LEN 16 6 7 struct debug_event_t { 8 u32 pid; 9 u32 tid; 10 u64 ts; 11 u64 cgroup_id; 12 char name[DEBUG_NAME_LEN]; 13 char task[TASK_COMM_LEN]; 14 u64 arg1; 15 u64 arg2; 16 u64 arg3; 17 u64 arg4; 18 // For sock. 19 // u64 sock_addr; 20 // struct tuple_t tuple; 21 }; 22 23 struct { 24 __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY); 25 __uint(key_size, sizeof(u32)); 26 __uint(value_size, sizeof(u32)); 27 } debug_events SEC(".maps"); 28 29 static __always_inline void fill_debug_event_name(struct debug_event_t *e, const char *name) { 30 for (int i = 0; i < DEBUG_NAME_LEN; i++) { 31 e->name[i] = name[i]; 32 } 33 } 34 35 static __always_inline void init_debug_event(const char *name, struct debug_event_t *event) { 36 event->ts = bpf_ktime_get_ns(); 37 u64 pid_tgid = bpf_get_current_pid_tgid(); 38 u32 pid = pid_tgid >> 32; 39 u32 tid = pid_tgid; 40 event->pid = pid; 41 event->tid = tid; 42 event->cgroup_id = bpf_get_current_cgroup_id(); 43 bpf_get_current_comm(&event->task, sizeof(event->task)); 44 fill_debug_event_name(event, name); 45 } 46 47 static __always_inline void output_debug(void *ctx, const char *name) { 48 struct debug_event_t event = {0}; 49 init_debug_event(name, &event); 50 51 bpf_perf_event_output(ctx, &debug_events, BPF_F_CURRENT_CPU, &event, sizeof(event)); 52 } 53 54 static __always_inline void output_debug1(void *ctx, const char *name, u64 arg1) { 55 struct debug_event_t event = {0}; 56 init_debug_event(name, &event); 57 event.arg1 = arg1; 58 59 bpf_perf_event_output(ctx, &debug_events, BPF_F_CURRENT_CPU, &event, sizeof(event)); 60 } 61 62 static __always_inline void output_debug2(void *ctx, const char *name, u64 arg1, u64 arg2) { 63 struct debug_event_t event = {0}; 64 init_debug_event(name, &event); 65 event.arg1 = arg1; 66 event.arg2 = arg2; 67 68 bpf_perf_event_output(ctx, &debug_events, BPF_F_CURRENT_CPU, &event, sizeof(event)); 69 } 70 71 static __always_inline void output_debug3(void *ctx, const char *name, u64 arg1, u64 arg2, u64 arg3) { 72 struct debug_event_t event = {0}; 73 init_debug_event(name, &event); 74 event.arg1 = arg1; 75 event.arg2 = arg2; 76 event.arg3 = arg3; 77 78 bpf_perf_event_output(ctx, &debug_events, BPF_F_CURRENT_CPU, &event, sizeof(event)); 79 } 80 81 static __always_inline void output_debug4(void *ctx, const char *name, u64 arg1, u64 arg2, u64 arg3, u64 arg4) { 82 struct debug_event_t event = {0}; 83 init_debug_event(name, &event); 84 event.arg1 = arg1; 85 event.arg2 = arg2; 86 event.arg3 = arg3; 87 event.arg4 = arg4; 88 89 bpf_perf_event_output(ctx, &debug_events, BPF_F_CURRENT_CPU, &event, sizeof(event)); 90 } 91 // 92 //static __always_inline void output_debug_sock(void *ctx, const char *name, struct sock *sk) { 93 // if (cfg->debug == 0) { 94 // return; 95 // } 96 // 97 // struct debug_event_t event = {0}; 98 // init_debug_event(name, &event); 99 // event.sock_addr = (u64) (void *)sk; 100 // bpf_get_current_comm(&event.task, sizeof(event.task)); 101 // fill_tuple(&event.tuple, sk); 102 // fill_debug_event_name(&event, name); 103 // 104 // bpf_perf_event_output(ctx, &debug_events, BPF_F_CURRENT_CPU, &event, sizeof(event)); 105 //} 106 107 #endif