1/*
2 * This file is subject to the terms and conditions of the GNU General Public
3 * License.  See the file "COPYING" in the main directory of this archive
4 * for more details.
5 *
6 * Copyright (C) 1998, 1999, 2001, 2003 Ralf Baechle
7 * Copyright (C) 2000, 2001 Silicon Graphics, Inc.
8 */
9#ifndef _ASM_SIGINFO_H
10#define _ASM_SIGINFO_H
11
12
13#define __ARCH_SIGEV_PREAMBLE_SIZE (sizeof(long) + 2*sizeof(int))
14#undef __ARCH_SI_TRAPNO	/* exception code needs to fill this ...  */
15
16#define HAVE_ARCH_SIGINFO_T
17
18/*
19 * We duplicate the generic versions - <asm-generic/siginfo.h> is just borked
20 * by design ...
21 */
22#define HAVE_ARCH_COPY_SIGINFO
23struct siginfo;
24
25/*
26 * Careful to keep union _sifields from shifting ...
27 */
28#ifdef CONFIG_32BIT
29#define __ARCH_SI_PREAMBLE_SIZE (3 * sizeof(int))
30#endif
31#ifdef CONFIG_64BIT
32#define __ARCH_SI_PREAMBLE_SIZE (4 * sizeof(int))
33#endif
34
35#include <asm-generic/siginfo.h>
36
37typedef struct siginfo {
38	int si_signo;
39	int si_code;
40	int si_errno;
41	int __pad0[SI_MAX_SIZE / sizeof(int) - SI_PAD_SIZE - 3];
42
43	union {
44		int _pad[SI_PAD_SIZE];
45
46		/* kill() */
47		struct {
48			pid_t _pid;		/* sender's pid */
49			__ARCH_SI_UID_T _uid;	/* sender's uid */
50		} _kill;
51
52		/* POSIX.1b timers */
53		struct {
54			timer_t _tid;		/* timer id */
55			int _overrun;		/* overrun count */
56			char _pad[sizeof( __ARCH_SI_UID_T) - sizeof(int)];
57			sigval_t _sigval;	/* same as below */
58			int _sys_private;       /* not to be passed to user */
59		} _timer;
60
61		/* POSIX.1b signals */
62		struct {
63			pid_t _pid;		/* sender's pid */
64			__ARCH_SI_UID_T _uid;	/* sender's uid */
65			sigval_t _sigval;
66		} _rt;
67
68		/* SIGCHLD */
69		struct {
70			pid_t _pid;		/* which child */
71			__ARCH_SI_UID_T _uid;	/* sender's uid */
72			int _status;		/* exit code */
73			clock_t _utime;
74			clock_t _stime;
75		} _sigchld;
76
77		/* IRIX SIGCHLD */
78		struct {
79			pid_t _pid;		/* which child */
80			clock_t _utime;
81			int _status;		/* exit code */
82			clock_t _stime;
83		} _irix_sigchld;
84
85		/* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
86		struct {
87			void __user *_addr; /* faulting insn/memory ref. */
88#ifdef __ARCH_SI_TRAPNO
89			int _trapno;	/* TRAP # which caused the signal */
90#endif
91		} _sigfault;
92
93		/* SIGPOLL, SIGXFSZ (To do ...)  */
94		struct {
95			__ARCH_SI_BAND_T _band;	/* POLL_IN, POLL_OUT, POLL_MSG */
96			int _fd;
97		} _sigpoll;
98	} _sifields;
99} siginfo_t;
100
101/*
102 * si_code values
103 * Again these have been choosen to be IRIX compatible.
104 */
105#undef SI_ASYNCIO
106#undef SI_TIMER
107#undef SI_MESGQ
108#define SI_ASYNCIO	-2	/* sent by AIO completion */
109#define SI_TIMER __SI_CODE(__SI_TIMER,-3) /* sent by timer expiration */
110#define SI_MESGQ __SI_CODE(__SI_MESGQ,-4) /* sent by real time mesq state change */
111
112#ifdef __KERNEL__
113
114/*
115 * Duplicated here because of <asm-generic/siginfo.h> braindamage ...
116 */
117#include <linux/string.h>
118
119static inline void copy_siginfo(struct siginfo *to, struct siginfo *from)
120{
121	if (from->si_code < 0)
122		memcpy(to, from, sizeof(*to));
123	else
124		/* _sigchld is currently the largest know union member */
125		memcpy(to, from, 3*sizeof(int) + sizeof(from->_sifields._sigchld));
126}
127
128#endif
129
130#endif /* _ASM_SIGINFO_H */
131