kprobe_defs.h (191 lines of code) (raw):

/* SPDX-License-Identifier: Apache-2.0 */ /* Copyright (c) 2024 Elastic NV */ #ifndef _KPROBE_DEFS_H #define _KPROBE_DEFS_H #define RPT0(_x) #define RPT1(_x) _x #define RPT2(_x) RPT1(_x) _x #define RPT3(_x) RPT2(_x) _x #define RPT4(_x) RPT3(_x) _x #define RPT5(_x) RPT4(_x) _x #define RPT6(_x) RPT5(_x) _x #define RPT7(_x) RPT6(_x) _x #define RPT8(_x) RPT7(_x) _x #define RPT9(_x) RPT8(_x) _x #define RPT10(_x) RPT9(_x) _x #define RPT(TENS,ONES,X) RPT##TENS(RPT10(X)) RPT##ONES(X) #if defined(__amd64__) #define ARG_0 di #elif defined(__aarch64__) #define ARG_0 x0 #else #error unknown architecture #endif /* ARG_* */ #define S(_a) #_a #define XS(_a) S(_a) #define PWD_K(_t, _o) "task_struct.fs fs_struct.pwd.dentry " XS(RPT(_t, _o, dentry.d_parent)) #define PWD_S(_t, _o) "task_struct.fs fs_struct.pwd.dentry " XS(RPT(_t, _o, dentry.d_parent)) " dentry.d_name.name +0" /* * 16 is sizeof(struct hlist_node), which is in the beginning of struct * pid_link. sizeof(struct pid_link) is 24, 16 for hlist_node + pid pointer. * PIDTYPE_PGID is `1`, this puts us on 16 + (24 * 1) = 40 bytes. */ struct kprobe_arg ka_task_old_pgid = { "pgid", XS(ARG_0), "u32", "task_struct.group_leader ((task_struct.pids+16)+(24*pid_type.PIDTYPE_PGID)) (pid.numbers+0).upid.nr" }; /* 16 + 2*24 = 64 */ struct kprobe_arg ka_task_old_sid = { "sid", XS(ARG_0), "u32", "task_struct.group_leader ((task_struct.pids+16)+(24*pid_type.PIDTYPE_SID)) (pid.numbers+0).upid.nr" }; /* * New structure is just an array of pointers, not a pid_link array like above. * RHEL8 uses the new scheme in task_struct.signal, but has the old value for * PIDTYPE_PGID=1, newer kernels have a PIDTYPE_TGID=1 and PIDTYPE_PGID=2. */ struct kprobe_arg ka_task_new_pgid = { "pgid", XS(ARG_0), "u32", "task_struct.group_leader task_struct.signal (signal_struct.pids+(8*pid_type.PIDTYPE_PGID)) (pid.numbers+0).upid.nr" }; struct kprobe_arg ka_task_new_sid = { "sid", XS(ARG_0), "u32", "task_struct.group_leader task_struct.signal (signal_struct.pids+(8*pid_type.PIDTYPE_SID)) (pid.numbers+0).upid.nr" }; #define TASK_SAMPLE(_r) \ { "cap_inheritable", XS(_r), "u64", "task_struct.cred cred.cap_inheritable" }, \ { "cap_permitted", XS(_r), "u64", "task_struct.cred cred.cap_permitted", }, \ { "cap_effective", XS(_r), "u64", "task_struct.cred cred.cap_effective" }, \ { "cap_bset", XS(_r), "u64", "task_struct.cred cred.cap_bset" }, \ { "cap_ambient", XS(_r), "u64", "task_struct.cred cred.cap_ambient" }, \ { "start_boottime", XS(_r), "u64", "task_struct.start_boottime" }, \ { "tty_addr", XS(_r), "u64", "task_struct.signal signal_struct.tty" }, \ { "root_k", XS(_r), "u64", "task_struct.fs fs_struct.root.dentry" }, \ { "mnt_root_k", XS(_r), "u64", "task_struct.fs fs_struct.pwd.mnt vfsmount.mnt_root" }, \ { "mnt_mountpoint_k", XS(_r), "u64", "task_struct.fs fs_struct.pwd.mnt (mount.mnt_mountpoint-mount.mnt)" }, \ { "pwd_k0", XS(_r), "u64", PWD_K(0, 0) }, \ { "pwd_k1", XS(_r), "u64", PWD_K(0, 1) }, \ { "pwd_k2", XS(_r), "u64", PWD_K(0, 2) }, \ { "pwd_k3", XS(_r), "u64", PWD_K(0, 3) }, \ { "pwd_k4", XS(_r), "u64", PWD_K(0, 4) }, \ { "pwd_k5", XS(_r), "u64", PWD_K(0, 5) }, \ { "pwd_k6", XS(_r), "u64", PWD_K(0, 6) }, \ { "root_s", XS(_r), "string", "task_struct.fs fs_struct.root.dentry dentry.d_name.name +0" }, \ { "mnt_root_s", XS(_r), "string", "task_struct.fs fs_struct.pwd.mnt vfsmount.mnt_root dentry.d_name.name +0" }, \ { "mnt_mountpoint_s", XS(_r), "string", "task_struct.fs fs_struct.pwd.mnt (mount.mnt_mountpoint-mount.mnt) dentry.d_name.name +0" }, \ { "pwd_s0", XS(_r), "string", PWD_S(0, 0) }, \ { "pwd_s1", XS(_r), "string", PWD_S(0, 1) }, \ { "pwd_s2", XS(_r), "string", PWD_S(0, 2) }, \ { "pwd_s3", XS(_r), "string", PWD_S(0, 3) }, \ { "pwd_s4", XS(_r), "string", PWD_S(0, 4) }, \ { "pwd_s5", XS(_r), "string", PWD_S(0, 5) }, \ { "pwd_s6", XS(_r), "string", PWD_S(0, 6) }, \ { "comm", XS(_r), "string", "task_struct.comm" }, \ { "uid", XS(_r), "u32", "task_struct.cred cred.uid" }, \ { "gid", XS(_r), "u32", "task_struct.cred cred.gid" }, \ { "suid", XS(_r), "u32", "task_struct.cred cred.suid" }, \ { "sgid", XS(_r), "u32", "task_struct.cred cred.sgid" }, \ { "euid", XS(_r), "u32", "task_struct.cred cred.euid" }, \ { "egid", XS(_r), "u32", "task_struct.cred cred.egid" }, \ { "pgid", XS(_r), "u32", "KLUDGE - see kprobe_kludge_arg()" }, \ { "sid", XS(_r), "u32", "KLUDGE - see kprobe_kludge_arg()" }, \ { "pid", XS(_r), "u32", "task_struct.tgid" }, \ { "tid", XS(_r), "u32", "task_struct.pid" }, \ { "ppid", XS(_r), "u32", "task_struct.group_leader task_struct.real_parent task_struct.tgid" }, \ { "exit_code", XS(_r), "s32", "task_struct.exit_code" }, \ { "tty_major", XS(_r), "u32", "task_struct.signal signal_struct.tty tty_struct.driver tty_driver.major" }, \ { "tty_minor_start", XS(_r), "u32", "task_struct.signal signal_struct.tty tty_struct.driver tty_driver.minor_start" }, \ { "tty_minor_index", XS(_r), "u32", "task_struct.signal signal_struct.tty tty_struct.index" }, \ { "uts_inonum", XS(_r), "u32", "task_struct.nsproxy nsproxy.uts_ns uts_namespace.proc_inum" }, \ { "ipc_inonum", XS(_r), "u32", "task_struct.nsproxy nsproxy.ipc_ns ipc_namespace.proc_inum" }, \ { "mnt_inonum", XS(_r), "u32", "task_struct.nsproxy nsproxy.mnt_ns mnt_namespace.proc_inum" }, \ { "net_inonum", XS(_r), "u32", "task_struct.nsproxy nsproxy.net_ns net_namespace.proc_inum" } struct kprobe kp_wake_up_new_task = { "wake_up_new_task", WAKE_UP_NEW_TASK_SAMPLE, 0, { TASK_SAMPLE(ARG_0), { NULL, NULL, NULL, NULL }, } }; struct kprobe kp_exit = { "taskstats_exit", EXIT_THREAD_SAMPLE, 0, { TASK_SAMPLE(ARG_0), { NULL, NULL, NULL, NULL }, } }; struct kprobe kp_exec_connector = { "proc_exec_connector", EXEC_CONNECTOR_SAMPLE, 0, { TASK_SAMPLE(ARG_0), { "argc", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +0" }, { "stack_0", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +0" }, { "stack_1", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +8" }, { "stack_2", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +16" }, { "stack_3", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +24" }, { "stack_4", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +32" }, { "stack_5", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +40" }, { "stack_6", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +48" }, { "stack_7", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +56" }, { "stack_8", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +64" }, { "stack_9", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +72" }, { "stack_10", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +80" }, { "stack_11", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +88" }, { "stack_12", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +96" }, { "stack_13", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +104" }, { "stack_14", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +112" }, { "stack_15", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +120" }, { "stack_16", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +128" }, { "stack_17", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +136" }, { "stack_18", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +144" }, { "stack_19", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +152" }, { "stack_20", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +160" }, { "stack_21", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +168" }, { "stack_22", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +176" }, { "stack_23", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +184" }, { "stack_24", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +192" }, { "stack_25", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +200" }, { "stack_26", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +208" }, { "stack_27", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +216" }, { "stack_28", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +224" }, { "stack_29", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +232" }, { "stack_30", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +240" }, { "stack_31", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +248" }, { "stack_32", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +256" }, { "stack_33", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +264" }, { "stack_34", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +272" }, { "stack_35", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +280" }, { "stack_36", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +288" }, { "stack_37", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +296" }, { "stack_38", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +304" }, { "stack_39", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +312" }, { "stack_40", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +320" }, { "stack_41", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +328" }, { "stack_42", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +336" }, { "stack_43", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +344" }, { "stack_44", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +352" }, { "stack_45", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +360" }, { "stack_46", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +368" }, { "stack_47", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +376" }, { "stack_48", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +384" }, { "stack_49", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +400" }, { "stack_50", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +408" }, { "stack_51", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +416" }, { "stack_52", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +424" }, { "stack_53", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +432" }, { "stack_54", XS(ARG_0), "u64", "task_struct.mm mm_struct.(anon).start_stack +8 +440" }, { NULL, NULL, NULL, NULL }, }}; #undef PWD_S #undef PWD_K #undef XS #undef S #undef ARG_0 #undef RPT #undef RPT10 #undef RPT9 #undef RPT8 #undef RPT7 #undef RPT6 #undef RPT5 #undef RPT4 #undef RPT3 #undef RPT2 #undef RPT1 #undef RPT0 struct kprobe *all_kprobes[] = { &kp_wake_up_new_task, &kp_exit, &kp_exec_connector, NULL }; #endif /* _KPROBE_DEFS_H */