blob: ec1684ef82ecd6623982ad584c6076e470555519 [file] [log] [blame]
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001/*
2 * Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl>
3 * Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
4 * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00005 * Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
6 * Copyright (c) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
7 * Linux for s390 port by D.J. Barrow
8 * <barrow_dj@mail.yahoo.com,djbarrow@de.ibm.com>
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00009 * All rights reserved.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in the
18 * documentation and/or other materials provided with the distribution.
19 * 3. The name of the author may not be used to endorse or promote products
20 * derived from this software without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000032 */
33
34#include "defs.h"
Dmitry V. Levin0e946ab2015-07-17 23:56:54 +000035#include <signal.h>
Denys Vlasenko041b3ee2011-08-18 12:48:56 +020036
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000037#ifndef NSIG
Dmitry V. Levin74219ea2015-03-06 01:47:18 +000038# warning NSIG is not defined, using 32
Denys Vlasenko84703742012-02-25 02:38:52 +010039# define NSIG 32
Dmitry V. Levin38593e92014-02-26 16:51:28 +000040#elif NSIG < 32
Dmitry V. Levin74219ea2015-03-06 01:47:18 +000041# error NSIG < 32
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000042#endif
Denys Vlasenko041b3ee2011-08-18 12:48:56 +020043
Roland McGrath2638cb42002-12-15 23:58:41 +000044/* The libc headers do not define this constant since it should only be
Denys Vlasenko041b3ee2011-08-18 12:48:56 +020045 used by the implementation. So we define it here. */
Dmitry V. Levin5c7f6272014-02-08 00:26:06 +000046#ifndef SA_RESTORER
47# ifdef ASM_SA_RESTORER
48# define SA_RESTORER ASM_SA_RESTORER
Roland McGrath2638cb42002-12-15 23:58:41 +000049# endif
50#endif
51
Dmitry V. Levin24b8eb02015-02-28 17:17:09 +000052/*
53 * Some architectures define SA_RESTORER in their headers,
54 * but do not actually have sa_restorer.
55 *
56 * Some architectures, otherwise, do not define SA_RESTORER in their headers,
57 * but actually have sa_restorer.
58 */
59#ifdef SA_RESTORER
60# if defined HPPA || defined IA64
61# define HAVE_SA_RESTORER 0
62# else
63# define HAVE_SA_RESTORER 1
64# endif
65#else /* !SA_RESTORER */
Andreas Schwaba8971362015-03-11 14:15:34 +010066# if defined SPARC || defined SPARC64 || defined M68K
Dmitry V. Levin24b8eb02015-02-28 17:17:09 +000067# define HAVE_SA_RESTORER 1
68# else
69# define HAVE_SA_RESTORER 0
70# endif
Mike Frysingerd632e102014-08-09 09:04:18 -040071#endif
72
Dmitry V. Levin0ed617b2014-04-25 23:30:54 +000073#include "xlat/sigact_flags.h"
Dmitry V. Levin0ed617b2014-04-25 23:30:54 +000074#include "xlat/sigprocmaskcmds.h"
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000075
Nate Sammonsce780fc1999-03-29 23:23:13 +000076/* Anonymous realtime signals. */
Dmitry V. Levin59f63d32015-03-05 05:03:41 +000077#ifndef ASM_SIGRTMIN
78/* Linux kernel >= 3.18 defines SIGRTMIN to 32 on all architectures. */
79# define ASM_SIGRTMIN 32
Nate Sammonsce780fc1999-03-29 23:23:13 +000080#endif
Dmitry V. Levin59f63d32015-03-05 05:03:41 +000081#ifndef ASM_SIGRTMAX
82/* Under glibc 2.1, SIGRTMAX et al are functions, but __SIGRTMAX is a
83 constant. This is what we want. Otherwise, just use SIGRTMAX. */
84# ifdef SIGRTMAX
85# ifndef __SIGRTMAX
86# define __SIGRTMAX SIGRTMAX
87# endif
88# endif
89# ifdef __SIGRTMAX
90# define ASM_SIGRTMAX __SIGRTMAX
91# endif
Nate Sammonsce780fc1999-03-29 23:23:13 +000092#endif
93
Denys Vlasenkod9560c12011-08-19 17:41:28 +020094/* Note on the size of sigset_t:
95 *
96 * In glibc, sigset_t is an array with space for 1024 bits (!),
97 * even though all arches supported by Linux have only 64 signals
98 * except MIPS, which has 128. IOW, it is 128 bytes long.
99 *
100 * In-kernel sigset_t is sized correctly (it is either 64 or 128 bit long).
101 * However, some old syscall return only 32 lower bits (one word).
102 * Example: sys_sigpending vs sys_rt_sigpending.
103 *
104 * Be aware of this fact when you try to
105 * memcpy(&tcp->u_arg[1], &something, sizeof(sigset_t))
106 * - sizeof(sigset_t) is much bigger than you think,
107 * it may overflow tcp->u_arg[] array, and it may try to copy more data
108 * than is really available in <something>.
109 * Similarly,
110 * umoven(tcp, addr, sizeof(sigset_t), &sigset)
111 * may be a bad idea: it'll try to read much more data than needed
112 * to fetch a sigset_t.
113 * Use (NSIG / 8) as a size instead.
114 */
115
Roland McGrathee36ce12004-09-04 03:53:10 +0000116const char *
Dmitry V. Levin3ed5d022014-09-10 13:46:04 +0000117signame(const int sig)
Nate Sammonsce780fc1999-03-29 23:23:13 +0000118{
Dmitry V. Levin3ed5d022014-09-10 13:46:04 +0000119 static char buf[sizeof("SIGRT_%u") + sizeof(int)*3];
Denys Vlasenko041b3ee2011-08-18 12:48:56 +0200120
Dmitry V. Levin3ed5d022014-09-10 13:46:04 +0000121 if (sig >= 0) {
122 const unsigned int s = sig;
123
124 if (s < nsignals)
125 return signalent[s];
Dmitry V. Levin59f63d32015-03-05 05:03:41 +0000126#ifdef ASM_SIGRTMAX
127 if (s >= ASM_SIGRTMIN && s <= ASM_SIGRTMAX) {
128 sprintf(buf, "SIGRT_%u", s - ASM_SIGRTMIN);
Dmitry V. Levin3ed5d022014-09-10 13:46:04 +0000129 return buf;
130 }
Denys Vlasenko041b3ee2011-08-18 12:48:56 +0200131#endif
Dmitry V. Levin3ed5d022014-09-10 13:46:04 +0000132 }
Denys Vlasenko041b3ee2011-08-18 12:48:56 +0200133 sprintf(buf, "%d", sig);
134 return buf;
Nate Sammonsce780fc1999-03-29 23:23:13 +0000135}
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000136
Dmitry V. Levin38593e92014-02-26 16:51:28 +0000137static unsigned int
138popcount32(const uint32_t *a, unsigned int size)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000139{
Dmitry V. Levin38593e92014-02-26 16:51:28 +0000140 unsigned int count = 0;
Denys Vlasenkod9560c12011-08-19 17:41:28 +0200141
Dmitry V. Levin38593e92014-02-26 16:51:28 +0000142 for (; size; ++a, --size) {
143 uint32_t x = *a;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000144
Dmitry V. Levin38593e92014-02-26 16:51:28 +0000145#ifdef HAVE___BUILTIN_POPCOUNT
146 count += __builtin_popcount(x);
Denys Vlasenkoa8773792013-07-18 20:42:41 +0200147#else
Dmitry V. Levin38593e92014-02-26 16:51:28 +0000148 for (; x; ++count)
149 x &= x - 1;
Nate Sammons4a121431999-04-06 01:19:39 +0000150#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000151 }
Denys Vlasenko4f3df072012-01-29 22:38:35 +0100152
Dmitry V. Levin38593e92014-02-26 16:51:28 +0000153 return count;
154}
155
Dmitry V. Levin74219ea2015-03-06 01:47:18 +0000156const char *
Dmitry V. Levin38593e92014-02-26 16:51:28 +0000157sprintsigmask_n(const char *prefix, const void *sig_mask, unsigned int bytes)
158{
159 /*
160 * The maximum number of signal names to be printed is NSIG * 2 / 3.
161 * Most of signal names have length 7,
162 * average length of signal names is less than 7.
163 * The length of prefix string does not exceed 16.
164 */
165 static char outstr[128 + 8 * (NSIG * 2 / 3)];
166
167 char *s;
168 const uint32_t *mask;
169 uint32_t inverted_mask[NSIG / 32];
170 unsigned int size;
171 int i;
172 char sep;
173
174 s = stpcpy(outstr, prefix);
175
176 mask = sig_mask;
177 /* length of signal mask in 4-byte words */
178 size = (bytes >= NSIG / 8) ? NSIG / 32 : (bytes + 3) / 4;
179
180 /* check whether 2/3 or more bits are set */
181 if (popcount32(mask, size) >= size * 32 * 2 / 3) {
182 /* show those signals that are NOT in the mask */
183 unsigned int j;
184 for (j = 0; j < size; ++j)
185 inverted_mask[j] = ~mask[j];
186 mask = inverted_mask;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000187 *s++ = '~';
Dmitry V. Levin38593e92014-02-26 16:51:28 +0000188 }
Denys Vlasenko4f3df072012-01-29 22:38:35 +0100189
190 sep = '[';
Dmitry V. Levin38593e92014-02-26 16:51:28 +0000191 for (i = 0; (i = next_set_bit(mask, i, size * 32)) >= 0; ) {
192 ++i;
193 *s++ = sep;
Dmitry V. Levin3ed5d022014-09-10 13:46:04 +0000194 if ((unsigned) i < nsignals) {
Dmitry V. Levin38593e92014-02-26 16:51:28 +0000195 s = stpcpy(s, signalent[i] + 3);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000196 }
Dmitry V. Levin59f63d32015-03-05 05:03:41 +0000197#ifdef ASM_SIGRTMAX
198 else if (i >= ASM_SIGRTMIN && i <= ASM_SIGRTMAX) {
199 s += sprintf(s, "RT_%u", i - ASM_SIGRTMIN);
Dmitry V. Levin38593e92014-02-26 16:51:28 +0000200 }
201#endif
202 else {
203 s += sprintf(s, "%u", i);
204 }
205 sep = ' ';
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000206 }
Denys Vlasenko4f3df072012-01-29 22:38:35 +0100207 if (sep == '[')
208 *s++ = sep;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000209 *s++ = ']';
210 *s = '\0';
211 return outstr;
212}
213
Dmitry V. Levin38593e92014-02-26 16:51:28 +0000214#define sprintsigmask_val(prefix, mask) \
215 sprintsigmask_n((prefix), &(mask), sizeof(mask))
216
217#define tprintsigmask_val(prefix, mask) \
218 tprints(sprintsigmask_n((prefix), &(mask), sizeof(mask)))
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000219
220void
Denys Vlasenkoeccc48c2011-06-09 01:28:11 +0200221printsignal(int nr)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000222{
Denys Vlasenko5940e652011-09-01 09:55:05 +0200223 tprints(signame(nr));
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000224}
225
Dmitry V. Levin95ebf5a2006-10-13 20:25:12 +0000226void
Denys Vlasenko5e133aa2013-07-18 17:02:21 +0200227print_sigset_addr_len(struct tcb *tcp, long addr, long len)
Dmitry V. Levin95ebf5a2006-10-13 20:25:12 +0000228{
Dmitry V. Levin38593e92014-02-26 16:51:28 +0000229 char mask[NSIG / 8];
Dmitry V. Levin95ebf5a2006-10-13 20:25:12 +0000230
Denys Vlasenko5e133aa2013-07-18 17:02:21 +0200231 /* Here len is usually equals NSIG / 8 or current_wordsize.
232 * But we code this defensively:
233 */
234 if (len < 0) {
Dmitry V. Levin735843e2015-07-17 00:37:39 +0000235 printaddr(addr);
Denys Vlasenko5e133aa2013-07-18 17:02:21 +0200236 return;
237 }
Dmitry V. Levin38593e92014-02-26 16:51:28 +0000238 if (len >= NSIG / 8)
Denys Vlasenko5e133aa2013-07-18 17:02:21 +0200239 len = NSIG / 8;
Dmitry V. Levin38593e92014-02-26 16:51:28 +0000240 else
241 len = (len + 3) & ~3;
242
Dmitry V. Levin735843e2015-07-17 00:37:39 +0000243 if (umoven_or_printaddr(tcp, addr, len, mask))
244 return;
Dmitry V. Levin38593e92014-02-26 16:51:28 +0000245 tprints(sprintsigmask_n("", mask, len));
Dmitry V. Levin95ebf5a2006-10-13 20:25:12 +0000246}
247
Dmitry V. Levina0bd3742015-04-07 01:36:50 +0000248SYS_FUNC(sigsetmask)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000249{
250 if (entering(tcp)) {
Dmitry V. Levin38593e92014-02-26 16:51:28 +0000251 tprintsigmask_val("", tcp->u_arg[0]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000252 }
253 else if (!syserror(tcp)) {
Dmitry V. Levin38593e92014-02-26 16:51:28 +0000254 tcp->auxstr = sprintsigmask_val("old mask ", tcp->u_rval);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000255 return RVAL_HEX | RVAL_STR;
256 }
257 return 0;
258}
259
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000260#ifdef HAVE_SIGACTION
261
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000262struct old_sigaction {
Denys Vlasenko86d94842013-02-08 12:59:13 +0100263 /* sa_handler may be a libc #define, need to use other name: */
Chris Dearman2b4bb1c2013-12-09 19:58:42 -0800264#ifdef MIPS
265 unsigned int sa_flags;
266 void (*__sa_handler)(int);
267 /* Kernel treats sa_mask as an array of longs. */
268 unsigned long sa_mask[NSIG / sizeof(long) ? NSIG / sizeof(long) : 1];
269#else
Denys Vlasenko86d94842013-02-08 12:59:13 +0100270 void (*__sa_handler)(int);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000271 unsigned long sa_mask;
272 unsigned long sa_flags;
Chris Dearman2b4bb1c2013-12-09 19:58:42 -0800273#endif /* !MIPS */
Dmitry V. Levin24b8eb02015-02-28 17:17:09 +0000274#if HAVE_SA_RESTORER
Vicente Olivert Rierac3a5c012014-09-11 20:05:18 +0100275 void (*sa_restorer)(void);
276#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000277};
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000278
Elliott Hughes458b3f22014-02-28 23:21:35 +0000279struct old_sigaction32 {
280 /* sa_handler may be a libc #define, need to use other name: */
281 uint32_t __sa_handler;
282 uint32_t sa_mask;
283 uint32_t sa_flags;
Dmitry V. Levin24b8eb02015-02-28 17:17:09 +0000284#if HAVE_SA_RESTORER
Elliott Hughes458b3f22014-02-28 23:21:35 +0000285 uint32_t sa_restorer;
Vicente Olivert Rierac3a5c012014-09-11 20:05:18 +0100286#endif
Elliott Hughes458b3f22014-02-28 23:21:35 +0000287};
288
Dmitry V. Levinac655a82014-01-07 22:41:30 +0000289static void
290decode_old_sigaction(struct tcb *tcp, long addr)
291{
292 struct old_sigaction sa;
Elliott Hughes458b3f22014-02-28 23:21:35 +0000293
294#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
295 if (current_wordsize != sizeof(sa.__sa_handler) && current_wordsize == 4) {
296 struct old_sigaction32 sa32;
Dmitry V. Levin735843e2015-07-17 00:37:39 +0000297
298 if (umove_or_printaddr(tcp, addr, &sa32))
299 return;
300
301 memset(&sa, 0, sizeof(sa));
302 sa.__sa_handler = (void*)(uintptr_t)sa32.__sa_handler;
303 sa.sa_flags = sa32.sa_flags;
Dmitry V. Levin24b8eb02015-02-28 17:17:09 +0000304#if HAVE_SA_RESTORER && defined SA_RESTORER
Dmitry V. Levin735843e2015-07-17 00:37:39 +0000305 sa.sa_restorer = (void*)(uintptr_t)sa32.sa_restorer;
Vicente Olivert Rierac3a5c012014-09-11 20:05:18 +0100306#endif
Dmitry V. Levin735843e2015-07-17 00:37:39 +0000307 sa.sa_mask = sa32.sa_mask;
Elliott Hughes458b3f22014-02-28 23:21:35 +0000308 } else
309#endif
Dmitry V. Levin735843e2015-07-17 00:37:39 +0000310 if (umove_or_printaddr(tcp, addr, &sa))
Dmitry V. Levinac655a82014-01-07 22:41:30 +0000311 return;
Dmitry V. Levinac655a82014-01-07 22:41:30 +0000312
313 /* Architectures using function pointers, like
314 * hppa, may need to manipulate the function pointer
315 * to compute the result of a comparison. However,
316 * the __sa_handler function pointer exists only in
317 * the address space of the traced process, and can't
318 * be manipulated by strace. In order to prevent the
319 * compiler from generating code to manipulate
320 * __sa_handler we cast the function pointers to long. */
Dmitry V. Levin735843e2015-07-17 00:37:39 +0000321 tprints("{");
Dmitry V. Levinac655a82014-01-07 22:41:30 +0000322 if ((long)sa.__sa_handler == (long)SIG_ERR)
Dmitry V. Levin735843e2015-07-17 00:37:39 +0000323 tprints("SIG_ERR");
Dmitry V. Levinac655a82014-01-07 22:41:30 +0000324 else if ((long)sa.__sa_handler == (long)SIG_DFL)
Dmitry V. Levin735843e2015-07-17 00:37:39 +0000325 tprints("SIG_DFL");
Dmitry V. Levinac655a82014-01-07 22:41:30 +0000326 else if ((long)sa.__sa_handler == (long)SIG_IGN)
Dmitry V. Levin735843e2015-07-17 00:37:39 +0000327 tprints("SIG_IGN");
Dmitry V. Levinac655a82014-01-07 22:41:30 +0000328 else
Dmitry V. Levin735843e2015-07-17 00:37:39 +0000329 printaddr((long) sa.__sa_handler);
330 tprints(", ");
Chris Dearman2b4bb1c2013-12-09 19:58:42 -0800331#ifdef MIPS
Dmitry V. Levin38593e92014-02-26 16:51:28 +0000332 tprintsigmask_addr("", sa.sa_mask);
Chris Dearman2b4bb1c2013-12-09 19:58:42 -0800333#else
Dmitry V. Levin38593e92014-02-26 16:51:28 +0000334 tprintsigmask_val("", sa.sa_mask);
Chris Dearman2b4bb1c2013-12-09 19:58:42 -0800335#endif
Dmitry V. Levinac655a82014-01-07 22:41:30 +0000336 tprints(", ");
337 printflags(sigact_flags, sa.sa_flags, "SA_???");
Dmitry V. Levin24b8eb02015-02-28 17:17:09 +0000338#if HAVE_SA_RESTORER && defined SA_RESTORER
Dmitry V. Levinac655a82014-01-07 22:41:30 +0000339 if (sa.sa_flags & SA_RESTORER)
340 tprintf(", %p", sa.sa_restorer);
341#endif
342 tprints("}");
343}
344
Dmitry V. Levina0bd3742015-04-07 01:36:50 +0000345SYS_FUNC(sigaction)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000346{
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000347 if (entering(tcp)) {
348 printsignal(tcp->u_arg[0]);
Denys Vlasenko60fe8c12011-09-01 10:00:28 +0200349 tprints(", ");
Dmitry V. Levinac655a82014-01-07 22:41:30 +0000350 decode_old_sigaction(tcp, tcp->u_arg[1]);
351 tprints(", ");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000352 } else
Dmitry V. Levinac655a82014-01-07 22:41:30 +0000353 decode_old_sigaction(tcp, tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000354 return 0;
355}
356
Dmitry V. Levina0bd3742015-04-07 01:36:50 +0000357SYS_FUNC(signal)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000358{
359 if (entering(tcp)) {
360 printsignal(tcp->u_arg[0]);
Denys Vlasenko60fe8c12011-09-01 10:00:28 +0200361 tprints(", ");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000362 switch (tcp->u_arg[1]) {
Jan Kratochvil1f942712008-08-06 21:38:52 +0000363 case (long) SIG_ERR:
Denys Vlasenko60fe8c12011-09-01 10:00:28 +0200364 tprints("SIG_ERR");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000365 break;
Jan Kratochvil1f942712008-08-06 21:38:52 +0000366 case (long) SIG_DFL:
Denys Vlasenko60fe8c12011-09-01 10:00:28 +0200367 tprints("SIG_DFL");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000368 break;
Jan Kratochvil1f942712008-08-06 21:38:52 +0000369 case (long) SIG_IGN:
Denys Vlasenko60fe8c12011-09-01 10:00:28 +0200370 tprints("SIG_IGN");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000371 break;
372 default:
Dmitry V. Levin735843e2015-07-17 00:37:39 +0000373 printaddr(tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000374 }
Wichert Akkerman16a03d22000-08-10 02:14:04 +0000375 return 0;
376 }
Dmitry V. Levin21a75342008-09-03 01:22:18 +0000377 else if (!syserror(tcp)) {
Wichert Akkerman16a03d22000-08-10 02:14:04 +0000378 switch (tcp->u_rval) {
Denys Vlasenko989ebc92012-03-17 04:42:07 +0100379 case (long) SIG_ERR:
Wichert Akkerman16a03d22000-08-10 02:14:04 +0000380 tcp->auxstr = "SIG_ERR"; break;
Denys Vlasenko989ebc92012-03-17 04:42:07 +0100381 case (long) SIG_DFL:
Wichert Akkerman16a03d22000-08-10 02:14:04 +0000382 tcp->auxstr = "SIG_DFL"; break;
Denys Vlasenko989ebc92012-03-17 04:42:07 +0100383 case (long) SIG_IGN:
Wichert Akkerman16a03d22000-08-10 02:14:04 +0000384 tcp->auxstr = "SIG_IGN"; break;
Denys Vlasenko989ebc92012-03-17 04:42:07 +0100385 default:
Wichert Akkerman16a03d22000-08-10 02:14:04 +0000386 tcp->auxstr = NULL;
387 }
388 return RVAL_HEX | RVAL_STR;
389 }
Dmitry V. Levin21a75342008-09-03 01:22:18 +0000390 return 0;
Wichert Akkerman16a03d22000-08-10 02:14:04 +0000391}
392
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000393#endif /* HAVE_SIGACTION */
394
Dmitry V. Levina0bd3742015-04-07 01:36:50 +0000395SYS_FUNC(siggetmask)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000396{
397 if (exiting(tcp)) {
Dmitry V. Levin38593e92014-02-26 16:51:28 +0000398 tcp->auxstr = sprintsigmask_val("mask ", tcp->u_rval);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000399 }
400 return RVAL_HEX | RVAL_STR;
401}
402
Dmitry V. Levina0bd3742015-04-07 01:36:50 +0000403SYS_FUNC(sigsuspend)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000404{
Dmitry V. Levin0e45b502015-07-17 00:51:45 +0000405 tprintsigmask_val("", tcp->u_arg[2]);
406
407 return RVAL_DECODED;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000408}
409
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000410#ifdef HAVE_SIGACTION
411
Denys Vlasenko5e133aa2013-07-18 17:02:21 +0200412/* "Old" sigprocmask, which operates with word-sized signal masks */
Dmitry V. Levina0bd3742015-04-07 01:36:50 +0000413SYS_FUNC(sigprocmask)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000414{
Denys Vlasenko5e133aa2013-07-18 17:02:21 +0200415# ifdef ALPHA
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000416 if (entering(tcp)) {
Mike Frysingerdde045c2012-03-15 00:45:33 -0400417 /*
418 * Alpha/OSF is different: it doesn't pass in two pointers,
419 * but rather passes in the new bitmask as an argument and
420 * then returns the old bitmask. This "works" because we
421 * only have 64 signals to worry about. If you want more,
422 * use of the rt_sigprocmask syscall is required.
423 * Alpha:
424 * old = osf_sigprocmask(how, new);
425 * Everyone else:
426 * ret = sigprocmask(how, &new, &old, ...);
427 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000428 printxval(sigprocmaskcmds, tcp->u_arg[0], "SIG_???");
Dmitry V. Levin38593e92014-02-26 16:51:28 +0000429 tprintsigmask_val(", ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000430 }
431 else if (!syserror(tcp)) {
Dmitry V. Levin38593e92014-02-26 16:51:28 +0000432 tcp->auxstr = sprintsigmask_val("old mask ", tcp->u_rval);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000433 return RVAL_HEX | RVAL_STR;
434 }
Denys Vlasenko5e133aa2013-07-18 17:02:21 +0200435# else /* !ALPHA */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000436 if (entering(tcp)) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000437 printxval(sigprocmaskcmds, tcp->u_arg[0], "SIG_???");
Denys Vlasenko60fe8c12011-09-01 10:00:28 +0200438 tprints(", ");
Denys Vlasenko5e133aa2013-07-18 17:02:21 +0200439 print_sigset_addr_len(tcp, tcp->u_arg[1], current_wordsize);
Denys Vlasenko60fe8c12011-09-01 10:00:28 +0200440 tprints(", ");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000441 }
442 else {
Dmitry V. Levin735843e2015-07-17 00:37:39 +0000443 print_sigset_addr_len(tcp, tcp->u_arg[2], current_wordsize);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000444 }
Denys Vlasenko5e133aa2013-07-18 17:02:21 +0200445# endif /* !ALPHA */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000446 return 0;
447}
448
449#endif /* HAVE_SIGACTION */
450
Dmitry V. Levina0bd3742015-04-07 01:36:50 +0000451SYS_FUNC(kill)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000452{
Dmitry V. Levin0e45b502015-07-17 00:51:45 +0000453 tprintf("%ld, %s",
454 widen_to_long(tcp->u_arg[0]),
455 signame(tcp->u_arg[1]));
456
457 return RVAL_DECODED;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000458}
459
Dmitry V. Levina0bd3742015-04-07 01:36:50 +0000460SYS_FUNC(tgkill)
Roland McGrath8ffc3522003-07-09 09:47:49 +0000461{
Dmitry V. Levin0e45b502015-07-17 00:51:45 +0000462 tprintf("%ld, %ld, %s",
463 widen_to_long(tcp->u_arg[0]),
464 widen_to_long(tcp->u_arg[1]),
465 signame(tcp->u_arg[2]));
466
467 return RVAL_DECODED;
Roland McGrath8ffc3522003-07-09 09:47:49 +0000468}
Roland McGrath8ffc3522003-07-09 09:47:49 +0000469
Dmitry V. Levina0bd3742015-04-07 01:36:50 +0000470SYS_FUNC(sigpending)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000471{
Dmitry V. Levin735843e2015-07-17 00:37:39 +0000472 if (exiting(tcp))
473 print_sigset_addr_len(tcp, tcp->u_arg[0], current_wordsize);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000474 return 0;
475}
476
Dmitry V. Levina0bd3742015-04-07 01:36:50 +0000477SYS_FUNC(rt_sigprocmask)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000478{
Denys Vlasenko5e133aa2013-07-18 17:02:21 +0200479 /* Note: arg[3] is the length of the sigset. Kernel requires NSIG / 8 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000480 if (entering(tcp)) {
481 printxval(sigprocmaskcmds, tcp->u_arg[0], "SIG_???");
Denys Vlasenko60fe8c12011-09-01 10:00:28 +0200482 tprints(", ");
Denys Vlasenko5e133aa2013-07-18 17:02:21 +0200483 print_sigset_addr_len(tcp, tcp->u_arg[1], tcp->u_arg[3]);
484 tprints(", ");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000485 }
486 else {
Dmitry V. Levin735843e2015-07-17 00:37:39 +0000487 print_sigset_addr_len(tcp, tcp->u_arg[2], tcp->u_arg[3]);
Nate Sammonsdab325a1999-03-29 23:33:35 +0000488 tprintf(", %lu", tcp->u_arg[3]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000489 }
490 return 0;
491}
492
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000493/* Structure describing the action to be taken when a signal arrives. */
494struct new_sigaction
495{
Denys Vlasenko86d94842013-02-08 12:59:13 +0100496 /* sa_handler may be a libc #define, need to use other name: */
Chris Dearman2b4bb1c2013-12-09 19:58:42 -0800497#ifdef MIPS
498 unsigned int sa_flags;
499 void (*__sa_handler)(int);
500#else
Denys Vlasenko86d94842013-02-08 12:59:13 +0100501 void (*__sa_handler)(int);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000502 unsigned long sa_flags;
Chris Dearman2b4bb1c2013-12-09 19:58:42 -0800503#endif /* !MIPS */
Dmitry V. Levin24b8eb02015-02-28 17:17:09 +0000504#if HAVE_SA_RESTORER
Vicente Olivert Rierac3a5c012014-09-11 20:05:18 +0100505 void (*sa_restorer)(void);
506#endif
Denys Vlasenko7a862d72009-04-15 13:22:59 +0000507 /* Kernel treats sa_mask as an array of longs. */
508 unsigned long sa_mask[NSIG / sizeof(long) ? NSIG / sizeof(long) : 1];
509};
510/* Same for i386-on-x86_64 and similar cases */
511struct new_sigaction32
512{
513 uint32_t __sa_handler;
514 uint32_t sa_flags;
Dmitry V. Levin24b8eb02015-02-28 17:17:09 +0000515#if HAVE_SA_RESTORER
Denys Vlasenko7a862d72009-04-15 13:22:59 +0000516 uint32_t sa_restorer;
Vicente Olivert Rierac3a5c012014-09-11 20:05:18 +0100517#endif
Denys Vlasenko7a862d72009-04-15 13:22:59 +0000518 uint32_t sa_mask[2 * (NSIG / sizeof(long) ? NSIG / sizeof(long) : 1)];
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000519};
520
Dmitry V. Levinac655a82014-01-07 22:41:30 +0000521static void
522decode_new_sigaction(struct tcb *tcp, long addr)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000523{
524 struct new_sigaction sa;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000525
Denys Vlasenkod4d3ede2013-02-13 16:31:32 +0100526#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
Denys Vlasenko9fd4f962012-03-19 09:36:42 +0100527 if (current_wordsize != sizeof(sa.sa_flags) && current_wordsize == 4) {
Denys Vlasenko7a862d72009-04-15 13:22:59 +0000528 struct new_sigaction32 sa32;
Dmitry V. Levin735843e2015-07-17 00:37:39 +0000529
530 if (umove_or_printaddr(tcp, addr, &sa32))
531 return;
532
533 memset(&sa, 0, sizeof(sa));
534 sa.__sa_handler = (void*)(unsigned long)sa32.__sa_handler;
535 sa.sa_flags = sa32.sa_flags;
Dmitry V. Levin24b8eb02015-02-28 17:17:09 +0000536#if HAVE_SA_RESTORER && defined SA_RESTORER
Dmitry V. Levin735843e2015-07-17 00:37:39 +0000537 sa.sa_restorer = (void*)(unsigned long)sa32.sa_restorer;
Vicente Olivert Rierac3a5c012014-09-11 20:05:18 +0100538#endif
Dmitry V. Levin735843e2015-07-17 00:37:39 +0000539 /* Kernel treats sa_mask as an array of longs.
540 * For 32-bit process, "long" is uint32_t, thus, for example,
541 * 32th bit in sa_mask will end up as bit 0 in sa_mask[1].
542 * But for (64-bit) kernel, 32th bit in sa_mask is
543 * 32th bit in 0th (64-bit) long!
544 * For little-endian, it's the same.
545 * For big-endian, we swap 32-bit words.
546 */
547 sa.sa_mask[0] = sa32.sa_mask[0] + ((long)(sa32.sa_mask[1]) << 32);
Denys Vlasenko7a862d72009-04-15 13:22:59 +0000548 } else
549#endif
Dmitry V. Levin735843e2015-07-17 00:37:39 +0000550 if (umove_or_printaddr(tcp, addr, &sa))
Dmitry V. Levinac655a82014-01-07 22:41:30 +0000551 return;
Dmitry V. Levin735843e2015-07-17 00:37:39 +0000552
Carlos O'Donell4677c8a2009-09-09 18:13:19 +0000553 /* Architectures using function pointers, like
554 * hppa, may need to manipulate the function pointer
555 * to compute the result of a comparison. However,
Denys Vlasenko86d94842013-02-08 12:59:13 +0100556 * the __sa_handler function pointer exists only in
Carlos O'Donell4677c8a2009-09-09 18:13:19 +0000557 * the address space of the traced process, and can't
558 * be manipulated by strace. In order to prevent the
559 * compiler from generating code to manipulate
Denys Vlasenko86d94842013-02-08 12:59:13 +0100560 * __sa_handler we cast the function pointers to long. */
Carlos O'Donell4677c8a2009-09-09 18:13:19 +0000561 if ((long)sa.__sa_handler == (long)SIG_ERR)
Denys Vlasenko60fe8c12011-09-01 10:00:28 +0200562 tprints("{SIG_ERR, ");
Carlos O'Donell4677c8a2009-09-09 18:13:19 +0000563 else if ((long)sa.__sa_handler == (long)SIG_DFL)
Denys Vlasenko60fe8c12011-09-01 10:00:28 +0200564 tprints("{SIG_DFL, ");
Carlos O'Donell4677c8a2009-09-09 18:13:19 +0000565 else if ((long)sa.__sa_handler == (long)SIG_IGN)
Denys Vlasenko60fe8c12011-09-01 10:00:28 +0200566 tprints("{SIG_IGN, ");
Denys Vlasenko7a862d72009-04-15 13:22:59 +0000567 else
568 tprintf("{%#lx, ", (long) sa.__sa_handler);
Denys Vlasenko80b73a22013-07-18 10:10:46 +0200569 /*
570 * Sigset size is in tcp->u_arg[4] (SPARC)
571 * or in tcp->u_arg[3] (all other),
572 * but kernel won't handle sys_rt_sigaction
573 * with wrong sigset size (just returns EINVAL instead).
574 * We just fetch the right size, which is NSIG / 8.
575 */
Dmitry V. Levin38593e92014-02-26 16:51:28 +0000576 tprintsigmask_val("", sa.sa_mask);
Denys Vlasenko60fe8c12011-09-01 10:00:28 +0200577 tprints(", ");
Denys Vlasenko80b73a22013-07-18 10:10:46 +0200578
Denys Vlasenko7a862d72009-04-15 13:22:59 +0000579 printflags(sigact_flags, sa.sa_flags, "SA_???");
Dmitry V. Levin24b8eb02015-02-28 17:17:09 +0000580#if HAVE_SA_RESTORER && defined SA_RESTORER
Denys Vlasenko7a862d72009-04-15 13:22:59 +0000581 if (sa.sa_flags & SA_RESTORER)
582 tprintf(", %p", sa.sa_restorer);
583#endif
Denys Vlasenko60fe8c12011-09-01 10:00:28 +0200584 tprints("}");
Dmitry V. Levinac655a82014-01-07 22:41:30 +0000585}
Denys Vlasenko7a862d72009-04-15 13:22:59 +0000586
Dmitry V. Levina0bd3742015-04-07 01:36:50 +0000587SYS_FUNC(rt_sigaction)
Dmitry V. Levinac655a82014-01-07 22:41:30 +0000588{
589 if (entering(tcp)) {
590 printsignal(tcp->u_arg[0]);
Denys Vlasenko60fe8c12011-09-01 10:00:28 +0200591 tprints(", ");
Dmitry V. Levinac655a82014-01-07 22:41:30 +0000592 decode_new_sigaction(tcp, tcp->u_arg[1]);
593 tprints(", ");
594 } else {
595 decode_new_sigaction(tcp, tcp->u_arg[2]);
Denys Vlasenko9472a272013-02-12 11:43:46 +0100596#if defined(SPARC) || defined(SPARC64)
Wichert Akkermandacfb6e1999-06-03 14:21:07 +0000597 tprintf(", %#lx, %lu", tcp->u_arg[3], tcp->u_arg[4]);
598#elif defined(ALPHA)
599 tprintf(", %lu, %#lx", tcp->u_arg[3], tcp->u_arg[4]);
600#else
Denys Vlasenko7a862d72009-04-15 13:22:59 +0000601 tprintf(", %lu", tcp->u_arg[3]);
Wichert Akkermandacfb6e1999-06-03 14:21:07 +0000602#endif
Dmitry V. Levinac655a82014-01-07 22:41:30 +0000603 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000604 return 0;
605}
606
Dmitry V. Levina0bd3742015-04-07 01:36:50 +0000607SYS_FUNC(rt_sigpending)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000608{
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000609 if (exiting(tcp)) {
Denys Vlasenko5e133aa2013-07-18 17:02:21 +0200610 /*
611 * One of the few syscalls where sigset size (arg[1])
612 * is allowed to be <= NSIG / 8, not strictly ==.
613 * This allows non-rt sigpending() syscall
614 * to reuse rt_sigpending() code in kernel.
615 */
Dmitry V. Levin735843e2015-07-17 00:37:39 +0000616 print_sigset_addr_len(tcp, tcp->u_arg[0], tcp->u_arg[1]);
Denys Vlasenko5e133aa2013-07-18 17:02:21 +0200617 tprintf(", %lu", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000618 }
619 return 0;
620}
Denys Vlasenko1d632462009-04-14 12:51:00 +0000621
Dmitry V. Levina0bd3742015-04-07 01:36:50 +0000622SYS_FUNC(rt_sigsuspend)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000623{
Dmitry V. Levin0e45b502015-07-17 00:51:45 +0000624 /* NB: kernel requires arg[1] == NSIG / 8 */
625 print_sigset_addr_len(tcp, tcp->u_arg[0], tcp->u_arg[1]);
626 tprintf(", %lu", tcp->u_arg[1]);
627
628 return RVAL_DECODED;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000629}
Denys Vlasenko1d632462009-04-14 12:51:00 +0000630
Dmitry V. Levin297632b2012-03-13 15:51:13 +0000631static void
632print_sigqueueinfo(struct tcb *tcp, int sig, unsigned long uinfo)
633{
Dmitry V. Levin297632b2012-03-13 15:51:13 +0000634 printsignal(sig);
635 tprints(", ");
Dmitry V. Levine2fb0bb2015-09-15 21:51:15 +0000636 printsiginfo_at(tcp, uinfo);
Dmitry V. Levin297632b2012-03-13 15:51:13 +0000637}
638
Dmitry V. Levina0bd3742015-04-07 01:36:50 +0000639SYS_FUNC(rt_sigqueueinfo)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000640{
Dmitry V. Levin0e45b502015-07-17 00:51:45 +0000641 tprintf("%lu, ", tcp->u_arg[0]);
642 print_sigqueueinfo(tcp, tcp->u_arg[1], tcp->u_arg[2]);
643
644 return RVAL_DECODED;
Dmitry V. Levin297632b2012-03-13 15:51:13 +0000645}
646
Dmitry V. Levina0bd3742015-04-07 01:36:50 +0000647SYS_FUNC(rt_tgsigqueueinfo)
Dmitry V. Levin297632b2012-03-13 15:51:13 +0000648{
Dmitry V. Levin0e45b502015-07-17 00:51:45 +0000649 tprintf("%lu, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
650 print_sigqueueinfo(tcp, tcp->u_arg[2], tcp->u_arg[3]);
651
652 return RVAL_DECODED;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000653}
654
Dmitry V. Levina0bd3742015-04-07 01:36:50 +0000655SYS_FUNC(rt_sigtimedwait)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000656{
Denys Vlasenko5e133aa2013-07-18 17:02:21 +0200657 /* NB: kernel requires arg[3] == NSIG / 8 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000658 if (entering(tcp)) {
Denys Vlasenko5e133aa2013-07-18 17:02:21 +0200659 print_sigset_addr_len(tcp, tcp->u_arg[0], tcp->u_arg[3]);
Denys Vlasenko60fe8c12011-09-01 10:00:28 +0200660 tprints(", ");
Denys Vlasenkob1a78cf2009-04-15 13:31:59 +0000661 /* This is the only "return" parameter, */
662 if (tcp->u_arg[1] != 0)
663 return 0;
664 /* ... if it's NULL, can decode all on entry */
Denys Vlasenko60fe8c12011-09-01 10:00:28 +0200665 tprints("NULL, ");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000666 }
Denys Vlasenkob1a78cf2009-04-15 13:31:59 +0000667 else if (tcp->u_arg[1] != 0) {
668 /* syscall exit, and u_arg[1] wasn't NULL */
Dmitry V. Levine2fb0bb2015-09-15 21:51:15 +0000669 printsiginfo_at(tcp, tcp->u_arg[1]);
Denys Vlasenkod4d3ede2013-02-13 16:31:32 +0100670 tprints(", ");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000671 }
Denys Vlasenkob1a78cf2009-04-15 13:31:59 +0000672 else {
673 /* syscall exit, and u_arg[1] was NULL */
674 return 0;
675 }
Dmitry V. Levin3858b932015-09-18 01:54:59 +0000676
677 /*
678 * Since the timeout parameter is read by the kernel
679 * on entering syscall, it has to be decoded the same way
680 * whether the syscall has failed or not.
681 */
682 temporarily_clear_syserror(tcp);
Denys Vlasenkob1a78cf2009-04-15 13:31:59 +0000683 print_timespec(tcp, tcp->u_arg[2]);
Dmitry V. Levin3858b932015-09-18 01:54:59 +0000684 restore_cleared_syserror(tcp);
685
Denys Vlasenko5e133aa2013-07-18 17:02:21 +0200686 tprintf(", %lu", tcp->u_arg[3]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000687 return 0;
688};
689
Dmitry V. Levina0bd3742015-04-07 01:36:50 +0000690SYS_FUNC(restart_syscall)
Roland McGrath79dcd7a2006-01-12 22:34:50 +0000691{
Dmitry V. Levin0e45b502015-07-17 00:51:45 +0000692 tprintf("<... resuming interrupted %s ...>",
693 tcp->s_prev_ent ? tcp->s_prev_ent->sys_name : "system call");
694
695 return RVAL_DECODED;
Roland McGrath79dcd7a2006-01-12 22:34:50 +0000696}