* [RFA] Resubmit process record and replay, 5/10
@ 2008-11-17 2:18 teawater
2008-11-20 4:22 ` Michael Snyder
2008-12-19 7:23 ` teawater
0 siblings, 2 replies; 8+ messages in thread
From: teawater @ 2008-11-17 2:18 UTC (permalink / raw)
To: gdb-patches
[-- Attachment #1: Type: text/plain, Size: 15209 bytes --]
This patch add process record and replay for Linux support file. The
main function is "record_linux_system_call" will be called by
architecture record function. It is used to record the system call
execute log.
2008-11-16 Hui Zhu <teawater@gmail.com>
Process record and replay target.
* Makefile.in (linux-record.c): New file.
* configure.tgt (linux-record.c): New file.
* linux-record.c, linux-record.h: New file.
Makefile.in | 4
b/linux-record.c | 2501 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
b/linux-record.h | 171 +++
configure.tgt | 6
4 files changed, 2678 insertions(+), 4 deletions(-)
Following is the diff with the previous patch:
@@ -1,6 +1,6 @@
--- a/configure.tgt
+++ b/configure.tgt
-@@ -185,7 +185,8 @@ i[34567]86-*-solaris*)
+@@ -185,7 +185,8 @@
i[34567]86-*-linux*)
# Target: Intel 386 running GNU/Linux
gdb_target_obs="i386-tdep.o i386-linux-tdep.o glibc-tdep.o i387-tdep.o \
@@ -10,7 +10,7 @@
build_gdbserver=yes
;;
i[34567]86-*-gnu*)
-@@ -507,7 +508,8 @@ x86_64-*-linux*)
+@@ -508,7 +509,8 @@
# Target: GNU/Linux x86-64
gdb_target_obs="amd64-tdep.o amd64-linux-tdep.o i386-tdep.o \
i387-tdep.o i386-linux-tdep.o glibc-tdep.o \
@@ -20,29 +20,9 @@
build_gdbserver=yes
;;
x86_64-*-freebsd* | x86_64-*-kfreebsd*-gnu)
---- a/Makefile.in
-+++ b/Makefile.in
-@@ -515,7 +515,7 @@ ALL_TARGET_OBS = \
- xcoffread.o \
- prologue-value.o \
- symfile-mem.o \
-- corelow.o
-+ corelow.o linux-record.o
-
- # Host-dependent makefile fragment comes in here.
- @host_makefile_frag@
-@@ -1297,7 +1297,7 @@ ALLDEPFILES = \
- inf-ptrace.c inf-ttrace.c \
- irix5-nat.c \
- libunwind-frame.c \
-- linux-fork.c \
-+ linux-fork.c linux-record.c \
- m68hc11-tdep.c \
- m32r-tdep.c \
- m32r-linux-nat.c m32r-linux-tdep.c \
---- a/linux-record.c
+--- a//dev/null
+++ b/linux-record.c
-@@ -0,0 +1,2465 @@
+@@ -0,0 +1,2501 @@
+/* Process record and replay target code for GNU/Linux.
+
+ Copyright (C) 2008 Free Software Foundation, Inc.
@@ -51,7 +31,7 @@
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
-+ the Free Software Foundation; either version 2 of the License, or
++ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
@@ -148,7 +128,7 @@
+ target_terminal_ours ();
+ q =
+ yquery (_
-+ ("The next instruction is syscall exit. It will make the
program exit. Do you want to stop the program."));
++ ("The next instruction is syscall exit. It will make the
program exit. Do you want to stop the program?"));
+ target_terminal_inferior ();
+ if (q)
+ {
@@ -453,13 +433,13 @@
+ else if (tmpu32 == tdep->ioctl_TIOCSERGSTRUCT)
+ {
+ printf_unfiltered (_
-+ ("Record: record and reverse target doesn't support ioctl
request TIOCSERGSTRUCT\n"));
++ ("Process record and replay target doesn't support ioctl
request TIOCSERGSTRUCT\n"));
+ return (1);
+ }
+ else
+ {
+ printf_unfiltered (_
-+ ("Record: record and reverse target doesn't support ioctl
request 0x%08x.\n"),
++ ("Process record and replay target doesn't support ioctl
request 0x%08x.\n"),
+ tmpu32);
+ return (1);
+ }
@@ -616,22 +596,13 @@
+ /* old_select */
+ case 82:
+ {
-+ /*
-+ struct sel_arg_struct {
-+ unsigned long n;
-+ fd_set *inp;
-+ fd_set *outp;
-+ fd_set *exp;
-+ struct timeval *tvp;
-+ };
-+ */
+ struct sel_arg_struct
+ {
-+ uint32_t n;
-+ uint32_t inp;
-+ uint32_t outp;
-+ uint32_t exp;
-+ uint32_t tvp;
++ CORE_ADDR n;
++ CORE_ADDR inp;
++ CORE_ADDR outp;
++ CORE_ADDR exp;
++ CORE_ADDR tvp;
+ } sel;
+
+ regcache_raw_read (record_regcache, tdep->arg1,
@@ -640,9 +611,12 @@
+ {
+ if (target_read_memory (tmpu32, (gdb_byte *) & sel, sizeof (sel)))
+ {
-+ fprintf_unfiltered (gdb_stdlog,
-+ "Record: read memory addr = 0x%s len = %d error.\n",
-+ paddr_nz (tmpu32), sizeof (sel));
++ if (record_debug)
++ {
++ fprintf_unfiltered (gdb_stdlog,
++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
++ paddr_nz (tmpu32), sizeof (sel));
++ }
+ return (-1);
+ }
+ if (record_arch_list_add_mem (sel.inp, tdep->size_fd_set))
@@ -696,7 +670,7 @@
+ target_terminal_ours ();
+ q =
+ yquery (_
-+ ("The next instruction is syscall reboot. It will restart the
computer. Do you want to stop the program."));
++ ("The next instruction is syscall reboot. It will restart the
computer. Do you want to stop the program?"));
+ target_terminal_inferior ();
+ if (q)
+ {
@@ -730,7 +704,7 @@
+ target_terminal_ours ();
+ q =
+ yquery (_
-+ ("The next instruction is syscall munmap. It will free the
memory addr = 0x%s len = %d. It will make record target get error.
Do you want to stop the program."),
++ ("The next instruction is syscall munmap. It will free the
memory addr = 0x%s len = %d. It will make record target get error.
Do you want to stop the program?"),
+ paddr_nz (tmpu32), len);
+ target_terminal_inferior ();
+ if (q)
@@ -792,9 +766,12 @@
+ {
+ if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
+ {
-+ fprintf_unfiltered (gdb_stdlog,
-+ "Record: read memory addr = 0x%s len = %d error.\n",
-+ paddr_nz (tmpu32), sizeof (a));
++ if (record_debug)
++ {
++ fprintf_unfiltered (gdb_stdlog,
++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
++ paddr_nz (tmpu32), sizeof (a));
++ }
+ return (-1);
+ }
+ if (record_arch_list_add_mem (a[1], tdep->size_sockaddr))
@@ -818,9 +795,12 @@
+ {
+ if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
+ {
-+ fprintf_unfiltered (gdb_stdlog,
-+ "Record: read memory addr = 0x%s len = %d error.\n",
-+ paddr_nz (tmpu32), sizeof (a));
++ if (record_debug)
++ {
++ fprintf_unfiltered (gdb_stdlog,
++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
++ paddr_nz (tmpu32), sizeof (a));
++ }
+ return (-1);
+ }
+ if (record_arch_list_add_mem (a[3], tdep->size_int))
@@ -842,9 +822,12 @@
+ {
+ if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
+ {
-+ fprintf_unfiltered (gdb_stdlog,
-+ "Record: read memory addr = 0x%s len = %d error.\n",
-+ paddr_nz (tmpu32), sizeof (a));
++ if (record_debug)
++ {
++ fprintf_unfiltered (gdb_stdlog,
++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
++ paddr_nz (tmpu32), sizeof (a));
++ }
+ return (-1);
+ }
+ if (a[2])
@@ -852,9 +835,12 @@
+ if (target_read_memory
+ (a[2], (gdb_byte *) & (a[2]), sizeof (a[2])))
+ {
-+ fprintf_unfiltered (gdb_stdlog,
-+ "Record: read memory addr = 0x%s len = %d error.\n",
-+ paddr_nz (a[2]), sizeof (a[2]));
++ if (record_debug)
++ {
++ fprintf_unfiltered (gdb_stdlog,
++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
++ paddr_nz (a[2]), sizeof (a[2]));
++ }
+ return (-1);
+ }
+ if (record_arch_list_add_mem (a[1], a[2]))
@@ -874,9 +860,12 @@
+ {
+ if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
+ {
-+ fprintf_unfiltered (gdb_stdlog,
-+ "Record: read memory addr = 0x%s len = %d error.\n",
-+ paddr_nz (tmpu32), sizeof (a));
++ if (record_debug)
++ {
++ fprintf_unfiltered (gdb_stdlog,
++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
++ paddr_nz (tmpu32), sizeof (a));
++ }
+ return (-1);
+ }
+ if (a[2])
@@ -884,9 +873,13 @@
+ if (target_read_memory
+ (a[2], (gdb_byte *) & (a[2]), sizeof (a[2])))
+ {
-+ fprintf_unfiltered (gdb_stdlog,
-+ "Record: read memory addr = 0x%s len = %d error.\n",
-+ paddr_nz (a[2]), sizeof (a[2]));
++ if (record_debug)
++ {
++ fprintf_unfiltered (gdb_stdlog,
++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
++ paddr_nz (a[2]),
++ sizeof (a[2]));
++ }
+ return (-1);
+ }
+ if (record_arch_list_add_mem (a[1], a[2]))
@@ -919,9 +912,12 @@
+ {
+ if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
+ {
-+ fprintf_unfiltered (gdb_stdlog,
-+ "Record: read memory addr = 0x%s len = %d error.\n",
-+ paddr_nz (tmpu32), sizeof (a));
++ if (record_debug)
++ {
++ fprintf_unfiltered (gdb_stdlog,
++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
++ paddr_nz (tmpu32), sizeof (a));
++ }
+ return (-1);
+ }
+ if (a[4])
@@ -929,9 +925,12 @@
+ if (target_read_memory
+ (a[4], (gdb_byte *) & av, sizeof (av)))
+ {
-+ fprintf_unfiltered (gdb_stdlog,
-+ "Record: read memory addr = 0x%s len = %d error.\n",
-+ paddr_nz (a[4]), sizeof (av));
++ if (record_debug)
++ {
++ fprintf_unfiltered (gdb_stdlog,
++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
++ paddr_nz (a[4]), sizeof (av));
++ }
+ return (-1);
+ }
+ if (record_arch_list_add_mem (a[3], av))
@@ -973,9 +972,12 @@
+ {
+ if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
+ {
-+ fprintf_unfiltered (gdb_stdlog,
-+ "Record: read memory addr = 0x%s len = %d error.\n",
-+ paddr_nz (tmpu32), sizeof (a));
++ if (record_debug)
++ {
++ fprintf_unfiltered (gdb_stdlog,
++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
++ paddr_nz (tmpu32), sizeof (a));
++ }
+ return (-1);
+ }
+ if (record_arch_list_add_mem (a[1], tdep->size_msghdr))
@@ -987,9 +989,13 @@
+ if (target_read_memory
+ (a[1], (gdb_byte *) & rec, sizeof (rec)))
+ {
-+ fprintf_unfiltered (gdb_stdlog,
-+ "Record: read memory addr = 0x%s len = %d error.\n",
-+ paddr_nz (a[1]), sizeof (rec));
++ if (record_debug)
++ {
++ fprintf_unfiltered (gdb_stdlog,
++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
++ paddr_nz (a[1]),
++ sizeof (rec));
++ }
+ return (-1);
+ }
+ if (record_arch_list_add_mem
@@ -1010,10 +1016,14 @@
+ (rec.msg_iov, (gdb_byte *) & iov,
+ sizeof (iov)))
+ {
-+ fprintf_unfiltered (gdb_stdlog,
-+ "Record: read memory addr = 0x%s len = %d error.\n",
-+ paddr_nz (rec.msg_iov),
-+ sizeof (iov));
++ if (record_debug)
++ {
++ fprintf_unfiltered (gdb_stdlog,
++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
++ paddr_nz (rec.
++ msg_iov),
++ sizeof (iov));
++ }
+ return (-1);
+ }
+ if (record_arch_list_add_mem
@@ -1030,7 +1040,7 @@
+ break;
+ default:
+ printf_unfiltered (_
-+ ("Record: record and reverse function doesn't support
socketcall call 0x%08x\n"),
++ ("Process record and replay target doesn't support
socketcall call 0x%08x\n"),
+ tmpu32);
+ return (-1);
+ break;
@@ -1378,10 +1388,13 @@
+ if (target_read_memory
+ (vec, (gdb_byte *) & iov, sizeof (struct record_iovec)))
+ {
-+ fprintf_unfiltered (gdb_stdlog,
-+ "Record: read memory addr = 0x%s len = %d error.\n",
-+ paddr_nz (vec),
-+ sizeof (struct record_iovec));
++ if (record_debug)
++ {
++ fprintf_unfiltered (gdb_stdlog,
++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
++ paddr_nz (vec),
++ sizeof (struct record_iovec));
++ }
+ return (-1);
+ }
+ if (record_arch_list_add_mem (iov.iov_base, iov.iov_len))
@@ -2016,9 +2029,12 @@
+ if (target_read_memory
+ (tmpu32, (gdb_byte *) iocbp, nr * tdep->size_int))
+ {
-+ fprintf_unfiltered (gdb_stdlog,
-+ "Record: read memory addr = 0x%s len = %d error.\n",
-+ paddr_nz (tmpu32), nr * tdep->size_int);
++ if (record_debug)
++ {
++ fprintf_unfiltered (gdb_stdlog,
++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
++ paddr_nz (tmpu32), nr * tdep->size_int);
++ }
+ return (-1);
+ }
+ for (i = 0; i < nr; i++)
@@ -2053,7 +2069,7 @@
+ target_terminal_ours ();
+ q =
+ yquery (_
-+ ("The next instruction is syscall exit_group. It will make the
program exit. Do you want to stop the program."));
++ ("The next instruction is syscall exit_group. It will make the
program exit. Do you want to stop the program?"));
+ target_terminal_inferior ();
+ if (q)
+ {
@@ -2500,7 +2516,7 @@
+
+ default:
+ printf_unfiltered (_
-+ ("Record: record and reverse function doesn't support syscall
number 0x%08x\n"),
++ ("Process record and replay target doesn't support syscall
number 0x%08x\n"),
+ tmpu32);
+ return (-1);
+ break;
@@ -2508,7 +2524,7 @@
+
+ return (0);
+}
---- a/linux-record.h
+--- a//dev/null
+++ b/linux-record.h
@@ -0,0 +1,171 @@
+/* Process record and replay target code for GNU/Linux.
@@ -2519,7 +2535,7 @@
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
-+ the Free Software Foundation; either version 2 of the License, or
++ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
@@ -2535,7 +2551,7 @@
+
+typedef struct linux_record_tdep_s
+{
-+ /* The size of the type that will be use in system call. */
++ /* The size of the type that will be use in system call. */
+ int size__old_kernel_stat;
+ int size_tms;
+ int size_loff_t;
@@ -2604,7 +2620,7 @@
+ int size_serial_icounter_struct;
+ int size_hayes_esp_config;
+
-+ /* the values of the second argument of system call "sys_ioctl". */
++ /* the values of the second argument of system call "sys_ioctl". */
+ int ioctl_TCGETS;
+ int ioctl_TCSETS;
+ int ioctl_TCSETSW;
@@ -2671,7 +2687,7 @@
+ int ioctl_TIOCSHAYESESP;
+ int ioctl_FIOQSIZE;
+
-+ /* The number of the registers that use to be the arguments of
system call. */
++ /* The number of the registers that use to be the arguments of
system call. */
+ int arg1;
+ int arg2;
+ int arg3;
@@ -2682,3 +2698,23 @@
+extern int record_linux_system_call (int num, linux_record_tdep_t * tdep);
+
+#endif /* _LINUX_RECORD_H_ */
+--- a/Makefile.in
++++ b/Makefile.in
+@@ -515,7 +515,7 @@
+ xcoffread.o \
+ prologue-value.o \
+ symfile-mem.o \
+- corelow.o
++ corelow.o linux-record.o
+
+ # Host-dependent makefile fragment comes in here.
+ @host_makefile_frag@
+@@ -1297,7 +1297,7 @@
+ inf-ptrace.c inf-ttrace.c \
+ irix5-nat.c \
+ libunwind-frame.c \
+- linux-fork.c \
++ linux-fork.c linux-record.c \
[-- Attachment #2: 5-linux-record.txt --]
[-- Type: text/plain, Size: 66408 bytes --]
--- a/configure.tgt
+++ b/configure.tgt
@@ -185,7 +185,8 @@
i[34567]86-*-linux*)
# Target: Intel 386 running GNU/Linux
gdb_target_obs="i386-tdep.o i386-linux-tdep.o glibc-tdep.o i387-tdep.o \
- solib.o solib-svr4.o symfile-mem.o corelow.o"
+ solib.o solib-svr4.o symfile-mem.o corelow.o \
+ linux-record.o"
build_gdbserver=yes
;;
i[34567]86-*-gnu*)
@@ -508,7 +509,8 @@
# Target: GNU/Linux x86-64
gdb_target_obs="amd64-tdep.o amd64-linux-tdep.o i386-tdep.o \
i387-tdep.o i386-linux-tdep.o glibc-tdep.o \
- solib.o solib-svr4.o corelow.o symfile-mem.o"
+ solib.o solib-svr4.o corelow.o symfile-mem.o \
+ linux-record.o"
build_gdbserver=yes
;;
x86_64-*-freebsd* | x86_64-*-kfreebsd*-gnu)
--- a//dev/null
+++ b/linux-record.c
@@ -0,0 +1,2501 @@
+/* Process record and replay target code for GNU/Linux.
+
+ Copyright (C) 2008 Free Software Foundation, Inc.
+
+ This file is part of GDB.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "defs.h"
+#include "target.h"
+#include "regcache.h"
+#include "record.h"
+#include "linux-record.h"
+#include <stdint.h>
+
+/* These macros are the values of the first argument of system call
+ "sys_ptrace". The values of these macros are gotten from Linux Kernel
+ source. */
+
+#define RECORD_PTRACE_PEEKTEXT 1
+#define RECORD_PTRACE_PEEKDATA 2
+#define RECORD_PTRACE_PEEKUSR 3
+
+/* These macros are the values of the first argument of system call
+ "sys_socketcall". The values of these macros are gotten from Linux Kernel
+ source. */
+
+#define RECORD_SYS_SOCKET 1
+#define RECORD_SYS_BIND 2
+#define RECORD_SYS_CONNECT 3
+#define RECORD_SYS_LISTEN 4
+#define RECORD_SYS_ACCEPT 5
+#define RECORD_SYS_GETSOCKNAME 6
+#define RECORD_SYS_GETPEERNAME 7
+#define RECORD_SYS_SOCKETPAIR 8
+#define RECORD_SYS_SEND 9
+#define RECORD_SYS_RECV 10
+#define RECORD_SYS_SENDTO 11
+#define RECORD_SYS_RECVFROM 12
+#define RECORD_SYS_SHUTDOWN 13
+#define RECORD_SYS_SETSOCKOPT 14
+#define RECORD_SYS_GETSOCKOPT 15
+#define RECORD_SYS_SENDMSG 16
+#define RECORD_SYS_RECVMSG 17
+
+/* These macros are the values of the first argument of system call
+ "sys_ipc". The values of these macros are gotten from Linux Kernel source.
+ */
+
+#define RECORD_SEMOP 1
+#define RECORD_SEMGET 2
+#define RECORD_SEMCTL 3
+#define RECORD_SEMTIMEDOP 4
+#define RECORD_MSGSND 11
+#define RECORD_MSGRCV 12
+#define RECORD_MSGGET 13
+#define RECORD_MSGCTL 14
+#define RECORD_SHMAT 21
+#define RECORD_SHMDT 22
+#define RECORD_SHMGET 23
+#define RECORD_SHMCTL 24
+
+/* These macros are the values of the first argument of system call
+ "sys_quotactl". The values of these macros are gotten from Linux Kernel
+ source. */
+
+#define RECORD_Q_GETFMT 0x800004
+#define RECORD_Q_GETINFO 0x800005
+#define RECORD_Q_GETQUOTA 0x800007
+#define RECORD_Q_XGETQSTAT (('5'<<8)+(5))
+#define RECORD_Q_XGETQUOTA (('3'<<8)+(3))
+
+/* Record the values of the registers and memory that will be changed in
+ current system call.
+ Return -1 if something wrong. */
+
+int
+record_linux_system_call (int num, linux_record_tdep_t * tdep)
+{
+ uint32_t tmpu32;
+
+ switch (num)
+ {
+ /* sys_restart_syscall */
+ case 0:
+ break;
+
+ /* sys_exit */
+ case 1:
+ {
+ int q;
+ target_terminal_ours ();
+ q =
+ yquery (_
+ ("The next instruction is syscall exit. It will make the program exit. Do you want to stop the program?"));
+ target_terminal_inferior ();
+ if (q)
+ {
+ return (1);
+ }
+ }
+ break;
+
+ /* sys_fork */
+ case 2:
+ break;
+
+ /* sys_read */
+ case 3:
+ {
+ uint32_t addr, count;
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & addr);
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & count);
+ if (record_arch_list_add_mem (addr, count))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_write */
+ case 4:
+ /* sys_open */
+ case 5:
+ /* sys_close */
+ case 6:
+ /* sys_waitpid */
+ case 7:
+ /* sys_creat */
+ case 8:
+ /* sys_link */
+ case 9:
+ /* sys_unlink */
+ case 10:
+ /* sys_execve */
+ case 11:
+ /* sys_chdir */
+ case 12:
+ /* sys_time */
+ case 13:
+ /* sys_mknod */
+ case 14:
+ /* sys_chmod */
+ case 15:
+ /* sys_lchown16 */
+ case 16:
+ /* sys_ni_syscall */
+ case 17:
+ break;
+
+ /* sys_stat */
+ case 18:
+ /* sys_fstat */
+ case 28:
+ /* sys_lstat */
+ case 84:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size__old_kernel_stat))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_lseek */
+ case 19:
+ /* sys_getpid */
+ case 20:
+ /* sys_mount */
+ case 21:
+ /* sys_oldumount */
+ case 22:
+ /* sys_setuid16 */
+ case 23:
+ /* sys_getuid16 */
+ case 24:
+ /* sys_stime */
+ case 25:
+ break;
+
+ /* sys_ptrace */
+ case 26:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (tmpu32 == RECORD_PTRACE_PEEKTEXT
+ || tmpu32 == RECORD_PTRACE_PEEKDATA
+ || tmpu32 == RECORD_PTRACE_PEEKUSR)
+ {
+ regcache_raw_read (record_regcache, tdep->arg4,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, 4))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_alarm */
+ case 27:
+ /* sys_pause */
+ case 29:
+ /* sys_utime */
+ case 30:
+ /* sys_ni_syscall */
+ case 31:
+ /* sys_ni_syscall */
+ case 32:
+ /* sys_access */
+ case 33:
+ /* sys_nice */
+ case 34:
+ /* sys_ni_syscall */
+ case 35:
+ /* sys_sync */
+ case 36:
+ /* sys_kill */
+ case 37:
+ /* sys_rename */
+ case 38:
+ /* sys_mkdir */
+ case 39:
+ /* sys_rmdir */
+ case 40:
+ /* sys_dup */
+ case 41:
+ /* sys_pipe */
+ case 42:
+ break;
+
+ /* sys_times */
+ case 43:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_tms))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_ni_syscall */
+ case 44:
+ /* sys_brk */
+ case 45:
+ /* sys_setgid16 */
+ case 46:
+ /* sys_getgid16 */
+ case 47:
+ /* sys_signal */
+ case 48:
+ /* sys_geteuid16 */
+ case 49:
+ /* sys_getegid16 */
+ case 50:
+ /* sys_acct */
+ case 51:
+ /* sys_umount */
+ case 52:
+ /* sys_ni_syscall */
+ case 53:
+ break;
+
+ /* sys_ioctl */
+ case 54:
+ /* XXX there need add a lot of support of other ioctl requests. */
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (tmpu32 == tdep->ioctl_FIOCLEX || tmpu32 == tdep->ioctl_FIONCLEX
+ || tmpu32 == tdep->ioctl_FIONBIO || tmpu32 == tdep->ioctl_FIOASYNC
+ || tmpu32 == tdep->ioctl_TCSETS || tmpu32 == tdep->ioctl_TCSETSW
+ || tmpu32 == tdep->ioctl_TCSETSF || tmpu32 == tdep->ioctl_TCSETA
+ || tmpu32 == tdep->ioctl_TCSETAW || tmpu32 == tdep->ioctl_TCSETAF
+ || tmpu32 == tdep->ioctl_TCSBRK || tmpu32 == tdep->ioctl_TCXONC
+ || tmpu32 == tdep->ioctl_TCFLSH || tmpu32 == tdep->ioctl_TIOCEXCL
+ || tmpu32 == tdep->ioctl_TIOCNXCL
+ || tmpu32 == tdep->ioctl_TIOCSCTTY
+ || tmpu32 == tdep->ioctl_TIOCSPGRP || tmpu32 == tdep->ioctl_TIOCSTI
+ || tmpu32 == tdep->ioctl_TIOCSWINSZ
+ || tmpu32 == tdep->ioctl_TIOCMBIS || tmpu32 == tdep->ioctl_TIOCMBIC
+ || tmpu32 == tdep->ioctl_TIOCMSET
+ || tmpu32 == tdep->ioctl_TIOCSSOFTCAR
+ || tmpu32 == tdep->ioctl_TIOCCONS
+ || tmpu32 == tdep->ioctl_TIOCSSERIAL
+ || tmpu32 == tdep->ioctl_TIOCPKT || tmpu32 == tdep->ioctl_TIOCNOTTY
+ || tmpu32 == tdep->ioctl_TIOCSETD || tmpu32 == tdep->ioctl_TCSBRKP
+ || tmpu32 == tdep->ioctl_TIOCTTYGSTRUCT
+ || tmpu32 == tdep->ioctl_TIOCSBRK || tmpu32 == tdep->ioctl_TIOCCBRK
+ || tmpu32 == tdep->ioctl_TCSETS2 || tmpu32 == tdep->ioctl_TCSETSW2
+ || tmpu32 == tdep->ioctl_TCSETSF2
+ || tmpu32 == tdep->ioctl_TIOCSPTLCK
+ || tmpu32 == tdep->ioctl_TIOCSERCONFIG
+ || tmpu32 == tdep->ioctl_TIOCSERGWILD
+ || tmpu32 == tdep->ioctl_TIOCSERSWILD
+ || tmpu32 == tdep->ioctl_TIOCSLCKTRMIOS
+ || tmpu32 == tdep->ioctl_TIOCSERGETMULTI
+ || tmpu32 == tdep->ioctl_TIOCSERSETMULTI
+ || tmpu32 == tdep->ioctl_TIOCMIWAIT
+ || tmpu32 == tdep->ioctl_TIOCSHAYESESP)
+ {
+ /* Nothing to do. */
+ }
+ else if (tmpu32 == tdep->ioctl_TCGETS || tmpu32 == tdep->ioctl_TCGETA
+ || tmpu32 == tdep->ioctl_TIOCGLCKTRMIOS)
+ {
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_termios))
+ {
+ return (-1);
+ }
+ }
+ else if (tmpu32 == tdep->ioctl_TIOCGPGRP
+ || tmpu32 == tdep->ioctl_TIOCGSID)
+ {
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_pid_t))
+ {
+ return (-1);
+ }
+ }
+ else if (tmpu32 == tdep->ioctl_TIOCOUTQ
+ || tmpu32 == tdep->ioctl_TIOCMGET
+ || tmpu32 == tdep->ioctl_TIOCGSOFTCAR
+ || tmpu32 == tdep->ioctl_FIONREAD
+ || tmpu32 == tdep->ioctl_TIOCINQ
+ || tmpu32 == tdep->ioctl_TIOCGETD
+ || tmpu32 == tdep->ioctl_TIOCGPTN
+ || tmpu32 == tdep->ioctl_TIOCSERGETLSR)
+ {
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_int))
+ {
+ return (-1);
+ }
+ }
+ else if (tmpu32 == tdep->ioctl_TIOCGWINSZ)
+ {
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_winsize))
+ {
+ return (-1);
+ }
+ }
+ else if (tmpu32 == tdep->ioctl_TIOCLINUX)
+ {
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_char))
+ {
+ return (-1);
+ }
+ }
+ else if (tmpu32 == tdep->ioctl_TIOCGSERIAL)
+ {
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_serial_struct))
+ {
+ return (-1);
+ }
+ }
+ else if (tmpu32 == tdep->ioctl_TCGETS2)
+ {
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_termios2))
+ {
+ return (-1);
+ }
+ }
+ else if (tmpu32 == tdep->ioctl_FIOQSIZE)
+ {
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_loff_t))
+ {
+ return (-1);
+ }
+ }
+ else if (tmpu32 == tdep->ioctl_TIOCGICOUNT)
+ {
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem
+ (tmpu32, tdep->size_serial_icounter_struct))
+ {
+ return (-1);
+ }
+ }
+ else if (tmpu32 == tdep->ioctl_TIOCGHAYESESP)
+ {
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_hayes_esp_config))
+ {
+ return (-1);
+ }
+ }
+ else if (tmpu32 == tdep->ioctl_TIOCSERGSTRUCT)
+ {
+ printf_unfiltered (_
+ ("Process record and replay target doesn't support ioctl request TIOCSERGSTRUCT\n"));
+ return (1);
+ }
+ else
+ {
+ printf_unfiltered (_
+ ("Process record and replay target doesn't support ioctl request 0x%08x.\n"),
+ tmpu32);
+ return (1);
+ }
+ break;
+
+ /* sys_fcntl */
+ case 55:
+ /* XXX */
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ sys_fcntl:
+ if (tmpu32 == F_GETLK)
+ {
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_flock))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_ni_syscall */
+ case 56:
+ /* sys_setpgid */
+ case 57:
+ /* sys_ni_syscall */
+ case 58:
+ break;
+
+ /* sys_olduname */
+ case 59:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_oldold_utsname))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_umask */
+ case 60:
+ /* sys_chroot */
+ case 61:
+ break;
+
+ /* sys_ustat */
+ case 62:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_ustat))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_dup2 */
+ case 63:
+ /* sys_getppid */
+ case 64:
+ /* sys_getpgrp */
+ case 65:
+ /* sys_setsid */
+ case 66:
+ break;
+
+ /* sys_sigaction */
+ case 67:
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_old_sigaction))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_sgetmask */
+ case 68:
+ /* sys_ssetmask */
+ case 69:
+ /* sys_setreuid16 */
+ case 70:
+ /* sys_setregid16 */
+ case 71:
+ /* sys_sigsuspend */
+ case 72:
+ break;
+
+ /* sys_sigpending */
+ case 73:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_old_sigset_t))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_sethostname */
+ case 74:
+ /* sys_setrlimit */
+ case 75:
+ break;
+
+ /* sys_old_getrlimit */
+ case 76:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_rlimit))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_getrusage */
+ case 77:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_rusage))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_gettimeofday */
+ case 78:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_timeval))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_timezone))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_settimeofday */
+ case 79:
+ break;
+
+ /* sys_getgroups16 */
+ case 80:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_old_gid_t))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_setgroups16 */
+ case 81:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_old_gid_t))
+ {
+ return (-1);
+ }
+ break;
+
+ /* old_select */
+ case 82:
+ {
+ struct sel_arg_struct
+ {
+ CORE_ADDR n;
+ CORE_ADDR inp;
+ CORE_ADDR outp;
+ CORE_ADDR exp;
+ CORE_ADDR tvp;
+ } sel;
+
+ regcache_raw_read (record_regcache, tdep->arg1,
+ (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ if (target_read_memory (tmpu32, (gdb_byte *) & sel, sizeof (sel)))
+ {
+ if (record_debug)
+ {
+ fprintf_unfiltered (gdb_stdlog,
+ "Process record: error reading memory at addr = 0x%s len = %d.\n",
+ paddr_nz (tmpu32), sizeof (sel));
+ }
+ return (-1);
+ }
+ if (record_arch_list_add_mem (sel.inp, tdep->size_fd_set))
+ {
+ return (-1);
+ }
+ if (record_arch_list_add_mem (sel.outp, tdep->size_fd_set))
+ {
+ return (-1);
+ }
+ if (record_arch_list_add_mem (sel.exp, tdep->size_fd_set))
+ {
+ return (-1);
+ }
+ if (record_arch_list_add_mem (sel.tvp, tdep->size_timeval))
+ {
+ return (-1);
+ }
+ }
+ }
+ break;
+
+ /* sys_symlink */
+ case 83:
+ break;
+
+ /* sys_readlink */
+ case 85:
+ {
+ uint32_t len;
+ regcache_raw_read (record_regcache, tdep->arg2,
+ (gdb_byte *) & tmpu32);
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & len);
+ if (record_arch_list_add_mem (tmpu32, len))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_uselib */
+ case 86:
+ /* sys_swapon */
+ case 87:
+ break;
+
+ /* sys_reboot */
+ case 88:
+ {
+ int q;
+ target_terminal_ours ();
+ q =
+ yquery (_
+ ("The next instruction is syscall reboot. It will restart the computer. Do you want to stop the program?"));
+ target_terminal_inferior ();
+ if (q)
+ {
+ return (1);
+ }
+ }
+ break;
+
+ /* old_readdir */
+ case 89:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_dirent))
+ {
+ return (-1);
+ }
+ break;
+
+ /* old_mmap */
+ case 90:
+ break;
+
+ /* sys_munmap */
+ case 91:
+ {
+ int q;
+ uint32_t len;
+
+ regcache_raw_read (record_regcache, tdep->arg1,
+ (gdb_byte *) & tmpu32);
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & len);
+ target_terminal_ours ();
+ q =
+ yquery (_
+ ("The next instruction is syscall munmap. It will free the memory addr = 0x%s len = %d. It will make record target get error. Do you want to stop the program?"),
+ paddr_nz (tmpu32), len);
+ target_terminal_inferior ();
+ if (q)
+ {
+ return (1);
+ }
+ }
+ break;
+
+ /* sys_truncate */
+ case 92:
+ /* sys_ftruncate */
+ case 93:
+ /* sys_fchmod */
+ case 94:
+ /* sys_fchown16 */
+ case 95:
+ /* sys_getpriority */
+ case 96:
+ /* sys_setpriority */
+ case 97:
+ /* sys_ni_syscall */
+ case 98:
+ break;
+
+ /* sys_statfs */
+ case 99:
+ /* sys_fstatfs */
+ case 100:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_statfs))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_ioperm */
+ case 101:
+ break;
+
+ /* sys_socketcall */
+ case 102:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ switch (tmpu32)
+ {
+ case RECORD_SYS_SOCKET:
+ case RECORD_SYS_BIND:
+ case RECORD_SYS_CONNECT:
+ case RECORD_SYS_LISTEN:
+ break;
+ case RECORD_SYS_ACCEPT:
+ case RECORD_SYS_GETSOCKNAME:
+ case RECORD_SYS_GETPEERNAME:
+ {
+ uint32_t a[3];
+ regcache_raw_read (record_regcache, tdep->arg2,
+ (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
+ {
+ if (record_debug)
+ {
+ fprintf_unfiltered (gdb_stdlog,
+ "Process record: error reading memory at addr = 0x%s len = %d.\n",
+ paddr_nz (tmpu32), sizeof (a));
+ }
+ return (-1);
+ }
+ if (record_arch_list_add_mem (a[1], tdep->size_sockaddr))
+ {
+ return (-1);
+ }
+ if (record_arch_list_add_mem (a[2], tdep->size_int))
+ {
+ return (-1);
+ }
+ }
+ }
+ break;
+
+ case RECORD_SYS_SOCKETPAIR:
+ {
+ uint32_t a[4];
+ regcache_raw_read (record_regcache, tdep->arg2,
+ (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
+ {
+ if (record_debug)
+ {
+ fprintf_unfiltered (gdb_stdlog,
+ "Process record: error reading memory at addr = 0x%s len = %d.\n",
+ paddr_nz (tmpu32), sizeof (a));
+ }
+ return (-1);
+ }
+ if (record_arch_list_add_mem (a[3], tdep->size_int))
+ {
+ return (-1);
+ }
+ }
+ }
+ break;
+ case RECORD_SYS_SEND:
+ case RECORD_SYS_SENDTO:
+ break;
+ case RECORD_SYS_RECV:
+ {
+ uint32_t a[3];
+ regcache_raw_read (record_regcache, tdep->arg2,
+ (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
+ {
+ if (record_debug)
+ {
+ fprintf_unfiltered (gdb_stdlog,
+ "Process record: error reading memory at addr = 0x%s len = %d.\n",
+ paddr_nz (tmpu32), sizeof (a));
+ }
+ return (-1);
+ }
+ if (a[2])
+ {
+ if (target_read_memory
+ (a[2], (gdb_byte *) & (a[2]), sizeof (a[2])))
+ {
+ if (record_debug)
+ {
+ fprintf_unfiltered (gdb_stdlog,
+ "Process record: error reading memory at addr = 0x%s len = %d.\n",
+ paddr_nz (a[2]), sizeof (a[2]));
+ }
+ return (-1);
+ }
+ if (record_arch_list_add_mem (a[1], a[2]))
+ {
+ return (-1);
+ }
+ }
+ }
+ }
+ break;
+ case RECORD_SYS_RECVFROM:
+ {
+ uint32_t a[6];
+ regcache_raw_read (record_regcache, tdep->arg2,
+ (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
+ {
+ if (record_debug)
+ {
+ fprintf_unfiltered (gdb_stdlog,
+ "Process record: error reading memory at addr = 0x%s len = %d.\n",
+ paddr_nz (tmpu32), sizeof (a));
+ }
+ return (-1);
+ }
+ if (a[2])
+ {
+ if (target_read_memory
+ (a[2], (gdb_byte *) & (a[2]), sizeof (a[2])))
+ {
+ if (record_debug)
+ {
+ fprintf_unfiltered (gdb_stdlog,
+ "Process record: error reading memory at addr = 0x%s len = %d.\n",
+ paddr_nz (a[2]),
+ sizeof (a[2]));
+ }
+ return (-1);
+ }
+ if (record_arch_list_add_mem (a[1], a[2]))
+ {
+ return (-1);
+ }
+ if (record_arch_list_add_mem (a[4], tdep->size_sockaddr))
+ {
+ return (-1);
+ }
+ if (record_arch_list_add_mem (a[5], tdep->size_int))
+ {
+ return (-1);
+ }
+ }
+ }
+ }
+ break;
+ case RECORD_SYS_SHUTDOWN:
+ case RECORD_SYS_SETSOCKOPT:
+ break;
+ case RECORD_SYS_GETSOCKOPT:
+ {
+ uint32_t a[5];
+ uint32_t av;
+
+ regcache_raw_read (record_regcache, tdep->arg2,
+ (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
+ {
+ if (record_debug)
+ {
+ fprintf_unfiltered (gdb_stdlog,
+ "Process record: error reading memory at addr = 0x%s len = %d.\n",
+ paddr_nz (tmpu32), sizeof (a));
+ }
+ return (-1);
+ }
+ if (a[4])
+ {
+ if (target_read_memory
+ (a[4], (gdb_byte *) & av, sizeof (av)))
+ {
+ if (record_debug)
+ {
+ fprintf_unfiltered (gdb_stdlog,
+ "Process record: error reading memory at addr = 0x%s len = %d.\n",
+ paddr_nz (a[4]), sizeof (av));
+ }
+ return (-1);
+ }
+ if (record_arch_list_add_mem (a[3], av))
+ {
+ return (-1);
+ }
+ if (record_arch_list_add_mem (a[4], tdep->size_int))
+ {
+ return (-1);
+ }
+ }
+ }
+ }
+ break;
+ case RECORD_SYS_SENDMSG:
+ break;
+ case RECORD_SYS_RECVMSG:
+ {
+ uint32_t a[2], i;
+ struct record_msghdr
+ {
+ uint32_t msg_name;
+ uint32_t msg_namelen;
+ uint32_t msg_iov;
+ uint32_t msg_iovlen;
+ uint32_t msg_control;
+ uint32_t msg_controllen;
+ uint32_t msg_flags;
+ } rec;
+ struct record_iovec
+ {
+ uint32_t iov_base;
+ uint32_t iov_len;
+ } iov;
+
+ regcache_raw_read (record_regcache, tdep->arg2,
+ (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
+ {
+ if (record_debug)
+ {
+ fprintf_unfiltered (gdb_stdlog,
+ "Process record: error reading memory at addr = 0x%s len = %d.\n",
+ paddr_nz (tmpu32), sizeof (a));
+ }
+ return (-1);
+ }
+ if (record_arch_list_add_mem (a[1], tdep->size_msghdr))
+ {
+ return (-1);
+ }
+ if (a[1])
+ {
+ if (target_read_memory
+ (a[1], (gdb_byte *) & rec, sizeof (rec)))
+ {
+ if (record_debug)
+ {
+ fprintf_unfiltered (gdb_stdlog,
+ "Process record: error reading memory at addr = 0x%s len = %d.\n",
+ paddr_nz (a[1]),
+ sizeof (rec));
+ }
+ return (-1);
+ }
+ if (record_arch_list_add_mem
+ (rec.msg_name, rec.msg_namelen))
+ {
+ return (-1);
+ }
+ if (record_arch_list_add_mem
+ (rec.msg_control, rec.msg_controllen))
+ {
+ return (-1);
+ }
+ if (rec.msg_iov)
+ {
+ for (i = 0; i < rec.msg_iovlen; i++)
+ {
+ if (target_read_memory
+ (rec.msg_iov, (gdb_byte *) & iov,
+ sizeof (iov)))
+ {
+ if (record_debug)
+ {
+ fprintf_unfiltered (gdb_stdlog,
+ "Process record: error reading memory at addr = 0x%s len = %d.\n",
+ paddr_nz (rec.
+ msg_iov),
+ sizeof (iov));
+ }
+ return (-1);
+ }
+ if (record_arch_list_add_mem
+ (iov.iov_base, iov.iov_len))
+ {
+ return (-1);
+ }
+ rec.msg_iov += sizeof (struct record_iovec);
+ }
+ }
+ }
+ }
+ }
+ break;
+ default:
+ printf_unfiltered (_
+ ("Process record and replay target doesn't support socketcall call 0x%08x\n"),
+ tmpu32);
+ return (-1);
+ break;
+ }
+ break;
+
+ /* sys_syslog */
+ case 103:
+ break;
+
+ /* sys_setitimer */
+ case 104:
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_itimerval))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_getitimer */
+ case 105:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_itimerval))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_newstat */
+ case 106:
+ /* sys_newlstat */
+ case 107:
+ /* sys_newfstat */
+ case 108:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_stat))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_uname */
+ case 109:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_old_utsname))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_iopl */
+ case 110:
+ /* sys_vhangup */
+ case 111:
+ /* sys_ni_syscall */
+ case 112:
+ /* sys_vm86old */
+ case 113:
+ break;
+
+ /* sys_wait4 */
+ case 114:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_int))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg4, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_rusage))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_swapoff */
+ case 115:
+ break;
+
+ /* sys_sysinfo */
+ case 116:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_sysinfo))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_ipc */
+ case 117:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ switch (tmpu32)
+ {
+ case RECORD_MSGRCV:
+ {
+ int32_t second;
+ uint32_t ptr;
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & second);
+ regcache_raw_read (record_regcache, tdep->arg5,
+ (gdb_byte *) & ptr);
+ if (record_arch_list_add_mem (ptr, second + tdep->size_long))
+ {
+ return (-1);
+ }
+ }
+ break;
+ case RECORD_MSGCTL:
+ regcache_raw_read (record_regcache, tdep->arg5,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_msqid_ds))
+ {
+ return (-1);
+ }
+ break;
+ case RECORD_SHMAT:
+ regcache_raw_read (record_regcache, tdep->arg4,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_ulong))
+ {
+ return (-1);
+ }
+ break;
+ case RECORD_SHMCTL:
+ regcache_raw_read (record_regcache, tdep->arg5,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_shmid_ds))
+ {
+ return (-1);
+ }
+ break;
+ }
+ break;
+
+ /* sys_fsync */
+ case 118:
+ /* sys_sigreturn */
+ case 119:
+ /* sys_clone */
+ case 120:
+ /* sys_setdomainname */
+ case 121:
+ break;
+
+ /* sys_newuname */
+ case 122:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_new_utsname))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_modify_ldt */
+ case 123:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (tmpu32 == 0 || tmpu32 == 2)
+ {
+ uint32_t ptr, bytecount;
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & ptr);
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & bytecount);
+ if (record_arch_list_add_mem (ptr, bytecount))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_adjtimex */
+ case 124:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_timex))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_mprotect */
+ case 125:
+ break;
+
+ /* sys_sigprocmask */
+ case 126:
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_old_sigset_t))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_ni_syscall */
+ case 127:
+ /* sys_init_module */
+ case 128:
+ /* sys_delete_module */
+ case 129:
+ /* sys_ni_syscall */
+ case 130:
+ break;
+
+ /* sys_quotactl */
+ case 131:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ switch (tmpu32)
+ {
+ case RECORD_Q_GETFMT:
+ regcache_raw_read (record_regcache, tdep->arg4,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, 4))
+ {
+ return (-1);
+ }
+ break;
+ case RECORD_Q_GETINFO:
+ regcache_raw_read (record_regcache, tdep->arg4,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_mem_dqinfo))
+ {
+ return (-1);
+ }
+ break;
+ case RECORD_Q_GETQUOTA:
+ regcache_raw_read (record_regcache, tdep->arg4,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_if_dqblk))
+ {
+ return (-1);
+ }
+ break;
+ case RECORD_Q_XGETQSTAT:
+ case RECORD_Q_XGETQUOTA:
+ regcache_raw_read (record_regcache, tdep->arg4,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_fs_quota_stat))
+ {
+ return (-1);
+ }
+ break;
+ }
+ break;
+
+ /* sys_getpgid */
+ case 132:
+ /* sys_fchdir */
+ case 133:
+ /* sys_bdflush */
+ case 134:
+ break;
+
+ /* sys_sysfs */
+ case 135:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (tmpu32 == 2)
+ {
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & tmpu32);
+ /*XXX the size of memory is not very clear */
+ if (record_arch_list_add_mem (tmpu32, 10))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_personality */
+ case 136:
+ /* sys_ni_syscall */
+ case 137:
+ /* sys_setfsuid16 */
+ case 138:
+ /* sys_setfsgid16 */
+ case 139:
+ break;
+
+ /* sys_llseek */
+ case 140:
+ regcache_raw_read (record_regcache, tdep->arg4, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_loff_t))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_getdents */
+ case 141:
+ {
+ uint32_t count;
+ regcache_raw_read (record_regcache, tdep->arg2,
+ (gdb_byte *) & tmpu32);
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & count);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_dirent * count))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_select */
+ case 142:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_fd_set))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_fd_set))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg4, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_fd_set))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg5, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_timeval))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_flock */
+ case 143:
+ /* sys_msync */
+ case 144:
+ break;
+
+ /* sys_readv */
+ case 145:
+ {
+ uint32_t vec;
+ uint32_t vlen;
+ struct record_iovec
+ {
+ uint32_t iov_base;
+ uint32_t iov_len;
+ } iov;
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & vec);
+ if (vec)
+ {
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & vlen);
+ for (tmpu32 = 0; tmpu32 < vlen; tmpu32++)
+ {
+ if (target_read_memory
+ (vec, (gdb_byte *) & iov, sizeof (struct record_iovec)))
+ {
+ if (record_debug)
+ {
+ fprintf_unfiltered (gdb_stdlog,
+ "Process record: error reading memory at addr = 0x%s len = %d.\n",
+ paddr_nz (vec),
+ sizeof (struct record_iovec));
+ }
+ return (-1);
+ }
+ if (record_arch_list_add_mem (iov.iov_base, iov.iov_len))
+ {
+ return (-1);
+ }
+ vec += sizeof (struct record_iovec);
+ }
+ }
+ }
+ break;
+
+ /* sys_writev */
+ case 146:
+ /* sys_getsid */
+ case 147:
+ /* sys_fdatasync */
+ case 148:
+ /* sys_sysctl */
+ case 149:
+ /* sys_mlock */
+ case 150:
+ /* sys_munlock */
+ case 151:
+ /* sys_mlockall */
+ case 152:
+ /* sys_munlockall */
+ case 153:
+ /* sys_sched_setparam */
+ case 154:
+ break;
+
+ /* sys_sched_getparam */
+ case 155:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_int))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_sched_setscheduler */
+ case 156:
+ /* sys_sched_getscheduler */
+ case 157:
+ /* sys_sched_yield */
+ case 158:
+ /* sys_sched_get_priority_max */
+ case 159:
+ /* sys_sched_get_priority_min */
+ case 160:
+ break;
+
+ /* sys_sched_rr_get_interval */
+ case 161:
+ /* sys_nanosleep */
+ case 162:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_timespec))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_mremap */
+ case 163:
+ /* sys_setresuid16 */
+ case 164:
+ break;
+
+ /* sys_getresuid16 */
+ case 165:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_old_uid_t))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_old_uid_t))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_old_uid_t))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_vm86 */
+ case 166:
+ /* sys_ni_syscall */
+ case 167:
+ break;
+
+ /* sys_poll */
+ case 168:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ uint32_t nfds;
+ regcache_raw_read (record_regcache, tdep->arg2,
+ (gdb_byte *) & nfds);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_pollfd * nfds))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_nfsservctl */
+ case 169:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (tmpu32 == 7 || tmpu32 == 8)
+ {
+ uint32_t rsize;
+ if (tmpu32 == 7)
+ {
+ rsize = tdep->size_NFS_FHSIZE;
+ }
+ else
+ {
+ rsize = tdep->size_knfsd_fh;
+ }
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, rsize))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_setresgid16 */
+ case 170:
+ break;
+
+ /* sys_getresgid16 */
+ case 171:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_old_gid_t))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_old_gid_t))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_old_gid_t))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_prctl */
+ case 172:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ switch (tmpu32)
+ {
+ case 2:
+ regcache_raw_read (record_regcache, tdep->arg2,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_int))
+ {
+ return (-1);
+ }
+ break;
+ case 16:
+ regcache_raw_read (record_regcache, tdep->arg2,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_TASK_COMM_LEN))
+ {
+ return (-1);
+ }
+ break;
+ }
+ break;
+
+ /* sys_rt_sigreturn */
+ case 173:
+ break;
+
+ /* sys_rt_sigaction */
+ case 174:
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_sigaction))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_rt_sigprocmask */
+ case 175:
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_sigset_t))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_rt_sigpending */
+ case 176:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ uint32_t sigsetsize;
+ regcache_raw_read (record_regcache, tdep->arg2,
+ (gdb_byte *) & sigsetsize);
+ if (record_arch_list_add_mem (tmpu32, sigsetsize))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_rt_sigtimedwait */
+ case 177:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_siginfo_t))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_rt_sigqueueinfo */
+ case 178:
+ /* sys_rt_sigsuspend */
+ case 179:
+ break;
+
+ /* sys_pread64 */
+ case 180:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ uint32_t count;
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & count);
+ if (record_arch_list_add_mem (tmpu32, count))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_pwrite64 */
+ case 181:
+ /* sys_chown16 */
+ case 182:
+ break;
+
+ /* sys_getcwd */
+ case 183:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ uint32_t size;
+ regcache_raw_read (record_regcache, tdep->arg2,
+ (gdb_byte *) & size);
+ if (record_arch_list_add_mem (tmpu32, size))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_capget */
+ case 184:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_cap_user_data_t))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_capset */
+ case 185:
+ break;
+
+ /* sys_sigaltstack */
+ case 186:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_stack_t))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_sendfile */
+ case 187:
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_off_t))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_ni_syscall */
+ case 188:
+ /* sys_ni_syscall */
+ case 189:
+ /* sys_vfork */
+ case 190:
+ break;
+
+ /* sys_getrlimit */
+ case 191:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_rlimit))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_mmap2 */
+ case 192:
+ break;
+
+ /* sys_truncate64 */
+ case 193:
+ /* sys_ftruncate64 */
+ case 194:
+ break;
+
+ /* sys_stat64 */
+ case 195:
+ /* sys_lstat64 */
+ case 196:
+ /* sys_fstat64 */
+ case 197:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_stat64))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_lchown */
+ case 198:
+ /* sys_getuid */
+ case 199:
+ /* sys_getgid */
+ case 200:
+ /* sys_geteuid */
+ case 201:
+ /* sys_getegid */
+ case 202:
+ /* sys_setreuid */
+ case 203:
+ /* sys_setregid */
+ case 204:
+ break;
+
+ /* sys_getgroups */
+ case 205:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ int gidsetsize;
+ regcache_raw_read (record_regcache, tdep->arg1,
+ (gdb_byte *) & gidsetsize);
+ if (record_arch_list_add_mem
+ (tmpu32, tdep->size_gid_t * gidsetsize))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_setgroups */
+ case 206:
+ /* sys_fchown */
+ case 207:
+ /* sys_setresuid */
+ case 208:
+ break;
+
+ /* sys_getresuid */
+ case 209:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_uid_t))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_uid_t))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_uid_t))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_setresgid */
+ case 210:
+ break;
+
+ /* sys_getresgid */
+ case 211:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_gid_t))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_gid_t))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_gid_t))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_chown */
+ case 212:
+ /* sys_setuid */
+ case 213:
+ /* sys_setgid */
+ case 214:
+ /* sys_setfsuid */
+ case 215:
+ /* sys_setfsgid */
+ case 216:
+ /* sys_pivot_root */
+ case 217:
+ break;
+
+ /* sys_mincore */
+ case 218:
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_PAGE_SIZE))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_madvise */
+ case 219:
+ break;
+
+ /* sys_getdents64 */
+ case 220:
+ {
+ uint32_t count;
+ regcache_raw_read (record_regcache, tdep->arg2,
+ (gdb_byte *) & tmpu32);
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & count);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_dirent64 * count))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_fcntl64 */
+ case 221:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ switch (tmpu32)
+ {
+ case F_GETLK64:
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_flock64))
+ {
+ return (-1);
+ }
+ break;
+ case F_SETLK64:
+ case F_SETLKW64:
+ break;
+ default:
+ goto sys_fcntl;
+ break;
+ }
+ break;
+
+ /* sys_ni_syscall */
+ case 222:
+ /* sys_ni_syscall */
+ case 223:
+ /* sys_gettid */
+ case 224:
+ /* sys_readahead */
+ case 225:
+ /* sys_setxattr */
+ case 226:
+ /* sys_lsetxattr */
+ case 227:
+ /* sys_fsetxattr */
+ case 228:
+ break;
+
+ /* sys_getxattr */
+ case 229:
+ /* sys_lgetxattr */
+ case 230:
+ /* sys_fgetxattr */
+ case 231:
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ uint32_t size;
+ regcache_raw_read (record_regcache, tdep->arg4,
+ (gdb_byte *) & size);
+ if (record_arch_list_add_mem (tmpu32, size))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_listxattr */
+ case 232:
+ /* sys_llistxattr */
+ case 233:
+ /* sys_flistxattr */
+ case 234:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ uint32_t size;
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & size);
+ if (record_arch_list_add_mem (tmpu32, size))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_removexattr */
+ case 235:
+ /* sys_lremovexattr */
+ case 236:
+ /* sys_fremovexattr */
+ case 237:
+ /* sys_tkill */
+ case 238:
+ break;
+
+ /* sys_sendfile64 */
+ case 239:
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_loff_t))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_futex */
+ case 240:
+ /* sys_sched_setaffinity */
+ case 241:
+ break;
+
+ /* sys_sched_getaffinity */
+ case 242:
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ uint32_t len;
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & len);
+ if (record_arch_list_add_mem (tmpu32, len))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_set_thread_area */
+ case 243:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_int))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_get_thread_area */
+ case 244:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_user_desc))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_io_setup */
+ case 245:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_long))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_io_destroy */
+ case 246:
+ break;
+
+ /* sys_io_getevents */
+ case 247:
+ regcache_raw_read (record_regcache, tdep->arg4, (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ int32_t nr;
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & nr);
+ if (record_arch_list_add_mem (tmpu32, nr * tdep->size_io_event))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_io_submit */
+ case 248:
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ int32_t i, nr;
+ uint32_t *iocbp;
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & nr);
+ iocbp = (uint32_t *) alloca (nr * tdep->size_int);
+ if (target_read_memory
+ (tmpu32, (gdb_byte *) iocbp, nr * tdep->size_int))
+ {
+ if (record_debug)
+ {
+ fprintf_unfiltered (gdb_stdlog,
+ "Process record: error reading memory at addr = 0x%s len = %d.\n",
+ paddr_nz (tmpu32), nr * tdep->size_int);
+ }
+ return (-1);
+ }
+ for (i = 0; i < nr; i++)
+ {
+ if (record_arch_list_add_mem (iocbp[i], tdep->size_iocb))
+ {
+ return (-1);
+ }
+ }
+ }
+ break;
+
+ /* sys_io_cancel */
+ case 249:
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_io_event))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_fadvise64 */
+ case 250:
+ /* sys_ni_syscall */
+ case 251:
+ break;
+
+ /* sys_exit_group */
+ case 252:
+ {
+ int q;
+ target_terminal_ours ();
+ q =
+ yquery (_
+ ("The next instruction is syscall exit_group. It will make the program exit. Do you want to stop the program?"));
+ target_terminal_inferior ();
+ if (q)
+ {
+ return (1);
+ }
+ }
+ break;
+
+ /* sys_lookup_dcookie */
+ case 253:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ uint32_t len;
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & len);
+ if (record_arch_list_add_mem (tmpu32, len))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_epoll_create */
+ case 254:
+ /* sys_epoll_ctl */
+ case 255:
+ break;
+
+ /* sys_epoll_wait */
+ case 256:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ int32_t maxevents;
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & maxevents);
+ if (record_arch_list_add_mem
+ (tmpu32, maxevents * tdep->size_epoll_event))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_remap_file_pages */
+ case 257:
+ /* sys_set_tid_address */
+ case 258:
+ break;
+
+ /* sys_timer_create */
+ case 259:
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_int))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_timer_settime */
+ case 260:
+ regcache_raw_read (record_regcache, tdep->arg4, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_itimerspec))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_timer_gettime */
+ case 261:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_itimerspec))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_timer_getoverrun */
+ case 262:
+ /* sys_timer_delete */
+ case 263:
+ /* sys_clock_settime */
+ case 264:
+ break;
+
+ /* sys_clock_gettime */
+ case 265:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_timespec))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_clock_getres */
+ case 266:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_timespec))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_clock_nanosleep */
+ case 267:
+ regcache_raw_read (record_regcache, tdep->arg4, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_timespec))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_statfs64 */
+ case 268:
+ /* sys_fstatfs64 */
+ case 269:
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_statfs64))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_tgkill */
+ case 270:
+ /* sys_utimes */
+ case 271:
+ /* sys_fadvise64_64 */
+ case 272:
+ /* sys_ni_syscall */
+ case 273:
+ /* sys_mbind */
+ case 274:
+ break;
+
+ /* sys_get_mempolicy */
+ case 275:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_int))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ uint32_t maxnode;
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & maxnode);
+ if (record_arch_list_add_mem (tmpu32, maxnode * tdep->size_long))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_set_mempolicy */
+ case 276:
+ /* sys_mq_open */
+ case 277:
+ /* sys_mq_unlink */
+ case 278:
+ /* sys_mq_timedsend */
+ case 279:
+ break;
+
+ /* sys_mq_timedreceive */
+ case 280:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ uint32_t msg_len;
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & msg_len);
+ if (record_arch_list_add_mem (tmpu32, msg_len))
+ {
+ return (-1);
+ }
+ }
+ regcache_raw_read (record_regcache, tdep->arg4, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_int))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_mq_notify */
+ case 281:
+ break;
+
+ /* sys_mq_getsetattr */
+ case 282:
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_mq_attr))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_kexec_load */
+ case 283:
+ break;
+
+ /* sys_waitid */
+ case 284:
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_siginfo))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg5, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_rusage))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_ni_syscall */
+ case 285:
+ /* sys_add_key */
+ case 286:
+ /* sys_request_key */
+ case 287:
+ break;
+
+ /* sys_keyctl */
+ case 288:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (tmpu32 == 6 || tmpu32 == 11)
+ {
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ uint32_t buflen;
+ regcache_raw_read (record_regcache, tdep->arg4,
+ (gdb_byte *) & buflen);
+ if (record_arch_list_add_mem (tmpu32, buflen))
+ {
+ return (-1);
+ }
+ }
+ }
+ break;
+
+ /* sys_ioprio_set */
+ case 289:
+ /* sys_ioprio_get */
+ case 290:
+ /* sys_inotify_init */
+ case 291:
+ /* sys_inotify_add_watch */
+ case 292:
+ /* sys_inotify_rm_watch */
+ case 293:
+ /* sys_migrate_pages */
+ case 294:
+ /* sys_openat */
+ case 295:
+ /* sys_mkdirat */
+ case 296:
+ /* sys_mknodat */
+ case 297:
+ /* sys_fchownat */
+ case 298:
+ /* sys_futimesat */
+ case 299:
+ break;
+
+ /* sys_fstatat64 */
+ case 300:
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_stat64))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_unlinkat */
+ case 301:
+ /* sys_renameat */
+ case 302:
+ /* sys_linkat */
+ case 303:
+ /* sys_symlinkat */
+ case 304:
+ break;
+
+ /* sys_readlinkat */
+ case 305:
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ int32_t bufsiz;
+ regcache_raw_read (record_regcache, tdep->arg4,
+ (gdb_byte *) & bufsiz);
+ if (record_arch_list_add_mem (tmpu32, bufsiz))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_fchmodat */
+ case 306:
+ /* sys_faccessat */
+ case 307:
+ break;
+
+ /* sys_pselect6 */
+ case 308:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_fd_set))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_fd_set))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg4, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_fd_set))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg5, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_timespec))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_ppoll */
+ case 309:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ uint32_t nfds;
+ regcache_raw_read (record_regcache, tdep->arg2,
+ (gdb_byte *) & nfds);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_pollfd * nfds))
+ {
+ return (-1);
+ }
+ }
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_timespec))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_unshare */
+ case 310:
+ /* sys_set_robust_list */
+ case 311:
+ break;
+
+ /* sys_get_robust_list */
+ case 312:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_int))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_int))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_splice */
+ case 313:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_loff_t))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg4, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_loff_t))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_sync_file_range */
+ case 314:
+ /* sys_tee */
+ case 315:
+ /* sys_vmsplice */
+ case 316:
+ break;
+
+ /* sys_move_pages */
+ case 317:
+ regcache_raw_read (record_regcache, tdep->arg5, (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ uint32_t nr_pages;
+ regcache_raw_read (record_regcache, tdep->arg2,
+ (gdb_byte *) & nr_pages);
+ if (record_arch_list_add_mem (tmpu32, nr_pages * tdep->size_int))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_getcpu */
+ case 318:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_int))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_int))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_ulong * 2))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_epoll_pwait */
+ case 319:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ int32_t maxevents;
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & maxevents);
+ if (record_arch_list_add_mem
+ (tmpu32, maxevents * tdep->size_epoll_event))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ default:
+ printf_unfiltered (_
+ ("Process record and replay target doesn't support syscall number 0x%08x\n"),
+ tmpu32);
+ return (-1);
+ break;
+ }
+
+ return (0);
+}
--- a//dev/null
+++ b/linux-record.h
@@ -0,0 +1,171 @@
+/* Process record and replay target code for GNU/Linux.
+
+ Copyright (C) 2008 Free Software Foundation, Inc.
+
+ This file is part of GDB.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _LINUX_RECORD_H_
+#define _LINUX_RECORD_H_
+
+typedef struct linux_record_tdep_s
+{
+ /* The size of the type that will be use in system call. */
+ int size__old_kernel_stat;
+ int size_tms;
+ int size_loff_t;
+ int size_flock;
+ int size_oldold_utsname;
+ int size_ustat;
+ int size_old_sigaction;
+ int size_old_sigset_t;
+ int size_rlimit;
+ int size_rusage;
+ int size_timeval;
+ int size_timezone;
+ int size_old_gid_t;
+ int size_old_uid_t;
+ int size_fd_set;
+ int size_dirent;
+ int size_dirent64;
+ int size_statfs;
+ int size_statfs64;
+ int size_sockaddr;
+ int size_int;
+ int size_long;
+ int size_ulong;
+ int size_msghdr;
+ int size_itimerval;
+ int size_stat;
+ int size_old_utsname;
+ int size_sysinfo;
+ int size_msqid_ds;
+ int size_shmid_ds;
+ int size_new_utsname;
+ int size_timex;
+ int size_mem_dqinfo;
+ int size_if_dqblk;
+ int size_fs_quota_stat;
+ int size_timespec;
+ int size_pollfd;
+ int size_NFS_FHSIZE;
+ int size_knfsd_fh;
+ int size_TASK_COMM_LEN;
+ int size_sigaction;
+ int size_sigset_t;
+ int size_siginfo_t;
+ int size_cap_user_data_t;
+ int size_stack_t;
+ int size_off_t;
+ int size_stat64;
+ int size_gid_t;
+ int size_uid_t;
+ int size_PAGE_SIZE;
+ int size_flock64;
+ int size_user_desc;
+ int size_io_event;
+ int size_iocb;
+ int size_epoll_event;
+ int size_itimerspec;
+ int size_mq_attr;
+ int size_siginfo;
+
+ int size_termios;
+ int size_termios2;
+ int size_pid_t;
+ int size_winsize;
+ int size_char;
+ int size_serial_struct;
+ int size_serial_icounter_struct;
+ int size_hayes_esp_config;
+
+ /* the values of the second argument of system call "sys_ioctl". */
+ int ioctl_TCGETS;
+ int ioctl_TCSETS;
+ int ioctl_TCSETSW;
+ int ioctl_TCSETSF;
+ int ioctl_TCGETA;
+ int ioctl_TCSETA;
+ int ioctl_TCSETAW;
+ int ioctl_TCSETAF;
+ int ioctl_TCSBRK;
+ int ioctl_TCXONC;
+ int ioctl_TCFLSH;
+ int ioctl_TIOCEXCL;
+ int ioctl_TIOCNXCL;
+ int ioctl_TIOCSCTTY;
+ int ioctl_TIOCGPGRP;
+ int ioctl_TIOCSPGRP;
+ int ioctl_TIOCOUTQ;
+ int ioctl_TIOCSTI;
+ int ioctl_TIOCGWINSZ;
+ int ioctl_TIOCSWINSZ;
+ int ioctl_TIOCMGET;
+ int ioctl_TIOCMBIS;
+ int ioctl_TIOCMBIC;
+ int ioctl_TIOCMSET;
+ int ioctl_TIOCGSOFTCAR;
+ int ioctl_TIOCSSOFTCAR;
+ int ioctl_FIONREAD;
+ int ioctl_TIOCINQ;
+ int ioctl_TIOCLINUX;
+ int ioctl_TIOCCONS;
+ int ioctl_TIOCGSERIAL;
+ int ioctl_TIOCSSERIAL;
+ int ioctl_TIOCPKT;
+ int ioctl_FIONBIO;
+ int ioctl_TIOCNOTTY;
+ int ioctl_TIOCSETD;
+ int ioctl_TIOCGETD;
+ int ioctl_TCSBRKP;
+ int ioctl_TIOCTTYGSTRUCT;
+ int ioctl_TIOCSBRK;
+ int ioctl_TIOCCBRK;
+ int ioctl_TIOCGSID;
+ int ioctl_TCGETS2;
+ int ioctl_TCSETS2;
+ int ioctl_TCSETSW2;
+ int ioctl_TCSETSF2;
+ int ioctl_TIOCGPTN;
+ int ioctl_TIOCSPTLCK;
+ int ioctl_FIONCLEX;
+ int ioctl_FIOCLEX;
+ int ioctl_FIOASYNC;
+ int ioctl_TIOCSERCONFIG;
+ int ioctl_TIOCSERGWILD;
+ int ioctl_TIOCSERSWILD;
+ int ioctl_TIOCGLCKTRMIOS;
+ int ioctl_TIOCSLCKTRMIOS;
+ int ioctl_TIOCSERGSTRUCT;
+ int ioctl_TIOCSERGETLSR;
+ int ioctl_TIOCSERGETMULTI;
+ int ioctl_TIOCSERSETMULTI;
+ int ioctl_TIOCMIWAIT;
+ int ioctl_TIOCGICOUNT;
+ int ioctl_TIOCGHAYESESP;
+ int ioctl_TIOCSHAYESESP;
+ int ioctl_FIOQSIZE;
+
+ /* The number of the registers that use to be the arguments of system call. */
+ int arg1;
+ int arg2;
+ int arg3;
+ int arg4;
+ int arg5;
+} linux_record_tdep_t;
+
+extern int record_linux_system_call (int num, linux_record_tdep_t * tdep);
+
+#endif /* _LINUX_RECORD_H_ */
--- a/Makefile.in
+++ b/Makefile.in
@@ -515,7 +515,7 @@
xcoffread.o \
prologue-value.o \
symfile-mem.o \
- corelow.o
+ corelow.o linux-record.o
# Host-dependent makefile fragment comes in here.
@host_makefile_frag@
@@ -1297,7 +1297,7 @@
inf-ptrace.c inf-ttrace.c \
irix5-nat.c \
libunwind-frame.c \
- linux-fork.c \
+ linux-fork.c linux-record.c \
m68hc11-tdep.c \
m32r-tdep.c \
m32r-linux-nat.c m32r-linux-tdep.c \
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: [RFA] Resubmit process record and replay, 5/10
2008-11-17 2:18 [RFA] Resubmit process record and replay, 5/10 teawater
@ 2008-11-20 4:22 ` Michael Snyder
2008-11-20 8:33 ` Thiago Jung Bauermann
2008-12-19 7:23 ` teawater
1 sibling, 1 reply; 8+ messages in thread
From: Michael Snyder @ 2008-11-20 4:22 UTC (permalink / raw)
To: teawater; +Cc: gdb-patches, bauerman
Thiago, you had a question about whether the syscall id numbers
were invariant across architectures, and I think Hui answered that
he was using the i386 numbering as representative, and would use
a target-specific header file or something to translate them.
Or something to that effect.
Did that answer your concern?
teawater wrote:
> This patch add process record and replay for Linux support file. The
> main function is "record_linux_system_call" will be called by
> architecture record function. It is used to record the system call
> execute log.
>
> 2008-11-16 Hui Zhu <teawater@gmail.com>
>
> Process record and replay target.
>
> * Makefile.in (linux-record.c): New file.
> * configure.tgt (linux-record.c): New file.
> * linux-record.c, linux-record.h: New file.
>
> Makefile.in | 4
> b/linux-record.c | 2501 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
> b/linux-record.h | 171 +++
> configure.tgt | 6
> 4 files changed, 2678 insertions(+), 4 deletions(-)
>
> Following is the diff with the previous patch:
> @@ -1,6 +1,6 @@
> --- a/configure.tgt
> +++ b/configure.tgt
> -@@ -185,7 +185,8 @@ i[34567]86-*-solaris*)
> +@@ -185,7 +185,8 @@
> i[34567]86-*-linux*)
> # Target: Intel 386 running GNU/Linux
> gdb_target_obs="i386-tdep.o i386-linux-tdep.o glibc-tdep.o i387-tdep.o \
> @@ -10,7 +10,7 @@
> build_gdbserver=yes
> ;;
> i[34567]86-*-gnu*)
> -@@ -507,7 +508,8 @@ x86_64-*-linux*)
> +@@ -508,7 +509,8 @@
> # Target: GNU/Linux x86-64
> gdb_target_obs="amd64-tdep.o amd64-linux-tdep.o i386-tdep.o \
> i387-tdep.o i386-linux-tdep.o glibc-tdep.o \
> @@ -20,29 +20,9 @@
> build_gdbserver=yes
> ;;
> x86_64-*-freebsd* | x86_64-*-kfreebsd*-gnu)
> ---- a/Makefile.in
> -+++ b/Makefile.in
> -@@ -515,7 +515,7 @@ ALL_TARGET_OBS = \
> - xcoffread.o \
> - prologue-value.o \
> - symfile-mem.o \
> -- corelow.o
> -+ corelow.o linux-record.o
> -
> - # Host-dependent makefile fragment comes in here.
> - @host_makefile_frag@
> -@@ -1297,7 +1297,7 @@ ALLDEPFILES = \
> - inf-ptrace.c inf-ttrace.c \
> - irix5-nat.c \
> - libunwind-frame.c \
> -- linux-fork.c \
> -+ linux-fork.c linux-record.c \
> - m68hc11-tdep.c \
> - m32r-tdep.c \
> - m32r-linux-nat.c m32r-linux-tdep.c \
> ---- a/linux-record.c
> +--- a//dev/null
> +++ b/linux-record.c
> -@@ -0,0 +1,2465 @@
> +@@ -0,0 +1,2501 @@
> +/* Process record and replay target code for GNU/Linux.
> +
> + Copyright (C) 2008 Free Software Foundation, Inc.
> @@ -51,7 +31,7 @@
> +
> + This program is free software; you can redistribute it and/or modify
> + it under the terms of the GNU General Public License as published by
> -+ the Free Software Foundation; either version 2 of the License, or
> ++ the Free Software Foundation; either version 3 of the License, or
> + (at your option) any later version.
> +
> + This program is distributed in the hope that it will be useful,
> @@ -148,7 +128,7 @@
> + target_terminal_ours ();
> + q =
> + yquery (_
> -+ ("The next instruction is syscall exit. It will make the
> program exit. Do you want to stop the program."));
> ++ ("The next instruction is syscall exit. It will make the
> program exit. Do you want to stop the program?"));
> + target_terminal_inferior ();
> + if (q)
> + {
> @@ -453,13 +433,13 @@
> + else if (tmpu32 == tdep->ioctl_TIOCSERGSTRUCT)
> + {
> + printf_unfiltered (_
> -+ ("Record: record and reverse target doesn't support ioctl
> request TIOCSERGSTRUCT\n"));
> ++ ("Process record and replay target doesn't support ioctl
> request TIOCSERGSTRUCT\n"));
> + return (1);
> + }
> + else
> + {
> + printf_unfiltered (_
> -+ ("Record: record and reverse target doesn't support ioctl
> request 0x%08x.\n"),
> ++ ("Process record and replay target doesn't support ioctl
> request 0x%08x.\n"),
> + tmpu32);
> + return (1);
> + }
> @@ -616,22 +596,13 @@
> + /* old_select */
> + case 82:
> + {
> -+ /*
> -+ struct sel_arg_struct {
> -+ unsigned long n;
> -+ fd_set *inp;
> -+ fd_set *outp;
> -+ fd_set *exp;
> -+ struct timeval *tvp;
> -+ };
> -+ */
> + struct sel_arg_struct
> + {
> -+ uint32_t n;
> -+ uint32_t inp;
> -+ uint32_t outp;
> -+ uint32_t exp;
> -+ uint32_t tvp;
> ++ CORE_ADDR n;
> ++ CORE_ADDR inp;
> ++ CORE_ADDR outp;
> ++ CORE_ADDR exp;
> ++ CORE_ADDR tvp;
> + } sel;
> +
> + regcache_raw_read (record_regcache, tdep->arg1,
> @@ -640,9 +611,12 @@
> + {
> + if (target_read_memory (tmpu32, (gdb_byte *) & sel, sizeof (sel)))
> + {
> -+ fprintf_unfiltered (gdb_stdlog,
> -+ "Record: read memory addr = 0x%s len = %d error.\n",
> -+ paddr_nz (tmpu32), sizeof (sel));
> ++ if (record_debug)
> ++ {
> ++ fprintf_unfiltered (gdb_stdlog,
> ++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++ paddr_nz (tmpu32), sizeof (sel));
> ++ }
> + return (-1);
> + }
> + if (record_arch_list_add_mem (sel.inp, tdep->size_fd_set))
> @@ -696,7 +670,7 @@
> + target_terminal_ours ();
> + q =
> + yquery (_
> -+ ("The next instruction is syscall reboot. It will restart the
> computer. Do you want to stop the program."));
> ++ ("The next instruction is syscall reboot. It will restart the
> computer. Do you want to stop the program?"));
> + target_terminal_inferior ();
> + if (q)
> + {
> @@ -730,7 +704,7 @@
> + target_terminal_ours ();
> + q =
> + yquery (_
> -+ ("The next instruction is syscall munmap. It will free the
> memory addr = 0x%s len = %d. It will make record target get error.
> Do you want to stop the program."),
> ++ ("The next instruction is syscall munmap. It will free the
> memory addr = 0x%s len = %d. It will make record target get error.
> Do you want to stop the program?"),
> + paddr_nz (tmpu32), len);
> + target_terminal_inferior ();
> + if (q)
> @@ -792,9 +766,12 @@
> + {
> + if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
> + {
> -+ fprintf_unfiltered (gdb_stdlog,
> -+ "Record: read memory addr = 0x%s len = %d error.\n",
> -+ paddr_nz (tmpu32), sizeof (a));
> ++ if (record_debug)
> ++ {
> ++ fprintf_unfiltered (gdb_stdlog,
> ++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++ paddr_nz (tmpu32), sizeof (a));
> ++ }
> + return (-1);
> + }
> + if (record_arch_list_add_mem (a[1], tdep->size_sockaddr))
> @@ -818,9 +795,12 @@
> + {
> + if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
> + {
> -+ fprintf_unfiltered (gdb_stdlog,
> -+ "Record: read memory addr = 0x%s len = %d error.\n",
> -+ paddr_nz (tmpu32), sizeof (a));
> ++ if (record_debug)
> ++ {
> ++ fprintf_unfiltered (gdb_stdlog,
> ++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++ paddr_nz (tmpu32), sizeof (a));
> ++ }
> + return (-1);
> + }
> + if (record_arch_list_add_mem (a[3], tdep->size_int))
> @@ -842,9 +822,12 @@
> + {
> + if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
> + {
> -+ fprintf_unfiltered (gdb_stdlog,
> -+ "Record: read memory addr = 0x%s len = %d error.\n",
> -+ paddr_nz (tmpu32), sizeof (a));
> ++ if (record_debug)
> ++ {
> ++ fprintf_unfiltered (gdb_stdlog,
> ++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++ paddr_nz (tmpu32), sizeof (a));
> ++ }
> + return (-1);
> + }
> + if (a[2])
> @@ -852,9 +835,12 @@
> + if (target_read_memory
> + (a[2], (gdb_byte *) & (a[2]), sizeof (a[2])))
> + {
> -+ fprintf_unfiltered (gdb_stdlog,
> -+ "Record: read memory addr = 0x%s len = %d error.\n",
> -+ paddr_nz (a[2]), sizeof (a[2]));
> ++ if (record_debug)
> ++ {
> ++ fprintf_unfiltered (gdb_stdlog,
> ++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++ paddr_nz (a[2]), sizeof (a[2]));
> ++ }
> + return (-1);
> + }
> + if (record_arch_list_add_mem (a[1], a[2]))
> @@ -874,9 +860,12 @@
> + {
> + if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
> + {
> -+ fprintf_unfiltered (gdb_stdlog,
> -+ "Record: read memory addr = 0x%s len = %d error.\n",
> -+ paddr_nz (tmpu32), sizeof (a));
> ++ if (record_debug)
> ++ {
> ++ fprintf_unfiltered (gdb_stdlog,
> ++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++ paddr_nz (tmpu32), sizeof (a));
> ++ }
> + return (-1);
> + }
> + if (a[2])
> @@ -884,9 +873,13 @@
> + if (target_read_memory
> + (a[2], (gdb_byte *) & (a[2]), sizeof (a[2])))
> + {
> -+ fprintf_unfiltered (gdb_stdlog,
> -+ "Record: read memory addr = 0x%s len = %d error.\n",
> -+ paddr_nz (a[2]), sizeof (a[2]));
> ++ if (record_debug)
> ++ {
> ++ fprintf_unfiltered (gdb_stdlog,
> ++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++ paddr_nz (a[2]),
> ++ sizeof (a[2]));
> ++ }
> + return (-1);
> + }
> + if (record_arch_list_add_mem (a[1], a[2]))
> @@ -919,9 +912,12 @@
> + {
> + if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
> + {
> -+ fprintf_unfiltered (gdb_stdlog,
> -+ "Record: read memory addr = 0x%s len = %d error.\n",
> -+ paddr_nz (tmpu32), sizeof (a));
> ++ if (record_debug)
> ++ {
> ++ fprintf_unfiltered (gdb_stdlog,
> ++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++ paddr_nz (tmpu32), sizeof (a));
> ++ }
> + return (-1);
> + }
> + if (a[4])
> @@ -929,9 +925,12 @@
> + if (target_read_memory
> + (a[4], (gdb_byte *) & av, sizeof (av)))
> + {
> -+ fprintf_unfiltered (gdb_stdlog,
> -+ "Record: read memory addr = 0x%s len = %d error.\n",
> -+ paddr_nz (a[4]), sizeof (av));
> ++ if (record_debug)
> ++ {
> ++ fprintf_unfiltered (gdb_stdlog,
> ++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++ paddr_nz (a[4]), sizeof (av));
> ++ }
> + return (-1);
> + }
> + if (record_arch_list_add_mem (a[3], av))
> @@ -973,9 +972,12 @@
> + {
> + if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
> + {
> -+ fprintf_unfiltered (gdb_stdlog,
> -+ "Record: read memory addr = 0x%s len = %d error.\n",
> -+ paddr_nz (tmpu32), sizeof (a));
> ++ if (record_debug)
> ++ {
> ++ fprintf_unfiltered (gdb_stdlog,
> ++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++ paddr_nz (tmpu32), sizeof (a));
> ++ }
> + return (-1);
> + }
> + if (record_arch_list_add_mem (a[1], tdep->size_msghdr))
> @@ -987,9 +989,13 @@
> + if (target_read_memory
> + (a[1], (gdb_byte *) & rec, sizeof (rec)))
> + {
> -+ fprintf_unfiltered (gdb_stdlog,
> -+ "Record: read memory addr = 0x%s len = %d error.\n",
> -+ paddr_nz (a[1]), sizeof (rec));
> ++ if (record_debug)
> ++ {
> ++ fprintf_unfiltered (gdb_stdlog,
> ++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++ paddr_nz (a[1]),
> ++ sizeof (rec));
> ++ }
> + return (-1);
> + }
> + if (record_arch_list_add_mem
> @@ -1010,10 +1016,14 @@
> + (rec.msg_iov, (gdb_byte *) & iov,
> + sizeof (iov)))
> + {
> -+ fprintf_unfiltered (gdb_stdlog,
> -+ "Record: read memory addr = 0x%s len = %d error.\n",
> -+ paddr_nz (rec.msg_iov),
> -+ sizeof (iov));
> ++ if (record_debug)
> ++ {
> ++ fprintf_unfiltered (gdb_stdlog,
> ++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++ paddr_nz (rec.
> ++ msg_iov),
> ++ sizeof (iov));
> ++ }
> + return (-1);
> + }
> + if (record_arch_list_add_mem
> @@ -1030,7 +1040,7 @@
> + break;
> + default:
> + printf_unfiltered (_
> -+ ("Record: record and reverse function doesn't support
> socketcall call 0x%08x\n"),
> ++ ("Process record and replay target doesn't support
> socketcall call 0x%08x\n"),
> + tmpu32);
> + return (-1);
> + break;
> @@ -1378,10 +1388,13 @@
> + if (target_read_memory
> + (vec, (gdb_byte *) & iov, sizeof (struct record_iovec)))
> + {
> -+ fprintf_unfiltered (gdb_stdlog,
> -+ "Record: read memory addr = 0x%s len = %d error.\n",
> -+ paddr_nz (vec),
> -+ sizeof (struct record_iovec));
> ++ if (record_debug)
> ++ {
> ++ fprintf_unfiltered (gdb_stdlog,
> ++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++ paddr_nz (vec),
> ++ sizeof (struct record_iovec));
> ++ }
> + return (-1);
> + }
> + if (record_arch_list_add_mem (iov.iov_base, iov.iov_len))
> @@ -2016,9 +2029,12 @@
> + if (target_read_memory
> + (tmpu32, (gdb_byte *) iocbp, nr * tdep->size_int))
> + {
> -+ fprintf_unfiltered (gdb_stdlog,
> -+ "Record: read memory addr = 0x%s len = %d error.\n",
> -+ paddr_nz (tmpu32), nr * tdep->size_int);
> ++ if (record_debug)
> ++ {
> ++ fprintf_unfiltered (gdb_stdlog,
> ++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++ paddr_nz (tmpu32), nr * tdep->size_int);
> ++ }
> + return (-1);
> + }
> + for (i = 0; i < nr; i++)
> @@ -2053,7 +2069,7 @@
> + target_terminal_ours ();
> + q =
> + yquery (_
> -+ ("The next instruction is syscall exit_group. It will make the
> program exit. Do you want to stop the program."));
> ++ ("The next instruction is syscall exit_group. It will make the
> program exit. Do you want to stop the program?"));
> + target_terminal_inferior ();
> + if (q)
> + {
> @@ -2500,7 +2516,7 @@
> +
> + default:
> + printf_unfiltered (_
> -+ ("Record: record and reverse function doesn't support syscall
> number 0x%08x\n"),
> ++ ("Process record and replay target doesn't support syscall
> number 0x%08x\n"),
> + tmpu32);
> + return (-1);
> + break;
> @@ -2508,7 +2524,7 @@
> +
> + return (0);
> +}
> ---- a/linux-record.h
> +--- a//dev/null
> +++ b/linux-record.h
> @@ -0,0 +1,171 @@
> +/* Process record and replay target code for GNU/Linux.
> @@ -2519,7 +2535,7 @@
> +
> + This program is free software; you can redistribute it and/or modify
> + it under the terms of the GNU General Public License as published by
> -+ the Free Software Foundation; either version 2 of the License, or
> ++ the Free Software Foundation; either version 3 of the License, or
> + (at your option) any later version.
> +
> + This program is distributed in the hope that it will be useful,
> @@ -2535,7 +2551,7 @@
> +
> +typedef struct linux_record_tdep_s
> +{
> -+ /* The size of the type that will be use in system call. */
> ++ /* The size of the type that will be use in system call. */
> + int size__old_kernel_stat;
> + int size_tms;
> + int size_loff_t;
> @@ -2604,7 +2620,7 @@
> + int size_serial_icounter_struct;
> + int size_hayes_esp_config;
> +
> -+ /* the values of the second argument of system call "sys_ioctl". */
> ++ /* the values of the second argument of system call "sys_ioctl". */
> + int ioctl_TCGETS;
> + int ioctl_TCSETS;
> + int ioctl_TCSETSW;
> @@ -2671,7 +2687,7 @@
> + int ioctl_TIOCSHAYESESP;
> + int ioctl_FIOQSIZE;
> +
> -+ /* The number of the registers that use to be the arguments of
> system call. */
> ++ /* The number of the registers that use to be the arguments of
> system call. */
> + int arg1;
> + int arg2;
> + int arg3;
> @@ -2682,3 +2698,23 @@
> +extern int record_linux_system_call (int num, linux_record_tdep_t * tdep);
> +
> +#endif /* _LINUX_RECORD_H_ */
> +--- a/Makefile.in
> ++++ b/Makefile.in
> +@@ -515,7 +515,7 @@
> + xcoffread.o \
> + prologue-value.o \
> + symfile-mem.o \
> +- corelow.o
> ++ corelow.o linux-record.o
> +
> + # Host-dependent makefile fragment comes in here.
> + @host_makefile_frag@
> +@@ -1297,7 +1297,7 @@
> + inf-ptrace.c inf-ttrace.c \
> + irix5-nat.c \
> + libunwind-frame.c \
> +- linux-fork.c \
> ++ linux-fork.c linux-record.c \
>
>
> ------------------------------------------------------------------------
>
> --- a/configure.tgt
> +++ b/configure.tgt
> @@ -185,7 +185,8 @@
> i[34567]86-*-linux*)
> # Target: Intel 386 running GNU/Linux
> gdb_target_obs="i386-tdep.o i386-linux-tdep.o glibc-tdep.o i387-tdep.o \
> - solib.o solib-svr4.o symfile-mem.o corelow.o"
> + solib.o solib-svr4.o symfile-mem.o corelow.o \
> + linux-record.o"
> build_gdbserver=yes
> ;;
> i[34567]86-*-gnu*)
> @@ -508,7 +509,8 @@
> # Target: GNU/Linux x86-64
> gdb_target_obs="amd64-tdep.o amd64-linux-tdep.o i386-tdep.o \
> i387-tdep.o i386-linux-tdep.o glibc-tdep.o \
> - solib.o solib-svr4.o corelow.o symfile-mem.o"
> + solib.o solib-svr4.o corelow.o symfile-mem.o \
> + linux-record.o"
> build_gdbserver=yes
> ;;
> x86_64-*-freebsd* | x86_64-*-kfreebsd*-gnu)
> --- a//dev/null
> +++ b/linux-record.c
> @@ -0,0 +1,2501 @@
> +/* Process record and replay target code for GNU/Linux.
> +
> + Copyright (C) 2008 Free Software Foundation, Inc.
> +
> + This file is part of GDB.
> +
> + This program is free software; you can redistribute it and/or modify
> + it under the terms of the GNU General Public License as published by
> + the Free Software Foundation; either version 3 of the License, or
> + (at your option) any later version.
> +
> + This program is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + GNU General Public License for more details.
> +
> + You should have received a copy of the GNU General Public License
> + along with this program. If not, see <http://www.gnu.org/licenses/>. */
> +
> +#include "defs.h"
> +#include "target.h"
> +#include "regcache.h"
> +#include "record.h"
> +#include "linux-record.h"
> +#include <stdint.h>
> +
> +/* These macros are the values of the first argument of system call
> + "sys_ptrace". The values of these macros are gotten from Linux Kernel
> + source. */
> +
> +#define RECORD_PTRACE_PEEKTEXT 1
> +#define RECORD_PTRACE_PEEKDATA 2
> +#define RECORD_PTRACE_PEEKUSR 3
> +
> +/* These macros are the values of the first argument of system call
> + "sys_socketcall". The values of these macros are gotten from Linux Kernel
> + source. */
> +
> +#define RECORD_SYS_SOCKET 1
> +#define RECORD_SYS_BIND 2
> +#define RECORD_SYS_CONNECT 3
> +#define RECORD_SYS_LISTEN 4
> +#define RECORD_SYS_ACCEPT 5
> +#define RECORD_SYS_GETSOCKNAME 6
> +#define RECORD_SYS_GETPEERNAME 7
> +#define RECORD_SYS_SOCKETPAIR 8
> +#define RECORD_SYS_SEND 9
> +#define RECORD_SYS_RECV 10
> +#define RECORD_SYS_SENDTO 11
> +#define RECORD_SYS_RECVFROM 12
> +#define RECORD_SYS_SHUTDOWN 13
> +#define RECORD_SYS_SETSOCKOPT 14
> +#define RECORD_SYS_GETSOCKOPT 15
> +#define RECORD_SYS_SENDMSG 16
> +#define RECORD_SYS_RECVMSG 17
> +
> +/* These macros are the values of the first argument of system call
> + "sys_ipc". The values of these macros are gotten from Linux Kernel source.
> + */
> +
> +#define RECORD_SEMOP 1
> +#define RECORD_SEMGET 2
> +#define RECORD_SEMCTL 3
> +#define RECORD_SEMTIMEDOP 4
> +#define RECORD_MSGSND 11
> +#define RECORD_MSGRCV 12
> +#define RECORD_MSGGET 13
> +#define RECORD_MSGCTL 14
> +#define RECORD_SHMAT 21
> +#define RECORD_SHMDT 22
> +#define RECORD_SHMGET 23
> +#define RECORD_SHMCTL 24
> +
> +/* These macros are the values of the first argument of system call
> + "sys_quotactl". The values of these macros are gotten from Linux Kernel
> + source. */
> +
> +#define RECORD_Q_GETFMT 0x800004
> +#define RECORD_Q_GETINFO 0x800005
> +#define RECORD_Q_GETQUOTA 0x800007
> +#define RECORD_Q_XGETQSTAT (('5'<<8)+(5))
> +#define RECORD_Q_XGETQUOTA (('3'<<8)+(3))
> +
> +/* Record the values of the registers and memory that will be changed in
> + current system call.
> + Return -1 if something wrong. */
> +
> +int
> +record_linux_system_call (int num, linux_record_tdep_t * tdep)
> +{
> + uint32_t tmpu32;
> +
> + switch (num)
> + {
> + /* sys_restart_syscall */
> + case 0:
> + break;
> +
> + /* sys_exit */
> + case 1:
> + {
> + int q;
> + target_terminal_ours ();
> + q =
> + yquery (_
> + ("The next instruction is syscall exit. It will make the program exit. Do you want to stop the program?"));
> + target_terminal_inferior ();
> + if (q)
> + {
> + return (1);
> + }
> + }
> + break;
> +
> + /* sys_fork */
> + case 2:
> + break;
> +
> + /* sys_read */
> + case 3:
> + {
> + uint32_t addr, count;
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & addr);
> + regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & count);
> + if (record_arch_list_add_mem (addr, count))
> + {
> + return (-1);
> + }
> + }
> + break;
> +
> + /* sys_write */
> + case 4:
> + /* sys_open */
> + case 5:
> + /* sys_close */
> + case 6:
> + /* sys_waitpid */
> + case 7:
> + /* sys_creat */
> + case 8:
> + /* sys_link */
> + case 9:
> + /* sys_unlink */
> + case 10:
> + /* sys_execve */
> + case 11:
> + /* sys_chdir */
> + case 12:
> + /* sys_time */
> + case 13:
> + /* sys_mknod */
> + case 14:
> + /* sys_chmod */
> + case 15:
> + /* sys_lchown16 */
> + case 16:
> + /* sys_ni_syscall */
> + case 17:
> + break;
> +
> + /* sys_stat */
> + case 18:
> + /* sys_fstat */
> + case 28:
> + /* sys_lstat */
> + case 84:
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size__old_kernel_stat))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_lseek */
> + case 19:
> + /* sys_getpid */
> + case 20:
> + /* sys_mount */
> + case 21:
> + /* sys_oldumount */
> + case 22:
> + /* sys_setuid16 */
> + case 23:
> + /* sys_getuid16 */
> + case 24:
> + /* sys_stime */
> + case 25:
> + break;
> +
> + /* sys_ptrace */
> + case 26:
> + regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
> + if (tmpu32 == RECORD_PTRACE_PEEKTEXT
> + || tmpu32 == RECORD_PTRACE_PEEKDATA
> + || tmpu32 == RECORD_PTRACE_PEEKUSR)
> + {
> + regcache_raw_read (record_regcache, tdep->arg4,
> + (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, 4))
> + {
> + return (-1);
> + }
> + }
> + break;
> +
> + /* sys_alarm */
> + case 27:
> + /* sys_pause */
> + case 29:
> + /* sys_utime */
> + case 30:
> + /* sys_ni_syscall */
> + case 31:
> + /* sys_ni_syscall */
> + case 32:
> + /* sys_access */
> + case 33:
> + /* sys_nice */
> + case 34:
> + /* sys_ni_syscall */
> + case 35:
> + /* sys_sync */
> + case 36:
> + /* sys_kill */
> + case 37:
> + /* sys_rename */
> + case 38:
> + /* sys_mkdir */
> + case 39:
> + /* sys_rmdir */
> + case 40:
> + /* sys_dup */
> + case 41:
> + /* sys_pipe */
> + case 42:
> + break;
> +
> + /* sys_times */
> + case 43:
> + regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_tms))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_ni_syscall */
> + case 44:
> + /* sys_brk */
> + case 45:
> + /* sys_setgid16 */
> + case 46:
> + /* sys_getgid16 */
> + case 47:
> + /* sys_signal */
> + case 48:
> + /* sys_geteuid16 */
> + case 49:
> + /* sys_getegid16 */
> + case 50:
> + /* sys_acct */
> + case 51:
> + /* sys_umount */
> + case 52:
> + /* sys_ni_syscall */
> + case 53:
> + break;
> +
> + /* sys_ioctl */
> + case 54:
> + /* XXX there need add a lot of support of other ioctl requests. */
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + if (tmpu32 == tdep->ioctl_FIOCLEX || tmpu32 == tdep->ioctl_FIONCLEX
> + || tmpu32 == tdep->ioctl_FIONBIO || tmpu32 == tdep->ioctl_FIOASYNC
> + || tmpu32 == tdep->ioctl_TCSETS || tmpu32 == tdep->ioctl_TCSETSW
> + || tmpu32 == tdep->ioctl_TCSETSF || tmpu32 == tdep->ioctl_TCSETA
> + || tmpu32 == tdep->ioctl_TCSETAW || tmpu32 == tdep->ioctl_TCSETAF
> + || tmpu32 == tdep->ioctl_TCSBRK || tmpu32 == tdep->ioctl_TCXONC
> + || tmpu32 == tdep->ioctl_TCFLSH || tmpu32 == tdep->ioctl_TIOCEXCL
> + || tmpu32 == tdep->ioctl_TIOCNXCL
> + || tmpu32 == tdep->ioctl_TIOCSCTTY
> + || tmpu32 == tdep->ioctl_TIOCSPGRP || tmpu32 == tdep->ioctl_TIOCSTI
> + || tmpu32 == tdep->ioctl_TIOCSWINSZ
> + || tmpu32 == tdep->ioctl_TIOCMBIS || tmpu32 == tdep->ioctl_TIOCMBIC
> + || tmpu32 == tdep->ioctl_TIOCMSET
> + || tmpu32 == tdep->ioctl_TIOCSSOFTCAR
> + || tmpu32 == tdep->ioctl_TIOCCONS
> + || tmpu32 == tdep->ioctl_TIOCSSERIAL
> + || tmpu32 == tdep->ioctl_TIOCPKT || tmpu32 == tdep->ioctl_TIOCNOTTY
> + || tmpu32 == tdep->ioctl_TIOCSETD || tmpu32 == tdep->ioctl_TCSBRKP
> + || tmpu32 == tdep->ioctl_TIOCTTYGSTRUCT
> + || tmpu32 == tdep->ioctl_TIOCSBRK || tmpu32 == tdep->ioctl_TIOCCBRK
> + || tmpu32 == tdep->ioctl_TCSETS2 || tmpu32 == tdep->ioctl_TCSETSW2
> + || tmpu32 == tdep->ioctl_TCSETSF2
> + || tmpu32 == tdep->ioctl_TIOCSPTLCK
> + || tmpu32 == tdep->ioctl_TIOCSERCONFIG
> + || tmpu32 == tdep->ioctl_TIOCSERGWILD
> + || tmpu32 == tdep->ioctl_TIOCSERSWILD
> + || tmpu32 == tdep->ioctl_TIOCSLCKTRMIOS
> + || tmpu32 == tdep->ioctl_TIOCSERGETMULTI
> + || tmpu32 == tdep->ioctl_TIOCSERSETMULTI
> + || tmpu32 == tdep->ioctl_TIOCMIWAIT
> + || tmpu32 == tdep->ioctl_TIOCSHAYESESP)
> + {
> + /* Nothing to do. */
> + }
> + else if (tmpu32 == tdep->ioctl_TCGETS || tmpu32 == tdep->ioctl_TCGETA
> + || tmpu32 == tdep->ioctl_TIOCGLCKTRMIOS)
> + {
> + regcache_raw_read (record_regcache, tdep->arg3,
> + (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_termios))
> + {
> + return (-1);
> + }
> + }
> + else if (tmpu32 == tdep->ioctl_TIOCGPGRP
> + || tmpu32 == tdep->ioctl_TIOCGSID)
> + {
> + regcache_raw_read (record_regcache, tdep->arg3,
> + (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_pid_t))
> + {
> + return (-1);
> + }
> + }
> + else if (tmpu32 == tdep->ioctl_TIOCOUTQ
> + || tmpu32 == tdep->ioctl_TIOCMGET
> + || tmpu32 == tdep->ioctl_TIOCGSOFTCAR
> + || tmpu32 == tdep->ioctl_FIONREAD
> + || tmpu32 == tdep->ioctl_TIOCINQ
> + || tmpu32 == tdep->ioctl_TIOCGETD
> + || tmpu32 == tdep->ioctl_TIOCGPTN
> + || tmpu32 == tdep->ioctl_TIOCSERGETLSR)
> + {
> + regcache_raw_read (record_regcache, tdep->arg3,
> + (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_int))
> + {
> + return (-1);
> + }
> + }
> + else if (tmpu32 == tdep->ioctl_TIOCGWINSZ)
> + {
> + regcache_raw_read (record_regcache, tdep->arg3,
> + (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_winsize))
> + {
> + return (-1);
> + }
> + }
> + else if (tmpu32 == tdep->ioctl_TIOCLINUX)
> + {
> + regcache_raw_read (record_regcache, tdep->arg3,
> + (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_char))
> + {
> + return (-1);
> + }
> + }
> + else if (tmpu32 == tdep->ioctl_TIOCGSERIAL)
> + {
> + regcache_raw_read (record_regcache, tdep->arg3,
> + (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_serial_struct))
> + {
> + return (-1);
> + }
> + }
> + else if (tmpu32 == tdep->ioctl_TCGETS2)
> + {
> + regcache_raw_read (record_regcache, tdep->arg3,
> + (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_termios2))
> + {
> + return (-1);
> + }
> + }
> + else if (tmpu32 == tdep->ioctl_FIOQSIZE)
> + {
> + regcache_raw_read (record_regcache, tdep->arg3,
> + (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_loff_t))
> + {
> + return (-1);
> + }
> + }
> + else if (tmpu32 == tdep->ioctl_TIOCGICOUNT)
> + {
> + regcache_raw_read (record_regcache, tdep->arg3,
> + (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem
> + (tmpu32, tdep->size_serial_icounter_struct))
> + {
> + return (-1);
> + }
> + }
> + else if (tmpu32 == tdep->ioctl_TIOCGHAYESESP)
> + {
> + regcache_raw_read (record_regcache, tdep->arg3,
> + (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_hayes_esp_config))
> + {
> + return (-1);
> + }
> + }
> + else if (tmpu32 == tdep->ioctl_TIOCSERGSTRUCT)
> + {
> + printf_unfiltered (_
> + ("Process record and replay target doesn't support ioctl request TIOCSERGSTRUCT\n"));
> + return (1);
> + }
> + else
> + {
> + printf_unfiltered (_
> + ("Process record and replay target doesn't support ioctl request 0x%08x.\n"),
> + tmpu32);
> + return (1);
> + }
> + break;
> +
> + /* sys_fcntl */
> + case 55:
> + /* XXX */
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + sys_fcntl:
> + if (tmpu32 == F_GETLK)
> + {
> + regcache_raw_read (record_regcache, tdep->arg3,
> + (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_flock))
> + {
> + return (-1);
> + }
> + }
> + break;
> +
> + /* sys_ni_syscall */
> + case 56:
> + /* sys_setpgid */
> + case 57:
> + /* sys_ni_syscall */
> + case 58:
> + break;
> +
> + /* sys_olduname */
> + case 59:
> + regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_oldold_utsname))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_umask */
> + case 60:
> + /* sys_chroot */
> + case 61:
> + break;
> +
> + /* sys_ustat */
> + case 62:
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_ustat))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_dup2 */
> + case 63:
> + /* sys_getppid */
> + case 64:
> + /* sys_getpgrp */
> + case 65:
> + /* sys_setsid */
> + case 66:
> + break;
> +
> + /* sys_sigaction */
> + case 67:
> + regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_old_sigaction))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_sgetmask */
> + case 68:
> + /* sys_ssetmask */
> + case 69:
> + /* sys_setreuid16 */
> + case 70:
> + /* sys_setregid16 */
> + case 71:
> + /* sys_sigsuspend */
> + case 72:
> + break;
> +
> + /* sys_sigpending */
> + case 73:
> + regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_old_sigset_t))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_sethostname */
> + case 74:
> + /* sys_setrlimit */
> + case 75:
> + break;
> +
> + /* sys_old_getrlimit */
> + case 76:
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_rlimit))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_getrusage */
> + case 77:
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_rusage))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_gettimeofday */
> + case 78:
> + regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_timeval))
> + {
> + return (-1);
> + }
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_timezone))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_settimeofday */
> + case 79:
> + break;
> +
> + /* sys_getgroups16 */
> + case 80:
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_old_gid_t))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_setgroups16 */
> + case 81:
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_old_gid_t))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* old_select */
> + case 82:
> + {
> + struct sel_arg_struct
> + {
> + CORE_ADDR n;
> + CORE_ADDR inp;
> + CORE_ADDR outp;
> + CORE_ADDR exp;
> + CORE_ADDR tvp;
> + } sel;
> +
> + regcache_raw_read (record_regcache, tdep->arg1,
> + (gdb_byte *) & tmpu32);
> + if (tmpu32)
> + {
> + if (target_read_memory (tmpu32, (gdb_byte *) & sel, sizeof (sel)))
> + {
> + if (record_debug)
> + {
> + fprintf_unfiltered (gdb_stdlog,
> + "Process record: error reading memory at addr = 0x%s len = %d.\n",
> + paddr_nz (tmpu32), sizeof (sel));
> + }
> + return (-1);
> + }
> + if (record_arch_list_add_mem (sel.inp, tdep->size_fd_set))
> + {
> + return (-1);
> + }
> + if (record_arch_list_add_mem (sel.outp, tdep->size_fd_set))
> + {
> + return (-1);
> + }
> + if (record_arch_list_add_mem (sel.exp, tdep->size_fd_set))
> + {
> + return (-1);
> + }
> + if (record_arch_list_add_mem (sel.tvp, tdep->size_timeval))
> + {
> + return (-1);
> + }
> + }
> + }
> + break;
> +
> + /* sys_symlink */
> + case 83:
> + break;
> +
> + /* sys_readlink */
> + case 85:
> + {
> + uint32_t len;
> + regcache_raw_read (record_regcache, tdep->arg2,
> + (gdb_byte *) & tmpu32);
> + regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & len);
> + if (record_arch_list_add_mem (tmpu32, len))
> + {
> + return (-1);
> + }
> + }
> + break;
> +
> + /* sys_uselib */
> + case 86:
> + /* sys_swapon */
> + case 87:
> + break;
> +
> + /* sys_reboot */
> + case 88:
> + {
> + int q;
> + target_terminal_ours ();
> + q =
> + yquery (_
> + ("The next instruction is syscall reboot. It will restart the computer. Do you want to stop the program?"));
> + target_terminal_inferior ();
> + if (q)
> + {
> + return (1);
> + }
> + }
> + break;
> +
> + /* old_readdir */
> + case 89:
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_dirent))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* old_mmap */
> + case 90:
> + break;
> +
> + /* sys_munmap */
> + case 91:
> + {
> + int q;
> + uint32_t len;
> +
> + regcache_raw_read (record_regcache, tdep->arg1,
> + (gdb_byte *) & tmpu32);
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & len);
> + target_terminal_ours ();
> + q =
> + yquery (_
> + ("The next instruction is syscall munmap. It will free the memory addr = 0x%s len = %d. It will make record target get error. Do you want to stop the program?"),
> + paddr_nz (tmpu32), len);
> + target_terminal_inferior ();
> + if (q)
> + {
> + return (1);
> + }
> + }
> + break;
> +
> + /* sys_truncate */
> + case 92:
> + /* sys_ftruncate */
> + case 93:
> + /* sys_fchmod */
> + case 94:
> + /* sys_fchown16 */
> + case 95:
> + /* sys_getpriority */
> + case 96:
> + /* sys_setpriority */
> + case 97:
> + /* sys_ni_syscall */
> + case 98:
> + break;
> +
> + /* sys_statfs */
> + case 99:
> + /* sys_fstatfs */
> + case 100:
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_statfs))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_ioperm */
> + case 101:
> + break;
> +
> + /* sys_socketcall */
> + case 102:
> + regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
> + switch (tmpu32)
> + {
> + case RECORD_SYS_SOCKET:
> + case RECORD_SYS_BIND:
> + case RECORD_SYS_CONNECT:
> + case RECORD_SYS_LISTEN:
> + break;
> + case RECORD_SYS_ACCEPT:
> + case RECORD_SYS_GETSOCKNAME:
> + case RECORD_SYS_GETPEERNAME:
> + {
> + uint32_t a[3];
> + regcache_raw_read (record_regcache, tdep->arg2,
> + (gdb_byte *) & tmpu32);
> + if (tmpu32)
> + {
> + if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
> + {
> + if (record_debug)
> + {
> + fprintf_unfiltered (gdb_stdlog,
> + "Process record: error reading memory at addr = 0x%s len = %d.\n",
> + paddr_nz (tmpu32), sizeof (a));
> + }
> + return (-1);
> + }
> + if (record_arch_list_add_mem (a[1], tdep->size_sockaddr))
> + {
> + return (-1);
> + }
> + if (record_arch_list_add_mem (a[2], tdep->size_int))
> + {
> + return (-1);
> + }
> + }
> + }
> + break;
> +
> + case RECORD_SYS_SOCKETPAIR:
> + {
> + uint32_t a[4];
> + regcache_raw_read (record_regcache, tdep->arg2,
> + (gdb_byte *) & tmpu32);
> + if (tmpu32)
> + {
> + if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
> + {
> + if (record_debug)
> + {
> + fprintf_unfiltered (gdb_stdlog,
> + "Process record: error reading memory at addr = 0x%s len = %d.\n",
> + paddr_nz (tmpu32), sizeof (a));
> + }
> + return (-1);
> + }
> + if (record_arch_list_add_mem (a[3], tdep->size_int))
> + {
> + return (-1);
> + }
> + }
> + }
> + break;
> + case RECORD_SYS_SEND:
> + case RECORD_SYS_SENDTO:
> + break;
> + case RECORD_SYS_RECV:
> + {
> + uint32_t a[3];
> + regcache_raw_read (record_regcache, tdep->arg2,
> + (gdb_byte *) & tmpu32);
> + if (tmpu32)
> + {
> + if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
> + {
> + if (record_debug)
> + {
> + fprintf_unfiltered (gdb_stdlog,
> + "Process record: error reading memory at addr = 0x%s len = %d.\n",
> + paddr_nz (tmpu32), sizeof (a));
> + }
> + return (-1);
> + }
> + if (a[2])
> + {
> + if (target_read_memory
> + (a[2], (gdb_byte *) & (a[2]), sizeof (a[2])))
> + {
> + if (record_debug)
> + {
> + fprintf_unfiltered (gdb_stdlog,
> + "Process record: error reading memory at addr = 0x%s len = %d.\n",
> + paddr_nz (a[2]), sizeof (a[2]));
> + }
> + return (-1);
> + }
> + if (record_arch_list_add_mem (a[1], a[2]))
> + {
> + return (-1);
> + }
> + }
> + }
> + }
> + break;
> + case RECORD_SYS_RECVFROM:
> + {
> + uint32_t a[6];
> + regcache_raw_read (record_regcache, tdep->arg2,
> + (gdb_byte *) & tmpu32);
> + if (tmpu32)
> + {
> + if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
> + {
> + if (record_debug)
> + {
> + fprintf_unfiltered (gdb_stdlog,
> + "Process record: error reading memory at addr = 0x%s len = %d.\n",
> + paddr_nz (tmpu32), sizeof (a));
> + }
> + return (-1);
> + }
> + if (a[2])
> + {
> + if (target_read_memory
> + (a[2], (gdb_byte *) & (a[2]), sizeof (a[2])))
> + {
> + if (record_debug)
> + {
> + fprintf_unfiltered (gdb_stdlog,
> + "Process record: error reading memory at addr = 0x%s len = %d.\n",
> + paddr_nz (a[2]),
> + sizeof (a[2]));
> + }
> + return (-1);
> + }
> + if (record_arch_list_add_mem (a[1], a[2]))
> + {
> + return (-1);
> + }
> + if (record_arch_list_add_mem (a[4], tdep->size_sockaddr))
> + {
> + return (-1);
> + }
> + if (record_arch_list_add_mem (a[5], tdep->size_int))
> + {
> + return (-1);
> + }
> + }
> + }
> + }
> + break;
> + case RECORD_SYS_SHUTDOWN:
> + case RECORD_SYS_SETSOCKOPT:
> + break;
> + case RECORD_SYS_GETSOCKOPT:
> + {
> + uint32_t a[5];
> + uint32_t av;
> +
> + regcache_raw_read (record_regcache, tdep->arg2,
> + (gdb_byte *) & tmpu32);
> + if (tmpu32)
> + {
> + if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
> + {
> + if (record_debug)
> + {
> + fprintf_unfiltered (gdb_stdlog,
> + "Process record: error reading memory at addr = 0x%s len = %d.\n",
> + paddr_nz (tmpu32), sizeof (a));
> + }
> + return (-1);
> + }
> + if (a[4])
> + {
> + if (target_read_memory
> + (a[4], (gdb_byte *) & av, sizeof (av)))
> + {
> + if (record_debug)
> + {
> + fprintf_unfiltered (gdb_stdlog,
> + "Process record: error reading memory at addr = 0x%s len = %d.\n",
> + paddr_nz (a[4]), sizeof (av));
> + }
> + return (-1);
> + }
> + if (record_arch_list_add_mem (a[3], av))
> + {
> + return (-1);
> + }
> + if (record_arch_list_add_mem (a[4], tdep->size_int))
> + {
> + return (-1);
> + }
> + }
> + }
> + }
> + break;
> + case RECORD_SYS_SENDMSG:
> + break;
> + case RECORD_SYS_RECVMSG:
> + {
> + uint32_t a[2], i;
> + struct record_msghdr
> + {
> + uint32_t msg_name;
> + uint32_t msg_namelen;
> + uint32_t msg_iov;
> + uint32_t msg_iovlen;
> + uint32_t msg_control;
> + uint32_t msg_controllen;
> + uint32_t msg_flags;
> + } rec;
> + struct record_iovec
> + {
> + uint32_t iov_base;
> + uint32_t iov_len;
> + } iov;
> +
> + regcache_raw_read (record_regcache, tdep->arg2,
> + (gdb_byte *) & tmpu32);
> + if (tmpu32)
> + {
> + if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
> + {
> + if (record_debug)
> + {
> + fprintf_unfiltered (gdb_stdlog,
> + "Process record: error reading memory at addr = 0x%s len = %d.\n",
> + paddr_nz (tmpu32), sizeof (a));
> + }
> + return (-1);
> + }
> + if (record_arch_list_add_mem (a[1], tdep->size_msghdr))
> + {
> + return (-1);
> + }
> + if (a[1])
> + {
> + if (target_read_memory
> + (a[1], (gdb_byte *) & rec, sizeof (rec)))
> + {
> + if (record_debug)
> + {
> + fprintf_unfiltered (gdb_stdlog,
> + "Process record: error reading memory at addr = 0x%s len = %d.\n",
> + paddr_nz (a[1]),
> + sizeof (rec));
> + }
> + return (-1);
> + }
> + if (record_arch_list_add_mem
> + (rec.msg_name, rec.msg_namelen))
> + {
> + return (-1);
> + }
> + if (record_arch_list_add_mem
> + (rec.msg_control, rec.msg_controllen))
> + {
> + return (-1);
> + }
> + if (rec.msg_iov)
> + {
> + for (i = 0; i < rec.msg_iovlen; i++)
> + {
> + if (target_read_memory
> + (rec.msg_iov, (gdb_byte *) & iov,
> + sizeof (iov)))
> + {
> + if (record_debug)
> + {
> + fprintf_unfiltered (gdb_stdlog,
> + "Process record: error reading memory at addr = 0x%s len = %d.\n",
> + paddr_nz (rec.
> + msg_iov),
> + sizeof (iov));
> + }
> + return (-1);
> + }
> + if (record_arch_list_add_mem
> + (iov.iov_base, iov.iov_len))
> + {
> + return (-1);
> + }
> + rec.msg_iov += sizeof (struct record_iovec);
> + }
> + }
> + }
> + }
> + }
> + break;
> + default:
> + printf_unfiltered (_
> + ("Process record and replay target doesn't support socketcall call 0x%08x\n"),
> + tmpu32);
> + return (-1);
> + break;
> + }
> + break;
> +
> + /* sys_syslog */
> + case 103:
> + break;
> +
> + /* sys_setitimer */
> + case 104:
> + regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_itimerval))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_getitimer */
> + case 105:
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_itimerval))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_newstat */
> + case 106:
> + /* sys_newlstat */
> + case 107:
> + /* sys_newfstat */
> + case 108:
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_stat))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_uname */
> + case 109:
> + regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_old_utsname))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_iopl */
> + case 110:
> + /* sys_vhangup */
> + case 111:
> + /* sys_ni_syscall */
> + case 112:
> + /* sys_vm86old */
> + case 113:
> + break;
> +
> + /* sys_wait4 */
> + case 114:
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_int))
> + {
> + return (-1);
> + }
> + regcache_raw_read (record_regcache, tdep->arg4, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_rusage))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_swapoff */
> + case 115:
> + break;
> +
> + /* sys_sysinfo */
> + case 116:
> + regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_sysinfo))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_ipc */
> + case 117:
> + regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
> + switch (tmpu32)
> + {
> + case RECORD_MSGRCV:
> + {
> + int32_t second;
> + uint32_t ptr;
> + regcache_raw_read (record_regcache, tdep->arg3,
> + (gdb_byte *) & second);
> + regcache_raw_read (record_regcache, tdep->arg5,
> + (gdb_byte *) & ptr);
> + if (record_arch_list_add_mem (ptr, second + tdep->size_long))
> + {
> + return (-1);
> + }
> + }
> + break;
> + case RECORD_MSGCTL:
> + regcache_raw_read (record_regcache, tdep->arg5,
> + (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_msqid_ds))
> + {
> + return (-1);
> + }
> + break;
> + case RECORD_SHMAT:
> + regcache_raw_read (record_regcache, tdep->arg4,
> + (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_ulong))
> + {
> + return (-1);
> + }
> + break;
> + case RECORD_SHMCTL:
> + regcache_raw_read (record_regcache, tdep->arg5,
> + (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_shmid_ds))
> + {
> + return (-1);
> + }
> + break;
> + }
> + break;
> +
> + /* sys_fsync */
> + case 118:
> + /* sys_sigreturn */
> + case 119:
> + /* sys_clone */
> + case 120:
> + /* sys_setdomainname */
> + case 121:
> + break;
> +
> + /* sys_newuname */
> + case 122:
> + regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_new_utsname))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_modify_ldt */
> + case 123:
> + regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
> + if (tmpu32 == 0 || tmpu32 == 2)
> + {
> + uint32_t ptr, bytecount;
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & ptr);
> + regcache_raw_read (record_regcache, tdep->arg3,
> + (gdb_byte *) & bytecount);
> + if (record_arch_list_add_mem (ptr, bytecount))
> + {
> + return (-1);
> + }
> + }
> + break;
> +
> + /* sys_adjtimex */
> + case 124:
> + regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_timex))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_mprotect */
> + case 125:
> + break;
> +
> + /* sys_sigprocmask */
> + case 126:
> + regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_old_sigset_t))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_ni_syscall */
> + case 127:
> + /* sys_init_module */
> + case 128:
> + /* sys_delete_module */
> + case 129:
> + /* sys_ni_syscall */
> + case 130:
> + break;
> +
> + /* sys_quotactl */
> + case 131:
> + regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
> + switch (tmpu32)
> + {
> + case RECORD_Q_GETFMT:
> + regcache_raw_read (record_regcache, tdep->arg4,
> + (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, 4))
> + {
> + return (-1);
> + }
> + break;
> + case RECORD_Q_GETINFO:
> + regcache_raw_read (record_regcache, tdep->arg4,
> + (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_mem_dqinfo))
> + {
> + return (-1);
> + }
> + break;
> + case RECORD_Q_GETQUOTA:
> + regcache_raw_read (record_regcache, tdep->arg4,
> + (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_if_dqblk))
> + {
> + return (-1);
> + }
> + break;
> + case RECORD_Q_XGETQSTAT:
> + case RECORD_Q_XGETQUOTA:
> + regcache_raw_read (record_regcache, tdep->arg4,
> + (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_fs_quota_stat))
> + {
> + return (-1);
> + }
> + break;
> + }
> + break;
> +
> + /* sys_getpgid */
> + case 132:
> + /* sys_fchdir */
> + case 133:
> + /* sys_bdflush */
> + case 134:
> + break;
> +
> + /* sys_sysfs */
> + case 135:
> + regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
> + if (tmpu32 == 2)
> + {
> + regcache_raw_read (record_regcache, tdep->arg3,
> + (gdb_byte *) & tmpu32);
> + /*XXX the size of memory is not very clear */
> + if (record_arch_list_add_mem (tmpu32, 10))
> + {
> + return (-1);
> + }
> + }
> + break;
> +
> + /* sys_personality */
> + case 136:
> + /* sys_ni_syscall */
> + case 137:
> + /* sys_setfsuid16 */
> + case 138:
> + /* sys_setfsgid16 */
> + case 139:
> + break;
> +
> + /* sys_llseek */
> + case 140:
> + regcache_raw_read (record_regcache, tdep->arg4, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_loff_t))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_getdents */
> + case 141:
> + {
> + uint32_t count;
> + regcache_raw_read (record_regcache, tdep->arg2,
> + (gdb_byte *) & tmpu32);
> + regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & count);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_dirent * count))
> + {
> + return (-1);
> + }
> + }
> + break;
> +
> + /* sys_select */
> + case 142:
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_fd_set))
> + {
> + return (-1);
> + }
> + regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_fd_set))
> + {
> + return (-1);
> + }
> + regcache_raw_read (record_regcache, tdep->arg4, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_fd_set))
> + {
> + return (-1);
> + }
> + regcache_raw_read (record_regcache, tdep->arg5, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_timeval))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_flock */
> + case 143:
> + /* sys_msync */
> + case 144:
> + break;
> +
> + /* sys_readv */
> + case 145:
> + {
> + uint32_t vec;
> + uint32_t vlen;
> + struct record_iovec
> + {
> + uint32_t iov_base;
> + uint32_t iov_len;
> + } iov;
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & vec);
> + if (vec)
> + {
> + regcache_raw_read (record_regcache, tdep->arg3,
> + (gdb_byte *) & vlen);
> + for (tmpu32 = 0; tmpu32 < vlen; tmpu32++)
> + {
> + if (target_read_memory
> + (vec, (gdb_byte *) & iov, sizeof (struct record_iovec)))
> + {
> + if (record_debug)
> + {
> + fprintf_unfiltered (gdb_stdlog,
> + "Process record: error reading memory at addr = 0x%s len = %d.\n",
> + paddr_nz (vec),
> + sizeof (struct record_iovec));
> + }
> + return (-1);
> + }
> + if (record_arch_list_add_mem (iov.iov_base, iov.iov_len))
> + {
> + return (-1);
> + }
> + vec += sizeof (struct record_iovec);
> + }
> + }
> + }
> + break;
> +
> + /* sys_writev */
> + case 146:
> + /* sys_getsid */
> + case 147:
> + /* sys_fdatasync */
> + case 148:
> + /* sys_sysctl */
> + case 149:
> + /* sys_mlock */
> + case 150:
> + /* sys_munlock */
> + case 151:
> + /* sys_mlockall */
> + case 152:
> + /* sys_munlockall */
> + case 153:
> + /* sys_sched_setparam */
> + case 154:
> + break;
> +
> + /* sys_sched_getparam */
> + case 155:
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_int))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_sched_setscheduler */
> + case 156:
> + /* sys_sched_getscheduler */
> + case 157:
> + /* sys_sched_yield */
> + case 158:
> + /* sys_sched_get_priority_max */
> + case 159:
> + /* sys_sched_get_priority_min */
> + case 160:
> + break;
> +
> + /* sys_sched_rr_get_interval */
> + case 161:
> + /* sys_nanosleep */
> + case 162:
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_timespec))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_mremap */
> + case 163:
> + /* sys_setresuid16 */
> + case 164:
> + break;
> +
> + /* sys_getresuid16 */
> + case 165:
> + regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_old_uid_t))
> + {
> + return (-1);
> + }
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_old_uid_t))
> + {
> + return (-1);
> + }
> + regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_old_uid_t))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_vm86 */
> + case 166:
> + /* sys_ni_syscall */
> + case 167:
> + break;
> +
> + /* sys_poll */
> + case 168:
> + regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
> + if (tmpu32)
> + {
> + uint32_t nfds;
> + regcache_raw_read (record_regcache, tdep->arg2,
> + (gdb_byte *) & nfds);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_pollfd * nfds))
> + {
> + return (-1);
> + }
> + }
> + break;
> +
> + /* sys_nfsservctl */
> + case 169:
> + regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
> + if (tmpu32 == 7 || tmpu32 == 8)
> + {
> + uint32_t rsize;
> + if (tmpu32 == 7)
> + {
> + rsize = tdep->size_NFS_FHSIZE;
> + }
> + else
> + {
> + rsize = tdep->size_knfsd_fh;
> + }
> + regcache_raw_read (record_regcache, tdep->arg3,
> + (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, rsize))
> + {
> + return (-1);
> + }
> + }
> + break;
> +
> + /* sys_setresgid16 */
> + case 170:
> + break;
> +
> + /* sys_getresgid16 */
> + case 171:
> + regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_old_gid_t))
> + {
> + return (-1);
> + }
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_old_gid_t))
> + {
> + return (-1);
> + }
> + regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_old_gid_t))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_prctl */
> + case 172:
> + regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
> + switch (tmpu32)
> + {
> + case 2:
> + regcache_raw_read (record_regcache, tdep->arg2,
> + (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_int))
> + {
> + return (-1);
> + }
> + break;
> + case 16:
> + regcache_raw_read (record_regcache, tdep->arg2,
> + (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_TASK_COMM_LEN))
> + {
> + return (-1);
> + }
> + break;
> + }
> + break;
> +
> + /* sys_rt_sigreturn */
> + case 173:
> + break;
> +
> + /* sys_rt_sigaction */
> + case 174:
> + regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_sigaction))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_rt_sigprocmask */
> + case 175:
> + regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_sigset_t))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_rt_sigpending */
> + case 176:
> + regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
> + if (tmpu32)
> + {
> + uint32_t sigsetsize;
> + regcache_raw_read (record_regcache, tdep->arg2,
> + (gdb_byte *) & sigsetsize);
> + if (record_arch_list_add_mem (tmpu32, sigsetsize))
> + {
> + return (-1);
> + }
> + }
> + break;
> +
> + /* sys_rt_sigtimedwait */
> + case 177:
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_siginfo_t))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_rt_sigqueueinfo */
> + case 178:
> + /* sys_rt_sigsuspend */
> + case 179:
> + break;
> +
> + /* sys_pread64 */
> + case 180:
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + if (tmpu32)
> + {
> + uint32_t count;
> + regcache_raw_read (record_regcache, tdep->arg3,
> + (gdb_byte *) & count);
> + if (record_arch_list_add_mem (tmpu32, count))
> + {
> + return (-1);
> + }
> + }
> + break;
> +
> + /* sys_pwrite64 */
> + case 181:
> + /* sys_chown16 */
> + case 182:
> + break;
> +
> + /* sys_getcwd */
> + case 183:
> + regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
> + if (tmpu32)
> + {
> + uint32_t size;
> + regcache_raw_read (record_regcache, tdep->arg2,
> + (gdb_byte *) & size);
> + if (record_arch_list_add_mem (tmpu32, size))
> + {
> + return (-1);
> + }
> + }
> + break;
> +
> + /* sys_capget */
> + case 184:
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_cap_user_data_t))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_capset */
> + case 185:
> + break;
> +
> + /* sys_sigaltstack */
> + case 186:
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_stack_t))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_sendfile */
> + case 187:
> + regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_off_t))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_ni_syscall */
> + case 188:
> + /* sys_ni_syscall */
> + case 189:
> + /* sys_vfork */
> + case 190:
> + break;
> +
> + /* sys_getrlimit */
> + case 191:
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_rlimit))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_mmap2 */
> + case 192:
> + break;
> +
> + /* sys_truncate64 */
> + case 193:
> + /* sys_ftruncate64 */
> + case 194:
> + break;
> +
> + /* sys_stat64 */
> + case 195:
> + /* sys_lstat64 */
> + case 196:
> + /* sys_fstat64 */
> + case 197:
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_stat64))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_lchown */
> + case 198:
> + /* sys_getuid */
> + case 199:
> + /* sys_getgid */
> + case 200:
> + /* sys_geteuid */
> + case 201:
> + /* sys_getegid */
> + case 202:
> + /* sys_setreuid */
> + case 203:
> + /* sys_setregid */
> + case 204:
> + break;
> +
> + /* sys_getgroups */
> + case 205:
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + if (tmpu32)
> + {
> + int gidsetsize;
> + regcache_raw_read (record_regcache, tdep->arg1,
> + (gdb_byte *) & gidsetsize);
> + if (record_arch_list_add_mem
> + (tmpu32, tdep->size_gid_t * gidsetsize))
> + {
> + return (-1);
> + }
> + }
> + break;
> +
> + /* sys_setgroups */
> + case 206:
> + /* sys_fchown */
> + case 207:
> + /* sys_setresuid */
> + case 208:
> + break;
> +
> + /* sys_getresuid */
> + case 209:
> + regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_uid_t))
> + {
> + return (-1);
> + }
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_uid_t))
> + {
> + return (-1);
> + }
> + regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_uid_t))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_setresgid */
> + case 210:
> + break;
> +
> + /* sys_getresgid */
> + case 211:
> + regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_gid_t))
> + {
> + return (-1);
> + }
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_gid_t))
> + {
> + return (-1);
> + }
> + regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_gid_t))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_chown */
> + case 212:
> + /* sys_setuid */
> + case 213:
> + /* sys_setgid */
> + case 214:
> + /* sys_setfsuid */
> + case 215:
> + /* sys_setfsgid */
> + case 216:
> + /* sys_pivot_root */
> + case 217:
> + break;
> +
> + /* sys_mincore */
> + case 218:
> + regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_PAGE_SIZE))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_madvise */
> + case 219:
> + break;
> +
> + /* sys_getdents64 */
> + case 220:
> + {
> + uint32_t count;
> + regcache_raw_read (record_regcache, tdep->arg2,
> + (gdb_byte *) & tmpu32);
> + regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & count);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_dirent64 * count))
> + {
> + return (-1);
> + }
> + }
> + break;
> +
> + /* sys_fcntl64 */
> + case 221:
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + switch (tmpu32)
> + {
> + case F_GETLK64:
> + regcache_raw_read (record_regcache, tdep->arg3,
> + (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_flock64))
> + {
> + return (-1);
> + }
> + break;
> + case F_SETLK64:
> + case F_SETLKW64:
> + break;
> + default:
> + goto sys_fcntl;
> + break;
> + }
> + break;
> +
> + /* sys_ni_syscall */
> + case 222:
> + /* sys_ni_syscall */
> + case 223:
> + /* sys_gettid */
> + case 224:
> + /* sys_readahead */
> + case 225:
> + /* sys_setxattr */
> + case 226:
> + /* sys_lsetxattr */
> + case 227:
> + /* sys_fsetxattr */
> + case 228:
> + break;
> +
> + /* sys_getxattr */
> + case 229:
> + /* sys_lgetxattr */
> + case 230:
> + /* sys_fgetxattr */
> + case 231:
> + regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
> + if (tmpu32)
> + {
> + uint32_t size;
> + regcache_raw_read (record_regcache, tdep->arg4,
> + (gdb_byte *) & size);
> + if (record_arch_list_add_mem (tmpu32, size))
> + {
> + return (-1);
> + }
> + }
> + break;
> +
> + /* sys_listxattr */
> + case 232:
> + /* sys_llistxattr */
> + case 233:
> + /* sys_flistxattr */
> + case 234:
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + if (tmpu32)
> + {
> + uint32_t size;
> + regcache_raw_read (record_regcache, tdep->arg3,
> + (gdb_byte *) & size);
> + if (record_arch_list_add_mem (tmpu32, size))
> + {
> + return (-1);
> + }
> + }
> + break;
> +
> + /* sys_removexattr */
> + case 235:
> + /* sys_lremovexattr */
> + case 236:
> + /* sys_fremovexattr */
> + case 237:
> + /* sys_tkill */
> + case 238:
> + break;
> +
> + /* sys_sendfile64 */
> + case 239:
> + regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_loff_t))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_futex */
> + case 240:
> + /* sys_sched_setaffinity */
> + case 241:
> + break;
> +
> + /* sys_sched_getaffinity */
> + case 242:
> + regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
> + if (tmpu32)
> + {
> + uint32_t len;
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & len);
> + if (record_arch_list_add_mem (tmpu32, len))
> + {
> + return (-1);
> + }
> + }
> + break;
> +
> + /* sys_set_thread_area */
> + case 243:
> + regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_int))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_get_thread_area */
> + case 244:
> + regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_user_desc))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_io_setup */
> + case 245:
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_long))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_io_destroy */
> + case 246:
> + break;
> +
> + /* sys_io_getevents */
> + case 247:
> + regcache_raw_read (record_regcache, tdep->arg4, (gdb_byte *) & tmpu32);
> + if (tmpu32)
> + {
> + int32_t nr;
> + regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & nr);
> + if (record_arch_list_add_mem (tmpu32, nr * tdep->size_io_event))
> + {
> + return (-1);
> + }
> + }
> + break;
> +
> + /* sys_io_submit */
> + case 248:
> + regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
> + if (tmpu32)
> + {
> + int32_t i, nr;
> + uint32_t *iocbp;
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & nr);
> + iocbp = (uint32_t *) alloca (nr * tdep->size_int);
> + if (target_read_memory
> + (tmpu32, (gdb_byte *) iocbp, nr * tdep->size_int))
> + {
> + if (record_debug)
> + {
> + fprintf_unfiltered (gdb_stdlog,
> + "Process record: error reading memory at addr = 0x%s len = %d.\n",
> + paddr_nz (tmpu32), nr * tdep->size_int);
> + }
> + return (-1);
> + }
> + for (i = 0; i < nr; i++)
> + {
> + if (record_arch_list_add_mem (iocbp[i], tdep->size_iocb))
> + {
> + return (-1);
> + }
> + }
> + }
> + break;
> +
> + /* sys_io_cancel */
> + case 249:
> + regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_io_event))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_fadvise64 */
> + case 250:
> + /* sys_ni_syscall */
> + case 251:
> + break;
> +
> + /* sys_exit_group */
> + case 252:
> + {
> + int q;
> + target_terminal_ours ();
> + q =
> + yquery (_
> + ("The next instruction is syscall exit_group. It will make the program exit. Do you want to stop the program?"));
> + target_terminal_inferior ();
> + if (q)
> + {
> + return (1);
> + }
> + }
> + break;
> +
> + /* sys_lookup_dcookie */
> + case 253:
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + if (tmpu32)
> + {
> + uint32_t len;
> + regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & len);
> + if (record_arch_list_add_mem (tmpu32, len))
> + {
> + return (-1);
> + }
> + }
> + break;
> +
> + /* sys_epoll_create */
> + case 254:
> + /* sys_epoll_ctl */
> + case 255:
> + break;
> +
> + /* sys_epoll_wait */
> + case 256:
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + if (tmpu32)
> + {
> + int32_t maxevents;
> + regcache_raw_read (record_regcache, tdep->arg3,
> + (gdb_byte *) & maxevents);
> + if (record_arch_list_add_mem
> + (tmpu32, maxevents * tdep->size_epoll_event))
> + {
> + return (-1);
> + }
> + }
> + break;
> +
> + /* sys_remap_file_pages */
> + case 257:
> + /* sys_set_tid_address */
> + case 258:
> + break;
> +
> + /* sys_timer_create */
> + case 259:
> + regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_int))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_timer_settime */
> + case 260:
> + regcache_raw_read (record_regcache, tdep->arg4, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_itimerspec))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_timer_gettime */
> + case 261:
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_itimerspec))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_timer_getoverrun */
> + case 262:
> + /* sys_timer_delete */
> + case 263:
> + /* sys_clock_settime */
> + case 264:
> + break;
> +
> + /* sys_clock_gettime */
> + case 265:
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_timespec))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_clock_getres */
> + case 266:
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_timespec))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_clock_nanosleep */
> + case 267:
> + regcache_raw_read (record_regcache, tdep->arg4, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_timespec))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_statfs64 */
> + case 268:
> + /* sys_fstatfs64 */
> + case 269:
> + regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_statfs64))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_tgkill */
> + case 270:
> + /* sys_utimes */
> + case 271:
> + /* sys_fadvise64_64 */
> + case 272:
> + /* sys_ni_syscall */
> + case 273:
> + /* sys_mbind */
> + case 274:
> + break;
> +
> + /* sys_get_mempolicy */
> + case 275:
> + regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_int))
> + {
> + return (-1);
> + }
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + if (tmpu32)
> + {
> + uint32_t maxnode;
> + regcache_raw_read (record_regcache, tdep->arg3,
> + (gdb_byte *) & maxnode);
> + if (record_arch_list_add_mem (tmpu32, maxnode * tdep->size_long))
> + {
> + return (-1);
> + }
> + }
> + break;
> +
> + /* sys_set_mempolicy */
> + case 276:
> + /* sys_mq_open */
> + case 277:
> + /* sys_mq_unlink */
> + case 278:
> + /* sys_mq_timedsend */
> + case 279:
> + break;
> +
> + /* sys_mq_timedreceive */
> + case 280:
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + if (tmpu32)
> + {
> + uint32_t msg_len;
> + regcache_raw_read (record_regcache, tdep->arg3,
> + (gdb_byte *) & msg_len);
> + if (record_arch_list_add_mem (tmpu32, msg_len))
> + {
> + return (-1);
> + }
> + }
> + regcache_raw_read (record_regcache, tdep->arg4, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_int))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_mq_notify */
> + case 281:
> + break;
> +
> + /* sys_mq_getsetattr */
> + case 282:
> + regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_mq_attr))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_kexec_load */
> + case 283:
> + break;
> +
> + /* sys_waitid */
> + case 284:
> + regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_siginfo))
> + {
> + return (-1);
> + }
> + regcache_raw_read (record_regcache, tdep->arg5, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_rusage))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_ni_syscall */
> + case 285:
> + /* sys_add_key */
> + case 286:
> + /* sys_request_key */
> + case 287:
> + break;
> +
> + /* sys_keyctl */
> + case 288:
> + regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
> + if (tmpu32 == 6 || tmpu32 == 11)
> + {
> + regcache_raw_read (record_regcache, tdep->arg3,
> + (gdb_byte *) & tmpu32);
> + if (tmpu32)
> + {
> + uint32_t buflen;
> + regcache_raw_read (record_regcache, tdep->arg4,
> + (gdb_byte *) & buflen);
> + if (record_arch_list_add_mem (tmpu32, buflen))
> + {
> + return (-1);
> + }
> + }
> + }
> + break;
> +
> + /* sys_ioprio_set */
> + case 289:
> + /* sys_ioprio_get */
> + case 290:
> + /* sys_inotify_init */
> + case 291:
> + /* sys_inotify_add_watch */
> + case 292:
> + /* sys_inotify_rm_watch */
> + case 293:
> + /* sys_migrate_pages */
> + case 294:
> + /* sys_openat */
> + case 295:
> + /* sys_mkdirat */
> + case 296:
> + /* sys_mknodat */
> + case 297:
> + /* sys_fchownat */
> + case 298:
> + /* sys_futimesat */
> + case 299:
> + break;
> +
> + /* sys_fstatat64 */
> + case 300:
> + regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_stat64))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_unlinkat */
> + case 301:
> + /* sys_renameat */
> + case 302:
> + /* sys_linkat */
> + case 303:
> + /* sys_symlinkat */
> + case 304:
> + break;
> +
> + /* sys_readlinkat */
> + case 305:
> + regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
> + if (tmpu32)
> + {
> + int32_t bufsiz;
> + regcache_raw_read (record_regcache, tdep->arg4,
> + (gdb_byte *) & bufsiz);
> + if (record_arch_list_add_mem (tmpu32, bufsiz))
> + {
> + return (-1);
> + }
> + }
> + break;
> +
> + /* sys_fchmodat */
> + case 306:
> + /* sys_faccessat */
> + case 307:
> + break;
> +
> + /* sys_pselect6 */
> + case 308:
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_fd_set))
> + {
> + return (-1);
> + }
> + regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_fd_set))
> + {
> + return (-1);
> + }
> + regcache_raw_read (record_regcache, tdep->arg4, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_fd_set))
> + {
> + return (-1);
> + }
> + regcache_raw_read (record_regcache, tdep->arg5, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_timespec))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_ppoll */
> + case 309:
> + regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
> + if (tmpu32)
> + {
> + uint32_t nfds;
> + regcache_raw_read (record_regcache, tdep->arg2,
> + (gdb_byte *) & nfds);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_pollfd * nfds))
> + {
> + return (-1);
> + }
> + }
> + regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_timespec))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_unshare */
> + case 310:
> + /* sys_set_robust_list */
> + case 311:
> + break;
> +
> + /* sys_get_robust_list */
> + case 312:
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_int))
> + {
> + return (-1);
> + }
> + regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_int))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_splice */
> + case 313:
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_loff_t))
> + {
> + return (-1);
> + }
> + regcache_raw_read (record_regcache, tdep->arg4, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_loff_t))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_sync_file_range */
> + case 314:
> + /* sys_tee */
> + case 315:
> + /* sys_vmsplice */
> + case 316:
> + break;
> +
> + /* sys_move_pages */
> + case 317:
> + regcache_raw_read (record_regcache, tdep->arg5, (gdb_byte *) & tmpu32);
> + if (tmpu32)
> + {
> + uint32_t nr_pages;
> + regcache_raw_read (record_regcache, tdep->arg2,
> + (gdb_byte *) & nr_pages);
> + if (record_arch_list_add_mem (tmpu32, nr_pages * tdep->size_int))
> + {
> + return (-1);
> + }
> + }
> + break;
> +
> + /* sys_getcpu */
> + case 318:
> + regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_int))
> + {
> + return (-1);
> + }
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_int))
> + {
> + return (-1);
> + }
> + regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
> + if (record_arch_list_add_mem (tmpu32, tdep->size_ulong * 2))
> + {
> + return (-1);
> + }
> + break;
> +
> + /* sys_epoll_pwait */
> + case 319:
> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
> + if (tmpu32)
> + {
> + int32_t maxevents;
> + regcache_raw_read (record_regcache, tdep->arg3,
> + (gdb_byte *) & maxevents);
> + if (record_arch_list_add_mem
> + (tmpu32, maxevents * tdep->size_epoll_event))
> + {
> + return (-1);
> + }
> + }
> + break;
> +
> + default:
> + printf_unfiltered (_
> + ("Process record and replay target doesn't support syscall number 0x%08x\n"),
> + tmpu32);
> + return (-1);
> + break;
> + }
> +
> + return (0);
> +}
> --- a//dev/null
> +++ b/linux-record.h
> @@ -0,0 +1,171 @@
> +/* Process record and replay target code for GNU/Linux.
> +
> + Copyright (C) 2008 Free Software Foundation, Inc.
> +
> + This file is part of GDB.
> +
> + This program is free software; you can redistribute it and/or modify
> + it under the terms of the GNU General Public License as published by
> + the Free Software Foundation; either version 3 of the License, or
> + (at your option) any later version.
> +
> + This program is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + GNU General Public License for more details.
> +
> + You should have received a copy of the GNU General Public License
> + along with this program. If not, see <http://www.gnu.org/licenses/>. */
> +
> +#ifndef _LINUX_RECORD_H_
> +#define _LINUX_RECORD_H_
> +
> +typedef struct linux_record_tdep_s
> +{
> + /* The size of the type that will be use in system call. */
> + int size__old_kernel_stat;
> + int size_tms;
> + int size_loff_t;
> + int size_flock;
> + int size_oldold_utsname;
> + int size_ustat;
> + int size_old_sigaction;
> + int size_old_sigset_t;
> + int size_rlimit;
> + int size_rusage;
> + int size_timeval;
> + int size_timezone;
> + int size_old_gid_t;
> + int size_old_uid_t;
> + int size_fd_set;
> + int size_dirent;
> + int size_dirent64;
> + int size_statfs;
> + int size_statfs64;
> + int size_sockaddr;
> + int size_int;
> + int size_long;
> + int size_ulong;
> + int size_msghdr;
> + int size_itimerval;
> + int size_stat;
> + int size_old_utsname;
> + int size_sysinfo;
> + int size_msqid_ds;
> + int size_shmid_ds;
> + int size_new_utsname;
> + int size_timex;
> + int size_mem_dqinfo;
> + int size_if_dqblk;
> + int size_fs_quota_stat;
> + int size_timespec;
> + int size_pollfd;
> + int size_NFS_FHSIZE;
> + int size_knfsd_fh;
> + int size_TASK_COMM_LEN;
> + int size_sigaction;
> + int size_sigset_t;
> + int size_siginfo_t;
> + int size_cap_user_data_t;
> + int size_stack_t;
> + int size_off_t;
> + int size_stat64;
> + int size_gid_t;
> + int size_uid_t;
> + int size_PAGE_SIZE;
> + int size_flock64;
> + int size_user_desc;
> + int size_io_event;
> + int size_iocb;
> + int size_epoll_event;
> + int size_itimerspec;
> + int size_mq_attr;
> + int size_siginfo;
> +
> + int size_termios;
> + int size_termios2;
> + int size_pid_t;
> + int size_winsize;
> + int size_char;
> + int size_serial_struct;
> + int size_serial_icounter_struct;
> + int size_hayes_esp_config;
> +
> + /* the values of the second argument of system call "sys_ioctl". */
> + int ioctl_TCGETS;
> + int ioctl_TCSETS;
> + int ioctl_TCSETSW;
> + int ioctl_TCSETSF;
> + int ioctl_TCGETA;
> + int ioctl_TCSETA;
> + int ioctl_TCSETAW;
> + int ioctl_TCSETAF;
> + int ioctl_TCSBRK;
> + int ioctl_TCXONC;
> + int ioctl_TCFLSH;
> + int ioctl_TIOCEXCL;
> + int ioctl_TIOCNXCL;
> + int ioctl_TIOCSCTTY;
> + int ioctl_TIOCGPGRP;
> + int ioctl_TIOCSPGRP;
> + int ioctl_TIOCOUTQ;
> + int ioctl_TIOCSTI;
> + int ioctl_TIOCGWINSZ;
> + int ioctl_TIOCSWINSZ;
> + int ioctl_TIOCMGET;
> + int ioctl_TIOCMBIS;
> + int ioctl_TIOCMBIC;
> + int ioctl_TIOCMSET;
> + int ioctl_TIOCGSOFTCAR;
> + int ioctl_TIOCSSOFTCAR;
> + int ioctl_FIONREAD;
> + int ioctl_TIOCINQ;
> + int ioctl_TIOCLINUX;
> + int ioctl_TIOCCONS;
> + int ioctl_TIOCGSERIAL;
> + int ioctl_TIOCSSERIAL;
> + int ioctl_TIOCPKT;
> + int ioctl_FIONBIO;
> + int ioctl_TIOCNOTTY;
> + int ioctl_TIOCSETD;
> + int ioctl_TIOCGETD;
> + int ioctl_TCSBRKP;
> + int ioctl_TIOCTTYGSTRUCT;
> + int ioctl_TIOCSBRK;
> + int ioctl_TIOCCBRK;
> + int ioctl_TIOCGSID;
> + int ioctl_TCGETS2;
> + int ioctl_TCSETS2;
> + int ioctl_TCSETSW2;
> + int ioctl_TCSETSF2;
> + int ioctl_TIOCGPTN;
> + int ioctl_TIOCSPTLCK;
> + int ioctl_FIONCLEX;
> + int ioctl_FIOCLEX;
> + int ioctl_FIOASYNC;
> + int ioctl_TIOCSERCONFIG;
> + int ioctl_TIOCSERGWILD;
> + int ioctl_TIOCSERSWILD;
> + int ioctl_TIOCGLCKTRMIOS;
> + int ioctl_TIOCSLCKTRMIOS;
> + int ioctl_TIOCSERGSTRUCT;
> + int ioctl_TIOCSERGETLSR;
> + int ioctl_TIOCSERGETMULTI;
> + int ioctl_TIOCSERSETMULTI;
> + int ioctl_TIOCMIWAIT;
> + int ioctl_TIOCGICOUNT;
> + int ioctl_TIOCGHAYESESP;
> + int ioctl_TIOCSHAYESESP;
> + int ioctl_FIOQSIZE;
> +
> + /* The number of the registers that use to be the arguments of system call. */
> + int arg1;
> + int arg2;
> + int arg3;
> + int arg4;
> + int arg5;
> +} linux_record_tdep_t;
> +
> +extern int record_linux_system_call (int num, linux_record_tdep_t * tdep);
> +
> +#endif /* _LINUX_RECORD_H_ */
> --- a/Makefile.in
> +++ b/Makefile.in
> @@ -515,7 +515,7 @@
> xcoffread.o \
> prologue-value.o \
> symfile-mem.o \
> - corelow.o
> + corelow.o linux-record.o
>
> # Host-dependent makefile fragment comes in here.
> @host_makefile_frag@
> @@ -1297,7 +1297,7 @@
> inf-ptrace.c inf-ttrace.c \
> irix5-nat.c \
> libunwind-frame.c \
> - linux-fork.c \
> + linux-fork.c linux-record.c \
> m68hc11-tdep.c \
> m32r-tdep.c \
> m32r-linux-nat.c m32r-linux-tdep.c \
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: [RFA] Resubmit process record and replay, 5/10
2008-11-20 4:22 ` Michael Snyder
@ 2008-11-20 8:33 ` Thiago Jung Bauermann
2008-11-20 9:00 ` Daniel Jacobowitz
2008-11-20 16:53 ` teawater
0 siblings, 2 replies; 8+ messages in thread
From: Thiago Jung Bauermann @ 2008-11-20 8:33 UTC (permalink / raw)
To: Michael Snyder; +Cc: teawater, gdb-patches
El mié, 19-11-2008 a las 17:49 -0800, Michael Snyder escribió:
> Thiago, you had a question about whether the syscall id numbers
> were invariant across architectures, and I think Hui answered that
> he was using the i386 numbering as representative, and would use
> a target-specific header file or something to translate them.
>
> Or something to that effect.
>
> Did that answer your concern?
I had two different but related concerns, regarding this 5th patch:
1. linux-record.c is really i386 specific, so it should be called
i386-linux-record.c.
2. If the information that needs to be recorded for each syscall (not
the syscall number) is the same accross architectures, the code in
linux-record.c could be made arch-independent and then we wouldn't need
to have this big chunk of code duplicated for each arch supporting
record functionality.
I'm fine with leaving 2 to be investigated/addressed when record adds
support for its 2nd arch. It also may prove impractical, since there may
be slight differences in syscalls for each arch.
--
[]'s
Thiago Jung Bauermann
IBM Linux Technology Center
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [RFA] Resubmit process record and replay, 5/10
2008-11-20 8:33 ` Thiago Jung Bauermann
@ 2008-11-20 9:00 ` Daniel Jacobowitz
2008-11-20 16:53 ` teawater
1 sibling, 0 replies; 8+ messages in thread
From: Daniel Jacobowitz @ 2008-11-20 9:00 UTC (permalink / raw)
To: Thiago Jung Bauermann; +Cc: Michael Snyder, teawater, gdb-patches
On Thu, Nov 20, 2008 at 02:00:07AM -0200, Thiago Jung Bauermann wrote:
> I'm fine with leaving 2 to be investigated/addressed when record adds
> support for its 2nd arch. It also may prove impractical, since there may
> be slight differences in syscalls for each arch.
Correct - there are slight differences, e.g. on LP64 platforms, and
especially in the layout of things like 'struct stat' - I don't know
if that's relevant here.
--
Daniel Jacobowitz
CodeSourcery
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [RFA] Resubmit process record and replay, 5/10
2008-11-20 8:33 ` Thiago Jung Bauermann
2008-11-20 9:00 ` Daniel Jacobowitz
@ 2008-11-20 16:53 ` teawater
2008-11-24 16:50 ` teawater
2008-12-02 7:29 ` teawater
1 sibling, 2 replies; 8+ messages in thread
From: teawater @ 2008-11-20 16:53 UTC (permalink / raw)
To: Thiago Jung Bauermann; +Cc: Michael Snyder, gdb-patches
According to your mail. I think maybe you didn't get my answer. And I
am sorry that send "[RFA] Resubmit" without get you answer.
http://sourceware.org/ml/gdb-patches/2008-11/msg00310.html
Following is the content of the answer:
Thanks Thiago.
On Fri, Nov 14, 2008 at 03:56, Thiago Jung Bauermann
<bauerman@br.ibm.com> wrote:
> El jue, 06-11-2008 a las 15:48 +0800, teawater escribió:
>> +/* Record the values of the registers and memory that will be changed in
>> + current system call.
>> + Return -1 if something wrong. */
>> +
>> +int
>> +record_linux_system_call (int num, linux_record_tdep_t * tdep)
>> +{
>> + uint32_t tmpu32;
>> +
>> + switch (num)
>> + {
> <snip>
>> + /* sys_read */
>> + case 3:
>> + {
>> + uint32_t addr, count;
>> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & addr);
>> + regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & count);
>> + if (record_arch_list_add_mem (addr, count))
>> + {
>> + return (-1);
>> + }
>> + }
>> + break;
> <snip>
>> + case 84:
>> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
>> + if (record_arch_list_add_mem (tmpu32, tdep->size__old_kernel_stat))
>> + {
>> + return (-1);
>> + }
>> + break;
>
> Syscalls have different numbers across different architectures in Linux,
> so this file should be named i386-linux-record.c.
This number is same with i386 number. It's friendly to other arch.
Let me do a introduce of it.
When a record get a system call. It will get the the system number
with itself and convert it to the number that you found in
linux-record.c. I think it can use a table or something like it to
make covert speed up.
There is not some limit of this number. So I make it same with I386.
>
> Do you know if what you need to record for a syscall in one architecture
> is the same as what you need to record in the others? If so, it wouldn't
> be hard to make this file general for Linux in all architectures, and
> just get the syscall number mapping from the XML in the catch syscall
> feature (here are we talking about it again... :-) ). Otherwise, you'll
> have to rename the file, and also you can't directly call
> record_linux_system_call directly from i386-linux-tdep.c like you do
> now. You'd have to add a gdbarch method and reach this code through
> that.
I think most of system call in each arch are same. Except the size of
variables is not same. So I let arch set the size to argv "tdep" of
record_linux_system_call.
And if some system call of a arch is not same with others. It can deal
with it in code of itself. For example, If i386 have a special system
call that not same with other arch. It can deal with it in function
"i386_linux_intx80_sysenter_record".
Put it to xml file it's been talk in
"http://sourceware.org/ml/gdb-patches/2008-11/msg00171.html";.
What about do it later?
Hui
On Thu, Nov 20, 2008 at 12:00, Thiago Jung Bauermann
<bauerman@br.ibm.com> wrote:
> El mié, 19-11-2008 a las 17:49 -0800, Michael Snyder escribió:
>> Thiago, you had a question about whether the syscall id numbers
>> were invariant across architectures, and I think Hui answered that
>> he was using the i386 numbering as representative, and would use
>> a target-specific header file or something to translate them.
>>
>> Or something to that effect.
>>
>> Did that answer your concern?
>
> I had two different but related concerns, regarding this 5th patch:
>
> 1. linux-record.c is really i386 specific, so it should be called
> i386-linux-record.c.
>
> 2. If the information that needs to be recorded for each syscall (not
> the syscall number) is the same accross architectures, the code in
> linux-record.c could be made arch-independent and then we wouldn't need
> to have this big chunk of code duplicated for each arch supporting
> record functionality.
>
> I'm fine with leaving 2 to be investigated/addressed when record adds
> support for its 2nd arch. It also may prove impractical, since there may
> be slight differences in syscalls for each arch.
> --
> []'s
> Thiago Jung Bauermann
> IBM Linux Technology Center
>
>
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: [RFA] Resubmit process record and replay, 5/10
2008-11-20 16:53 ` teawater
@ 2008-11-24 16:50 ` teawater
2008-12-02 7:29 ` teawater
1 sibling, 0 replies; 8+ messages in thread
From: teawater @ 2008-11-24 16:50 UTC (permalink / raw)
To: Thiago Jung Bauermann; +Cc: Michael Snyder, gdb-patches
Hi Thiago,
Sorry to disturb you.
Could you help me on http://sourceware.org/ml/gdb-patches/2008-11/msg00536.html
Thanks,
Hui
On Thu, Nov 20, 2008 at 16:45, teawater <teawater@gmail.com> wrote:
> According to your mail. I think maybe you didn't get my answer. And I
> am sorry that send "[RFA] Resubmit" without get you answer.
>
> http://sourceware.org/ml/gdb-patches/2008-11/msg00310.html
> Following is the content of the answer:
> Thanks Thiago.
> On Fri, Nov 14, 2008 at 03:56, Thiago Jung Bauermann
> <bauerman@br.ibm.com> wrote:
>> El jue, 06-11-2008 a las 15:48 +0800, teawater escribió:
>>> +/* Record the values of the registers and memory that will be changed in
>>> + current system call.
>>> + Return -1 if something wrong. */
>>> +
>>> +int
>>> +record_linux_system_call (int num, linux_record_tdep_t * tdep)
>>> +{
>>> + uint32_t tmpu32;
>>> +
>>> + switch (num)
>>> + {
>> <snip>
>>> + /* sys_read */
>>> + case 3:
>>> + {
>>> + uint32_t addr, count;
>>> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & addr);
>>> + regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & count);
>>> + if (record_arch_list_add_mem (addr, count))
>>> + {
>>> + return (-1);
>>> + }
>>> + }
>>> + break;
>> <snip>
>>> + case 84:
>>> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
>>> + if (record_arch_list_add_mem (tmpu32, tdep->size__old_kernel_stat))
>>> + {
>>> + return (-1);
>>> + }
>>> + break;
>>
>> Syscalls have different numbers across different architectures in Linux,
>> so this file should be named i386-linux-record.c.
>
>
>
> This number is same with i386 number. It's friendly to other arch.
>
> Let me do a introduce of it.
> When a record get a system call. It will get the the system number
> with itself and convert it to the number that you found in
> linux-record.c. I think it can use a table or something like it to
> make covert speed up.
> There is not some limit of this number. So I make it same with I386.
>
>
>
>
>>
>> Do you know if what you need to record for a syscall in one architecture
>> is the same as what you need to record in the others? If so, it wouldn't
>> be hard to make this file general for Linux in all architectures, and
>> just get the syscall number mapping from the XML in the catch syscall
>> feature (here are we talking about it again... :-) ). Otherwise, you'll
>> have to rename the file, and also you can't directly call
>> record_linux_system_call directly from i386-linux-tdep.c like you do
>> now. You'd have to add a gdbarch method and reach this code through
>> that.
>
> I think most of system call in each arch are same. Except the size of
> variables is not same. So I let arch set the size to argv "tdep" of
> record_linux_system_call.
>
> And if some system call of a arch is not same with others. It can deal
> with it in code of itself. For example, If i386 have a special system
> call that not same with other arch. It can deal with it in function
> "i386_linux_intx80_sysenter_record".
>
> Put it to xml file it's been talk in
> "http://sourceware.org/ml/gdb-patches/2008-11/msg00171.html";.
> What about do it later?
>
>
> Hui
>
>
> On Thu, Nov 20, 2008 at 12:00, Thiago Jung Bauermann
> <bauerman@br.ibm.com> wrote:
>> El mié, 19-11-2008 a las 17:49 -0800, Michael Snyder escribió:
>>> Thiago, you had a question about whether the syscall id numbers
>>> were invariant across architectures, and I think Hui answered that
>>> he was using the i386 numbering as representative, and would use
>>> a target-specific header file or something to translate them.
>>>
>>> Or something to that effect.
>>>
>>> Did that answer your concern?
>>
>> I had two different but related concerns, regarding this 5th patch:
>>
>> 1. linux-record.c is really i386 specific, so it should be called
>> i386-linux-record.c.
>>
>> 2. If the information that needs to be recorded for each syscall (not
>> the syscall number) is the same accross architectures, the code in
>> linux-record.c could be made arch-independent and then we wouldn't need
>> to have this big chunk of code duplicated for each arch supporting
>> record functionality.
>>
>> I'm fine with leaving 2 to be investigated/addressed when record adds
>> support for its 2nd arch. It also may prove impractical, since there may
>> be slight differences in syscalls for each arch.
>> --
>> []'s
>> Thiago Jung Bauermann
>> IBM Linux Technology Center
>>
>>
>
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: [RFA] Resubmit process record and replay, 5/10
2008-11-20 16:53 ` teawater
2008-11-24 16:50 ` teawater
@ 2008-12-02 7:29 ` teawater
1 sibling, 0 replies; 8+ messages in thread
From: teawater @ 2008-12-02 7:29 UTC (permalink / raw)
To: Thiago Jung Bauermann; +Cc: Michael Snyder, gdb-patches
Hi Thiago,
Sorry to disturb you.
Could you help me on http://sourceware.org/ml/gdb-patches/2008-11/msg00536.html
Thanks,
Hui
On Thu, Nov 20, 2008 at 16:45, teawater <teawater@gmail.com> wrote:
> According to your mail. I think maybe you didn't get my answer. And I
> am sorry that send "[RFA] Resubmit" without get you answer.
>
> http://sourceware.org/ml/gdb-patches/2008-11/msg00310.html
> Following is the content of the answer:
> Thanks Thiago.
> On Fri, Nov 14, 2008 at 03:56, Thiago Jung Bauermann
> <bauerman@br.ibm.com> wrote:
>> El jue, 06-11-2008 a las 15:48 +0800, teawater escribió:
>>> +/* Record the values of the registers and memory that will be changed in
>>> + current system call.
>>> + Return -1 if something wrong. */
>>> +
>>> +int
>>> +record_linux_system_call (int num, linux_record_tdep_t * tdep)
>>> +{
>>> + uint32_t tmpu32;
>>> +
>>> + switch (num)
>>> + {
>> <snip>
>>> + /* sys_read */
>>> + case 3:
>>> + {
>>> + uint32_t addr, count;
>>> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & addr);
>>> + regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & count);
>>> + if (record_arch_list_add_mem (addr, count))
>>> + {
>>> + return (-1);
>>> + }
>>> + }
>>> + break;
>> <snip>
>>> + case 84:
>>> + regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
>>> + if (record_arch_list_add_mem (tmpu32, tdep->size__old_kernel_stat))
>>> + {
>>> + return (-1);
>>> + }
>>> + break;
>>
>> Syscalls have different numbers across different architectures in Linux,
>> so this file should be named i386-linux-record.c.
>
>
>
> This number is same with i386 number. It's friendly to other arch.
>
> Let me do a introduce of it.
> When a record get a system call. It will get the the system number
> with itself and convert it to the number that you found in
> linux-record.c. I think it can use a table or something like it to
> make covert speed up.
> There is not some limit of this number. So I make it same with I386.
>
>
>
>
>>
>> Do you know if what you need to record for a syscall in one architecture
>> is the same as what you need to record in the others? If so, it wouldn't
>> be hard to make this file general for Linux in all architectures, and
>> just get the syscall number mapping from the XML in the catch syscall
>> feature (here are we talking about it again... :-) ). Otherwise, you'll
>> have to rename the file, and also you can't directly call
>> record_linux_system_call directly from i386-linux-tdep.c like you do
>> now. You'd have to add a gdbarch method and reach this code through
>> that.
>
> I think most of system call in each arch are same. Except the size of
> variables is not same. So I let arch set the size to argv "tdep" of
> record_linux_system_call.
>
> And if some system call of a arch is not same with others. It can deal
> with it in code of itself. For example, If i386 have a special system
> call that not same with other arch. It can deal with it in function
> "i386_linux_intx80_sysenter_record".
>
> Put it to xml file it's been talk in
> "http://sourceware.org/ml/gdb-patches/2008-11/msg00171.html";.
> What about do it later?
>
>
> Hui
>
>
> On Thu, Nov 20, 2008 at 12:00, Thiago Jung Bauermann
> <bauerman@br.ibm.com> wrote:
>> El mié, 19-11-2008 a las 17:49 -0800, Michael Snyder escribió:
>>> Thiago, you had a question about whether the syscall id numbers
>>> were invariant across architectures, and I think Hui answered that
>>> he was using the i386 numbering as representative, and would use
>>> a target-specific header file or something to translate them.
>>>
>>> Or something to that effect.
>>>
>>> Did that answer your concern?
>>
>> I had two different but related concerns, regarding this 5th patch:
>>
>> 1. linux-record.c is really i386 specific, so it should be called
>> i386-linux-record.c.
>>
>> 2. If the information that needs to be recorded for each syscall (not
>> the syscall number) is the same accross architectures, the code in
>> linux-record.c could be made arch-independent and then we wouldn't need
>> to have this big chunk of code duplicated for each arch supporting
>> record functionality.
>>
>> I'm fine with leaving 2 to be investigated/addressed when record adds
>> support for its 2nd arch. It also may prove impractical, since there may
>> be slight differences in syscalls for each arch.
>> --
>> []'s
>> Thiago Jung Bauermann
>> IBM Linux Technology Center
>>
>>
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [RFA] Resubmit process record and replay, 5/10
2008-11-17 2:18 [RFA] Resubmit process record and replay, 5/10 teawater
2008-11-20 4:22 ` Michael Snyder
@ 2008-12-19 7:23 ` teawater
1 sibling, 0 replies; 8+ messages in thread
From: teawater @ 2008-12-19 7:23 UTC (permalink / raw)
To: gdb-patches
[-- Attachment #1: Type: text/plain, Size: 21353 bytes --]
This is the new version patch.
On Sun, Nov 16, 2008 at 16:21, teawater <teawater@gmail.com> wrote:
> This patch add process record and replay for Linux support file. The
> main function is "record_linux_system_call" will be called by
> architecture record function. It is used to record the system call
> execute log.
>
> 2008-11-16 Hui Zhu <teawater@gmail.com>
>
> Process record and replay target.
>
> * Makefile.in (linux-record.c): New file.
> * configure.tgt (linux-record.c): New file.
> * linux-record.c, linux-record.h: New file.
>
> Makefile.in | 4
> b/linux-record.c | 2501 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
> b/linux-record.h | 171 +++
> configure.tgt | 6
> 4 files changed, 2678 insertions(+), 4 deletions(-)
>
> Following is the diff with the previous patch:
> @@ -1,6 +1,6 @@
> --- a/configure.tgt
> +++ b/configure.tgt
> -@@ -185,7 +185,8 @@ i[34567]86-*-solaris*)
> +@@ -185,7 +185,8 @@
> i[34567]86-*-linux*)
> # Target: Intel 386 running GNU/Linux
> gdb_target_obs="i386-tdep.o i386-linux-tdep.o glibc-tdep.o i387-tdep.o \
> @@ -10,7 +10,7 @@
> build_gdbserver=yes
> ;;
> i[34567]86-*-gnu*)
> -@@ -507,7 +508,8 @@ x86_64-*-linux*)
> +@@ -508,7 +509,8 @@
> # Target: GNU/Linux x86-64
> gdb_target_obs="amd64-tdep.o amd64-linux-tdep.o i386-tdep.o \
> i387-tdep.o i386-linux-tdep.o glibc-tdep.o \
> @@ -20,29 +20,9 @@
> build_gdbserver=yes
> ;;
> x86_64-*-freebsd* | x86_64-*-kfreebsd*-gnu)
> ---- a/Makefile.in
> -+++ b/Makefile.in
> -@@ -515,7 +515,7 @@ ALL_TARGET_OBS = \
> - xcoffread.o \
> - prologue-value.o \
> - symfile-mem.o \
> -- corelow.o
> -+ corelow.o linux-record.o
> -
> - # Host-dependent makefile fragment comes in here.
> - @host_makefile_frag@
> -@@ -1297,7 +1297,7 @@ ALLDEPFILES = \
> - inf-ptrace.c inf-ttrace.c \
> - irix5-nat.c \
> - libunwind-frame.c \
> -- linux-fork.c \
> -+ linux-fork.c linux-record.c \
> - m68hc11-tdep.c \
> - m32r-tdep.c \
> - m32r-linux-nat.c m32r-linux-tdep.c \
> ---- a/linux-record.c
> +--- a//dev/null
> +++ b/linux-record.c
> -@@ -0,0 +1,2465 @@
> +@@ -0,0 +1,2501 @@
> +/* Process record and replay target code for GNU/Linux.
> +
> + Copyright (C) 2008 Free Software Foundation, Inc.
> @@ -51,7 +31,7 @@
> +
> + This program is free software; you can redistribute it and/or modify
> + it under the terms of the GNU General Public License as published by
> -+ the Free Software Foundation; either version 2 of the License, or
> ++ the Free Software Foundation; either version 3 of the License, or
> + (at your option) any later version.
> +
> + This program is distributed in the hope that it will be useful,
> @@ -148,7 +128,7 @@
> + target_terminal_ours ();
> + q =
> + yquery (_
> -+ ("The next instruction is syscall exit. It will make the
> program exit. Do you want to stop the program."));
> ++ ("The next instruction is syscall exit. It will make the
> program exit. Do you want to stop the program?"));
> + target_terminal_inferior ();
> + if (q)
> + {
> @@ -453,13 +433,13 @@
> + else if (tmpu32 == tdep->ioctl_TIOCSERGSTRUCT)
> + {
> + printf_unfiltered (_
> -+ ("Record: record and reverse target doesn't support ioctl
> request TIOCSERGSTRUCT\n"));
> ++ ("Process record and replay target doesn't support ioctl
> request TIOCSERGSTRUCT\n"));
> + return (1);
> + }
> + else
> + {
> + printf_unfiltered (_
> -+ ("Record: record and reverse target doesn't support ioctl
> request 0x%08x.\n"),
> ++ ("Process record and replay target doesn't support ioctl
> request 0x%08x.\n"),
> + tmpu32);
> + return (1);
> + }
> @@ -616,22 +596,13 @@
> + /* old_select */
> + case 82:
> + {
> -+ /*
> -+ struct sel_arg_struct {
> -+ unsigned long n;
> -+ fd_set *inp;
> -+ fd_set *outp;
> -+ fd_set *exp;
> -+ struct timeval *tvp;
> -+ };
> -+ */
> + struct sel_arg_struct
> + {
> -+ uint32_t n;
> -+ uint32_t inp;
> -+ uint32_t outp;
> -+ uint32_t exp;
> -+ uint32_t tvp;
> ++ CORE_ADDR n;
> ++ CORE_ADDR inp;
> ++ CORE_ADDR outp;
> ++ CORE_ADDR exp;
> ++ CORE_ADDR tvp;
> + } sel;
> +
> + regcache_raw_read (record_regcache, tdep->arg1,
> @@ -640,9 +611,12 @@
> + {
> + if (target_read_memory (tmpu32, (gdb_byte *) & sel, sizeof (sel)))
> + {
> -+ fprintf_unfiltered (gdb_stdlog,
> -+ "Record: read memory addr = 0x%s len = %d error.\n",
> -+ paddr_nz (tmpu32), sizeof (sel));
> ++ if (record_debug)
> ++ {
> ++ fprintf_unfiltered (gdb_stdlog,
> ++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++ paddr_nz (tmpu32), sizeof (sel));
> ++ }
> + return (-1);
> + }
> + if (record_arch_list_add_mem (sel.inp, tdep->size_fd_set))
> @@ -696,7 +670,7 @@
> + target_terminal_ours ();
> + q =
> + yquery (_
> -+ ("The next instruction is syscall reboot. It will restart the
> computer. Do you want to stop the program."));
> ++ ("The next instruction is syscall reboot. It will restart the
> computer. Do you want to stop the program?"));
> + target_terminal_inferior ();
> + if (q)
> + {
> @@ -730,7 +704,7 @@
> + target_terminal_ours ();
> + q =
> + yquery (_
> -+ ("The next instruction is syscall munmap. It will free the
> memory addr = 0x%s len = %d. It will make record target get error.
> Do you want to stop the program."),
> ++ ("The next instruction is syscall munmap. It will free the
> memory addr = 0x%s len = %d. It will make record target get error.
> Do you want to stop the program?"),
> + paddr_nz (tmpu32), len);
> + target_terminal_inferior ();
> + if (q)
> @@ -792,9 +766,12 @@
> + {
> + if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
> + {
> -+ fprintf_unfiltered (gdb_stdlog,
> -+ "Record: read memory addr = 0x%s len = %d error.\n",
> -+ paddr_nz (tmpu32), sizeof (a));
> ++ if (record_debug)
> ++ {
> ++ fprintf_unfiltered (gdb_stdlog,
> ++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++ paddr_nz (tmpu32), sizeof (a));
> ++ }
> + return (-1);
> + }
> + if (record_arch_list_add_mem (a[1], tdep->size_sockaddr))
> @@ -818,9 +795,12 @@
> + {
> + if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
> + {
> -+ fprintf_unfiltered (gdb_stdlog,
> -+ "Record: read memory addr = 0x%s len = %d error.\n",
> -+ paddr_nz (tmpu32), sizeof (a));
> ++ if (record_debug)
> ++ {
> ++ fprintf_unfiltered (gdb_stdlog,
> ++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++ paddr_nz (tmpu32), sizeof (a));
> ++ }
> + return (-1);
> + }
> + if (record_arch_list_add_mem (a[3], tdep->size_int))
> @@ -842,9 +822,12 @@
> + {
> + if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
> + {
> -+ fprintf_unfiltered (gdb_stdlog,
> -+ "Record: read memory addr = 0x%s len = %d error.\n",
> -+ paddr_nz (tmpu32), sizeof (a));
> ++ if (record_debug)
> ++ {
> ++ fprintf_unfiltered (gdb_stdlog,
> ++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++ paddr_nz (tmpu32), sizeof (a));
> ++ }
> + return (-1);
> + }
> + if (a[2])
> @@ -852,9 +835,12 @@
> + if (target_read_memory
> + (a[2], (gdb_byte *) & (a[2]), sizeof (a[2])))
> + {
> -+ fprintf_unfiltered (gdb_stdlog,
> -+ "Record: read memory addr = 0x%s len = %d error.\n",
> -+ paddr_nz (a[2]), sizeof (a[2]));
> ++ if (record_debug)
> ++ {
> ++ fprintf_unfiltered (gdb_stdlog,
> ++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++ paddr_nz (a[2]), sizeof (a[2]));
> ++ }
> + return (-1);
> + }
> + if (record_arch_list_add_mem (a[1], a[2]))
> @@ -874,9 +860,12 @@
> + {
> + if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
> + {
> -+ fprintf_unfiltered (gdb_stdlog,
> -+ "Record: read memory addr = 0x%s len = %d error.\n",
> -+ paddr_nz (tmpu32), sizeof (a));
> ++ if (record_debug)
> ++ {
> ++ fprintf_unfiltered (gdb_stdlog,
> ++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++ paddr_nz (tmpu32), sizeof (a));
> ++ }
> + return (-1);
> + }
> + if (a[2])
> @@ -884,9 +873,13 @@
> + if (target_read_memory
> + (a[2], (gdb_byte *) & (a[2]), sizeof (a[2])))
> + {
> -+ fprintf_unfiltered (gdb_stdlog,
> -+ "Record: read memory addr = 0x%s len = %d error.\n",
> -+ paddr_nz (a[2]), sizeof (a[2]));
> ++ if (record_debug)
> ++ {
> ++ fprintf_unfiltered (gdb_stdlog,
> ++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++ paddr_nz (a[2]),
> ++ sizeof (a[2]));
> ++ }
> + return (-1);
> + }
> + if (record_arch_list_add_mem (a[1], a[2]))
> @@ -919,9 +912,12 @@
> + {
> + if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
> + {
> -+ fprintf_unfiltered (gdb_stdlog,
> -+ "Record: read memory addr = 0x%s len = %d error.\n",
> -+ paddr_nz (tmpu32), sizeof (a));
> ++ if (record_debug)
> ++ {
> ++ fprintf_unfiltered (gdb_stdlog,
> ++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++ paddr_nz (tmpu32), sizeof (a));
> ++ }
> + return (-1);
> + }
> + if (a[4])
> @@ -929,9 +925,12 @@
> + if (target_read_memory
> + (a[4], (gdb_byte *) & av, sizeof (av)))
> + {
> -+ fprintf_unfiltered (gdb_stdlog,
> -+ "Record: read memory addr = 0x%s len = %d error.\n",
> -+ paddr_nz (a[4]), sizeof (av));
> ++ if (record_debug)
> ++ {
> ++ fprintf_unfiltered (gdb_stdlog,
> ++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++ paddr_nz (a[4]), sizeof (av));
> ++ }
> + return (-1);
> + }
> + if (record_arch_list_add_mem (a[3], av))
> @@ -973,9 +972,12 @@
> + {
> + if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
> + {
> -+ fprintf_unfiltered (gdb_stdlog,
> -+ "Record: read memory addr = 0x%s len = %d error.\n",
> -+ paddr_nz (tmpu32), sizeof (a));
> ++ if (record_debug)
> ++ {
> ++ fprintf_unfiltered (gdb_stdlog,
> ++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++ paddr_nz (tmpu32), sizeof (a));
> ++ }
> + return (-1);
> + }
> + if (record_arch_list_add_mem (a[1], tdep->size_msghdr))
> @@ -987,9 +989,13 @@
> + if (target_read_memory
> + (a[1], (gdb_byte *) & rec, sizeof (rec)))
> + {
> -+ fprintf_unfiltered (gdb_stdlog,
> -+ "Record: read memory addr = 0x%s len = %d error.\n",
> -+ paddr_nz (a[1]), sizeof (rec));
> ++ if (record_debug)
> ++ {
> ++ fprintf_unfiltered (gdb_stdlog,
> ++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++ paddr_nz (a[1]),
> ++ sizeof (rec));
> ++ }
> + return (-1);
> + }
> + if (record_arch_list_add_mem
> @@ -1010,10 +1016,14 @@
> + (rec.msg_iov, (gdb_byte *) & iov,
> + sizeof (iov)))
> + {
> -+ fprintf_unfiltered (gdb_stdlog,
> -+ "Record: read memory addr = 0x%s len = %d error.\n",
> -+ paddr_nz (rec.msg_iov),
> -+ sizeof (iov));
> ++ if (record_debug)
> ++ {
> ++ fprintf_unfiltered (gdb_stdlog,
> ++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++ paddr_nz (rec.
> ++ msg_iov),
> ++ sizeof (iov));
> ++ }
> + return (-1);
> + }
> + if (record_arch_list_add_mem
> @@ -1030,7 +1040,7 @@
> + break;
> + default:
> + printf_unfiltered (_
> -+ ("Record: record and reverse function doesn't support
> socketcall call 0x%08x\n"),
> ++ ("Process record and replay target doesn't support
> socketcall call 0x%08x\n"),
> + tmpu32);
> + return (-1);
> + break;
> @@ -1378,10 +1388,13 @@
> + if (target_read_memory
> + (vec, (gdb_byte *) & iov, sizeof (struct record_iovec)))
> + {
> -+ fprintf_unfiltered (gdb_stdlog,
> -+ "Record: read memory addr = 0x%s len = %d error.\n",
> -+ paddr_nz (vec),
> -+ sizeof (struct record_iovec));
> ++ if (record_debug)
> ++ {
> ++ fprintf_unfiltered (gdb_stdlog,
> ++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++ paddr_nz (vec),
> ++ sizeof (struct record_iovec));
> ++ }
> + return (-1);
> + }
> + if (record_arch_list_add_mem (iov.iov_base, iov.iov_len))
> @@ -2016,9 +2029,12 @@
> + if (target_read_memory
> + (tmpu32, (gdb_byte *) iocbp, nr * tdep->size_int))
> + {
> -+ fprintf_unfiltered (gdb_stdlog,
> -+ "Record: read memory addr = 0x%s len = %d error.\n",
> -+ paddr_nz (tmpu32), nr * tdep->size_int);
> ++ if (record_debug)
> ++ {
> ++ fprintf_unfiltered (gdb_stdlog,
> ++ "Process record: error reading memory at addr = 0x%s len = %d.\n",
> ++ paddr_nz (tmpu32), nr * tdep->size_int);
> ++ }
> + return (-1);
> + }
> + for (i = 0; i < nr; i++)
> @@ -2053,7 +2069,7 @@
> + target_terminal_ours ();
> + q =
> + yquery (_
> -+ ("The next instruction is syscall exit_group. It will make the
> program exit. Do you want to stop the program."));
> ++ ("The next instruction is syscall exit_group. It will make the
> program exit. Do you want to stop the program?"));
> + target_terminal_inferior ();
> + if (q)
> + {
> @@ -2500,7 +2516,7 @@
> +
> + default:
> + printf_unfiltered (_
> -+ ("Record: record and reverse function doesn't support syscall
> number 0x%08x\n"),
> ++ ("Process record and replay target doesn't support syscall
> number 0x%08x\n"),
> + tmpu32);
> + return (-1);
> + break;
> @@ -2508,7 +2524,7 @@
> +
> + return (0);
> +}
> ---- a/linux-record.h
> +--- a//dev/null
> +++ b/linux-record.h
> @@ -0,0 +1,171 @@
> +/* Process record and replay target code for GNU/Linux.
> @@ -2519,7 +2535,7 @@
> +
> + This program is free software; you can redistribute it and/or modify
> + it under the terms of the GNU General Public License as published by
> -+ the Free Software Foundation; either version 2 of the License, or
> ++ the Free Software Foundation; either version 3 of the License, or
> + (at your option) any later version.
> +
> + This program is distributed in the hope that it will be useful,
> @@ -2535,7 +2551,7 @@
> +
> +typedef struct linux_record_tdep_s
> +{
> -+ /* The size of the type that will be use in system call. */
> ++ /* The size of the type that will be use in system call. */
> + int size__old_kernel_stat;
> + int size_tms;
> + int size_loff_t;
> @@ -2604,7 +2620,7 @@
> + int size_serial_icounter_struct;
> + int size_hayes_esp_config;
> +
> -+ /* the values of the second argument of system call "sys_ioctl". */
> ++ /* the values of the second argument of system call "sys_ioctl". */
> + int ioctl_TCGETS;
> + int ioctl_TCSETS;
> + int ioctl_TCSETSW;
> @@ -2671,7 +2687,7 @@
> + int ioctl_TIOCSHAYESESP;
> + int ioctl_FIOQSIZE;
> +
> -+ /* The number of the registers that use to be the arguments of
> system call. */
> ++ /* The number of the registers that use to be the arguments of
> system call. */
> + int arg1;
> + int arg2;
> + int arg3;
> @@ -2682,3 +2698,23 @@
> +extern int record_linux_system_call (int num, linux_record_tdep_t * tdep);
> +
> +#endif /* _LINUX_RECORD_H_ */
> +--- a/Makefile.in
> ++++ b/Makefile.in
> +@@ -515,7 +515,7 @@
> + xcoffread.o \
> + prologue-value.o \
> + symfile-mem.o \
> +- corelow.o
> ++ corelow.o linux-record.o
> +
> + # Host-dependent makefile fragment comes in here.
> + @host_makefile_frag@
> +@@ -1297,7 +1297,7 @@
> + inf-ptrace.c inf-ttrace.c \
> + irix5-nat.c \
> + libunwind-frame.c \
> +- linux-fork.c \
> ++ linux-fork.c linux-record.c \
>
[-- Attachment #2: 5-linux-record.txt --]
[-- Type: text/plain, Size: 66783 bytes --]
--- a/configure.tgt
+++ b/configure.tgt
@@ -190,7 +190,8 @@
i[34567]86-*-linux*)
# Target: Intel 386 running GNU/Linux
gdb_target_obs="i386-tdep.o i386-linux-tdep.o glibc-tdep.o i387-tdep.o \
- solib.o solib-svr4.o symfile-mem.o corelow.o"
+ solib.o solib-svr4.o symfile-mem.o corelow.o \
+ linux-record.o"
build_gdbserver=yes
;;
i[34567]86-*-gnu*)
@@ -513,7 +514,8 @@
# Target: GNU/Linux x86-64
gdb_target_obs="amd64-tdep.o amd64-linux-tdep.o i386-tdep.o \
i387-tdep.o i386-linux-tdep.o glibc-tdep.o \
- solib.o solib-svr4.o corelow.o symfile-mem.o"
+ solib.o solib-svr4.o corelow.o symfile-mem.o \
+ linux-record.o"
build_gdbserver=yes
;;
x86_64-*-freebsd* | x86_64-*-kfreebsd*-gnu)
--- a//dev/null
+++ b/linux-record.c
@@ -0,0 +1,2507 @@
+/* Process record and replay target code for GNU/Linux.
+
+ Copyright (C) 2008 Free Software Foundation, Inc.
+
+ This file is part of GDB.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "defs.h"
+#include "target.h"
+#include "regcache.h"
+#include "record.h"
+#include "linux-record.h"
+#include <stdint.h>
+
+/* These macros are the values of the first argument of system call
+ "sys_ptrace". The values of these macros are gotten from Linux Kernel
+ source. */
+
+#define RECORD_PTRACE_PEEKTEXT 1
+#define RECORD_PTRACE_PEEKDATA 2
+#define RECORD_PTRACE_PEEKUSR 3
+
+/* These macros are the values of the first argument of system call
+ "sys_socketcall". The values of these macros are gotten from Linux Kernel
+ source. */
+
+#define RECORD_SYS_SOCKET 1
+#define RECORD_SYS_BIND 2
+#define RECORD_SYS_CONNECT 3
+#define RECORD_SYS_LISTEN 4
+#define RECORD_SYS_ACCEPT 5
+#define RECORD_SYS_GETSOCKNAME 6
+#define RECORD_SYS_GETPEERNAME 7
+#define RECORD_SYS_SOCKETPAIR 8
+#define RECORD_SYS_SEND 9
+#define RECORD_SYS_RECV 10
+#define RECORD_SYS_SENDTO 11
+#define RECORD_SYS_RECVFROM 12
+#define RECORD_SYS_SHUTDOWN 13
+#define RECORD_SYS_SETSOCKOPT 14
+#define RECORD_SYS_GETSOCKOPT 15
+#define RECORD_SYS_SENDMSG 16
+#define RECORD_SYS_RECVMSG 17
+
+/* These macros are the values of the first argument of system call
+ "sys_ipc". The values of these macros are gotten from Linux Kernel source.
+ */
+
+#define RECORD_SEMOP 1
+#define RECORD_SEMGET 2
+#define RECORD_SEMCTL 3
+#define RECORD_SEMTIMEDOP 4
+#define RECORD_MSGSND 11
+#define RECORD_MSGRCV 12
+#define RECORD_MSGGET 13
+#define RECORD_MSGCTL 14
+#define RECORD_SHMAT 21
+#define RECORD_SHMDT 22
+#define RECORD_SHMGET 23
+#define RECORD_SHMCTL 24
+
+/* These macros are the values of the first argument of system call
+ "sys_quotactl". The values of these macros are gotten from Linux Kernel
+ source. */
+
+#define RECORD_Q_GETFMT 0x800004
+#define RECORD_Q_GETINFO 0x800005
+#define RECORD_Q_GETQUOTA 0x800007
+#define RECORD_Q_XGETQSTAT (('5'<<8)+(5))
+#define RECORD_Q_XGETQUOTA (('3'<<8)+(3))
+
+/* When the architecture process record get a Linux syscall instruction, it
+ will get a Linux syscall number of this architecture and convert it to the
+ Linux syscall number "num" which is internal to GDB.
+ Most Linux syscalls across architectures in Linux would be similar and
+ mostly differ by sizes of types and structures. This sizes are put
+ to "tdep".
+ Record the values of the registers and memory that will be changed in
+ current system call.
+ Return -1 if something wrong. */
+
+int
+record_linux_system_call (int num, linux_record_tdep_t * tdep)
+{
+ uint32_t tmpu32;
+
+ switch (num)
+ {
+ /* sys_restart_syscall */
+ case 0:
+ break;
+
+ /* sys_exit */
+ case 1:
+ {
+ int q;
+ target_terminal_ours ();
+ q =
+ yquery (_
+ ("The next instruction is syscall exit. It will make the program exit. Do you want to stop the program?"));
+ target_terminal_inferior ();
+ if (q)
+ {
+ return (1);
+ }
+ }
+ break;
+
+ /* sys_fork */
+ case 2:
+ break;
+
+ /* sys_read */
+ case 3:
+ {
+ uint32_t addr, count;
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & addr);
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & count);
+ if (record_arch_list_add_mem (addr, count))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_write */
+ case 4:
+ /* sys_open */
+ case 5:
+ /* sys_close */
+ case 6:
+ /* sys_waitpid */
+ case 7:
+ /* sys_creat */
+ case 8:
+ /* sys_link */
+ case 9:
+ /* sys_unlink */
+ case 10:
+ /* sys_execve */
+ case 11:
+ /* sys_chdir */
+ case 12:
+ /* sys_time */
+ case 13:
+ /* sys_mknod */
+ case 14:
+ /* sys_chmod */
+ case 15:
+ /* sys_lchown16 */
+ case 16:
+ /* sys_ni_syscall */
+ case 17:
+ break;
+
+ /* sys_stat */
+ case 18:
+ /* sys_fstat */
+ case 28:
+ /* sys_lstat */
+ case 84:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size__old_kernel_stat))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_lseek */
+ case 19:
+ /* sys_getpid */
+ case 20:
+ /* sys_mount */
+ case 21:
+ /* sys_oldumount */
+ case 22:
+ /* sys_setuid16 */
+ case 23:
+ /* sys_getuid16 */
+ case 24:
+ /* sys_stime */
+ case 25:
+ break;
+
+ /* sys_ptrace */
+ case 26:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (tmpu32 == RECORD_PTRACE_PEEKTEXT
+ || tmpu32 == RECORD_PTRACE_PEEKDATA
+ || tmpu32 == RECORD_PTRACE_PEEKUSR)
+ {
+ regcache_raw_read (record_regcache, tdep->arg4,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, 4))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_alarm */
+ case 27:
+ /* sys_pause */
+ case 29:
+ /* sys_utime */
+ case 30:
+ /* sys_ni_syscall */
+ case 31:
+ /* sys_ni_syscall */
+ case 32:
+ /* sys_access */
+ case 33:
+ /* sys_nice */
+ case 34:
+ /* sys_ni_syscall */
+ case 35:
+ /* sys_sync */
+ case 36:
+ /* sys_kill */
+ case 37:
+ /* sys_rename */
+ case 38:
+ /* sys_mkdir */
+ case 39:
+ /* sys_rmdir */
+ case 40:
+ /* sys_dup */
+ case 41:
+ /* sys_pipe */
+ case 42:
+ break;
+
+ /* sys_times */
+ case 43:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_tms))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_ni_syscall */
+ case 44:
+ /* sys_brk */
+ case 45:
+ /* sys_setgid16 */
+ case 46:
+ /* sys_getgid16 */
+ case 47:
+ /* sys_signal */
+ case 48:
+ /* sys_geteuid16 */
+ case 49:
+ /* sys_getegid16 */
+ case 50:
+ /* sys_acct */
+ case 51:
+ /* sys_umount */
+ case 52:
+ /* sys_ni_syscall */
+ case 53:
+ break;
+
+ /* sys_ioctl */
+ case 54:
+ /* XXX there need add a lot of support of other ioctl requests. */
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (tmpu32 == tdep->ioctl_FIOCLEX || tmpu32 == tdep->ioctl_FIONCLEX
+ || tmpu32 == tdep->ioctl_FIONBIO || tmpu32 == tdep->ioctl_FIOASYNC
+ || tmpu32 == tdep->ioctl_TCSETS || tmpu32 == tdep->ioctl_TCSETSW
+ || tmpu32 == tdep->ioctl_TCSETSF || tmpu32 == tdep->ioctl_TCSETA
+ || tmpu32 == tdep->ioctl_TCSETAW || tmpu32 == tdep->ioctl_TCSETAF
+ || tmpu32 == tdep->ioctl_TCSBRK || tmpu32 == tdep->ioctl_TCXONC
+ || tmpu32 == tdep->ioctl_TCFLSH || tmpu32 == tdep->ioctl_TIOCEXCL
+ || tmpu32 == tdep->ioctl_TIOCNXCL
+ || tmpu32 == tdep->ioctl_TIOCSCTTY
+ || tmpu32 == tdep->ioctl_TIOCSPGRP || tmpu32 == tdep->ioctl_TIOCSTI
+ || tmpu32 == tdep->ioctl_TIOCSWINSZ
+ || tmpu32 == tdep->ioctl_TIOCMBIS || tmpu32 == tdep->ioctl_TIOCMBIC
+ || tmpu32 == tdep->ioctl_TIOCMSET
+ || tmpu32 == tdep->ioctl_TIOCSSOFTCAR
+ || tmpu32 == tdep->ioctl_TIOCCONS
+ || tmpu32 == tdep->ioctl_TIOCSSERIAL
+ || tmpu32 == tdep->ioctl_TIOCPKT || tmpu32 == tdep->ioctl_TIOCNOTTY
+ || tmpu32 == tdep->ioctl_TIOCSETD || tmpu32 == tdep->ioctl_TCSBRKP
+ || tmpu32 == tdep->ioctl_TIOCTTYGSTRUCT
+ || tmpu32 == tdep->ioctl_TIOCSBRK || tmpu32 == tdep->ioctl_TIOCCBRK
+ || tmpu32 == tdep->ioctl_TCSETS2 || tmpu32 == tdep->ioctl_TCSETSW2
+ || tmpu32 == tdep->ioctl_TCSETSF2
+ || tmpu32 == tdep->ioctl_TIOCSPTLCK
+ || tmpu32 == tdep->ioctl_TIOCSERCONFIG
+ || tmpu32 == tdep->ioctl_TIOCSERGWILD
+ || tmpu32 == tdep->ioctl_TIOCSERSWILD
+ || tmpu32 == tdep->ioctl_TIOCSLCKTRMIOS
+ || tmpu32 == tdep->ioctl_TIOCSERGETMULTI
+ || tmpu32 == tdep->ioctl_TIOCSERSETMULTI
+ || tmpu32 == tdep->ioctl_TIOCMIWAIT
+ || tmpu32 == tdep->ioctl_TIOCSHAYESESP)
+ {
+ /* Nothing to do. */
+ }
+ else if (tmpu32 == tdep->ioctl_TCGETS || tmpu32 == tdep->ioctl_TCGETA
+ || tmpu32 == tdep->ioctl_TIOCGLCKTRMIOS)
+ {
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_termios))
+ {
+ return (-1);
+ }
+ }
+ else if (tmpu32 == tdep->ioctl_TIOCGPGRP
+ || tmpu32 == tdep->ioctl_TIOCGSID)
+ {
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_pid_t))
+ {
+ return (-1);
+ }
+ }
+ else if (tmpu32 == tdep->ioctl_TIOCOUTQ
+ || tmpu32 == tdep->ioctl_TIOCMGET
+ || tmpu32 == tdep->ioctl_TIOCGSOFTCAR
+ || tmpu32 == tdep->ioctl_FIONREAD
+ || tmpu32 == tdep->ioctl_TIOCINQ
+ || tmpu32 == tdep->ioctl_TIOCGETD
+ || tmpu32 == tdep->ioctl_TIOCGPTN
+ || tmpu32 == tdep->ioctl_TIOCSERGETLSR)
+ {
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_int))
+ {
+ return (-1);
+ }
+ }
+ else if (tmpu32 == tdep->ioctl_TIOCGWINSZ)
+ {
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_winsize))
+ {
+ return (-1);
+ }
+ }
+ else if (tmpu32 == tdep->ioctl_TIOCLINUX)
+ {
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_char))
+ {
+ return (-1);
+ }
+ }
+ else if (tmpu32 == tdep->ioctl_TIOCGSERIAL)
+ {
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_serial_struct))
+ {
+ return (-1);
+ }
+ }
+ else if (tmpu32 == tdep->ioctl_TCGETS2)
+ {
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_termios2))
+ {
+ return (-1);
+ }
+ }
+ else if (tmpu32 == tdep->ioctl_FIOQSIZE)
+ {
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_loff_t))
+ {
+ return (-1);
+ }
+ }
+ else if (tmpu32 == tdep->ioctl_TIOCGICOUNT)
+ {
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem
+ (tmpu32, tdep->size_serial_icounter_struct))
+ {
+ return (-1);
+ }
+ }
+ else if (tmpu32 == tdep->ioctl_TIOCGHAYESESP)
+ {
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_hayes_esp_config))
+ {
+ return (-1);
+ }
+ }
+ else if (tmpu32 == tdep->ioctl_TIOCSERGSTRUCT)
+ {
+ printf_unfiltered (_
+ ("Process record and replay target doesn't support ioctl request TIOCSERGSTRUCT\n"));
+ return (1);
+ }
+ else
+ {
+ printf_unfiltered (_
+ ("Process record and replay target doesn't support ioctl request 0x%08x.\n"),
+ tmpu32);
+ return (1);
+ }
+ break;
+
+ /* sys_fcntl */
+ case 55:
+ /* XXX */
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ sys_fcntl:
+ if (tmpu32 == F_GETLK)
+ {
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_flock))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_ni_syscall */
+ case 56:
+ /* sys_setpgid */
+ case 57:
+ /* sys_ni_syscall */
+ case 58:
+ break;
+
+ /* sys_olduname */
+ case 59:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_oldold_utsname))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_umask */
+ case 60:
+ /* sys_chroot */
+ case 61:
+ break;
+
+ /* sys_ustat */
+ case 62:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_ustat))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_dup2 */
+ case 63:
+ /* sys_getppid */
+ case 64:
+ /* sys_getpgrp */
+ case 65:
+ /* sys_setsid */
+ case 66:
+ break;
+
+ /* sys_sigaction */
+ case 67:
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_old_sigaction))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_sgetmask */
+ case 68:
+ /* sys_ssetmask */
+ case 69:
+ /* sys_setreuid16 */
+ case 70:
+ /* sys_setregid16 */
+ case 71:
+ /* sys_sigsuspend */
+ case 72:
+ break;
+
+ /* sys_sigpending */
+ case 73:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_old_sigset_t))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_sethostname */
+ case 74:
+ /* sys_setrlimit */
+ case 75:
+ break;
+
+ /* sys_old_getrlimit */
+ case 76:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_rlimit))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_getrusage */
+ case 77:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_rusage))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_gettimeofday */
+ case 78:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_timeval))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_timezone))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_settimeofday */
+ case 79:
+ break;
+
+ /* sys_getgroups16 */
+ case 80:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_old_gid_t))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_setgroups16 */
+ case 81:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_old_gid_t))
+ {
+ return (-1);
+ }
+ break;
+
+ /* old_select */
+ case 82:
+ {
+ struct sel_arg_struct
+ {
+ CORE_ADDR n;
+ CORE_ADDR inp;
+ CORE_ADDR outp;
+ CORE_ADDR exp;
+ CORE_ADDR tvp;
+ } sel;
+
+ regcache_raw_read (record_regcache, tdep->arg1,
+ (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ if (target_read_memory (tmpu32, (gdb_byte *) & sel, sizeof (sel)))
+ {
+ if (record_debug)
+ {
+ fprintf_unfiltered (gdb_stdlog,
+ "Process record: error reading memory at addr = 0x%s len = %d.\n",
+ paddr_nz (tmpu32), sizeof (sel));
+ }
+ return (-1);
+ }
+ if (record_arch_list_add_mem (sel.inp, tdep->size_fd_set))
+ {
+ return (-1);
+ }
+ if (record_arch_list_add_mem (sel.outp, tdep->size_fd_set))
+ {
+ return (-1);
+ }
+ if (record_arch_list_add_mem (sel.exp, tdep->size_fd_set))
+ {
+ return (-1);
+ }
+ if (record_arch_list_add_mem (sel.tvp, tdep->size_timeval))
+ {
+ return (-1);
+ }
+ }
+ }
+ break;
+
+ /* sys_symlink */
+ case 83:
+ break;
+
+ /* sys_readlink */
+ case 85:
+ {
+ uint32_t len;
+ regcache_raw_read (record_regcache, tdep->arg2,
+ (gdb_byte *) & tmpu32);
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & len);
+ if (record_arch_list_add_mem (tmpu32, len))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_uselib */
+ case 86:
+ /* sys_swapon */
+ case 87:
+ break;
+
+ /* sys_reboot */
+ case 88:
+ {
+ int q;
+ target_terminal_ours ();
+ q =
+ yquery (_
+ ("The next instruction is syscall reboot. It will restart the computer. Do you want to stop the program?"));
+ target_terminal_inferior ();
+ if (q)
+ {
+ return (1);
+ }
+ }
+ break;
+
+ /* old_readdir */
+ case 89:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_dirent))
+ {
+ return (-1);
+ }
+ break;
+
+ /* old_mmap */
+ case 90:
+ break;
+
+ /* sys_munmap */
+ case 91:
+ {
+ int q;
+ uint32_t len;
+
+ regcache_raw_read (record_regcache, tdep->arg1,
+ (gdb_byte *) & tmpu32);
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & len);
+ target_terminal_ours ();
+ q =
+ yquery (_
+ ("The next instruction is syscall munmap. It will free the memory addr = 0x%s len = %d. It will make record target get error. Do you want to stop the program?"),
+ paddr_nz (tmpu32), len);
+ target_terminal_inferior ();
+ if (q)
+ {
+ return (1);
+ }
+ }
+ break;
+
+ /* sys_truncate */
+ case 92:
+ /* sys_ftruncate */
+ case 93:
+ /* sys_fchmod */
+ case 94:
+ /* sys_fchown16 */
+ case 95:
+ /* sys_getpriority */
+ case 96:
+ /* sys_setpriority */
+ case 97:
+ /* sys_ni_syscall */
+ case 98:
+ break;
+
+ /* sys_statfs */
+ case 99:
+ /* sys_fstatfs */
+ case 100:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_statfs))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_ioperm */
+ case 101:
+ break;
+
+ /* sys_socketcall */
+ case 102:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ switch (tmpu32)
+ {
+ case RECORD_SYS_SOCKET:
+ case RECORD_SYS_BIND:
+ case RECORD_SYS_CONNECT:
+ case RECORD_SYS_LISTEN:
+ break;
+ case RECORD_SYS_ACCEPT:
+ case RECORD_SYS_GETSOCKNAME:
+ case RECORD_SYS_GETPEERNAME:
+ {
+ uint32_t a[3];
+ regcache_raw_read (record_regcache, tdep->arg2,
+ (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
+ {
+ if (record_debug)
+ {
+ fprintf_unfiltered (gdb_stdlog,
+ "Process record: error reading memory at addr = 0x%s len = %d.\n",
+ paddr_nz (tmpu32), sizeof (a));
+ }
+ return (-1);
+ }
+ if (record_arch_list_add_mem (a[1], tdep->size_sockaddr))
+ {
+ return (-1);
+ }
+ if (record_arch_list_add_mem (a[2], tdep->size_int))
+ {
+ return (-1);
+ }
+ }
+ }
+ break;
+
+ case RECORD_SYS_SOCKETPAIR:
+ {
+ uint32_t a[4];
+ regcache_raw_read (record_regcache, tdep->arg2,
+ (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
+ {
+ if (record_debug)
+ {
+ fprintf_unfiltered (gdb_stdlog,
+ "Process record: error reading memory at addr = 0x%s len = %d.\n",
+ paddr_nz (tmpu32), sizeof (a));
+ }
+ return (-1);
+ }
+ if (record_arch_list_add_mem (a[3], tdep->size_int))
+ {
+ return (-1);
+ }
+ }
+ }
+ break;
+ case RECORD_SYS_SEND:
+ case RECORD_SYS_SENDTO:
+ break;
+ case RECORD_SYS_RECV:
+ {
+ uint32_t a[3];
+ regcache_raw_read (record_regcache, tdep->arg2,
+ (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
+ {
+ if (record_debug)
+ {
+ fprintf_unfiltered (gdb_stdlog,
+ "Process record: error reading memory at addr = 0x%s len = %d.\n",
+ paddr_nz (tmpu32), sizeof (a));
+ }
+ return (-1);
+ }
+ if (a[2])
+ {
+ if (target_read_memory
+ (a[2], (gdb_byte *) & (a[2]), sizeof (a[2])))
+ {
+ if (record_debug)
+ {
+ fprintf_unfiltered (gdb_stdlog,
+ "Process record: error reading memory at addr = 0x%s len = %d.\n",
+ paddr_nz (a[2]), sizeof (a[2]));
+ }
+ return (-1);
+ }
+ if (record_arch_list_add_mem (a[1], a[2]))
+ {
+ return (-1);
+ }
+ }
+ }
+ }
+ break;
+ case RECORD_SYS_RECVFROM:
+ {
+ uint32_t a[6];
+ regcache_raw_read (record_regcache, tdep->arg2,
+ (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
+ {
+ if (record_debug)
+ {
+ fprintf_unfiltered (gdb_stdlog,
+ "Process record: error reading memory at addr = 0x%s len = %d.\n",
+ paddr_nz (tmpu32), sizeof (a));
+ }
+ return (-1);
+ }
+ if (a[2])
+ {
+ if (target_read_memory
+ (a[2], (gdb_byte *) & (a[2]), sizeof (a[2])))
+ {
+ if (record_debug)
+ {
+ fprintf_unfiltered (gdb_stdlog,
+ "Process record: error reading memory at addr = 0x%s len = %d.\n",
+ paddr_nz (a[2]),
+ sizeof (a[2]));
+ }
+ return (-1);
+ }
+ if (record_arch_list_add_mem (a[1], a[2]))
+ {
+ return (-1);
+ }
+ if (record_arch_list_add_mem (a[4], tdep->size_sockaddr))
+ {
+ return (-1);
+ }
+ if (record_arch_list_add_mem (a[5], tdep->size_int))
+ {
+ return (-1);
+ }
+ }
+ }
+ }
+ break;
+ case RECORD_SYS_SHUTDOWN:
+ case RECORD_SYS_SETSOCKOPT:
+ break;
+ case RECORD_SYS_GETSOCKOPT:
+ {
+ uint32_t a[5];
+ uint32_t av;
+
+ regcache_raw_read (record_regcache, tdep->arg2,
+ (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
+ {
+ if (record_debug)
+ {
+ fprintf_unfiltered (gdb_stdlog,
+ "Process record: error reading memory at addr = 0x%s len = %d.\n",
+ paddr_nz (tmpu32), sizeof (a));
+ }
+ return (-1);
+ }
+ if (a[4])
+ {
+ if (target_read_memory
+ (a[4], (gdb_byte *) & av, sizeof (av)))
+ {
+ if (record_debug)
+ {
+ fprintf_unfiltered (gdb_stdlog,
+ "Process record: error reading memory at addr = 0x%s len = %d.\n",
+ paddr_nz (a[4]), sizeof (av));
+ }
+ return (-1);
+ }
+ if (record_arch_list_add_mem (a[3], av))
+ {
+ return (-1);
+ }
+ if (record_arch_list_add_mem (a[4], tdep->size_int))
+ {
+ return (-1);
+ }
+ }
+ }
+ }
+ break;
+ case RECORD_SYS_SENDMSG:
+ break;
+ case RECORD_SYS_RECVMSG:
+ {
+ uint32_t a[2], i;
+ struct record_msghdr
+ {
+ uint32_t msg_name;
+ uint32_t msg_namelen;
+ uint32_t msg_iov;
+ uint32_t msg_iovlen;
+ uint32_t msg_control;
+ uint32_t msg_controllen;
+ uint32_t msg_flags;
+ } rec;
+ struct record_iovec
+ {
+ uint32_t iov_base;
+ uint32_t iov_len;
+ } iov;
+
+ regcache_raw_read (record_regcache, tdep->arg2,
+ (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ if (target_read_memory (tmpu32, (gdb_byte *) a, sizeof (a)))
+ {
+ if (record_debug)
+ {
+ fprintf_unfiltered (gdb_stdlog,
+ "Process record: error reading memory at addr = 0x%s len = %d.\n",
+ paddr_nz (tmpu32), sizeof (a));
+ }
+ return (-1);
+ }
+ if (record_arch_list_add_mem (a[1], tdep->size_msghdr))
+ {
+ return (-1);
+ }
+ if (a[1])
+ {
+ if (target_read_memory
+ (a[1], (gdb_byte *) & rec, sizeof (rec)))
+ {
+ if (record_debug)
+ {
+ fprintf_unfiltered (gdb_stdlog,
+ "Process record: error reading memory at addr = 0x%s len = %d.\n",
+ paddr_nz (a[1]),
+ sizeof (rec));
+ }
+ return (-1);
+ }
+ if (record_arch_list_add_mem
+ (rec.msg_name, rec.msg_namelen))
+ {
+ return (-1);
+ }
+ if (record_arch_list_add_mem
+ (rec.msg_control, rec.msg_controllen))
+ {
+ return (-1);
+ }
+ if (rec.msg_iov)
+ {
+ for (i = 0; i < rec.msg_iovlen; i++)
+ {
+ if (target_read_memory
+ (rec.msg_iov, (gdb_byte *) & iov,
+ sizeof (iov)))
+ {
+ if (record_debug)
+ {
+ fprintf_unfiltered (gdb_stdlog,
+ "Process record: error reading memory at addr = 0x%s len = %d.\n",
+ paddr_nz (rec.
+ msg_iov),
+ sizeof (iov));
+ }
+ return (-1);
+ }
+ if (record_arch_list_add_mem
+ (iov.iov_base, iov.iov_len))
+ {
+ return (-1);
+ }
+ rec.msg_iov += sizeof (struct record_iovec);
+ }
+ }
+ }
+ }
+ }
+ break;
+ default:
+ printf_unfiltered (_
+ ("Process record and replay target doesn't support socketcall call 0x%08x\n"),
+ tmpu32);
+ return (-1);
+ break;
+ }
+ break;
+
+ /* sys_syslog */
+ case 103:
+ break;
+
+ /* sys_setitimer */
+ case 104:
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_itimerval))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_getitimer */
+ case 105:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_itimerval))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_newstat */
+ case 106:
+ /* sys_newlstat */
+ case 107:
+ /* sys_newfstat */
+ case 108:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_stat))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_uname */
+ case 109:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_old_utsname))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_iopl */
+ case 110:
+ /* sys_vhangup */
+ case 111:
+ /* sys_ni_syscall */
+ case 112:
+ /* sys_vm86old */
+ case 113:
+ break;
+
+ /* sys_wait4 */
+ case 114:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_int))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg4, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_rusage))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_swapoff */
+ case 115:
+ break;
+
+ /* sys_sysinfo */
+ case 116:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_sysinfo))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_ipc */
+ case 117:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ switch (tmpu32)
+ {
+ case RECORD_MSGRCV:
+ {
+ int32_t second;
+ uint32_t ptr;
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & second);
+ regcache_raw_read (record_regcache, tdep->arg5,
+ (gdb_byte *) & ptr);
+ if (record_arch_list_add_mem (ptr, second + tdep->size_long))
+ {
+ return (-1);
+ }
+ }
+ break;
+ case RECORD_MSGCTL:
+ regcache_raw_read (record_regcache, tdep->arg5,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_msqid_ds))
+ {
+ return (-1);
+ }
+ break;
+ case RECORD_SHMAT:
+ regcache_raw_read (record_regcache, tdep->arg4,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_ulong))
+ {
+ return (-1);
+ }
+ break;
+ case RECORD_SHMCTL:
+ regcache_raw_read (record_regcache, tdep->arg5,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_shmid_ds))
+ {
+ return (-1);
+ }
+ break;
+ }
+ break;
+
+ /* sys_fsync */
+ case 118:
+ /* sys_sigreturn */
+ case 119:
+ /* sys_clone */
+ case 120:
+ /* sys_setdomainname */
+ case 121:
+ break;
+
+ /* sys_newuname */
+ case 122:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_new_utsname))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_modify_ldt */
+ case 123:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (tmpu32 == 0 || tmpu32 == 2)
+ {
+ uint32_t ptr, bytecount;
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & ptr);
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & bytecount);
+ if (record_arch_list_add_mem (ptr, bytecount))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_adjtimex */
+ case 124:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_timex))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_mprotect */
+ case 125:
+ break;
+
+ /* sys_sigprocmask */
+ case 126:
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_old_sigset_t))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_ni_syscall */
+ case 127:
+ /* sys_init_module */
+ case 128:
+ /* sys_delete_module */
+ case 129:
+ /* sys_ni_syscall */
+ case 130:
+ break;
+
+ /* sys_quotactl */
+ case 131:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ switch (tmpu32)
+ {
+ case RECORD_Q_GETFMT:
+ regcache_raw_read (record_regcache, tdep->arg4,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, 4))
+ {
+ return (-1);
+ }
+ break;
+ case RECORD_Q_GETINFO:
+ regcache_raw_read (record_regcache, tdep->arg4,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_mem_dqinfo))
+ {
+ return (-1);
+ }
+ break;
+ case RECORD_Q_GETQUOTA:
+ regcache_raw_read (record_regcache, tdep->arg4,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_if_dqblk))
+ {
+ return (-1);
+ }
+ break;
+ case RECORD_Q_XGETQSTAT:
+ case RECORD_Q_XGETQUOTA:
+ regcache_raw_read (record_regcache, tdep->arg4,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_fs_quota_stat))
+ {
+ return (-1);
+ }
+ break;
+ }
+ break;
+
+ /* sys_getpgid */
+ case 132:
+ /* sys_fchdir */
+ case 133:
+ /* sys_bdflush */
+ case 134:
+ break;
+
+ /* sys_sysfs */
+ case 135:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (tmpu32 == 2)
+ {
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & tmpu32);
+ /*XXX the size of memory is not very clear */
+ if (record_arch_list_add_mem (tmpu32, 10))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_personality */
+ case 136:
+ /* sys_ni_syscall */
+ case 137:
+ /* sys_setfsuid16 */
+ case 138:
+ /* sys_setfsgid16 */
+ case 139:
+ break;
+
+ /* sys_llseek */
+ case 140:
+ regcache_raw_read (record_regcache, tdep->arg4, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_loff_t))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_getdents */
+ case 141:
+ {
+ uint32_t count;
+ regcache_raw_read (record_regcache, tdep->arg2,
+ (gdb_byte *) & tmpu32);
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & count);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_dirent * count))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_select */
+ case 142:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_fd_set))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_fd_set))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg4, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_fd_set))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg5, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_timeval))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_flock */
+ case 143:
+ /* sys_msync */
+ case 144:
+ break;
+
+ /* sys_readv */
+ case 145:
+ {
+ uint32_t vec;
+ uint32_t vlen;
+ struct record_iovec
+ {
+ uint32_t iov_base;
+ uint32_t iov_len;
+ } iov;
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & vec);
+ if (vec)
+ {
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & vlen);
+ for (tmpu32 = 0; tmpu32 < vlen; tmpu32++)
+ {
+ if (target_read_memory
+ (vec, (gdb_byte *) & iov, sizeof (struct record_iovec)))
+ {
+ if (record_debug)
+ {
+ fprintf_unfiltered (gdb_stdlog,
+ "Process record: error reading memory at addr = 0x%s len = %d.\n",
+ paddr_nz (vec),
+ sizeof (struct record_iovec));
+ }
+ return (-1);
+ }
+ if (record_arch_list_add_mem (iov.iov_base, iov.iov_len))
+ {
+ return (-1);
+ }
+ vec += sizeof (struct record_iovec);
+ }
+ }
+ }
+ break;
+
+ /* sys_writev */
+ case 146:
+ /* sys_getsid */
+ case 147:
+ /* sys_fdatasync */
+ case 148:
+ /* sys_sysctl */
+ case 149:
+ /* sys_mlock */
+ case 150:
+ /* sys_munlock */
+ case 151:
+ /* sys_mlockall */
+ case 152:
+ /* sys_munlockall */
+ case 153:
+ /* sys_sched_setparam */
+ case 154:
+ break;
+
+ /* sys_sched_getparam */
+ case 155:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_int))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_sched_setscheduler */
+ case 156:
+ /* sys_sched_getscheduler */
+ case 157:
+ /* sys_sched_yield */
+ case 158:
+ /* sys_sched_get_priority_max */
+ case 159:
+ /* sys_sched_get_priority_min */
+ case 160:
+ break;
+
+ /* sys_sched_rr_get_interval */
+ case 161:
+ /* sys_nanosleep */
+ case 162:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_timespec))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_mremap */
+ case 163:
+ /* sys_setresuid16 */
+ case 164:
+ break;
+
+ /* sys_getresuid16 */
+ case 165:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_old_uid_t))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_old_uid_t))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_old_uid_t))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_vm86 */
+ case 166:
+ /* sys_ni_syscall */
+ case 167:
+ break;
+
+ /* sys_poll */
+ case 168:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ uint32_t nfds;
+ regcache_raw_read (record_regcache, tdep->arg2,
+ (gdb_byte *) & nfds);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_pollfd * nfds))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_nfsservctl */
+ case 169:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (tmpu32 == 7 || tmpu32 == 8)
+ {
+ uint32_t rsize;
+ if (tmpu32 == 7)
+ {
+ rsize = tdep->size_NFS_FHSIZE;
+ }
+ else
+ {
+ rsize = tdep->size_knfsd_fh;
+ }
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, rsize))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_setresgid16 */
+ case 170:
+ break;
+
+ /* sys_getresgid16 */
+ case 171:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_old_gid_t))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_old_gid_t))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_old_gid_t))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_prctl */
+ case 172:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ switch (tmpu32)
+ {
+ case 2:
+ regcache_raw_read (record_regcache, tdep->arg2,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_int))
+ {
+ return (-1);
+ }
+ break;
+ case 16:
+ regcache_raw_read (record_regcache, tdep->arg2,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_TASK_COMM_LEN))
+ {
+ return (-1);
+ }
+ break;
+ }
+ break;
+
+ /* sys_rt_sigreturn */
+ case 173:
+ break;
+
+ /* sys_rt_sigaction */
+ case 174:
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_sigaction))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_rt_sigprocmask */
+ case 175:
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_sigset_t))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_rt_sigpending */
+ case 176:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ uint32_t sigsetsize;
+ regcache_raw_read (record_regcache, tdep->arg2,
+ (gdb_byte *) & sigsetsize);
+ if (record_arch_list_add_mem (tmpu32, sigsetsize))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_rt_sigtimedwait */
+ case 177:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_siginfo_t))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_rt_sigqueueinfo */
+ case 178:
+ /* sys_rt_sigsuspend */
+ case 179:
+ break;
+
+ /* sys_pread64 */
+ case 180:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ uint32_t count;
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & count);
+ if (record_arch_list_add_mem (tmpu32, count))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_pwrite64 */
+ case 181:
+ /* sys_chown16 */
+ case 182:
+ break;
+
+ /* sys_getcwd */
+ case 183:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ uint32_t size;
+ regcache_raw_read (record_regcache, tdep->arg2,
+ (gdb_byte *) & size);
+ if (record_arch_list_add_mem (tmpu32, size))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_capget */
+ case 184:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_cap_user_data_t))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_capset */
+ case 185:
+ break;
+
+ /* sys_sigaltstack */
+ case 186:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_stack_t))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_sendfile */
+ case 187:
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_off_t))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_ni_syscall */
+ case 188:
+ /* sys_ni_syscall */
+ case 189:
+ /* sys_vfork */
+ case 190:
+ break;
+
+ /* sys_getrlimit */
+ case 191:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_rlimit))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_mmap2 */
+ case 192:
+ break;
+
+ /* sys_truncate64 */
+ case 193:
+ /* sys_ftruncate64 */
+ case 194:
+ break;
+
+ /* sys_stat64 */
+ case 195:
+ /* sys_lstat64 */
+ case 196:
+ /* sys_fstat64 */
+ case 197:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_stat64))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_lchown */
+ case 198:
+ /* sys_getuid */
+ case 199:
+ /* sys_getgid */
+ case 200:
+ /* sys_geteuid */
+ case 201:
+ /* sys_getegid */
+ case 202:
+ /* sys_setreuid */
+ case 203:
+ /* sys_setregid */
+ case 204:
+ break;
+
+ /* sys_getgroups */
+ case 205:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ int gidsetsize;
+ regcache_raw_read (record_regcache, tdep->arg1,
+ (gdb_byte *) & gidsetsize);
+ if (record_arch_list_add_mem
+ (tmpu32, tdep->size_gid_t * gidsetsize))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_setgroups */
+ case 206:
+ /* sys_fchown */
+ case 207:
+ /* sys_setresuid */
+ case 208:
+ break;
+
+ /* sys_getresuid */
+ case 209:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_uid_t))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_uid_t))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_uid_t))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_setresgid */
+ case 210:
+ break;
+
+ /* sys_getresgid */
+ case 211:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_gid_t))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_gid_t))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_gid_t))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_chown */
+ case 212:
+ /* sys_setuid */
+ case 213:
+ /* sys_setgid */
+ case 214:
+ /* sys_setfsuid */
+ case 215:
+ /* sys_setfsgid */
+ case 216:
+ /* sys_pivot_root */
+ case 217:
+ break;
+
+ /* sys_mincore */
+ case 218:
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_PAGE_SIZE))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_madvise */
+ case 219:
+ break;
+
+ /* sys_getdents64 */
+ case 220:
+ {
+ uint32_t count;
+ regcache_raw_read (record_regcache, tdep->arg2,
+ (gdb_byte *) & tmpu32);
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & count);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_dirent64 * count))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_fcntl64 */
+ case 221:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ switch (tmpu32)
+ {
+ case F_GETLK64:
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_flock64))
+ {
+ return (-1);
+ }
+ break;
+ case F_SETLK64:
+ case F_SETLKW64:
+ break;
+ default:
+ goto sys_fcntl;
+ break;
+ }
+ break;
+
+ /* sys_ni_syscall */
+ case 222:
+ /* sys_ni_syscall */
+ case 223:
+ /* sys_gettid */
+ case 224:
+ /* sys_readahead */
+ case 225:
+ /* sys_setxattr */
+ case 226:
+ /* sys_lsetxattr */
+ case 227:
+ /* sys_fsetxattr */
+ case 228:
+ break;
+
+ /* sys_getxattr */
+ case 229:
+ /* sys_lgetxattr */
+ case 230:
+ /* sys_fgetxattr */
+ case 231:
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ uint32_t size;
+ regcache_raw_read (record_regcache, tdep->arg4,
+ (gdb_byte *) & size);
+ if (record_arch_list_add_mem (tmpu32, size))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_listxattr */
+ case 232:
+ /* sys_llistxattr */
+ case 233:
+ /* sys_flistxattr */
+ case 234:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ uint32_t size;
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & size);
+ if (record_arch_list_add_mem (tmpu32, size))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_removexattr */
+ case 235:
+ /* sys_lremovexattr */
+ case 236:
+ /* sys_fremovexattr */
+ case 237:
+ /* sys_tkill */
+ case 238:
+ break;
+
+ /* sys_sendfile64 */
+ case 239:
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_loff_t))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_futex */
+ case 240:
+ /* sys_sched_setaffinity */
+ case 241:
+ break;
+
+ /* sys_sched_getaffinity */
+ case 242:
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ uint32_t len;
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & len);
+ if (record_arch_list_add_mem (tmpu32, len))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_set_thread_area */
+ case 243:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_int))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_get_thread_area */
+ case 244:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_user_desc))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_io_setup */
+ case 245:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_long))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_io_destroy */
+ case 246:
+ break;
+
+ /* sys_io_getevents */
+ case 247:
+ regcache_raw_read (record_regcache, tdep->arg4, (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ int32_t nr;
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & nr);
+ if (record_arch_list_add_mem (tmpu32, nr * tdep->size_io_event))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_io_submit */
+ case 248:
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ int32_t i, nr;
+ uint32_t *iocbp;
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & nr);
+ iocbp = (uint32_t *) alloca (nr * tdep->size_int);
+ if (target_read_memory
+ (tmpu32, (gdb_byte *) iocbp, nr * tdep->size_int))
+ {
+ if (record_debug)
+ {
+ fprintf_unfiltered (gdb_stdlog,
+ "Process record: error reading memory at addr = 0x%s len = %d.\n",
+ paddr_nz (tmpu32), nr * tdep->size_int);
+ }
+ return (-1);
+ }
+ for (i = 0; i < nr; i++)
+ {
+ if (record_arch_list_add_mem (iocbp[i], tdep->size_iocb))
+ {
+ return (-1);
+ }
+ }
+ }
+ break;
+
+ /* sys_io_cancel */
+ case 249:
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_io_event))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_fadvise64 */
+ case 250:
+ /* sys_ni_syscall */
+ case 251:
+ break;
+
+ /* sys_exit_group */
+ case 252:
+ {
+ int q;
+ target_terminal_ours ();
+ q =
+ yquery (_
+ ("The next instruction is syscall exit_group. It will make the program exit. Do you want to stop the program?"));
+ target_terminal_inferior ();
+ if (q)
+ {
+ return (1);
+ }
+ }
+ break;
+
+ /* sys_lookup_dcookie */
+ case 253:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ uint32_t len;
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & len);
+ if (record_arch_list_add_mem (tmpu32, len))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_epoll_create */
+ case 254:
+ /* sys_epoll_ctl */
+ case 255:
+ break;
+
+ /* sys_epoll_wait */
+ case 256:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ int32_t maxevents;
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & maxevents);
+ if (record_arch_list_add_mem
+ (tmpu32, maxevents * tdep->size_epoll_event))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_remap_file_pages */
+ case 257:
+ /* sys_set_tid_address */
+ case 258:
+ break;
+
+ /* sys_timer_create */
+ case 259:
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_int))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_timer_settime */
+ case 260:
+ regcache_raw_read (record_regcache, tdep->arg4, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_itimerspec))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_timer_gettime */
+ case 261:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_itimerspec))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_timer_getoverrun */
+ case 262:
+ /* sys_timer_delete */
+ case 263:
+ /* sys_clock_settime */
+ case 264:
+ break;
+
+ /* sys_clock_gettime */
+ case 265:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_timespec))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_clock_getres */
+ case 266:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_timespec))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_clock_nanosleep */
+ case 267:
+ regcache_raw_read (record_regcache, tdep->arg4, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_timespec))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_statfs64 */
+ case 268:
+ /* sys_fstatfs64 */
+ case 269:
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_statfs64))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_tgkill */
+ case 270:
+ /* sys_utimes */
+ case 271:
+ /* sys_fadvise64_64 */
+ case 272:
+ /* sys_ni_syscall */
+ case 273:
+ /* sys_mbind */
+ case 274:
+ break;
+
+ /* sys_get_mempolicy */
+ case 275:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_int))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ uint32_t maxnode;
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & maxnode);
+ if (record_arch_list_add_mem (tmpu32, maxnode * tdep->size_long))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_set_mempolicy */
+ case 276:
+ /* sys_mq_open */
+ case 277:
+ /* sys_mq_unlink */
+ case 278:
+ /* sys_mq_timedsend */
+ case 279:
+ break;
+
+ /* sys_mq_timedreceive */
+ case 280:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ uint32_t msg_len;
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & msg_len);
+ if (record_arch_list_add_mem (tmpu32, msg_len))
+ {
+ return (-1);
+ }
+ }
+ regcache_raw_read (record_regcache, tdep->arg4, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_int))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_mq_notify */
+ case 281:
+ break;
+
+ /* sys_mq_getsetattr */
+ case 282:
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_mq_attr))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_kexec_load */
+ case 283:
+ break;
+
+ /* sys_waitid */
+ case 284:
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_siginfo))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg5, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_rusage))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_ni_syscall */
+ case 285:
+ /* sys_add_key */
+ case 286:
+ /* sys_request_key */
+ case 287:
+ break;
+
+ /* sys_keyctl */
+ case 288:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (tmpu32 == 6 || tmpu32 == 11)
+ {
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ uint32_t buflen;
+ regcache_raw_read (record_regcache, tdep->arg4,
+ (gdb_byte *) & buflen);
+ if (record_arch_list_add_mem (tmpu32, buflen))
+ {
+ return (-1);
+ }
+ }
+ }
+ break;
+
+ /* sys_ioprio_set */
+ case 289:
+ /* sys_ioprio_get */
+ case 290:
+ /* sys_inotify_init */
+ case 291:
+ /* sys_inotify_add_watch */
+ case 292:
+ /* sys_inotify_rm_watch */
+ case 293:
+ /* sys_migrate_pages */
+ case 294:
+ /* sys_openat */
+ case 295:
+ /* sys_mkdirat */
+ case 296:
+ /* sys_mknodat */
+ case 297:
+ /* sys_fchownat */
+ case 298:
+ /* sys_futimesat */
+ case 299:
+ break;
+
+ /* sys_fstatat64 */
+ case 300:
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_stat64))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_unlinkat */
+ case 301:
+ /* sys_renameat */
+ case 302:
+ /* sys_linkat */
+ case 303:
+ /* sys_symlinkat */
+ case 304:
+ break;
+
+ /* sys_readlinkat */
+ case 305:
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ int32_t bufsiz;
+ regcache_raw_read (record_regcache, tdep->arg4,
+ (gdb_byte *) & bufsiz);
+ if (record_arch_list_add_mem (tmpu32, bufsiz))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_fchmodat */
+ case 306:
+ /* sys_faccessat */
+ case 307:
+ break;
+
+ /* sys_pselect6 */
+ case 308:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_fd_set))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_fd_set))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg4, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_fd_set))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg5, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_timespec))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_ppoll */
+ case 309:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ uint32_t nfds;
+ regcache_raw_read (record_regcache, tdep->arg2,
+ (gdb_byte *) & nfds);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_pollfd * nfds))
+ {
+ return (-1);
+ }
+ }
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_timespec))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_unshare */
+ case 310:
+ /* sys_set_robust_list */
+ case 311:
+ break;
+
+ /* sys_get_robust_list */
+ case 312:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_int))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_int))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_splice */
+ case 313:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_loff_t))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg4, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_loff_t))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_sync_file_range */
+ case 314:
+ /* sys_tee */
+ case 315:
+ /* sys_vmsplice */
+ case 316:
+ break;
+
+ /* sys_move_pages */
+ case 317:
+ regcache_raw_read (record_regcache, tdep->arg5, (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ uint32_t nr_pages;
+ regcache_raw_read (record_regcache, tdep->arg2,
+ (gdb_byte *) & nr_pages);
+ if (record_arch_list_add_mem (tmpu32, nr_pages * tdep->size_int))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ /* sys_getcpu */
+ case 318:
+ regcache_raw_read (record_regcache, tdep->arg1, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_int))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_int))
+ {
+ return (-1);
+ }
+ regcache_raw_read (record_regcache, tdep->arg3, (gdb_byte *) & tmpu32);
+ if (record_arch_list_add_mem (tmpu32, tdep->size_ulong * 2))
+ {
+ return (-1);
+ }
+ break;
+
+ /* sys_epoll_pwait */
+ case 319:
+ regcache_raw_read (record_regcache, tdep->arg2, (gdb_byte *) & tmpu32);
+ if (tmpu32)
+ {
+ int32_t maxevents;
+ regcache_raw_read (record_regcache, tdep->arg3,
+ (gdb_byte *) & maxevents);
+ if (record_arch_list_add_mem
+ (tmpu32, maxevents * tdep->size_epoll_event))
+ {
+ return (-1);
+ }
+ }
+ break;
+
+ default:
+ printf_unfiltered (_
+ ("Process record and replay target doesn't support syscall number 0x%08x\n"),
+ tmpu32);
+ return (-1);
+ break;
+ }
+
+ return (0);
+}
--- a//dev/null
+++ b/linux-record.h
@@ -0,0 +1,171 @@
+/* Process record and replay target code for GNU/Linux.
+
+ Copyright (C) 2008 Free Software Foundation, Inc.
+
+ This file is part of GDB.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _LINUX_RECORD_H_
+#define _LINUX_RECORD_H_
+
+typedef struct linux_record_tdep_s
+{
+ /* The size of the type that will be use in system call. */
+ int size__old_kernel_stat;
+ int size_tms;
+ int size_loff_t;
+ int size_flock;
+ int size_oldold_utsname;
+ int size_ustat;
+ int size_old_sigaction;
+ int size_old_sigset_t;
+ int size_rlimit;
+ int size_rusage;
+ int size_timeval;
+ int size_timezone;
+ int size_old_gid_t;
+ int size_old_uid_t;
+ int size_fd_set;
+ int size_dirent;
+ int size_dirent64;
+ int size_statfs;
+ int size_statfs64;
+ int size_sockaddr;
+ int size_int;
+ int size_long;
+ int size_ulong;
+ int size_msghdr;
+ int size_itimerval;
+ int size_stat;
+ int size_old_utsname;
+ int size_sysinfo;
+ int size_msqid_ds;
+ int size_shmid_ds;
+ int size_new_utsname;
+ int size_timex;
+ int size_mem_dqinfo;
+ int size_if_dqblk;
+ int size_fs_quota_stat;
+ int size_timespec;
+ int size_pollfd;
+ int size_NFS_FHSIZE;
+ int size_knfsd_fh;
+ int size_TASK_COMM_LEN;
+ int size_sigaction;
+ int size_sigset_t;
+ int size_siginfo_t;
+ int size_cap_user_data_t;
+ int size_stack_t;
+ int size_off_t;
+ int size_stat64;
+ int size_gid_t;
+ int size_uid_t;
+ int size_PAGE_SIZE;
+ int size_flock64;
+ int size_user_desc;
+ int size_io_event;
+ int size_iocb;
+ int size_epoll_event;
+ int size_itimerspec;
+ int size_mq_attr;
+ int size_siginfo;
+
+ int size_termios;
+ int size_termios2;
+ int size_pid_t;
+ int size_winsize;
+ int size_char;
+ int size_serial_struct;
+ int size_serial_icounter_struct;
+ int size_hayes_esp_config;
+
+ /* the values of the second argument of system call "sys_ioctl". */
+ int ioctl_TCGETS;
+ int ioctl_TCSETS;
+ int ioctl_TCSETSW;
+ int ioctl_TCSETSF;
+ int ioctl_TCGETA;
+ int ioctl_TCSETA;
+ int ioctl_TCSETAW;
+ int ioctl_TCSETAF;
+ int ioctl_TCSBRK;
+ int ioctl_TCXONC;
+ int ioctl_TCFLSH;
+ int ioctl_TIOCEXCL;
+ int ioctl_TIOCNXCL;
+ int ioctl_TIOCSCTTY;
+ int ioctl_TIOCGPGRP;
+ int ioctl_TIOCSPGRP;
+ int ioctl_TIOCOUTQ;
+ int ioctl_TIOCSTI;
+ int ioctl_TIOCGWINSZ;
+ int ioctl_TIOCSWINSZ;
+ int ioctl_TIOCMGET;
+ int ioctl_TIOCMBIS;
+ int ioctl_TIOCMBIC;
+ int ioctl_TIOCMSET;
+ int ioctl_TIOCGSOFTCAR;
+ int ioctl_TIOCSSOFTCAR;
+ int ioctl_FIONREAD;
+ int ioctl_TIOCINQ;
+ int ioctl_TIOCLINUX;
+ int ioctl_TIOCCONS;
+ int ioctl_TIOCGSERIAL;
+ int ioctl_TIOCSSERIAL;
+ int ioctl_TIOCPKT;
+ int ioctl_FIONBIO;
+ int ioctl_TIOCNOTTY;
+ int ioctl_TIOCSETD;
+ int ioctl_TIOCGETD;
+ int ioctl_TCSBRKP;
+ int ioctl_TIOCTTYGSTRUCT;
+ int ioctl_TIOCSBRK;
+ int ioctl_TIOCCBRK;
+ int ioctl_TIOCGSID;
+ int ioctl_TCGETS2;
+ int ioctl_TCSETS2;
+ int ioctl_TCSETSW2;
+ int ioctl_TCSETSF2;
+ int ioctl_TIOCGPTN;
+ int ioctl_TIOCSPTLCK;
+ int ioctl_FIONCLEX;
+ int ioctl_FIOCLEX;
+ int ioctl_FIOASYNC;
+ int ioctl_TIOCSERCONFIG;
+ int ioctl_TIOCSERGWILD;
+ int ioctl_TIOCSERSWILD;
+ int ioctl_TIOCGLCKTRMIOS;
+ int ioctl_TIOCSLCKTRMIOS;
+ int ioctl_TIOCSERGSTRUCT;
+ int ioctl_TIOCSERGETLSR;
+ int ioctl_TIOCSERGETMULTI;
+ int ioctl_TIOCSERSETMULTI;
+ int ioctl_TIOCMIWAIT;
+ int ioctl_TIOCGICOUNT;
+ int ioctl_TIOCGHAYESESP;
+ int ioctl_TIOCSHAYESESP;
+ int ioctl_FIOQSIZE;
+
+ /* The number of the registers that use to be the arguments of system call. */
+ int arg1;
+ int arg2;
+ int arg3;
+ int arg4;
+ int arg5;
+} linux_record_tdep_t;
+
+extern int record_linux_system_call (int num, linux_record_tdep_t * tdep);
+
+#endif /* _LINUX_RECORD_H_ */
--- a/Makefile.in
+++ b/Makefile.in
@@ -515,7 +515,7 @@
xcoffread.o \
prologue-value.o \
symfile-mem.o \
- corelow.o
+ corelow.o linux-record.o
# Host-dependent makefile fragment comes in here.
@host_makefile_frag@
@@ -1297,7 +1297,7 @@
inf-ptrace.c inf-ttrace.c \
irix5-nat.c \
libunwind-frame.c \
- linux-fork.c \
+ linux-fork.c linux-record.c \
m68hc11-tdep.c \
m32r-tdep.c \
m32r-linux-nat.c m32r-linux-tdep.c \
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2008-12-19 7:23 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-11-17 2:18 [RFA] Resubmit process record and replay, 5/10 teawater
2008-11-20 4:22 ` Michael Snyder
2008-11-20 8:33 ` Thiago Jung Bauermann
2008-11-20 9:00 ` Daniel Jacobowitz
2008-11-20 16:53 ` teawater
2008-11-24 16:50 ` teawater
2008-12-02 7:29 ` teawater
2008-12-19 7:23 ` teawater
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox