]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/linux-record.c
Re-factor (i386|amd64)mpx target descriptions.
[thirdparty/binutils-gdb.git] / gdb / linux-record.c
CommitLineData
b7f6bf22
HZ
1/* Process record and replay target code for GNU/Linux.
2
618f726f 3 Copyright (C) 2008-2016 Free Software Foundation, Inc.
b7f6bf22
HZ
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19
20#include "defs.h"
21#include "target.h"
2c543fc4 22#include "gdbtypes.h"
b7f6bf22
HZ
23#include "regcache.h"
24#include "record.h"
d02ed0bb 25#include "record-full.h"
b7f6bf22
HZ
26#include "linux-record.h"
27
28/* These macros are the values of the first argument of system call
29 "sys_ptrace". The values of these macros were obtained from Linux
30 Kernel source. */
31
32#define RECORD_PTRACE_PEEKTEXT 1
33#define RECORD_PTRACE_PEEKDATA 2
34#define RECORD_PTRACE_PEEKUSR 3
35
36/* These macros are the values of the first argument of system call
37 "sys_socketcall". The values of these macros were obtained from
38 Linux Kernel source. */
39
40#define RECORD_SYS_SOCKET 1
41#define RECORD_SYS_BIND 2
42#define RECORD_SYS_CONNECT 3
43#define RECORD_SYS_LISTEN 4
44#define RECORD_SYS_ACCEPT 5
45#define RECORD_SYS_GETSOCKNAME 6
46#define RECORD_SYS_GETPEERNAME 7
47#define RECORD_SYS_SOCKETPAIR 8
48#define RECORD_SYS_SEND 9
49#define RECORD_SYS_RECV 10
50#define RECORD_SYS_SENDTO 11
51#define RECORD_SYS_RECVFROM 12
52#define RECORD_SYS_SHUTDOWN 13
53#define RECORD_SYS_SETSOCKOPT 14
54#define RECORD_SYS_GETSOCKOPT 15
55#define RECORD_SYS_SENDMSG 16
56#define RECORD_SYS_RECVMSG 17
57
58/* These macros are the values of the first argument of system call
59 "sys_ipc". The values of these macros were obtained from Linux
60 Kernel source. */
61
62#define RECORD_SEMOP 1
63#define RECORD_SEMGET 2
64#define RECORD_SEMCTL 3
65#define RECORD_SEMTIMEDOP 4
66#define RECORD_MSGSND 11
67#define RECORD_MSGRCV 12
68#define RECORD_MSGGET 13
69#define RECORD_MSGCTL 14
70#define RECORD_SHMAT 21
71#define RECORD_SHMDT 22
72#define RECORD_SHMGET 23
73#define RECORD_SHMCTL 24
74
75/* These macros are the values of the first argument of system call
76 "sys_quotactl". The values of these macros were obtained from Linux
77 Kernel source. */
78
79#define RECORD_Q_GETFMT 0x800004
80#define RECORD_Q_GETINFO 0x800005
81#define RECORD_Q_GETQUOTA 0x800007
82#define RECORD_Q_XGETQSTAT (('5' << 8) + 5)
83#define RECORD_Q_XGETQUOTA (('3' << 8) + 3)
84
2c543fc4
HZ
85#define OUTPUT_REG(val, num) phex_nz ((val), \
86 TYPE_LENGTH (gdbarch_register_type (get_regcache_arch (regcache), (num))))
87
5fd0888a
AA
88/* Record a memory area of length LEN pointed to by register
89 REGNUM. */
90
91static int
92record_mem_at_reg (struct regcache *regcache, int regnum, int len)
93{
94 ULONGEST addr;
95
96 regcache_raw_read_unsigned (regcache, regnum, &addr);
97 return record_full_arch_list_add_mem ((CORE_ADDR) addr, len);
98}
99
2c543fc4
HZ
100static int
101record_linux_sockaddr (struct regcache *regcache,
0fc8f115
AA
102 struct linux_record_tdep *tdep, ULONGEST addr,
103 ULONGEST len)
2c543fc4
HZ
104{
105 gdb_byte *a;
106 int addrlen;
107 struct gdbarch *gdbarch = get_regcache_arch (regcache);
108 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
109
110 if (!addr)
111 return 0;
112
224c3ddb 113 a = (gdb_byte *) alloca (tdep->size_int);
2c543fc4 114
25ea693b 115 if (record_full_arch_list_add_mem ((CORE_ADDR) len, tdep->size_int))
2c543fc4
HZ
116 return -1;
117
118 /* Get the addrlen. */
119 if (target_read_memory ((CORE_ADDR) len, a, tdep->size_int))
120 {
121 if (record_debug)
0fc8f115
AA
122 fprintf_unfiltered (gdb_stdlog,
123 "Process record: error reading "
124 "memory at addr = 0x%s len = %d.\n",
125 phex_nz (len, tdep->size_pointer),
126 tdep->size_int);
a579cd9a 127 return -1;
2c543fc4
HZ
128 }
129 addrlen = (int) extract_unsigned_integer (a, tdep->size_int, byte_order);
130 if (addrlen <= 0 || addrlen > tdep->size_sockaddr)
131 addrlen = tdep->size_sockaddr;
132
25ea693b 133 if (record_full_arch_list_add_mem ((CORE_ADDR) addr, addrlen))
2c543fc4
HZ
134 return -1;
135
136 return 0;
137}
138
139static int
140record_linux_msghdr (struct regcache *regcache,
0fc8f115 141 struct linux_record_tdep *tdep, ULONGEST addr)
2c543fc4
HZ
142{
143 gdb_byte *a;
144 struct gdbarch *gdbarch = get_regcache_arch (regcache);
145 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
146 CORE_ADDR tmpaddr;
147 int tmpint;
148
149 if (!addr)
150 return 0;
151
25ea693b 152 if (record_full_arch_list_add_mem ((CORE_ADDR) addr, tdep->size_msghdr))
2c543fc4
HZ
153 return -1;
154
224c3ddb 155 a = (gdb_byte *) alloca (tdep->size_msghdr);
2c543fc4
HZ
156 if (target_read_memory ((CORE_ADDR) addr, a, tdep->size_msghdr))
157 {
158 if (record_debug)
0fc8f115
AA
159 fprintf_unfiltered (gdb_stdlog,
160 "Process record: error reading "
161 "memory at addr = 0x%s "
162 "len = %d.\n",
163 phex_nz (addr, tdep->size_pointer),
164 tdep->size_msghdr);
a579cd9a 165 return -1;
2c543fc4
HZ
166 }
167
168 /* msg_name msg_namelen */
169 addr = extract_unsigned_integer (a, tdep->size_pointer, byte_order);
170 a += tdep->size_pointer;
25ea693b
MM
171 if (record_full_arch_list_add_mem
172 ((CORE_ADDR) addr,
173 (int) extract_unsigned_integer (a,
174 tdep->size_int,
175 byte_order)))
2c543fc4 176 return -1;
933c5a62
MK
177 /* We have read an int, but skip size_pointer bytes to account for alignment
178 of the next field on 64-bit targets. */
179 a += tdep->size_pointer;
2c543fc4
HZ
180
181 /* msg_iov msg_iovlen */
182 addr = extract_unsigned_integer (a, tdep->size_pointer, byte_order);
183 a += tdep->size_pointer;
184 if (addr)
185 {
186 ULONGEST i;
187 ULONGEST len = extract_unsigned_integer (a, tdep->size_size_t,
0fc8f115 188 byte_order);
224c3ddb 189 gdb_byte *iov = (gdb_byte *) alloca (tdep->size_iovec);
2c543fc4
HZ
190
191 for (i = 0; i < len; i++)
0fc8f115
AA
192 {
193 if (target_read_memory ((CORE_ADDR) addr, iov, tdep->size_iovec))
194 {
195 if (record_debug)
196 fprintf_unfiltered (gdb_stdlog,
197 "Process record: error "
198 "reading memory at "
199 "addr = 0x%s "
200 "len = %d.\n",
201 phex_nz (addr,tdep->size_pointer),
202 tdep->size_iovec);
203 return -1;
204 }
205 tmpaddr = (CORE_ADDR) extract_unsigned_integer (iov,
206 tdep->size_pointer,
207 byte_order);
208 tmpint = (int) extract_unsigned_integer (iov + tdep->size_pointer,
209 tdep->size_size_t,
210 byte_order);
211 if (record_full_arch_list_add_mem (tmpaddr, tmpint))
212 return -1;
213 addr += tdep->size_iovec;
214 }
2c543fc4
HZ
215 }
216 a += tdep->size_size_t;
217
218 /* msg_control msg_controllen */
219 addr = extract_unsigned_integer (a, tdep->size_pointer, byte_order);
220 a += tdep->size_pointer;
221 tmpint = (int) extract_unsigned_integer (a, tdep->size_size_t, byte_order);
25ea693b 222 if (record_full_arch_list_add_mem ((CORE_ADDR) addr, tmpint))
2c543fc4
HZ
223 return -1;
224
225 return 0;
226}
227
b7f6bf22
HZ
228/* When the architecture process record get a Linux syscall
229 instruction, it will get a Linux syscall number of this
230 architecture and convert it to the Linux syscall number "num" which
231 is internal to GDB. Most Linux syscalls across architectures in
232 Linux would be similar and mostly differ by sizes of types and
233 structures. This sizes are put to "tdep".
234
235 Record the values of the registers and memory that will be changed
236 in current system call.
237
238 Return -1 if something wrong. */
239
240int
0fc8f115 241record_linux_system_call (enum gdb_syscall syscall,
13b6d1d4 242 struct regcache *regcache,
0fc8f115 243 struct linux_record_tdep *tdep)
b7f6bf22 244{
5af949e3 245 struct gdbarch *gdbarch = get_regcache_arch (regcache);
2c543fc4
HZ
246 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
247 ULONGEST tmpulongest;
248 CORE_ADDR tmpaddr;
249 int tmpint;
b7f6bf22 250
13b6d1d4 251 switch (syscall)
b7f6bf22 252 {
13b6d1d4 253 case gdb_sys_restart_syscall:
b7f6bf22
HZ
254 break;
255
13b6d1d4 256 case gdb_sys_exit:
651ce16a
PA
257 if (yquery (_("The next instruction is syscall exit. "
258 "It will make the program exit. "
259 "Do you want to stop the program?")))
260 return 1;
b7f6bf22
HZ
261 break;
262
13b6d1d4 263 case gdb_sys_fork:
b7f6bf22
HZ
264 break;
265
13b6d1d4 266 case gdb_sys_read:
5fd0888a
AA
267 regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest);
268 if (record_mem_at_reg (regcache, tdep->arg2, (int) tmpulongest))
269 return -1;
b7f6bf22
HZ
270 break;
271
13b6d1d4
MS
272 case gdb_sys_write:
273 case gdb_sys_open:
274 case gdb_sys_close:
b80d067f
MK
275 break;
276
13b6d1d4 277 case gdb_sys_waitpid:
b80d067f
MK
278 regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
279 if (tmpulongest)
0fc8f115 280 if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
b80d067f 281 tdep->size_int))
0fc8f115 282 return -1;
b80d067f
MK
283 break;
284
13b6d1d4
MS
285 case gdb_sys_creat:
286 case gdb_sys_link:
287 case gdb_sys_unlink:
288 case gdb_sys_execve:
289 case gdb_sys_chdir:
b80d067f
MK
290 break;
291
13b6d1d4 292 case gdb_sys_time:
b80d067f
MK
293 regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
294 if (tmpulongest)
0fc8f115 295 if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
b80d067f 296 tdep->size_time_t))
0fc8f115 297 return -1;
b80d067f
MK
298 break;
299
13b6d1d4
MS
300 case gdb_sys_mknod:
301 case gdb_sys_chmod:
302 case gdb_sys_lchown16:
303 case gdb_sys_ni_syscall17:
304 break;
305
306 case gdb_sys_stat:
307 case gdb_sys_fstat:
308 case gdb_sys_lstat:
5fd0888a
AA
309 if (record_mem_at_reg (regcache, tdep->arg2,
310 tdep->size__old_kernel_stat))
0fc8f115 311 return -1;
b7f6bf22
HZ
312 break;
313
13b6d1d4
MS
314 case gdb_sys_lseek:
315 case gdb_sys_getpid:
316 case gdb_sys_mount:
317 case gdb_sys_oldumount:
318 case gdb_sys_setuid16:
319 case gdb_sys_getuid16:
320 case gdb_sys_stime:
b7f6bf22
HZ
321 break;
322
13b6d1d4 323 case gdb_sys_ptrace:
2c543fc4
HZ
324 regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
325 if (tmpulongest == RECORD_PTRACE_PEEKTEXT
0fc8f115
AA
326 || tmpulongest == RECORD_PTRACE_PEEKDATA
327 || tmpulongest == RECORD_PTRACE_PEEKUSR)
328 {
5fd0888a 329 if (record_mem_at_reg (regcache, tdep->arg4, 4))
0fc8f115
AA
330 return -1;
331 }
b7f6bf22
HZ
332 break;
333
13b6d1d4
MS
334 case gdb_sys_alarm:
335 case gdb_sys_pause:
336 case gdb_sys_utime:
337 case gdb_sys_ni_syscall31:
338 case gdb_sys_ni_syscall32:
339 case gdb_sys_access:
340 case gdb_sys_nice:
341 case gdb_sys_ni_syscall35:
342 case gdb_sys_sync:
343 case gdb_sys_kill:
344 case gdb_sys_rename:
345 case gdb_sys_mkdir:
346 case gdb_sys_rmdir:
347 case gdb_sys_dup:
b80d067f
MK
348 break;
349
13b6d1d4 350 case gdb_sys_pipe:
5fd0888a 351 if (record_mem_at_reg (regcache, tdep->arg1, tdep->size_int * 2))
0fc8f115 352 return -1;
13b6d1d4
MS
353 break;
354
355 case gdb_sys_times:
5fd0888a 356 if (record_mem_at_reg (regcache, tdep->arg1, tdep->size_tms))
0fc8f115 357 return -1;
b7f6bf22
HZ
358 break;
359
13b6d1d4
MS
360 case gdb_sys_ni_syscall44:
361 case gdb_sys_brk:
362 case gdb_sys_setgid16:
363 case gdb_sys_getgid16:
364 case gdb_sys_signal:
365 case gdb_sys_geteuid16:
366 case gdb_sys_getegid16:
367 case gdb_sys_acct:
368 case gdb_sys_umount:
369 case gdb_sys_ni_syscall53:
370 break;
371
372 case gdb_sys_ioctl:
b7f6bf22 373 /* XXX Need to add a lot of support of other ioctl requests. */
2c543fc4
HZ
374 regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
375 if (tmpulongest == tdep->ioctl_FIOCLEX
0fc8f115
AA
376 || tmpulongest == tdep->ioctl_FIONCLEX
377 || tmpulongest == tdep->ioctl_FIONBIO
378 || tmpulongest == tdep->ioctl_FIOASYNC
379 || tmpulongest == tdep->ioctl_TCSETS
380 || tmpulongest == tdep->ioctl_TCSETSW
381 || tmpulongest == tdep->ioctl_TCSETSF
382 || tmpulongest == tdep->ioctl_TCSETA
383 || tmpulongest == tdep->ioctl_TCSETAW
384 || tmpulongest == tdep->ioctl_TCSETAF
385 || tmpulongest == tdep->ioctl_TCSBRK
386 || tmpulongest == tdep->ioctl_TCXONC
387 || tmpulongest == tdep->ioctl_TCFLSH
388 || tmpulongest == tdep->ioctl_TIOCEXCL
389 || tmpulongest == tdep->ioctl_TIOCNXCL
390 || tmpulongest == tdep->ioctl_TIOCSCTTY
391 || tmpulongest == tdep->ioctl_TIOCSPGRP
392 || tmpulongest == tdep->ioctl_TIOCSTI
393 || tmpulongest == tdep->ioctl_TIOCSWINSZ
394 || tmpulongest == tdep->ioctl_TIOCMBIS
395 || tmpulongest == tdep->ioctl_TIOCMBIC
396 || tmpulongest == tdep->ioctl_TIOCMSET
397 || tmpulongest == tdep->ioctl_TIOCSSOFTCAR
398 || tmpulongest == tdep->ioctl_TIOCCONS
399 || tmpulongest == tdep->ioctl_TIOCSSERIAL
400 || tmpulongest == tdep->ioctl_TIOCPKT
401 || tmpulongest == tdep->ioctl_TIOCNOTTY
402 || tmpulongest == tdep->ioctl_TIOCSETD
403 || tmpulongest == tdep->ioctl_TCSBRKP
404 || tmpulongest == tdep->ioctl_TIOCTTYGSTRUCT
405 || tmpulongest == tdep->ioctl_TIOCSBRK
406 || tmpulongest == tdep->ioctl_TIOCCBRK
407 || tmpulongest == tdep->ioctl_TCSETS2
408 || tmpulongest == tdep->ioctl_TCSETSW2
409 || tmpulongest == tdep->ioctl_TCSETSF2
410 || tmpulongest == tdep->ioctl_TIOCSPTLCK
411 || tmpulongest == tdep->ioctl_TIOCSERCONFIG
412 || tmpulongest == tdep->ioctl_TIOCSERGWILD
413 || tmpulongest == tdep->ioctl_TIOCSERSWILD
414 || tmpulongest == tdep->ioctl_TIOCSLCKTRMIOS
415 || tmpulongest == tdep->ioctl_TIOCSERGETMULTI
416 || tmpulongest == tdep->ioctl_TIOCSERSETMULTI
417 || tmpulongest == tdep->ioctl_TIOCMIWAIT
418 || tmpulongest == tdep->ioctl_TIOCSHAYESESP)
419 {
420 /* Nothing to do. */
421 }
2c543fc4 422 else if (tmpulongest == tdep->ioctl_TCGETS
0fc8f115
AA
423 || tmpulongest == tdep->ioctl_TCGETA
424 || tmpulongest == tdep->ioctl_TIOCGLCKTRMIOS)
425 {
5fd0888a
AA
426 if (record_mem_at_reg (regcache, tdep->arg3,
427 tdep->size_termios))
0fc8f115
AA
428 return -1;
429 }
2c543fc4 430 else if (tmpulongest == tdep->ioctl_TIOCGPGRP
0fc8f115
AA
431 || tmpulongest == tdep->ioctl_TIOCGSID)
432 {
5fd0888a 433 if (record_mem_at_reg (regcache, tdep->arg3, tdep->size_pid_t))
0fc8f115
AA
434 return -1;
435 }
2c543fc4 436 else if (tmpulongest == tdep->ioctl_TIOCOUTQ
0fc8f115
AA
437 || tmpulongest == tdep->ioctl_TIOCMGET
438 || tmpulongest == tdep->ioctl_TIOCGSOFTCAR
439 || tmpulongest == tdep->ioctl_FIONREAD
440 || tmpulongest == tdep->ioctl_TIOCINQ
441 || tmpulongest == tdep->ioctl_TIOCGETD
442 || tmpulongest == tdep->ioctl_TIOCGPTN
443 || tmpulongest == tdep->ioctl_TIOCSERGETLSR)
444 {
5fd0888a 445 if (record_mem_at_reg (regcache, tdep->arg3, tdep->size_int))
0fc8f115
AA
446 return -1;
447 }
2c543fc4 448 else if (tmpulongest == tdep->ioctl_TIOCGWINSZ)
0fc8f115 449 {
5fd0888a
AA
450 if (record_mem_at_reg (regcache, tdep->arg3,
451 tdep->size_winsize))
0fc8f115
AA
452 return -1;
453 }
2c543fc4 454 else if (tmpulongest == tdep->ioctl_TIOCLINUX)
0fc8f115 455 {
13b6d1d4 456 /* This syscall affects a char-size memory. */
5fd0888a 457 if (record_mem_at_reg (regcache, tdep->arg3, 1))
0fc8f115
AA
458 return -1;
459 }
2c543fc4 460 else if (tmpulongest == tdep->ioctl_TIOCGSERIAL)
0fc8f115 461 {
5fd0888a
AA
462 if (record_mem_at_reg (regcache, tdep->arg3,
463 tdep->size_serial_struct))
0fc8f115
AA
464 return -1;
465 }
2c543fc4 466 else if (tmpulongest == tdep->ioctl_TCGETS2)
0fc8f115 467 {
5fd0888a
AA
468 if (record_mem_at_reg (regcache, tdep->arg3,
469 tdep->size_termios2))
0fc8f115
AA
470 return -1;
471 }
2c543fc4 472 else if (tmpulongest == tdep->ioctl_FIOQSIZE)
0fc8f115 473 {
5fd0888a 474 if (record_mem_at_reg (regcache, tdep->arg3, tdep->size_loff_t))
0fc8f115
AA
475 return -1;
476 }
2c543fc4 477 else if (tmpulongest == tdep->ioctl_TIOCGICOUNT)
0fc8f115 478 {
5fd0888a
AA
479 if (record_mem_at_reg (regcache, tdep->arg3,
480 tdep->size_serial_icounter_struct))
0fc8f115
AA
481 return -1;
482 }
2c543fc4 483 else if (tmpulongest == tdep->ioctl_TIOCGHAYESESP)
0fc8f115 484 {
5fd0888a
AA
485 if (record_mem_at_reg (regcache, tdep->arg3,
486 tdep->size_hayes_esp_config))
0fc8f115
AA
487 return -1;
488 }
2c543fc4 489 else if (tmpulongest == tdep->ioctl_TIOCSERGSTRUCT)
0fc8f115
AA
490 {
491 printf_unfiltered (_("Process record and replay target doesn't "
492 "support ioctl request TIOCSERGSTRUCT\n"));
493 return 1;
494 }
b7f6bf22 495 else
0fc8f115
AA
496 {
497 printf_unfiltered (_("Process record and replay target doesn't "
498 "support ioctl request 0x%s.\n"),
499 OUTPUT_REG (tmpulongest, tdep->arg2));
500 return 1;
501 }
b7f6bf22
HZ
502 break;
503
13b6d1d4 504 case gdb_sys_fcntl:
b7f6bf22 505 /* XXX */
2c543fc4 506 regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
b7f6bf22 507 sys_fcntl:
2c543fc4 508 if (tmpulongest == tdep->fcntl_F_GETLK)
0fc8f115 509 {
5fd0888a 510 if (record_mem_at_reg (regcache, tdep->arg3, tdep->size_flock))
0fc8f115
AA
511 return -1;
512 }
b7f6bf22
HZ
513 break;
514
13b6d1d4
MS
515 case gdb_sys_ni_syscall56:
516 case gdb_sys_setpgid:
517 case gdb_sys_ni_syscall58:
b7f6bf22
HZ
518 break;
519
13b6d1d4 520 case gdb_sys_olduname:
5fd0888a
AA
521 if (record_mem_at_reg (regcache, tdep->arg1,
522 tdep->size_oldold_utsname))
0fc8f115 523 return -1;
b7f6bf22
HZ
524 break;
525
13b6d1d4
MS
526 case gdb_sys_umask:
527 case gdb_sys_chroot:
b7f6bf22
HZ
528 break;
529
13b6d1d4 530 case gdb_sys_ustat:
5fd0888a 531 if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_ustat))
0fc8f115 532 return -1;
b7f6bf22
HZ
533 break;
534
13b6d1d4
MS
535 case gdb_sys_dup2:
536 case gdb_sys_getppid:
537 case gdb_sys_getpgrp:
538 case gdb_sys_setsid:
b7f6bf22
HZ
539 break;
540
13b6d1d4 541 case gdb_sys_sigaction:
5fd0888a
AA
542 if (record_mem_at_reg (regcache, tdep->arg3,
543 tdep->size_old_sigaction))
0fc8f115 544 return -1;
b7f6bf22
HZ
545 break;
546
13b6d1d4
MS
547 case gdb_sys_sgetmask:
548 case gdb_sys_ssetmask:
549 case gdb_sys_setreuid16:
550 case gdb_sys_setregid16:
551 case gdb_sys_sigsuspend:
b7f6bf22
HZ
552 break;
553
13b6d1d4 554 case gdb_sys_sigpending:
5fd0888a
AA
555 if (record_mem_at_reg (regcache, tdep->arg1,
556 tdep->size_old_sigset_t))
0fc8f115 557 return -1;
b7f6bf22
HZ
558 break;
559
13b6d1d4
MS
560 case gdb_sys_sethostname:
561 case gdb_sys_setrlimit:
b7f6bf22
HZ
562 break;
563
13b6d1d4 564 case gdb_sys_old_getrlimit:
5fd0888a 565 if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_rlimit))
0fc8f115 566 return -1;
b7f6bf22
HZ
567 break;
568
13b6d1d4 569 case gdb_sys_getrusage:
5fd0888a 570 if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_rusage))
0fc8f115 571 return -1;
b7f6bf22
HZ
572 break;
573
13b6d1d4 574 case gdb_sys_gettimeofday:
5fd0888a
AA
575 if (record_mem_at_reg (regcache, tdep->arg1, tdep->size_timeval)
576 || record_mem_at_reg (regcache, tdep->arg2, tdep->size_timezone))
0fc8f115 577 return -1;
b7f6bf22
HZ
578 break;
579
13b6d1d4 580 case gdb_sys_settimeofday:
b7f6bf22
HZ
581 break;
582
13b6d1d4 583 case gdb_sys_getgroups16:
2c543fc4 584 regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
cb658d21 585 if (tmpulongest)
0fc8f115
AA
586 {
587 ULONGEST gidsetsize;
cb658d21 588
0fc8f115
AA
589 regcache_raw_read_unsigned (regcache, tdep->arg1,
590 &gidsetsize);
591 tmpint = tdep->size_old_gid_t * (int) gidsetsize;
592 if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest, tmpint))
593 return -1;
594 }
b7f6bf22
HZ
595 break;
596
13b6d1d4 597 case gdb_sys_setgroups16:
b7f6bf22
HZ
598 break;
599
13b6d1d4 600 case gdb_old_select:
b7f6bf22 601 {
0fc8f115
AA
602 unsigned long sz_sel_arg = tdep->size_long + tdep->size_pointer * 4;
603 gdb_byte *a = (gdb_byte *) alloca (sz_sel_arg);
604 CORE_ADDR inp, outp, exp, tvp;
605
606 regcache_raw_read_unsigned (regcache, tdep->arg1,
607 &tmpulongest);
608 if (tmpulongest)
609 {
610 if (target_read_memory (tmpulongest, a, sz_sel_arg))
611 {
612 if (record_debug)
613 fprintf_unfiltered (gdb_stdlog,
614 "Process record: error reading memory "
615 "at addr = 0x%s len = %lu.\n",
616 OUTPUT_REG (tmpulongest, tdep->arg1),
617 sz_sel_arg);
618 return -1;
619 }
620 /* Skip n. */
621 a += tdep->size_long;
622 inp = extract_unsigned_integer (a, tdep->size_pointer, byte_order);
623 a += tdep->size_pointer;
624 outp = extract_unsigned_integer (a, tdep->size_pointer, byte_order);
625 a += tdep->size_pointer;
626 exp = extract_unsigned_integer (a, tdep->size_pointer, byte_order);
627 a += tdep->size_pointer;
628 tvp = extract_unsigned_integer (a, tdep->size_pointer, byte_order);
629 if (inp)
630 if (record_full_arch_list_add_mem (inp, tdep->size_fd_set))
631 return -1;
632 if (outp)
633 if (record_full_arch_list_add_mem (outp, tdep->size_fd_set))
634 return -1;
635 if (exp)
636 if (record_full_arch_list_add_mem (exp, tdep->size_fd_set))
637 return -1;
638 if (tvp)
639 if (record_full_arch_list_add_mem (tvp, tdep->size_timeval))
640 return -1;
641 }
b7f6bf22
HZ
642 }
643 break;
644
13b6d1d4 645 case gdb_sys_symlink:
b7f6bf22
HZ
646 break;
647
13b6d1d4 648 case gdb_sys_readlink:
5fd0888a
AA
649 regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest);
650 if (record_mem_at_reg (regcache, tdep->arg2, (int) tmpulongest))
651 return -1;
b7f6bf22
HZ
652 break;
653
13b6d1d4
MS
654 case gdb_sys_uselib:
655 case gdb_sys_swapon:
b7f6bf22
HZ
656 break;
657
13b6d1d4 658 case gdb_sys_reboot:
651ce16a
PA
659 if (yquery (_("The next instruction is syscall reboot. "
660 "It will restart the computer. "
661 "Do you want to stop the program?")))
662 return 1;
b7f6bf22
HZ
663 break;
664
13b6d1d4 665 case gdb_old_readdir:
5fd0888a 666 if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_old_dirent))
0fc8f115 667 return -1;
b7f6bf22
HZ
668 break;
669
13b6d1d4 670 case gdb_old_mmap:
b7f6bf22
HZ
671 break;
672
13b6d1d4 673 case gdb_sys_munmap:
b7f6bf22 674 {
0fc8f115 675 ULONGEST len;
2c543fc4 676
0fc8f115
AA
677 regcache_raw_read_unsigned (regcache, tdep->arg1,
678 &tmpulongest);
679 regcache_raw_read_unsigned (regcache, tdep->arg2, &len);
680 if (record_full_memory_query)
681 {
651ce16a 682 if (yquery (_("\
bb08c432
HZ
683The next instruction is syscall munmap.\n\
684It will free the memory addr = 0x%s len = %u.\n\
685It will make record target cannot record some memory change.\n\
686Do you want to stop the program?"),
651ce16a 687 OUTPUT_REG (tmpulongest, tdep->arg1), (int) len))
0fc8f115
AA
688 return 1;
689 }
b7f6bf22
HZ
690 }
691 break;
692
13b6d1d4
MS
693 case gdb_sys_truncate:
694 case gdb_sys_ftruncate:
695 case gdb_sys_fchmod:
696 case gdb_sys_fchown16:
697 case gdb_sys_getpriority:
698 case gdb_sys_setpriority:
699 case gdb_sys_ni_syscall98:
700 break;
701
702 case gdb_sys_statfs:
703 case gdb_sys_fstatfs:
5fd0888a 704 if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_statfs))
0fc8f115 705 return -1;
b7f6bf22
HZ
706 break;
707
13b6d1d4 708 case gdb_sys_ioperm:
b7f6bf22
HZ
709 break;
710
13b6d1d4
MS
711 case gdb_sys_socket:
712 case gdb_sys_sendto:
713 case gdb_sys_sendmsg:
714 case gdb_sys_shutdown:
715 case gdb_sys_bind:
716 case gdb_sys_connect:
717 case gdb_sys_listen:
718 case gdb_sys_setsockopt:
2c543fc4
HZ
719 break;
720
13b6d1d4
MS
721 case gdb_sys_accept:
722 case gdb_sys_getsockname:
723 case gdb_sys_getpeername:
2c543fc4 724 {
0fc8f115 725 ULONGEST len;
e0881a8e 726
0fc8f115
AA
727 regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
728 regcache_raw_read_unsigned (regcache, tdep->arg3, &len);
729 if (record_linux_sockaddr (regcache, tdep, tmpulongest, len))
730 return -1;
2c543fc4
HZ
731 }
732 break;
733
13b6d1d4 734 case gdb_sys_recvfrom:
2c543fc4 735 {
0fc8f115 736 ULONGEST len;
e0881a8e 737
0fc8f115
AA
738 regcache_raw_read_unsigned (regcache, tdep->arg4, &tmpulongest);
739 regcache_raw_read_unsigned (regcache, tdep->arg5, &len);
740 if (record_linux_sockaddr (regcache, tdep, tmpulongest, len))
741 return -1;
2c543fc4 742 }
907b7f4f
MS
743 break;
744
13b6d1d4 745 case gdb_sys_recv:
5fd0888a
AA
746 regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest);
747 if (record_mem_at_reg (regcache, tdep->arg2, (int) tmpulongest))
748 return -1;
2c543fc4
HZ
749 break;
750
13b6d1d4 751 case gdb_sys_recvmsg:
2c543fc4
HZ
752 regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
753 if (record_linux_msghdr (regcache, tdep, tmpulongest))
0fc8f115 754 return -1;
2c543fc4
HZ
755 break;
756
13b6d1d4 757 case gdb_sys_socketpair:
5fd0888a 758 if (record_mem_at_reg (regcache, tdep->arg4, tdep->size_int))
0fc8f115 759 return -1;
2c543fc4
HZ
760 break;
761
13b6d1d4 762 case gdb_sys_getsockopt:
2c543fc4
HZ
763 regcache_raw_read_unsigned (regcache, tdep->arg5, &tmpulongest);
764 if (tmpulongest)
0fc8f115
AA
765 {
766 ULONGEST optvalp;
767 gdb_byte *optlenp = (gdb_byte *) alloca (tdep->size_int);
768
769 if (target_read_memory ((CORE_ADDR) tmpulongest, optlenp,
770 tdep->size_int))
771 {
772 if (record_debug)
773 fprintf_unfiltered (gdb_stdlog,
774 "Process record: error reading "
775 "memory at addr = 0x%s "
776 "len = %d.\n",
777 OUTPUT_REG (tmpulongest, tdep->arg5),
778 tdep->size_int);
779 return -1;
780 }
781 regcache_raw_read_unsigned (regcache, tdep->arg4, &optvalp);
782 tmpint = (int) extract_signed_integer (optlenp, tdep->size_int,
783 byte_order);
784 if (record_full_arch_list_add_mem ((CORE_ADDR) optvalp, tmpint))
785 return -1;
786 if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
25ea693b 787 tdep->size_int))
0fc8f115
AA
788 return -1;
789 }
2c543fc4
HZ
790 break;
791
13b6d1d4 792 case gdb_sys_socketcall:
2c543fc4
HZ
793 regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
794 switch (tmpulongest)
0fc8f115
AA
795 {
796 case RECORD_SYS_SOCKET:
797 case RECORD_SYS_BIND:
798 case RECORD_SYS_CONNECT:
799 case RECORD_SYS_LISTEN:
800 break;
801 case RECORD_SYS_ACCEPT:
802 case RECORD_SYS_GETSOCKNAME:
803 case RECORD_SYS_GETPEERNAME:
804 {
805 regcache_raw_read_unsigned (regcache, tdep->arg2,
806 &tmpulongest);
807 if (tmpulongest)
808 {
809 gdb_byte *a = (gdb_byte *) alloca (tdep->size_ulong * 2);
810 ULONGEST len;
811
812 tmpulongest += tdep->size_ulong;
813 if (target_read_memory ((CORE_ADDR) tmpulongest, a,
814 tdep->size_ulong * 2))
815 {
816 if (record_debug)
817 fprintf_unfiltered (gdb_stdlog,
818 "Process record: error reading "
819 "memory at addr = 0x%s len = %d.\n",
820 OUTPUT_REG (tmpulongest, tdep->arg2),
821 tdep->size_ulong * 2);
822 return -1;
823 }
824 tmpulongest = extract_unsigned_integer (a,
825 tdep->size_ulong,
826 byte_order);
827 len = extract_unsigned_integer (a + tdep->size_ulong,
828 tdep->size_ulong, byte_order);
829 if (record_linux_sockaddr (regcache, tdep, tmpulongest, len))
830 return -1;
831 }
832 }
833 break;
834
835 case RECORD_SYS_SOCKETPAIR:
836 {
837 gdb_byte *a = (gdb_byte *) alloca (tdep->size_ulong);
838
839 regcache_raw_read_unsigned (regcache, tdep->arg2,
840 &tmpulongest);
841 if (tmpulongest)
842 {
843 tmpulongest += tdep->size_ulong * 3;
844 if (target_read_memory ((CORE_ADDR) tmpulongest, a,
845 tdep->size_ulong))
846 {
847 if (record_debug)
848 fprintf_unfiltered (gdb_stdlog,
849 "Process record: error reading "
850 "memory at addr = 0x%s len = %d.\n",
851 OUTPUT_REG (tmpulongest, tdep->arg2),
852 tdep->size_ulong);
853 return -1;
854 }
855 tmpaddr
856 = (CORE_ADDR) extract_unsigned_integer (a, tdep->size_ulong,
857 byte_order);
858 if (record_full_arch_list_add_mem (tmpaddr, tdep->size_int))
859 return -1;
860 }
861 }
862 break;
863 case RECORD_SYS_SEND:
864 case RECORD_SYS_SENDTO:
865 break;
866 case RECORD_SYS_RECVFROM:
867 regcache_raw_read_unsigned (regcache, tdep->arg2,
868 &tmpulongest);
869 if (tmpulongest)
870 {
871 gdb_byte *a = (gdb_byte *) alloca (tdep->size_ulong * 2);
872 ULONGEST len;
873
874 tmpulongest += tdep->size_ulong * 4;
875 if (target_read_memory ((CORE_ADDR) tmpulongest, a,
876 tdep->size_ulong * 2))
877 {
878 if (record_debug)
879 fprintf_unfiltered (gdb_stdlog,
880 "Process record: error reading "
881 "memory at addr = 0x%s len = %d.\n",
882 OUTPUT_REG (tmpulongest, tdep->arg2),
883 tdep->size_ulong * 2);
884 return -1;
885 }
886 tmpulongest = extract_unsigned_integer (a, tdep->size_ulong,
887 byte_order);
888 len = extract_unsigned_integer (a + tdep->size_ulong,
889 tdep->size_ulong, byte_order);
890 if (record_linux_sockaddr (regcache, tdep, tmpulongest, len))
891 return -1;
892 }
893 case RECORD_SYS_RECV:
894 regcache_raw_read_unsigned (regcache, tdep->arg2,
895 &tmpulongest);
896 if (tmpulongest)
897 {
898 gdb_byte *a = (gdb_byte *) alloca (tdep->size_ulong * 2);
899
900 tmpulongest += tdep->size_ulong;
901 if (target_read_memory ((CORE_ADDR) tmpulongest, a,
902 tdep->size_ulong))
903 {
904 if (record_debug)
905 fprintf_unfiltered (gdb_stdlog,
906 "Process record: error reading "
907 "memory at addr = 0x%s len = %d.\n",
908 OUTPUT_REG (tmpulongest, tdep->arg2),
909 tdep->size_ulong);
910 return -1;
911 }
912 tmpulongest = extract_unsigned_integer (a, tdep->size_ulong,
913 byte_order);
914 if (tmpulongest)
915 {
916 a += tdep->size_ulong;
917 tmpint = (int) extract_unsigned_integer (a, tdep->size_ulong,
918 byte_order);
919 if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
25ea693b 920 tmpint))
0fc8f115
AA
921 return -1;
922 }
923 }
924 break;
925 case RECORD_SYS_SHUTDOWN:
926 case RECORD_SYS_SETSOCKOPT:
927 break;
928 case RECORD_SYS_GETSOCKOPT:
929 {
930 gdb_byte *a = (gdb_byte *) alloca (tdep->size_ulong * 2);
931 gdb_byte *av = (gdb_byte *) alloca (tdep->size_int);
932
933 regcache_raw_read_unsigned (regcache, tdep->arg2,
934 &tmpulongest);
935 if (tmpulongest)
936 {
937 tmpulongest += tdep->size_ulong * 3;
938 if (target_read_memory ((CORE_ADDR) tmpulongest, a,
939 tdep->size_ulong * 2))
940 {
941 if (record_debug)
942 fprintf_unfiltered (gdb_stdlog,
943 "Process record: error reading "
944 "memory at addr = 0x%s len = %d.\n",
945 OUTPUT_REG (tmpulongest, tdep->arg2),
946 tdep->size_ulong * 2);
947 return -1;
948 }
949 tmpulongest = extract_unsigned_integer (a + tdep->size_ulong,
950 tdep->size_ulong,
951 byte_order);
952 if (tmpulongest)
953 {
954 if (target_read_memory ((CORE_ADDR) tmpulongest, av,
955 tdep->size_int))
956 {
957 if (record_debug)
958 fprintf_unfiltered (gdb_stdlog,
959 "Process record: error reading "
960 "memory at addr = 0x%s "
961 "len = %d.\n",
962 phex_nz (tmpulongest,
963 tdep->size_ulong),
964 tdep->size_int);
965 return -1;
966 }
967 tmpaddr
968 = (CORE_ADDR) extract_unsigned_integer (a,
969 tdep->size_ulong,
970 byte_order);
971 tmpint = (int) extract_unsigned_integer (av,
972 tdep->size_int,
973 byte_order);
974 if (record_full_arch_list_add_mem (tmpaddr, tmpint))
975 return -1;
976 a += tdep->size_ulong;
977 tmpaddr
978 = (CORE_ADDR) extract_unsigned_integer (a,
979 tdep->size_ulong,
980 byte_order);
981 if (record_full_arch_list_add_mem (tmpaddr,
25ea693b 982 tdep->size_int))
0fc8f115
AA
983 return -1;
984 }
985 }
986 }
987 break;
988 case RECORD_SYS_SENDMSG:
989 break;
990 case RECORD_SYS_RECVMSG:
991 {
992 gdb_byte *a = (gdb_byte *) alloca (tdep->size_ulong);
993
994 regcache_raw_read_unsigned (regcache, tdep->arg2,
995 &tmpulongest);
996 if (tmpulongest)
997 {
998 tmpulongest += tdep->size_ulong;
999 if (target_read_memory ((CORE_ADDR) tmpulongest, a,
1000 tdep->size_ulong))
1001 {
1002 if (record_debug)
1003 fprintf_unfiltered (gdb_stdlog,
1004 "Process record: error reading "
1005 "memory at addr = 0x%s len = %d.\n",
1006 OUTPUT_REG (tmpulongest, tdep->arg2),
1007 tdep->size_ulong);
1008 return -1;
1009 }
1010 tmpulongest = extract_unsigned_integer (a, tdep->size_ulong,
1011 byte_order);
1012 if (record_linux_msghdr (regcache, tdep, tmpulongest))
1013 return -1;
1014 }
1015 }
1016 break;
1017 default:
1018 printf_unfiltered (_("Process record and replay target "
1019 "doesn't support socketcall call 0x%s\n"),
1020 OUTPUT_REG (tmpulongest, tdep->arg1));
1021 return -1;
1022 break;
1023 }
b7f6bf22
HZ
1024 break;
1025
13b6d1d4 1026 case gdb_sys_syslog:
b7f6bf22
HZ
1027 break;
1028
13b6d1d4 1029 case gdb_sys_setitimer:
5fd0888a 1030 if (record_mem_at_reg (regcache, tdep->arg3, tdep->size_itimerval))
0fc8f115 1031 return -1;
b7f6bf22
HZ
1032 break;
1033
13b6d1d4 1034 case gdb_sys_getitimer:
5fd0888a 1035 if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_itimerval))
0fc8f115 1036 return -1;
b7f6bf22
HZ
1037 break;
1038
13b6d1d4
MS
1039 case gdb_sys_newstat:
1040 case gdb_sys_newlstat:
1041 case gdb_sys_newfstat:
5fd0888a 1042 if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_stat))
0fc8f115 1043 return -1;
b7f6bf22
HZ
1044 break;
1045
d2de23ad
MK
1046 case gdb_sys_newfstatat:
1047 regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest);
1048 if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
1049 tdep->size_stat))
0fc8f115 1050 return -1;
d2de23ad
MK
1051 break;
1052
13b6d1d4 1053 case gdb_sys_uname:
5fd0888a
AA
1054 if (record_mem_at_reg (regcache, tdep->arg1,
1055 tdep->size_old_utsname))
0fc8f115 1056 return -1;
b7f6bf22
HZ
1057 break;
1058
13b6d1d4
MS
1059 case gdb_sys_iopl:
1060 case gdb_sys_vhangup:
1061 case gdb_sys_ni_syscall112:
1062 case gdb_sys_vm86old:
b7f6bf22
HZ
1063 break;
1064
13b6d1d4 1065 case gdb_sys_wait4:
5fd0888a
AA
1066 if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_int)
1067 || record_mem_at_reg (regcache, tdep->arg4, tdep->size_rusage))
0fc8f115 1068 return -1;
b7f6bf22
HZ
1069 break;
1070
13b6d1d4 1071 case gdb_sys_swapoff:
b7f6bf22
HZ
1072 break;
1073
13b6d1d4 1074 case gdb_sys_sysinfo:
5fd0888a 1075 if (record_mem_at_reg (regcache, tdep->arg1, tdep->size_sysinfo))
0fc8f115 1076 return -1;
2c543fc4
HZ
1077 break;
1078
13b6d1d4
MS
1079 case gdb_sys_shmget:
1080 case gdb_sys_semget:
1081 case gdb_sys_semop:
1082 case gdb_sys_msgget:
2c543fc4 1083 /* XXX maybe need do some record works with sys_shmdt. */
13b6d1d4
MS
1084 case gdb_sys_shmdt:
1085 case gdb_sys_msgsnd:
1086 case gdb_sys_semtimedop:
2c543fc4
HZ
1087 break;
1088
13b6d1d4 1089 case gdb_sys_shmat:
5fd0888a 1090 if (record_mem_at_reg (regcache, tdep->arg3, tdep->size_ulong))
0fc8f115 1091 return -1;
2c543fc4
HZ
1092 break;
1093
13b6d1d4 1094 case gdb_sys_shmctl:
5fd0888a 1095 if (record_mem_at_reg (regcache, tdep->arg3, tdep->size_shmid_ds))
0fc8f115 1096 return -1;
2c543fc4
HZ
1097 break;
1098
13b6d1d4 1099 /* XXX sys_semctl 525 still not supported. */
2c543fc4 1100 /* sys_semctl */
2c543fc4 1101
13b6d1d4 1102 case gdb_sys_msgrcv:
2c543fc4 1103 {
0fc8f115
AA
1104 LONGEST l;
1105
1106 regcache_raw_read_signed (regcache, tdep->arg3, &l);
0fc8f115 1107 tmpint = l + tdep->size_long;
5fd0888a 1108 if (record_mem_at_reg (regcache, tdep->arg2, tmpint))
0fc8f115 1109 return -1;
2c543fc4
HZ
1110 }
1111 break;
1112
13b6d1d4 1113 case gdb_sys_msgctl:
5fd0888a 1114 if (record_mem_at_reg (regcache, tdep->arg3, tdep->size_msqid_ds))
0fc8f115 1115 return -1;
b7f6bf22
HZ
1116 break;
1117
13b6d1d4 1118 case gdb_sys_ipc:
2c543fc4
HZ
1119 regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
1120 tmpulongest &= 0xffff;
1121 switch (tmpulongest)
0fc8f115
AA
1122 {
1123 case RECORD_SEMOP:
1124 case RECORD_SEMGET:
1125 case RECORD_SEMTIMEDOP:
1126 case RECORD_MSGSND:
1127 case RECORD_MSGGET:
13b6d1d4 1128 /* XXX maybe need do some record works with RECORD_SHMDT. */
0fc8f115
AA
1129 case RECORD_SHMDT:
1130 case RECORD_SHMGET:
1131 break;
1132 case RECORD_MSGRCV:
1133 {
1134 LONGEST second;
0fc8f115
AA
1135
1136 regcache_raw_read_signed (regcache, tdep->arg3, &second);
0fc8f115 1137 tmpint = (int) second + tdep->size_long;
5fd0888a 1138 if (record_mem_at_reg (regcache, tdep->arg5, tmpint))
0fc8f115
AA
1139 return -1;
1140 }
1141 break;
1142 case RECORD_MSGCTL:
5fd0888a
AA
1143 if (record_mem_at_reg (regcache, tdep->arg5,
1144 tdep->size_msqid_ds))
0fc8f115
AA
1145 return -1;
1146 break;
1147 case RECORD_SHMAT:
5fd0888a 1148 if (record_mem_at_reg (regcache, tdep->arg4, tdep->size_ulong))
0fc8f115
AA
1149 return -1;
1150 break;
1151 case RECORD_SHMCTL:
5fd0888a
AA
1152 if (record_mem_at_reg (regcache, tdep->arg5,
1153 tdep->size_shmid_ds))
0fc8f115
AA
1154 return -1;
1155 break;
1156 default:
13b6d1d4 1157 /* XXX RECORD_SEMCTL still not supported. */
0fc8f115
AA
1158 printf_unfiltered (_("Process record and replay target doesn't "
1159 "support ipc number %s\n"),
13b6d1d4 1160 pulongest (tmpulongest));
0fc8f115
AA
1161 break;
1162 }
b7f6bf22
HZ
1163 break;
1164
13b6d1d4
MS
1165 case gdb_sys_fsync:
1166 case gdb_sys_sigreturn:
1167 case gdb_sys_clone:
1168 case gdb_sys_setdomainname:
b7f6bf22
HZ
1169 break;
1170
13b6d1d4 1171 case gdb_sys_newuname:
5fd0888a
AA
1172 if (record_mem_at_reg (regcache, tdep->arg1,
1173 tdep->size_new_utsname))
0fc8f115 1174 return -1;
b7f6bf22
HZ
1175 break;
1176
13b6d1d4 1177 case gdb_sys_modify_ldt:
2c543fc4
HZ
1178 regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
1179 if (tmpulongest == 0 || tmpulongest == 2)
0fc8f115 1180 {
5fd0888a 1181 ULONGEST bytecount;
e0881a8e 1182
0fc8f115 1183 regcache_raw_read_unsigned (regcache, tdep->arg3, &bytecount);
5fd0888a 1184 if (record_mem_at_reg (regcache, tdep->arg2, (int) bytecount))
0fc8f115
AA
1185 return -1;
1186 }
b7f6bf22
HZ
1187 break;
1188
13b6d1d4 1189 case gdb_sys_adjtimex:
5fd0888a 1190 if (record_mem_at_reg (regcache, tdep->arg1, tdep->size_timex))
0fc8f115 1191 return -1;
b7f6bf22
HZ
1192 break;
1193
13b6d1d4 1194 case gdb_sys_mprotect:
b7f6bf22
HZ
1195 break;
1196
13b6d1d4 1197 case gdb_sys_sigprocmask:
5fd0888a
AA
1198 if (record_mem_at_reg (regcache, tdep->arg3,
1199 tdep->size_old_sigset_t))
0fc8f115 1200 return -1;
b7f6bf22
HZ
1201 break;
1202
13b6d1d4
MS
1203 case gdb_sys_ni_syscall127:
1204 case gdb_sys_init_module:
1205 case gdb_sys_delete_module:
1206 case gdb_sys_ni_syscall130:
b7f6bf22
HZ
1207 break;
1208
13b6d1d4 1209 case gdb_sys_quotactl:
2c543fc4
HZ
1210 regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
1211 switch (tmpulongest)
0fc8f115
AA
1212 {
1213 case RECORD_Q_GETFMT:
0fc8f115 1214 /* __u32 */
5fd0888a 1215 if (record_mem_at_reg (regcache, tdep->arg4, 4))
0fc8f115
AA
1216 return -1;
1217 break;
1218 case RECORD_Q_GETINFO:
5fd0888a
AA
1219 if (record_mem_at_reg (regcache, tdep->arg4,
1220 tdep->size_mem_dqinfo))
0fc8f115
AA
1221 return -1;
1222 break;
1223 case RECORD_Q_GETQUOTA:
5fd0888a
AA
1224 if (record_mem_at_reg (regcache, tdep->arg4,
1225 tdep->size_if_dqblk))
0fc8f115
AA
1226 return -1;
1227 break;
1228 case RECORD_Q_XGETQSTAT:
1229 case RECORD_Q_XGETQUOTA:
5fd0888a
AA
1230 if (record_mem_at_reg (regcache, tdep->arg4,
1231 tdep->size_fs_quota_stat))
0fc8f115
AA
1232 return -1;
1233 break;
1234 }
b7f6bf22
HZ
1235 break;
1236
13b6d1d4
MS
1237 case gdb_sys_getpgid:
1238 case gdb_sys_fchdir:
1239 case gdb_sys_bdflush:
b7f6bf22
HZ
1240 break;
1241
13b6d1d4 1242 case gdb_sys_sysfs:
2c543fc4
HZ
1243 regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
1244 if (tmpulongest == 2)
0fc8f115 1245 {
13b6d1d4 1246 /*XXX the size of memory is not very clear. */
5fd0888a 1247 if (record_mem_at_reg (regcache, tdep->arg3, 10))
0fc8f115
AA
1248 return -1;
1249 }
b7f6bf22
HZ
1250 break;
1251
13b6d1d4
MS
1252 case gdb_sys_personality:
1253 case gdb_sys_ni_syscall137:
1254 case gdb_sys_setfsuid16:
1255 case gdb_sys_setfsgid16:
b7f6bf22
HZ
1256 break;
1257
13b6d1d4 1258 case gdb_sys_llseek:
5fd0888a 1259 if (record_mem_at_reg (regcache, tdep->arg4, tdep->size_loff_t))
0fc8f115 1260 return -1;
b7f6bf22
HZ
1261 break;
1262
13b6d1d4 1263 case gdb_sys_getdents:
72aded86 1264 case gdb_sys_getdents64:
5fd0888a
AA
1265 regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest);
1266 if (record_mem_at_reg (regcache, tdep->arg2, tmpulongest))
1267 return -1;
b7f6bf22
HZ
1268 break;
1269
13b6d1d4 1270 case gdb_sys_select:
5fd0888a
AA
1271 if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_fd_set)
1272 || record_mem_at_reg (regcache, tdep->arg3, tdep->size_fd_set)
1273 || record_mem_at_reg (regcache, tdep->arg4, tdep->size_fd_set)
1274 || record_mem_at_reg (regcache, tdep->arg5, tdep->size_timeval))
0fc8f115 1275 return -1;
b7f6bf22
HZ
1276 break;
1277
13b6d1d4
MS
1278 case gdb_sys_flock:
1279 case gdb_sys_msync:
b7f6bf22
HZ
1280 break;
1281
13b6d1d4 1282 case gdb_sys_readv:
b7f6bf22 1283 {
0fc8f115
AA
1284 ULONGEST vec, vlen;
1285
1286 regcache_raw_read_unsigned (regcache, tdep->arg2, &vec);
1287 if (vec)
1288 {
1289 gdb_byte *iov = (gdb_byte *) alloca (tdep->size_iovec);
1290
1291 regcache_raw_read_unsigned (regcache, tdep->arg3, &vlen);
1292 for (tmpulongest = 0; tmpulongest < vlen; tmpulongest++)
1293 {
1294 if (target_read_memory ((CORE_ADDR) vec, iov,
1295 tdep->size_iovec))
1296 {
1297 if (record_debug)
1298 fprintf_unfiltered (gdb_stdlog,
1299 "Process record: error reading "
1300 "memory at addr = 0x%s len = %d.\n",
1301 OUTPUT_REG (vec, tdep->arg2),
1302 tdep->size_iovec);
1303 return -1;
1304 }
1305 tmpaddr
1306 = (CORE_ADDR) extract_unsigned_integer (iov,
1307 tdep->size_pointer,
1308 byte_order);
1309 tmpint
1310 = (int) extract_unsigned_integer (iov + tdep->size_pointer,
1311 tdep->size_size_t,
1312 byte_order);
1313 if (record_full_arch_list_add_mem (tmpaddr, tmpint))
1314 return -1;
1315 vec += tdep->size_iovec;
1316 }
1317 }
b7f6bf22
HZ
1318 }
1319 break;
1320
13b6d1d4
MS
1321 case gdb_sys_writev:
1322 case gdb_sys_getsid:
1323 case gdb_sys_fdatasync:
1324 case gdb_sys_sysctl:
1325 case gdb_sys_mlock:
1326 case gdb_sys_munlock:
1327 case gdb_sys_mlockall:
1328 case gdb_sys_munlockall:
1329 case gdb_sys_sched_setparam:
1330 break;
1331
1332 case gdb_sys_sched_getparam:
5fd0888a 1333 if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_int))
0fc8f115 1334 return -1;
b7f6bf22
HZ
1335 break;
1336
13b6d1d4
MS
1337 case gdb_sys_sched_setscheduler:
1338 case gdb_sys_sched_getscheduler:
1339 case gdb_sys_sched_yield:
1340 case gdb_sys_sched_get_priority_max:
1341 case gdb_sys_sched_get_priority_min:
b7f6bf22
HZ
1342 break;
1343
13b6d1d4
MS
1344 case gdb_sys_sched_rr_get_interval:
1345 case gdb_sys_nanosleep:
5fd0888a 1346 if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_timespec))
0fc8f115 1347 return -1;
b7f6bf22
HZ
1348 break;
1349
13b6d1d4
MS
1350 case gdb_sys_mremap:
1351 case gdb_sys_setresuid16:
b7f6bf22
HZ
1352 break;
1353
13b6d1d4 1354 case gdb_sys_getresuid16:
5fd0888a
AA
1355 if (record_mem_at_reg (regcache, tdep->arg1, tdep->size_old_uid_t)
1356 || record_mem_at_reg (regcache, tdep->arg2,
1357 tdep->size_old_uid_t)
1358 || record_mem_at_reg (regcache, tdep->arg3,
1359 tdep->size_old_uid_t))
0fc8f115 1360 return -1;
b7f6bf22
HZ
1361 break;
1362
13b6d1d4
MS
1363 case gdb_sys_vm86:
1364 case gdb_sys_ni_syscall167:
b7f6bf22
HZ
1365 break;
1366
13b6d1d4 1367 case gdb_sys_poll:
2c543fc4
HZ
1368 regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
1369 if (tmpulongest)
0fc8f115
AA
1370 {
1371 ULONGEST nfds;
e0881a8e 1372
0fc8f115
AA
1373 regcache_raw_read_unsigned (regcache, tdep->arg2, &nfds);
1374 if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
25ea693b 1375 tdep->size_pollfd * nfds))
0fc8f115
AA
1376 return -1;
1377 }
b7f6bf22
HZ
1378 break;
1379
13b6d1d4 1380 case gdb_sys_nfsservctl:
2c543fc4
HZ
1381 regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
1382 if (tmpulongest == 7 || tmpulongest == 8)
0fc8f115
AA
1383 {
1384 int rsize;
e0881a8e 1385
0fc8f115
AA
1386 if (tmpulongest == 7)
1387 rsize = tdep->size_NFS_FHSIZE;
1388 else
1389 rsize = tdep->size_knfsd_fh;
5fd0888a 1390 if (record_mem_at_reg (regcache, tdep->arg3, rsize))
0fc8f115
AA
1391 return -1;
1392 }
b7f6bf22
HZ
1393 break;
1394
13b6d1d4 1395 case gdb_sys_setresgid16:
b7f6bf22
HZ
1396 break;
1397
13b6d1d4 1398 case gdb_sys_getresgid16:
5fd0888a
AA
1399 if (record_mem_at_reg (regcache, tdep->arg1, tdep->size_old_gid_t)
1400 || record_mem_at_reg (regcache, tdep->arg2,
1401 tdep->size_old_gid_t)
1402 || record_mem_at_reg (regcache, tdep->arg3,
1403 tdep->size_old_gid_t))
0fc8f115 1404 return -1;
b7f6bf22
HZ
1405 break;
1406
13b6d1d4 1407 case gdb_sys_prctl:
2c543fc4
HZ
1408 regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
1409 switch (tmpulongest)
0fc8f115
AA
1410 {
1411 case 2:
5fd0888a 1412 if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_int))
0fc8f115
AA
1413 return -1;
1414 break;
1415 case 16:
5fd0888a
AA
1416 if (record_mem_at_reg (regcache, tdep->arg2,
1417 tdep->size_TASK_COMM_LEN))
0fc8f115
AA
1418 return -1;
1419 break;
1420 }
b7f6bf22
HZ
1421 break;
1422
13b6d1d4 1423 case gdb_sys_rt_sigreturn:
b7f6bf22
HZ
1424 break;
1425
13b6d1d4 1426 case gdb_sys_rt_sigaction:
5fd0888a 1427 if (record_mem_at_reg (regcache, tdep->arg3, tdep->size_sigaction))
0fc8f115 1428 return -1;
b7f6bf22
HZ
1429 break;
1430
13b6d1d4 1431 case gdb_sys_rt_sigprocmask:
5fd0888a 1432 if (record_mem_at_reg (regcache, tdep->arg3, tdep->size_sigset_t))
0fc8f115 1433 return -1;
b7f6bf22
HZ
1434 break;
1435
13b6d1d4 1436 case gdb_sys_rt_sigpending:
2c543fc4
HZ
1437 regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
1438 if (tmpulongest)
0fc8f115
AA
1439 {
1440 ULONGEST sigsetsize;
e0881a8e 1441
0fc8f115
AA
1442 regcache_raw_read_unsigned (regcache, tdep->arg2,&sigsetsize);
1443 if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
25ea693b 1444 (int) sigsetsize))
0fc8f115
AA
1445 return -1;
1446 }
b7f6bf22
HZ
1447 break;
1448
13b6d1d4 1449 case gdb_sys_rt_sigtimedwait:
5fd0888a 1450 if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_siginfo_t))
0fc8f115 1451 return -1;
b7f6bf22
HZ
1452 break;
1453
13b6d1d4
MS
1454 case gdb_sys_rt_sigqueueinfo:
1455 case gdb_sys_rt_sigsuspend:
b7f6bf22
HZ
1456 break;
1457
13b6d1d4 1458 case gdb_sys_pread64:
2c543fc4
HZ
1459 regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
1460 if (tmpulongest)
0fc8f115
AA
1461 {
1462 ULONGEST count;
e0881a8e 1463
0fc8f115
AA
1464 regcache_raw_read_unsigned (regcache, tdep->arg3,&count);
1465 if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
25ea693b 1466 (int) count))
0fc8f115
AA
1467 return -1;
1468 }
b7f6bf22
HZ
1469 break;
1470
13b6d1d4
MS
1471 case gdb_sys_pwrite64:
1472 case gdb_sys_chown16:
b7f6bf22
HZ
1473 break;
1474
13b6d1d4 1475 case gdb_sys_getcwd:
2c543fc4
HZ
1476 regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
1477 if (tmpulongest)
0fc8f115
AA
1478 {
1479 ULONGEST size;
e0881a8e 1480
0fc8f115
AA
1481 regcache_raw_read_unsigned (regcache, tdep->arg2, &size);
1482 if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
25ea693b 1483 (int) size))
0fc8f115
AA
1484 return -1;
1485 }
b7f6bf22
HZ
1486 break;
1487
13b6d1d4 1488 case gdb_sys_capget:
5fd0888a
AA
1489 if (record_mem_at_reg (regcache, tdep->arg2,
1490 tdep->size_cap_user_data_t))
0fc8f115 1491 return -1;
b7f6bf22
HZ
1492 break;
1493
13b6d1d4 1494 case gdb_sys_capset:
b7f6bf22
HZ
1495 break;
1496
13b6d1d4 1497 case gdb_sys_sigaltstack:
5fd0888a 1498 if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_stack_t))
0fc8f115 1499 return -1;
b7f6bf22
HZ
1500 break;
1501
13b6d1d4 1502 case gdb_sys_sendfile:
5fd0888a 1503 if (record_mem_at_reg (regcache, tdep->arg3, tdep->size_off_t))
0fc8f115 1504 return -1;
b7f6bf22
HZ
1505 break;
1506
13b6d1d4
MS
1507 case gdb_sys_ni_syscall188:
1508 case gdb_sys_ni_syscall189:
1509 case gdb_sys_vfork:
b7f6bf22
HZ
1510 break;
1511
13b6d1d4 1512 case gdb_sys_getrlimit:
5fd0888a 1513 if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_rlimit))
0fc8f115 1514 return -1;
b7f6bf22
HZ
1515 break;
1516
13b6d1d4 1517 case gdb_sys_mmap2:
b7f6bf22
HZ
1518 break;
1519
13b6d1d4
MS
1520 case gdb_sys_truncate64:
1521 case gdb_sys_ftruncate64:
b7f6bf22
HZ
1522 break;
1523
13b6d1d4
MS
1524 case gdb_sys_stat64:
1525 case gdb_sys_lstat64:
1526 case gdb_sys_fstat64:
5fd0888a 1527 if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_stat64))
0fc8f115 1528 return -1;
b7f6bf22
HZ
1529 break;
1530
13b6d1d4
MS
1531 case gdb_sys_lchown:
1532 case gdb_sys_getuid:
1533 case gdb_sys_getgid:
1534 case gdb_sys_geteuid:
1535 case gdb_sys_getegid:
1536 case gdb_sys_setreuid:
1537 case gdb_sys_setregid:
b7f6bf22
HZ
1538 break;
1539
13b6d1d4 1540 case gdb_sys_getgroups:
2c543fc4
HZ
1541 regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
1542 if (tmpulongest)
0fc8f115
AA
1543 {
1544 ULONGEST gidsetsize;
e0881a8e 1545
0fc8f115
AA
1546 regcache_raw_read_unsigned (regcache, tdep->arg1,
1547 &gidsetsize);
1548 tmpint = tdep->size_gid_t * (int) gidsetsize;
1549 if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest, tmpint))
1550 return -1;
1551 }
b7f6bf22
HZ
1552 break;
1553
13b6d1d4
MS
1554 case gdb_sys_setgroups:
1555 case gdb_sys_fchown:
1556 case gdb_sys_setresuid:
b7f6bf22
HZ
1557 break;
1558
13b6d1d4 1559 case gdb_sys_getresuid:
5fd0888a
AA
1560 if (record_mem_at_reg (regcache, tdep->arg1, tdep->size_uid_t)
1561 || record_mem_at_reg (regcache, tdep->arg2, tdep->size_uid_t)
1562 || record_mem_at_reg (regcache, tdep->arg3, tdep->size_uid_t))
0fc8f115 1563 return -1;
b7f6bf22
HZ
1564 break;
1565
13b6d1d4 1566 case gdb_sys_setresgid:
b7f6bf22
HZ
1567 break;
1568
13b6d1d4 1569 case gdb_sys_getresgid:
5fd0888a
AA
1570 if (record_mem_at_reg (regcache, tdep->arg1, tdep->size_gid_t)
1571 || record_mem_at_reg (regcache, tdep->arg2, tdep->size_gid_t)
1572 || record_mem_at_reg (regcache, tdep->arg3, tdep->size_gid_t))
0fc8f115 1573 return -1;
b7f6bf22
HZ
1574 break;
1575
13b6d1d4
MS
1576 case gdb_sys_chown:
1577 case gdb_sys_setuid:
1578 case gdb_sys_setgid:
1579 case gdb_sys_setfsuid:
1580 case gdb_sys_setfsgid:
1581 case gdb_sys_pivot_root:
b7f6bf22
HZ
1582 break;
1583
13b6d1d4 1584 case gdb_sys_mincore:
5fd0888a 1585 if (record_mem_at_reg (regcache, tdep->arg3, tdep->size_PAGE_SIZE))
0fc8f115 1586 return -1;
b7f6bf22
HZ
1587 break;
1588
13b6d1d4 1589 case gdb_sys_madvise:
b7f6bf22
HZ
1590 break;
1591
13b6d1d4 1592 case gdb_sys_fcntl64:
2c543fc4
HZ
1593 regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
1594 if (tmpulongest == tdep->fcntl_F_GETLK64)
0fc8f115 1595 {
5fd0888a
AA
1596 if (record_mem_at_reg (regcache, tdep->arg3,
1597 tdep->size_flock64))
0fc8f115
AA
1598 return -1;
1599 }
2c543fc4 1600 else if (tmpulongest != tdep->fcntl_F_SETLK64
0fc8f115
AA
1601 && tmpulongest != tdep->fcntl_F_SETLKW64)
1602 {
1603 goto sys_fcntl;
1604 }
b7f6bf22
HZ
1605 break;
1606
13b6d1d4
MS
1607 case gdb_sys_ni_syscall222:
1608 case gdb_sys_ni_syscall223:
1609 case gdb_sys_gettid:
1610 case gdb_sys_readahead:
1611 case gdb_sys_setxattr:
1612 case gdb_sys_lsetxattr:
1613 case gdb_sys_fsetxattr:
1614 break;
1615
1616 case gdb_sys_getxattr:
1617 case gdb_sys_lgetxattr:
1618 case gdb_sys_fgetxattr:
2c543fc4
HZ
1619 regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest);
1620 if (tmpulongest)
0fc8f115
AA
1621 {
1622 ULONGEST size;
e0881a8e 1623
0fc8f115
AA
1624 regcache_raw_read_unsigned (regcache, tdep->arg4, &size);
1625 if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
25ea693b 1626 (int) size))
0fc8f115
AA
1627 return -1;
1628 }
b7f6bf22
HZ
1629 break;
1630
13b6d1d4
MS
1631 case gdb_sys_listxattr:
1632 case gdb_sys_llistxattr:
1633 case gdb_sys_flistxattr:
2c543fc4
HZ
1634 regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
1635 if (tmpulongest)
0fc8f115
AA
1636 {
1637 ULONGEST size;
e0881a8e 1638
0fc8f115
AA
1639 regcache_raw_read_unsigned (regcache, tdep->arg3, &size);
1640 if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
25ea693b 1641 (int) size))
0fc8f115
AA
1642 return -1;
1643 }
b7f6bf22
HZ
1644 break;
1645
13b6d1d4
MS
1646 case gdb_sys_removexattr:
1647 case gdb_sys_lremovexattr:
1648 case gdb_sys_fremovexattr:
1649 case gdb_sys_tkill:
b7f6bf22
HZ
1650 break;
1651
13b6d1d4 1652 case gdb_sys_sendfile64:
5fd0888a 1653 if (record_mem_at_reg (regcache, tdep->arg3, tdep->size_loff_t))
0fc8f115 1654 return -1;
b7f6bf22
HZ
1655 break;
1656
13b6d1d4
MS
1657 case gdb_sys_futex:
1658 case gdb_sys_sched_setaffinity:
b7f6bf22
HZ
1659 break;
1660
13b6d1d4 1661 case gdb_sys_sched_getaffinity:
2c543fc4
HZ
1662 regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest);
1663 if (tmpulongest)
0fc8f115
AA
1664 {
1665 ULONGEST len;
e0881a8e 1666
0fc8f115
AA
1667 regcache_raw_read_unsigned (regcache, tdep->arg2, &len);
1668 if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
25ea693b 1669 (int) len))
0fc8f115
AA
1670 return -1;
1671 }
b7f6bf22
HZ
1672 break;
1673
13b6d1d4 1674 case gdb_sys_set_thread_area:
5fd0888a 1675 if (record_mem_at_reg (regcache, tdep->arg1, tdep->size_int))
0fc8f115 1676 return -1;
b7f6bf22
HZ
1677 break;
1678
13b6d1d4 1679 case gdb_sys_get_thread_area:
5fd0888a 1680 if (record_mem_at_reg (regcache, tdep->arg1, tdep->size_user_desc))
0fc8f115 1681 return -1;
b7f6bf22
HZ
1682 break;
1683
13b6d1d4 1684 case gdb_sys_io_setup:
5fd0888a 1685 if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_long))
0fc8f115 1686 return -1;
b7f6bf22
HZ
1687 break;
1688
13b6d1d4 1689 case gdb_sys_io_destroy:
b7f6bf22
HZ
1690 break;
1691
13b6d1d4 1692 case gdb_sys_io_getevents:
2c543fc4
HZ
1693 regcache_raw_read_unsigned (regcache, tdep->arg4, &tmpulongest);
1694 if (tmpulongest)
0fc8f115
AA
1695 {
1696 ULONGEST nr;
e0881a8e 1697
0fc8f115
AA
1698 regcache_raw_read_unsigned (regcache, tdep->arg3, &nr);
1699 if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
25ea693b 1700 nr * tdep->size_io_event))
0fc8f115
AA
1701 return -1;
1702 }
b7f6bf22
HZ
1703 break;
1704
13b6d1d4 1705 case gdb_sys_io_submit:
2c543fc4
HZ
1706 regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest);
1707 if (tmpulongest)
0fc8f115
AA
1708 {
1709 ULONGEST nr, i;
1710 gdb_byte *iocbp;
1711
1712 regcache_raw_read_unsigned (regcache, tdep->arg2, &nr);
1713 iocbp = (gdb_byte *) alloca (nr * tdep->size_pointer);
1714 if (target_read_memory ((CORE_ADDR) tmpulongest, iocbp,
1715 nr * tdep->size_pointer))
1716 {
1717 if (record_debug)
1718 fprintf_unfiltered (gdb_stdlog,
1719 "Process record: error reading memory "
1720 "at addr = 0x%s len = %u.\n",
1721 OUTPUT_REG (tmpulongest, tdep->arg2),
1722 (int) (nr * tdep->size_pointer));
1723 return -1;
1724 }
1725 for (i = 0; i < nr; i++)
1726 {
1727 tmpaddr
1728 = (CORE_ADDR) extract_unsigned_integer (iocbp,
1729 tdep->size_pointer,
1730 byte_order);
1731 if (record_full_arch_list_add_mem (tmpaddr, tdep->size_iocb))
1732 return -1;
1733 iocbp += tdep->size_pointer;
1734 }
1735 }
b7f6bf22
HZ
1736 break;
1737
13b6d1d4 1738 case gdb_sys_io_cancel:
5fd0888a 1739 if (record_mem_at_reg (regcache, tdep->arg3, tdep->size_io_event))
0fc8f115 1740 return -1;
b7f6bf22
HZ
1741 break;
1742
13b6d1d4
MS
1743 case gdb_sys_fadvise64:
1744 case gdb_sys_ni_syscall251:
b7f6bf22
HZ
1745 break;
1746
13b6d1d4 1747 case gdb_sys_exit_group:
651ce16a
PA
1748 if (yquery (_("The next instruction is syscall exit_group. "
1749 "It will make the program exit. "
1750 "Do you want to stop the program?")))
1751 return 1;
b7f6bf22
HZ
1752 break;
1753
13b6d1d4 1754 case gdb_sys_lookup_dcookie:
2c543fc4
HZ
1755 regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
1756 if (tmpulongest)
0fc8f115
AA
1757 {
1758 ULONGEST len;
e0881a8e 1759
0fc8f115
AA
1760 regcache_raw_read_unsigned (regcache, tdep->arg3, &len);
1761 if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
25ea693b 1762 (int) len))
0fc8f115
AA
1763 return -1;
1764 }
b7f6bf22
HZ
1765 break;
1766
13b6d1d4
MS
1767 case gdb_sys_epoll_create:
1768 case gdb_sys_epoll_ctl:
b7f6bf22
HZ
1769 break;
1770
13b6d1d4 1771 case gdb_sys_epoll_wait:
2c543fc4
HZ
1772 regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
1773 if (tmpulongest)
0fc8f115
AA
1774 {
1775 ULONGEST maxevents;
e0881a8e 1776
0fc8f115
AA
1777 regcache_raw_read_unsigned (regcache, tdep->arg3, &maxevents);
1778 if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
25ea693b
MM
1779 (maxevents
1780 * tdep->size_epoll_event)))
0fc8f115
AA
1781 return -1;
1782 }
b7f6bf22
HZ
1783 break;
1784
13b6d1d4
MS
1785 case gdb_sys_remap_file_pages:
1786 case gdb_sys_set_tid_address:
b7f6bf22
HZ
1787 break;
1788
13b6d1d4 1789 case gdb_sys_timer_create:
5fd0888a 1790 if (record_mem_at_reg (regcache, tdep->arg3, tdep->size_int))
0fc8f115 1791 return -1;
b7f6bf22
HZ
1792 break;
1793
13b6d1d4 1794 case gdb_sys_timer_settime:
5fd0888a 1795 if (record_mem_at_reg (regcache, tdep->arg4, tdep->size_itimerspec))
0fc8f115 1796 return -1;
b7f6bf22
HZ
1797 break;
1798
13b6d1d4 1799 case gdb_sys_timer_gettime:
5fd0888a 1800 if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_itimerspec))
0fc8f115 1801 return -1;
b7f6bf22
HZ
1802 break;
1803
13b6d1d4
MS
1804 case gdb_sys_timer_getoverrun:
1805 case gdb_sys_timer_delete:
1806 case gdb_sys_clock_settime:
b7f6bf22
HZ
1807 break;
1808
13b6d1d4 1809 case gdb_sys_clock_gettime:
5fd0888a 1810 if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_timespec))
0fc8f115 1811 return -1;
b7f6bf22
HZ
1812 break;
1813
13b6d1d4 1814 case gdb_sys_clock_getres:
5fd0888a 1815 if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_timespec))
0fc8f115 1816 return -1;
b7f6bf22
HZ
1817 break;
1818
13b6d1d4 1819 case gdb_sys_clock_nanosleep:
5fd0888a 1820 if (record_mem_at_reg (regcache, tdep->arg4, tdep->size_timespec))
0fc8f115 1821 return -1;
b7f6bf22
HZ
1822 break;
1823
13b6d1d4
MS
1824 case gdb_sys_statfs64:
1825 case gdb_sys_fstatfs64:
5fd0888a 1826 if (record_mem_at_reg (regcache, tdep->arg3, tdep->size_statfs64))
0fc8f115 1827 return -1;
b7f6bf22
HZ
1828 break;
1829
13b6d1d4
MS
1830 case gdb_sys_tgkill:
1831 case gdb_sys_utimes:
1832 case gdb_sys_fadvise64_64:
1833 case gdb_sys_ni_syscall273:
1834 case gdb_sys_mbind:
b7f6bf22
HZ
1835 break;
1836
13b6d1d4 1837 case gdb_sys_get_mempolicy:
5fd0888a 1838 if (record_mem_at_reg (regcache, tdep->arg1, tdep->size_int))
0fc8f115 1839 return -1;
2c543fc4
HZ
1840 regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
1841 if (tmpulongest)
0fc8f115
AA
1842 {
1843 ULONGEST maxnode;
e0881a8e 1844
0fc8f115
AA
1845 regcache_raw_read_unsigned (regcache, tdep->arg3, &maxnode);
1846 if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
25ea693b 1847 maxnode * tdep->size_long))
0fc8f115
AA
1848 return -1;
1849 }
b7f6bf22
HZ
1850 break;
1851
13b6d1d4
MS
1852 case gdb_sys_set_mempolicy:
1853 case gdb_sys_mq_open:
1854 case gdb_sys_mq_unlink:
1855 case gdb_sys_mq_timedsend:
b7f6bf22
HZ
1856 break;
1857
13b6d1d4 1858 case gdb_sys_mq_timedreceive:
2c543fc4
HZ
1859 regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
1860 if (tmpulongest)
0fc8f115
AA
1861 {
1862 ULONGEST msg_len;
e0881a8e 1863
0fc8f115
AA
1864 regcache_raw_read_unsigned (regcache, tdep->arg3, &msg_len);
1865 if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
25ea693b 1866 (int) msg_len))
0fc8f115
AA
1867 return -1;
1868 }
5fd0888a 1869 if (record_mem_at_reg (regcache, tdep->arg4, tdep->size_int))
0fc8f115 1870 return -1;
b7f6bf22
HZ
1871 break;
1872
13b6d1d4 1873 case gdb_sys_mq_notify:
b7f6bf22
HZ
1874 break;
1875
13b6d1d4 1876 case gdb_sys_mq_getsetattr:
5fd0888a 1877 if (record_mem_at_reg (regcache, tdep->arg3, tdep->size_mq_attr))
0fc8f115 1878 return -1;
b7f6bf22
HZ
1879 break;
1880
13b6d1d4 1881 case gdb_sys_kexec_load:
b7f6bf22
HZ
1882 break;
1883
13b6d1d4 1884 case gdb_sys_waitid:
5fd0888a
AA
1885 if (record_mem_at_reg (regcache, tdep->arg3, tdep->size_siginfo_t)
1886 || record_mem_at_reg (regcache, tdep->arg5, tdep->size_rusage))
0fc8f115 1887 return -1;
b7f6bf22
HZ
1888 break;
1889
13b6d1d4
MS
1890 case gdb_sys_ni_syscall285:
1891 case gdb_sys_add_key:
1892 case gdb_sys_request_key:
b7f6bf22
HZ
1893 break;
1894
13b6d1d4 1895 case gdb_sys_keyctl:
2c543fc4
HZ
1896 regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
1897 if (tmpulongest == 6 || tmpulongest == 11)
0fc8f115
AA
1898 {
1899 regcache_raw_read_unsigned (regcache, tdep->arg3,
1900 &tmpulongest);
1901 if (tmpulongest)
1902 {
1903 ULONGEST buflen;
1904
1905 regcache_raw_read_unsigned (regcache, tdep->arg4, &buflen);
1906 if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
25ea693b 1907 (int) buflen))
0fc8f115
AA
1908 return -1;
1909 }
1910 }
b7f6bf22
HZ
1911 break;
1912
13b6d1d4
MS
1913 case gdb_sys_ioprio_set:
1914 case gdb_sys_ioprio_get:
1915 case gdb_sys_inotify_init:
1916 case gdb_sys_inotify_add_watch:
1917 case gdb_sys_inotify_rm_watch:
1918 case gdb_sys_migrate_pages:
1919 case gdb_sys_openat:
1920 case gdb_sys_mkdirat:
1921 case gdb_sys_mknodat:
1922 case gdb_sys_fchownat:
1923 case gdb_sys_futimesat:
1924 break;
1925
1926 case gdb_sys_fstatat64:
5fd0888a 1927 if (record_mem_at_reg (regcache, tdep->arg3, tdep->size_stat64))
0fc8f115 1928 return -1;
b7f6bf22
HZ
1929 break;
1930
13b6d1d4
MS
1931 case gdb_sys_unlinkat:
1932 case gdb_sys_renameat:
1933 case gdb_sys_linkat:
1934 case gdb_sys_symlinkat:
b7f6bf22
HZ
1935 break;
1936
13b6d1d4 1937 case gdb_sys_readlinkat:
2c543fc4
HZ
1938 regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest);
1939 if (tmpulongest)
0fc8f115
AA
1940 {
1941 ULONGEST bufsiz;
e0881a8e 1942
0fc8f115
AA
1943 regcache_raw_read_unsigned (regcache, tdep->arg4, &bufsiz);
1944 if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
25ea693b 1945 (int) bufsiz))
0fc8f115
AA
1946 return -1;
1947 }
b7f6bf22
HZ
1948 break;
1949
13b6d1d4
MS
1950 case gdb_sys_fchmodat:
1951 case gdb_sys_faccessat:
b7f6bf22
HZ
1952 break;
1953
13b6d1d4 1954 case gdb_sys_pselect6:
5fd0888a
AA
1955 if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_fd_set)
1956 || record_mem_at_reg (regcache, tdep->arg3, tdep->size_fd_set)
1957 || record_mem_at_reg (regcache, tdep->arg4, tdep->size_fd_set)
1958 || record_mem_at_reg (regcache, tdep->arg5, tdep->size_timespec))
0fc8f115 1959 return -1;
b7f6bf22
HZ
1960 break;
1961
13b6d1d4 1962 case gdb_sys_ppoll:
2c543fc4
HZ
1963 regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest);
1964 if (tmpulongest)
0fc8f115
AA
1965 {
1966 ULONGEST nfds;
e0881a8e 1967
0fc8f115
AA
1968 regcache_raw_read_unsigned (regcache, tdep->arg2, &nfds);
1969 if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
25ea693b 1970 tdep->size_pollfd * nfds))
0fc8f115
AA
1971 return -1;
1972 }
5fd0888a 1973 if (record_mem_at_reg (regcache, tdep->arg3, tdep->size_timespec))
0fc8f115 1974 return -1;
b7f6bf22
HZ
1975 break;
1976
13b6d1d4
MS
1977 case gdb_sys_unshare:
1978 case gdb_sys_set_robust_list:
b7f6bf22
HZ
1979 break;
1980
13b6d1d4 1981 case gdb_sys_get_robust_list:
5fd0888a
AA
1982 if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_int)
1983 || record_mem_at_reg (regcache, tdep->arg3, tdep->size_int))
0fc8f115 1984 return -1;
b7f6bf22
HZ
1985 break;
1986
13b6d1d4 1987 case gdb_sys_splice:
5fd0888a
AA
1988 if (record_mem_at_reg (regcache, tdep->arg2, tdep->size_loff_t)
1989 || record_mem_at_reg (regcache, tdep->arg4, tdep->size_loff_t))
0fc8f115 1990 return -1;
b7f6bf22
HZ
1991 break;
1992
13b6d1d4
MS
1993 case gdb_sys_sync_file_range:
1994 case gdb_sys_tee:
1995 case gdb_sys_vmsplice:
b7f6bf22
HZ
1996 break;
1997
13b6d1d4 1998 case gdb_sys_move_pages:
2c543fc4
HZ
1999 regcache_raw_read_unsigned (regcache, tdep->arg5, &tmpulongest);
2000 if (tmpulongest)
0fc8f115
AA
2001 {
2002 ULONGEST nr_pages;
e0881a8e 2003
0fc8f115
AA
2004 regcache_raw_read_unsigned (regcache, tdep->arg2, &nr_pages);
2005 if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest,
25ea693b 2006 nr_pages * tdep->size_int))
0fc8f115
AA
2007 return -1;
2008 }
b7f6bf22
HZ
2009 break;
2010
13b6d1d4 2011 case gdb_sys_getcpu:
5fd0888a
AA
2012 if (record_mem_at_reg (regcache, tdep->arg1, tdep->size_int)
2013 || record_mem_at_reg (regcache, tdep->arg2, tdep->size_int)
2014 || record_mem_at_reg (regcache, tdep->arg3,
2015 tdep->size_ulong * 2))
0fc8f115 2016 return -1;
b7f6bf22
HZ
2017 break;
2018
13b6d1d4 2019 case gdb_sys_epoll_pwait:
2c543fc4
HZ
2020 regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest);
2021 if (tmpulongest)
0fc8f115
AA
2022 {
2023 ULONGEST maxevents;
e0881a8e 2024
0fc8f115
AA
2025 regcache_raw_read_unsigned (regcache, tdep->arg3, &maxevents);
2026 tmpint = (int) maxevents * tdep->size_epoll_event;
2027 if (record_full_arch_list_add_mem ((CORE_ADDR) tmpulongest, tmpint))
2028 return -1;
2029 }
b7f6bf22
HZ
2030 break;
2031
253b4d3a
YQ
2032 case gdb_sys_fallocate:
2033 case gdb_sys_eventfd2:
2034 case gdb_sys_epoll_create1:
2035 case gdb_sys_dup3:
2036 break;
2037
2038 case gdb_sys_pipe2:
5fd0888a 2039 if (record_mem_at_reg (regcache, tdep->arg1, tdep->size_int * 2))
0fc8f115 2040 return -1;
253b4d3a
YQ
2041 break;
2042
2043 case gdb_sys_inotify_init1:
2044 break;
2045
b7f6bf22
HZ
2046 default:
2047 printf_unfiltered (_("Process record and replay target doesn't "
0fc8f115 2048 "support syscall number %d\n"), syscall);
b7f6bf22
HZ
2049 return -1;
2050 break;
2051 }
2052
2053 return 0;
2054}