1*53ee8cc1Swenshuai.xi /* 2*53ee8cc1Swenshuai.xi * cn_proc.h - process events connector 3*53ee8cc1Swenshuai.xi * 4*53ee8cc1Swenshuai.xi * Copyright (C) Matt Helsley, IBM Corp. 2005 5*53ee8cc1Swenshuai.xi * Based on cn_fork.h by Nguyen Anh Quynh and Guillaume Thouvenin 6*53ee8cc1Swenshuai.xi * Copyright (C) 2005 Nguyen Anh Quynh <aquynh@gmail.com> 7*53ee8cc1Swenshuai.xi * Copyright (C) 2005 Guillaume Thouvenin <guillaume.thouvenin@bull.net> 8*53ee8cc1Swenshuai.xi * 9*53ee8cc1Swenshuai.xi * This program is free software; you can redistribute it and/or modify it 10*53ee8cc1Swenshuai.xi * under the terms of version 2.1 of the GNU Lesser General Public License 11*53ee8cc1Swenshuai.xi * as published by the Free Software Foundation. 12*53ee8cc1Swenshuai.xi * 13*53ee8cc1Swenshuai.xi * This program is distributed in the hope that it would be useful, but 14*53ee8cc1Swenshuai.xi * WITHOUT ANY WARRANTY; without even the implied warranty of 15*53ee8cc1Swenshuai.xi * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16*53ee8cc1Swenshuai.xi */ 17*53ee8cc1Swenshuai.xi 18*53ee8cc1Swenshuai.xi #ifndef CN_PROC_H 19*53ee8cc1Swenshuai.xi #define CN_PROC_H 20*53ee8cc1Swenshuai.xi 21*53ee8cc1Swenshuai.xi #include <linux/types.h> 22*53ee8cc1Swenshuai.xi 23*53ee8cc1Swenshuai.xi /* 24*53ee8cc1Swenshuai.xi * Userspace sends this enum to register with the kernel that it is listening 25*53ee8cc1Swenshuai.xi * for events on the connector. 26*53ee8cc1Swenshuai.xi */ 27*53ee8cc1Swenshuai.xi enum proc_cn_mcast_op { 28*53ee8cc1Swenshuai.xi PROC_CN_MCAST_LISTEN = 1, 29*53ee8cc1Swenshuai.xi PROC_CN_MCAST_IGNORE = 2 30*53ee8cc1Swenshuai.xi }; 31*53ee8cc1Swenshuai.xi 32*53ee8cc1Swenshuai.xi /* 33*53ee8cc1Swenshuai.xi * From the user's point of view, the process 34*53ee8cc1Swenshuai.xi * ID is the thread group ID and thread ID is the internal 35*53ee8cc1Swenshuai.xi * kernel "pid". So, fields are assigned as follow: 36*53ee8cc1Swenshuai.xi * 37*53ee8cc1Swenshuai.xi * In user space - In kernel space 38*53ee8cc1Swenshuai.xi * 39*53ee8cc1Swenshuai.xi * parent process ID = parent->tgid 40*53ee8cc1Swenshuai.xi * parent thread ID = parent->pid 41*53ee8cc1Swenshuai.xi * child process ID = child->tgid 42*53ee8cc1Swenshuai.xi * child thread ID = child->pid 43*53ee8cc1Swenshuai.xi */ 44*53ee8cc1Swenshuai.xi 45*53ee8cc1Swenshuai.xi struct proc_event { 46*53ee8cc1Swenshuai.xi enum what { 47*53ee8cc1Swenshuai.xi /* Use successive bits so the enums can be used to record 48*53ee8cc1Swenshuai.xi * sets of events as well 49*53ee8cc1Swenshuai.xi */ 50*53ee8cc1Swenshuai.xi PROC_EVENT_NONE = 0x00000000, 51*53ee8cc1Swenshuai.xi PROC_EVENT_FORK = 0x00000001, 52*53ee8cc1Swenshuai.xi PROC_EVENT_EXEC = 0x00000002, 53*53ee8cc1Swenshuai.xi PROC_EVENT_UID = 0x00000004, 54*53ee8cc1Swenshuai.xi PROC_EVENT_GID = 0x00000040, 55*53ee8cc1Swenshuai.xi /* "next" should be 0x00000400 */ 56*53ee8cc1Swenshuai.xi /* "last" is the last process event: exit */ 57*53ee8cc1Swenshuai.xi PROC_EVENT_EXIT = 0x80000000 58*53ee8cc1Swenshuai.xi } what; 59*53ee8cc1Swenshuai.xi __u32 cpu; 60*53ee8cc1Swenshuai.xi __u64 __attribute__((aligned(8))) timestamp_ns; 61*53ee8cc1Swenshuai.xi /* Number of nano seconds since system boot */ 62*53ee8cc1Swenshuai.xi union { /* must be last field of proc_event struct */ 63*53ee8cc1Swenshuai.xi struct { 64*53ee8cc1Swenshuai.xi __u32 err; 65*53ee8cc1Swenshuai.xi } ack; 66*53ee8cc1Swenshuai.xi 67*53ee8cc1Swenshuai.xi struct fork_proc_event { 68*53ee8cc1Swenshuai.xi pid_t parent_pid; 69*53ee8cc1Swenshuai.xi pid_t parent_tgid; 70*53ee8cc1Swenshuai.xi pid_t child_pid; 71*53ee8cc1Swenshuai.xi pid_t child_tgid; 72*53ee8cc1Swenshuai.xi } fork; 73*53ee8cc1Swenshuai.xi 74*53ee8cc1Swenshuai.xi struct exec_proc_event { 75*53ee8cc1Swenshuai.xi pid_t process_pid; 76*53ee8cc1Swenshuai.xi pid_t process_tgid; 77*53ee8cc1Swenshuai.xi } exec; 78*53ee8cc1Swenshuai.xi 79*53ee8cc1Swenshuai.xi struct id_proc_event { 80*53ee8cc1Swenshuai.xi pid_t process_pid; 81*53ee8cc1Swenshuai.xi pid_t process_tgid; 82*53ee8cc1Swenshuai.xi union { 83*53ee8cc1Swenshuai.xi __u32 ruid; /* task uid */ 84*53ee8cc1Swenshuai.xi __u32 rgid; /* task gid */ 85*53ee8cc1Swenshuai.xi } r; 86*53ee8cc1Swenshuai.xi union { 87*53ee8cc1Swenshuai.xi __u32 euid; 88*53ee8cc1Swenshuai.xi __u32 egid; 89*53ee8cc1Swenshuai.xi } e; 90*53ee8cc1Swenshuai.xi } id; 91*53ee8cc1Swenshuai.xi 92*53ee8cc1Swenshuai.xi struct exit_proc_event { 93*53ee8cc1Swenshuai.xi pid_t process_pid; 94*53ee8cc1Swenshuai.xi pid_t process_tgid; 95*53ee8cc1Swenshuai.xi __u32 exit_code, exit_signal; 96*53ee8cc1Swenshuai.xi } exit; 97*53ee8cc1Swenshuai.xi } event_data; 98*53ee8cc1Swenshuai.xi }; 99*53ee8cc1Swenshuai.xi 100*53ee8cc1Swenshuai.xi #endif /* CN_PROC_H */ 101