github.com/castai/kvisor@v1.7.1-0.20240516114728-b3572a2607b5/pkg/ebpftracer/c/headers/common/task.h (about) 1 #ifndef __COMMON_TASK_H__ 2 #define __COMMON_TASK_H__ 3 4 #include <vmlinux.h> 5 #include <vmlinux_flavors.h> 6 7 #include <common/arch.h> 8 #include <common/namespaces.h> 9 10 // PROTOTYPES 11 12 statfunc int get_task_flags(struct task_struct *task); 13 statfunc int get_task_syscall_id(struct task_struct *task); 14 statfunc u32 get_task_mnt_ns_id(struct task_struct *task); 15 statfunc u32 get_task_pid_ns_for_children_id(struct task_struct *task); 16 statfunc u32 get_task_pid_ns_id(struct task_struct *task); 17 statfunc u32 get_task_uts_ns_id(struct task_struct *task); 18 statfunc u32 get_task_ipc_ns_id(struct task_struct *task); 19 statfunc u32 get_task_net_ns_id(struct task_struct *task); 20 statfunc u32 get_task_cgroup_ns_id(struct task_struct *task); 21 statfunc u32 get_task_pid_vnr(struct task_struct *task); 22 statfunc u32 get_task_ns_pid(struct task_struct *task); 23 statfunc u32 get_task_ns_tgid(struct task_struct *task); 24 statfunc u32 get_task_ns_ppid(struct task_struct *task); 25 statfunc char *get_task_uts_name(struct task_struct *task); 26 statfunc u32 get_task_ppid(struct task_struct *task); 27 statfunc u64 get_task_start_time(struct task_struct *task); 28 statfunc u32 get_task_host_pid(struct task_struct *task); 29 statfunc u32 get_task_host_tgid(struct task_struct *task); 30 statfunc struct task_struct *get_parent_task(struct task_struct *task); 31 statfunc u32 get_task_exit_code(struct task_struct *task); 32 statfunc int get_task_parent_flags(struct task_struct *task); 33 statfunc const struct cred *get_task_real_cred(struct task_struct *task); 34 35 // FUNCTIONS 36 37 statfunc int get_task_flags(struct task_struct *task) 38 { 39 return BPF_CORE_READ(task, flags); 40 } 41 42 statfunc int get_task_syscall_id(struct task_struct *task) 43 { 44 // There is no originated syscall in kernel thread context 45 if (get_task_flags(task) & PF_KTHREAD) { 46 return NO_SYSCALL; 47 } 48 struct pt_regs *regs = get_task_pt_regs(task); 49 return get_syscall_id_from_regs(regs); 50 } 51 52 statfunc u32 get_task_mnt_ns_id(struct task_struct *task) 53 { 54 return get_mnt_ns_id(BPF_CORE_READ(task, nsproxy)); 55 } 56 57 statfunc u32 get_task_pid_ns_for_children_id(struct task_struct *task) 58 { 59 return get_pid_ns_for_children_id(BPF_CORE_READ(task, nsproxy)); 60 } 61 62 statfunc u32 get_task_pid_ns_id(struct task_struct *task) 63 { 64 unsigned int level = 0; 65 struct pid *pid = NULL; 66 struct pid_namespace *ns = NULL; 67 68 if (bpf_core_type_exists(struct pid_link)) { 69 struct task_struct___older_v50 *t = (void *) task; 70 pid = BPF_CORE_READ(t, pids[PIDTYPE_PID].pid); 71 } else { 72 pid = BPF_CORE_READ(task, thread_pid); 73 } 74 75 level = BPF_CORE_READ(pid, level); 76 ns = BPF_CORE_READ(pid, numbers[level].ns); 77 return BPF_CORE_READ(ns, ns.inum); 78 } 79 80 statfunc u32 get_task_uts_ns_id(struct task_struct *task) 81 { 82 return get_uts_ns_id(BPF_CORE_READ(task, nsproxy)); 83 } 84 85 statfunc u32 get_task_ipc_ns_id(struct task_struct *task) 86 { 87 return get_ipc_ns_id(BPF_CORE_READ(task, nsproxy)); 88 } 89 90 statfunc u32 get_task_net_ns_id(struct task_struct *task) 91 { 92 return get_net_ns_id(BPF_CORE_READ(task, nsproxy)); 93 } 94 95 statfunc u32 get_task_cgroup_ns_id(struct task_struct *task) 96 { 97 return get_cgroup_ns_id(BPF_CORE_READ(task, nsproxy)); 98 } 99 100 statfunc u32 get_task_pid_vnr(struct task_struct *task) 101 { 102 unsigned int level = 0; 103 struct pid *pid = NULL; 104 105 if (bpf_core_type_exists(struct pid_link)) { 106 struct task_struct___older_v50 *t = (void *) task; 107 pid = BPF_CORE_READ(t, pids[PIDTYPE_PID].pid); 108 } else { 109 pid = BPF_CORE_READ(task, thread_pid); 110 } 111 112 level = BPF_CORE_READ(pid, level); 113 114 return BPF_CORE_READ(pid, numbers[level].nr); 115 } 116 117 statfunc u32 get_task_ns_pid(struct task_struct *task) 118 { 119 return get_task_pid_vnr(task); 120 } 121 122 statfunc u32 get_task_ns_tgid(struct task_struct *task) 123 { 124 struct task_struct *group_leader = BPF_CORE_READ(task, group_leader); 125 return get_task_pid_vnr(group_leader); 126 } 127 128 statfunc u32 get_task_ns_ppid(struct task_struct *task) 129 { 130 struct task_struct *real_parent = BPF_CORE_READ(task, real_parent); 131 return get_task_pid_vnr(real_parent); 132 } 133 134 statfunc char *get_task_uts_name(struct task_struct *task) 135 { 136 struct nsproxy *np = BPF_CORE_READ(task, nsproxy); 137 struct uts_namespace *uts_ns = BPF_CORE_READ(np, uts_ns); 138 return BPF_CORE_READ(uts_ns, name.nodename); 139 } 140 141 statfunc u32 get_task_pid(struct task_struct *task) 142 { 143 return BPF_CORE_READ(task, pid); 144 } 145 146 statfunc u32 get_task_ppid(struct task_struct *task) 147 { 148 struct task_struct *parent = BPF_CORE_READ(task, real_parent); 149 return BPF_CORE_READ(parent, tgid); 150 } 151 152 statfunc u64 get_task_start_time(struct task_struct *task) 153 { 154 return BPF_CORE_READ(task, start_time); 155 } 156 157 statfunc u32 get_task_host_pid(struct task_struct *task) 158 { 159 return BPF_CORE_READ(task, pid); 160 } 161 162 statfunc u32 get_task_host_tgid(struct task_struct *task) 163 { 164 return BPF_CORE_READ(task, tgid); 165 } 166 167 statfunc struct task_struct *get_parent_task(struct task_struct *task) 168 { 169 return BPF_CORE_READ(task, real_parent); 170 } 171 172 statfunc struct task_struct *get_leader_task(struct task_struct *task) 173 { 174 return BPF_CORE_READ(task, group_leader); 175 } 176 177 statfunc u32 get_task_exit_code(struct task_struct *task) 178 { 179 return BPF_CORE_READ(task, exit_code); 180 } 181 182 statfunc int get_task_parent_flags(struct task_struct *task) 183 { 184 struct task_struct *parent = BPF_CORE_READ(task, real_parent); 185 return get_task_flags(parent); 186 } 187 188 statfunc const struct cred *get_task_real_cred(struct task_struct *task) 189 { 190 return BPF_CORE_READ(task, real_cred); 191 } 192 193 #endif