130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * cn_proc.h - process events connector
330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Copyright (C) Matt Helsley, IBM Corp. 2005
530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Based on cn_fork.h by Nguyen Anh Quynh and Guillaume Thouvenin
630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Copyright (C) 2005 Nguyen Anh Quynh <aquynh@gmail.com>
730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Copyright (C) 2005 Guillaume Thouvenin <guillaume.thouvenin@bull.net>
830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * This program is free software; you can redistribute it and/or modify it
1030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * under the terms of version 2.1 of the GNU Lesser General Public License
1130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * as published by the Free Software Foundation.
1230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
1330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * This program is distributed in the hope that it would be useful, but
1430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * WITHOUT ANY WARRANTY; without even the implied warranty of
1530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
1630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
1730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
1830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#ifndef _UAPICN_PROC_H
1930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _UAPICN_PROC_H
2030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
2130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#include <linux/types.h>
2230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
2330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
2430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Userspace sends this enum to register with the kernel that it is listening
2530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * for events on the connector.
2630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
2730692c65c4174412c90e79489e98ab85c1a7412fBen Chengenum proc_cn_mcast_op {
2830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	PROC_CN_MCAST_LISTEN = 1,
2930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	PROC_CN_MCAST_IGNORE = 2
3030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng};
3130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
3230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
3330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * From the user's point of view, the process
3430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * ID is the thread group ID and thread ID is the internal
3530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * kernel "pid". So, fields are assigned as follow:
3630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
3730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *  In user space     -  In  kernel space
3830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
3930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * parent process ID  =  parent->tgid
4030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * parent thread  ID  =  parent->pid
4130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * child  process ID  =  child->tgid
4230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * child  thread  ID  =  child->pid
4330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
4430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
4530692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct proc_event {
4630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	enum what {
4730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		/* Use successive bits so the enums can be used to record
4830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		 * sets of events as well
4930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		 */
5030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		PROC_EVENT_NONE = 0x00000000,
5130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		PROC_EVENT_FORK = 0x00000001,
5230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		PROC_EVENT_EXEC = 0x00000002,
5330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		PROC_EVENT_UID  = 0x00000004,
5430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		PROC_EVENT_GID  = 0x00000040,
5530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		PROC_EVENT_SID  = 0x00000080,
5630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		PROC_EVENT_PTRACE = 0x00000100,
5730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		PROC_EVENT_COMM = 0x00000200,
5830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		/* "next" should be 0x00000400 */
5930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		/* "last" is the last process event: exit,
6030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		 * while "next to last" is coredumping event */
6130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		PROC_EVENT_COREDUMP = 0x40000000,
6230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		PROC_EVENT_EXIT = 0x80000000
6330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	} what;
6430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u32 cpu;
6530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u64 __attribute__((aligned(8))) timestamp_ns;
6630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		/* Number of nano seconds since system boot */
6730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	union { /* must be last field of proc_event struct */
6830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		struct {
6930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng			__u32 err;
7030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		} ack;
7130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
7230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		struct fork_proc_event {
7330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng			__kernel_pid_t parent_pid;
7430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng			__kernel_pid_t parent_tgid;
7530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng			__kernel_pid_t child_pid;
7630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng			__kernel_pid_t child_tgid;
7730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		} fork;
7830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
7930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		struct exec_proc_event {
8030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng			__kernel_pid_t process_pid;
8130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng			__kernel_pid_t process_tgid;
8230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		} exec;
8330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
8430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		struct id_proc_event {
8530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng			__kernel_pid_t process_pid;
8630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng			__kernel_pid_t process_tgid;
8730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng			union {
8830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng				__u32 ruid; /* task uid */
8930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng				__u32 rgid; /* task gid */
9030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng			} r;
9130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng			union {
9230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng				__u32 euid;
9330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng				__u32 egid;
9430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng			} e;
9530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		} id;
9630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
9730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		struct sid_proc_event {
9830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng			__kernel_pid_t process_pid;
9930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng			__kernel_pid_t process_tgid;
10030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		} sid;
10130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
10230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		struct ptrace_proc_event {
10330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng			__kernel_pid_t process_pid;
10430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng			__kernel_pid_t process_tgid;
10530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng			__kernel_pid_t tracer_pid;
10630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng			__kernel_pid_t tracer_tgid;
10730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		} ptrace;
10830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
10930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		struct comm_proc_event {
11030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng			__kernel_pid_t process_pid;
11130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng			__kernel_pid_t process_tgid;
11230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng			char           comm[16];
11330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		} comm;
11430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
11530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		struct coredump_proc_event {
11630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng			__kernel_pid_t process_pid;
11730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng			__kernel_pid_t process_tgid;
11830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		} coredump;
11930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
12030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		struct exit_proc_event {
12130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng			__kernel_pid_t process_pid;
12230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng			__kernel_pid_t process_tgid;
12330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng			__u32 exit_code, exit_signal;
12430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng		} exit;
12530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
12630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	} event_data;
12730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng};
12830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
12930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#endif /* _UAPICN_PROC_H */
130