1633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham/*
2633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham * This file is subject to the terms and conditions of the GNU General Public
3633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham * License.  See the file "COPYING" in the main directory of this archive
4633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham * for more details.
5633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham *
6633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham * Copyright (C) 1998, 1999, 2001, 2003 Ralf Baechle
7633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham * Copyright (C) 2000, 2001 Silicon Graphics, Inc.
8633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham */
9633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham#ifndef _ASM_SIGINFO_H
10633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham#define _ASM_SIGINFO_H
11633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham
12633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham
13633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham#define __ARCH_SIGEV_PREAMBLE_SIZE (sizeof(long) + 2*sizeof(int))
14633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham#undef __ARCH_SI_TRAPNO	/* exception code needs to fill this ...  */
15633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham
16633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham#define HAVE_ARCH_SIGINFO_T
17633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham
18633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham/*
19633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham * We duplicate the generic versions - <asm-generic/siginfo.h> is just borked
20633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham * by design ...
21633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham */
22633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham#define HAVE_ARCH_COPY_SIGINFO
23633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandhamstruct siginfo;
24633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham
25633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham/*
26633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham * Careful to keep union _sifields from shifting ...
27633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham */
28633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham#ifdef CONFIG_32BIT
29633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham#define __ARCH_SI_PREAMBLE_SIZE (3 * sizeof(int))
30633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham#endif
31633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham#ifdef CONFIG_64BIT
32633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham#define __ARCH_SI_PREAMBLE_SIZE (4 * sizeof(int))
33633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham#endif
34633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham
35633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham#include <asm-generic/siginfo.h>
36633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham
37633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandhamtypedef struct siginfo {
38633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham	int si_signo;
39633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham	int si_code;
40633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham	int si_errno;
41633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham	int __pad0[SI_MAX_SIZE / sizeof(int) - SI_PAD_SIZE - 3];
42633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham
43633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham	union {
44633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham		int _pad[SI_PAD_SIZE];
45633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham
46633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham		/* kill() */
47633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham		struct {
48633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham			pid_t _pid;		/* sender's pid */
49633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham			__ARCH_SI_UID_T _uid;	/* sender's uid */
50633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham		} _kill;
51633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham
52633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham		/* POSIX.1b timers */
53633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham		struct {
54633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham			timer_t _tid;		/* timer id */
55633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham			int _overrun;		/* overrun count */
56633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham			char _pad[sizeof( __ARCH_SI_UID_T) - sizeof(int)];
57633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham			sigval_t _sigval;	/* same as below */
58633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham			int _sys_private;       /* not to be passed to user */
59633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham		} _timer;
60633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham
61633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham		/* POSIX.1b signals */
62633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham		struct {
63633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham			pid_t _pid;		/* sender's pid */
64633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham			__ARCH_SI_UID_T _uid;	/* sender's uid */
65633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham			sigval_t _sigval;
66633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham		} _rt;
67633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham
68633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham		/* SIGCHLD */
69633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham		struct {
70633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham			pid_t _pid;		/* which child */
71633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham			__ARCH_SI_UID_T _uid;	/* sender's uid */
72633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham			int _status;		/* exit code */
73633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham			clock_t _utime;
74633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham			clock_t _stime;
75633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham		} _sigchld;
76633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham
77633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham		/* IRIX SIGCHLD */
78633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham		struct {
79633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham			pid_t _pid;		/* which child */
80633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham			clock_t _utime;
81633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham			int _status;		/* exit code */
82633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham			clock_t _stime;
83633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham		} _irix_sigchld;
84633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham
85633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham		/* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
86633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham		struct {
87633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham			void __user *_addr; /* faulting insn/memory ref. */
88633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham#ifdef __ARCH_SI_TRAPNO
89633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham			int _trapno;	/* TRAP # which caused the signal */
90633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham#endif
91633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham		} _sigfault;
92633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham
93633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham		/* SIGPOLL, SIGXFSZ (To do ...)  */
94633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham		struct {
95633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham			__ARCH_SI_BAND_T _band;	/* POLL_IN, POLL_OUT, POLL_MSG */
96633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham			int _fd;
97633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham		} _sigpoll;
98633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham	} _sifields;
99633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham} siginfo_t;
100633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham
101633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham/*
102633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham * si_code values
103633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham * Again these have been choosen to be IRIX compatible.
104633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham */
105633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham#undef SI_ASYNCIO
106633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham#undef SI_TIMER
107633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham#undef SI_MESGQ
108633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham#define SI_ASYNCIO	-2	/* sent by AIO completion */
109633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham#define SI_TIMER __SI_CODE(__SI_TIMER, -3) /* sent by timer expiration */
110633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham#define SI_MESGQ __SI_CODE(__SI_MESGQ, -4) /* sent by real time mesq state change */
111633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham
112633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham#ifdef __KERNEL__
113633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham
114633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham/*
115633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham * Duplicated here because of <asm-generic/siginfo.h> braindamage ...
116633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham */
117633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham#include <linux/string.h>
118633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham
119633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandhamstatic inline void copy_siginfo(struct siginfo *to, struct siginfo *from)
120633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham{
121633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham	if (from->si_code < 0)
122633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham		memcpy(to, from, sizeof(*to));
123633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham	else
124633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham		/* _sigchld is currently the largest know union member */
125633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham		memcpy(to, from, 3*sizeof(int) + sizeof(from->_sifields._sigchld));
126633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham}
127633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham
128633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham#endif
129633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham
130633c3473533ad9f2cca069b22cc5d95cd4e3510bRaghu Gandham#endif /* _ASM_SIGINFO_H */
131