blob: 4cb21cda4c727e7ab65e79bdd354a24fb89f39ef [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)
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +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)
709 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)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000713 return -1;
714 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)
721 return -1;
722 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)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000725 return -1;
726 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)
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000729 return -1;
730 return 0;
Dmitry V. Levin87ea1f42008-11-10 22:21:41 +0000731#elif defined(BFIN)
732 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_P0), new)<0)
733 return -1;
734 return 0;
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000735#elif defined(IA64)
Roland McGrath08267b82004-02-20 22:56:43 +0000736 if (ia32) {
737 switch (new) {
Denys Vlasenko418d66a2009-01-17 01:52:54 +0000738 case 2:
739 break; /* x86 SYS_fork */
740 case SYS_clone:
741 new = 120;
742 break;
743 default:
Roland McGrath08267b82004-02-20 22:56:43 +0000744 fprintf(stderr, "%s: unexpected syscall %d\n",
745 __FUNCTION__, new);
746 return -1;
747 }
748 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R1), new)<0)
749 return -1;
750 } else if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_R15), new)<0)
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000751 return -1;
752 return 0;
Wichert Akkermanc1652e22001-03-27 12:17:16 +0000753#elif defined(HPPA)
754 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(PT_GR20), new)<0)
755 return -1;
756 return 0;
Wichert Akkermanccef6372002-05-01 16:39:22 +0000757#elif defined(SH)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000758 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*(REG_REG0+3)), new)<0)
759 return -1;
760 return 0;
Roland McGrathf5a47772003-06-26 22:40:42 +0000761#elif defined(SH64)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000762 /* Top half of reg encodes the no. of args n as 0x1n.
763 Assume 0 args as kernel never actually checks... */
764 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(REG_SYSCALL),
765 0x100000 | new) < 0)
766 return -1;
767 return 0;
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +0000768#elif defined(CRISV10) || defined(CRISV32)
769 if (ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*PT_R9), new) < 0)
770 return -1;
771 return 0;
Roland McGrathf691bd22006-04-25 07:34:41 +0000772#elif defined(ARM)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000773 /* Some kernels support this, some (pre-2.6.16 or so) don't. */
Roland McGrathf691bd22006-04-25 07:34:41 +0000774# ifndef PTRACE_SET_SYSCALL
775# define PTRACE_SET_SYSCALL 23
776# endif
777
Denys Vlasenko4dedd562009-02-24 15:17:53 +0000778 if (do_ptrace(PTRACE_SET_SYSCALL, tcp, NULL, new) != 0)
Roland McGrathf691bd22006-04-25 07:34:41 +0000779 return -1;
780
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000781 return 0;
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000782#else
783#warning Do not know how to handle change_syscall for this architecture
784#endif /* architecture */
785#endif /* LINUX */
786 return -1;
787}
788
Roland McGratha4d48532005-06-08 20:45:28 +0000789#if 0
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000790int
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000791setarg(tcp, argnum)
792 struct tcb *tcp;
793 int argnum;
794{
795#if defined (IA64)
796 {
797 unsigned long *bsp, *ap;
798
Denys Vlasenko932fc7d2008-12-16 18:18:40 +0000799 if (upeek(tcp, PT_AR_BSP, (long *) &bsp) , 0)
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000800 return -1;
801
802 ap = ia64_rse_skip_regs(bsp, argnum);
803 errno = 0;
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000804 ptrace(PTRACE_POKEDATA, tcp->pid, (char *) ap, tcp->u_arg[argnum]);
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000805 if (errno)
806 return -1;
807
808 }
Wichert Akkerman12f75d12000-02-14 16:23:40 +0000809#elif defined(I386)
810 {
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000811 ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(4*argnum), tcp->u_arg[argnum]);
Wichert Akkerman12f75d12000-02-14 16:23:40 +0000812 if (errno)
813 return -1;
814 }
Michal Ludvig0e035502002-09-23 15:41:01 +0000815#elif defined(X86_64)
816 {
817 ptrace(PTRACE_POKEUSER, tcp->pid, (char*)(8*(long)argnum), tcp->u_arg[argnum]);
818 if (errno)
819 return -1;
820 }
Roland McGrath3bb9c3d2002-12-16 20:40:48 +0000821#elif defined(POWERPC)
822#ifndef PT_ORIG_R3
823#define PT_ORIG_R3 34
824#endif
825 {
826 ptrace(PTRACE_POKEUSER, tcp->pid,
Roland McGratheb285352003-01-14 09:59:00 +0000827 (char*)((argnum==0 ? PT_ORIG_R3 : argnum+PT_R3)*sizeof(unsigned long)),
Roland McGrath3bb9c3d2002-12-16 20:40:48 +0000828 tcp->u_arg[argnum]);
829 if (errno)
830 return -1;
831 }
Ralf Baechlee3816102000-08-01 00:06:06 +0000832#elif defined(MIPS)
833 {
834 errno = 0;
835 if (argnum < 4)
836 ptrace(PTRACE_POKEUSER, tcp->pid,
837 (char*)(REG_A0 + argnum), tcp->u_arg[argnum]);
838 else {
839 unsigned long *sp;
840
Denys Vlasenko932fc7d2008-12-16 18:18:40 +0000841 if (upeek(tcp, REG_SP, (long *) &sp) , 0)
Ralf Baechlee3816102000-08-01 00:06:06 +0000842 return -1;
843
844 ptrace(PTRACE_POKEDATA, tcp->pid,
845 (char*)(sp + argnum - 4), tcp->u_arg[argnum]);
846 }
847 if (errno)
848 return -1;
849 }
Michal Ludvig10a88d02002-10-07 14:31:00 +0000850#elif defined(S390) || defined(S390X)
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000851 {
Michal Ludvig10a88d02002-10-07 14:31:00 +0000852 if(argnum <= 5)
853 ptrace(PTRACE_POKEUSER, tcp->pid,
Roland McGrath5a223472002-12-15 23:58:26 +0000854 (char *) (argnum==0 ? PT_ORIGGPR2 :
855 PT_GPR2 + argnum*sizeof(long)),
Michal Ludvig10a88d02002-10-07 14:31:00 +0000856 tcp->u_arg[argnum]);
857 else
858 return -E2BIG;
859 if (errno)
860 return -1;
Denys Vlasenkoadedb512008-12-30 18:47:55 +0000861 }
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000862#else
Wichert Akkermanfaf72222000-02-19 23:59:03 +0000863# warning Sorry, setargs not implemented for this architecture.
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000864#endif
865 return 0;
866}
Roland McGratha4d48532005-06-08 20:45:28 +0000867#endif
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +0000868
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000869#if defined SYS_clone || defined SYS_clone2
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000870int
Denys Vlasenko7e0615f2009-01-28 19:00:54 +0000871internal_clone(struct tcb *tcp)
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000872{
Ulrich Drepper90512f01999-12-24 07:22:25 +0000873 struct tcb *tcpchild;
Denys Vlasenko7e0615f2009-01-28 19:00:54 +0000874 int pid, bpt;
875
Denys Vlasenko84e20af2009-02-10 16:03:20 +0000876 if (!followfork)
877 return 0;
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000878 if (entering(tcp)) {
Denys Vlasenko7e0615f2009-01-28 19:00:54 +0000879 setbpt(tcp);
880 return 0;
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000881 } else {
Denys Vlasenko7e0615f2009-01-28 19:00:54 +0000882 bpt = tcp->flags & TCB_BPTSET;
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000883
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000884 if (syserror(tcp)) {
885 if (bpt)
886 clearbpt(tcp);
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000887 return 0;
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000888 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000889
890 pid = tcp->u_rval;
Denys Vlasenko84e20af2009-02-10 16:03:20 +0000891 /* Should not happen, but bugs often cause bogus value here. */
Denys Vlasenko7e0615f2009-01-28 19:00:54 +0000892 if (pid <= 1
893 || (sizeof(pid) != sizeof(tcp->u_rval) && pid != tcp->u_rval)
894 ) {
895 if (bpt)
896 clearbpt(tcp);
897 fprintf(stderr, "bogus clone() return value %lx!\n", tcp->u_rval);
898 return 0;
899 }
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000900
901#ifdef CLONE_PTRACE /* See new setbpt code. */
902 tcpchild = pid2tcb(pid);
903 if (tcpchild != NULL) {
904 /* The child already reported its startup trap
905 before the parent reported its syscall return. */
906 if ((tcpchild->flags
907 & (TCB_STARTUP|TCB_ATTACHED|TCB_SUSPENDED))
908 != (TCB_STARTUP|TCB_ATTACHED|TCB_SUSPENDED))
909 fprintf(stderr, "\
910[preattached child %d of %d in weird state!]\n",
911 pid, tcp->pid);
912 }
913 else
914#endif
Denys Vlasenkodb78f762009-01-26 12:55:40 +0000915 {
Denys Vlasenkodb78f762009-01-26 12:55:40 +0000916 tcpchild = alloctcb(pid);
917 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +0000918
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000919#ifndef CLONE_PTRACE
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000920 /* Attach to the new child */
921 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) < 0) {
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000922 if (bpt)
923 clearbpt(tcp);
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000924 perror("PTRACE_ATTACH");
925 fprintf(stderr, "Too late?\n");
926 droptcb(tcpchild);
927 return 0;
928 }
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000929#endif
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000930
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000931 if (bpt)
932 clearbpt(tcp);
933
Ulrich Drepper90512f01999-12-24 07:22:25 +0000934 tcpchild->flags |= TCB_ATTACHED;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000935 /* Child has BPT too, must be removed on first occasion. */
Wichert Akkerman9b0c31d2000-09-03 21:56:29 +0000936 if (bpt) {
937 tcpchild->flags |= TCB_BPTSET;
938 tcpchild->baddr = tcp->baddr;
939 memcpy(tcpchild->inst, tcp->inst,
940 sizeof tcpchild->inst);
941 }
Wichert Akkerman7b3346b2001-10-09 23:47:38 +0000942 tcpchild->parent = tcp;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000943 tcp->nchildren++;
944 if (tcpchild->flags & TCB_SUSPENDED) {
945 /* The child was born suspended, due to our having
946 forced CLONE_PTRACE. */
947 if (bpt)
948 clearbpt(tcpchild);
949
950 tcpchild->flags &= ~(TCB_SUSPENDED|TCB_STARTUP);
Denys Vlasenkof9a7e632009-01-17 00:21:31 +0000951 /* TCB_SUSPENDED tasks are not collected by waitpid
952 * loop, and left stopped. Restart it:
953 */
Denys Vlasenko732d1bf2008-12-17 19:21:59 +0000954 if (ptrace_restart(PTRACE_SYSCALL, tcpchild, 0) < 0)
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000955 return -1;
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000956
957 if (!qflag)
958 fprintf(stderr, "\
959Process %u resumed (parent %d ready)\n",
960 pid, tcp->pid);
961 }
962 else {
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000963 if (!qflag)
964 fprintf(stderr, "Process %d attached\n", pid);
965 }
966
967#ifdef TCB_CLONE_THREAD
Roland McGrath984154d2003-05-23 01:08:42 +0000968 {
969 /*
970 * Save the flags used in this call,
971 * in case we point TCP to our parent below.
972 */
973 int call_flags = tcp->u_arg[ARG_FLAGS];
974 if ((tcp->flags & TCB_CLONE_THREAD) &&
975 tcp->parent != NULL) {
976 /* The parent in this clone is itself a
977 thread belonging to another process.
978 There is no meaning to the parentage
979 relationship of the new child with the
980 thread, only with the process. We
981 associate the new thread with our
982 parent. Since this is done for every
983 new thread, there will never be a
984 TCB_CLONE_THREAD process that has
985 children. */
986 --tcp->nchildren;
987 tcp = tcp->parent;
988 tcpchild->parent = tcp;
989 ++tcp->nchildren;
990 }
991 if (call_flags & CLONE_THREAD) {
992 tcpchild->flags |= TCB_CLONE_THREAD;
993 ++tcp->nclone_threads;
994 }
995 if (call_flags & CLONE_DETACHED) {
996 tcpchild->flags |= TCB_CLONE_DETACHED;
997 ++tcp->nclone_detached;
998 }
Roland McGrathe85bbfe2003-01-09 06:53:31 +0000999 }
1000#endif
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001001 }
Wichert Akkerman7a0b6491999-12-23 15:08:17 +00001002 return 0;
1003}
1004#endif
1005
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001006int
1007internal_fork(tcp)
1008struct tcb *tcp;
1009{
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001010#ifdef LINUX
1011 /* We do special magic with clone for any clone or fork. */
1012 return internal_clone(tcp);
1013#else
1014
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001015 struct tcb *tcpchild;
1016 int pid;
Denys Vlasenko84e20af2009-02-10 16:03:20 +00001017 int follow = 1;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001018
1019#ifdef SYS_vfork
Roland McGratha4f9f2d2005-06-07 23:21:20 +00001020 if (known_scno(tcp) == SYS_vfork) {
Nate Sammonsccd8f211999-03-29 22:57:54 +00001021 /* Attempt to make vfork into fork, which we can follow. */
Roland McGrath41c48222008-07-18 00:25:10 +00001022 if (change_syscall(tcp, SYS_fork) < 0)
Denys Vlasenko84e20af2009-02-10 16:03:20 +00001023 follow = 0;
Nate Sammonsccd8f211999-03-29 22:57:54 +00001024 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001025#endif
Denys Vlasenko84e20af2009-02-10 16:03:20 +00001026 if (!followfork || !follow)
1027 return 0;
1028
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001029 if (entering(tcp)) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001030 if (setbpt(tcp) < 0)
1031 return 0;
Wichert Akkerman7a0b6491999-12-23 15:08:17 +00001032 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001033 else {
1034 int bpt = tcp->flags & TCB_BPTSET;
1035
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001036 if (bpt)
1037 clearbpt(tcp);
1038
1039 if (syserror(tcp))
1040 return 0;
1041
1042 pid = tcp->u_rval;
Denys Vlasenko418d66a2009-01-17 01:52:54 +00001043 tcpchild = alloctcb(pid);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001044#ifdef LINUX
Wichert Akkermanc1652e22001-03-27 12:17:16 +00001045#ifdef HPPA
1046 /* The child must have run before it can be attached. */
1047 /* This must be a bug in the parisc kernel, but I havn't
1048 * identified it yet. Seems to be an issue associated
1049 * with attaching to a process (which sends it a signal)
1050 * before that process has ever been scheduled. When
1051 * debugging, I started seeing crashes in
1052 * arch/parisc/kernel/signal.c:do_signal(), apparently
1053 * caused by r8 getting corrupt over the dequeue_signal()
1054 * call. Didn't make much sense though...
1055 */
1056 {
1057 struct timeval tv;
1058 tv.tv_sec = 0;
1059 tv.tv_usec = 10000;
1060 select(0, NULL, NULL, NULL, &tv);
1061 }
1062#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001063 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) < 0) {
1064 perror("PTRACE_ATTACH");
1065 fprintf(stderr, "Too late?\n");
1066 droptcb(tcpchild);
1067 return 0;
1068 }
1069#endif /* LINUX */
1070#ifdef SUNOS4
1071#ifdef oldway
1072 /* The child must have run before it can be attached. */
1073 {
1074 struct timeval tv;
1075 tv.tv_sec = 0;
1076 tv.tv_usec = 10000;
1077 select(0, NULL, NULL, NULL, &tv);
1078 }
1079 if (ptrace(PTRACE_ATTACH, pid, (char *)1, 0) < 0) {
1080 perror("PTRACE_ATTACH");
1081 fprintf(stderr, "Too late?\n");
1082 droptcb(tcpchild);
1083 return 0;
1084 }
1085#else /* !oldway */
1086 /* Try to catch the new process as soon as possible. */
1087 {
1088 int i;
1089 for (i = 0; i < 1024; i++)
1090 if (ptrace(PTRACE_ATTACH, pid, (char *) 1, 0) >= 0)
1091 break;
1092 if (i == 1024) {
1093 perror("PTRACE_ATTACH");
1094 fprintf(stderr, "Too late?\n");
1095 droptcb(tcpchild);
1096 return 0;
1097 }
1098 }
1099#endif /* !oldway */
1100#endif /* SUNOS4 */
1101 tcpchild->flags |= TCB_ATTACHED;
1102 /* Child has BPT too, must be removed on first occasion */
1103 if (bpt) {
1104 tcpchild->flags |= TCB_BPTSET;
1105 tcpchild->baddr = tcp->baddr;
1106 memcpy(tcpchild->inst, tcp->inst,
1107 sizeof tcpchild->inst);
1108 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001109 tcpchild->parent = tcp;
1110 tcp->nchildren++;
1111 if (!qflag)
1112 fprintf(stderr, "Process %d attached\n", pid);
1113 }
1114 return 0;
Roland McGrathe85bbfe2003-01-09 06:53:31 +00001115#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001116}
1117
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001118#endif /* !USE_PROCFS */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001119
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001120#if defined(SUNOS4) || defined(LINUX) || defined(FREEBSD)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001121
1122int
1123sys_vfork(tcp)
1124struct tcb *tcp;
1125{
1126 if (exiting(tcp))
1127 return RVAL_UDECIMAL;
1128 return 0;
1129}
1130
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001131#endif /* SUNOS4 || LINUX || FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001132
1133#ifndef LINUX
1134
1135static char idstr[16];
1136
1137int
1138sys_getpid(tcp)
1139struct tcb *tcp;
1140{
1141 if (exiting(tcp)) {
1142 sprintf(idstr, "ppid %lu", getrval2(tcp));
1143 tcp->auxstr = idstr;
1144 return RVAL_STR;
1145 }
1146 return 0;
1147}
1148
1149int
1150sys_getuid(tcp)
1151struct tcb *tcp;
1152{
1153 if (exiting(tcp)) {
1154 sprintf(idstr, "euid %lu", getrval2(tcp));
1155 tcp->auxstr = idstr;
1156 return RVAL_STR;
1157 }
1158 return 0;
1159}
1160
1161int
1162sys_getgid(tcp)
1163struct tcb *tcp;
1164{
1165 if (exiting(tcp)) {
1166 sprintf(idstr, "egid %lu", getrval2(tcp));
1167 tcp->auxstr = idstr;
1168 return RVAL_STR;
1169 }
1170 return 0;
1171}
1172
1173#endif /* !LINUX */
1174
1175#ifdef LINUX
1176
1177int
1178sys_setuid(tcp)
1179struct tcb *tcp;
1180{
1181 if (entering(tcp)) {
1182 tprintf("%u", (uid_t) tcp->u_arg[0]);
1183 }
1184 return 0;
1185}
1186
1187int
1188sys_setgid(tcp)
1189struct tcb *tcp;
1190{
1191 if (entering(tcp)) {
1192 tprintf("%u", (gid_t) tcp->u_arg[0]);
1193 }
1194 return 0;
1195}
1196
1197int
1198sys_getresuid(tcp)
1199 struct tcb *tcp;
1200{
1201 if (exiting(tcp)) {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001202 __kernel_uid_t uid;
1203 if (syserror(tcp))
1204 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1205 tcp->u_arg[1], tcp->u_arg[2]);
1206 else {
1207 if (umove(tcp, tcp->u_arg[0], &uid) < 0)
1208 tprintf("%#lx, ", tcp->u_arg[0]);
1209 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001210 tprintf("[%lu], ", (unsigned long) uid);
Roland McGrath9bd6b422003-02-24 07:13:51 +00001211 if (umove(tcp, tcp->u_arg[1], &uid) < 0)
1212 tprintf("%#lx, ", tcp->u_arg[1]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001213 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001214 tprintf("[%lu], ", (unsigned long) uid);
Roland McGrath9bd6b422003-02-24 07:13:51 +00001215 if (umove(tcp, tcp->u_arg[2], &uid) < 0)
1216 tprintf("%#lx", tcp->u_arg[2]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001217 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001218 tprintf("[%lu]", (unsigned long) uid);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001219 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001220 }
1221 return 0;
1222}
1223
1224int
1225sys_getresgid(tcp)
1226struct tcb *tcp;
1227{
1228 if (exiting(tcp)) {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001229 __kernel_gid_t gid;
1230 if (syserror(tcp))
1231 tprintf("%#lx, %#lx, %#lx", tcp->u_arg[0],
1232 tcp->u_arg[1], tcp->u_arg[2]);
1233 else {
1234 if (umove(tcp, tcp->u_arg[0], &gid) < 0)
1235 tprintf("%#lx, ", tcp->u_arg[0]);
1236 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001237 tprintf("[%lu], ", (unsigned long) gid);
Roland McGrathd2450922003-02-24 10:18:07 +00001238 if (umove(tcp, tcp->u_arg[1], &gid) < 0)
1239 tprintf("%#lx, ", tcp->u_arg[1]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001240 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001241 tprintf("[%lu], ", (unsigned long) gid);
Roland McGrathd2450922003-02-24 10:18:07 +00001242 if (umove(tcp, tcp->u_arg[2], &gid) < 0)
1243 tprintf("%#lx", tcp->u_arg[2]);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001244 else
Roland McGrath83bd47a2003-11-13 22:32:26 +00001245 tprintf("[%lu]", (unsigned long) gid);
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001246 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001247 }
1248 return 0;
1249}
1250
1251#endif /* LINUX */
1252
1253int
1254sys_setreuid(tcp)
1255struct tcb *tcp;
1256{
1257 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001258 printuid("", tcp->u_arg[0]);
1259 printuid(", ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001260 }
1261 return 0;
1262}
1263
1264int
1265sys_setregid(tcp)
1266struct tcb *tcp;
1267{
1268 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001269 printuid("", tcp->u_arg[0]);
1270 printuid(", ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001271 }
1272 return 0;
1273}
1274
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001275#if defined(LINUX) || defined(FREEBSD)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001276int
1277sys_setresuid(tcp)
1278 struct tcb *tcp;
1279{
1280 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001281 printuid("", tcp->u_arg[0]);
1282 printuid(", ", tcp->u_arg[1]);
1283 printuid(", ", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001284 }
1285 return 0;
1286}
1287int
1288sys_setresgid(tcp)
1289 struct tcb *tcp;
1290{
1291 if (entering(tcp)) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001292 printuid("", tcp->u_arg[0]);
1293 printuid(", ", tcp->u_arg[1]);
1294 printuid(", ", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001295 }
1296 return 0;
1297}
1298
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00001299#endif /* LINUX || FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001300
1301int
1302sys_setgroups(tcp)
1303struct tcb *tcp;
1304{
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001305 if (entering(tcp)) {
Roland McGrathaa524c82005-06-01 19:22:06 +00001306 unsigned long len, size, start, cur, end, abbrev_end;
1307 GETGROUPS_T gid;
1308 int failed = 0;
1309
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001310 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001311 tprintf("%lu, ", len);
1312 if (len == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001313 tprintf("[]");
1314 return 0;
1315 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001316 start = tcp->u_arg[1];
1317 if (start == 0) {
1318 tprintf("NULL");
1319 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001320 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001321 size = len * sizeof(gid);
1322 end = start + size;
1323 if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
1324 tprintf("%#lx", start);
1325 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001326 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001327 if (abbrev(tcp)) {
1328 abbrev_end = start + max_strlen * sizeof(gid);
1329 if (abbrev_end < start)
1330 abbrev_end = end;
1331 } else {
1332 abbrev_end = end;
1333 }
1334 tprintf("[");
1335 for (cur = start; cur < end; cur += sizeof(gid)) {
1336 if (cur > start)
1337 tprintf(", ");
1338 if (cur >= abbrev_end) {
1339 tprintf("...");
1340 break;
1341 }
1342 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1343 tprintf("?");
1344 failed = 1;
1345 break;
1346 }
1347 tprintf("%lu", (unsigned long) gid);
1348 }
1349 tprintf("]");
1350 if (failed)
1351 tprintf(" %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001352 }
1353 return 0;
1354}
1355
1356int
1357sys_getgroups(tcp)
1358struct tcb *tcp;
1359{
Roland McGrathaa524c82005-06-01 19:22:06 +00001360 unsigned long len;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001361
1362 if (entering(tcp)) {
1363 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001364 tprintf("%lu, ", len);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001365 } else {
Roland McGrathaa524c82005-06-01 19:22:06 +00001366 unsigned long size, start, cur, end, abbrev_end;
1367 GETGROUPS_T gid;
1368 int failed = 0;
1369
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001370 len = tcp->u_rval;
Roland McGrathaa524c82005-06-01 19:22:06 +00001371 if (len == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001372 tprintf("[]");
1373 return 0;
1374 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001375 start = tcp->u_arg[1];
1376 if (start == 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001377 tprintf("NULL");
Roland McGrathaa524c82005-06-01 19:22:06 +00001378 return 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001379 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001380 if (tcp->u_arg[0] == 0) {
1381 tprintf("%#lx", start);
1382 return 0;
1383 }
1384 size = len * sizeof(gid);
1385 end = start + size;
1386 if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
1387 size / sizeof(gid) != len || end < start) {
1388 tprintf("%#lx", start);
1389 return 0;
1390 }
1391 if (abbrev(tcp)) {
1392 abbrev_end = start + max_strlen * sizeof(gid);
1393 if (abbrev_end < start)
1394 abbrev_end = end;
1395 } else {
1396 abbrev_end = end;
1397 }
1398 tprintf("[");
1399 for (cur = start; cur < end; cur += sizeof(gid)) {
1400 if (cur > start)
1401 tprintf(", ");
1402 if (cur >= abbrev_end) {
1403 tprintf("...");
1404 break;
1405 }
1406 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1407 tprintf("?");
1408 failed = 1;
1409 break;
1410 }
1411 tprintf("%lu", (unsigned long) gid);
1412 }
1413 tprintf("]");
1414 if (failed)
1415 tprintf(" %#lx", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001416 }
1417 return 0;
1418}
1419
Roland McGrath83bd47a2003-11-13 22:32:26 +00001420#ifdef LINUX
1421int
1422sys_setgroups32(tcp)
1423struct tcb *tcp;
1424{
Roland McGrath83bd47a2003-11-13 22:32:26 +00001425 if (entering(tcp)) {
Roland McGrathaa524c82005-06-01 19:22:06 +00001426 unsigned long len, size, start, cur, end, abbrev_end;
1427 GETGROUPS32_T gid;
1428 int failed = 0;
1429
Roland McGrath83bd47a2003-11-13 22:32:26 +00001430 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001431 tprintf("%lu, ", len);
1432 if (len == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001433 tprintf("[]");
1434 return 0;
1435 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001436 start = tcp->u_arg[1];
1437 if (start == 0) {
1438 tprintf("NULL");
1439 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001440 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001441 size = len * sizeof(gid);
1442 end = start + size;
1443 if (!verbose(tcp) || size / sizeof(gid) != len || end < start) {
1444 tprintf("%#lx", start);
1445 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001446 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001447 if (abbrev(tcp)) {
1448 abbrev_end = start + max_strlen * sizeof(gid);
1449 if (abbrev_end < start)
1450 abbrev_end = end;
1451 } else {
1452 abbrev_end = end;
1453 }
1454 tprintf("[");
1455 for (cur = start; cur < end; cur += sizeof(gid)) {
1456 if (cur > start)
1457 tprintf(", ");
1458 if (cur >= abbrev_end) {
1459 tprintf("...");
1460 break;
1461 }
1462 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1463 tprintf("?");
1464 failed = 1;
1465 break;
1466 }
1467 tprintf("%lu", (unsigned long) gid);
1468 }
1469 tprintf("]");
1470 if (failed)
1471 tprintf(" %#lx", tcp->u_arg[1]);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001472 }
1473 return 0;
1474}
1475
1476int
1477sys_getgroups32(tcp)
1478struct tcb *tcp;
1479{
Roland McGrathaa524c82005-06-01 19:22:06 +00001480 unsigned long len;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001481
1482 if (entering(tcp)) {
1483 len = tcp->u_arg[0];
Roland McGrathaa524c82005-06-01 19:22:06 +00001484 tprintf("%lu, ", len);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001485 } else {
Roland McGrathaa524c82005-06-01 19:22:06 +00001486 unsigned long size, start, cur, end, abbrev_end;
1487 GETGROUPS32_T gid;
1488 int failed = 0;
1489
Roland McGrath83bd47a2003-11-13 22:32:26 +00001490 len = tcp->u_rval;
Roland McGrathaa524c82005-06-01 19:22:06 +00001491 if (len == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001492 tprintf("[]");
1493 return 0;
1494 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001495 start = tcp->u_arg[1];
1496 if (start == 0) {
Roland McGrath83bd47a2003-11-13 22:32:26 +00001497 tprintf("NULL");
Roland McGrathaa524c82005-06-01 19:22:06 +00001498 return 0;
Roland McGrath83bd47a2003-11-13 22:32:26 +00001499 }
Roland McGrathaa524c82005-06-01 19:22:06 +00001500 size = len * sizeof(gid);
1501 end = start + size;
1502 if (!verbose(tcp) || tcp->u_arg[0] == 0 ||
1503 size / sizeof(gid) != len || end < start) {
1504 tprintf("%#lx", start);
1505 return 0;
1506 }
1507 if (abbrev(tcp)) {
1508 abbrev_end = start + max_strlen * sizeof(gid);
1509 if (abbrev_end < start)
1510 abbrev_end = end;
1511 } else {
1512 abbrev_end = end;
1513 }
1514 tprintf("[");
1515 for (cur = start; cur < end; cur += sizeof(gid)) {
1516 if (cur > start)
1517 tprintf(", ");
1518 if (cur >= abbrev_end) {
1519 tprintf("...");
1520 break;
1521 }
1522 if (umoven(tcp, cur, sizeof(gid), (char *) &gid) < 0) {
1523 tprintf("?");
1524 failed = 1;
1525 break;
1526 }
1527 tprintf("%lu", (unsigned long) gid);
1528 }
1529 tprintf("]");
1530 if (failed)
1531 tprintf(" %#lx", tcp->u_arg[1]);
Roland McGrath83bd47a2003-11-13 22:32:26 +00001532 }
1533 return 0;
1534}
1535#endif /* LINUX */
1536
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001537#if defined(ALPHA) || defined(SUNOS4) || defined(SVR4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001538int
1539sys_setpgrp(tcp)
1540struct tcb *tcp;
1541{
1542 if (entering(tcp)) {
1543#ifndef SVR4
1544 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1545#endif /* !SVR4 */
1546 }
1547 return 0;
1548}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001549#endif /* ALPHA || SUNOS4 || SVR4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001550
1551int
1552sys_getpgrp(tcp)
1553struct tcb *tcp;
1554{
1555 if (entering(tcp)) {
1556#ifndef SVR4
1557 tprintf("%lu", tcp->u_arg[0]);
1558#endif /* !SVR4 */
1559 }
1560 return 0;
1561}
1562
1563int
1564sys_getsid(tcp)
1565struct tcb *tcp;
1566{
1567 if (entering(tcp)) {
1568 tprintf("%lu", tcp->u_arg[0]);
1569 }
1570 return 0;
1571}
1572
1573int
1574sys_setsid(tcp)
1575struct tcb *tcp;
1576{
1577 return 0;
1578}
1579
1580int
1581sys_getpgid(tcp)
1582struct tcb *tcp;
1583{
1584 if (entering(tcp)) {
1585 tprintf("%lu", tcp->u_arg[0]);
1586 }
1587 return 0;
1588}
1589
1590int
1591sys_setpgid(tcp)
1592struct tcb *tcp;
1593{
1594 if (entering(tcp)) {
1595 tprintf("%lu, %lu", tcp->u_arg[0], tcp->u_arg[1]);
1596 }
1597 return 0;
1598}
1599
John Hughesc61eb3d2002-05-17 11:37:50 +00001600#if UNIXWARE >= 2
1601
1602#include <sys/privilege.h>
1603
1604
Roland McGrathd9f816f2004-09-04 03:39:20 +00001605static const struct xlat procpriv_cmds [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001606 { SETPRV, "SETPRV" },
1607 { CLRPRV, "CLRPRV" },
1608 { PUTPRV, "PUTPRV" },
1609 { GETPRV, "GETPRV" },
1610 { CNTPRV, "CNTPRV" },
1611 { 0, NULL },
1612};
1613
1614
Roland McGrathd9f816f2004-09-04 03:39:20 +00001615static const struct xlat procpriv_priv [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001616 { P_OWNER, "P_OWNER" },
1617 { P_AUDIT, "P_AUDIT" },
1618 { P_COMPAT, "P_COMPAT" },
1619 { P_DACREAD, "P_DACREAD" },
1620 { P_DACWRITE, "P_DACWRITE" },
1621 { P_DEV, "P_DEV" },
1622 { P_FILESYS, "P_FILESYS" },
1623 { P_MACREAD, "P_MACREAD" },
1624 { P_MACWRITE, "P_MACWRITE" },
1625 { P_MOUNT, "P_MOUNT" },
1626 { P_MULTIDIR, "P_MULTIDIR" },
1627 { P_SETPLEVEL, "P_SETPLEVEL" },
1628 { P_SETSPRIV, "P_SETSPRIV" },
1629 { P_SETUID, "P_SETUID" },
1630 { P_SYSOPS, "P_SYSOPS" },
1631 { P_SETUPRIV, "P_SETUPRIV" },
1632 { P_DRIVER, "P_DRIVER" },
1633 { P_RTIME, "P_RTIME" },
1634 { P_MACUPGRADE, "P_MACUPGRADE" },
1635 { P_FSYSRANGE, "P_FSYSRANGE" },
1636 { P_SETFLEVEL, "P_SETFLEVEL" },
1637 { P_AUDITWR, "P_AUDITWR" },
1638 { P_TSHAR, "P_TSHAR" },
1639 { P_PLOCK, "P_PLOCK" },
1640 { P_CORE, "P_CORE" },
1641 { P_LOADMOD, "P_LOADMOD" },
1642 { P_BIND, "P_BIND" },
1643 { P_ALLPRIVS, "P_ALLPRIVS" },
1644 { 0, NULL },
1645};
1646
1647
Roland McGrathd9f816f2004-09-04 03:39:20 +00001648static const struct xlat procpriv_type [] = {
John Hughesc61eb3d2002-05-17 11:37:50 +00001649 { PS_FIX, "PS_FIX" },
1650 { PS_INH, "PS_INH" },
1651 { PS_MAX, "PS_MAX" },
1652 { PS_WKG, "PS_WKG" },
1653 { 0, NULL },
1654};
1655
1656
1657static void
Dmitry V. Levinab9008b2007-01-11 22:05:04 +00001658printpriv(struct tcb *tcp, long addr, int len, const struct xlat *opt)
John Hughesc61eb3d2002-05-17 11:37:50 +00001659{
1660 priv_t buf [128];
1661 int max = verbose (tcp) ? sizeof buf / sizeof buf [0] : 10;
1662 int dots = len > max;
1663 int i;
Roland McGrath5a223472002-12-15 23:58:26 +00001664
John Hughesc61eb3d2002-05-17 11:37:50 +00001665 if (len > max) len = max;
Roland McGrath5a223472002-12-15 23:58:26 +00001666
John Hughesc61eb3d2002-05-17 11:37:50 +00001667 if (len <= 0 ||
1668 umoven (tcp, addr, len * sizeof buf[0], (char *) buf) < 0)
1669 {
1670 tprintf ("%#lx", addr);
1671 return;
1672 }
1673
1674 tprintf ("[");
1675
1676 for (i = 0; i < len; ++i) {
Dmitry V. Levinab9008b2007-01-11 22:05:04 +00001677 const char *t, *p;
John Hughesc61eb3d2002-05-17 11:37:50 +00001678
1679 if (i) tprintf (", ");
1680
1681 if ((t = xlookup (procpriv_type, buf [i] & PS_TYPE)) &&
1682 (p = xlookup (procpriv_priv, buf [i] & ~PS_TYPE)))
1683 {
1684 tprintf ("%s|%s", t, p);
1685 }
1686 else {
1687 tprintf ("%#lx", buf [i]);
1688 }
1689 }
1690
1691 if (dots) tprintf (" ...");
1692
1693 tprintf ("]");
1694}
1695
1696
1697int
1698sys_procpriv(tcp)
1699struct tcb *tcp;
1700{
1701 if (entering(tcp)) {
1702 printxval(procpriv_cmds, tcp->u_arg[0], "???PRV");
1703 switch (tcp->u_arg[0]) {
1704 case CNTPRV:
1705 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1706 break;
1707
1708 case GETPRV:
1709 break;
1710
1711 default:
1712 tprintf (", ");
1713 printpriv (tcp, tcp->u_arg[1], tcp->u_arg[2]);
1714 tprintf (", %ld", tcp->u_arg[2]);
1715 }
1716 }
1717 else if (tcp->u_arg[0] == GETPRV) {
1718 if (syserror (tcp)) {
1719 tprintf(", %#lx, %ld", tcp->u_arg[1], tcp->u_arg[2]);
1720 }
1721 else {
1722 tprintf (", ");
1723 printpriv (tcp, tcp->u_arg[1], tcp->u_rval);
1724 tprintf (", %ld", tcp->u_arg[2]);
1725 }
1726 }
Roland McGrath5a223472002-12-15 23:58:26 +00001727
John Hughesc61eb3d2002-05-17 11:37:50 +00001728 return 0;
1729}
1730
1731#endif
1732
1733
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001734static void
1735printargv(tcp, addr)
1736struct tcb *tcp;
1737long addr;
1738{
Roland McGrath85a3bc42007-08-02 02:13:05 +00001739 union {
1740 int p32;
1741 long p64;
1742 char data[sizeof(long)];
1743 } cp;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001744 char *sep;
Roland McGrath85a3bc42007-08-02 02:13:05 +00001745 int n = 0;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001746
Roland McGrath85a3bc42007-08-02 02:13:05 +00001747 cp.p64 = 1;
1748 for (sep = ""; !abbrev(tcp) || n < max_strlen / 2; sep = ", ", ++n) {
1749 if (umoven(tcp, addr, personality_wordsize[current_personality],
1750 cp.data) < 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001751 tprintf("%#lx", addr);
1752 return;
1753 }
Roland McGrath85a3bc42007-08-02 02:13:05 +00001754 if (personality_wordsize[current_personality] == 4)
1755 cp.p64 = cp.p32;
1756 if (cp.p64 == 0)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001757 break;
1758 tprintf(sep);
Roland McGrath85a3bc42007-08-02 02:13:05 +00001759 printstr(tcp, cp.p64, -1);
1760 addr += personality_wordsize[current_personality];
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001761 }
Roland McGrath85a3bc42007-08-02 02:13:05 +00001762 if (cp.p64)
1763 tprintf("%s...", sep);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001764}
1765
1766static void
1767printargc(fmt, tcp, addr)
1768char *fmt;
1769struct tcb *tcp;
1770long addr;
1771{
1772 int count;
1773 char *cp;
1774
1775 for (count = 0; umove(tcp, addr, &cp) >= 0 && cp != NULL; count++) {
1776 addr += sizeof(char *);
1777 }
1778 tprintf(fmt, count, count == 1 ? "" : "s");
1779}
1780
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001781#if defined(SPARC) || defined(SPARC64) || defined(SUNOS4)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001782int
1783sys_execv(tcp)
1784struct tcb *tcp;
1785{
1786 if (entering(tcp)) {
1787 printpath(tcp, tcp->u_arg[0]);
1788 if (!verbose(tcp))
1789 tprintf(", %#lx", tcp->u_arg[1]);
1790#if 0
1791 else if (abbrev(tcp))
1792 printargc(", [/* %d arg%s */]", tcp, tcp->u_arg[1]);
1793#endif
1794 else {
1795 tprintf(", [");
1796 printargv(tcp, tcp->u_arg[1]);
1797 tprintf("]");
1798 }
1799 }
1800 return 0;
1801}
Dmitry V. Levinb9fe0112006-12-13 16:59:44 +00001802#endif /* SPARC || SPARC64 || SUNOS4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001803
1804int
1805sys_execve(tcp)
1806struct tcb *tcp;
1807{
1808 if (entering(tcp)) {
1809 printpath(tcp, tcp->u_arg[0]);
1810 if (!verbose(tcp))
1811 tprintf(", %#lx", tcp->u_arg[1]);
1812#if 0
1813 else if (abbrev(tcp))
1814 printargc(", [/* %d arg%s */]", tcp, tcp->u_arg[1]);
1815#endif
1816 else {
1817 tprintf(", [");
1818 printargv(tcp, tcp->u_arg[1]);
1819 tprintf("]");
1820 }
1821 if (!verbose(tcp))
1822 tprintf(", %#lx", tcp->u_arg[2]);
1823 else if (abbrev(tcp))
1824 printargc(", [/* %d var%s */]", tcp, tcp->u_arg[2]);
1825 else {
1826 tprintf(", [");
1827 printargv(tcp, tcp->u_arg[2]);
1828 tprintf("]");
1829 }
1830 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001831 return 0;
1832}
1833
Roland McGrath5ef24ab2004-02-20 02:22:35 +00001834#if UNIXWARE > 2
John Hughes4e36a812001-04-18 15:11:51 +00001835
1836int sys_rexecve(tcp)
1837struct tcb *tcp;
1838{
1839 if (entering (tcp)) {
1840 sys_execve (tcp);
1841 tprintf (", %ld", tcp->u_arg[3]);
1842 }
1843 return 0;
1844}
1845
Roland McGrath5ef24ab2004-02-20 02:22:35 +00001846#endif
John Hughes4e36a812001-04-18 15:11:51 +00001847
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001848int
1849internal_exec(tcp)
1850struct tcb *tcp;
1851{
1852#ifdef SUNOS4
1853 if (exiting(tcp) && !syserror(tcp) && followfork)
1854 fixvfork(tcp);
1855#endif /* SUNOS4 */
Roland McGrathfdb097f2004-07-12 07:38:55 +00001856#if defined LINUX && defined TCB_WAITEXECVE
1857 if (exiting(tcp) && syserror(tcp))
1858 tcp->flags &= ~TCB_WAITEXECVE;
1859 else
1860 tcp->flags |= TCB_WAITEXECVE;
1861#endif /* LINUX && TCB_WAITEXECVE */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001862 return 0;
1863}
1864
1865#ifdef LINUX
Roland McGrath7ec1d352002-12-17 04:50:44 +00001866#ifndef __WNOTHREAD
1867#define __WNOTHREAD 0x20000000
1868#endif
1869#ifndef __WALL
1870#define __WALL 0x40000000
1871#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001872#ifndef __WCLONE
Roland McGrath7ec1d352002-12-17 04:50:44 +00001873#define __WCLONE 0x80000000
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001874#endif
1875#endif /* LINUX */
1876
Roland McGrathd9f816f2004-09-04 03:39:20 +00001877static const struct xlat wait4_options[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001878 { WNOHANG, "WNOHANG" },
1879#ifndef WSTOPPED
1880 { WUNTRACED, "WUNTRACED" },
1881#endif
1882#ifdef WEXITED
1883 { WEXITED, "WEXITED" },
1884#endif
1885#ifdef WTRAPPED
1886 { WTRAPPED, "WTRAPPED" },
1887#endif
1888#ifdef WSTOPPED
1889 { WSTOPPED, "WSTOPPED" },
1890#endif
1891#ifdef WCONTINUED
1892 { WCONTINUED, "WCONTINUED" },
1893#endif
1894#ifdef WNOWAIT
1895 { WNOWAIT, "WNOWAIT" },
1896#endif
1897#ifdef __WCLONE
1898 { __WCLONE, "__WCLONE" },
1899#endif
Roland McGrath7ec1d352002-12-17 04:50:44 +00001900#ifdef __WALL
1901 { __WALL, "__WALL" },
1902#endif
1903#ifdef __WNOTHREAD
1904 { __WNOTHREAD, "__WNOTHREAD" },
1905#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001906 { 0, NULL },
1907};
1908
Roland McGrath5e02a572004-10-19 23:33:47 +00001909#if !defined WCOREFLAG && defined WCOREFLG
1910# define WCOREFLAG WCOREFLG
1911#endif
1912#ifndef WCOREFLAG
1913#define WCOREFLAG 0x80
1914#endif
1915
1916#ifndef W_STOPCODE
1917#define W_STOPCODE(sig) ((sig) << 8 | 0x7f)
1918#endif
1919#ifndef W_EXITCODE
1920#define W_EXITCODE(ret, sig) ((ret) << 8 | (sig))
1921#endif
1922
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001923static int
1924printstatus(status)
1925int status;
1926{
1927 int exited = 0;
1928
1929 /*
1930 * Here is a tricky presentation problem. This solution
1931 * is still not entirely satisfactory but since there
1932 * are no wait status constructors it will have to do.
1933 */
Roland McGrath79fbda52004-04-14 02:45:55 +00001934 if (WIFSTOPPED(status)) {
1935 tprintf("[{WIFSTOPPED(s) && WSTOPSIG(s) == %s}",
Nate Sammonsce780fc1999-03-29 23:23:13 +00001936 signame(WSTOPSIG(status)));
Roland McGrath79fbda52004-04-14 02:45:55 +00001937 status &= ~W_STOPCODE(WSTOPSIG(status));
1938 }
1939 else if (WIFSIGNALED(status)) {
1940 tprintf("[{WIFSIGNALED(s) && WTERMSIG(s) == %s%s}",
Nate Sammonsce780fc1999-03-29 23:23:13 +00001941 signame(WTERMSIG(status)),
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001942 WCOREDUMP(status) ? " && WCOREDUMP(s)" : "");
Roland McGrath79fbda52004-04-14 02:45:55 +00001943 status &= ~(W_EXITCODE(0, WTERMSIG(status)) | WCOREFLAG);
1944 }
1945 else if (WIFEXITED(status)) {
1946 tprintf("[{WIFEXITED(s) && WEXITSTATUS(s) == %d}",
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001947 WEXITSTATUS(status));
1948 exited = 1;
Roland McGrath79fbda52004-04-14 02:45:55 +00001949 status &= ~W_EXITCODE(WEXITSTATUS(status), 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001950 }
Roland McGrath79fbda52004-04-14 02:45:55 +00001951 else {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001952 tprintf("[%#x]", status);
Roland McGrath79fbda52004-04-14 02:45:55 +00001953 return 0;
1954 }
1955
1956 if (status == 0)
1957 tprintf("]");
1958 else
Roland McGrathf8cc83c2004-06-04 01:24:07 +00001959 tprintf(" | %#x]", status);
Roland McGrath79fbda52004-04-14 02:45:55 +00001960
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001961 return exited;
1962}
1963
1964static int
Denys Vlasenko59432db2009-01-26 19:09:35 +00001965printwaitn(struct tcb *tcp, int n, int bitness)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001966{
1967 int status;
1968 int exited = 0;
1969
1970 if (entering(tcp)) {
Roland McGrath5b63d962008-07-18 02:16:47 +00001971 /*
1972 * Sign-extend a 32-bit value when that's what it is.
Denys Vlasenko59432db2009-01-26 19:09:35 +00001973 *
1974 * NB: On Linux, kernel-side pid_t is typedef'ed to int
1975 * on all arches; also, glibc-2.8 truncates wait3 and wait4
1976 * pid argument to int on 64bit arches, producing,
1977 * for example, wait4(4294967295, ...) instead of -1
1978 * in strace.
1979 * Therefore, maybe it makes sense to *unconditionally*
1980 * widen int to long here...
Roland McGrath5b63d962008-07-18 02:16:47 +00001981 */
1982 long pid = tcp->u_arg[0];
1983 if (personality_wordsize[current_personality] < sizeof pid)
1984 pid = (long) (int) pid;
1985 tprintf("%ld, ", pid);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001986 } else {
1987 /* status */
1988 if (!tcp->u_arg[1])
1989 tprintf("NULL");
1990 else if (syserror(tcp) || tcp->u_rval == 0)
1991 tprintf("%#lx", tcp->u_arg[1]);
1992 else if (umove(tcp, tcp->u_arg[1], &status) < 0)
1993 tprintf("[?]");
1994 else
1995 exited = printstatus(status);
1996 /* options */
1997 tprintf(", ");
Roland McGrathb2dee132005-06-01 19:02:36 +00001998 printflags(wait4_options, tcp->u_arg[2], "W???");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001999 if (n == 4) {
2000 tprintf(", ");
2001 /* usage */
2002 if (!tcp->u_arg[3])
2003 tprintf("NULL");
2004#ifdef LINUX
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002005 else if (tcp->u_rval > 0) {
Denys Vlasenko59432db2009-01-26 19:09:35 +00002006#ifdef ALPHA
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002007 if (bitness)
2008 printrusage32(tcp, tcp->u_arg[3]);
2009 else
2010#endif
2011 printrusage(tcp, tcp->u_arg[3]);
2012 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002013#endif /* LINUX */
2014#ifdef SUNOS4
2015 else if (tcp->u_rval > 0 && exited)
2016 printrusage(tcp, tcp->u_arg[3]);
2017#endif /* SUNOS4 */
2018 else
2019 tprintf("%#lx", tcp->u_arg[3]);
2020 }
2021 }
2022 return 0;
2023}
2024
2025int
Roland McGrathc74c0b72004-09-01 19:39:46 +00002026internal_wait(tcp, flagarg)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002027struct tcb *tcp;
Roland McGrathc74c0b72004-09-01 19:39:46 +00002028int flagarg;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002029{
Roland McGrathe85bbfe2003-01-09 06:53:31 +00002030 int got_kids;
2031
2032#ifdef TCB_CLONE_THREAD
2033 if (tcp->flags & TCB_CLONE_THREAD)
2034 /* The children we wait for are our parent's children. */
2035 got_kids = (tcp->parent->nchildren
2036 > tcp->parent->nclone_detached);
2037 else
2038 got_kids = (tcp->nchildren > tcp->nclone_detached);
2039#else
2040 got_kids = tcp->nchildren > 0;
2041#endif
2042
2043 if (entering(tcp) && got_kids) {
Roland McGrathb69f81b2002-12-21 23:25:18 +00002044 /* There are children that this parent should block for.
2045 But ptrace made us the parent of the traced children
2046 and the real parent will get ECHILD from the wait call.
2047
2048 XXX If we attached with strace -f -p PID, then there
2049 may be untraced dead children the parent could be reaping
2050 now, but we make him block. */
2051
2052 /* ??? WTA: fix bug with hanging children */
2053
Roland McGrathc74c0b72004-09-01 19:39:46 +00002054 if (!(tcp->u_arg[flagarg] & WNOHANG)) {
Roland McGrath09623452003-05-23 02:27:13 +00002055 /*
2056 * There are traced children. We'll make the parent
2057 * block to avoid a false ECHILD error due to our
2058 * ptrace having stolen the children. However,
2059 * we shouldn't block if there are zombies to reap.
2060 * XXX doesn't handle pgrp matches (u_arg[0]==0,<-1)
2061 */
Roland McGrathfccfb942003-10-01 21:59:44 +00002062 struct tcb *child = NULL;
Roland McGrath09623452003-05-23 02:27:13 +00002063 if (tcp->nzombies > 0 &&
2064 (tcp->u_arg[0] == -1 ||
Roland McGrathfccfb942003-10-01 21:59:44 +00002065 (child = pid2tcb(tcp->u_arg[0])) == NULL))
Roland McGrath09623452003-05-23 02:27:13 +00002066 return 0;
Roland McGrathfccfb942003-10-01 21:59:44 +00002067 if (tcp->u_arg[0] > 0) {
2068 /*
2069 * If the parent waits for a specified child
2070 * PID, then it must get ECHILD right away
2071 * if that PID is not one of its children.
2072 * Make sure that the requested PID matches
2073 * one of the parent's children that we are
2074 * tracing, and don't suspend it otherwise.
2075 */
2076 if (child == NULL)
2077 child = pid2tcb(tcp->u_arg[0]);
2078 if (child == NULL || child->parent != (
2079#ifdef TCB_CLONE_THREAD
2080 (tcp->flags & TCB_CLONE_THREAD)
2081 ? tcp->parent :
2082#endif
Roland McGrathd56a6562005-08-03 11:23:43 +00002083 tcp) ||
2084 (child->flags & TCB_EXITING))
Roland McGrathfccfb942003-10-01 21:59:44 +00002085 return 0;
2086 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002087 tcp->flags |= TCB_SUSPENDED;
2088 tcp->waitpid = tcp->u_arg[0];
Roland McGrathe85bbfe2003-01-09 06:53:31 +00002089#ifdef TCB_CLONE_THREAD
2090 if (tcp->flags & TCB_CLONE_THREAD)
2091 tcp->parent->nclone_waiting++;
2092#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002093 }
2094 }
Roland McGrathe85bbfe2003-01-09 06:53:31 +00002095 if (exiting(tcp) && tcp->u_error == ECHILD && got_kids) {
Roland McGrathc74c0b72004-09-01 19:39:46 +00002096 if (tcp->u_arg[flagarg] & WNOHANG) {
Roland McGrathb69f81b2002-12-21 23:25:18 +00002097 /* We must force a fake result of 0 instead of
2098 the ECHILD error. */
2099 extern int force_result();
2100 return force_result(tcp, 0, 0);
2101 }
Roland McGrathb69f81b2002-12-21 23:25:18 +00002102 }
Roland McGrath09623452003-05-23 02:27:13 +00002103 else if (exiting(tcp) && tcp->u_error == 0 && tcp->u_rval > 0 &&
2104 tcp->nzombies > 0 && pid2tcb(tcp->u_rval) == NULL) {
2105 /*
2106 * We just reaped a child we don't know about,
2107 * presumably a zombie we already droptcb'd.
2108 */
2109 tcp->nzombies--;
2110 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002111 return 0;
2112}
2113
2114#ifdef SVR4
2115
2116int
2117sys_wait(tcp)
2118struct tcb *tcp;
2119{
2120 if (exiting(tcp)) {
2121 /* The library wrapper stuffs this into the user variable. */
2122 if (!syserror(tcp))
2123 printstatus(getrval2(tcp));
2124 }
2125 return 0;
2126}
2127
2128#endif /* SVR4 */
2129
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002130#ifdef FREEBSD
2131int
2132sys_wait(tcp)
2133struct tcb *tcp;
2134{
2135 int status;
Roland McGrath5a223472002-12-15 23:58:26 +00002136
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002137 if (exiting(tcp)) {
2138 if (!syserror(tcp)) {
2139 if (umove(tcp, tcp->u_arg[0], &status) < 0)
2140 tprintf("%#lx", tcp->u_arg[0]);
2141 else
2142 printstatus(status);
2143 }
2144 }
2145 return 0;
2146}
2147#endif
2148
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002149int
2150sys_waitpid(tcp)
2151struct tcb *tcp;
2152{
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002153 return printwaitn(tcp, 3, 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002154}
2155
2156int
2157sys_wait4(tcp)
2158struct tcb *tcp;
2159{
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002160 return printwaitn(tcp, 4, 0);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002161}
2162
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00002163#ifdef ALPHA
2164int
2165sys_osf_wait4(tcp)
2166struct tcb *tcp;
2167{
2168 return printwaitn(tcp, 4, 1);
2169}
2170#endif
2171
Roland McGrathc74c0b72004-09-01 19:39:46 +00002172#if defined SVR4 || defined LINUX
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002173
Roland McGrathd9f816f2004-09-04 03:39:20 +00002174static const struct xlat waitid_types[] = {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002175 { P_PID, "P_PID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002176#ifdef P_PPID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002177 { P_PPID, "P_PPID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002178#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002179 { P_PGID, "P_PGID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002180#ifdef P_SID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002181 { P_SID, "P_SID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002182#endif
2183#ifdef P_CID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002184 { P_CID, "P_CID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002185#endif
2186#ifdef P_UID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002187 { P_UID, "P_UID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002188#endif
2189#ifdef P_GID
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002190 { P_GID, "P_GID" },
Roland McGrathc74c0b72004-09-01 19:39:46 +00002191#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002192 { P_ALL, "P_ALL" },
2193#ifdef P_LWPID
2194 { P_LWPID, "P_LWPID" },
2195#endif
2196 { 0, NULL },
2197};
2198
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002199int
2200sys_waitid(tcp)
2201struct tcb *tcp;
2202{
2203 siginfo_t si;
2204 int exited;
2205
2206 if (entering(tcp)) {
2207 printxval(waitid_types, tcp->u_arg[0], "P_???");
2208 tprintf(", %ld, ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002209 }
2210 else {
2211 /* siginfo */
2212 exited = 0;
2213 if (!tcp->u_arg[2])
2214 tprintf("NULL");
2215 else if (syserror(tcp))
2216 tprintf("%#lx", tcp->u_arg[2]);
2217 else if (umove(tcp, tcp->u_arg[2], &si) < 0)
2218 tprintf("{???}");
2219 else
Denys Vlasenkof535b542009-01-13 18:30:55 +00002220 printsiginfo(&si, verbose(tcp));
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002221 /* options */
2222 tprintf(", ");
Roland McGrathb2dee132005-06-01 19:02:36 +00002223 printflags(wait4_options, tcp->u_arg[3], "W???");
Roland McGrath39426a32004-10-06 22:02:59 +00002224 if (tcp->u_nargs > 4) {
2225 /* usage */
2226 tprintf(", ");
2227 if (!tcp->u_arg[4])
2228 tprintf("NULL");
2229 else if (tcp->u_error)
2230 tprintf("%#lx", tcp->u_arg[4]);
2231 else
2232 printrusage(tcp, tcp->u_arg[4]);
2233 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002234 }
2235 return 0;
2236}
2237
Roland McGrathc74c0b72004-09-01 19:39:46 +00002238#endif /* SVR4 or LINUX */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002239
2240int
2241sys_alarm(tcp)
2242struct tcb *tcp;
2243{
2244 if (entering(tcp))
2245 tprintf("%lu", tcp->u_arg[0]);
2246 return 0;
2247}
2248
2249int
2250sys_uname(tcp)
2251struct tcb *tcp;
2252{
2253 struct utsname uname;
2254
2255 if (exiting(tcp)) {
2256 if (syserror(tcp) || !verbose(tcp))
2257 tprintf("%#lx", tcp->u_arg[0]);
2258 else if (umove(tcp, tcp->u_arg[0], &uname) < 0)
2259 tprintf("{...}");
2260 else if (!abbrev(tcp)) {
2261
2262 tprintf("{sysname=\"%s\", nodename=\"%s\", ",
2263 uname.sysname, uname.nodename);
2264 tprintf("release=\"%s\", version=\"%s\", ",
2265 uname.release, uname.version);
2266 tprintf("machine=\"%s\"", uname.machine);
2267#ifdef LINUX
2268#ifndef __GLIBC__
2269 tprintf(", domainname=\"%s\"", uname.domainname);
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002270#endif
2271#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002272 tprintf("}");
2273 }
2274 else
2275 tprintf("{sys=\"%s\", node=\"%s\", ...}",
2276 uname.sysname, uname.nodename);
2277 }
2278 return 0;
2279}
2280
2281#ifndef SVR4
2282
Denys Vlasenko4dedd562009-02-24 15:17:53 +00002283const struct xlat ptrace_cmds[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002284# ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002285 { PTRACE_TRACEME, "PTRACE_TRACEME" },
2286 { PTRACE_PEEKTEXT, "PTRACE_PEEKTEXT", },
2287 { PTRACE_PEEKDATA, "PTRACE_PEEKDATA", },
2288 { PTRACE_PEEKUSER, "PTRACE_PEEKUSER", },
2289 { PTRACE_POKETEXT, "PTRACE_POKETEXT", },
2290 { PTRACE_POKEDATA, "PTRACE_POKEDATA", },
2291 { PTRACE_POKEUSER, "PTRACE_POKEUSER", },
2292 { PTRACE_CONT, "PTRACE_CONT" },
2293 { PTRACE_KILL, "PTRACE_KILL" },
2294 { PTRACE_SINGLESTEP, "PTRACE_SINGLESTEP" },
2295 { PTRACE_ATTACH, "PTRACE_ATTACH" },
2296 { PTRACE_DETACH, "PTRACE_DETACH" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002297# ifdef PTRACE_GETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002298 { PTRACE_GETREGS, "PTRACE_GETREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002299# endif
2300# ifdef PTRACE_SETREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002301 { PTRACE_SETREGS, "PTRACE_SETREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002302# endif
2303# ifdef PTRACE_GETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002304 { PTRACE_GETFPREGS, "PTRACE_GETFPREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002305# endif
2306# ifdef PTRACE_SETFPREGS
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002307 { PTRACE_SETFPREGS, "PTRACE_SETFPREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002308# endif
2309# ifdef PTRACE_GETFPXREGS
Roland McGrathbf621d42003-01-14 09:46:21 +00002310 { PTRACE_GETFPXREGS, "PTRACE_GETFPXREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002311# endif
2312# ifdef PTRACE_SETFPXREGS
Roland McGrathbf621d42003-01-14 09:46:21 +00002313 { PTRACE_SETFPXREGS, "PTRACE_SETFPXREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002314# endif
2315# ifdef PTRACE_GETVRREGS
Roland McGrathf04bb482005-05-09 07:45:33 +00002316 { PTRACE_GETVRREGS, "PTRACE_GETVRREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002317# endif
2318# ifdef PTRACE_SETVRREGS
Roland McGrathf04bb482005-05-09 07:45:33 +00002319 { PTRACE_SETVRREGS, "PTRACE_SETVRREGS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002320# endif
2321# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00002322 { PTRACE_SETOPTIONS, "PTRACE_SETOPTIONS", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002323# endif
2324# ifdef PTRACE_GETEVENTMSG
Denys Vlasenkof535b542009-01-13 18:30:55 +00002325 { PTRACE_GETEVENTMSG, "PTRACE_GETEVENTMSG", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002326# endif
2327# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00002328 { PTRACE_GETSIGINFO, "PTRACE_GETSIGINFO", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002329# endif
2330# ifdef PTRACE_SETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00002331 { PTRACE_SETSIGINFO, "PTRACE_SETSIGINFO", },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002332# endif
2333# ifdef PTRACE_SET_SYSCALL
2334 { PTRACE_SET_SYSCALL, "PTRACE_SET_SYSCALL", },
2335# endif
2336# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002337 { PTRACE_READDATA, "PTRACE_READDATA" },
2338 { PTRACE_WRITEDATA, "PTRACE_WRITEDATA" },
2339 { PTRACE_READTEXT, "PTRACE_READTEXT" },
2340 { PTRACE_WRITETEXT, "PTRACE_WRITETEXT" },
2341 { PTRACE_GETFPAREGS, "PTRACE_GETFPAREGS" },
2342 { PTRACE_SETFPAREGS, "PTRACE_SETFPAREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002343# ifdef SPARC
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002344 { PTRACE_GETWINDOW, "PTRACE_GETWINDOW" },
2345 { PTRACE_SETWINDOW, "PTRACE_SETWINDOW" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002346# else /* !SPARC */
2347 { PTRACE_22, "PTRACE_22" },
2348 { PTRACE_23, "PTRACE_3" },
2349# endif /* !SPARC */
2350# endif /* SUNOS4 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002351 { PTRACE_SYSCALL, "PTRACE_SYSCALL" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002352# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002353 { PTRACE_DUMPCORE, "PTRACE_DUMPCORE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002354# ifdef I386
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002355 { PTRACE_SETWRBKPT, "PTRACE_SETWRBKPT" },
2356 { PTRACE_SETACBKPT, "PTRACE_SETACBKPT" },
2357 { PTRACE_CLRDR7, "PTRACE_CLRDR7" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002358# else /* !I386 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002359 { PTRACE_26, "PTRACE_26" },
2360 { PTRACE_27, "PTRACE_27" },
2361 { PTRACE_28, "PTRACE_28" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002362# endif /* !I386 */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002363 { PTRACE_GETUCODE, "PTRACE_GETUCODE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002364# endif /* SUNOS4 */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002365
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002366# else /* FREEBSD */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002367
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002368 { PT_TRACE_ME, "PT_TRACE_ME" },
2369 { PT_READ_I, "PT_READ_I" },
2370 { PT_READ_D, "PT_READ_D" },
2371 { PT_WRITE_I, "PT_WRITE_I" },
2372 { PT_WRITE_D, "PT_WRITE_D" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002373# ifdef PT_READ_U
John Hughesa2278142001-09-28 16:21:30 +00002374 { PT_READ_U, "PT_READ_U" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002375# endif
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00002376 { PT_CONTINUE, "PT_CONTINUE" },
2377 { PT_KILL, "PT_KILL" },
2378 { PT_STEP, "PT_STEP" },
2379 { PT_ATTACH, "PT_ATTACH" },
2380 { PT_DETACH, "PT_DETACH" },
2381 { PT_GETREGS, "PT_GETREGS" },
2382 { PT_SETREGS, "PT_SETREGS" },
2383 { PT_GETFPREGS, "PT_GETFPREGS" },
2384 { PT_SETFPREGS, "PT_SETFPREGS" },
2385 { PT_GETDBREGS, "PT_GETDBREGS" },
2386 { PT_SETDBREGS, "PT_SETDBREGS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002387# endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002388 { 0, NULL },
2389};
2390
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002391# ifndef FREEBSD
2392# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00002393static const struct xlat ptrace_setoptions_flags[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002394# ifdef PTRACE_O_TRACESYSGOOD
Denys Vlasenkof535b542009-01-13 18:30:55 +00002395 { PTRACE_O_TRACESYSGOOD,"PTRACE_O_TRACESYSGOOD" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002396# endif
2397# ifdef PTRACE_O_TRACEFORK
Denys Vlasenkof535b542009-01-13 18:30:55 +00002398 { PTRACE_O_TRACEFORK, "PTRACE_O_TRACEFORK" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002399# endif
2400# ifdef PTRACE_O_TRACEVFORK
Denys Vlasenkof535b542009-01-13 18:30:55 +00002401 { PTRACE_O_TRACEVFORK, "PTRACE_O_TRACEVFORK" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002402# endif
2403# ifdef PTRACE_O_TRACECLONE
Denys Vlasenkof535b542009-01-13 18:30:55 +00002404 { PTRACE_O_TRACECLONE, "PTRACE_O_TRACECLONE" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002405# endif
2406# ifdef PTRACE_O_TRACEEXEC
Denys Vlasenkof535b542009-01-13 18:30:55 +00002407 { PTRACE_O_TRACEEXEC, "PTRACE_O_TRACEEXEC" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002408# endif
2409# ifdef PTRACE_O_TRACEVFORKDONE
Denys Vlasenkof535b542009-01-13 18:30:55 +00002410 { PTRACE_O_TRACEVFORKDONE,"PTRACE_O_TRACEVFORKDONE"},
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002411# endif
2412# ifdef PTRACE_O_TRACEEXIT
Denys Vlasenkof535b542009-01-13 18:30:55 +00002413 { PTRACE_O_TRACEEXIT, "PTRACE_O_TRACEEXIT" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002414# endif
Denys Vlasenkof535b542009-01-13 18:30:55 +00002415 { 0, NULL },
2416};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002417# endif /* PTRACE_SETOPTIONS */
2418# endif /* !FREEBSD */
Denys Vlasenkof535b542009-01-13 18:30:55 +00002419
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002420# ifndef FREEBSD
Roland McGrathd9f816f2004-09-04 03:39:20 +00002421const struct xlat struct_user_offsets[] = {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002422# ifdef LINUX
2423# if defined(S390) || defined(S390X)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002424 { PT_PSWMASK, "psw_mask" },
2425 { PT_PSWADDR, "psw_addr" },
2426 { PT_GPR0, "gpr0" },
2427 { PT_GPR1, "gpr1" },
2428 { PT_GPR2, "gpr2" },
2429 { PT_GPR3, "gpr3" },
2430 { PT_GPR4, "gpr4" },
2431 { PT_GPR5, "gpr5" },
2432 { PT_GPR6, "gpr6" },
2433 { PT_GPR7, "gpr7" },
2434 { PT_GPR8, "gpr8" },
2435 { PT_GPR9, "gpr9" },
2436 { PT_GPR10, "gpr10" },
2437 { PT_GPR11, "gpr11" },
2438 { PT_GPR12, "gpr12" },
2439 { PT_GPR13, "gpr13" },
2440 { PT_GPR14, "gpr14" },
2441 { PT_GPR15, "gpr15" },
2442 { PT_ACR0, "acr0" },
2443 { PT_ACR1, "acr1" },
2444 { PT_ACR2, "acr2" },
2445 { PT_ACR3, "acr3" },
2446 { PT_ACR4, "acr4" },
2447 { PT_ACR5, "acr5" },
2448 { PT_ACR6, "acr6" },
2449 { PT_ACR7, "acr7" },
2450 { PT_ACR8, "acr8" },
2451 { PT_ACR9, "acr9" },
2452 { PT_ACR10, "acr10" },
2453 { PT_ACR11, "acr11" },
2454 { PT_ACR12, "acr12" },
2455 { PT_ACR13, "acr13" },
2456 { PT_ACR14, "acr14" },
2457 { PT_ACR15, "acr15" },
2458 { PT_ORIGGPR2, "orig_gpr2" },
2459 { PT_FPC, "fpc" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002460# if defined(S390)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002461 { PT_FPR0_HI, "fpr0.hi" },
2462 { PT_FPR0_LO, "fpr0.lo" },
2463 { PT_FPR1_HI, "fpr1.hi" },
2464 { PT_FPR1_LO, "fpr1.lo" },
2465 { PT_FPR2_HI, "fpr2.hi" },
2466 { PT_FPR2_LO, "fpr2.lo" },
2467 { PT_FPR3_HI, "fpr3.hi" },
2468 { PT_FPR3_LO, "fpr3.lo" },
2469 { PT_FPR4_HI, "fpr4.hi" },
2470 { PT_FPR4_LO, "fpr4.lo" },
2471 { PT_FPR5_HI, "fpr5.hi" },
2472 { PT_FPR5_LO, "fpr5.lo" },
2473 { PT_FPR6_HI, "fpr6.hi" },
2474 { PT_FPR6_LO, "fpr6.lo" },
2475 { PT_FPR7_HI, "fpr7.hi" },
2476 { PT_FPR7_LO, "fpr7.lo" },
2477 { PT_FPR8_HI, "fpr8.hi" },
2478 { PT_FPR8_LO, "fpr8.lo" },
2479 { PT_FPR9_HI, "fpr9.hi" },
2480 { PT_FPR9_LO, "fpr9.lo" },
2481 { PT_FPR10_HI, "fpr10.hi" },
2482 { PT_FPR10_LO, "fpr10.lo" },
2483 { PT_FPR11_HI, "fpr11.hi" },
2484 { PT_FPR11_LO, "fpr11.lo" },
2485 { PT_FPR12_HI, "fpr12.hi" },
2486 { PT_FPR12_LO, "fpr12.lo" },
2487 { PT_FPR13_HI, "fpr13.hi" },
2488 { PT_FPR13_LO, "fpr13.lo" },
2489 { PT_FPR14_HI, "fpr14.hi" },
2490 { PT_FPR14_LO, "fpr14.lo" },
2491 { PT_FPR15_HI, "fpr15.hi" },
2492 { PT_FPR15_LO, "fpr15.lo" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002493# endif
2494# if defined(S390X)
Michal Ludvig10a88d02002-10-07 14:31:00 +00002495 { PT_FPR0, "fpr0" },
2496 { PT_FPR1, "fpr1" },
2497 { PT_FPR2, "fpr2" },
2498 { PT_FPR3, "fpr3" },
2499 { PT_FPR4, "fpr4" },
2500 { PT_FPR5, "fpr5" },
2501 { PT_FPR6, "fpr6" },
2502 { PT_FPR7, "fpr7" },
2503 { PT_FPR8, "fpr8" },
2504 { PT_FPR9, "fpr9" },
2505 { PT_FPR10, "fpr10" },
2506 { PT_FPR11, "fpr11" },
2507 { PT_FPR12, "fpr12" },
2508 { PT_FPR13, "fpr13" },
2509 { PT_FPR14, "fpr14" },
2510 { PT_FPR15, "fpr15" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002511# endif
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002512 { PT_CR_9, "cr9" },
2513 { PT_CR_10, "cr10" },
2514 { PT_CR_11, "cr11" },
Michal Ludvig10a88d02002-10-07 14:31:00 +00002515 { PT_IEEE_IP, "ieee_exception_ip" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002516# elif defined(SPARC)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002517 /* XXX No support for these offsets yet. */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002518# elif defined(HPPA)
Wichert Akkermanc1652e22001-03-27 12:17:16 +00002519 /* XXX No support for these offsets yet. */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002520# elif defined(POWERPC)
2521# ifndef PT_ORIG_R3
2522# define PT_ORIG_R3 34
2523# endif
2524# define REGSIZE (sizeof(unsigned long))
Roland McGratheb285352003-01-14 09:59:00 +00002525 { REGSIZE*PT_R0, "r0" },
2526 { REGSIZE*PT_R1, "r1" },
2527 { REGSIZE*PT_R2, "r2" },
2528 { REGSIZE*PT_R3, "r3" },
2529 { REGSIZE*PT_R4, "r4" },
2530 { REGSIZE*PT_R5, "r5" },
2531 { REGSIZE*PT_R6, "r6" },
2532 { REGSIZE*PT_R7, "r7" },
2533 { REGSIZE*PT_R8, "r8" },
2534 { REGSIZE*PT_R9, "r9" },
2535 { REGSIZE*PT_R10, "r10" },
2536 { REGSIZE*PT_R11, "r11" },
2537 { REGSIZE*PT_R12, "r12" },
2538 { REGSIZE*PT_R13, "r13" },
2539 { REGSIZE*PT_R14, "r14" },
2540 { REGSIZE*PT_R15, "r15" },
2541 { REGSIZE*PT_R16, "r16" },
2542 { REGSIZE*PT_R17, "r17" },
2543 { REGSIZE*PT_R18, "r18" },
2544 { REGSIZE*PT_R19, "r19" },
2545 { REGSIZE*PT_R20, "r20" },
2546 { REGSIZE*PT_R21, "r21" },
2547 { REGSIZE*PT_R22, "r22" },
2548 { REGSIZE*PT_R23, "r23" },
2549 { REGSIZE*PT_R24, "r24" },
2550 { REGSIZE*PT_R25, "r25" },
2551 { REGSIZE*PT_R26, "r26" },
2552 { REGSIZE*PT_R27, "r27" },
2553 { REGSIZE*PT_R28, "r28" },
2554 { REGSIZE*PT_R29, "r29" },
2555 { REGSIZE*PT_R30, "r30" },
2556 { REGSIZE*PT_R31, "r31" },
2557 { REGSIZE*PT_NIP, "NIP" },
2558 { REGSIZE*PT_MSR, "MSR" },
2559 { REGSIZE*PT_ORIG_R3, "ORIG_R3" },
2560 { REGSIZE*PT_CTR, "CTR" },
2561 { REGSIZE*PT_LNK, "LNK" },
2562 { REGSIZE*PT_XER, "XER" },
2563 { REGSIZE*PT_CCR, "CCR" },
2564 { REGSIZE*PT_FPR0, "FPR0" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002565# undef REGSIZE
2566# elif defined(ALPHA)
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +00002567 { 0, "r0" },
2568 { 1, "r1" },
2569 { 2, "r2" },
2570 { 3, "r3" },
2571 { 4, "r4" },
2572 { 5, "r5" },
2573 { 6, "r6" },
2574 { 7, "r7" },
2575 { 8, "r8" },
2576 { 9, "r9" },
2577 { 10, "r10" },
2578 { 11, "r11" },
2579 { 12, "r12" },
2580 { 13, "r13" },
2581 { 14, "r14" },
2582 { 15, "r15" },
2583 { 16, "r16" },
2584 { 17, "r17" },
2585 { 18, "r18" },
2586 { 19, "r19" },
2587 { 20, "r20" },
2588 { 21, "r21" },
2589 { 22, "r22" },
2590 { 23, "r23" },
2591 { 24, "r24" },
2592 { 25, "r25" },
2593 { 26, "r26" },
2594 { 27, "r27" },
2595 { 28, "r28" },
2596 { 29, "gp" },
2597 { 30, "fp" },
2598 { 31, "zero" },
2599 { 32, "fp0" },
2600 { 33, "fp" },
2601 { 34, "fp2" },
2602 { 35, "fp3" },
2603 { 36, "fp4" },
2604 { 37, "fp5" },
2605 { 38, "fp6" },
2606 { 39, "fp7" },
2607 { 40, "fp8" },
2608 { 41, "fp9" },
2609 { 42, "fp10" },
2610 { 43, "fp11" },
2611 { 44, "fp12" },
2612 { 45, "fp13" },
2613 { 46, "fp14" },
2614 { 47, "fp15" },
2615 { 48, "fp16" },
2616 { 49, "fp17" },
2617 { 50, "fp18" },
2618 { 51, "fp19" },
2619 { 52, "fp20" },
2620 { 53, "fp21" },
2621 { 54, "fp22" },
2622 { 55, "fp23" },
2623 { 56, "fp24" },
2624 { 57, "fp25" },
2625 { 58, "fp26" },
2626 { 59, "fp27" },
2627 { 60, "fp28" },
2628 { 61, "fp29" },
2629 { 62, "fp30" },
2630 { 63, "fp31" },
2631 { 64, "pc" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002632# elif defined(IA64)
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002633 { PT_F32, "f32" }, { PT_F33, "f33" }, { PT_F34, "f34" },
2634 { PT_F35, "f35" }, { PT_F36, "f36" }, { PT_F37, "f37" },
2635 { PT_F38, "f38" }, { PT_F39, "f39" }, { PT_F40, "f40" },
2636 { PT_F41, "f41" }, { PT_F42, "f42" }, { PT_F43, "f43" },
2637 { PT_F44, "f44" }, { PT_F45, "f45" }, { PT_F46, "f46" },
2638 { PT_F47, "f47" }, { PT_F48, "f48" }, { PT_F49, "f49" },
2639 { PT_F50, "f50" }, { PT_F51, "f51" }, { PT_F52, "f52" },
2640 { PT_F53, "f53" }, { PT_F54, "f54" }, { PT_F55, "f55" },
2641 { PT_F56, "f56" }, { PT_F57, "f57" }, { PT_F58, "f58" },
2642 { PT_F59, "f59" }, { PT_F60, "f60" }, { PT_F61, "f61" },
2643 { PT_F62, "f62" }, { PT_F63, "f63" }, { PT_F64, "f64" },
2644 { PT_F65, "f65" }, { PT_F66, "f66" }, { PT_F67, "f67" },
2645 { PT_F68, "f68" }, { PT_F69, "f69" }, { PT_F70, "f70" },
2646 { PT_F71, "f71" }, { PT_F72, "f72" }, { PT_F73, "f73" },
2647 { PT_F74, "f74" }, { PT_F75, "f75" }, { PT_F76, "f76" },
2648 { PT_F77, "f77" }, { PT_F78, "f78" }, { PT_F79, "f79" },
2649 { PT_F80, "f80" }, { PT_F81, "f81" }, { PT_F82, "f82" },
2650 { PT_F83, "f83" }, { PT_F84, "f84" }, { PT_F85, "f85" },
2651 { PT_F86, "f86" }, { PT_F87, "f87" }, { PT_F88, "f88" },
2652 { PT_F89, "f89" }, { PT_F90, "f90" }, { PT_F91, "f91" },
2653 { PT_F92, "f92" }, { PT_F93, "f93" }, { PT_F94, "f94" },
2654 { PT_F95, "f95" }, { PT_F96, "f96" }, { PT_F97, "f97" },
2655 { PT_F98, "f98" }, { PT_F99, "f99" }, { PT_F100, "f100" },
2656 { PT_F101, "f101" }, { PT_F102, "f102" }, { PT_F103, "f103" },
2657 { PT_F104, "f104" }, { PT_F105, "f105" }, { PT_F106, "f106" },
2658 { PT_F107, "f107" }, { PT_F108, "f108" }, { PT_F109, "f109" },
2659 { PT_F110, "f110" }, { PT_F111, "f111" }, { PT_F112, "f112" },
2660 { PT_F113, "f113" }, { PT_F114, "f114" }, { PT_F115, "f115" },
2661 { PT_F116, "f116" }, { PT_F117, "f117" }, { PT_F118, "f118" },
2662 { PT_F119, "f119" }, { PT_F120, "f120" }, { PT_F121, "f121" },
2663 { PT_F122, "f122" }, { PT_F123, "f123" }, { PT_F124, "f124" },
2664 { PT_F125, "f125" }, { PT_F126, "f126" }, { PT_F127, "f127" },
2665 /* switch stack: */
2666 { PT_F2, "f2" }, { PT_F3, "f3" }, { PT_F4, "f4" },
2667 { PT_F5, "f5" }, { PT_F10, "f10" }, { PT_F11, "f11" },
2668 { PT_F12, "f12" }, { PT_F13, "f13" }, { PT_F14, "f14" },
2669 { PT_F15, "f15" }, { PT_F16, "f16" }, { PT_F17, "f17" },
2670 { PT_F18, "f18" }, { PT_F19, "f19" }, { PT_F20, "f20" },
2671 { PT_F21, "f21" }, { PT_F22, "f22" }, { PT_F23, "f23" },
2672 { PT_F24, "f24" }, { PT_F25, "f25" }, { PT_F26, "f26" },
2673 { PT_F27, "f27" }, { PT_F28, "f28" }, { PT_F29, "f29" },
2674 { PT_F30, "f30" }, { PT_F31, "f31" }, { PT_R4, "r4" },
2675 { PT_R5, "r5" }, { PT_R6, "r6" }, { PT_R7, "r7" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002676 { PT_B1, "b1" }, { PT_B2, "b2" }, { PT_B3, "b3" },
2677 { PT_B4, "b4" }, { PT_B5, "b5" },
Roland McGrathca4e10c2004-01-13 10:13:20 +00002678 { PT_AR_EC, "ar.ec" }, { PT_AR_LC, "ar.lc" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002679 /* pt_regs */
Roland McGrathca4e10c2004-01-13 10:13:20 +00002680 { PT_CR_IPSR, "psr" }, { PT_CR_IIP, "ip" },
2681 { PT_CFM, "cfm" }, { PT_AR_UNAT, "ar.unat" },
Wichert Akkerman8b1b40c2000-02-03 21:58:30 +00002682 { PT_AR_PFS, "ar.pfs" }, { PT_AR_RSC, "ar.rsc" },
2683 { PT_AR_RNAT, "ar.rnat" }, { PT_AR_BSPSTORE, "ar.bspstore" },
2684 { PT_PR, "pr" }, { PT_B6, "b6" }, { PT_AR_BSP, "ar.bsp" },
2685 { PT_R1, "r1" }, { PT_R2, "r2" }, { PT_R3, "r3" },
2686 { PT_R12, "r12" }, { PT_R13, "r13" }, { PT_R14, "r14" },
2687 { PT_R15, "r15" }, { PT_R8, "r8" }, { PT_R9, "r9" },
2688 { PT_R10, "r10" }, { PT_R11, "r11" }, { PT_R16, "r16" },
2689 { PT_R17, "r17" }, { PT_R18, "r18" }, { PT_R19, "r19" },
2690 { PT_R20, "r20" }, { PT_R21, "r21" }, { PT_R22, "r22" },
2691 { PT_R23, "r23" }, { PT_R24, "r24" }, { PT_R25, "r25" },
2692 { PT_R26, "r26" }, { PT_R27, "r27" }, { PT_R28, "r28" },
2693 { PT_R29, "r29" }, { PT_R30, "r30" }, { PT_R31, "r31" },
2694 { PT_AR_CCV, "ar.ccv" }, { PT_AR_FPSR, "ar.fpsr" },
2695 { PT_B0, "b0" }, { PT_B7, "b7" }, { PT_F6, "f6" },
2696 { PT_F7, "f7" }, { PT_F8, "f8" }, { PT_F9, "f9" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002697# ifdef PT_AR_CSD
Roland McGrathfb1bc072004-03-01 21:29:24 +00002698 { PT_AR_CSD, "ar.csd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002699# endif
2700# ifdef PT_AR_SSD
Roland McGrathfb1bc072004-03-01 21:29:24 +00002701 { PT_AR_SSD, "ar.ssd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002702# endif
Roland McGrathca4e10c2004-01-13 10:13:20 +00002703 { PT_DBR, "dbr" }, { PT_IBR, "ibr" }, { PT_PMD, "pmd" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002704# elif defined(I386)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002705 { 4*EBX, "4*EBX" },
2706 { 4*ECX, "4*ECX" },
2707 { 4*EDX, "4*EDX" },
2708 { 4*ESI, "4*ESI" },
2709 { 4*EDI, "4*EDI" },
2710 { 4*EBP, "4*EBP" },
2711 { 4*EAX, "4*EAX" },
2712 { 4*DS, "4*DS" },
2713 { 4*ES, "4*ES" },
2714 { 4*FS, "4*FS" },
2715 { 4*GS, "4*GS" },
2716 { 4*ORIG_EAX, "4*ORIG_EAX" },
2717 { 4*EIP, "4*EIP" },
2718 { 4*CS, "4*CS" },
2719 { 4*EFL, "4*EFL" },
2720 { 4*UESP, "4*UESP" },
2721 { 4*SS, "4*SS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002722# elif defined(X86_64)
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002723 { 8*R15, "8*R15" },
2724 { 8*R14, "8*R14" },
2725 { 8*R13, "8*R13" },
2726 { 8*R12, "8*R12" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002727 { 8*RBP, "8*RBP" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002728 { 8*RBX, "8*RBX" },
2729 { 8*R11, "8*R11" },
2730 { 8*R10, "8*R10" },
2731 { 8*R9, "8*R9" },
2732 { 8*R8, "8*R8" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002733 { 8*RAX, "8*RAX" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002734 { 8*RCX, "8*RCX" },
2735 { 8*RDX, "8*RDX" },
2736 { 8*RSI, "8*RSI" },
2737 { 8*RDI, "8*RDI" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002738# if 0
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002739 { DS, "DS" },
2740 { ES, "ES" },
2741 { FS, "FS" },
2742 { GS, "GS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002743# endif
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002744 { 8*ORIG_RAX, "8*ORIG_RAX" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002745 { 8*RIP, "8*RIP" },
2746 { 8*CS, "8*CS" },
2747 { 8*EFLAGS, "8*EFL" },
Roland McGratha4f9f2d2005-06-07 23:21:20 +00002748 { 8*RSP, "8*RSP" },
Michal Ludvig0e035502002-09-23 15:41:01 +00002749 { 8*SS, "8*SS" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002750# elif defined(M68K)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00002751 { 4*PT_D1, "4*PT_D1" },
2752 { 4*PT_D2, "4*PT_D2" },
2753 { 4*PT_D3, "4*PT_D3" },
2754 { 4*PT_D4, "4*PT_D4" },
2755 { 4*PT_D5, "4*PT_D5" },
2756 { 4*PT_D6, "4*PT_D6" },
2757 { 4*PT_D7, "4*PT_D7" },
2758 { 4*PT_A0, "4*PT_A0" },
2759 { 4*PT_A1, "4*PT_A1" },
2760 { 4*PT_A2, "4*PT_A2" },
2761 { 4*PT_A3, "4*PT_A3" },
2762 { 4*PT_A4, "4*PT_A4" },
2763 { 4*PT_A5, "4*PT_A5" },
2764 { 4*PT_A6, "4*PT_A6" },
2765 { 4*PT_D0, "4*PT_D0" },
2766 { 4*PT_USP, "4*PT_USP" },
2767 { 4*PT_ORIG_D0, "4*PT_ORIG_D0" },
2768 { 4*PT_SR, "4*PT_SR" },
2769 { 4*PT_PC, "4*PT_PC" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002770# elif defined(SH)
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002771 { 4*REG_REG0, "4*REG_REG0" },
2772 { 4*(REG_REG0+1), "4*REG_REG1" },
2773 { 4*(REG_REG0+2), "4*REG_REG2" },
2774 { 4*(REG_REG0+3), "4*REG_REG3" },
2775 { 4*(REG_REG0+4), "4*REG_REG4" },
2776 { 4*(REG_REG0+5), "4*REG_REG5" },
2777 { 4*(REG_REG0+6), "4*REG_REG6" },
2778 { 4*(REG_REG0+7), "4*REG_REG7" },
2779 { 4*(REG_REG0+8), "4*REG_REG8" },
2780 { 4*(REG_REG0+9), "4*REG_REG9" },
2781 { 4*(REG_REG0+10), "4*REG_REG10" },
2782 { 4*(REG_REG0+11), "4*REG_REG11" },
2783 { 4*(REG_REG0+12), "4*REG_REG12" },
2784 { 4*(REG_REG0+13), "4*REG_REG13" },
2785 { 4*(REG_REG0+14), "4*REG_REG14" },
2786 { 4*REG_REG15, "4*REG_REG15" },
2787 { 4*REG_PC, "4*REG_PC" },
2788 { 4*REG_PR, "4*REG_PR" },
2789 { 4*REG_SR, "4*REG_SR" },
2790 { 4*REG_GBR, "4*REG_GBR" },
2791 { 4*REG_MACH, "4*REG_MACH" },
2792 { 4*REG_MACL, "4*REG_MACL" },
2793 { 4*REG_SYSCALL, "4*REG_SYSCALL" },
2794 { 4*REG_FPUL, "4*REG_FPUL" },
2795 { 4*REG_FPREG0, "4*REG_FPREG0" },
2796 { 4*(REG_FPREG0+1), "4*REG_FPREG1" },
2797 { 4*(REG_FPREG0+2), "4*REG_FPREG2" },
2798 { 4*(REG_FPREG0+3), "4*REG_FPREG3" },
2799 { 4*(REG_FPREG0+4), "4*REG_FPREG4" },
2800 { 4*(REG_FPREG0+5), "4*REG_FPREG5" },
2801 { 4*(REG_FPREG0+6), "4*REG_FPREG6" },
2802 { 4*(REG_FPREG0+7), "4*REG_FPREG7" },
2803 { 4*(REG_FPREG0+8), "4*REG_FPREG8" },
2804 { 4*(REG_FPREG0+9), "4*REG_FPREG9" },
2805 { 4*(REG_FPREG0+10), "4*REG_FPREG10" },
2806 { 4*(REG_FPREG0+11), "4*REG_FPREG11" },
2807 { 4*(REG_FPREG0+12), "4*REG_FPREG12" },
2808 { 4*(REG_FPREG0+13), "4*REG_FPREG13" },
2809 { 4*(REG_FPREG0+14), "4*REG_FPREG14" },
2810 { 4*REG_FPREG15, "4*REG_FPREG15" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002811# ifdef REG_XDREG0
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002812 { 4*REG_XDREG0, "4*REG_XDREG0" },
2813 { 4*(REG_XDREG0+2), "4*REG_XDREG2" },
2814 { 4*(REG_XDREG0+4), "4*REG_XDREG4" },
2815 { 4*(REG_XDREG0+6), "4*REG_XDREG6" },
2816 { 4*(REG_XDREG0+8), "4*REG_XDREG8" },
2817 { 4*(REG_XDREG0+10), "4*REG_XDREG10" },
2818 { 4*(REG_XDREG0+12), "4*REG_XDREG12" },
2819 { 4*REG_XDREG14, "4*REG_XDREG14" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002820# endif
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002821 { 4*REG_FPSCR, "4*REG_FPSCR" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002822# elif defined(SH64)
Roland McGrathe1e584b2003-06-02 19:18:58 +00002823 { 0, "PC(L)" },
2824 { 4, "PC(U)" },
2825 { 8, "SR(L)" },
2826 { 12, "SR(U)" },
2827 { 16, "syscall no.(L)" },
2828 { 20, "syscall_no.(U)" },
2829 { 24, "R0(L)" },
2830 { 28, "R0(U)" },
2831 { 32, "R1(L)" },
2832 { 36, "R1(U)" },
2833 { 40, "R2(L)" },
2834 { 44, "R2(U)" },
2835 { 48, "R3(L)" },
2836 { 52, "R3(U)" },
2837 { 56, "R4(L)" },
2838 { 60, "R4(U)" },
2839 { 64, "R5(L)" },
2840 { 68, "R5(U)" },
2841 { 72, "R6(L)" },
2842 { 76, "R6(U)" },
2843 { 80, "R7(L)" },
2844 { 84, "R7(U)" },
2845 { 88, "R8(L)" },
2846 { 92, "R8(U)" },
2847 { 96, "R9(L)" },
2848 { 100, "R9(U)" },
2849 { 104, "R10(L)" },
2850 { 108, "R10(U)" },
2851 { 112, "R11(L)" },
2852 { 116, "R11(U)" },
2853 { 120, "R12(L)" },
2854 { 124, "R12(U)" },
2855 { 128, "R13(L)" },
2856 { 132, "R13(U)" },
2857 { 136, "R14(L)" },
2858 { 140, "R14(U)" },
2859 { 144, "R15(L)" },
2860 { 148, "R15(U)" },
2861 { 152, "R16(L)" },
2862 { 156, "R16(U)" },
2863 { 160, "R17(L)" },
2864 { 164, "R17(U)" },
2865 { 168, "R18(L)" },
2866 { 172, "R18(U)" },
2867 { 176, "R19(L)" },
2868 { 180, "R19(U)" },
2869 { 184, "R20(L)" },
2870 { 188, "R20(U)" },
2871 { 192, "R21(L)" },
2872 { 196, "R21(U)" },
2873 { 200, "R22(L)" },
2874 { 204, "R22(U)" },
2875 { 208, "R23(L)" },
2876 { 212, "R23(U)" },
2877 { 216, "R24(L)" },
2878 { 220, "R24(U)" },
2879 { 224, "R25(L)" },
2880 { 228, "R25(U)" },
2881 { 232, "R26(L)" },
2882 { 236, "R26(U)" },
2883 { 240, "R27(L)" },
2884 { 244, "R27(U)" },
2885 { 248, "R28(L)" },
2886 { 252, "R28(U)" },
2887 { 256, "R29(L)" },
2888 { 260, "R29(U)" },
2889 { 264, "R30(L)" },
2890 { 268, "R30(U)" },
2891 { 272, "R31(L)" },
2892 { 276, "R31(U)" },
2893 { 280, "R32(L)" },
2894 { 284, "R32(U)" },
2895 { 288, "R33(L)" },
2896 { 292, "R33(U)" },
2897 { 296, "R34(L)" },
2898 { 300, "R34(U)" },
2899 { 304, "R35(L)" },
2900 { 308, "R35(U)" },
2901 { 312, "R36(L)" },
2902 { 316, "R36(U)" },
2903 { 320, "R37(L)" },
2904 { 324, "R37(U)" },
2905 { 328, "R38(L)" },
2906 { 332, "R38(U)" },
2907 { 336, "R39(L)" },
2908 { 340, "R39(U)" },
2909 { 344, "R40(L)" },
2910 { 348, "R40(U)" },
2911 { 352, "R41(L)" },
2912 { 356, "R41(U)" },
2913 { 360, "R42(L)" },
2914 { 364, "R42(U)" },
2915 { 368, "R43(L)" },
2916 { 372, "R43(U)" },
2917 { 376, "R44(L)" },
2918 { 380, "R44(U)" },
2919 { 384, "R45(L)" },
2920 { 388, "R45(U)" },
2921 { 392, "R46(L)" },
2922 { 396, "R46(U)" },
2923 { 400, "R47(L)" },
2924 { 404, "R47(U)" },
2925 { 408, "R48(L)" },
2926 { 412, "R48(U)" },
2927 { 416, "R49(L)" },
2928 { 420, "R49(U)" },
2929 { 424, "R50(L)" },
2930 { 428, "R50(U)" },
2931 { 432, "R51(L)" },
2932 { 436, "R51(U)" },
2933 { 440, "R52(L)" },
2934 { 444, "R52(U)" },
2935 { 448, "R53(L)" },
2936 { 452, "R53(U)" },
2937 { 456, "R54(L)" },
2938 { 460, "R54(U)" },
2939 { 464, "R55(L)" },
2940 { 468, "R55(U)" },
2941 { 472, "R56(L)" },
2942 { 476, "R56(U)" },
2943 { 480, "R57(L)" },
2944 { 484, "R57(U)" },
2945 { 488, "R58(L)" },
2946 { 492, "R58(U)" },
2947 { 496, "R59(L)" },
2948 { 500, "R59(U)" },
2949 { 504, "R60(L)" },
2950 { 508, "R60(U)" },
2951 { 512, "R61(L)" },
2952 { 516, "R61(U)" },
2953 { 520, "R62(L)" },
2954 { 524, "R62(U)" },
2955 { 528, "TR0(L)" },
2956 { 532, "TR0(U)" },
2957 { 536, "TR1(L)" },
2958 { 540, "TR1(U)" },
2959 { 544, "TR2(L)" },
2960 { 548, "TR2(U)" },
2961 { 552, "TR3(L)" },
2962 { 556, "TR3(U)" },
2963 { 560, "TR4(L)" },
2964 { 564, "TR4(U)" },
2965 { 568, "TR5(L)" },
2966 { 572, "TR5(U)" },
2967 { 576, "TR6(L)" },
2968 { 580, "TR6(U)" },
2969 { 584, "TR7(L)" },
2970 { 588, "TR7(U)" },
Denys Vlasenkoadedb512008-12-30 18:47:55 +00002971 /* This entry is in case pt_regs contains dregs (depends on
2972 the kernel build options). */
Roland McGrathe1e584b2003-06-02 19:18:58 +00002973 { uoff(regs), "offsetof(struct user, regs)" },
2974 { uoff(fpu), "offsetof(struct user, fpu)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002975# elif defined(ARM)
Roland McGrath0f87c492003-06-03 23:29:04 +00002976 { uoff(regs.ARM_r0), "r0" },
2977 { uoff(regs.ARM_r1), "r1" },
2978 { uoff(regs.ARM_r2), "r2" },
2979 { uoff(regs.ARM_r3), "r3" },
2980 { uoff(regs.ARM_r4), "r4" },
2981 { uoff(regs.ARM_r5), "r5" },
2982 { uoff(regs.ARM_r6), "r6" },
2983 { uoff(regs.ARM_r7), "r7" },
2984 { uoff(regs.ARM_r8), "r8" },
2985 { uoff(regs.ARM_r9), "r9" },
2986 { uoff(regs.ARM_r10), "r10" },
2987 { uoff(regs.ARM_fp), "fp" },
2988 { uoff(regs.ARM_ip), "ip" },
2989 { uoff(regs.ARM_sp), "sp" },
2990 { uoff(regs.ARM_lr), "lr" },
2991 { uoff(regs.ARM_pc), "pc" },
2992 { uoff(regs.ARM_cpsr), "cpsr" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00002993# elif defined(MIPS)
Roland McGrath542c2c62008-05-20 01:11:56 +00002994 { 0, "r0" },
2995 { 1, "r1" },
2996 { 2, "r2" },
2997 { 3, "r3" },
2998 { 4, "r4" },
2999 { 5, "r5" },
3000 { 6, "r6" },
3001 { 7, "r7" },
3002 { 8, "r8" },
3003 { 9, "r9" },
3004 { 10, "r10" },
3005 { 11, "r11" },
3006 { 12, "r12" },
3007 { 13, "r13" },
3008 { 14, "r14" },
3009 { 15, "r15" },
3010 { 16, "r16" },
3011 { 17, "r17" },
3012 { 18, "r18" },
3013 { 19, "r19" },
3014 { 20, "r20" },
3015 { 21, "r21" },
3016 { 22, "r22" },
3017 { 23, "r23" },
3018 { 24, "r24" },
3019 { 25, "r25" },
3020 { 26, "r26" },
3021 { 27, "r27" },
3022 { 28, "r28" },
3023 { 29, "r29" },
3024 { 30, "r30" },
3025 { 31, "r31" },
3026 { 32, "f0" },
3027 { 33, "f1" },
3028 { 34, "f2" },
3029 { 35, "f3" },
3030 { 36, "f4" },
3031 { 37, "f5" },
3032 { 38, "f6" },
3033 { 39, "f7" },
3034 { 40, "f8" },
3035 { 41, "f9" },
3036 { 42, "f10" },
3037 { 43, "f11" },
3038 { 44, "f12" },
3039 { 45, "f13" },
3040 { 46, "f14" },
3041 { 47, "f15" },
3042 { 48, "f16" },
3043 { 49, "f17" },
3044 { 50, "f18" },
3045 { 51, "f19" },
3046 { 52, "f20" },
3047 { 53, "f21" },
3048 { 54, "f22" },
3049 { 55, "f23" },
3050 { 56, "f24" },
3051 { 57, "f25" },
3052 { 58, "f26" },
3053 { 59, "f27" },
3054 { 60, "f28" },
3055 { 61, "f29" },
3056 { 62, "f30" },
3057 { 63, "f31" },
3058 { 64, "pc" },
3059 { 65, "cause" },
3060 { 66, "badvaddr" },
3061 { 67, "mmhi" },
3062 { 68, "mmlo" },
3063 { 69, "fpcsr" },
3064 { 70, "fpeir" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003065# endif
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003066# ifdef CRISV10
3067 { 4*PT_FRAMETYPE, "4*PT_FRAMETYPE" },
3068 { 4*PT_ORIG_R10, "4*PT_ORIG_R10" },
3069 { 4*PT_R13, "4*PT_R13" },
3070 { 4*PT_R12, "4*PT_R12" },
3071 { 4*PT_R11, "4*PT_R11" },
3072 { 4*PT_R10, "4*PT_R10" },
3073 { 4*PT_R9, "4*PT_R9" },
3074 { 4*PT_R8, "4*PT_R8" },
3075 { 4*PT_R7, "4*PT_R7" },
3076 { 4*PT_R6, "4*PT_R6" },
3077 { 4*PT_R5, "4*PT_R5" },
3078 { 4*PT_R4, "4*PT_R4" },
3079 { 4*PT_R3, "4*PT_R3" },
3080 { 4*PT_R2, "4*PT_R2" },
3081 { 4*PT_R1, "4*PT_R1" },
3082 { 4*PT_R0, "4*PT_R0" },
3083 { 4*PT_MOF, "4*PT_MOF" },
3084 { 4*PT_DCCR, "4*PT_DCCR" },
3085 { 4*PT_SRP, "4*PT_SRP" },
3086 { 4*PT_IRP, "4*PT_IRP" },
3087 { 4*PT_CSRINSTR, "4*PT_CSRINSTR" },
3088 { 4*PT_CSRADDR, "4*PT_CSRADDR" },
3089 { 4*PT_CSRDATA, "4*PT_CSRDATA" },
3090 { 4*PT_USP, "4*PT_USP" },
3091# endif
3092# ifdef CRISV32
3093 { 4*PT_ORIG_R10, "4*PT_ORIG_R10" },
3094 { 4*PT_R0, "4*PT_R0" },
3095 { 4*PT_R1, "4*PT_R1" },
3096 { 4*PT_R2, "4*PT_R2" },
3097 { 4*PT_R3, "4*PT_R3" },
3098 { 4*PT_R4, "4*PT_R4" },
3099 { 4*PT_R5, "4*PT_R5" },
3100 { 4*PT_R6, "4*PT_R6" },
3101 { 4*PT_R7, "4*PT_R7" },
3102 { 4*PT_R8, "4*PT_R8" },
3103 { 4*PT_R9, "4*PT_R9" },
3104 { 4*PT_R10, "4*PT_R10" },
3105 { 4*PT_R11, "4*PT_R11" },
3106 { 4*PT_R12, "4*PT_R12" },
3107 { 4*PT_R13, "4*PT_R13" },
3108 { 4*PT_ACR, "4*PT_ACR" },
3109 { 4*PT_SRS, "4*PT_SRS" },
3110 { 4*PT_MOF, "4*PT_MOF" },
3111 { 4*PT_SPC, "4*PT_SPC" },
3112 { 4*PT_CCS, "4*PT_CCS" },
3113 { 4*PT_SRP, "4*PT_SRP" },
3114 { 4*PT_ERP, "4*PT_ERP" },
3115 { 4*PT_EXS, "4*PT_EXS" },
3116 { 4*PT_EDA, "4*PT_EDA" },
3117 { 4*PT_USP, "4*PT_USP" },
3118 { 4*PT_PPC, "4*PT_PPC" },
3119 { 4*PT_BP_CTRL, "4*PT_BP_CTRL" },
3120 { 4*PT_BP+4, "4*PT_BP+4" },
3121 { 4*PT_BP+8, "4*PT_BP+8" },
3122 { 4*PT_BP+12, "4*PT_BP+12" },
3123 { 4*PT_BP+16, "4*PT_BP+16" },
3124 { 4*PT_BP+20, "4*PT_BP+20" },
3125 { 4*PT_BP+24, "4*PT_BP+24" },
3126 { 4*PT_BP+28, "4*PT_BP+28" },
3127 { 4*PT_BP+32, "4*PT_BP+32" },
3128 { 4*PT_BP+36, "4*PT_BP+36" },
3129 { 4*PT_BP+40, "4*PT_BP+40" },
3130 { 4*PT_BP+44, "4*PT_BP+44" },
3131 { 4*PT_BP+48, "4*PT_BP+48" },
3132 { 4*PT_BP+52, "4*PT_BP+52" },
3133 { 4*PT_BP+56, "4*PT_BP+56" },
3134# endif
Roland McGrath542c2c62008-05-20 01:11:56 +00003135
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003136# if !defined(SPARC) && !defined(HPPA) && !defined(POWERPC) \
3137 && !defined(ALPHA) && !defined(IA64) \
3138 && !defined(CRISV10) && !defined(CRISV32)
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003139# if !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SPARC64) && !defined(BFIN)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003140 { uoff(u_fpvalid), "offsetof(struct user, u_fpvalid)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003141# endif
3142# if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003143 { uoff(i387), "offsetof(struct user, i387)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003144# endif
3145# if defined(M68K)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003146 { uoff(m68kfp), "offsetof(struct user, m68kfp)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003147# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003148 { uoff(u_tsize), "offsetof(struct user, u_tsize)" },
3149 { uoff(u_dsize), "offsetof(struct user, u_dsize)" },
3150 { uoff(u_ssize), "offsetof(struct user, u_ssize)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003151# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003152 { uoff(start_code), "offsetof(struct user, start_code)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003153# endif
3154# ifdef SH64
Roland McGrathe1e584b2003-06-02 19:18:58 +00003155 { uoff(start_data), "offsetof(struct user, start_data)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003156# endif
3157# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003158 { uoff(start_stack), "offsetof(struct user, start_stack)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003159# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003160 { uoff(signal), "offsetof(struct user, signal)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003161# if !defined(S390) && !defined(S390X) && !defined(MIPS) && !defined(SH) && !defined(SH64) && !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003162 { uoff(reserved), "offsetof(struct user, reserved)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003163# endif
3164# if !defined(SPARC64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003165 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003166# endif
3167# if !defined(ARM) && !defined(MIPS) && !defined(S390) && !defined(S390X) && !defined(SPARC64) && !defined(BFIN)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003168 { uoff(u_fpstate), "offsetof(struct user, u_fpstate)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003169# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003170 { uoff(magic), "offsetof(struct user, magic)" },
3171 { uoff(u_comm), "offsetof(struct user, u_comm)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003172# if defined(I386) || defined(X86_64)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003173 { uoff(u_debugreg), "offsetof(struct user, u_debugreg)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003174# endif
Denys Vlasenkoea0e6e82009-02-25 17:08:40 +00003175# endif /* !defined(many arches) */
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003176
3177# endif /* LINUX */
3178
3179# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003180 { uoff(u_pcb), "offsetof(struct user, u_pcb)" },
3181 { uoff(u_procp), "offsetof(struct user, u_procp)" },
3182 { uoff(u_ar0), "offsetof(struct user, u_ar0)" },
3183 { uoff(u_comm[0]), "offsetof(struct user, u_comm[0])" },
3184 { uoff(u_arg[0]), "offsetof(struct user, u_arg[0])" },
3185 { uoff(u_ap), "offsetof(struct user, u_ap)" },
3186 { uoff(u_qsave), "offsetof(struct user, u_qsave)" },
3187 { uoff(u_rval1), "offsetof(struct user, u_rval1)" },
3188 { uoff(u_rval2), "offsetof(struct user, u_rval2)" },
3189 { uoff(u_error), "offsetof(struct user, u_error)" },
3190 { uoff(u_eosys), "offsetof(struct user, u_eosys)" },
3191 { uoff(u_ssave), "offsetof(struct user, u_ssave)" },
3192 { uoff(u_signal[0]), "offsetof(struct user, u_signal)" },
3193 { uoff(u_sigmask[0]), "offsetof(struct user, u_sigmask)" },
3194 { uoff(u_sigonstack), "offsetof(struct user, u_sigonstack)" },
3195 { uoff(u_sigintr), "offsetof(struct user, u_sigintr)" },
3196 { uoff(u_sigreset), "offsetof(struct user, u_sigreset)" },
3197 { uoff(u_oldmask), "offsetof(struct user, u_oldmask)" },
3198 { uoff(u_code), "offsetof(struct user, u_code)" },
3199 { uoff(u_addr), "offsetof(struct user, u_addr)" },
3200 { uoff(u_sigstack), "offsetof(struct user, u_sigstack)" },
3201 { uoff(u_ofile), "offsetof(struct user, u_ofile)" },
3202 { uoff(u_pofile), "offsetof(struct user, u_pofile)" },
3203 { uoff(u_ofile_arr[0]), "offsetof(struct user, u_ofile_arr[0])" },
3204 { uoff(u_pofile_arr[0]),"offsetof(struct user, u_pofile_arr[0])"},
3205 { uoff(u_lastfile), "offsetof(struct user, u_lastfile)" },
3206 { uoff(u_cwd), "offsetof(struct user, u_cwd)" },
3207 { uoff(u_cdir), "offsetof(struct user, u_cdir)" },
3208 { uoff(u_rdir), "offsetof(struct user, u_rdir)" },
3209 { uoff(u_cmask), "offsetof(struct user, u_cmask)" },
3210 { uoff(u_ru), "offsetof(struct user, u_ru)" },
3211 { uoff(u_cru), "offsetof(struct user, u_cru)" },
3212 { uoff(u_timer[0]), "offsetof(struct user, u_timer[0])" },
3213 { uoff(u_XXX[0]), "offsetof(struct user, u_XXX[0])" },
3214 { uoff(u_ioch), "offsetof(struct user, u_ioch)" },
3215 { uoff(u_start), "offsetof(struct user, u_start)" },
3216 { uoff(u_acflag), "offsetof(struct user, u_acflag)" },
3217 { uoff(u_prof.pr_base), "offsetof(struct user, u_prof.pr_base)" },
3218 { uoff(u_prof.pr_size), "offsetof(struct user, u_prof.pr_size)" },
3219 { uoff(u_prof.pr_off), "offsetof(struct user, u_prof.pr_off)" },
3220 { uoff(u_prof.pr_scale),"offsetof(struct user, u_prof.pr_scale)"},
3221 { uoff(u_rlimit[0]), "offsetof(struct user, u_rlimit)" },
3222 { uoff(u_exdata.Ux_A), "offsetof(struct user, u_exdata.Ux_A)" },
3223 { uoff(u_exdata.ux_shell[0]),"offsetof(struct user, u_exdata.ux_shell[0])"},
3224 { uoff(u_lofault), "offsetof(struct user, u_lofault)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003225# endif /* SUNOS4 */
3226# ifndef HPPA
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003227 { sizeof(struct user), "sizeof(struct user)" },
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003228# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003229 { 0, NULL },
3230};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003231# endif /* !FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003232
3233int
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003234sys_ptrace(struct tcb *tcp)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003235{
Roland McGrathd9f816f2004-09-04 03:39:20 +00003236 const struct xlat *x;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003237 long addr;
3238
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003239 if (entering(tcp)) {
Roland McGrathbf621d42003-01-14 09:46:21 +00003240 printxval(ptrace_cmds, tcp->u_arg[0],
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003241# ifndef FREEBSD
Roland McGrathbf621d42003-01-14 09:46:21 +00003242 "PTRACE_???"
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003243# else
Roland McGrathbf621d42003-01-14 09:46:21 +00003244 "PT_???"
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003245# endif
Roland McGrathbf621d42003-01-14 09:46:21 +00003246 );
3247 tprintf(", %lu, ", tcp->u_arg[1]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003248 addr = tcp->u_arg[2];
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003249# ifndef FREEBSD
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003250 if (tcp->u_arg[0] == PTRACE_PEEKUSER
3251 || tcp->u_arg[0] == PTRACE_POKEUSER) {
3252 for (x = struct_user_offsets; x->str; x++) {
3253 if (x->val >= addr)
3254 break;
3255 }
3256 if (!x->str)
3257 tprintf("%#lx, ", addr);
3258 else if (x->val > addr && x != struct_user_offsets) {
3259 x--;
3260 tprintf("%s + %ld, ", x->str, addr - x->val);
3261 }
3262 else
3263 tprintf("%s, ", x->str);
3264 }
3265 else
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003266# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003267 tprintf("%#lx, ", tcp->u_arg[2]);
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003268# ifdef LINUX
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003269 switch (tcp->u_arg[0]) {
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003270# ifndef IA64
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003271 case PTRACE_PEEKDATA:
3272 case PTRACE_PEEKTEXT:
3273 case PTRACE_PEEKUSER:
3274 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003275# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003276 case PTRACE_CONT:
3277 case PTRACE_SINGLESTEP:
3278 case PTRACE_SYSCALL:
3279 case PTRACE_DETACH:
3280 printsignal(tcp->u_arg[3]);
3281 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003282# ifdef PTRACE_SETOPTIONS
Denys Vlasenkof535b542009-01-13 18:30:55 +00003283 case PTRACE_SETOPTIONS:
3284 printflags(ptrace_setoptions_flags, tcp->u_arg[3], "PTRACE_O_???");
3285 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003286# endif
3287# ifdef PTRACE_SETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003288 case PTRACE_SETSIGINFO: {
3289 siginfo_t si;
3290 if (!tcp->u_arg[3])
3291 tprintf("NULL");
3292 else if (syserror(tcp))
3293 tprintf("%#lx", tcp->u_arg[3]);
3294 else if (umove(tcp, tcp->u_arg[3], &si) < 0)
3295 tprintf("{???}");
3296 else
3297 printsiginfo(&si, verbose(tcp));
3298 break;
3299 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003300# endif
3301# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003302 case PTRACE_GETSIGINFO:
3303 /* Don't print anything, do it at syscall return. */
3304 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003305# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003306 default:
3307 tprintf("%#lx", tcp->u_arg[3]);
3308 break;
3309 }
3310 } else {
3311 switch (tcp->u_arg[0]) {
3312 case PTRACE_PEEKDATA:
3313 case PTRACE_PEEKTEXT:
3314 case PTRACE_PEEKUSER:
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003315# ifdef IA64
Roland McGrath1e868062007-11-19 22:11:45 +00003316 return RVAL_HEX;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003317# else
Roland McGratheb285352003-01-14 09:59:00 +00003318 printnum(tcp, tcp->u_arg[3], "%#lx");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003319 break;
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003320# endif
3321# ifdef PTRACE_GETSIGINFO
Denys Vlasenkof535b542009-01-13 18:30:55 +00003322 case PTRACE_GETSIGINFO: {
3323 siginfo_t si;
3324 if (!tcp->u_arg[3])
3325 tprintf("NULL");
3326 else if (syserror(tcp))
3327 tprintf("%#lx", tcp->u_arg[3]);
3328 else if (umove(tcp, tcp->u_arg[3], &si) < 0)
3329 tprintf("{???}");
3330 else
3331 printsiginfo(&si, verbose(tcp));
3332 break;
3333 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003334# endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003335 }
3336 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003337# endif /* LINUX */
3338# ifdef SUNOS4
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003339 if (tcp->u_arg[0] == PTRACE_WRITEDATA ||
3340 tcp->u_arg[0] == PTRACE_WRITETEXT) {
3341 tprintf("%lu, ", tcp->u_arg[3]);
3342 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3343 } else if (tcp->u_arg[0] != PTRACE_READDATA &&
3344 tcp->u_arg[0] != PTRACE_READTEXT) {
3345 tprintf("%#lx", tcp->u_arg[3]);
3346 }
3347 } else {
3348 if (tcp->u_arg[0] == PTRACE_READDATA ||
3349 tcp->u_arg[0] == PTRACE_READTEXT) {
3350 tprintf("%lu, ", tcp->u_arg[3]);
3351 printstr(tcp, tcp->u_arg[4], tcp->u_arg[3]);
3352 }
3353 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003354# endif /* SUNOS4 */
3355# ifdef FREEBSD
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +00003356 tprintf("%lu", tcp->u_arg[3]);
3357 }
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003358# endif /* FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00003359 return 0;
3360}
3361
3362#endif /* !SVR4 */
Roland McGrath5a223472002-12-15 23:58:26 +00003363
3364#ifdef LINUX
Roland McGrath51942a92007-07-05 18:59:11 +00003365# ifndef FUTEX_CMP_REQUEUE
3366# define FUTEX_CMP_REQUEUE 4
3367# endif
3368# ifndef FUTEX_WAKE_OP
3369# define FUTEX_WAKE_OP 5
3370# endif
3371# ifndef FUTEX_LOCK_PI
3372# define FUTEX_LOCK_PI 6
3373# define FUTEX_UNLOCK_PI 7
3374# define FUTEX_TRYLOCK_PI 8
3375# endif
Roland McGrath1aeaf742008-07-18 01:27:39 +00003376# ifndef FUTEX_WAIT_BITSET
3377# define FUTEX_WAIT_BITSET 9
3378# endif
3379# ifndef FUTEX_WAKE_BITSET
3380# define FUTEX_WAKE_BITSET 10
Roland McGrath51942a92007-07-05 18:59:11 +00003381# endif
3382# ifndef FUTEX_PRIVATE_FLAG
3383# define FUTEX_PRIVATE_FLAG 128
3384# endif
Roland McGrathd9f816f2004-09-04 03:39:20 +00003385static const struct xlat futexops[] = {
Roland McGrath51942a92007-07-05 18:59:11 +00003386 { FUTEX_WAIT, "FUTEX_WAIT" },
3387 { FUTEX_WAKE, "FUTEX_WAKE" },
3388 { FUTEX_FD, "FUTEX_FD" },
3389 { FUTEX_REQUEUE, "FUTEX_REQUEUE" },
3390 { FUTEX_CMP_REQUEUE, "FUTEX_CMP_REQUEUE" },
3391 { FUTEX_WAKE_OP, "FUTEX_WAKE_OP" },
3392 { FUTEX_LOCK_PI, "FUTEX_LOCK_PI" },
3393 { FUTEX_UNLOCK_PI, "FUTEX_UNLOCK_PI" },
3394 { FUTEX_TRYLOCK_PI, "FUTEX_TRYLOCK_PI" },
Roland McGrath1aeaf742008-07-18 01:27:39 +00003395 { FUTEX_WAIT_BITSET, "FUTEX_WAIT_BITSET" },
3396 { FUTEX_WAKE_BITSET, "FUTEX_WAKE_BITSET" },
Roland McGrath51942a92007-07-05 18:59:11 +00003397 { FUTEX_WAIT|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_PRIVATE" },
3398 { FUTEX_WAKE|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_PRIVATE" },
3399 { FUTEX_FD|FUTEX_PRIVATE_FLAG, "FUTEX_FD_PRIVATE" },
3400 { FUTEX_REQUEUE|FUTEX_PRIVATE_FLAG, "FUTEX_REQUEUE_PRIVATE" },
3401 { FUTEX_CMP_REQUEUE|FUTEX_PRIVATE_FLAG, "FUTEX_CMP_REQUEUE_PRIVATE" },
3402 { FUTEX_WAKE_OP|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_OP_PRIVATE" },
3403 { FUTEX_LOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_LOCK_PI_PRIVATE" },
3404 { FUTEX_UNLOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_UNLOCK_PI_PRIVATE" },
3405 { FUTEX_TRYLOCK_PI|FUTEX_PRIVATE_FLAG, "FUTEX_TRYLOCK_PI_PRIVATE" },
Roland McGrath1aeaf742008-07-18 01:27:39 +00003406 { FUTEX_WAIT_BITSET|FUTEX_PRIVATE_FLAG, "FUTEX_WAIT_BITSET_PRIVATE" },
3407 { FUTEX_WAKE_BITSET|FUTEX_PRIVATE_FLAG, "FUTEX_WAKE_BITSET_PRIVATE" },
Roland McGrath51942a92007-07-05 18:59:11 +00003408 { 0, NULL }
3409};
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003410# ifndef FUTEX_OP_SET
3411# define FUTEX_OP_SET 0
3412# define FUTEX_OP_ADD 1
3413# define FUTEX_OP_OR 2
3414# define FUTEX_OP_ANDN 3
3415# define FUTEX_OP_XOR 4
3416# define FUTEX_OP_CMP_EQ 0
3417# define FUTEX_OP_CMP_NE 1
3418# define FUTEX_OP_CMP_LT 2
3419# define FUTEX_OP_CMP_LE 3
3420# define FUTEX_OP_CMP_GT 4
3421# define FUTEX_OP_CMP_GE 5
3422# endif
Roland McGrath51942a92007-07-05 18:59:11 +00003423static const struct xlat futexwakeops[] = {
3424 { FUTEX_OP_SET, "FUTEX_OP_SET" },
3425 { FUTEX_OP_ADD, "FUTEX_OP_ADD" },
3426 { FUTEX_OP_OR, "FUTEX_OP_OR" },
3427 { FUTEX_OP_ANDN, "FUTEX_OP_ANDN" },
3428 { FUTEX_OP_XOR, "FUTEX_OP_XOR" },
3429 { 0, NULL }
3430};
3431static const struct xlat futexwakecmps[] = {
3432 { FUTEX_OP_CMP_EQ, "FUTEX_OP_CMP_EQ" },
3433 { FUTEX_OP_CMP_NE, "FUTEX_OP_CMP_NE" },
3434 { FUTEX_OP_CMP_LT, "FUTEX_OP_CMP_LT" },
3435 { FUTEX_OP_CMP_LE, "FUTEX_OP_CMP_LE" },
3436 { FUTEX_OP_CMP_GT, "FUTEX_OP_CMP_GT" },
3437 { FUTEX_OP_CMP_GE, "FUTEX_OP_CMP_GE" },
3438 { 0, NULL }
Roland McGrath5a223472002-12-15 23:58:26 +00003439};
3440
3441int
3442sys_futex(tcp)
3443struct tcb *tcp;
3444{
3445 if (entering(tcp)) {
Roland McGrath1aeaf742008-07-18 01:27:39 +00003446 long int cmd = tcp->u_arg[1] & 127;
Roland McGrath5a223472002-12-15 23:58:26 +00003447 tprintf("%p, ", (void *) tcp->u_arg[0]);
Roland McGrath88812d62003-06-26 22:27:23 +00003448 printxval(futexops, tcp->u_arg[1], "FUTEX_???");
Roland McGrath8dfa04a2003-03-05 04:07:55 +00003449 tprintf(", %ld", tcp->u_arg[2]);
Roland McGrath1aeaf742008-07-18 01:27:39 +00003450 if (cmd == FUTEX_WAKE_BITSET)
3451 tprintf(", %lx", tcp->u_arg[5]);
3452 else if (cmd == FUTEX_WAIT) {
Roland McGrath8dfa04a2003-03-05 04:07:55 +00003453 tprintf(", ");
3454 printtv(tcp, tcp->u_arg[3]);
Roland McGrath1aeaf742008-07-18 01:27:39 +00003455 } else if (cmd == FUTEX_WAIT_BITSET) {
3456 tprintf(", ");
3457 printtv(tcp, tcp->u_arg[3]);
3458 tprintf(", %lx", tcp->u_arg[5]);
Roland McGrath51942a92007-07-05 18:59:11 +00003459 } else if (cmd == FUTEX_REQUEUE)
Roland McGrath88812d62003-06-26 22:27:23 +00003460 tprintf(", %ld, %p", tcp->u_arg[3], (void *) tcp->u_arg[4]);
Roland McGrath51942a92007-07-05 18:59:11 +00003461 else if (cmd == FUTEX_CMP_REQUEUE)
3462 tprintf(", %ld, %p, %ld", tcp->u_arg[3], (void *) tcp->u_arg[4], tcp->u_arg[5]);
3463 else if (cmd == FUTEX_WAKE_OP) {
3464 tprintf(", %ld, %p, {", tcp->u_arg[3], (void *) tcp->u_arg[4]);
3465 if ((tcp->u_arg[5] >> 28) & 8)
3466 tprintf("FUTEX_OP_OPARG_SHIFT|");
3467 printxval(futexwakeops, (tcp->u_arg[5] >> 28) & 0x7, "FUTEX_OP_???");
3468 tprintf(", %ld, ", (tcp->u_arg[5] >> 12) & 0xfff);
3469 if ((tcp->u_arg[5] >> 24) & 8)
3470 tprintf("FUTEX_OP_OPARG_SHIFT|");
3471 printxval(futexwakecmps, (tcp->u_arg[5] >> 24) & 0x7, "FUTEX_OP_CMP_???");
3472 tprintf(", %ld}", tcp->u_arg[5] & 0xfff);
3473 }
Roland McGrath5a223472002-12-15 23:58:26 +00003474 }
3475 return 0;
3476}
3477
3478static void
Roland McGrath79fbda52004-04-14 02:45:55 +00003479print_affinitylist(tcp, list, len)
3480struct tcb *tcp;
3481long list;
Roland McGrath5a223472002-12-15 23:58:26 +00003482unsigned int len;
3483{
3484 int first = 1;
3485 tprintf(" {");
Roland McGratha2f34962003-05-23 00:14:04 +00003486 while (len >= sizeof (unsigned long)) {
Roland McGrath79fbda52004-04-14 02:45:55 +00003487 unsigned long w;
3488 umove(tcp, list, &w);
3489 tprintf("%s %lx", first ? "" : ",", w);
Roland McGrath5a223472002-12-15 23:58:26 +00003490 first = 0;
3491 len -= sizeof (unsigned long);
Roland McGrath79fbda52004-04-14 02:45:55 +00003492 list += sizeof(unsigned long);
Roland McGrath5a223472002-12-15 23:58:26 +00003493 }
3494 tprintf(" }");
3495}
3496
3497int
3498sys_sched_setaffinity(tcp)
3499struct tcb *tcp;
3500{
3501 if (entering(tcp)) {
3502 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
Roland McGrath79fbda52004-04-14 02:45:55 +00003503 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_arg[1]);
Roland McGrath5a223472002-12-15 23:58:26 +00003504 }
3505 return 0;
3506}
3507
3508int
3509sys_sched_getaffinity(tcp)
3510struct tcb *tcp;
3511{
3512 if (entering(tcp)) {
3513 tprintf("%ld, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
3514 } else {
Roland McGrath79fbda52004-04-14 02:45:55 +00003515 if (tcp->u_rval == -1)
3516 tprintf("%#lx", tcp->u_arg[2]);
3517 else
3518 print_affinitylist(tcp, tcp->u_arg[2], tcp->u_rval);
Roland McGrath5a223472002-12-15 23:58:26 +00003519 }
3520 return 0;
3521}
Roland McGrath279d3782004-03-01 20:27:37 +00003522
Roland McGrathd9f816f2004-09-04 03:39:20 +00003523static const struct xlat schedulers[] = {
Roland McGrath279d3782004-03-01 20:27:37 +00003524 { SCHED_OTHER, "SCHED_OTHER" },
3525 { SCHED_RR, "SCHED_RR" },
3526 { SCHED_FIFO, "SCHED_FIFO" },
3527 { 0, NULL }
3528};
3529
3530int
3531sys_sched_getscheduler(tcp)
3532struct tcb *tcp;
3533{
3534 if (entering(tcp)) {
3535 tprintf("%d", (int) tcp->u_arg[0]);
3536 } else if (! syserror(tcp)) {
3537 tcp->auxstr = xlookup (schedulers, tcp->u_rval);
3538 if (tcp->auxstr != NULL)
3539 return RVAL_STR;
3540 }
3541 return 0;
3542}
3543
3544int
3545sys_sched_setscheduler(tcp)
3546struct tcb *tcp;
3547{
3548 if (entering(tcp)) {
3549 struct sched_param p;
3550 tprintf("%d, ", (int) tcp->u_arg[0]);
3551 printxval(schedulers, tcp->u_arg[1], "SCHED_???");
3552 if (umove(tcp, tcp->u_arg[2], &p) < 0)
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003553 tprintf(", %#lx", tcp->u_arg[2]);
Roland McGrath279d3782004-03-01 20:27:37 +00003554 else
3555 tprintf(", { %d }", p.__sched_priority);
3556 }
3557 return 0;
3558}
3559
3560int
3561sys_sched_getparam(tcp)
3562struct tcb *tcp;
3563{
3564 if (entering(tcp)) {
3565 tprintf("%d, ", (int) tcp->u_arg[0]);
3566 } else {
3567 struct sched_param p;
3568 if (umove(tcp, tcp->u_arg[1], &p) < 0)
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003569 tprintf("%#lx", tcp->u_arg[1]);
Roland McGrath279d3782004-03-01 20:27:37 +00003570 else
3571 tprintf("{ %d }", p.__sched_priority);
3572 }
3573 return 0;
3574}
3575
3576int
3577sys_sched_setparam(tcp)
3578struct tcb *tcp;
3579{
3580 if (entering(tcp)) {
3581 struct sched_param p;
3582 if (umove(tcp, tcp->u_arg[1], &p) < 0)
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003583 tprintf("%d, %#lx", (int) tcp->u_arg[0], tcp->u_arg[1]);
Roland McGrath279d3782004-03-01 20:27:37 +00003584 else
3585 tprintf("%d, { %d }", (int) tcp->u_arg[0], p.__sched_priority);
3586 }
3587 return 0;
3588}
3589
3590int
3591sys_sched_get_priority_min(tcp)
3592struct tcb *tcp;
3593{
3594 if (entering(tcp)) {
3595 printxval(schedulers, tcp->u_arg[0], "SCHED_???");
3596 }
3597 return 0;
3598}
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003599
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003600# ifdef X86_64
3601# include <asm/prctl.h>
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003602
3603static const struct xlat archvals[] = {
3604 { ARCH_SET_GS, "ARCH_SET_GS" },
3605 { ARCH_SET_FS, "ARCH_SET_FS" },
3606 { ARCH_GET_FS, "ARCH_GET_FS" },
3607 { ARCH_GET_GS, "ARCH_GET_GS" },
3608 { 0, NULL },
3609};
3610
3611int
3612sys_arch_prctl(tcp)
3613struct tcb *tcp;
3614{
3615 if (entering(tcp)) {
3616 printxval(archvals, tcp->u_arg[0], "ARCH_???");
3617 if (tcp->u_arg[0] == ARCH_SET_GS
3618 || tcp->u_arg[0] == ARCH_SET_FS)
3619 tprintf(", %#lx", tcp->u_arg[1]);
3620 } else {
3621 if (tcp->u_arg[0] == ARCH_GET_GS
3622 || tcp->u_arg[0] == ARCH_GET_FS) {
3623 long int v;
3624 if (!syserror(tcp) && umove(tcp, tcp->u_arg[1], &v) != -1)
3625 tprintf(", [%#lx]", v);
3626 else
3627 tprintf(", %#lx", tcp->u_arg[1]);
3628 }
3629 }
3630 return 0;
3631}
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003632# endif /* X86_64 */
Roland McGrathc2d5eb02005-02-02 04:16:56 +00003633
Roland McGrathdb8319f2007-08-02 01:37:55 +00003634
3635int
3636sys_getcpu(tcp)
3637struct tcb *tcp;
3638{
3639 if (exiting(tcp)) {
3640 unsigned u;
3641 if (tcp->u_arg[0] == 0)
3642 tprintf("NULL, ");
3643 else if (umove(tcp, tcp->u_arg[0], &u) < 0)
3644 tprintf("%#lx, ", tcp->u_arg[0]);
3645 else
3646 tprintf("[%u], ", u);
3647 if (tcp->u_arg[1] == 0)
3648 tprintf("NULL, ");
3649 else if (umove(tcp, tcp->u_arg[1], &u) < 0)
3650 tprintf("%#lx, ", tcp->u_arg[1]);
3651 else
3652 tprintf("[%u], ", u);
3653 tprintf("%#lx", tcp->u_arg[2]);
3654 }
3655 return 0;
3656}
3657
Denys Vlasenkoc7e83712009-02-24 12:59:47 +00003658#endif /* LINUX */