blob: 1ddf2f3218295c0e7a4c9adb740f554a92f61566 [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 Akkermanccef6372002-05-01 16:39:22 +00009 * Copyright (c) 2000 PocketPenguins Inc. Linux for Hitachi SuperH
10 * port by Greg Banks <gbanks@pocketpenguins.com>
11
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +000012 *
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000013 * All rights reserved.
14 *
15 * Redistribution and use in source and binary forms, with or without
16 * modification, are permitted provided that the following conditions
17 * are met:
18 * 1. Redistributions of source code must retain the above copyright
19 * notice, this list of conditions and the following disclaimer.
20 * 2. Redistributions in binary form must reproduce the above copyright
21 * notice, this list of conditions and the following disclaimer in the
22 * documentation and/or other materials provided with the distribution.
23 * 3. The name of the author may not be used to endorse or promote products
24 * derived from this software without specific prior written permission.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
27 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
28 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
29 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
30 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
31 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
35 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 *
37 * $Id$
38 */
39
40#include "defs.h"
41
42#include <fcntl.h>
43#include <sys/stat.h>
44#include <sys/time.h>
45#include <sys/wait.h>
46#include <sys/resource.h>
47#include <sys/utsname.h>
48#include <sys/user.h>
49#include <sys/syscall.h>
50#include <signal.h>
51#ifdef SUNOS4
52#include <machine/reg.h>
53#endif /* SUNOS4 */
54
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +000055#ifdef FREEBSD
56#include <sys/ptrace.h>
57#endif
58
Wichert Akkerman00a82ee2001-03-28 20:29:17 +000059#if HAVE_ASM_REG_H
Roland McGrath6d1a65c2004-07-12 07:44:08 +000060#if defined (SPARC) || defined (SPARC64)
Wichert Akkerman00a82ee2001-03-28 20:29:17 +000061# define fpq kernel_fpq
62# define fq kernel_fq
63# define fpu kernel_fpu
Roland McGrath6d1a65c2004-07-12 07:44:08 +000064#endif /* SPARC || SPARC64 */
Wichert Akkerman00a82ee2001-03-28 20:29:17 +000065#include <asm/reg.h>
Roland McGrath6d1a65c2004-07-12 07:44:08 +000066#if defined (SPARC) || defined (SPARC64)
Wichert Akkerman00a82ee2001-03-28 20:29:17 +000067# undef fpq
68# undef fq
Roland McGrath5a223472002-12-15 23:58:26 +000069# undef fpu
Roland McGrath6d1a65c2004-07-12 07:44:08 +000070#endif /* SPARC || SPARC64 */
Wichert Akkerman00a82ee2001-03-28 20:29:17 +000071#endif /* HAVE_ASM_REG_H */
72
Wichert Akkerman36915a11999-07-13 15:45:02 +000073#ifdef HAVE_SYS_REG_H
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000074# include <sys/reg.h>
Wichert Akkerman15dea971999-10-06 13:06:34 +000075#ifndef PTRACE_PEEKUSR
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000076# define PTRACE_PEEKUSR PTRACE_PEEKUSER
Wichert Akkerman15dea971999-10-06 13:06:34 +000077#endif
78#ifndef PTRACE_POKEUSR
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000079# define PTRACE_POKEUSR PTRACE_POKEUSER
80#endif
Wichert Akkerman15dea971999-10-06 13:06:34 +000081#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000082
Roland McGrath5bd7cf82003-01-24 04:31:18 +000083#ifdef HAVE_LINUX_PTRACE_H
84#undef PTRACE_SYSCALL
Roland McGrathfb1bc072004-03-01 21:29:24 +000085# ifdef HAVE_STRUCT_IA64_FPREG
86# define ia64_fpreg XXX_ia64_fpreg
87# endif
88# ifdef HAVE_STRUCT_PT_ALL_USER_REGS
89# define pt_all_user_regs XXX_pt_all_user_regs
90# endif
Roland McGrath5bd7cf82003-01-24 04:31:18 +000091#include <linux/ptrace.h>
Roland McGrathfb1bc072004-03-01 21:29:24 +000092# undef ia64_fpreg
93# undef pt_all_user_regs
Roland McGrath5bd7cf82003-01-24 04:31:18 +000094#endif
95
Roland McGrath6d1a65c2004-07-12 07:44:08 +000096#if defined (LINUX) && defined (SPARC64)
97# define r_pc r_tpc
98# undef PTRACE_GETREGS
99# define PTRACE_GETREGS PTRACE_GETREGS64
100# undef PTRACE_SETREGS
101# define PTRACE_SETREGS PTRACE_SETREGS64
102#endif /* LINUX && SPARC64 */
103
Roland McGrath5a223472002-12-15 23:58:26 +0000104#ifdef HAVE_LINUX_FUTEX_H
105#include <linux/futex.h>
106#endif
107#if defined LINUX
108# ifndef FUTEX_WAIT
109# define FUTEX_WAIT 0
110# endif
111# ifndef FUTEX_WAKE
112# define FUTEX_WAKE 1
113# endif
114# ifndef FUTEX_FD
115# define FUTEX_FD 2
116# endif
Roland McGrath88812d62003-06-26 22:27:23 +0000117# ifndef FUTEX_REQUEUE
118# define FUTEX_REQUEUE 3
119# endif
Roland McGrath5a223472002-12-15 23:58:26 +0000120#endif
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000121
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000122#ifdef LINUX
Roland McGrath279d3782004-03-01 20:27:37 +0000123#include <sched.h>
Wichert Akkerman2e2553a1999-05-09 00:29:58 +0000124#include <asm/posix_types.h>
125#undef GETGROUPS_T
126#define GETGROUPS_T __kernel_gid_t
Roland McGrath83bd47a2003-11-13 22:32:26 +0000127#undef GETGROUPS32_T
128#define GETGROUPS32_T __kernel_gid32_t
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000129#endif /* LINUX */
130
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000131#if defined(LINUX) && defined(IA64)
132# include <asm/ptrace_offsets.h>
133# include <asm/rse.h>
134#endif
135
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000136#ifdef HAVE_PRCTL
137#include <sys/prctl.h>
138#endif
139
140#ifndef WCOREDUMP
141#define WCOREDUMP(status) ((status) & 0200)
142#endif
143
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000144/* WTA: this was `&& !defined(LINUXSPARC)', this seems unneeded though? */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000145#if defined(HAVE_PRCTL)
Roland McGrathd9f816f2004-09-04 03:39:20 +0000146static const struct xlat prctl_options[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000147#ifdef PR_MAXPROCS
148 { PR_MAXPROCS, "PR_MAXPROCS" },
149#endif
150#ifdef PR_ISBLOCKED
151 { PR_ISBLOCKED, "PR_ISBLOCKED" },
152#endif
153#ifdef PR_SETSTACKSIZE
154 { PR_SETSTACKSIZE, "PR_SETSTACKSIZE" },
155#endif
156#ifdef PR_GETSTACKSIZE
157 { PR_GETSTACKSIZE, "PR_GETSTACKSIZE" },
158#endif
159#ifdef PR_MAXPPROCS
160 { PR_MAXPPROCS, "PR_MAXPPROCS" },
161#endif
162#ifdef PR_UNBLKONEXEC
163 { PR_UNBLKONEXEC, "PR_UNBLKONEXEC" },
164#endif
165#ifdef PR_ATOMICSIM
166 { PR_ATOMICSIM, "PR_ATOMICSIM" },
167#endif
168#ifdef PR_SETEXITSIG
169 { PR_SETEXITSIG, "PR_SETEXITSIG" },
170#endif
171#ifdef PR_RESIDENT
172 { PR_RESIDENT, "PR_RESIDENT" },
173#endif
174#ifdef PR_ATTACHADDR
175 { PR_ATTACHADDR, "PR_ATTACHADDR" },
176#endif
177#ifdef PR_DETACHADDR
178 { PR_DETACHADDR, "PR_DETACHADDR" },
179#endif
180#ifdef PR_TERMCHILD
181 { PR_TERMCHILD, "PR_TERMCHILD" },
182#endif
183#ifdef PR_GETSHMASK
184 { PR_GETSHMASK, "PR_GETSHMASK" },
185#endif
186#ifdef PR_GETNSHARE
187 { PR_GETNSHARE, "PR_GETNSHARE" },
188#endif
Wichert Akkerman8829a551999-06-11 13:18:40 +0000189#ifdef PR_COREPID
190 { PR_COREPID, "PR_COREPID" },
191#endif
192#ifdef PR_ATTACHADDRPERM
193 { PR_ATTACHADDRPERM, "PR_ATTACHADDRPERM" },
194#endif
195#ifdef PR_PTHREADEXIT
196 { PR_PTHREADEXIT, "PR_PTHREADEXIT" },
197#endif
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000198#ifdef PR_SET_PDEATHSIG
199 { PR_SET_PDEATHSIG, "PR_SET_PDEATHSIG" },
200#endif
201#ifdef PR_GET_PDEATHSIG
202 { PR_GET_PDEATHSIG, "PR_GET_PDEATHSIG" },
203#endif
Dmitry V. Levinf02cf212008-09-03 00:54:40 +0000204#ifdef PR_GET_DUMPABLE
205 { PR_GET_DUMPABLE, "PR_GET_DUMPABLE" },
206#endif
207#ifdef PR_SET_DUMPABLE
208 { PR_SET_DUMPABLE, "PR_SET_DUMPABLE" },
209#endif
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000210#ifdef PR_GET_UNALIGN
211 { PR_GET_UNALIGN, "PR_GET_UNALIGN" },
212#endif
213#ifdef PR_SET_UNALIGN
214 { PR_SET_UNALIGN, "PR_SET_UNALIGN" },
215#endif
216#ifdef PR_GET_KEEPCAPS
Dmitry V. Levin8dd31dd2008-11-11 00:25:22 +0000217 { PR_GET_KEEPCAPS, "PR_GET_KEEPCAPS" },
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000218#endif
219#ifdef PR_SET_KEEPCAPS
Dmitry V. Levin8dd31dd2008-11-11 00:25:22 +0000220 { PR_SET_KEEPCAPS, "PR_SET_KEEPCAPS" },
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000221#endif
Roland McGrathe5039fb2007-11-03 23:58:07 +0000222#ifdef PR_GET_FPEMU
223 { PR_GET_FPEMU, "PR_GET_FPEMU" },
224#endif
225#ifdef PR_SET_FPEMU
226 { PR_SET_FPEMU, "PR_SET_FPEMU" },
227#endif
228#ifdef PR_GET_FPEXC
229 { PR_GET_FPEXC, "PR_GET_FPEXC" },
230#endif
231#ifdef PR_SET_FPEXC
232 { PR_SET_FPEXC, "PR_SET_FPEXC" },
233#endif
234#ifdef PR_GET_TIMING
235 { PR_GET_TIMING, "PR_GET_TIMING" },
236#endif
237#ifdef PR_SET_TIMING
238 { PR_SET_TIMING, "PR_SET_TIMING" },
239#endif
240#ifdef PR_SET_NAME
241 { PR_SET_NAME, "PR_SET_NAME" },
242#endif
243#ifdef PR_GET_NAME
244 { PR_GET_NAME, "PR_GET_NAME" },
245#endif
246#ifdef PR_GET_ENDIAN
247 { PR_GET_ENDIAN, "PR_GET_ENDIAN" },
248#endif
249#ifdef PR_SET_ENDIAN
250 { PR_SET_ENDIAN, "PR_SET_ENDIAN" },
251#endif
252#ifdef PR_GET_SECCOMP
253 { PR_GET_SECCOMP, "PR_GET_SECCOMP" },
254#endif
255#ifdef PR_SET_SECCOMP
256 { PR_SET_SECCOMP, "PR_SET_SECCOMP" },
257#endif
Dmitry V. Levin8dd31dd2008-11-11 00:25:22 +0000258#ifdef PR_GET_TSC
259 { PR_GET_TSC, "PR_GET_TSC" },
260#endif
261#ifdef PR_SET_TSC
262 { PR_SET_TSC, "PR_SET_TSC" },
263#endif
264#ifdef PR_GET_SECUREBITS
265 { PR_GET_SECUREBITS, "PR_GET_SECUREBITS" },
266#endif
267#ifdef PR_SET_SECUREBITS
268 { PR_SET_SECUREBITS, "PR_SET_SECUREBITS" },
269#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000270 { 0, NULL },
271};
272
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000273
Roland McGratha4d48532005-06-08 20:45:28 +0000274static const char *
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000275unalignctl_string (unsigned int ctl)
276{
277 static char buf[16];
278
279 switch (ctl) {
280#ifdef PR_UNALIGN_NOPRINT
281 case PR_UNALIGN_NOPRINT:
282 return "NOPRINT";
283#endif
284#ifdef PR_UNALIGN_SIGBUS
285 case PR_UNALIGN_SIGBUS:
286 return "SIGBUS";
287#endif
288 default:
289 break;
290 }
291 sprintf(buf, "%x", ctl);
292 return buf;
293}
294
295
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000296int
297sys_prctl(tcp)
298struct tcb *tcp;
299{
300 int i;
301
302 if (entering(tcp)) {
303 printxval(prctl_options, tcp->u_arg[0], "PR_???");
304 switch (tcp->u_arg[0]) {
305#ifdef PR_GETNSHARE
306 case PR_GETNSHARE:
307 break;
308#endif
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000309#ifdef PR_SET_PDEATHSIG
310 case PR_SET_PDEATHSIG:
311 tprintf(", %lu", tcp->u_arg[1]);
312 break;
313#endif
314#ifdef PR_GET_PDEATHSIG
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000315 case PR_GET_PDEATHSIG:
316 break;
317#endif
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000318#ifdef PR_SET_DUMPABLE
319 case PR_SET_DUMPABLE:
320 tprintf(", %lu", tcp->u_arg[1]);
321 break;
322#endif
323#ifdef PR_GET_DUMPABLE
324 case PR_GET_DUMPABLE:
325 break;
326#endif
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000327#ifdef PR_SET_UNALIGN
328 case PR_SET_UNALIGN:
329 tprintf(", %s", unalignctl_string(tcp->u_arg[1]));
330 break;
331#endif
332#ifdef PR_GET_UNALIGN
333 case PR_GET_UNALIGN:
334 tprintf(", %#lx", tcp->u_arg[1]);
335 break;
336#endif
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000337#ifdef PR_SET_KEEPCAPS
338 case PR_SET_KEEPCAPS:
339 tprintf(", %lu", tcp->u_arg[1]);
340 break;
341#endif
342#ifdef PR_GET_KEEPCAPS
343 case PR_GET_KEEPCAPS:
344 break;
345#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000346 default:
347 for (i = 1; i < tcp->u_nargs; i++)
348 tprintf(", %#lx", tcp->u_arg[i]);
349 break;
350 }
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000351 } else {
352 switch (tcp->u_arg[0]) {
353#ifdef PR_GET_PDEATHSIG
354 case PR_GET_PDEATHSIG:
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000355 if (umove(tcp, tcp->u_arg[1], &i) < 0)
356 tprintf(", %#lx", tcp->u_arg[1]);
357 else
358 tprintf(", {%u}", i);
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000359 break;
360#endif
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000361#ifdef PR_GET_DUMPABLE
362 case PR_GET_DUMPABLE:
363 return RVAL_UDECIMAL;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000364#endif
365#ifdef PR_GET_UNALIGN
366 case PR_GET_UNALIGN:
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000367 if (syserror(tcp) || umove(tcp, tcp->u_arg[1], &i) < 0)
368 break;
369 tcp->auxstr = unalignctl_string(i);
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000370 return RVAL_STR;
Dmitry V. Levin50f60132008-09-03 00:56:52 +0000371#endif
372#ifdef PR_GET_KEEPCAPS
373 case PR_GET_KEEPCAPS:
374 return RVAL_UDECIMAL;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000375#endif
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000376 default:
377 break;
378 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000379 }
380 return 0;
381}
382
383#endif /* HAVE_PRCTL */
384
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +0000385#if defined(FREEBSD) || defined(SUNOS4) || defined(SVR4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000386int
387sys_gethostid(tcp)
388struct tcb *tcp;
389{
390 if (exiting(tcp))
391 return RVAL_HEX;
392 return 0;
393}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +0000394#endif /* FREEBSD || SUNOS4 || SVR4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000395
396int
397sys_sethostname(tcp)
398struct tcb *tcp;
399{
400 if (entering(tcp)) {
401 printpathn(tcp, tcp->u_arg[0], tcp->u_arg[1]);
402 tprintf(", %lu", tcp->u_arg[1]);
403 }
404 return 0;
405}
406
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +0000407#if defined(ALPHA) || defined(FREEBSD) || defined(SUNOS4) || defined(SVR4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000408int
409sys_gethostname(tcp)
410struct tcb *tcp;
411{
412 if (exiting(tcp)) {
413 if (syserror(tcp))
414 tprintf("%#lx", tcp->u_arg[0]);
415 else
416 printpath(tcp, tcp->u_arg[0]);
417 tprintf(", %lu", tcp->u_arg[1]);
418 }
419 return 0;
420}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +0000421#endif /* ALPHA || FREEBSD || SUNOS4 || SVR4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000422
423int
424sys_setdomainname(tcp)
425struct tcb *tcp;
426{
427 if (entering(tcp)) {
428 printpathn(tcp, tcp->u_arg[0], tcp->u_arg[1]);
429 tprintf(", %lu", tcp->u_arg[1]);
430 }
431 return 0;
432}
433
Wichert Akkerman5daa0281999-03-15 19:49:42 +0000434#if !defined(LINUX)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000435
436int
437sys_getdomainname(tcp)
438struct tcb *tcp;
439{
440 if (exiting(tcp)) {
441 if (syserror(tcp))
442 tprintf("%#lx", tcp->u_arg[0]);
443 else
444 printpath(tcp, tcp->u_arg[0]);
445 tprintf(", %lu", tcp->u_arg[1]);
446 }
447 return 0;
448}
449#endif /* !LINUX */
450
451int
452sys_exit(tcp)
453struct tcb *tcp;
454{
455 if (exiting(tcp)) {
456 fprintf(stderr, "_exit returned!\n");
457 return -1;
458 }
459 /* special case: we stop tracing this process, finish line now */
460 tprintf("%ld) ", tcp->u_arg[0]);
461 tabto(acolumn);
462 tprintf("= ?");
Denys Vlasenkoef2fbf82009-01-06 21:45:06 +0000463 printtrailer();
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000464 return 0;
465}
466
467int
468internal_exit(tcp)
469struct tcb *tcp;
470{
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000471 if (entering(tcp)) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000472 tcp->flags |= TCB_EXITING;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000473#ifdef __NR_exit_group
Roland McGrath08267b82004-02-20 22:56:43 +0000474# ifdef IA64
475 if (ia32) {
476 if (tcp->scno == 252)
477 tcp->flags |= TCB_GROUP_EXITING;
478 } else
479# endif
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000480 if (known_scno(tcp) == __NR_exit_group)
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000481 tcp->flags |= TCB_GROUP_EXITING;
482#endif
483 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000484 return 0;
485}
486
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000487#ifdef USE_PROCFS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000488
489int
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000490sys_fork(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000491{
Dmitry V. Levin21a75342008-09-03 01:22:18 +0000492 if (exiting(tcp) && !syserror(tcp)) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000493 if (getrval2(tcp)) {
494 tcp->auxstr = "child process";
495 return RVAL_UDECIMAL | RVAL_STR;
496 }
497 }
498 return 0;
499}
500
John Hughes4e36a812001-04-18 15:11:51 +0000501#if UNIXWARE > 2
502
503int
504sys_rfork(tcp)
505struct tcb *tcp;
506{
507 if (entering(tcp)) {
508 tprintf ("%ld", tcp->u_arg[0]);
509 }
Dmitry V. Levin21a75342008-09-03 01:22:18 +0000510 else if (!syserror(tcp)) {
John Hughes4e36a812001-04-18 15:11:51 +0000511 if (getrval2(tcp)) {
512 tcp->auxstr = "child process";
513 return RVAL_UDECIMAL | RVAL_STR;
514 }
515 }
516 return 0;
517}
518
519#endif
520
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000521int
522internal_fork(tcp)
523struct tcb *tcp;
524{
525 struct tcb *tcpchild;
526
527 if (exiting(tcp)) {
Roland McGrathf3a0e1b2003-02-20 02:45:22 +0000528#ifdef SYS_rfork
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000529 if (known_scno(tcp) == SYS_rfork && !(tcp->u_arg[0]&RFPROC))
Roland McGrathf3a0e1b2003-02-20 02:45:22 +0000530 return 0;
531#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000532 if (getrval2(tcp))
533 return 0;
534 if (!followfork)
535 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000536 if (syserror(tcp))
537 return 0;
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000538 tcpchild = alloctcb(tcp->u_rval);
Wichert Akkerman2e4ffe52000-09-03 23:57:48 +0000539 if (proc_open(tcpchild, 2) < 0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000540 droptcb(tcpchild);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000541 }
542 return 0;
543}
544
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +0000545#else /* !USE_PROCFS */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000546
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000547#ifdef LINUX
548
549/* defines copied from linux/sched.h since we can't include that
550 * ourselves (it conflicts with *lots* of libc includes)
551 */
552#define CSIGNAL 0x000000ff /* signal mask to be sent at exit */
553#define CLONE_VM 0x00000100 /* set if VM shared between processes */
554#define CLONE_FS 0x00000200 /* set if fs info shared between processes */
555#define CLONE_FILES 0x00000400 /* set if open files shared between processes */
556#define CLONE_SIGHAND 0x00000800 /* set if signal handlers shared */
Roland McGrath909875b2002-12-22 03:34:36 +0000557#define CLONE_IDLETASK 0x00001000 /* kernel-only flag */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000558#define CLONE_PTRACE 0x00002000 /* set if we want to let tracing continue on the child too */
559#define CLONE_VFORK 0x00004000 /* set if the parent wants the child to wake it up on mm_release */
560#define CLONE_PARENT 0x00008000 /* set if we want to have the same parent as the cloner */
Roland McGrath909875b2002-12-22 03:34:36 +0000561#define CLONE_THREAD 0x00010000 /* Same thread group? */
562#define CLONE_NEWNS 0x00020000 /* New namespace group? */
563#define CLONE_SYSVSEM 0x00040000 /* share system V SEM_UNDO semantics */
564#define CLONE_SETTLS 0x00080000 /* create a new TLS for the child */
565#define CLONE_PARENT_SETTID 0x00100000 /* set the TID in the parent */
566#define CLONE_CHILD_CLEARTID 0x00200000 /* clear the TID in the child */
567#define CLONE_DETACHED 0x00400000 /* parent wants no child-exit signal */
568#define CLONE_UNTRACED 0x00800000 /* set if the tracing process can't force CLONE_PTRACE on this clone */
569#define CLONE_CHILD_SETTID 0x01000000 /* set the TID in the child */
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000570
Roland McGrathd9f816f2004-09-04 03:39:20 +0000571static const struct xlat clone_flags[] = {
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000572 { CLONE_VM, "CLONE_VM" },
573 { CLONE_FS, "CLONE_FS" },
574 { CLONE_FILES, "CLONE_FILES" },
575 { CLONE_SIGHAND, "CLONE_SIGHAND" },
Roland McGrath909875b2002-12-22 03:34:36 +0000576 { CLONE_IDLETASK, "CLONE_IDLETASK"},
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000577 { CLONE_PTRACE, "CLONE_PTRACE" },
578 { CLONE_VFORK, "CLONE_VFORK" },
579 { CLONE_PARENT, "CLONE_PARENT" },
Roland McGrath909875b2002-12-22 03:34:36 +0000580 { CLONE_THREAD, "CLONE_THREAD" },
581 { CLONE_NEWNS, "CLONE_NEWNS" },
582 { CLONE_SYSVSEM, "CLONE_SYSVSEM" },
583 { CLONE_SETTLS, "CLONE_SETTLS" },
584 { CLONE_PARENT_SETTID,"CLONE_PARENT_SETTID" },
585 { CLONE_CHILD_CLEARTID,"CLONE_CHILD_CLEARTID" },
586 { CLONE_DETACHED, "CLONE_DETACHED" },
587 { CLONE_UNTRACED, "CLONE_UNTRACED" },
588 { CLONE_CHILD_SETTID,"CLONE_CHILD_SETTID" },
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000589 { 0, NULL },
590};
591
Roland McGrath909875b2002-12-22 03:34:36 +0000592# ifdef I386
593# include <asm/ldt.h>
Roland McGrath7decfb22004-03-01 22:10:52 +0000594# ifdef HAVE_STRUCT_USER_DESC
595# define modify_ldt_ldt_s user_desc
596# endif
Roland McGrath909875b2002-12-22 03:34:36 +0000597extern void print_ldt_entry();
598# endif
599
Roland McGrath9677b3a2003-03-12 09:54:36 +0000600# if defined IA64
601# define ARG_FLAGS 0
602# define ARG_STACK 1
Roland McGratha4f9f2d2005-06-07 23:21:20 +0000603# define ARG_STACKSIZE (known_scno(tcp) == SYS_clone2 ? 2 : -1)
604# define ARG_PTID (known_scno(tcp) == SYS_clone2 ? 3 : 2)
605# define ARG_CTID (known_scno(tcp) == SYS_clone2 ? 4 : 3)
606# define ARG_TLS (known_scno(tcp) == SYS_clone2 ? 5 : 4)
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +0000607# elif defined S390 || defined S390X || defined CRISV10 || defined CRISV32
Roland McGrath9677b3a2003-03-12 09:54:36 +0000608# define ARG_STACK 0
609# define ARG_FLAGS 1
610# define ARG_PTID 2
Roland McGrathfe5fdb22003-05-23 00:29:05 +0000611# define ARG_CTID 3
612# define ARG_TLS 4
Roland McGrath9c555e72003-07-09 09:47:59 +0000613# elif defined X86_64 || defined ALPHA
Roland McGrath361aac52003-03-18 07:43:42 +0000614# define ARG_FLAGS 0
615# define ARG_STACK 1
616# define ARG_PTID 2
617# define ARG_CTID 3
618# define ARG_TLS 4
Roland McGrath9677b3a2003-03-12 09:54:36 +0000619# else
620# define ARG_FLAGS 0
621# define ARG_STACK 1
622# define ARG_PTID 2
623# define ARG_TLS 3
624# define ARG_CTID 4
625# endif
626
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000627int
628sys_clone(tcp)
629struct tcb *tcp;
630{
631 if (exiting(tcp)) {
Roland McGrath9677b3a2003-03-12 09:54:36 +0000632 unsigned long flags = tcp->u_arg[ARG_FLAGS];
633 tprintf("child_stack=%#lx, ", tcp->u_arg[ARG_STACK]);
634# ifdef ARG_STACKSIZE
635 if (ARG_STACKSIZE != -1)
636 tprintf("stack_size=%#lx, ",
637 tcp->u_arg[ARG_STACKSIZE]);
Roland McGrathb4968be2003-01-20 09:04:33 +0000638# endif
Roland McGrath9677b3a2003-03-12 09:54:36 +0000639 tprintf("flags=");
Roland McGrathb2dee132005-06-01 19:02:36 +0000640 printflags(clone_flags, flags &~ CSIGNAL, NULL);
Roland McGrath984154d2003-05-23 01:08:42 +0000641 if ((flags & CSIGNAL) != 0)
642 tprintf("|%s", signame(flags & CSIGNAL));
Roland McGrathb4968be2003-01-20 09:04:33 +0000643 if ((flags & (CLONE_PARENT_SETTID|CLONE_CHILD_SETTID
Roland McGrath9677b3a2003-03-12 09:54:36 +0000644 |CLONE_CHILD_CLEARTID|CLONE_SETTLS)) == 0)
Roland McGrath909875b2002-12-22 03:34:36 +0000645 return 0;
Roland McGrath6f67a982003-03-21 07:33:15 +0000646 if (flags & CLONE_PARENT_SETTID)
647 tprintf(", parent_tidptr=%#lx", tcp->u_arg[ARG_PTID]);
Roland McGrathb4968be2003-01-20 09:04:33 +0000648 if (flags & CLONE_SETTLS) {
Roland McGrath9677b3a2003-03-12 09:54:36 +0000649# ifdef I386
Roland McGrath909875b2002-12-22 03:34:36 +0000650 struct modify_ldt_ldt_s copy;
Roland McGrath9677b3a2003-03-12 09:54:36 +0000651 if (umove(tcp, tcp->u_arg[ARG_TLS], &copy) != -1) {
Roland McGrath909875b2002-12-22 03:34:36 +0000652 tprintf(", {entry_number:%d, ",
653 copy.entry_number);
654 if (!verbose(tcp))
655 tprintf("...}");
656 else
657 print_ldt_entry(&copy);
658 }
659 else
Roland McGrath9677b3a2003-03-12 09:54:36 +0000660# endif
Roland McGrath43f2c842003-03-12 09:58:14 +0000661 tprintf(", tls=%#lx", tcp->u_arg[ARG_TLS]);
Roland McGrath909875b2002-12-22 03:34:36 +0000662 }
Roland McGrath9677b3a2003-03-12 09:54:36 +0000663 if (flags & (CLONE_CHILD_SETTID|CLONE_CHILD_CLEARTID))
664 tprintf(", child_tidptr=%#lx", tcp->u_arg[ARG_CTID]);
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000665 }
666 return 0;
667}
Dmitry V. Levin95ebf5a2006-10-13 20:25:12 +0000668
669int
670sys_unshare(struct tcb *tcp)
671{
672 if (entering(tcp))
673 printflags(clone_flags, tcp->u_arg[0], "CLONE_???");
674 return 0;
675}
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000676#endif
677
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000678int
679sys_fork(tcp)
680struct tcb *tcp;
681{
682 if (exiting(tcp))
683 return RVAL_UDECIMAL;
684 return 0;
685}
686
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000687int
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000688change_syscall(struct tcb *tcp, int new)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000689{
690#if defined(LINUX)
691#if defined(I386)
692 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath5a223472002-12-15 23:58:26 +0000693 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_EAX * 4), new) < 0)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000694 return -1;
695 return 0;
Michal Ludvig0e035502002-09-23 15:41:01 +0000696#elif defined(X86_64)
697 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath5a223472002-12-15 23:58:26 +0000698 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(ORIG_RAX * 8), new) < 0)
Michal Ludvig0e035502002-09-23 15:41:01 +0000699 return -1;
700 return 0;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000701#elif defined(POWERPC)
Roland McGratheb285352003-01-14 09:59:00 +0000702 if (ptrace(PTRACE_POKEUSER, tcp->pid,
703 (char*)(sizeof(unsigned long)*PT_R0), new) < 0)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000704 return -1;
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000705 return 0;
Michal Ludvig10a88d02002-10-07 14:31:00 +0000706#elif defined(S390) || defined(S390X)
707 /* s390 linux after 2.4.7 has a hook in entry.S to allow this */
708 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GPR2), new)<0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000709 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000710 return 0;
711#elif defined(M68K)
Wichert Akkermanc7926982000-04-10 22:22:31 +0000712 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*PT_ORIG_D0), new)<0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000713 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000714 return 0;
Roland McGrath6d1a65c2004-07-12 07:44:08 +0000715#elif defined(SPARC) || defined(SPARC64)
Wichert Akkerman00a82ee2001-03-28 20:29:17 +0000716 struct regs regs;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000717 if (ptrace(PTRACE_GETREGS, tcp->pid, (char*)&regs, 0)<0)
718 return -1;
Wichert Akkerman00a82ee2001-03-28 20:29:17 +0000719 regs.r_g1=new;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000720 if (ptrace(PTRACE_SETREGS, tcp->pid, (char*)&regs, 0)<0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000721 return -1;
Wichert Akkerman5ae21ea2000-05-01 01:53:59 +0000722 return 0;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000723#elif defined(MIPS)
Wichert Akkermanc7926982000-04-10 22:22:31 +0000724 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_V0), new)<0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000725 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000726 return 0;
727#elif defined(ALPHA)
Wichert Akkermanc7926982000-04-10 22:22:31 +0000728 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_A3), new)<0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000729 return -1;
730 return 0;
731#elif defined(AVR32)
732 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_R8), new) < 0)
733 return -1;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000734 return 0;
Dmitry V. Levin87ea1f42008-11-10 22:21:41 +0000735#elif defined(BFIN)
736 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_P0), new)<0)
737 return -1;
738 return 0;
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000739#elif defined(IA64)
Roland McGrath08267b82004-02-20 22:56:43 +0000740 if (ia32) {
741 switch (new) {
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000742 case 2:
743 break; /* x86 SYS_fork */
744 case SYS_clone:
745 new = 120;
746 break;
747 default:
Roland McGrath08267b82004-02-20 22:56:43 +0000748 fprintf(stderr, "%s: unexpected syscall %d\n",
749 __FUNCTION__, new);
750 return -1;
751 }
752 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R1), new)<0)
753 return -1;
754 } else if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R15), new)<0)
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000755 return -1;
756 return 0;
Wichert Akkermanc1652e22001-03-27 12:17:16 +0000757#elif defined(HPPA)
758 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GR20), new)<0)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000759 return -1;
Wichert Akkermanc1652e22001-03-27 12:17:16 +0000760 return 0;
Wichert Akkermanccef6372002-05-01 16:39:22 +0000761#elif defined(SH)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000762 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*(REG_REG0+3)), new)<0)
763 return -1;
764 return 0;
Roland McGrathf5a47772003-06-26 22:40:42 +0000765#elif defined(SH64)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000766 /* Top half of reg encodes the no. of args n as 0x1n.
767 Assume 0 args as kernel never actually checks... */
768 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_SYSCALL),
769 0x100000 | new) < 0)
770 return -1;
771 return 0;
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +0000772#elif defined(CRISV10) || defined(CRISV32)
773 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*PT_R9), new) < 0)
774 return -1;
775 return 0;
Roland McGrathf691bd22006-04-25 07:34:41 +0000776#elif defined(ARM)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000777 /* Some kernels support this, some (pre-2.6.16 or so) don't. */
Roland McGrathf691bd22006-04-25 07:34:41 +0000778# ifndef PTRACE_SET_SYSCALL
779# define PTRACE_SET_SYSCALL 23
780# endif
781
Denys Vlasenko4dedd562009-02-24 15:17:53 +0000782 if (do_ptrace(PTRACE_SET_SYSCALL, tcp, NULL, new) != 0)
Roland McGrathf691bd22006-04-25 07:34:41 +0000783 return -1;
784
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000785 return 0;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000786#else
787#warning Do not know how to handle change_syscall for this architecture
788#endif /* architecture */
789#endif /* LINUX */
790 return -1;
791}
792
Roland McGratha4d48532005-06-08 20:45:28 +0000793#if 0
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000794int
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000795setarg(tcp, argnum)
796 struct tcb *tcp;
797 int argnum;
798{
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000799#if defined(AVR32)
800 {
801 errno = 0;
802 if (argnum == 0)
803 ptrace(PTRACE_POKEUSER, tcp->pid,
804 (char *)(REG_R12_ORIG),
805 tcp->u_arg[argnum]);
806 else if (argnum < 4)
807 /* r11 .. r9 */
808 ptrace(PTRACE_POKEUSER, tcp->pid,
809 (char *)(REG_R12 - 4 * argnum),
810 tcp->u_arg[argnum]);
811 else if (argnum < 5)
812 /* r5 */
813 ptrace(PTRACE_POKEUSER, tcp->pid,
814 (char *)(REG_R5),
815 tcp->u_arg[argnum]);
816 else if (argnum < 6)
817 /* r3 */
818 ptrace(PTRACE_POKEUSER, tcp->pid,
819 (char *)(REG_R3),
820 tcp->u_arg[argnum]);
821 else
822 return -E2BIG;
823 if (errno)
824 return -1;
825 }
826#elif defined(IA64)
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000827 {
828 unsigned long *bsp, *ap;
829
Denys Vlasenko932fc7d2008-12-16 18:18:40 +0000830 if (upeek(tcp, PT_AR_BSP, (long *) &bsp) , 0)
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000831 return -1;
832
833 ap = ia64_rse_skip_regs(bsp, argnum);
834 errno = 0;
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000835 ptrace(PTRACE_POKEDATA, tcp->pid, (char *) ap, tcp->u_arg[argnum]);
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000836 if (errno)
837 return -1;
838
839 }
Wichert Akkerman12f75d12000-02-14 16:23:40 +0000840#elif defined(I386)
841 {
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000842 ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*argnum), tcp->u_arg[argnum]);
Wichert Akkerman12f75d12000-02-14 16:23:40 +0000843 if (errno)
844 return -1;
845 }
Michal Ludvig0e035502002-09-23 15:41:01 +0000846#elif defined(X86_64)
847 {
848 ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(8*(long)argnum), tcp->u_arg[argnum]);
849 if (errno)
850 return -1;
851 }
Roland McGrath3bb9c3d2002-12-16 20:40:48 +0000852#elif defined(POWERPC)
853#ifndef PT_ORIG_R3
854#define PT_ORIG_R3 34
855#endif
856 {
857 ptrace(PTRACE_POKEUSER, tcp->pid,
Roland McGratheb285352003-01-14 09:59:00 +0000858 (char*)((argnum==0 ? PT_ORIG_R3 : argnum+PT_R3)*sizeof(unsigned long)),
Roland McGrath3bb9c3d2002-12-16 20:40:48 +0000859 tcp->u_arg[argnum]);
860 if (errno)
861 return -1;
862 }
Ralf Baechlee3816102000-08-01 00:06:06 +0000863#elif defined(MIPS)
864 {
865 errno = 0;
866 if (argnum < 4)
867 ptrace(PTRACE_POKEUSER, tcp->pid,
868 (char*)(REG_A0 + argnum), tcp->u_arg[argnum]);
869 else {
870 unsigned long *sp;
871
Denys Vlasenko932fc7d2008-12-16 18:18:40 +0000872 if (upeek(tcp, REG_SP, (long *) &sp) , 0)
Ralf Baechlee3816102000-08-01 00:06:06 +0000873 return -1;
874
875 ptrace(PTRACE_POKEDATA, tcp->pid,
876 (char*)(sp + argnum - 4), tcp->u_arg[argnum]);
877 }
878 if (errno)
879 return -1;
880 }
Michal Ludvig10a88d02002-10-07 14:31:00 +0000881#elif defined(S390) || defined(S390X)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000882 {
Michal Ludvig10a88d02002-10-07 14:31:00 +0000883 if(argnum <= 5)
884 ptrace(PTRACE_POKEUSER, tcp->pid,
Roland McGrath5a223472002-12-15 23:58:26 +0000885 (char *) (argnum==0 ? PT_ORIGGPR2 :
886 PT_GPR2 + argnum*sizeof(long)),
Michal Ludvig10a88d02002-10-07 14:31:00 +0000887 tcp->u_arg[argnum]);
888 else
889 return -E2BIG;
890 if (errno)
891 return -1;
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000892 }
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000893#else
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000894# warning Sorry, setargs not implemented for this architecture.
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000895#endif
896 return 0;
897}
Roland McGratha4d48532005-06-08 20:45:28 +0000898#endif
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000899
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000900#if defined SYS_clone || defined SYS_clone2
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000901int
Denys Vlasenko7e0615f2009-01-28 19:00:54 +0000902internal_clone(struct tcb *tcp)
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000903{
Ulrich Drepper90512f01999-12-24 07:22:25 +0000904 struct tcb *tcpchild;
Denys Vlasenko7e0615f2009-01-28 19:00:54 +0000905 int pid, bpt;
906
Denys Vlasenko84e20af2009-02-10 16:03:20 +0000907 if (!followfork)
908 return 0;
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000909 if (entering(tcp)) {
Denys Vlasenko7e0615f2009-01-28 19:00:54 +0000910 setbpt(tcp);
911 return 0;
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000912 } else {
Denys Vlasenko7e0615f2009-01-28 19:00:54 +0000913 bpt = tcp->flags & TCB_BPTSET;
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000914
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000915 if (syserror(tcp)) {
916 if (bpt)
917 clearbpt(tcp);
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000918 return 0;
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000919 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000920
921 pid = tcp->u_rval;
Denys Vlasenko84e20af2009-02-10 16:03:20 +0000922 /* Should not happen, but bugs often cause bogus value here. */
Denys Vlasenko7e0615f2009-01-28 19:00:54 +0000923 if (pid <= 1
924 || (sizeof(pid) != sizeof(tcp->u_rval) && pid != tcp->u_rval)
925 ) {
926 if (bpt)
927 clearbpt(tcp);
928 fprintf(stderr, "bogus clone() return value %lx!\n", tcp->u_rval);
929 return 0;
930 }
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000931
932#ifdef CLONE_PTRACE /* See new setbpt code. */
933 tcpchild = pid2tcb(pid);
934 if (tcpchild != NULL) {
935 /* The child already reported its startup trap
936 before the parent reported its syscall return. */
937 if ((tcpchild->flags
938 & (TCB_STARTUP|TCB_ATTACHED|TCB_SUSPENDED))
939 != (TCB_STARTUP|TCB_ATTACHED|TCB_SUSPENDED))
940 fprintf(stderr, "\
941[preattached child %d of %d in weird state!]\n",
942 pid, tcp->pid);
943 }
944 else
945#endif
Denys Vlasenkodb78f762009-01-26 12:55:40 +0000946 {
Denys Vlasenkodb78f762009-01-26 12:55:40 +0000947 tcpchild = alloctcb(pid);
948 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000949
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000950#ifndef CLONE_PTRACE
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000951 /* Attach to the new child */
952 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) < 0) {
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000953 if (bpt)
954 clearbpt(tcp);
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000955 perror("PTRACE_ATTACH");
956 fprintf(stderr, "Too late?\n");
957 droptcb(tcpchild);
958 return 0;
959 }
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000960#endif
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000961
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000962 if (bpt)
963 clearbpt(tcp);
964
Ulrich Drepper90512f01999-12-24 07:22:25 +0000965 tcpchild->flags |= TCB_ATTACHED;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000966 /* Child has BPT too, must be removed on first occasion. */
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000967 if (bpt) {
968 tcpchild->flags |= TCB_BPTSET;
969 tcpchild->baddr = tcp->baddr;
970 memcpy(tcpchild->inst, tcp->inst,
971 sizeof tcpchild->inst);
972 }
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000973 tcpchild->parent = tcp;
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +0000974 tcp->nchildren++;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000975 if (tcpchild->flags & TCB_SUSPENDED) {
976 /* The child was born suspended, due to our having
977 forced CLONE_PTRACE. */
978 if (bpt)
979 clearbpt(tcpchild);
980
981 tcpchild->flags &= ~(TCB_SUSPENDED|TCB_STARTUP);
Denys Vlasenkof9a7e632009-01-17 00:21:31 +0000982 /* TCB_SUSPENDED tasks are not collected by waitpid
983 * loop, and left stopped. Restart it:
984 */
Denys Vlasenko732d1bf2008-12-17 19:21:59 +0000985 if (ptrace_restart(PTRACE_SYSCALL, tcpchild, 0) < 0)
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000986 return -1;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000987
988 if (!qflag)
989 fprintf(stderr, "\
990Process %u resumed (parent %d ready)\n",
991 pid, tcp->pid);
992 }
993 else {
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000994 if (!qflag)
995 fprintf(stderr, "Process %d attached\n", pid);
996 }
997
998#ifdef TCB_CLONE_THREAD
Roland McGrath984154d2003-05-23 01:08:42 +0000999 {
1000 /*
1001 * Save the flags used in this call,
1002 * in case we point TCP to our parent below.
1003 */
1004 int call_flags = tcp->u_arg[ARG_FLAGS];
1005 if ((tcp->flags & TCB_CLONE_THREAD) &&
1006 tcp->parent != NULL) {
1007 /* The parent in this clone is itself a
1008 thread belonging to another process.
1009 There is no meaning to the parentage
1010 relationship of the new child with the
1011 thread, only with the process. We
1012 associate the new thread with our
1013 parent. Since this is done for every
1014 new thread, there will never be a
1015 TCB_CLONE_THREAD process that has
1016 children. */
1017 --tcp->nchildren;
1018 tcp = tcp->parent;
1019 tcpchild->parent = tcp;
1020 ++tcp->nchildren;
1021 }
1022 if (call_flags & CLONE_THREAD) {
1023 tcpchild->flags |= TCB_CLONE_THREAD;
1024 ++tcp->nclone_threads;
1025 }
1026 if (call_flags & CLONE_DETACHED) {
1027 tcpchild->flags |= TCB_CLONE_DETACHED;
1028 ++tcp->nclone_detached;
1029 }
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001030 }
1031#endif
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00001032 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +00001033 return 0;
1034}
1035#endif
1036
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001037int
1038internal_fork(tcp)
1039struct tcb *tcp;
1040{
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001041#ifdef LINUX
1042 /* We do special magic with clone for any clone or fork. */
1043 return internal_clone(tcp);
1044#else
1045
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001046 struct tcb *tcpchild;
1047 int pid;
Denys Vlasenko84e20af2009-02-10 16:03:20 +00001048 int follow = 1;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001049
1050#ifdef SYS_vfork
Roland McGratha4f9f2d2005-06-07 23:21:20 +00001051 if (known_scno(tcp) == SYS_vfork) {
Nate Sammonsccd8f211999-03-29 22:57:54 +00001052 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath41c48222008-07-18 00:25:10 +00001053 if (change_syscall(tcp, SYS_fork) < 0)
Denys Vlasenko84e20af2009-02-10 16:03:20 +00001054 follow = 0;
Nate Sammonsccd8f211999-03-29 22:57:54 +00001055 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001056#endif
Denys Vlasenko84e20af2009-02-10 16:03:20 +00001057 if (!followfork || !follow)
1058 return 0;
1059
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001060 if (entering(tcp)) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001061 if (setbpt(tcp) < 0)
1062 return 0;
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00001063 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001064 else {
1065 int bpt = tcp->flags & TCB_BPTSET;
1066
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001067 if (bpt)
1068 clearbpt(tcp);
1069
1070 if (syserror(tcp))
1071 return 0;
1072
1073 pid = tcp->u_rval;
Denys Vlasenko418d66a2009-01-17 01:52:54 +00001074 tcpchild = alloctcb(pid);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001075#ifdef LINUX
Wichert Akkermanc1652e22001-03-27 12:17:16 +00001076#ifdef HPPA
1077 /* The child must have run before it can be attached. */
1078 /* This must be a bug in the parisc kernel, but I havn't
1079 * identified it yet. Seems to be an issue associated
1080 * with attaching to a process (which sends it a signal)
1081 * before that process has ever been scheduled. When
1082 * debugging, I started seeing crashes in
1083 * arch/parisc/kernel/signal.c:do_signal(), apparently
1084 * caused by r8 getting corrupt over the dequeue_signal()
1085 * call. Didn't make much sense though...
1086 */
1087 {
1088 struct timeval tv;
1089 tv.tv_sec = 0;
1090 tv.tv_usec = 10000;
1091 select(0, NULL, NULL, NULL, &tv);
1092 }
1093#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001094 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) < 0) {
1095 perror("PTRACE_ATTACH");
1096 fprintf(stderr, "Too late?\n");
1097 droptcb(tcpchild);
1098 return 0;
1099 }
1100#endif /* LINUX */
1101#ifdef SUNOS4
1102#ifdef oldway
1103 /* The child must have run before it can be attached. */
1104 {
1105 struct timeval tv;
1106 tv.tv_sec = 0;
1107 tv.tv_usec = 10000;
1108 select(0, NULL, NULL, NULL, &tv);
1109 }
1110 if (ptrace(PTRACE_ATTACH, pid, (char *)1, 0) < 0) {
1111 perror("PTRACE_ATTACH");
1112 fprintf(stderr, "Too late?\n");
1113 droptcb(tcpchild);
1114 return 0;
1115 }
1116#else /* !oldway */
1117 /* Try to catch the new process as soon as possible. */
1118 {
1119 int i;
1120 for (i = 0; i < 1024; i++)
1121 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) >= 0)
1122 break;
1123 if (i == 1024) {
1124 perror("PTRACE_ATTACH");
1125 fprintf(stderr, "Too late?\n");
1126 droptcb(tcpchild);
1127 return 0;
1128 }
1129 }
1130#endif /* !oldway */
1131#endif /* SUNOS4 */
1132 tcpchild->flags |= TCB_ATTACHED;
1133 /* Child has BPT too, must be removed on first occasion */
1134 if (bpt) {
1135 tcpchild->flags |= TCB_BPTSET;
1136 tcpchild->baddr = tcp->baddr;
1137 memcpy(tcpchild->inst, tcp->inst,
1138 sizeof tcpchild->inst);
1139 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001140 tcpchild->parent = tcp;
1141 tcp->nchildren++;
1142 if (!qflag)
1143 fprintf(stderr, "Process %d attached\n", pid);
1144 }
1145 return 0;
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001146#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001147}
1148
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001149#endif /* !USE_PROCFS */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001150
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001151#if defined(SUNOS4) || defined(LINUX) || defined(FREEBSD)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001152
1153int
1154sys_vfork(tcp)
1155struct tcb *tcp;
1156{
1157 if (exiting(tcp))
1158 return RVAL_UDECIMAL;
1159 return 0;
1160}
1161
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001162#endif /* SUNOS4 || LINUX || FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001163
1164#ifndef LINUX
1165
1166static char idstr[16];
1167
1168int
1169sys_getpid(tcp)
1170struct tcb *tcp;
1171{
1172 if (exiting(tcp)) {
1173 sprintf(idstr, "ppid %lu", getrval2(tcp));
1174 tcp->auxstr = idstr;
1175 return RVAL_STR;
1176 }
1177 return 0;
1178}
1179
1180int
1181sys_getuid(tcp)
1182struct tcb *tcp;
1183{
1184 if (exiting(tcp)) {
1185 sprintf(idstr, "euid %lu", getrval2(tcp));
1186 tcp->auxstr = idstr;
1187 return RVAL_STR;
1188 }
1189 return 0;
1190}
1191
1192int
1193sys_getgid(tcp)
1194struct tcb *tcp;
1195{
1196 if (exiting(tcp)) {
1197 sprintf(idstr, "egid %lu", getrval2(tcp));
1198 tcp->auxstr = idstr;
1199 return RVAL_STR;
1200 }
1201 return 0;
1202}
1203
1204#endif /* !LINUX */
1205
1206#ifdef LINUX
1207
1208int
1209sys_setuid(tcp)
1210struct tcb *tcp;
1211{
1212 if (entering(tcp)) {
1213 tprintf("%u", (uid_t) tcp->u_arg[0]);
1214 }
1215 return 0;
1216}
1217
1218int
1219sys_setgid(tcp)
1220struct tcb *tcp;
1221{
1222 if (entering(tcp)) {
1223 tprintf("%u", (gid_t) tcp->u_arg[0]);
1224 }
1225 return 0;
1226}
1227
1228int
Denys Vlasenko1d632462009-04-14 12:51:00 +00001229sys_getresuid(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001230{
1231 if (exiting(tcp)) {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001232 __kernel_uid_t uid;
1233 if (syserror(tcp))
1234 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1235 tcp->u_arg[1], tcp->u_arg[2]);
1236 else {
1237 if (umove(tcp, tcp->u_arg[0], &uid) < 0)
1238 tprintf("%#lx, ", tcp->u_arg[0]);
1239 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001240 tprintf("[%lu], ", (unsigned long) uid);
Roland McGrath9bd6b422003-02-24 07:13:51 +00001241 if (umove(tcp, tcp->u_arg[1], &uid) < 0)
1242 tprintf("%#lx, ", tcp->u_arg[1]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001243 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001244 tprintf("[%lu], ", (unsigned long) uid);
Roland McGrath9bd6b422003-02-24 07:13:51 +00001245 if (umove(tcp, tcp->u_arg[2], &uid) < 0)
1246 tprintf("%#lx", tcp->u_arg[2]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001247 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001248 tprintf("[%lu]", (unsigned long) uid);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001249 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001250 }
1251 return 0;
1252}
1253
1254int
1255sys_getresgid(tcp)
1256struct tcb *tcp;
1257{
1258 if (exiting(tcp)) {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001259 __kernel_gid_t gid;
1260 if (syserror(tcp))
1261 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1262 tcp->u_arg[1], tcp->u_arg[2]);
1263 else {
1264 if (umove(tcp, tcp->u_arg[0], &gid) < 0)
1265 tprintf("%#lx, ", tcp->u_arg[0]);
1266 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001267 tprintf("[%lu], ", (unsigned long) gid);
Roland McGrathd2450922003-02-24 10:18:07 +00001268 if (umove(tcp, tcp->u_arg[1], &gid) < 0)
1269 tprintf("%#lx, ", tcp->u_arg[1]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001270 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001271 tprintf("[%lu], ", (unsigned long) gid);
Roland McGrathd2450922003-02-24 10:18:07 +00001272 if (umove(tcp, tcp->u_arg[2], &gid) < 0)
1273 tprintf("%#lx", tcp->u_arg[2]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001274 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001275 tprintf("[%lu]", (unsigned long) gid);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001276 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001277 }
1278 return 0;
1279}
1280
1281#endif /* LINUX */
1282
1283int
1284sys_setreuid(tcp)
1285struct tcb *tcp;
1286{
1287 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001288 printuid("", tcp->u_arg[0]);
1289 printuid(", ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001290 }
1291 return 0;
1292}
1293
1294int
1295sys_setregid(tcp)
1296struct tcb *tcp;
1297{
1298 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001299 printuid("", tcp->u_arg[0]);
1300 printuid(", ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001301 }
1302 return 0;
1303}
1304
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001305#if defined(LINUX) || defined(FREEBSD)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001306int
1307sys_setresuid(tcp)
1308 struct tcb *tcp;
1309{
1310 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001311 printuid("", tcp->u_arg[0]);
1312 printuid(", ", tcp->u_arg[1]);
1313 printuid(", ", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001314 }
1315 return 0;
1316}
1317int
1318sys_setresgid(tcp)
1319 struct tcb *tcp;
1320{
1321 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001322 printuid("", tcp->u_arg[0]);
1323 printuid(", ", tcp->u_arg[1]);
1324 printuid(", ", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001325 }
1326 return 0;
1327}
1328
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001329#endif /* LINUX || FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001330
1331int
1332sys_setgroups(tcp)
1333struct tcb *tcp;
1334{
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001335 if (entering(tcp)) {
Roland McGrathaa524c82005-06-01 19:22:06 +00001336 unsigned long len, size, start, cur, end, abbrev_end;
1337 GETGROUPS_T gid;
1338 int failed = 0;
1339
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001340 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001341 tprintf("%lu, ", len);
1342 if (len == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001343 tprintf("[]");
1344 return 0;
1345 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001346 start = tcp->u_arg[1];
1347 if (start == 0) {
1348 tprintf("NULL");
1349 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001350 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001351 size = len * sizeof(gid);
1352 end = start + size;
1353 if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
1354 tprintf("%#lx", start);
1355 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001356 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001357 if (abbrev(tcp)) {
1358 abbrev_end = start + max_strlen * sizeof(gid);
1359 if (abbrev_end < start)
1360 abbrev_end = end;
1361 } else {
1362 abbrev_end = end;
1363 }
1364 tprintf("[");
1365 for (cur = start; cur < end; cur += sizeof(gid)) {
1366 if (cur > start)
1367 tprintf(", ");
1368 if (cur >= abbrev_end) {
1369 tprintf("...");
1370 break;
1371 }
1372 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1373 tprintf("?");
1374 failed = 1;
1375 break;
1376 }
1377 tprintf("%lu", (unsigned long) gid);
1378 }
1379 tprintf("]");
1380 if (failed)
1381 tprintf(" %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001382 }
1383 return 0;
1384}
1385
1386int
1387sys_getgroups(tcp)
1388struct tcb *tcp;
1389{
Roland McGrathaa524c82005-06-01 19:22:06 +00001390 unsigned long len;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001391
1392 if (entering(tcp)) {
1393 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001394 tprintf("%lu, ", len);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001395 } else {
Roland McGrathaa524c82005-06-01 19:22:06 +00001396 unsigned long size, start, cur, end, abbrev_end;
1397 GETGROUPS_T gid;
1398 int failed = 0;
1399
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001400 len = tcp->u_rval;
Roland McGrathaa524c82005-06-01 19:22:06 +00001401 if (len == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001402 tprintf("[]");
1403 return 0;
1404 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001405 start = tcp->u_arg[1];
1406 if (start == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001407 tprintf("NULL");
Roland McGrathaa524c82005-06-01 19:22:06 +00001408 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001409 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001410 if (tcp->u_arg[0] == 0) {
1411 tprintf("%#lx", start);
1412 return 0;
1413 }
1414 size = len * sizeof(gid);
1415 end = start + size;
1416 if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
1417 size / sizeof(gid) != len || end < start) {
1418 tprintf("%#lx", start);
1419 return 0;
1420 }
1421 if (abbrev(tcp)) {
1422 abbrev_end = start + max_strlen * sizeof(gid);
1423 if (abbrev_end < start)
1424 abbrev_end = end;
1425 } else {
1426 abbrev_end = end;
1427 }
1428 tprintf("[");
1429 for (cur = start; cur < end; cur += sizeof(gid)) {
1430 if (cur > start)
1431 tprintf(", ");
1432 if (cur >= abbrev_end) {
1433 tprintf("...");
1434 break;
1435 }
1436 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1437 tprintf("?");
1438 failed = 1;
1439 break;
1440 }
1441 tprintf("%lu", (unsigned long) gid);
1442 }
1443 tprintf("]");
1444 if (failed)
1445 tprintf(" %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001446 }
1447 return 0;
1448}
1449
Roland McGrath83bd47a2003-11-13 22:32:26 +00001450#ifdef LINUX
1451int
1452sys_setgroups32(tcp)
1453struct tcb *tcp;
1454{
Roland McGrath83bd47a2003-11-13 22:32:26 +00001455 if (entering(tcp)) {
Roland McGrathaa524c82005-06-01 19:22:06 +00001456 unsigned long len, size, start, cur, end, abbrev_end;
1457 GETGROUPS32_T gid;
1458 int failed = 0;
1459
Roland McGrath83bd47a2003-11-13 22:32:26 +00001460 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001461 tprintf("%lu, ", len);
1462 if (len == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001463 tprintf("[]");
1464 return 0;
1465 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001466 start = tcp->u_arg[1];
1467 if (start == 0) {
1468 tprintf("NULL");
1469 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001470 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001471 size = len * sizeof(gid);
1472 end = start + size;
1473 if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
1474 tprintf("%#lx", start);
1475 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001476 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001477 if (abbrev(tcp)) {
1478 abbrev_end = start + max_strlen * sizeof(gid);
1479 if (abbrev_end < start)
1480 abbrev_end = end;
1481 } else {
1482 abbrev_end = end;
1483 }
1484 tprintf("[");
1485 for (cur = start; cur < end; cur += sizeof(gid)) {
1486 if (cur > start)
1487 tprintf(", ");
1488 if (cur >= abbrev_end) {
1489 tprintf("...");
1490 break;
1491 }
1492 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1493 tprintf("?");
1494 failed = 1;
1495 break;
1496 }
1497 tprintf("%lu", (unsigned long) gid);
1498 }
1499 tprintf("]");
1500 if (failed)
1501 tprintf(" %#lx", tcp->u_arg[1]);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001502 }
1503 return 0;
1504}
1505
1506int
1507sys_getgroups32(tcp)
1508struct tcb *tcp;
1509{
Roland McGrathaa524c82005-06-01 19:22:06 +00001510 unsigned long len;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001511
1512 if (entering(tcp)) {
1513 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001514 tprintf("%lu, ", len);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001515 } else {
Roland McGrathaa524c82005-06-01 19:22:06 +00001516 unsigned long size, start, cur, end, abbrev_end;
1517 GETGROUPS32_T gid;
1518 int failed = 0;
1519
Roland McGrath83bd47a2003-11-13 22:32:26 +00001520 len = tcp->u_rval;
Roland McGrathaa524c82005-06-01 19:22:06 +00001521 if (len == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001522 tprintf("[]");
1523 return 0;
1524 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001525 start = tcp->u_arg[1];
1526 if (start == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001527 tprintf("NULL");
Roland McGrathaa524c82005-06-01 19:22:06 +00001528 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001529 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001530 size = len * sizeof(gid);
1531 end = start + size;
1532 if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
1533 size / sizeof(gid) != len || end < start) {
1534 tprintf("%#lx", start);
1535 return 0;
1536 }
1537 if (abbrev(tcp)) {
1538 abbrev_end = start + max_strlen * sizeof(gid);
1539 if (abbrev_end < start)
1540 abbrev_end = end;
1541 } else {
1542 abbrev_end = end;
1543 }
1544 tprintf("[");
1545 for (cur = start; cur < end; cur += sizeof(gid)) {
1546 if (cur > start)
1547 tprintf(", ");
1548 if (cur >= abbrev_end) {
1549 tprintf("...");
1550 break;
1551 }
1552 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1553 tprintf("?");
1554 failed = 1;
1555 break;
1556 }
1557 tprintf("%lu", (unsigned long) gid);
1558 }
1559 tprintf("]");
1560 if (failed)
1561 tprintf(" %#lx", tcp->u_arg[1]);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001562 }
1563 return 0;
1564}
1565#endif /* LINUX */
1566
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001567#if defined(ALPHA) || defined(SUNOS4) || defined(SVR4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001568int
1569sys_setpgrp(tcp)
1570struct tcb *tcp;
1571{
1572 if (entering(tcp)) {
1573#ifndef SVR4
1574 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1575#endif /* !SVR4 */
1576 }
1577 return 0;
1578}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001579#endif /* ALPHA || SUNOS4 || SVR4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001580
1581int
1582sys_getpgrp(tcp)
1583struct tcb *tcp;
1584{
1585 if (entering(tcp)) {
1586#ifndef SVR4
1587 tprintf("%lu", tcp->u_arg[0]);
1588#endif /* !SVR4 */
1589 }
1590 return 0;
1591}
1592
1593int
1594sys_getsid(tcp)
1595struct tcb *tcp;
1596{
1597 if (entering(tcp)) {
1598 tprintf("%lu", tcp->u_arg[0]);
1599 }
1600 return 0;
1601}
1602
1603int
1604sys_setsid(tcp)
1605struct tcb *tcp;
1606{
1607 return 0;
1608}
1609
1610int
1611sys_getpgid(tcp)
1612struct tcb *tcp;
1613{
1614 if (entering(tcp)) {
1615 tprintf("%lu", tcp->u_arg[0]);
1616 }
1617 return 0;
1618}
1619
1620int
1621sys_setpgid(tcp)
1622struct tcb *tcp;
1623{
1624 if (entering(tcp)) {
1625 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1626 }
1627 return 0;
1628}
1629
John Hughesc61eb3d2002-05-17 11:37:50 +00001630#if UNIXWARE >= 2
1631
1632#include <sys/privilege.h>
1633
1634
Roland McGrathd9f816f2004-09-04 03:39:20 +00001635static const struct xlat procpriv_cmds [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001636 { SETPRV, "SETPRV" },
1637 { CLRPRV, "CLRPRV" },
1638 { PUTPRV, "PUTPRV" },
1639 { GETPRV, "GETPRV" },
1640 { CNTPRV, "CNTPRV" },
1641 { 0, NULL },
1642};
1643
1644
Roland McGrathd9f816f2004-09-04 03:39:20 +00001645static const struct xlat procpriv_priv [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001646 { P_OWNER, "P_OWNER" },
1647 { P_AUDIT, "P_AUDIT" },
1648 { P_COMPAT, "P_COMPAT" },
1649 { P_DACREAD, "P_DACREAD" },
1650 { P_DACWRITE, "P_DACWRITE" },
1651 { P_DEV, "P_DEV" },
1652 { P_FILESYS, "P_FILESYS" },
1653 { P_MACREAD, "P_MACREAD" },
1654 { P_MACWRITE, "P_MACWRITE" },
1655 { P_MOUNT, "P_MOUNT" },
1656 { P_MULTIDIR, "P_MULTIDIR" },
1657 { P_SETPLEVEL, "P_SETPLEVEL" },
1658 { P_SETSPRIV, "P_SETSPRIV" },
1659 { P_SETUID, "P_SETUID" },
1660 { P_SYSOPS, "P_SYSOPS" },
1661 { P_SETUPRIV, "P_SETUPRIV" },
1662 { P_DRIVER, "P_DRIVER" },
1663 { P_RTIME, "P_RTIME" },
1664 { P_MACUPGRADE, "P_MACUPGRADE" },
1665 { P_FSYSRANGE, "P_FSYSRANGE" },
1666 { P_SETFLEVEL, "P_SETFLEVEL" },
1667 { P_AUDITWR, "P_AUDITWR" },
1668 { P_TSHAR, "P_TSHAR" },
1669 { P_PLOCK, "P_PLOCK" },
1670 { P_CORE, "P_CORE" },
1671 { P_LOADMOD, "P_LOADMOD" },
1672 { P_BIND, "P_BIND" },
1673 { P_ALLPRIVS, "P_ALLPRIVS" },
1674 { 0, NULL },
1675};
1676
1677
Roland McGrathd9f816f2004-09-04 03:39:20 +00001678static const struct xlat procpriv_type [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001679 { PS_FIX, "PS_FIX" },
1680 { PS_INH, "PS_INH" },
1681 { PS_MAX, "PS_MAX" },
1682 { PS_WKG, "PS_WKG" },
1683 { 0, NULL },
1684};
1685
1686
1687static void
Dmitry V. Levinab9008b2007-01-11 22:05:04 +00001688printpriv(struct tcb *tcp, long addr, int len, const struct xlat *opt)
John Hughesc61eb3d2002-05-17 11:37:50 +00001689{
1690 priv_t buf [128];
1691 int max = verbose (tcp) ? sizeof buf / sizeof buf [0] : 10;
1692 int dots = len > max;
1693 int i;
Roland McGrath5a223472002-12-15 23:58:26 +00001694
John Hughesc61eb3d2002-05-17 11:37:50 +00001695 if (len > max) len = max;
Roland McGrath5a223472002-12-15 23:58:26 +00001696
John Hughesc61eb3d2002-05-17 11:37:50 +00001697 if (len <= 0 ||
1698 umoven (tcp, addr, len * sizeof buf[0], (char *) buf) < 0)
1699 {
1700 tprintf ("%#lx", addr);
1701 return;
1702 }
1703
1704 tprintf ("[");
1705
1706 for (i = 0; i < len; ++i) {
Dmitry V. Levinab9008b2007-01-11 22:05:04 +00001707 const char *t, *p;
John Hughesc61eb3d2002-05-17 11:37:50 +00001708
1709 if (i) tprintf (", ");
1710
1711 if ((t = xlookup (procpriv_type, buf [i] & PS_TYPE)) &&
1712 (p = xlookup (procpriv_priv, buf [i] & ~PS_TYPE)))
1713 {
1714 tprintf ("%s|%s", t, p);
1715 }
1716 else {
1717 tprintf ("%#lx", buf [i]);
1718 }
1719 }
1720
1721 if (dots) tprintf (" ...");
1722
1723 tprintf ("]");
1724}
1725
1726
1727int
1728sys_procpriv(tcp)
1729struct tcb *tcp;
1730{
1731 if (entering(tcp)) {
1732 printxval(procpriv_cmds, tcp->u_arg[0], "???PRV");
1733 switch (tcp->u_arg[0]) {
1734 case CNTPRV:
1735 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1736 break;
1737
1738 case GETPRV:
1739 break;
1740
1741 default:
1742 tprintf (", ");
1743 printpriv (tcp, tcp->u_arg[1], tcp->u_arg[2]);
1744 tprintf (", %ld", tcp->u_arg[2]);
1745 }
1746 }
1747 else if (tcp->u_arg[0] == GETPRV) {
1748 if (syserror (tcp)) {
1749 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1750 }
1751 else {
1752 tprintf (", ");
1753 printpriv (tcp, tcp->u_arg[1], tcp->u_rval);
1754 tprintf (", %ld", tcp->u_arg[2]);
1755 }
1756 }
Roland McGrath5a223472002-12-15 23:58:26 +00001757
John Hughesc61eb3d2002-05-17 11:37:50 +00001758 return 0;
1759}
1760
1761#endif
1762
1763
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001764static void
1765printargv(tcp, addr)
1766struct tcb *tcp;
1767long addr;
1768{
Roland McGrath85a3bc42007-08-02 02:13:05 +00001769 union {
1770 int p32;
1771 long p64;
1772 char data[sizeof(long)];
1773 } cp;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001774 char *sep;
Roland McGrath85a3bc42007-08-02 02:13:05 +00001775 int n = 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001776
Roland McGrath85a3bc42007-08-02 02:13:05 +00001777 cp.p64 = 1;
1778 for (sep = ""; !abbrev(tcp) || n < max_strlen / 2; sep = ", ", ++n) {
1779 if (umoven(tcp, addr, personality_wordsize[current_personality],
1780 cp.data) < 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001781 tprintf("%#lx", addr);
1782 return;
1783 }
Roland McGrath85a3bc42007-08-02 02:13:05 +00001784 if (personality_wordsize[current_personality] == 4)
1785 cp.p64 = cp.p32;
1786 if (cp.p64 == 0)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001787 break;
1788 tprintf(sep);
Roland McGrath85a3bc42007-08-02 02:13:05 +00001789 printstr(tcp, cp.p64, -1);
1790 addr += personality_wordsize[current_personality];
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001791 }
Roland McGrath85a3bc42007-08-02 02:13:05 +00001792 if (cp.p64)
1793 tprintf("%s...", sep);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001794}
1795
1796static void
1797printargc(fmt, tcp, addr)
1798char *fmt;
1799struct tcb *tcp;
1800long addr;
1801{
1802 int count;
1803 char *cp;
1804
1805 for (count = 0; umove(tcp, addr, &cp) >= 0 && cp != NULL; count++) {
1806 addr += sizeof(char *);
1807 }
1808 tprintf(fmt, count, count == 1 ? "" : "s");
1809}
1810
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001811#if defined(SPARC) || defined(SPARC64) || defined(SUNOS4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001812int
1813sys_execv(tcp)
1814struct tcb *tcp;
1815{
1816 if (entering(tcp)) {
1817 printpath(tcp, tcp->u_arg[0]);
1818 if (!verbose(tcp))
1819 tprintf(", %#lx", tcp->u_arg[1]);
1820#if 0
1821 else if (abbrev(tcp))
1822 printargc(", [/* %d arg%s */]", tcp, tcp->u_arg[1]);
1823#endif
1824 else {
1825 tprintf(", [");
1826 printargv(tcp, tcp->u_arg[1]);
1827 tprintf("]");
1828 }
1829 }
1830 return 0;
1831}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001832#endif /* SPARC || SPARC64 || SUNOS4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001833
1834int
1835sys_execve(tcp)
1836struct tcb *tcp;
1837{
1838 if (entering(tcp)) {
1839 printpath(tcp, tcp->u_arg[0]);
1840 if (!verbose(tcp))
1841 tprintf(", %#lx", tcp->u_arg[1]);
1842#if 0
1843 else if (abbrev(tcp))
1844 printargc(", [/* %d arg%s */]", tcp, tcp->u_arg[1]);
1845#endif
1846 else {
1847 tprintf(", [");
1848 printargv(tcp, tcp->u_arg[1]);
1849 tprintf("]");
1850 }
1851 if (!verbose(tcp))
1852 tprintf(", %#lx", tcp->u_arg[2]);
1853 else if (abbrev(tcp))
1854 printargc(", [/* %d var%s */]", tcp, tcp->u_arg[2]);
1855 else {
1856 tprintf(", [");
1857 printargv(tcp, tcp->u_arg[2]);
1858 tprintf("]");
1859 }
1860 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001861 return 0;
1862}
1863
Roland McGrath5ef24ab2004-02-20 02:22:35 +00001864#if UNIXWARE > 2
John Hughes4e36a812001-04-18 15:11:51 +00001865
1866int sys_rexecve(tcp)
1867struct tcb *tcp;
1868{
1869 if (entering (tcp)) {
1870 sys_execve (tcp);
1871 tprintf (", %ld", tcp->u_arg[3]);
1872 }
1873 return 0;
1874}
1875
Roland McGrath5ef24ab2004-02-20 02:22:35 +00001876#endif
John Hughes4e36a812001-04-18 15:11:51 +00001877
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001878int
1879internal_exec(tcp)
1880struct tcb *tcp;
1881{
1882#ifdef SUNOS4
1883 if (exiting(tcp) && !syserror(tcp) && followfork)
1884 fixvfork(tcp);
1885#endif /* SUNOS4 */
Roland McGrathfdb097f2004-07-12 07:38:55 +00001886#if defined LINUX && defined TCB_WAITEXECVE
1887 if (exiting(tcp) && syserror(tcp))
1888 tcp->flags &= ~TCB_WAITEXECVE;
1889 else
1890 tcp->flags |= TCB_WAITEXECVE;
1891#endif /* LINUX && TCB_WAITEXECVE */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001892 return 0;
1893}
1894
1895#ifdef LINUX
Roland McGrath7ec1d352002-12-17 04:50:44 +00001896#ifndef __WNOTHREAD
1897#define __WNOTHREAD 0x20000000
1898#endif
1899#ifndef __WALL
1900#define __WALL 0x40000000
1901#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001902#ifndef __WCLONE
Roland McGrath7ec1d352002-12-17 04:50:44 +00001903#define __WCLONE 0x80000000
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001904#endif
1905#endif /* LINUX */
1906
Roland McGrathd9f816f2004-09-04 03:39:20 +00001907static const struct xlat wait4_options[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001908 { WNOHANG, "WNOHANG" },
1909#ifndef WSTOPPED
1910 { WUNTRACED, "WUNTRACED" },
1911#endif
1912#ifdef WEXITED
1913 { WEXITED, "WEXITED" },
1914#endif
1915#ifdef WTRAPPED
1916 { WTRAPPED, "WTRAPPED" },
1917#endif
1918#ifdef WSTOPPED
1919 { WSTOPPED, "WSTOPPED" },
1920#endif
1921#ifdef WCONTINUED
1922 { WCONTINUED, "WCONTINUED" },
1923#endif
1924#ifdef WNOWAIT
1925 { WNOWAIT, "WNOWAIT" },
1926#endif
1927#ifdef __WCLONE
1928 { __WCLONE, "__WCLONE" },
1929#endif
Roland McGrath7ec1d352002-12-17 04:50:44 +00001930#ifdef __WALL
1931 { __WALL, "__WALL" },
1932#endif
1933#ifdef __WNOTHREAD
1934 { __WNOTHREAD, "__WNOTHREAD" },
1935#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001936 { 0, NULL },
1937};
1938
Roland McGrath5e02a572004-10-19 23:33:47 +00001939#if !defined WCOREFLAG && defined WCOREFLG
1940# define WCOREFLAG WCOREFLG
1941#endif
1942#ifndef WCOREFLAG
1943#define WCOREFLAG 0x80
1944#endif
1945
1946#ifndef W_STOPCODE
1947#define W_STOPCODE(sig) ((sig) << 8 | 0x7f)
1948#endif
1949#ifndef W_EXITCODE
1950#define W_EXITCODE(ret, sig) ((ret) << 8 | (sig))
1951#endif
1952
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001953static int
1954printstatus(status)
1955int status;
1956{
1957 int exited = 0;
1958
1959 /*
1960 * Here is a tricky presentation problem. This solution
1961 * is still not entirely satisfactory but since there
1962 * are no wait status constructors it will have to do.
1963 */
Roland McGrath79fbda52004-04-14 02:45:55 +00001964 if (WIFSTOPPED(status)) {
1965 tprintf("[{WIFSTOPPED(s) && WSTOPSIG(s) == %s}",
Nate Sammonsce780fc1999-03-29 23:23:13 +00001966 signame(WSTOPSIG(status)));
Roland McGrath79fbda52004-04-14 02:45:55 +00001967 status &= ~W_STOPCODE(WSTOPSIG(status));
1968 }
1969 else if (WIFSIGNALED(status)) {
1970 tprintf("[{WIFSIGNALED(s) && WTERMSIG(s) == %s%s}",
Nate Sammonsce780fc1999-03-29 23:23:13 +00001971 signame(WTERMSIG(status)),
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001972 WCOREDUMP(status) ? " && WCOREDUMP(s)" : "");
Roland McGrath79fbda52004-04-14 02:45:55 +00001973 status &= ~(W_EXITCODE(0, WTERMSIG(status)) | WCOREFLAG);
1974 }
1975 else if (WIFEXITED(status)) {
1976 tprintf("[{WIFEXITED(s) && WEXITSTATUS(s) == %d}",
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001977 WEXITSTATUS(status));
1978 exited = 1;
Roland McGrath79fbda52004-04-14 02:45:55 +00001979 status &= ~W_EXITCODE(WEXITSTATUS(status), 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001980 }
Roland McGrath79fbda52004-04-14 02:45:55 +00001981 else {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001982 tprintf("[%#x]", status);
Roland McGrath79fbda52004-04-14 02:45:55 +00001983 return 0;
1984 }
1985
1986 if (status == 0)
1987 tprintf("]");
1988 else
Roland McGrathf8cc83c2004-06-04 01:24:07 +00001989 tprintf(" | %#x]", status);
Roland McGrath79fbda52004-04-14 02:45:55 +00001990
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001991 return exited;
1992}
1993
1994static int
Denys Vlasenko59432db2009-01-26 19:09:35 +00001995printwaitn(struct tcb *tcp, int n, int bitness)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001996{
1997 int status;
1998 int exited = 0;
1999
2000 if (entering(tcp)) {
Denys Vlasenkoe740fd32009-04-16 12:06:16 +00002001#ifdef LINUX
2002 /* On Linux, kernel-side pid_t is typedef'ed to int
2003 * on all arches. Also, glibc-2.8 truncates wait3 and wait4
Denys Vlasenko59432db2009-01-26 19:09:35 +00002004 * pid argument to int on 64bit arches, producing,
2005 * for example, wait4(4294967295, ...) instead of -1
Denys Vlasenkoe740fd32009-04-16 12:06:16 +00002006 * in strace. We have to use int here, not long.
2007 */
2008 int pid = tcp->u_arg[0];
2009 tprintf("%d, ", pid);
2010#else
2011 /*
2012 * Sign-extend a 32-bit value when that's what it is.
Roland McGrath5b63d962008-07-18 02:16:47 +00002013 */
2014 long pid = tcp->u_arg[0];
2015 if (personality_wordsize[current_personality] < sizeof pid)
2016 pid = (long) (int) pid;
2017 tprintf("%ld, ", pid);
Denys Vlasenkoe740fd32009-04-16 12:06:16 +00002018#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002019 } else {
2020 /* status */
2021 if (!tcp->u_arg[1])
2022 tprintf("NULL");
2023 else if (syserror(tcp) || tcp->u_rval == 0)
2024 tprintf("%#lx", tcp->u_arg[1]);
2025 else if (umove(tcp, tcp->u_arg[1], &status) < 0)
2026 tprintf("[?]");
2027 else
2028 exited = printstatus(status);
2029 /* options */
2030 tprintf(", ");
Roland McGrathb2dee132005-06-01 19:02:36 +00002031 printflags(wait4_options, tcp->u_arg[2], "W???");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002032 if (n == 4) {
2033 tprintf(", ");
2034 /* usage */
2035 if (!tcp->u_arg[3])
2036 tprintf("NULL");
2037#ifdef LINUX
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002038 else if (tcp->u_rval > 0) {
Denys Vlasenko59432db2009-01-26 19:09:35 +00002039#ifdef ALPHA
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002040 if (bitness)
2041 printrusage32(tcp, tcp->u_arg[3]);
2042 else
2043#endif
2044 printrusage(tcp, tcp->u_arg[3]);
2045 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002046#endif /* LINUX */
2047#ifdef SUNOS4
2048 else if (tcp->u_rval > 0 && exited)
2049 printrusage(tcp, tcp->u_arg[3]);
2050#endif /* SUNOS4 */
2051 else
2052 tprintf("%#lx", tcp->u_arg[3]);
2053 }
2054 }
2055 return 0;
2056}
2057
2058int
Roland McGrathc74c0b72004-09-01 19:39:46 +00002059internal_wait(tcp, flagarg)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002060struct tcb *tcp;
Roland McGrathc74c0b72004-09-01 19:39:46 +00002061int flagarg;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002062{
Roland McGrathe85bbfe2003-01-09 06:53:31 +00002063 int got_kids;
2064
2065#ifdef TCB_CLONE_THREAD
2066 if (tcp->flags & TCB_CLONE_THREAD)
2067 /* The children we wait for are our parent's children. */
2068 got_kids = (tcp->parent->nchildren
2069 > tcp->parent->nclone_detached);
2070 else
2071 got_kids = (tcp->nchildren > tcp->nclone_detached);
2072#else
2073 got_kids = tcp->nchildren > 0;
2074#endif
2075
2076 if (entering(tcp) && got_kids) {
Roland McGrathb69f81b2002-12-21 23:25:18 +00002077 /* There are children that this parent should block for.
2078 But ptrace made us the parent of the traced children
2079 and the real parent will get ECHILD from the wait call.
2080
2081 XXX If we attached with strace -f -p PID, then there
2082 may be untraced dead children the parent could be reaping
2083 now, but we make him block. */
2084
2085 /* ??? WTA: fix bug with hanging children */
2086
Roland McGrathc74c0b72004-09-01 19:39:46 +00002087 if (!(tcp->u_arg[flagarg] & WNOHANG)) {
Roland McGrath09623452003-05-23 02:27:13 +00002088 /*
2089 * There are traced children. We'll make the parent
2090 * block to avoid a false ECHILD error due to our
2091 * ptrace having stolen the children. However,
2092 * we shouldn't block if there are zombies to reap.
2093 * XXX doesn't handle pgrp matches (u_arg[0]==0,<-1)
2094 */
Roland McGrathfccfb942003-10-01 21:59:44 +00002095 struct tcb *child = NULL;
Roland McGrath09623452003-05-23 02:27:13 +00002096 if (tcp->nzombies > 0 &&
2097 (tcp->u_arg[0] == -1 ||
Roland McGrathfccfb942003-10-01 21:59:44 +00002098 (child = pid2tcb(tcp->u_arg[0])) == NULL))
Roland McGrath09623452003-05-23 02:27:13 +00002099 return 0;
Roland McGrathfccfb942003-10-01 21:59:44 +00002100 if (tcp->u_arg[0] > 0) {
2101 /*
2102 * If the parent waits for a specified child
2103 * PID, then it must get ECHILD right away
2104 * if that PID is not one of its children.
2105 * Make sure that the requested PID matches
2106 * one of the parent's children that we are
2107 * tracing, and don't suspend it otherwise.
2108 */
2109 if (child == NULL)
2110 child = pid2tcb(tcp->u_arg[0]);
2111 if (child == NULL || child->parent != (
2112#ifdef TCB_CLONE_THREAD
2113 (tcp->flags & TCB_CLONE_THREAD)
2114 ? tcp->parent :
2115#endif
Roland McGrathd56a6562005-08-03 11:23:43 +00002116 tcp) ||
2117 (child->flags & TCB_EXITING))
Roland McGrathfccfb942003-10-01 21:59:44 +00002118 return 0;
2119 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002120 tcp->flags |= TCB_SUSPENDED;
2121 tcp->waitpid = tcp->u_arg[0];
Roland McGrathe85bbfe2003-01-09 06:53:31 +00002122#ifdef TCB_CLONE_THREAD
2123 if (tcp->flags & TCB_CLONE_THREAD)
2124 tcp->parent->nclone_waiting++;
2125#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002126 }
2127 }
Roland McGrathe85bbfe2003-01-09 06:53:31 +00002128 if (exiting(tcp) && tcp->u_error == ECHILD && got_kids) {
Roland McGrathc74c0b72004-09-01 19:39:46 +00002129 if (tcp->u_arg[flagarg] & WNOHANG) {
Roland McGrathb69f81b2002-12-21 23:25:18 +00002130 /* We must force a fake result of 0 instead of
2131 the ECHILD error. */
2132 extern int force_result();
2133 return force_result(tcp, 0, 0);
2134 }
Roland McGrathb69f81b2002-12-21 23:25:18 +00002135 }
Roland McGrath09623452003-05-23 02:27:13 +00002136 else if (exiting(tcp) && tcp->u_error == 0 && tcp->u_rval > 0 &&
2137 tcp->nzombies > 0 && pid2tcb(tcp->u_rval) == NULL) {
2138 /*
2139 * We just reaped a child we don't know about,
2140 * presumably a zombie we already droptcb'd.
2141 */
2142 tcp->nzombies--;
2143 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002144 return 0;
2145}
2146
2147#ifdef SVR4
2148
2149int
2150sys_wait(tcp)
2151struct tcb *tcp;
2152{
2153 if (exiting(tcp)) {
2154 /* The library wrapper stuffs this into the user variable. */
2155 if (!syserror(tcp))
2156 printstatus(getrval2(tcp));
2157 }
2158 return 0;
2159}
2160
2161#endif /* SVR4 */
2162
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002163#ifdef FREEBSD
2164int
2165sys_wait(tcp)
2166struct tcb *tcp;
2167{
2168 int status;
Roland McGrath5a223472002-12-15 23:58:26 +00002169
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002170 if (exiting(tcp)) {
2171 if (!syserror(tcp)) {
2172 if (umove(tcp, tcp->u_arg[0], &status) < 0)
2173 tprintf("%#lx", tcp->u_arg[0]);
2174 else
2175 printstatus(status);
2176 }
2177 }
2178 return 0;
2179}
2180#endif
2181
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002182int
2183sys_waitpid(tcp)
2184struct tcb *tcp;
2185{
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002186 return printwaitn(tcp, 3, 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002187}
2188
2189int
2190sys_wait4(tcp)
2191struct tcb *tcp;
2192{
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002193 return printwaitn(tcp, 4, 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002194}
2195
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002196#ifdef ALPHA
2197int
2198sys_osf_wait4(tcp)
2199struct tcb *tcp;
2200{
2201 return printwaitn(tcp, 4, 1);
2202}
2203#endif
2204
Roland McGrathc74c0b72004-09-01 19:39:46 +00002205#if defined SVR4 || defined LINUX
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002206
Roland McGrathd9f816f2004-09-04 03:39:20 +00002207static const struct xlat waitid_types[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002208 { P_PID, "P_PID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002209#ifdef P_PPID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002210 { P_PPID, "P_PPID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002211#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002212 { P_PGID, "P_PGID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002213#ifdef P_SID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002214 { P_SID, "P_SID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002215#endif
2216#ifdef P_CID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002217 { P_CID, "P_CID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002218#endif
2219#ifdef P_UID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002220 { P_UID, "P_UID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002221#endif
2222#ifdef P_GID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002223 { P_GID, "P_GID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002224#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002225 { P_ALL, "P_ALL" },
2226#ifdef P_LWPID
2227 { P_LWPID, "P_LWPID" },
2228#endif
2229 { 0, NULL },
2230};
2231
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002232int
2233sys_waitid(tcp)
2234struct tcb *tcp;
2235{
2236 siginfo_t si;
2237 int exited;
2238
2239 if (entering(tcp)) {
2240 printxval(waitid_types, tcp->u_arg[0], "P_???");
2241 tprintf(", %ld, ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002242 }
2243 else {
2244 /* siginfo */
2245 exited = 0;
2246 if (!tcp->u_arg[2])
2247 tprintf("NULL");
2248 else if (syserror(tcp))
2249 tprintf("%#lx", tcp->u_arg[2]);
2250 else if (umove(tcp, tcp->u_arg[2], &si) < 0)
2251 tprintf("{???}");
2252 else
Denys Vlasenkof535b542009-01-13 18:30:55 +00002253 printsiginfo(&si, verbose(tcp));
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002254 /* options */
2255 tprintf(", ");
Roland McGrathb2dee132005-06-01 19:02:36 +00002256 printflags(wait4_options, tcp->u_arg[3], "W???");
Roland McGrath39426a32004-10-06 22:02:59 +00002257 if (tcp->u_nargs > 4) {
2258 /* usage */
2259 tprintf(", ");
2260 if (!tcp->u_arg[4])
2261 tprintf("NULL");
2262 else if (tcp->u_error)
2263 tprintf("%#lx", tcp->u_arg[4]);
2264 else
2265 printrusage(tcp, tcp->u_arg[4]);
2266 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002267 }
2268 return 0;
2269}
2270
Roland McGrathc74c0b72004-09-01 19:39:46 +00002271#endif /* SVR4 or LINUX */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002272
2273int
2274sys_alarm(tcp)
2275struct tcb *tcp;
2276{
2277 if (entering(tcp))
2278 tprintf("%lu", tcp->u_arg[0]);
2279 return 0;
2280}
2281
2282int
2283sys_uname(tcp)
2284struct tcb *tcp;
2285{
2286 struct utsname uname;
2287
2288 if (exiting(tcp)) {
2289 if (syserror(tcp) || !verbose(tcp))
2290 tprintf("%#lx", tcp->u_arg[0]);
2291 else if (umove(tcp, tcp->u_arg[0], &uname) < 0)
2292 tprintf("{...}");
2293 else if (!abbrev(tcp)) {
2294
2295 tprintf("{sysname=\"%s\", nodename=\"%s\", ",
2296 uname.sysname, uname.nodename);
2297 tprintf("release=\"%s\", version=\"%s\", ",
2298 uname.release, uname.version);
2299 tprintf("machine=\"%s\"", uname.machine);
2300#ifdef LINUX
2301#ifndef __GLIBC__
2302 tprintf(", domainname=\"%s\"", uname.domainname);
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002303#endif
2304#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002305 tprintf("}");
2306 }
2307 else
2308 tprintf("{sys=\"%s\", node=\"%s\", ...}",
2309 uname.sysname, uname.nodename);
2310 }
2311 return 0;
2312}
2313
2314#ifndef SVR4
2315
Denys Vlasenko4dedd562009-02-24 15:17:53 +00002316const struct xlat ptrace_cmds[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002317# ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002318 { PTRACE_TRACEME, "PTRACE_TRACEME" },
2319 { PTRACE_PEEKTEXT, "PTRACE_PEEKTEXT", },
2320 { PTRACE_PEEKDATA, "PTRACE_PEEKDATA", },
2321 { PTRACE_PEEKUSER, "PTRACE_PEEKUSER", },
2322 { PTRACE_POKETEXT, "PTRACE_POKETEXT", },
2323 { PTRACE_POKEDATA, "PTRACE_POKEDATA", },
2324 { PTRACE_POKEUSER, "PTRACE_POKEUSER", },
2325 { PTRACE_CONT, "PTRACE_CONT" },
2326 { PTRACE_KILL, "PTRACE_KILL" },
2327 { PTRACE_SINGLESTEP, "PTRACE_SINGLESTEP" },
2328 { PTRACE_ATTACH, "PTRACE_ATTACH" },
2329 { PTRACE_DETACH, "PTRACE_DETACH" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002330# ifdef PTRACE_GETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002331 { PTRACE_GETREGS, "PTRACE_GETREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002332# endif
2333# ifdef PTRACE_SETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002334 { PTRACE_SETREGS, "PTRACE_SETREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002335# endif
2336# ifdef PTRACE_GETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002337 { PTRACE_GETFPREGS, "PTRACE_GETFPREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002338# endif
2339# ifdef PTRACE_SETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002340 { PTRACE_SETFPREGS, "PTRACE_SETFPREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002341# endif
2342# ifdef PTRACE_GETFPXREGS
Roland McGrathbf621d42003-01-14 09:46:21 +00002343 { PTRACE_GETFPXREGS, "PTRACE_GETFPXREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002344# endif
2345# ifdef PTRACE_SETFPXREGS
Roland McGrathbf621d42003-01-14 09:46:21 +00002346 { PTRACE_SETFPXREGS, "PTRACE_SETFPXREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002347# endif
2348# ifdef PTRACE_GETVRREGS
Roland McGrathf04bb482005-05-09 07:45:33 +00002349 { PTRACE_GETVRREGS, "PTRACE_GETVRREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002350# endif
2351# ifdef PTRACE_SETVRREGS
Roland McGrathf04bb482005-05-09 07:45:33 +00002352 { PTRACE_SETVRREGS, "PTRACE_SETVRREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002353# endif
2354# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00002355 { PTRACE_SETOPTIONS, "PTRACE_SETOPTIONS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002356# endif
2357# ifdef PTRACE_GETEVENTMSG
Denys Vlasenkof535b542009-01-13 18:30:55 +00002358 { PTRACE_GETEVENTMSG, "PTRACE_GETEVENTMSG", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002359# endif
2360# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00002361 { PTRACE_GETSIGINFO, "PTRACE_GETSIGINFO", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002362# endif
2363# ifdef PTRACE_SETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00002364 { PTRACE_SETSIGINFO, "PTRACE_SETSIGINFO", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002365# endif
2366# ifdef PTRACE_SET_SYSCALL
2367 { PTRACE_SET_SYSCALL, "PTRACE_SET_SYSCALL", },
2368# endif
2369# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002370 { PTRACE_READDATA, "PTRACE_READDATA" },
2371 { PTRACE_WRITEDATA, "PTRACE_WRITEDATA" },
2372 { PTRACE_READTEXT, "PTRACE_READTEXT" },
2373 { PTRACE_WRITETEXT, "PTRACE_WRITETEXT" },
2374 { PTRACE_GETFPAREGS, "PTRACE_GETFPAREGS" },
2375 { PTRACE_SETFPAREGS, "PTRACE_SETFPAREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002376# ifdef SPARC
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002377 { PTRACE_GETWINDOW, "PTRACE_GETWINDOW" },
2378 { PTRACE_SETWINDOW, "PTRACE_SETWINDOW" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002379# else /* !SPARC */
2380 { PTRACE_22, "PTRACE_22" },
2381 { PTRACE_23, "PTRACE_3" },
2382# endif /* !SPARC */
2383# endif /* SUNOS4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002384 { PTRACE_SYSCALL, "PTRACE_SYSCALL" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002385# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002386 { PTRACE_DUMPCORE, "PTRACE_DUMPCORE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002387# ifdef I386
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002388 { PTRACE_SETWRBKPT, "PTRACE_SETWRBKPT" },
2389 { PTRACE_SETACBKPT, "PTRACE_SETACBKPT" },
2390 { PTRACE_CLRDR7, "PTRACE_CLRDR7" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002391# else /* !I386 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002392 { PTRACE_26, "PTRACE_26" },
2393 { PTRACE_27, "PTRACE_27" },
2394 { PTRACE_28, "PTRACE_28" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002395# endif /* !I386 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002396 { PTRACE_GETUCODE, "PTRACE_GETUCODE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002397# endif /* SUNOS4 */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002398
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002399# else /* FREEBSD */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002400
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002401 { PT_TRACE_ME, "PT_TRACE_ME" },
2402 { PT_READ_I, "PT_READ_I" },
2403 { PT_READ_D, "PT_READ_D" },
2404 { PT_WRITE_I, "PT_WRITE_I" },
2405 { PT_WRITE_D, "PT_WRITE_D" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002406# ifdef PT_READ_U
John Hughesa2278142001-09-28 16:21:30 +00002407 { PT_READ_U, "PT_READ_U" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002408# endif
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002409 { PT_CONTINUE, "PT_CONTINUE" },
2410 { PT_KILL, "PT_KILL" },
2411 { PT_STEP, "PT_STEP" },
2412 { PT_ATTACH, "PT_ATTACH" },
2413 { PT_DETACH, "PT_DETACH" },
2414 { PT_GETREGS, "PT_GETREGS" },
2415 { PT_SETREGS, "PT_SETREGS" },
2416 { PT_GETFPREGS, "PT_GETFPREGS" },
2417 { PT_SETFPREGS, "PT_SETFPREGS" },
2418 { PT_GETDBREGS, "PT_GETDBREGS" },
2419 { PT_SETDBREGS, "PT_SETDBREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002420# endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002421 { 0, NULL },
2422};
2423
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002424# ifndef FREEBSD
2425# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00002426static const struct xlat ptrace_setoptions_flags[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002427# ifdef PTRACE_O_TRACESYSGOOD
Denys Vlasenkof535b542009-01-13 18:30:55 +00002428 { PTRACE_O_TRACESYSGOOD,"PTRACE_O_TRACESYSGOOD" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002429# endif
2430# ifdef PTRACE_O_TRACEFORK
Denys Vlasenkof535b542009-01-13 18:30:55 +00002431 { PTRACE_O_TRACEFORK, "PTRACE_O_TRACEFORK" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002432# endif
2433# ifdef PTRACE_O_TRACEVFORK
Denys Vlasenkof535b542009-01-13 18:30:55 +00002434 { PTRACE_O_TRACEVFORK, "PTRACE_O_TRACEVFORK" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002435# endif
2436# ifdef PTRACE_O_TRACECLONE
Denys Vlasenkof535b542009-01-13 18:30:55 +00002437 { PTRACE_O_TRACECLONE, "PTRACE_O_TRACECLONE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002438# endif
2439# ifdef PTRACE_O_TRACEEXEC
Denys Vlasenkof535b542009-01-13 18:30:55 +00002440 { PTRACE_O_TRACEEXEC, "PTRACE_O_TRACEEXEC" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002441# endif
2442# ifdef PTRACE_O_TRACEVFORKDONE
Denys Vlasenkof535b542009-01-13 18:30:55 +00002443 { PTRACE_O_TRACEVFORKDONE,"PTRACE_O_TRACEVFORKDONE"},
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002444# endif
2445# ifdef PTRACE_O_TRACEEXIT
Denys Vlasenkof535b542009-01-13 18:30:55 +00002446 { PTRACE_O_TRACEEXIT, "PTRACE_O_TRACEEXIT" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002447# endif
Denys Vlasenkof535b542009-01-13 18:30:55 +00002448 { 0, NULL },
2449};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002450# endif /* PTRACE_SETOPTIONS */
2451# endif /* !FREEBSD */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002452
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002453# ifndef FREEBSD
Roland McGrathd9f816f2004-09-04 03:39:20 +00002454const struct xlat struct_user_offsets[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002455# ifdef LINUX
2456# if defined(S390) || defined(S390X)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002457 { PT_PSWMASK, "psw_mask" },
2458 { PT_PSWADDR, "psw_addr" },
2459 { PT_GPR0, "gpr0" },
2460 { PT_GPR1, "gpr1" },
2461 { PT_GPR2, "gpr2" },
2462 { PT_GPR3, "gpr3" },
2463 { PT_GPR4, "gpr4" },
2464 { PT_GPR5, "gpr5" },
2465 { PT_GPR6, "gpr6" },
2466 { PT_GPR7, "gpr7" },
2467 { PT_GPR8, "gpr8" },
2468 { PT_GPR9, "gpr9" },
2469 { PT_GPR10, "gpr10" },
2470 { PT_GPR11, "gpr11" },
2471 { PT_GPR12, "gpr12" },
2472 { PT_GPR13, "gpr13" },
2473 { PT_GPR14, "gpr14" },
2474 { PT_GPR15, "gpr15" },
2475 { PT_ACR0, "acr0" },
2476 { PT_ACR1, "acr1" },
2477 { PT_ACR2, "acr2" },
2478 { PT_ACR3, "acr3" },
2479 { PT_ACR4, "acr4" },
2480 { PT_ACR5, "acr5" },
2481 { PT_ACR6, "acr6" },
2482 { PT_ACR7, "acr7" },
2483 { PT_ACR8, "acr8" },
2484 { PT_ACR9, "acr9" },
2485 { PT_ACR10, "acr10" },
2486 { PT_ACR11, "acr11" },
2487 { PT_ACR12, "acr12" },
2488 { PT_ACR13, "acr13" },
2489 { PT_ACR14, "acr14" },
2490 { PT_ACR15, "acr15" },
2491 { PT_ORIGGPR2, "orig_gpr2" },
2492 { PT_FPC, "fpc" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002493# if defined(S390)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002494 { PT_FPR0_HI, "fpr0.hi" },
2495 { PT_FPR0_LO, "fpr0.lo" },
2496 { PT_FPR1_HI, "fpr1.hi" },
2497 { PT_FPR1_LO, "fpr1.lo" },
2498 { PT_FPR2_HI, "fpr2.hi" },
2499 { PT_FPR2_LO, "fpr2.lo" },
2500 { PT_FPR3_HI, "fpr3.hi" },
2501 { PT_FPR3_LO, "fpr3.lo" },
2502 { PT_FPR4_HI, "fpr4.hi" },
2503 { PT_FPR4_LO, "fpr4.lo" },
2504 { PT_FPR5_HI, "fpr5.hi" },
2505 { PT_FPR5_LO, "fpr5.lo" },
2506 { PT_FPR6_HI, "fpr6.hi" },
2507 { PT_FPR6_LO, "fpr6.lo" },
2508 { PT_FPR7_HI, "fpr7.hi" },
2509 { PT_FPR7_LO, "fpr7.lo" },
2510 { PT_FPR8_HI, "fpr8.hi" },
2511 { PT_FPR8_LO, "fpr8.lo" },
2512 { PT_FPR9_HI, "fpr9.hi" },
2513 { PT_FPR9_LO, "fpr9.lo" },
2514 { PT_FPR10_HI, "fpr10.hi" },
2515 { PT_FPR10_LO, "fpr10.lo" },
2516 { PT_FPR11_HI, "fpr11.hi" },
2517 { PT_FPR11_LO, "fpr11.lo" },
2518 { PT_FPR12_HI, "fpr12.hi" },
2519 { PT_FPR12_LO, "fpr12.lo" },
2520 { PT_FPR13_HI, "fpr13.hi" },
2521 { PT_FPR13_LO, "fpr13.lo" },
2522 { PT_FPR14_HI, "fpr14.hi" },
2523 { PT_FPR14_LO, "fpr14.lo" },
2524 { PT_FPR15_HI, "fpr15.hi" },
2525 { PT_FPR15_LO, "fpr15.lo" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002526# endif
2527# if defined(S390X)
Michal Ludvig10a88d02002-10-07 14:31:00 +00002528 { PT_FPR0, "fpr0" },
2529 { PT_FPR1, "fpr1" },
2530 { PT_FPR2, "fpr2" },
2531 { PT_FPR3, "fpr3" },
2532 { PT_FPR4, "fpr4" },
2533 { PT_FPR5, "fpr5" },
2534 { PT_FPR6, "fpr6" },
2535 { PT_FPR7, "fpr7" },
2536 { PT_FPR8, "fpr8" },
2537 { PT_FPR9, "fpr9" },
2538 { PT_FPR10, "fpr10" },
2539 { PT_FPR11, "fpr11" },
2540 { PT_FPR12, "fpr12" },
2541 { PT_FPR13, "fpr13" },
2542 { PT_FPR14, "fpr14" },
2543 { PT_FPR15, "fpr15" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002544# endif
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002545 { PT_CR_9, "cr9" },
2546 { PT_CR_10, "cr10" },
2547 { PT_CR_11, "cr11" },
Michal Ludvig10a88d02002-10-07 14:31:00 +00002548 { PT_IEEE_IP, "ieee_exception_ip" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002549# elif defined(SPARC)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002550 /* XXX No support for these offsets yet. */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002551# elif defined(HPPA)
Wichert Akkermanc1652e22001-03-27 12:17:16 +00002552 /* XXX No support for these offsets yet. */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002553# elif defined(POWERPC)
2554# ifndef PT_ORIG_R3
2555# define PT_ORIG_R3 34
2556# endif
2557# define REGSIZE (sizeof(unsigned long))
Roland McGratheb285352003-01-14 09:59:00 +00002558 { REGSIZE*PT_R0, "r0" },
2559 { REGSIZE*PT_R1, "r1" },
2560 { REGSIZE*PT_R2, "r2" },
2561 { REGSIZE*PT_R3, "r3" },
2562 { REGSIZE*PT_R4, "r4" },
2563 { REGSIZE*PT_R5, "r5" },
2564 { REGSIZE*PT_R6, "r6" },
2565 { REGSIZE*PT_R7, "r7" },
2566 { REGSIZE*PT_R8, "r8" },
2567 { REGSIZE*PT_R9, "r9" },
2568 { REGSIZE*PT_R10, "r10" },
2569 { REGSIZE*PT_R11, "r11" },
2570 { REGSIZE*PT_R12, "r12" },
2571 { REGSIZE*PT_R13, "r13" },
2572 { REGSIZE*PT_R14, "r14" },
2573 { REGSIZE*PT_R15, "r15" },
2574 { REGSIZE*PT_R16, "r16" },
2575 { REGSIZE*PT_R17, "r17" },
2576 { REGSIZE*PT_R18, "r18" },
2577 { REGSIZE*PT_R19, "r19" },
2578 { REGSIZE*PT_R20, "r20" },
2579 { REGSIZE*PT_R21, "r21" },
2580 { REGSIZE*PT_R22, "r22" },
2581 { REGSIZE*PT_R23, "r23" },
2582 { REGSIZE*PT_R24, "r24" },
2583 { REGSIZE*PT_R25, "r25" },
2584 { REGSIZE*PT_R26, "r26" },
2585 { REGSIZE*PT_R27, "r27" },
2586 { REGSIZE*PT_R28, "r28" },
2587 { REGSIZE*PT_R29, "r29" },
2588 { REGSIZE*PT_R30, "r30" },
2589 { REGSIZE*PT_R31, "r31" },
2590 { REGSIZE*PT_NIP, "NIP" },
2591 { REGSIZE*PT_MSR, "MSR" },
2592 { REGSIZE*PT_ORIG_R3, "ORIG_R3" },
2593 { REGSIZE*PT_CTR, "CTR" },
2594 { REGSIZE*PT_LNK, "LNK" },
2595 { REGSIZE*PT_XER, "XER" },
2596 { REGSIZE*PT_CCR, "CCR" },
2597 { REGSIZE*PT_FPR0, "FPR0" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002598# undef REGSIZE
2599# elif defined(ALPHA)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002600 { 0, "r0" },
2601 { 1, "r1" },
2602 { 2, "r2" },
2603 { 3, "r3" },
2604 { 4, "r4" },
2605 { 5, "r5" },
2606 { 6, "r6" },
2607 { 7, "r7" },
2608 { 8, "r8" },
2609 { 9, "r9" },
2610 { 10, "r10" },
2611 { 11, "r11" },
2612 { 12, "r12" },
2613 { 13, "r13" },
2614 { 14, "r14" },
2615 { 15, "r15" },
2616 { 16, "r16" },
2617 { 17, "r17" },
2618 { 18, "r18" },
2619 { 19, "r19" },
2620 { 20, "r20" },
2621 { 21, "r21" },
2622 { 22, "r22" },
2623 { 23, "r23" },
2624 { 24, "r24" },
2625 { 25, "r25" },
2626 { 26, "r26" },
2627 { 27, "r27" },
2628 { 28, "r28" },
2629 { 29, "gp" },
2630 { 30, "fp" },
2631 { 31, "zero" },
2632 { 32, "fp0" },
2633 { 33, "fp" },
2634 { 34, "fp2" },
2635 { 35, "fp3" },
2636 { 36, "fp4" },
2637 { 37, "fp5" },
2638 { 38, "fp6" },
2639 { 39, "fp7" },
2640 { 40, "fp8" },
2641 { 41, "fp9" },
2642 { 42, "fp10" },
2643 { 43, "fp11" },
2644 { 44, "fp12" },
2645 { 45, "fp13" },
2646 { 46, "fp14" },
2647 { 47, "fp15" },
2648 { 48, "fp16" },
2649 { 49, "fp17" },
2650 { 50, "fp18" },
2651 { 51, "fp19" },
2652 { 52, "fp20" },
2653 { 53, "fp21" },
2654 { 54, "fp22" },
2655 { 55, "fp23" },
2656 { 56, "fp24" },
2657 { 57, "fp25" },
2658 { 58, "fp26" },
2659 { 59, "fp27" },
2660 { 60, "fp28" },
2661 { 61, "fp29" },
2662 { 62, "fp30" },
2663 { 63, "fp31" },
2664 { 64, "pc" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002665# elif defined(IA64)
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002666 { PT_F32, "f32" }, { PT_F33, "f33" }, { PT_F34, "f34" },
2667 { PT_F35, "f35" }, { PT_F36, "f36" }, { PT_F37, "f37" },
2668 { PT_F38, "f38" }, { PT_F39, "f39" }, { PT_F40, "f40" },
2669 { PT_F41, "f41" }, { PT_F42, "f42" }, { PT_F43, "f43" },
2670 { PT_F44, "f44" }, { PT_F45, "f45" }, { PT_F46, "f46" },
2671 { PT_F47, "f47" }, { PT_F48, "f48" }, { PT_F49, "f49" },
2672 { PT_F50, "f50" }, { PT_F51, "f51" }, { PT_F52, "f52" },
2673 { PT_F53, "f53" }, { PT_F54, "f54" }, { PT_F55, "f55" },
2674 { PT_F56, "f56" }, { PT_F57, "f57" }, { PT_F58, "f58" },
2675 { PT_F59, "f59" }, { PT_F60, "f60" }, { PT_F61, "f61" },
2676 { PT_F62, "f62" }, { PT_F63, "f63" }, { PT_F64, "f64" },
2677 { PT_F65, "f65" }, { PT_F66, "f66" }, { PT_F67, "f67" },
2678 { PT_F68, "f68" }, { PT_F69, "f69" }, { PT_F70, "f70" },
2679 { PT_F71, "f71" }, { PT_F72, "f72" }, { PT_F73, "f73" },
2680 { PT_F74, "f74" }, { PT_F75, "f75" }, { PT_F76, "f76" },
2681 { PT_F77, "f77" }, { PT_F78, "f78" }, { PT_F79, "f79" },
2682 { PT_F80, "f80" }, { PT_F81, "f81" }, { PT_F82, "f82" },
2683 { PT_F83, "f83" }, { PT_F84, "f84" }, { PT_F85, "f85" },
2684 { PT_F86, "f86" }, { PT_F87, "f87" }, { PT_F88, "f88" },
2685 { PT_F89, "f89" }, { PT_F90, "f90" }, { PT_F91, "f91" },
2686 { PT_F92, "f92" }, { PT_F93, "f93" }, { PT_F94, "f94" },
2687 { PT_F95, "f95" }, { PT_F96, "f96" }, { PT_F97, "f97" },
2688 { PT_F98, "f98" }, { PT_F99, "f99" }, { PT_F100, "f100" },
2689 { PT_F101, "f101" }, { PT_F102, "f102" }, { PT_F103, "f103" },
2690 { PT_F104, "f104" }, { PT_F105, "f105" }, { PT_F106, "f106" },
2691 { PT_F107, "f107" }, { PT_F108, "f108" }, { PT_F109, "f109" },
2692 { PT_F110, "f110" }, { PT_F111, "f111" }, { PT_F112, "f112" },
2693 { PT_F113, "f113" }, { PT_F114, "f114" }, { PT_F115, "f115" },
2694 { PT_F116, "f116" }, { PT_F117, "f117" }, { PT_F118, "f118" },
2695 { PT_F119, "f119" }, { PT_F120, "f120" }, { PT_F121, "f121" },
2696 { PT_F122, "f122" }, { PT_F123, "f123" }, { PT_F124, "f124" },
2697 { PT_F125, "f125" }, { PT_F126, "f126" }, { PT_F127, "f127" },
2698 /* switch stack: */
2699 { PT_F2, "f2" }, { PT_F3, "f3" }, { PT_F4, "f4" },
2700 { PT_F5, "f5" }, { PT_F10, "f10" }, { PT_F11, "f11" },
2701 { PT_F12, "f12" }, { PT_F13, "f13" }, { PT_F14, "f14" },
2702 { PT_F15, "f15" }, { PT_F16, "f16" }, { PT_F17, "f17" },
2703 { PT_F18, "f18" }, { PT_F19, "f19" }, { PT_F20, "f20" },
2704 { PT_F21, "f21" }, { PT_F22, "f22" }, { PT_F23, "f23" },
2705 { PT_F24, "f24" }, { PT_F25, "f25" }, { PT_F26, "f26" },
2706 { PT_F27, "f27" }, { PT_F28, "f28" }, { PT_F29, "f29" },
2707 { PT_F30, "f30" }, { PT_F31, "f31" }, { PT_R4, "r4" },
2708 { PT_R5, "r5" }, { PT_R6, "r6" }, { PT_R7, "r7" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002709 { PT_B1, "b1" }, { PT_B2, "b2" }, { PT_B3, "b3" },
2710 { PT_B4, "b4" }, { PT_B5, "b5" },
Roland McGrathca4e10c2004-01-13 10:13:20 +00002711 { PT_AR_EC, "ar.ec" }, { PT_AR_LC, "ar.lc" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002712 /* pt_regs */
Roland McGrathca4e10c2004-01-13 10:13:20 +00002713 { PT_CR_IPSR, "psr" }, { PT_CR_IIP, "ip" },
2714 { PT_CFM, "cfm" }, { PT_AR_UNAT, "ar.unat" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002715 { PT_AR_PFS, "ar.pfs" }, { PT_AR_RSC, "ar.rsc" },
2716 { PT_AR_RNAT, "ar.rnat" }, { PT_AR_BSPSTORE, "ar.bspstore" },
2717 { PT_PR, "pr" }, { PT_B6, "b6" }, { PT_AR_BSP, "ar.bsp" },
2718 { PT_R1, "r1" }, { PT_R2, "r2" }, { PT_R3, "r3" },
2719 { PT_R12, "r12" }, { PT_R13, "r13" }, { PT_R14, "r14" },
2720 { PT_R15, "r15" }, { PT_R8, "r8" }, { PT_R9, "r9" },
2721 { PT_R10, "r10" }, { PT_R11, "r11" }, { PT_R16, "r16" },
2722 { PT_R17, "r17" }, { PT_R18, "r18" }, { PT_R19, "r19" },
2723 { PT_R20, "r20" }, { PT_R21, "r21" }, { PT_R22, "r22" },
2724 { PT_R23, "r23" }, { PT_R24, "r24" }, { PT_R25, "r25" },
2725 { PT_R26, "r26" }, { PT_R27, "r27" }, { PT_R28, "r28" },
2726 { PT_R29, "r29" }, { PT_R30, "r30" }, { PT_R31, "r31" },
2727 { PT_AR_CCV, "ar.ccv" }, { PT_AR_FPSR, "ar.fpsr" },
2728 { PT_B0, "b0" }, { PT_B7, "b7" }, { PT_F6, "f6" },
2729 { PT_F7, "f7" }, { PT_F8, "f8" }, { PT_F9, "f9" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002730# ifdef PT_AR_CSD
Roland McGrathfb1bc072004-03-01 21:29:24 +00002731 { PT_AR_CSD, "ar.csd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002732# endif
2733# ifdef PT_AR_SSD
Roland McGrathfb1bc072004-03-01 21:29:24 +00002734 { PT_AR_SSD, "ar.ssd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002735# endif
Roland McGrathca4e10c2004-01-13 10:13:20 +00002736 { PT_DBR, "dbr" }, { PT_IBR, "ibr" }, { PT_PMD, "pmd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002737# elif defined(I386)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002738 { 4*EBX, "4*EBX" },
2739 { 4*ECX, "4*ECX" },
2740 { 4*EDX, "4*EDX" },
2741 { 4*ESI, "4*ESI" },
2742 { 4*EDI, "4*EDI" },
2743 { 4*EBP, "4*EBP" },
2744 { 4*EAX, "4*EAX" },
2745 { 4*DS, "4*DS" },
2746 { 4*ES, "4*ES" },
2747 { 4*FS, "4*FS" },
2748 { 4*GS, "4*GS" },
2749 { 4*ORIG_EAX, "4*ORIG_EAX" },
2750 { 4*EIP, "4*EIP" },
2751 { 4*CS, "4*CS" },
2752 { 4*EFL, "4*EFL" },
2753 { 4*UESP, "4*UESP" },
2754 { 4*SS, "4*SS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002755# elif defined(X86_64)
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002756 { 8*R15, "8*R15" },
2757 { 8*R14, "8*R14" },
2758 { 8*R13, "8*R13" },
2759 { 8*R12, "8*R12" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002760 { 8*RBP, "8*RBP" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002761 { 8*RBX, "8*RBX" },
2762 { 8*R11, "8*R11" },
2763 { 8*R10, "8*R10" },
2764 { 8*R9, "8*R9" },
2765 { 8*R8, "8*R8" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002766 { 8*RAX, "8*RAX" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002767 { 8*RCX, "8*RCX" },
2768 { 8*RDX, "8*RDX" },
2769 { 8*RSI, "8*RSI" },
2770 { 8*RDI, "8*RDI" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002771# if 0
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002772 { DS, "DS" },
2773 { ES, "ES" },
2774 { FS, "FS" },
2775 { GS, "GS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002776# endif
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002777 { 8*ORIG_RAX, "8*ORIG_RAX" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002778 { 8*RIP, "8*RIP" },
2779 { 8*CS, "8*CS" },
2780 { 8*EFLAGS, "8*EFL" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002781 { 8*RSP, "8*RSP" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002782 { 8*SS, "8*SS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002783# elif defined(M68K)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002784 { 4*PT_D1, "4*PT_D1" },
2785 { 4*PT_D2, "4*PT_D2" },
2786 { 4*PT_D3, "4*PT_D3" },
2787 { 4*PT_D4, "4*PT_D4" },
2788 { 4*PT_D5, "4*PT_D5" },
2789 { 4*PT_D6, "4*PT_D6" },
2790 { 4*PT_D7, "4*PT_D7" },
2791 { 4*PT_A0, "4*PT_A0" },
2792 { 4*PT_A1, "4*PT_A1" },
2793 { 4*PT_A2, "4*PT_A2" },
2794 { 4*PT_A3, "4*PT_A3" },
2795 { 4*PT_A4, "4*PT_A4" },
2796 { 4*PT_A5, "4*PT_A5" },
2797 { 4*PT_A6, "4*PT_A6" },
2798 { 4*PT_D0, "4*PT_D0" },
2799 { 4*PT_USP, "4*PT_USP" },
2800 { 4*PT_ORIG_D0, "4*PT_ORIG_D0" },
2801 { 4*PT_SR, "4*PT_SR" },
2802 { 4*PT_PC, "4*PT_PC" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002803# elif defined(SH)
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002804 { 4*REG_REG0, "4*REG_REG0" },
2805 { 4*(REG_REG0+1), "4*REG_REG1" },
2806 { 4*(REG_REG0+2), "4*REG_REG2" },
2807 { 4*(REG_REG0+3), "4*REG_REG3" },
2808 { 4*(REG_REG0+4), "4*REG_REG4" },
2809 { 4*(REG_REG0+5), "4*REG_REG5" },
2810 { 4*(REG_REG0+6), "4*REG_REG6" },
2811 { 4*(REG_REG0+7), "4*REG_REG7" },
2812 { 4*(REG_REG0+8), "4*REG_REG8" },
2813 { 4*(REG_REG0+9), "4*REG_REG9" },
2814 { 4*(REG_REG0+10), "4*REG_REG10" },
2815 { 4*(REG_REG0+11), "4*REG_REG11" },
2816 { 4*(REG_REG0+12), "4*REG_REG12" },
2817 { 4*(REG_REG0+13), "4*REG_REG13" },
2818 { 4*(REG_REG0+14), "4*REG_REG14" },
2819 { 4*REG_REG15, "4*REG_REG15" },
2820 { 4*REG_PC, "4*REG_PC" },
2821 { 4*REG_PR, "4*REG_PR" },
2822 { 4*REG_SR, "4*REG_SR" },
2823 { 4*REG_GBR, "4*REG_GBR" },
2824 { 4*REG_MACH, "4*REG_MACH" },
2825 { 4*REG_MACL, "4*REG_MACL" },
2826 { 4*REG_SYSCALL, "4*REG_SYSCALL" },
2827 { 4*REG_FPUL, "4*REG_FPUL" },
2828 { 4*REG_FPREG0, "4*REG_FPREG0" },
2829 { 4*(REG_FPREG0+1), "4*REG_FPREG1" },
2830 { 4*(REG_FPREG0+2), "4*REG_FPREG2" },
2831 { 4*(REG_FPREG0+3), "4*REG_FPREG3" },
2832 { 4*(REG_FPREG0+4), "4*REG_FPREG4" },
2833 { 4*(REG_FPREG0+5), "4*REG_FPREG5" },
2834 { 4*(REG_FPREG0+6), "4*REG_FPREG6" },
2835 { 4*(REG_FPREG0+7), "4*REG_FPREG7" },
2836 { 4*(REG_FPREG0+8), "4*REG_FPREG8" },
2837 { 4*(REG_FPREG0+9), "4*REG_FPREG9" },
2838 { 4*(REG_FPREG0+10), "4*REG_FPREG10" },
2839 { 4*(REG_FPREG0+11), "4*REG_FPREG11" },
2840 { 4*(REG_FPREG0+12), "4*REG_FPREG12" },
2841 { 4*(REG_FPREG0+13), "4*REG_FPREG13" },
2842 { 4*(REG_FPREG0+14), "4*REG_FPREG14" },
2843 { 4*REG_FPREG15, "4*REG_FPREG15" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002844# ifdef REG_XDREG0
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002845 { 4*REG_XDREG0, "4*REG_XDREG0" },
2846 { 4*(REG_XDREG0+2), "4*REG_XDREG2" },
2847 { 4*(REG_XDREG0+4), "4*REG_XDREG4" },
2848 { 4*(REG_XDREG0+6), "4*REG_XDREG6" },
2849 { 4*(REG_XDREG0+8), "4*REG_XDREG8" },
2850 { 4*(REG_XDREG0+10), "4*REG_XDREG10" },
2851 { 4*(REG_XDREG0+12), "4*REG_XDREG12" },
2852 { 4*REG_XDREG14, "4*REG_XDREG14" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002853# endif
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002854 { 4*REG_FPSCR, "4*REG_FPSCR" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002855# elif defined(SH64)
Roland McGrathe1e584b2003-06-02 19:18:58 +00002856 { 0, "PC(L)" },
2857 { 4, "PC(U)" },
2858 { 8, "SR(L)" },
2859 { 12, "SR(U)" },
2860 { 16, "syscall no.(L)" },
2861 { 20, "syscall_no.(U)" },
2862 { 24, "R0(L)" },
2863 { 28, "R0(U)" },
2864 { 32, "R1(L)" },
2865 { 36, "R1(U)" },
2866 { 40, "R2(L)" },
2867 { 44, "R2(U)" },
2868 { 48, "R3(L)" },
2869 { 52, "R3(U)" },
2870 { 56, "R4(L)" },
2871 { 60, "R4(U)" },
2872 { 64, "R5(L)" },
2873 { 68, "R5(U)" },
2874 { 72, "R6(L)" },
2875 { 76, "R6(U)" },
2876 { 80, "R7(L)" },
2877 { 84, "R7(U)" },
2878 { 88, "R8(L)" },
2879 { 92, "R8(U)" },
2880 { 96, "R9(L)" },
2881 { 100, "R9(U)" },
2882 { 104, "R10(L)" },
2883 { 108, "R10(U)" },
2884 { 112, "R11(L)" },
2885 { 116, "R11(U)" },
2886 { 120, "R12(L)" },
2887 { 124, "R12(U)" },
2888 { 128, "R13(L)" },
2889 { 132, "R13(U)" },
2890 { 136, "R14(L)" },
2891 { 140, "R14(U)" },
2892 { 144, "R15(L)" },
2893 { 148, "R15(U)" },
2894 { 152, "R16(L)" },
2895 { 156, "R16(U)" },
2896 { 160, "R17(L)" },
2897 { 164, "R17(U)" },
2898 { 168, "R18(L)" },
2899 { 172, "R18(U)" },
2900 { 176, "R19(L)" },
2901 { 180, "R19(U)" },
2902 { 184, "R20(L)" },
2903 { 188, "R20(U)" },
2904 { 192, "R21(L)" },
2905 { 196, "R21(U)" },
2906 { 200, "R22(L)" },
2907 { 204, "R22(U)" },
2908 { 208, "R23(L)" },
2909 { 212, "R23(U)" },
2910 { 216, "R24(L)" },
2911 { 220, "R24(U)" },
2912 { 224, "R25(L)" },
2913 { 228, "R25(U)" },
2914 { 232, "R26(L)" },
2915 { 236, "R26(U)" },
2916 { 240, "R27(L)" },
2917 { 244, "R27(U)" },
2918 { 248, "R28(L)" },
2919 { 252, "R28(U)" },
2920 { 256, "R29(L)" },
2921 { 260, "R29(U)" },
2922 { 264, "R30(L)" },
2923 { 268, "R30(U)" },
2924 { 272, "R31(L)" },
2925 { 276, "R31(U)" },
2926 { 280, "R32(L)" },
2927 { 284, "R32(U)" },
2928 { 288, "R33(L)" },
2929 { 292, "R33(U)" },
2930 { 296, "R34(L)" },
2931 { 300, "R34(U)" },
2932 { 304, "R35(L)" },
2933 { 308, "R35(U)" },
2934 { 312, "R36(L)" },
2935 { 316, "R36(U)" },
2936 { 320, "R37(L)" },
2937 { 324, "R37(U)" },
2938 { 328, "R38(L)" },
2939 { 332, "R38(U)" },
2940 { 336, "R39(L)" },
2941 { 340, "R39(U)" },
2942 { 344, "R40(L)" },
2943 { 348, "R40(U)" },
2944 { 352, "R41(L)" },
2945 { 356, "R41(U)" },
2946 { 360, "R42(L)" },
2947 { 364, "R42(U)" },
2948 { 368, "R43(L)" },
2949 { 372, "R43(U)" },
2950 { 376, "R44(L)" },
2951 { 380, "R44(U)" },
2952 { 384, "R45(L)" },
2953 { 388, "R45(U)" },
2954 { 392, "R46(L)" },
2955 { 396, "R46(U)" },
2956 { 400, "R47(L)" },
2957 { 404, "R47(U)" },
2958 { 408, "R48(L)" },
2959 { 412, "R48(U)" },
2960 { 416, "R49(L)" },
2961 { 420, "R49(U)" },
2962 { 424, "R50(L)" },
2963 { 428, "R50(U)" },
2964 { 432, "R51(L)" },
2965 { 436, "R51(U)" },
2966 { 440, "R52(L)" },
2967 { 444, "R52(U)" },
2968 { 448, "R53(L)" },
2969 { 452, "R53(U)" },
2970 { 456, "R54(L)" },
2971 { 460, "R54(U)" },
2972 { 464, "R55(L)" },
2973 { 468, "R55(U)" },
2974 { 472, "R56(L)" },
2975 { 476, "R56(U)" },
2976 { 480, "R57(L)" },
2977 { 484, "R57(U)" },
2978 { 488, "R58(L)" },
2979 { 492, "R58(U)" },
2980 { 496, "R59(L)" },
2981 { 500, "R59(U)" },
2982 { 504, "R60(L)" },
2983 { 508, "R60(U)" },
2984 { 512, "R61(L)" },
2985 { 516, "R61(U)" },
2986 { 520, "R62(L)" },
2987 { 524, "R62(U)" },
2988 { 528, "TR0(L)" },
2989 { 532, "TR0(U)" },
2990 { 536, "TR1(L)" },
2991 { 540, "TR1(U)" },
2992 { 544, "TR2(L)" },
2993 { 548, "TR2(U)" },
2994 { 552, "TR3(L)" },
2995 { 556, "TR3(U)" },
2996 { 560, "TR4(L)" },
2997 { 564, "TR4(U)" },
2998 { 568, "TR5(L)" },
2999 { 572, "TR5(U)" },
3000 { 576, "TR6(L)" },
3001 { 580, "TR6(U)" },
3002 { 584, "TR7(L)" },
3003 { 588, "TR7(U)" },
Denys Vlasenkoadedb512008-12-30 18:47:55 +00003004 /* This entry is in case pt_regs contains dregs (depends on
3005 the kernel build options). */
Roland McGrathe1e584b2003-06-02 19:18:58 +00003006 { uoff(regs), "offsetof(struct user, regs)" },
3007 { uoff(fpu), "offsetof(struct user, fpu)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003008# elif defined(ARM)
Roland McGrath0f87c492003-06-03 23:29:04 +00003009 { uoff(regs.ARM_r0), "r0" },
3010 { uoff(regs.ARM_r1), "r1" },
3011 { uoff(regs.ARM_r2), "r2" },
3012 { uoff(regs.ARM_r3), "r3" },
3013 { uoff(regs.ARM_r4), "r4" },
3014 { uoff(regs.ARM_r5), "r5" },
3015 { uoff(regs.ARM_r6), "r6" },
3016 { uoff(regs.ARM_r7), "r7" },
3017 { uoff(regs.ARM_r8), "r8" },
3018 { uoff(regs.ARM_r9), "r9" },
3019 { uoff(regs.ARM_r10), "r10" },
3020 { uoff(regs.ARM_fp), "fp" },
3021 { uoff(regs.ARM_ip), "ip" },
3022 { uoff(regs.ARM_sp), "sp" },
3023 { uoff(regs.ARM_lr), "lr" },
3024 { uoff(regs.ARM_pc), "pc" },
3025 { uoff(regs.ARM_cpsr), "cpsr" },
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00003026# elif defined(AVR32)
3027 { uoff(regs.sr), "sr" },
3028 { uoff(regs.pc), "pc" },
3029 { uoff(regs.lr), "lr" },
3030 { uoff(regs.sp), "sp" },
3031 { uoff(regs.r12), "r12" },
3032 { uoff(regs.r11), "r11" },
3033 { uoff(regs.r10), "r10" },
3034 { uoff(regs.r9), "r9" },
3035 { uoff(regs.r8), "r8" },
3036 { uoff(regs.r7), "r7" },
3037 { uoff(regs.r6), "r6" },
3038 { uoff(regs.r5), "r5" },
3039 { uoff(regs.r4), "r4" },
3040 { uoff(regs.r3), "r3" },
3041 { uoff(regs.r2), "r2" },
3042 { uoff(regs.r1), "r1" },
3043 { uoff(regs.r0), "r0" },
3044 { uoff(regs.r12_orig), "orig_r12" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003045# elif defined(MIPS)
Roland McGrath542c2c62008-05-20 01:11:56 +00003046 { 0, "r0" },
3047 { 1, "r1" },
3048 { 2, "r2" },
3049 { 3, "r3" },
3050 { 4, "r4" },
3051 { 5, "r5" },
3052 { 6, "r6" },
3053 { 7, "r7" },
3054 { 8, "r8" },
3055 { 9, "r9" },
3056 { 10, "r10" },
3057 { 11, "r11" },
3058 { 12, "r12" },
3059 { 13, "r13" },
3060 { 14, "r14" },
3061 { 15, "r15" },
3062 { 16, "r16" },
3063 { 17, "r17" },
3064 { 18, "r18" },
3065 { 19, "r19" },
3066 { 20, "r20" },
3067 { 21, "r21" },
3068 { 22, "r22" },
3069 { 23, "r23" },
3070 { 24, "r24" },
3071 { 25, "r25" },
3072 { 26, "r26" },
3073 { 27, "r27" },
3074 { 28, "r28" },
3075 { 29, "r29" },
3076 { 30, "r30" },
3077 { 31, "r31" },
3078 { 32, "f0" },
3079 { 33, "f1" },
3080 { 34, "f2" },
3081 { 35, "f3" },
3082 { 36, "f4" },
3083 { 37, "f5" },
3084 { 38, "f6" },
3085 { 39, "f7" },
3086 { 40, "f8" },
3087 { 41, "f9" },
3088 { 42, "f10" },
3089 { 43, "f11" },
3090 { 44, "f12" },
3091 { 45, "f13" },
3092 { 46, "f14" },
3093 { 47, "f15" },
3094 { 48, "f16" },
3095 { 49, "f17" },
3096 { 50, "f18" },
3097 { 51, "f19" },
3098 { 52, "f20" },
3099 { 53, "f21" },
3100 { 54, "f22" },
3101 { 55, "f23" },
3102 { 56, "f24" },
3103 { 57, "f25" },
3104 { 58, "f26" },
3105 { 59, "f27" },
3106 { 60, "f28" },
3107 { 61, "f29" },
3108 { 62, "f30" },
3109 { 63, "f31" },
3110 { 64, "pc" },
3111 { 65, "cause" },
3112 { 66, "badvaddr" },
3113 { 67, "mmhi" },
3114 { 68, "mmlo" },
3115 { 69, "fpcsr" },
3116 { 70, "fpeir" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003117# endif
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003118# ifdef CRISV10
3119 { 4*PT_FRAMETYPE, "4*PT_FRAMETYPE" },
3120 { 4*PT_ORIG_R10, "4*PT_ORIG_R10" },
3121 { 4*PT_R13, "4*PT_R13" },
3122 { 4*PT_R12, "4*PT_R12" },
3123 { 4*PT_R11, "4*PT_R11" },
3124 { 4*PT_R10, "4*PT_R10" },
3125 { 4*PT_R9, "4*PT_R9" },
3126 { 4*PT_R8, "4*PT_R8" },
3127 { 4*PT_R7, "4*PT_R7" },
3128 { 4*PT_R6, "4*PT_R6" },
3129 { 4*PT_R5, "4*PT_R5" },
3130 { 4*PT_R4, "4*PT_R4" },
3131 { 4*PT_R3, "4*PT_R3" },
3132 { 4*PT_R2, "4*PT_R2" },
3133 { 4*PT_R1, "4*PT_R1" },
3134 { 4*PT_R0, "4*PT_R0" },
3135 { 4*PT_MOF, "4*PT_MOF" },
3136 { 4*PT_DCCR, "4*PT_DCCR" },
3137 { 4*PT_SRP, "4*PT_SRP" },
3138 { 4*PT_IRP, "4*PT_IRP" },
3139 { 4*PT_CSRINSTR, "4*PT_CSRINSTR" },
3140 { 4*PT_CSRADDR, "4*PT_CSRADDR" },
3141 { 4*PT_CSRDATA, "4*PT_CSRDATA" },
3142 { 4*PT_USP, "4*PT_USP" },
3143# endif
3144# ifdef CRISV32
3145 { 4*PT_ORIG_R10, "4*PT_ORIG_R10" },
3146 { 4*PT_R0, "4*PT_R0" },
3147 { 4*PT_R1, "4*PT_R1" },
3148 { 4*PT_R2, "4*PT_R2" },
3149 { 4*PT_R3, "4*PT_R3" },
3150 { 4*PT_R4, "4*PT_R4" },
3151 { 4*PT_R5, "4*PT_R5" },
3152 { 4*PT_R6, "4*PT_R6" },
3153 { 4*PT_R7, "4*PT_R7" },
3154 { 4*PT_R8, "4*PT_R8" },
3155 { 4*PT_R9, "4*PT_R9" },
3156 { 4*PT_R10, "4*PT_R10" },
3157 { 4*PT_R11, "4*PT_R11" },
3158 { 4*PT_R12, "4*PT_R12" },
3159 { 4*PT_R13, "4*PT_R13" },
3160 { 4*PT_ACR, "4*PT_ACR" },
3161 { 4*PT_SRS, "4*PT_SRS" },
3162 { 4*PT_MOF, "4*PT_MOF" },
3163 { 4*PT_SPC, "4*PT_SPC" },
3164 { 4*PT_CCS, "4*PT_CCS" },
3165 { 4*PT_SRP, "4*PT_SRP" },
3166 { 4*PT_ERP, "4*PT_ERP" },
3167 { 4*PT_EXS, "4*PT_EXS" },
3168 { 4*PT_EDA, "4*PT_EDA" },
3169 { 4*PT_USP, "4*PT_USP" },
3170 { 4*PT_PPC, "4*PT_PPC" },
3171 { 4*PT_BP_CTRL, "4*PT_BP_CTRL" },
3172 { 4*PT_BP+4, "4*PT_BP+4" },
3173 { 4*PT_BP+8, "4*PT_BP+8" },
3174 { 4*PT_BP+12, "4*PT_BP+12" },
3175 { 4*PT_BP+16, "4*PT_BP+16" },
3176 { 4*PT_BP+20, "4*PT_BP+20" },
3177 { 4*PT_BP+24, "4*PT_BP+24" },
3178 { 4*PT_BP+28, "4*PT_BP+28" },
3179 { 4*PT_BP+32, "4*PT_BP+32" },
3180 { 4*PT_BP+36, "4*PT_BP+36" },
3181 { 4*PT_BP+40, "4*PT_BP+40" },
3182 { 4*PT_BP+44, "4*PT_BP+44" },
3183 { 4*PT_BP+48, "4*PT_BP+48" },
3184 { 4*PT_BP+52, "4*PT_BP+52" },
3185 { 4*PT_BP+56, "4*PT_BP+56" },
3186# endif
Roland McGrath542c2c62008-05-20 01:11:56 +00003187
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003188# if !defined(SPARC) && !defined(HPPA) && !defined(POWERPC) \
3189 && !defined(ALPHA) && !defined(IA64) \
3190 && !defined(CRISV10) && !defined(CRISV32)
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00003191# if !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SPARC64) && !defined(AVR32) && !defined(BFIN)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003192 { uoff(u_fpvalid), "offsetof(struct user, u_fpvalid)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003193# endif
3194# if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003195 { uoff(i387), "offsetof(struct user, i387)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003196# endif
3197# if defined(M68K)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003198 { uoff(m68kfp), "offsetof(struct user, m68kfp)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003199# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003200 { uoff(u_tsize), "offsetof(struct user, u_tsize)" },
3201 { uoff(u_dsize), "offsetof(struct user, u_dsize)" },
3202 { uoff(u_ssize), "offsetof(struct user, u_ssize)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003203# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003204 { uoff(start_code), "offsetof(struct user, start_code)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003205# endif
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00003206# if defined(AVR32) || defined(SH64)
Roland McGrathe1e584b2003-06-02 19:18:58 +00003207 { uoff(start_data), "offsetof(struct user, start_data)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003208# endif
3209# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003210 { uoff(start_stack), "offsetof(struct user, start_stack)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003211# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003212 { uoff(signal), "offsetof(struct user, signal)" },
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00003213# if !defined(AVR32) && !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SH) && !defined(SH64) && !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003214 { uoff(reserved), "offsetof(struct user, reserved)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003215# endif
3216# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003217 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003218# endif
Denys Vlasenko5ae2b7c2009-02-27 20:32:52 +00003219# if !defined(ARM) && !defined(AVR32) && !defined(MIPS) && !defined(S390) && !defined(S390X) && !defined(SPARC64) && !defined(BFIN)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003220 { uoff(u_fpstate), "offsetof(struct user, u_fpstate)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003221# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003222 { uoff(magic), "offsetof(struct user, magic)" },
3223 { uoff(u_comm), "offsetof(struct user, u_comm)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003224# if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003225 { uoff(u_debugreg), "offsetof(struct user, u_debugreg)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003226# endif
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003227# endif /* !defined(many arches) */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003228
3229# endif /* LINUX */
3230
3231# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003232 { uoff(u_pcb), "offsetof(struct user, u_pcb)" },
3233 { uoff(u_procp), "offsetof(struct user, u_procp)" },
3234 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
3235 { uoff(u_comm[0]), "offsetof(struct user, u_comm[0])" },
3236 { uoff(u_arg[0]), "offsetof(struct user, u_arg[0])" },
3237 { uoff(u_ap), "offsetof(struct user, u_ap)" },
3238 { uoff(u_qsave), "offsetof(struct user, u_qsave)" },
3239 { uoff(u_rval1), "offsetof(struct user, u_rval1)" },
3240 { uoff(u_rval2), "offsetof(struct user, u_rval2)" },
3241 { uoff(u_error), "offsetof(struct user, u_error)" },
3242 { uoff(u_eosys), "offsetof(struct user, u_eosys)" },
3243 { uoff(u_ssave), "offsetof(struct user, u_ssave)" },
3244 { uoff(u_signal[0]), "offsetof(struct user, u_signal)" },
3245 { uoff(u_sigmask[0]), "offsetof(struct user, u_sigmask)" },
3246 { uoff(u_sigonstack), "offsetof(struct user, u_sigonstack)" },
3247 { uoff(u_sigintr), "offsetof(struct user, u_sigintr)" },
3248 { uoff(u_sigreset), "offsetof(struct user, u_sigreset)" },
3249 { uoff(u_oldmask), "offsetof(struct user, u_oldmask)" },
3250 { uoff(u_code), "offsetof(struct user, u_code)" },
3251 { uoff(u_addr), "offsetof(struct user, u_addr)" },
3252 { uoff(u_sigstack), "offsetof(struct user, u_sigstack)" },
3253 { uoff(u_ofile), "offsetof(struct user, u_ofile)" },
3254 { uoff(u_pofile), "offsetof(struct user, u_pofile)" },
3255 { uoff(u_ofile_arr[0]), "offsetof(struct user, u_ofile_arr[0])" },
3256 { uoff(u_pofile_arr[0]),"offsetof(struct user, u_pofile_arr[0])"},
3257 { uoff(u_lastfile), "offsetof(struct user, u_lastfile)" },
3258 { uoff(u_cwd), "offsetof(struct user, u_cwd)" },
3259 { uoff(u_cdir), "offsetof(struct user, u_cdir)" },
3260 { uoff(u_rdir), "offsetof(struct user, u_rdir)" },
3261 { uoff(u_cmask), "offsetof(struct user, u_cmask)" },
3262 { uoff(u_ru), "offsetof(struct user, u_ru)" },
3263 { uoff(u_cru), "offsetof(struct user, u_cru)" },
3264 { uoff(u_timer[0]), "offsetof(struct user, u_timer[0])" },
3265 { uoff(u_XXX[0]), "offsetof(struct user, u_XXX[0])" },
3266 { uoff(u_ioch), "offsetof(struct user, u_ioch)" },
3267 { uoff(u_start), "offsetof(struct user, u_start)" },
3268 { uoff(u_acflag), "offsetof(struct user, u_acflag)" },
3269 { uoff(u_prof.pr_base), "offsetof(struct user, u_prof.pr_base)" },
3270 { uoff(u_prof.pr_size), "offsetof(struct user, u_prof.pr_size)" },
3271 { uoff(u_prof.pr_off), "offsetof(struct user, u_prof.pr_off)" },
3272 { uoff(u_prof.pr_scale),"offsetof(struct user, u_prof.pr_scale)"},
3273 { uoff(u_rlimit[0]), "offsetof(struct user, u_rlimit)" },
3274 { uoff(u_exdata.Ux_A), "offsetof(struct user, u_exdata.Ux_A)" },
3275 { uoff(u_exdata.ux_shell[0]),"offsetof(struct user, u_exdata.ux_shell[0])"},
3276 { uoff(u_lofault), "offsetof(struct user, u_lofault)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003277# endif /* SUNOS4 */
3278# ifndef HPPA
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003279 { sizeof(struct user), "sizeof(struct user)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003280# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003281 { 0, NULL },
3282};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003283# endif /* !FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003284
3285int
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003286sys_ptrace(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003287{
Roland McGrathd9f816f2004-09-04 03:39:20 +00003288 const struct xlat *x;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003289 long addr;
3290
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003291 if (entering(tcp)) {
Roland McGrathbf621d42003-01-14 09:46:21 +00003292 printxval(ptrace_cmds, tcp->u_arg[0],
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003293# ifndef FREEBSD
Roland McGrathbf621d42003-01-14 09:46:21 +00003294 "PTRACE_???"
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003295# else
Roland McGrathbf621d42003-01-14 09:46:21 +00003296 "PT_???"
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003297# endif
Roland McGrathbf621d42003-01-14 09:46:21 +00003298 );
3299 tprintf(", %lu, ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003300 addr = tcp->u_arg[2];
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003301# ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003302 if (tcp->u_arg[0] == PTRACE_PEEKUSER
3303 || tcp->u_arg[0] == PTRACE_POKEUSER) {
3304 for (x = struct_user_offsets; x->str; x++) {
3305 if (x->val >= addr)
3306 break;
3307 }
3308 if (!x->str)
3309 tprintf("%#lx, ", addr);
3310 else if (x->val > addr && x != struct_user_offsets) {
3311 x--;
3312 tprintf("%s + %ld, ", x->str, addr - x->val);
3313 }
3314 else
3315 tprintf("%s, ", x->str);
3316 }
3317 else
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003318# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003319 tprintf("%#lx, ", tcp->u_arg[2]);
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003320# ifdef LINUX
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003321 switch (tcp->u_arg[0]) {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003322# ifndef IA64
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003323 case PTRACE_PEEKDATA:
3324 case PTRACE_PEEKTEXT:
3325 case PTRACE_PEEKUSER:
3326 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003327# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003328 case PTRACE_CONT:
3329 case PTRACE_SINGLESTEP:
3330 case PTRACE_SYSCALL:
3331 case PTRACE_DETACH:
3332 printsignal(tcp->u_arg[3]);
3333 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003334# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00003335 case PTRACE_SETOPTIONS:
3336 printflags(ptrace_setoptions_flags, tcp->u_arg[3], "PTRACE_O_???");
3337 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003338# endif
3339# ifdef PTRACE_SETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003340 case PTRACE_SETSIGINFO: {
3341 siginfo_t si;
3342 if (!tcp->u_arg[3])
3343 tprintf("NULL");
3344 else if (syserror(tcp))
3345 tprintf("%#lx", tcp->u_arg[3]);
3346 else if (umove(tcp, tcp->u_arg[3], &si) < 0)
3347 tprintf("{???}");
3348 else
3349 printsiginfo(&si, verbose(tcp));
3350 break;
3351 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003352# endif
3353# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003354 case PTRACE_GETSIGINFO:
3355 /* Don't print anything, do it at syscall return. */
3356 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003357# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003358 default:
3359 tprintf("%#lx", tcp->u_arg[3]);
3360 break;
3361 }
3362 } else {
3363 switch (tcp->u_arg[0]) {
3364 case PTRACE_PEEKDATA:
3365 case PTRACE_PEEKTEXT:
3366 case PTRACE_PEEKUSER:
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003367# ifdef IA64
Roland McGrath1e868062007-11-19 22:11:45 +00003368 return RVAL_HEX;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003369# else
Roland McGratheb285352003-01-14 09:59:00 +00003370 printnum(tcp, tcp->u_arg[3], "%#lx");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003371 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003372# endif
3373# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003374 case PTRACE_GETSIGINFO: {
3375 siginfo_t si;
3376 if (!tcp->u_arg[3])
3377 tprintf("NULL");
3378 else if (syserror(tcp))
3379 tprintf("%#lx", tcp->u_arg[3]);
3380 else if (umove(tcp, tcp->u_arg[3], &si) < 0)
3381 tprintf("{???}");
3382 else
3383 printsiginfo(&si, verbose(tcp));
3384 break;
3385 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003386# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003387 }
3388 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003389# endif /* LINUX */
3390# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003391 if (tcp->u_arg[0] == PTRACE_WRITEDATA ||
3392 tcp->u_arg[0] == PTRACE_WRITETEXT) {
3393 tprintf("%lu, ", tcp->u_arg[3]);
3394 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3395 } else if (tcp->u_arg[0] != PTRACE_READDATA &&
3396 tcp->u_arg[0] != PTRACE_READTEXT) {
3397 tprintf("%#lx", tcp->u_arg[3]);
3398 }
3399 } else {
3400 if (tcp->u_arg[0] == PTRACE_READDATA ||
3401 tcp->u_arg[0] == PTRACE_READTEXT) {
3402 tprintf("%lu, ", tcp->u_arg[3]);
3403 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3404 }
3405 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003406# endif /* SUNOS4 */
3407# ifdef FREEBSD
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00003408 tprintf("%lu", tcp->u_arg[3]);
3409 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003410# endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003411 return 0;
3412}
3413
3414#endif /* !SVR4 */
Roland McGrath5a223472002-12-15 23:58:26 +00003415
3416#ifdef LINUX
Roland McGrath51942a92007-07-05 18:59:11 +00003417# ifndef FUTEX_CMP_REQUEUE
3418# define FUTEX_CMP_REQUEUE 4
3419# endif
3420# ifndef FUTEX_WAKE_OP
3421# define FUTEX_WAKE_OP 5
3422# endif
3423# ifndef FUTEX_LOCK_PI
3424# define FUTEX_LOCK_PI 6
3425# define FUTEX_UNLOCK_PI 7
3426# define FUTEX_TRYLOCK_PI 8
3427# endif
Roland McGrath1aeaf742008-07-18 01:27:39 +00003428# ifndef FUTEX_WAIT_BITSET
3429# define FUTEX_WAIT_BITSET 9
3430# endif
3431# ifndef FUTEX_WAKE_BITSET
3432# define FUTEX_WAKE_BITSET 10
Roland McGrath51942a92007-07-05 18:59:11 +00003433# endif
3434# ifndef FUTEX_PRIVATE_FLAG
3435# define FUTEX_PRIVATE_FLAG 128
3436# endif
Roland McGrathd9f816f2004-09-04 03:39:20 +00003437static const struct xlat futexops[] = {
Roland McGrath51942a92007-07-05 18:59:11 +00003438 { FUTEX_WAIT, "FUTEX_WAIT" },
3439 { FUTEX_WAKE, "FUTEX_WAKE" },
3440 { FUTEX_FD, "FUTEX_FD" },
3441 { FUTEX_REQUEUE, "FUTEX_REQUEUE" },
3442 { FUTEX_CMP_REQUEUE, "FUTEX_CMP_REQUEUE" },
3443 { FUTEX_WAKE_OP, "FUTEX_WAKE_OP" },
3444 { FUTEX_LOCK_PI, "FUTEX_LOCK_PI" },
3445 { FUTEX_UNLOCK_PI, "FUTEX_UNLOCK_PI" },
3446 { FUTEX_TRYLOCK_PI, "FUTEX_TRYLOCK_PI" },
Roland McGrath1aeaf742008-07-18 01:27:39 +00003447 { FUTEX_WAIT_BITSET, "FUTEX_WAIT_BITSET" },
3448 { FUTEX_WAKE_BITSET, "FUTEX_WAKE_BITSET" },
Roland McGrath51942a92007-07-05 18:59:11 +00003449 { FUTEX_WAIT|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_PRIVATE" },
3450 { FUTEX_WAKE|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_PRIVATE" },
3451 { FUTEX_FD|FUTEX_PRIVATE_FLAG, "FUTEX_FD_PRIVATE" },
3452 { FUTEX_REQUEUE|FUTEX_PRIVATE_FLAG, "FUTEX_REQUEUE_PRIVATE" },
3453 { FUTEX_CMP_REQUEUE|FUTEX_PRIVATE_FLAG, "FUTEX_CMP_REQUEUE_PRIVATE" },
3454 { FUTEX_WAKE_OP|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_OP_PRIVATE" },
3455 { FUTEX_LOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_LOCK_PI_PRIVATE" },
3456 { FUTEX_UNLOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_UNLOCK_PI_PRIVATE" },
3457 { FUTEX_TRYLOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_TRYLOCK_PI_PRIVATE" },
Roland McGrath1aeaf742008-07-18 01:27:39 +00003458 { FUTEX_WAIT_BITSET|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_BITSET_PRIVATE" },
3459 { FUTEX_WAKE_BITSET|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_BITSET_PRIVATE" },
Roland McGrath51942a92007-07-05 18:59:11 +00003460 { 0, NULL }
3461};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003462# ifndef FUTEX_OP_SET
3463# define FUTEX_OP_SET 0
3464# define FUTEX_OP_ADD 1
3465# define FUTEX_OP_OR 2
3466# define FUTEX_OP_ANDN 3
3467# define FUTEX_OP_XOR 4
3468# define FUTEX_OP_CMP_EQ 0
3469# define FUTEX_OP_CMP_NE 1
3470# define FUTEX_OP_CMP_LT 2
3471# define FUTEX_OP_CMP_LE 3
3472# define FUTEX_OP_CMP_GT 4
3473# define FUTEX_OP_CMP_GE 5
3474# endif
Roland McGrath51942a92007-07-05 18:59:11 +00003475static const struct xlat futexwakeops[] = {
3476 { FUTEX_OP_SET, "FUTEX_OP_SET" },
3477 { FUTEX_OP_ADD, "FUTEX_OP_ADD" },
3478 { FUTEX_OP_OR, "FUTEX_OP_OR" },
3479 { FUTEX_OP_ANDN, "FUTEX_OP_ANDN" },
3480 { FUTEX_OP_XOR, "FUTEX_OP_XOR" },
3481 { 0, NULL }
3482};
3483static const struct xlat futexwakecmps[] = {
3484 { FUTEX_OP_CMP_EQ, "FUTEX_OP_CMP_EQ" },
3485 { FUTEX_OP_CMP_NE, "FUTEX_OP_CMP_NE" },
3486 { FUTEX_OP_CMP_LT, "FUTEX_OP_CMP_LT" },
3487 { FUTEX_OP_CMP_LE, "FUTEX_OP_CMP_LE" },
3488 { FUTEX_OP_CMP_GT, "FUTEX_OP_CMP_GT" },
3489 { FUTEX_OP_CMP_GE, "FUTEX_OP_CMP_GE" },
3490 { 0, NULL }
Roland McGrath5a223472002-12-15 23:58:26 +00003491};
3492
3493int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003494sys_futex(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003495{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003496 if (entering(tcp)) {
3497 long int cmd = tcp->u_arg[1] & 127;
3498 tprintf("%p, ", (void *) tcp->u_arg[0]);
3499 printxval(futexops, tcp->u_arg[1], "FUTEX_???");
3500 tprintf(", %ld", tcp->u_arg[2]);
3501 if (cmd == FUTEX_WAKE_BITSET)
3502 tprintf(", %lx", tcp->u_arg[5]);
3503 else if (cmd == FUTEX_WAIT) {
3504 tprintf(", ");
3505 printtv(tcp, tcp->u_arg[3]);
3506 } else if (cmd == FUTEX_WAIT_BITSET) {
3507 tprintf(", ");
3508 printtv(tcp, tcp->u_arg[3]);
3509 tprintf(", %lx", tcp->u_arg[5]);
3510 } else if (cmd == FUTEX_REQUEUE)
3511 tprintf(", %ld, %p", tcp->u_arg[3], (void *) tcp->u_arg[4]);
3512 else if (cmd == FUTEX_CMP_REQUEUE)
3513 tprintf(", %ld, %p, %ld", tcp->u_arg[3], (void *) tcp->u_arg[4], tcp->u_arg[5]);
3514 else if (cmd == FUTEX_WAKE_OP) {
3515 tprintf(", %ld, %p, {", tcp->u_arg[3], (void *) tcp->u_arg[4]);
3516 if ((tcp->u_arg[5] >> 28) & 8)
3517 tprintf("FUTEX_OP_OPARG_SHIFT|");
3518 printxval(futexwakeops, (tcp->u_arg[5] >> 28) & 0x7, "FUTEX_OP_???");
3519 tprintf(", %ld, ", (tcp->u_arg[5] >> 12) & 0xfff);
3520 if ((tcp->u_arg[5] >> 24) & 8)
3521 tprintf("FUTEX_OP_OPARG_SHIFT|");
3522 printxval(futexwakecmps, (tcp->u_arg[5] >> 24) & 0x7, "FUTEX_OP_CMP_???");
3523 tprintf(", %ld}", tcp->u_arg[5] & 0xfff);
3524 }
Roland McGrath51942a92007-07-05 18:59:11 +00003525 }
Denys Vlasenko1d632462009-04-14 12:51:00 +00003526 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003527}
3528
3529static void
Denys Vlasenko1d632462009-04-14 12:51:00 +00003530print_affinitylist(struct tcb *tcp, long list, unsigned int len)
Roland McGrath5a223472002-12-15 23:58:26 +00003531{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003532 int first = 1;
3533 tprintf(" {");
3534 while (len >= sizeof (unsigned long)) {
3535 unsigned long w;
3536 umove(tcp, list, &w);
3537 tprintf("%s %lx", first ? "" : ",", w);
3538 first = 0;
3539 len -= sizeof (unsigned long);
3540 list += sizeof(unsigned long);
3541 }
3542 tprintf(" }");
Roland McGrath5a223472002-12-15 23:58:26 +00003543}
3544
3545int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003546sys_sched_setaffinity(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003547{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003548 if (entering(tcp)) {
3549 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3550 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_arg[1]);
3551 }
3552 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003553}
3554
3555int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003556sys_sched_getaffinity(struct tcb *tcp)
Roland McGrath5a223472002-12-15 23:58:26 +00003557{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003558 if (entering(tcp)) {
3559 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3560 } else {
3561 if (tcp->u_rval == -1)
3562 tprintf("%#lx", tcp->u_arg[2]);
3563 else
3564 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_rval);
3565 }
3566 return 0;
Roland McGrath5a223472002-12-15 23:58:26 +00003567}
Roland McGrath279d3782004-03-01 20:27:37 +00003568
Roland McGrathd9f816f2004-09-04 03:39:20 +00003569static const struct xlat schedulers[] = {
Roland McGrath279d3782004-03-01 20:27:37 +00003570 { SCHED_OTHER, "SCHED_OTHER" },
3571 { SCHED_RR, "SCHED_RR" },
3572 { SCHED_FIFO, "SCHED_FIFO" },
3573 { 0, NULL }
3574};
3575
3576int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003577sys_sched_getscheduler(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003578{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003579 if (entering(tcp)) {
3580 tprintf("%d", (int) tcp->u_arg[0]);
3581 } else if (! syserror(tcp)) {
3582 tcp->auxstr = xlookup (schedulers, tcp->u_rval);
3583 if (tcp->auxstr != NULL)
3584 return RVAL_STR;
3585 }
3586 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003587}
3588
3589int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003590sys_sched_setscheduler(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003591{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003592 if (entering(tcp)) {
3593 struct sched_param p;
3594 tprintf("%d, ", (int) tcp->u_arg[0]);
3595 printxval(schedulers, tcp->u_arg[1], "SCHED_???");
3596 if (umove(tcp, tcp->u_arg[2], &p) < 0)
3597 tprintf(", %#lx", tcp->u_arg[2]);
3598 else
3599 tprintf(", { %d }", p.__sched_priority);
3600 }
3601 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003602}
3603
3604int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003605sys_sched_getparam(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003606{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003607 if (entering(tcp)) {
3608 tprintf("%d, ", (int) tcp->u_arg[0]);
3609 } else {
3610 struct sched_param p;
3611 if (umove(tcp, tcp->u_arg[1], &p) < 0)
3612 tprintf("%#lx", tcp->u_arg[1]);
3613 else
3614 tprintf("{ %d }", p.__sched_priority);
3615 }
3616 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003617}
3618
3619int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003620sys_sched_setparam(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003621{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003622 if (entering(tcp)) {
3623 struct sched_param p;
3624 if (umove(tcp, tcp->u_arg[1], &p) < 0)
3625 tprintf("%d, %#lx", (int) tcp->u_arg[0], tcp->u_arg[1]);
3626 else
3627 tprintf("%d, { %d }", (int) tcp->u_arg[0], p.__sched_priority);
3628 }
3629 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003630}
3631
3632int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003633sys_sched_get_priority_min(struct tcb *tcp)
Roland McGrath279d3782004-03-01 20:27:37 +00003634{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003635 if (entering(tcp)) {
3636 printxval(schedulers, tcp->u_arg[0], "SCHED_???");
3637 }
3638 return 0;
Roland McGrath279d3782004-03-01 20:27:37 +00003639}
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003640
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003641# ifdef X86_64
3642# include <asm/prctl.h>
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003643
3644static const struct xlat archvals[] = {
3645 { ARCH_SET_GS, "ARCH_SET_GS" },
3646 { ARCH_SET_FS, "ARCH_SET_FS" },
3647 { ARCH_GET_FS, "ARCH_GET_FS" },
3648 { ARCH_GET_GS, "ARCH_GET_GS" },
3649 { 0, NULL },
3650};
3651
3652int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003653sys_arch_prctl(struct tcb *tcp)
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003654{
Denys Vlasenko1d632462009-04-14 12:51:00 +00003655 if (entering(tcp)) {
3656 printxval(archvals, tcp->u_arg[0], "ARCH_???");
3657 if (tcp->u_arg[0] == ARCH_SET_GS
3658 || tcp->u_arg[0] == ARCH_SET_FS
3659 ) {
3660 tprintf(", %#lx", tcp->u_arg[1]);
3661 }
3662 } else {
3663 if (tcp->u_arg[0] == ARCH_GET_GS
3664 || tcp->u_arg[0] == ARCH_GET_FS
3665 ) {
3666 long int v;
3667 if (!syserror(tcp) && umove(tcp, tcp->u_arg[1], &v) != -1)
3668 tprintf(", [%#lx]", v);
3669 else
3670 tprintf(", %#lx", tcp->u_arg[1]);
3671 }
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003672 }
Denys Vlasenko1d632462009-04-14 12:51:00 +00003673 return 0;
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003674}
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003675# endif /* X86_64 */
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003676
Roland McGrathdb8319f2007-08-02 01:37:55 +00003677
3678int
Denys Vlasenko1d632462009-04-14 12:51:00 +00003679sys_getcpu(struct tcb *tcp)
Roland McGrathdb8319f2007-08-02 01:37:55 +00003680{
3681 if (exiting(tcp)) {
3682 unsigned u;
3683 if (tcp->u_arg[0] == 0)
3684 tprintf("NULL, ");
3685 else if (umove(tcp, tcp->u_arg[0], &u) < 0)
3686 tprintf("%#lx, ", tcp->u_arg[0]);
3687 else
3688 tprintf("[%u], ", u);
3689 if (tcp->u_arg[1] == 0)
3690 tprintf("NULL, ");
3691 else if (umove(tcp, tcp->u_arg[1], &u) < 0)
3692 tprintf("%#lx, ", tcp->u_arg[1]);
3693 else
3694 tprintf("[%u], ", u);
3695 tprintf("%#lx", tcp->u_arg[2]);
3696 }
3697 return 0;
3698}
3699
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003700#endif /* LINUX */