--- i386-linux-tdep.c | 26 linux-record.c | 2563 ++++++++++++++++++++++++++++++------------------------ linux-record.h | 5 3 files changed, 1482 insertions(+), 1112 deletions(-) --- a/i386-linux-tdep.c +++ b/i386-linux-tdep.c @@ -369,7 +369,14 @@ i386_linux_intx80_sysenter_record (struc int ret; uint32_t tmpu32; - regcache_raw_read (regcache, I386_EAX_REGNUM, (gdb_byte *)&tmpu32); + regcache_raw_read (regcache, I386_EAX_REGNUM, (gdb_byte *) &tmpu32); + + if (tmpu32 > 499) + { + printf_unfiltered (_("Process record and replay target doesn't " + "support syscall number %u\n"), tmpu32); + return -1; + } ret = record_linux_system_call (tmpu32, regcache, &i386_linux_record_tdep); @@ -481,6 +488,8 @@ i386_linux_init_abi (struct gdbarch_info /* Initialize the i386_linux_record_tdep. */ /* These values are the size of the type that will be used in a system call. They are obtained from Linux Kernel source. */ + i386_linux_record_tdep.size_pointer + = gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT; i386_linux_record_tdep.size__old_kernel_stat = 32; i386_linux_record_tdep.size_tms = 16; i386_linux_record_tdep.size_loff_t = 8; @@ -501,9 +510,12 @@ i386_linux_init_abi (struct gdbarch_info i386_linux_record_tdep.size_statfs = 64; i386_linux_record_tdep.size_statfs64 = 84; i386_linux_record_tdep.size_sockaddr = 16; - i386_linux_record_tdep.size_int = 4; - i386_linux_record_tdep.size_long = 4; - i386_linux_record_tdep.size_ulong = 4; + i386_linux_record_tdep.size_int + = gdbarch_int_bit (gdbarch) / TARGET_CHAR_BIT; + i386_linux_record_tdep.size_long + = gdbarch_long_bit (gdbarch) / TARGET_CHAR_BIT; + i386_linux_record_tdep.size_ulong + = gdbarch_long_bit (gdbarch) / TARGET_CHAR_BIT; i386_linux_record_tdep.size_msghdr = 28; i386_linux_record_tdep.size_itimerval = 16; i386_linux_record_tdep.size_stat = 88; @@ -536,7 +548,8 @@ i386_linux_init_abi (struct gdbarch_info i386_linux_record_tdep.size_io_event = 32; i386_linux_record_tdep.size_iocb = 64; i386_linux_record_tdep.size_epoll_event = 12; - i386_linux_record_tdep.size_itimerspec = i386_linux_record_tdep.size_timespec * 2; + i386_linux_record_tdep.size_itimerspec + = i386_linux_record_tdep.size_timespec * 2; i386_linux_record_tdep.size_mq_attr = 32; i386_linux_record_tdep.size_siginfo = 128; i386_linux_record_tdep.size_termios = 36; @@ -546,6 +559,8 @@ i386_linux_init_abi (struct gdbarch_info i386_linux_record_tdep.size_serial_struct = 60; i386_linux_record_tdep.size_serial_icounter_struct = 80; i386_linux_record_tdep.size_hayes_esp_config = 12; + i386_linux_record_tdep.size_size_t = 4; + i386_linux_record_tdep.size_iovec = 8; /* These values are the second argument of system call "sys_ioctl". They are obtained from Linux Kernel source. */ @@ -627,6 +642,7 @@ i386_linux_init_abi (struct gdbarch_info i386_linux_record_tdep.arg3 = I386_EDX_REGNUM; i386_linux_record_tdep.arg4 = I386_ESI_REGNUM; i386_linux_record_tdep.arg5 = I386_EDI_REGNUM; + i386_linux_record_tdep.arg6 = I386_EBP_REGNUM; tdep->i386_intx80_record = i386_linux_intx80_sysenter_record; tdep->i386_sysenter_record = i386_linux_intx80_sysenter_record; --- a/linux-record.c +++ b/linux-record.c @@ -19,6 +19,7 @@ #include "defs.h" #include "target.h" +#include "gdbtypes.h" #include "regcache.h" #include "record.h" #include "linux-record.h" @@ -80,6 +81,133 @@ #define RECORD_Q_XGETQSTAT (('5' << 8) + 5) #define RECORD_Q_XGETQUOTA (('3' << 8) + 3) +#define OUTPUT_REG(val, num) phex_nz ((val), \ + TYPE_LENGTH (gdbarch_register_type (get_regcache_arch (regcache), (num)))) + +static int +record_linux_sockaddr (struct regcache *regcache, + struct linux_record_tdep *tdep, ULONGEST addr, + ULONGEST len) +{ + gdb_byte *a; + int addrlen; + struct gdbarch *gdbarch = get_regcache_arch (regcache); + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); + + if (!addr) + return 0; + + a = alloca (tdep->size_int); + + if (record_arch_list_add_mem ((CORE_ADDR) len, tdep->size_int)) + return -1; + + /* Get the addrlen. */ + if (target_read_memory ((CORE_ADDR) len, a, tdep->size_int)) + { + if (record_debug) + fprintf_unfiltered (gdb_stdlog, + "Process record: error reading " + "memory at addr = 0x%s len = %d.\n", + phex_nz (len, tdep->size_pointer), + tdep->size_int); + return -1; + } + addrlen = (int) extract_unsigned_integer(a, tdep->size_int, byte_order); + if (addrlen <= 0 || addrlen > tdep->size_sockaddr) + addrlen = tdep->size_sockaddr; + + if (record_arch_list_add_mem ((CORE_ADDR) addr, addrlen)) + return -1; + + return 0; +} + +static int +record_linux_msghdr (struct regcache *regcache, + struct linux_record_tdep *tdep, ULONGEST addr) +{ + gdb_byte *a; + struct gdbarch *gdbarch = get_regcache_arch (regcache); + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); + + if (!addr) + return 0; + + if (record_arch_list_add_mem ((CORE_ADDR) addr, tdep->size_msghdr)) + return -1; + + a = alloca (tdep->size_msghdr); + if (target_read_memory ((CORE_ADDR) addr, a, tdep->size_msghdr)) + { + if (record_debug) + fprintf_unfiltered (gdb_stdlog, + "Process record: error reading " + "memory at addr = 0x%s " + "len = %d.\n", + phex_nz (addr, tdep->size_pointer), + tdep->size_msghdr); + return -1; + } + + /* msg_name msg_namelen */ + addr = extract_unsigned_integer (a, tdep->size_pointer, byte_order); + a += tdep->size_pointer; + if (record_arch_list_add_mem ((CORE_ADDR) addr, + (int) extract_unsigned_integer (a, + tdep->size_int, + byte_order))) + return -1; + a += tdep->size_int; + + /* msg_iov msg_iovlen */ + addr = extract_unsigned_integer (a, tdep->size_pointer, byte_order); + a += tdep->size_pointer; + if (addr) + { + ULONGEST i; + ULONGEST len = extract_unsigned_integer (a, tdep->size_size_t, + byte_order); + gdb_byte *iov = alloca (tdep->size_iovec); + + for (i = 0; i < len; i++) + { + if (target_read_memory ((CORE_ADDR) addr, iov, tdep->size_iovec)) + { + if (record_debug) + fprintf_unfiltered (gdb_stdlog, + "Process record: error " + "reading memory at " + "addr = 0x%s " + "len = %d.\n", + phex_nz (addr,tdep->size_pointer), + tdep->size_iovec); + return -1; + } + if (record_arch_list_add_mem ((CORE_ADDR) extract_unsigned_integer + (iov, tdep->size_pointer, + byte_order), + (int) extract_unsigned_integer + (iov + tdep->size_pointer, + tdep->size_size_t, + byte_order))) + return -1; + addr += tdep->size_iovec; + } + } + a += tdep->size_size_t; + + /* msg_control msg_controllen */ + addr = extract_unsigned_integer (a, tdep->size_pointer, byte_order); + a += tdep->size_pointer; + if (record_arch_list_add_mem ((CORE_ADDR) addr, + (int) extract_unsigned_integer + (a, tdep->size_size_t, byte_order))) + return -1; + + return 0; +} + /* 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 @@ -94,10 +222,11 @@ int record_linux_system_call (int num, struct regcache *regcache, - struct linux_record_tdep *tdep) + struct linux_record_tdep *tdep) { struct gdbarch *gdbarch = get_regcache_arch (regcache); - uint32_t tmpu32; + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); + ULONGEST tmpulongest; switch (num) { @@ -108,15 +237,15 @@ record_linux_system_call (int num, struc /* 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; + 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; @@ -127,11 +256,11 @@ record_linux_system_call (int num, struc /* sys_read */ case 3: { - uint32_t addr, count; - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & addr); - regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & count); - if (record_arch_list_add_mem (addr, count)) - return -1; + ULONGEST addr, count; + regcache_raw_read_unsigned (regcache, tdep->arg2, &addr); + regcache_raw_read_unsigned (regcache, tdep->arg3, &count); + if (record_arch_list_add_mem ((CORE_ADDR) addr, (int) count)) + return -1; } break; @@ -171,9 +300,10 @@ record_linux_system_call (int num, struc case 28: /* sys_lstat */ case 84: - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size__old_kernel_stat)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size__old_kernel_stat)) + return -1; break; /* sys_lseek */ @@ -194,16 +324,16 @@ record_linux_system_call (int num, struc /* sys_ptrace */ case 26: - regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32); - if (tmpu32 == RECORD_PTRACE_PEEKTEXT - || tmpu32 == RECORD_PTRACE_PEEKDATA - || tmpu32 == RECORD_PTRACE_PEEKUSR) - { - regcache_raw_read (regcache, tdep->arg4, - (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, 4)) - return -1; - } + regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest); + if (tmpulongest == RECORD_PTRACE_PEEKTEXT + || tmpulongest == RECORD_PTRACE_PEEKDATA + || tmpulongest == RECORD_PTRACE_PEEKUSR) + { + regcache_raw_read_unsigned (regcache, tdep->arg4, + &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, 4)) + return -1; + } break; /* sys_alarm */ @@ -240,9 +370,9 @@ record_linux_system_call (int num, struc /* sys_times */ case 43: - regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_tms)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, tdep->size_tms)) + return -1; break; /* sys_ni_syscall */ @@ -270,149 +400,172 @@ record_linux_system_call (int num, struc /* sys_ioctl */ case 54: /* XXX Need to add a lot of support of other ioctl requests. */ - regcache_raw_read (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 (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 (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 (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 (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 (regcache, tdep->arg3, - (gdb_byte *) & tmpu32); + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (tmpulongest == tdep->ioctl_FIOCLEX + || tmpulongest == tdep->ioctl_FIONCLEX + || tmpulongest == tdep->ioctl_FIONBIO + || tmpulongest == tdep->ioctl_FIOASYNC + || tmpulongest == tdep->ioctl_TCSETS + || tmpulongest == tdep->ioctl_TCSETSW + || tmpulongest == tdep->ioctl_TCSETSF + || tmpulongest == tdep->ioctl_TCSETA + || tmpulongest == tdep->ioctl_TCSETAW + || tmpulongest == tdep->ioctl_TCSETAF + || tmpulongest == tdep->ioctl_TCSBRK + || tmpulongest == tdep->ioctl_TCXONC + || tmpulongest == tdep->ioctl_TCFLSH + || tmpulongest == tdep->ioctl_TIOCEXCL + || tmpulongest == tdep->ioctl_TIOCNXCL + || tmpulongest == tdep->ioctl_TIOCSCTTY + || tmpulongest == tdep->ioctl_TIOCSPGRP + || tmpulongest == tdep->ioctl_TIOCSTI + || tmpulongest == tdep->ioctl_TIOCSWINSZ + || tmpulongest == tdep->ioctl_TIOCMBIS + || tmpulongest == tdep->ioctl_TIOCMBIC + || tmpulongest == tdep->ioctl_TIOCMSET + || tmpulongest == tdep->ioctl_TIOCSSOFTCAR + || tmpulongest == tdep->ioctl_TIOCCONS + || tmpulongest == tdep->ioctl_TIOCSSERIAL + || tmpulongest == tdep->ioctl_TIOCPKT + || tmpulongest == tdep->ioctl_TIOCNOTTY + || tmpulongest == tdep->ioctl_TIOCSETD + || tmpulongest == tdep->ioctl_TCSBRKP + || tmpulongest == tdep->ioctl_TIOCTTYGSTRUCT + || tmpulongest == tdep->ioctl_TIOCSBRK + || tmpulongest == tdep->ioctl_TIOCCBRK + || tmpulongest == tdep->ioctl_TCSETS2 + || tmpulongest == tdep->ioctl_TCSETSW2 + || tmpulongest == tdep->ioctl_TCSETSF2 + || tmpulongest == tdep->ioctl_TIOCSPTLCK + || tmpulongest == tdep->ioctl_TIOCSERCONFIG + || tmpulongest == tdep->ioctl_TIOCSERGWILD + || tmpulongest == tdep->ioctl_TIOCSERSWILD + || tmpulongest == tdep->ioctl_TIOCSLCKTRMIOS + || tmpulongest == tdep->ioctl_TIOCSERGETMULTI + || tmpulongest == tdep->ioctl_TIOCSERSETMULTI + || tmpulongest == tdep->ioctl_TIOCMIWAIT + || tmpulongest == tdep->ioctl_TIOCSHAYESESP) + { + /* Nothing to do. */ + } + else if (tmpulongest == tdep->ioctl_TCGETS + || tmpulongest == tdep->ioctl_TCGETA + || tmpulongest == tdep->ioctl_TIOCGLCKTRMIOS) + { + regcache_raw_read_unsigned (regcache, tdep->arg3, + &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_termios)) + return -1; + } + else if (tmpulongest == tdep->ioctl_TIOCGPGRP + || tmpulongest == tdep->ioctl_TIOCGSID) + { + regcache_raw_read_unsigned (regcache, tdep->arg3, + &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_pid_t)) + return -1; + } + else if (tmpulongest == tdep->ioctl_TIOCOUTQ + || tmpulongest == tdep->ioctl_TIOCMGET + || tmpulongest == tdep->ioctl_TIOCGSOFTCAR + || tmpulongest == tdep->ioctl_FIONREAD + || tmpulongest == tdep->ioctl_TIOCINQ + || tmpulongest == tdep->ioctl_TIOCGETD + || tmpulongest == tdep->ioctl_TIOCGPTN + || tmpulongest == tdep->ioctl_TIOCSERGETLSR) + { + regcache_raw_read_unsigned (regcache, tdep->arg3, + &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_int)) + return -1; + } + else if (tmpulongest == tdep->ioctl_TIOCGWINSZ) + { + regcache_raw_read_unsigned (regcache, tdep->arg3, + &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_winsize)) + return -1; + } + else if (tmpulongest == tdep->ioctl_TIOCLINUX) + { + regcache_raw_read_unsigned (regcache, tdep->arg3, + &tmpulongest); /* This syscall affect a char size memory. */ - if (record_arch_list_add_mem (tmpu32, 1)) - return -1; - } - else if (tmpu32 == tdep->ioctl_TIOCGSERIAL) - { - regcache_raw_read (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 (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 (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 (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 (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; - } + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, 1)) + return -1; + } + else if (tmpulongest == tdep->ioctl_TIOCGSERIAL) + { + regcache_raw_read_unsigned (regcache, tdep->arg3, + &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_serial_struct)) + return -1; + } + else if (tmpulongest == tdep->ioctl_TCGETS2) + { + regcache_raw_read_unsigned (regcache, tdep->arg3, + &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_termios2)) + return -1; + } + else if (tmpulongest == tdep->ioctl_FIOQSIZE) + { + regcache_raw_read_unsigned (regcache, tdep->arg3, + &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_loff_t)) + return -1; + } + else if (tmpulongest == tdep->ioctl_TIOCGICOUNT) + { + regcache_raw_read_unsigned (regcache, tdep->arg3, + &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_serial_icounter_struct)) + return -1; + } + else if (tmpulongest == tdep->ioctl_TIOCGHAYESESP) + { + regcache_raw_read_unsigned (regcache, tdep->arg3, + &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_hayes_esp_config)) + return -1; + } + else if (tmpulongest == 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%s.\n"), - phex_nz (tmpu32, 4)); - return 1; - } + { + printf_unfiltered (_("Process record and replay target doesn't " + "support ioctl request 0x%s.\n"), + OUTPUT_REG (tmpulongest, tdep->arg2)); + return 1; + } break; /* sys_fcntl */ case 55: /* XXX */ - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32); + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); sys_fcntl: - if (tmpu32 == tdep->fcntl_F_GETLK) - { - regcache_raw_read (regcache, tdep->arg3, - (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_flock)) - return -1; - } + if (tmpulongest == tdep->fcntl_F_GETLK) + { + regcache_raw_read_unsigned (regcache, tdep->arg3, + &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_flock)) + return -1; + } break; /* sys_ni_syscall */ @@ -425,9 +578,10 @@ record_linux_system_call (int num, struc /* sys_olduname */ case 59: - regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_oldold_utsname)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_oldold_utsname)) + return -1; break; /* sys_umask */ @@ -438,9 +592,10 @@ record_linux_system_call (int num, struc /* sys_ustat */ case 62: - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_ustat)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_ustat)) + return -1; break; /* sys_dup2 */ @@ -455,9 +610,10 @@ record_linux_system_call (int num, struc /* sys_sigaction */ case 67: - regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_old_sigaction)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_old_sigaction)) + return -1; break; /* sys_sgetmask */ @@ -474,9 +630,10 @@ record_linux_system_call (int num, struc /* sys_sigpending */ case 73: - regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_old_sigset_t)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_old_sigset_t)) + return -1; break; /* sys_sethostname */ @@ -487,26 +644,30 @@ record_linux_system_call (int num, struc /* sys_old_getrlimit */ case 76: - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_rlimit)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_rlimit)) + return -1; break; /* sys_getrusage */ case 77: - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_rusage)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_rusage)) + return -1; break; /* sys_gettimeofday */ case 78: - regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_timeval)) - return -1; - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_timezone)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_timeval)) + return -1; + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_timezone)) + return -1; break; /* sys_settimeofday */ @@ -515,53 +676,56 @@ record_linux_system_call (int num, struc /* sys_getgroups16 */ case 80: - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_old_gid_t)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_old_gid_t)) + return -1; break; /* sys_setgroups16 */ case 81: - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_old_gid_t)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + 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; + struct sel_arg_struct + { + CORE_ADDR n; + CORE_ADDR inp; + CORE_ADDR outp; + CORE_ADDR exp; + CORE_ADDR tvp; + } sel; - regcache_raw_read (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 = %s len = %lu.\n", - paddress (gdbarch, tmpu32), - (unsigned long)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; - } + regcache_raw_read_unsigned (regcache, tdep->arg1, + &tmpulongest); + if (tmpulongest) + { + if (target_read_memory (tmpulongest, (gdb_byte *) &sel, + sizeof(sel))) + { + if (record_debug) + fprintf_unfiltered (gdb_stdlog, + "Process record: error reading memory " + "at addr = 0x%s len = %lu.\n", + OUTPUT_REG (tmpulongest, tdep->arg1), + (unsigned long) 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; @@ -572,12 +736,12 @@ record_linux_system_call (int num, struc /* sys_readlink */ case 85: { - uint32_t len; - regcache_raw_read (regcache, tdep->arg2, - (gdb_byte *) & tmpu32); - regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & len); - if (record_arch_list_add_mem (tmpu32, len)) - return -1; + ULONGEST len; + regcache_raw_read_unsigned (regcache, tdep->arg2, + &tmpulongest); + regcache_raw_read_unsigned (regcache, tdep->arg3, &len); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, (int) len)) + return -1; } break; @@ -590,23 +754,24 @@ record_linux_system_call (int num, struc /* 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; + 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 (regcache, tdep->arg2, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_dirent)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_dirent)) + return -1; break; /* old_mmap */ @@ -616,22 +781,21 @@ record_linux_system_call (int num, struc /* sys_munmap */ case 91: { - int q; - uint32_t len; + int q; + ULONGEST len; - regcache_raw_read (regcache, tdep->arg1, - (gdb_byte *) & tmpu32); - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & len); - target_terminal_ours (); - q = - yquery (_("The next instruction is syscall munmap. " - "It will free the memory addr = %s len = %u. " - "It will make record target get error. " - "Do you want to stop the program?"), - paddress (gdbarch, tmpu32), (int)len); - target_terminal_inferior (); - if (q) - return 1; + regcache_raw_read_unsigned (regcache, tdep->arg1, + &tmpulongest); + regcache_raw_read_unsigned (regcache, tdep->arg2, &len); + target_terminal_ours (); + q = yquery (_("The next instruction is syscall munmap. " + "It will free the memory addr = 0x%s len = %u. " + "It will make record target get error. " + "Do you want to stop the program?"), + OUTPUT_REG (tmpulongest, tdep->arg1), (int) len); + target_terminal_inferior (); + if (q) + return 1; } break; @@ -655,292 +819,347 @@ record_linux_system_call (int num, struc case 99: /* sys_fstatfs */ case 100: - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_statfs)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_statfs)) + return -1; break; /* sys_ioperm */ case 101: break; + /* sys_socket */ + case 500: + /* sys_sendto */ + case 503: + /* sys_sendmsg */ + case 505: + /* sys_shutdown */ + case 507: + /* sys_bind */ + case 508: + /* sys_connect */ + case 501: + /* sys_listen */ + case 509: + /* sys_setsockopt */ + case 513: + break; + + /* sys_accept */ + case 502: + /* sys_getsockname */ + case 510: + /* sys_getpeername */ + case 511: + { + ULONGEST len; + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + regcache_raw_read_unsigned (regcache, tdep->arg3, &len); + if (record_linux_sockaddr (regcache, tdep, tmpulongest, len)) + return -1; + } + break; + + /* sys_recvfrom */ + case 504: + { + ULONGEST len; + regcache_raw_read_unsigned (regcache, tdep->arg4, &tmpulongest); + regcache_raw_read_unsigned (regcache, tdep->arg5, &len); + if (record_linux_sockaddr (regcache, tdep, tmpulongest, len)) + return -1; + } + /* sys_recv */ + case 515: + { + ULONGEST size; + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + regcache_raw_read_unsigned (regcache, tdep->arg3, &size); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, (int) size)) + return -1; + } + break; + + /* sys_recvmsg */ + case 506: + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (record_linux_msghdr (regcache, tdep, tmpulongest)) + return -1; + break; + + /* sys_socketpair */ + case 512: + regcache_raw_read_unsigned (regcache, tdep->arg4, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, tdep->size_int)) + return -1; + break; + + /* sys_getsockopt */ + case 514: + regcache_raw_read_unsigned (regcache, tdep->arg5, &tmpulongest); + if (tmpulongest) + { + ULONGEST optvalp; + gdb_byte *optlenp = alloca (tdep->size_int); + if (target_read_memory ((CORE_ADDR) tmpulongest, optlenp, + tdep->size_int)) + { + if (record_debug) + fprintf_unfiltered (gdb_stdlog, + "Process record: error reading " + "memory at addr = 0x%s " + "len = %d.\n", + OUTPUT_REG (tmpulongest, tdep->arg5), + tdep->size_int); + return -1; + } + regcache_raw_read_unsigned (regcache, tdep->arg4, &optvalp); + if (record_arch_list_add_mem ((CORE_ADDR) optvalp, + (int) extract_signed_integer + (optlenp, tdep->size_int, + byte_order))) + return -1; + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_int)) + return -1; + } + break; + /* sys_socketcall */ case 102: - regcache_raw_read (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 (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 = %s len = %lu.\n", - paddress (gdbarch, tmpu32), - (unsigned long)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; + regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest); + switch (tmpulongest) + { + 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: + { + regcache_raw_read_unsigned (regcache, tdep->arg2, + &tmpulongest); + if (tmpulongest) + { + gdb_byte *a = alloca (tdep->size_ulong * 2); + int addrlen; + gdb_byte *addrlenp; - case RECORD_SYS_SOCKETPAIR: - { - uint32_t a[4]; - regcache_raw_read (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 = %s len = %lu.\n", - paddress (gdbarch, tmpu32), - (unsigned long)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 (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 = %s len = %lu.\n", - paddress (gdbarch, tmpu32), - (unsigned long)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 = %s " - "len = %lu.\n", - paddress (gdbarch, a[2]), - (unsigned long)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 (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 = %s len = %lu.\n", - paddress (gdbarch, tmpu32), - (unsigned long)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 = %s " - "len = %lu.\n", - paddress (gdbarch, a[2]), - (unsigned long)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; + tmpulongest += tdep->size_ulong; + if (target_read_memory ((CORE_ADDR) tmpulongest, a, + tdep->size_ulong * 2)) + { + if (record_debug) + fprintf_unfiltered (gdb_stdlog, + "Process record: error reading " + "memory at addr = 0x%s len = %d.\n", + OUTPUT_REG (tmpulongest, tdep->arg2), + tdep->size_ulong * 2); + return -1; + } + if (record_linux_sockaddr (regcache, tdep, + extract_unsigned_integer + (a, tdep->size_ulong, byte_order), + extract_unsigned_integer + (a + tdep->size_ulong, + tdep->size_ulong, byte_order))) + return -1; + } + } + break; - regcache_raw_read (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 = %s len = %lu.\n", - paddress (gdbarch, tmpu32), - (unsigned long)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 = %s " - "len = %lu.\n", - paddress (gdbarch, a[4]), - (unsigned long)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; + case RECORD_SYS_SOCKETPAIR: + { + gdb_byte *a = alloca (tdep->size_ulong); + regcache_raw_read_unsigned (regcache, tdep->arg2, + &tmpulongest); + if (tmpulongest) + { + tmpulongest += tdep->size_ulong * 3; + if (target_read_memory ((CORE_ADDR) tmpulongest, a, + tdep->size_ulong)) + { + if (record_debug) + fprintf_unfiltered (gdb_stdlog, + "Process record: error reading " + "memory at addr = 0x%s len = %d.\n", + OUTPUT_REG (tmpulongest, tdep->arg2), + tdep->size_ulong); + return -1; + } + if (record_arch_list_add_mem ((CORE_ADDR) extract_unsigned_integer + (a, + tdep->size_ulong, + byte_order), + tdep->size_int)) + return -1; + } + } + break; + case RECORD_SYS_SEND: + case RECORD_SYS_SENDTO: + break; + case RECORD_SYS_RECVFROM: + regcache_raw_read_unsigned (regcache, tdep->arg2, + &tmpulongest); + if (tmpulongest) + { + gdb_byte *a = alloca (tdep->size_ulong * 2); + int addrlen; + gdb_byte *addrlenp; - regcache_raw_read (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 = %s len = %lu.\n", - paddress (gdbarch, tmpu32), - (unsigned long)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 = %s " - "len = %lu.\n", - paddress (gdbarch, a[1]), - (unsigned long)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 = %s " - "len = %lu.\n", - paddress (gdbarch, - rec.msg_iov), - (unsigned long)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%s\n"), - phex_nz (tmpu32, 4)); - return -1; - break; - } + tmpulongest += tdep->size_ulong * 4; + if (target_read_memory ((CORE_ADDR) tmpulongest, a, + tdep->size_ulong * 2)) + { + if (record_debug) + fprintf_unfiltered (gdb_stdlog, + "Process record: error reading " + "memory at addr = 0x%s len = %d.\n", + OUTPUT_REG (tmpulongest, tdep->arg2), + tdep->size_ulong * 2); + return -1; + } + if (record_linux_sockaddr (regcache, tdep, + extract_unsigned_integer + (a, tdep->size_ulong, byte_order), + extract_unsigned_integer + (a + tdep->size_ulong, + tdep->size_ulong, byte_order))) + return -1; + } + case RECORD_SYS_RECV: + regcache_raw_read_unsigned (regcache, tdep->arg2, + &tmpulongest); + if (tmpulongest) + { + gdb_byte *a = alloca (tdep->size_ulong * 2); + + tmpulongest += tdep->size_ulong; + if (target_read_memory ((CORE_ADDR) tmpulongest, a, + tdep->size_ulong)) + { + if (record_debug) + fprintf_unfiltered (gdb_stdlog, + "Process record: error reading " + "memory at addr = 0x%s len = %d.\n", + OUTPUT_REG (tmpulongest, tdep->arg2), + tdep->size_ulong); + return -1; + } + tmpulongest = extract_unsigned_integer (a, tdep->size_ulong, + byte_order); + if (tmpulongest) + { + a += tdep->size_ulong; + if (record_arch_list_add_mem + ((CORE_ADDR) tmpulongest, + (int) extract_unsigned_integer (a, tdep->size_ulong, + byte_order))) + return -1; + } + } + break; + case RECORD_SYS_SHUTDOWN: + case RECORD_SYS_SETSOCKOPT: + break; + case RECORD_SYS_GETSOCKOPT: + { + gdb_byte *a = alloca (tdep->size_ulong * 2); + gdb_byte *av = alloca (tdep->size_int); + + regcache_raw_read_unsigned (regcache, tdep->arg2, + &tmpulongest); + if (tmpulongest) + { + tmpulongest += tdep->size_ulong * 3; + if (target_read_memory ((CORE_ADDR) tmpulongest, a, + tdep->size_ulong * 2)) + { + if (record_debug) + fprintf_unfiltered (gdb_stdlog, + "Process record: error reading " + "memory at addr = 0x%s len = %d.\n", + OUTPUT_REG (tmpulongest, tdep->arg2), + tdep->size_ulong * 2); + return -1; + } + tmpulongest = extract_unsigned_integer (a + tdep->size_ulong, + tdep->size_ulong, + byte_order); + if (tmpulongest) + { + if (target_read_memory ((CORE_ADDR) tmpulongest, av, + tdep->size_int)) + { + if (record_debug) + fprintf_unfiltered (gdb_stdlog, + "Process record: error reading " + "memory at addr = 0x%s " + "len = %d.\n", + phex_nz (tmpulongest, + tdep->size_ulong), + tdep->size_int); + return -1; + } + if (record_arch_list_add_mem + ((CORE_ADDR) extract_unsigned_integer + (a, tdep->size_ulong, byte_order), + (int) extract_unsigned_integer (av, tdep->size_int, + byte_order))) + return -1; + a += tdep->size_ulong; + if (record_arch_list_add_mem + ((CORE_ADDR) extract_unsigned_integer + (a, tdep->size_ulong, byte_order), + tdep->size_int)) + return -1; + } + } + } + break; + case RECORD_SYS_SENDMSG: + break; + case RECORD_SYS_RECVMSG: + { + gdb_byte *a = alloca (tdep->size_ulong); + + regcache_raw_read_unsigned (regcache, tdep->arg2, + &tmpulongest); + if (tmpulongest) + { + tmpulongest += tdep->size_ulong; + if (target_read_memory ((CORE_ADDR) tmpulongest, a, + tdep->size_ulong)) + { + if (record_debug) + fprintf_unfiltered (gdb_stdlog, + "Process record: error reading " + "memory at addr = 0x%s len = %d.\n", + OUTPUT_REG (tmpulongest, tdep->arg2), + tdep->size_ulong); + return -1; + } + tmpulongest = extract_unsigned_integer (a, tdep->size_ulong, + byte_order); + if (record_linux_msghdr (regcache, tdep, + extract_unsigned_integer + (a, tdep->size_ulong, byte_order))) + return -1; + } + } + break; + default: + printf_unfiltered (_("Process record and replay target " + "doesn't support socketcall call 0x%s\n"), + OUTPUT_REG (tmpulongest, tdep->arg1)); + return -1; + break; + } break; /* sys_syslog */ @@ -949,16 +1168,18 @@ record_linux_system_call (int num, struc /* sys_setitimer */ case 104: - regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_itimerval)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_itimerval)) + return -1; break; /* sys_getitimer */ case 105: - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_itimerval)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_itimerval)) + return -1; break; /* sys_newstat */ @@ -967,16 +1188,19 @@ record_linux_system_call (int num, struc case 107: /* sys_newfstat */ case 108: - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_stat)) - return -1; + /* sys_newfstatat */ + case 540: + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, tdep->size_stat)) + return -1; break; /* sys_uname */ case 109: - regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_old_utsname)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_old_utsname)) + return -1; break; /* sys_iopl */ @@ -991,12 +1215,14 @@ record_linux_system_call (int num, struc /* sys_wait4 */ case 114: - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_int)) - return -1; - regcache_raw_read (regcache, tdep->arg4, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_rusage)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_int)) + return -1; + regcache_raw_read_unsigned (regcache, tdep->arg4, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_rusage)) + return -1; break; /* sys_swapoff */ @@ -1005,47 +1231,121 @@ record_linux_system_call (int num, struc /* sys_sysinfo */ case 116: - regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_sysinfo)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_sysinfo)) + return -1; + break; + + /* sys_shmget */ + case 520: + /* sys_semget */ + case 523: + /* sys_semop */ + case 524: + /* sys_msgget */ + case 528: + /* sys_shmdt */ + /* XXX maybe need do some record works wiht sys_shmdt. */ + case 527: + /* sys_msgsnd */ + case 529: + /* sys_semtimedop */ + case 532: + break; + + /* sys_shmat */ + case 521: + regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_ulong)) + return -1; + break; + + /* sys_shmctl */ + case 522: + regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_shmid_ds)) + return -1; + break; + + /* sys_semctl */ + /* XXX sys_semctl 525 still not support. */ + + /* sys_msgrcv */ + case 530: + { + ULONGEST msgp; + regcache_raw_read_signed (regcache, tdep->arg3, &tmpulongest); + regcache_raw_read_unsigned (regcache, tdep->arg2, &msgp); + if (record_arch_list_add_mem ((CORE_ADDR) msgp, + (int) tmpulongest + tdep->size_long)) + return -1; + } + break; + + /* sys_msgctl */ + case 531: + regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_msqid_ds)) + return -1; break; /* sys_ipc */ case 117: - regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32); - switch (tmpu32) - { - case RECORD_MSGRCV: - { - int32_t second; - uint32_t ptr; - regcache_raw_read (regcache, tdep->arg3, - (gdb_byte *) & second); - regcache_raw_read (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 (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 (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 (regcache, tdep->arg5, - (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_shmid_ds)) - return -1; - break; - } + regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest); + tmpulongest &= 0xffff; + switch (tmpulongest) + { + case RECORD_SEMOP: + case RECORD_SEMGET: + case RECORD_SEMTIMEDOP: + case RECORD_MSGSND: + case RECORD_MSGGET: + /* XXX maybe need do some record works wiht RECORD_SHMDT. */ + case RECORD_SHMDT: + case RECORD_SHMGET: + break; + case RECORD_MSGRCV: + { + ULONGEST second; + ULONGEST ptr; + regcache_raw_read_signed (regcache, tdep->arg3, &second); + regcache_raw_read_unsigned (regcache, tdep->arg5, &ptr); + if (record_arch_list_add_mem ((CORE_ADDR) ptr, + (int) second + tdep->size_long)) + return -1; + } + break; + case RECORD_MSGCTL: + regcache_raw_read_unsigned (regcache, tdep->arg5, + &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_msqid_ds)) + return -1; + break; + case RECORD_SHMAT: + regcache_raw_read_unsigned (regcache, tdep->arg4, + &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_ulong)) + return -1; + break; + case RECORD_SHMCTL: + regcache_raw_read_unsigned (regcache, tdep->arg5, + &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_shmid_ds)) + return -1; + break; + default: + /* XXX RECORD_SEMCTL still not support. */ + printf_unfiltered (_("Process record and replay target doesn't " + "support ipc number %d\n"), (int) tmpulongest); + break; + } break; /* sys_fsync */ @@ -1060,30 +1360,30 @@ record_linux_system_call (int num, struc /* sys_newuname */ case 122: - regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_new_utsname)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_new_utsname)) + return -1; break; /* sys_modify_ldt */ case 123: - regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32); - if (tmpu32 == 0 || tmpu32 == 2) - { - uint32_t ptr, bytecount; - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & ptr); - regcache_raw_read (regcache, tdep->arg3, - (gdb_byte *) & bytecount); - if (record_arch_list_add_mem (ptr, bytecount)) - return -1; - } + regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest); + if (tmpulongest == 0 || tmpulongest == 2) + { + ULONGEST ptr, bytecount; + regcache_raw_read_unsigned (regcache, tdep->arg2, &ptr); + regcache_raw_read_unsigned (regcache, tdep->arg3, &bytecount); + if (record_arch_list_add_mem ((CORE_ADDR) ptr, (int) bytecount)) + return -1; + } break; /* sys_adjtimex */ case 124: - regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_timex)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, tdep->size_timex)) + return -1; break; /* sys_mprotect */ @@ -1092,9 +1392,10 @@ record_linux_system_call (int num, struc /* sys_sigprocmask */ case 126: - regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_old_sigset_t)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_old_sigset_t)) + return -1; break; /* sys_ni_syscall */ @@ -1109,35 +1410,39 @@ record_linux_system_call (int num, struc /* sys_quotactl */ case 131: - regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32); - switch (tmpu32) - { - case RECORD_Q_GETFMT: - regcache_raw_read (regcache, tdep->arg4, - (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, 4)) - return -1; - break; - case RECORD_Q_GETINFO: - regcache_raw_read (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 (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 (regcache, tdep->arg4, - (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_fs_quota_stat)) - return -1; - break; - } + regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest); + switch (tmpulongest) + { + case RECORD_Q_GETFMT: + regcache_raw_read_unsigned (regcache, tdep->arg4, + &tmpulongest); + /* __u32 */ + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, 4)) + return -1; + break; + case RECORD_Q_GETINFO: + regcache_raw_read_unsigned (regcache, tdep->arg4, + &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_mem_dqinfo)) + return -1; + break; + case RECORD_Q_GETQUOTA: + regcache_raw_read_unsigned (regcache, tdep->arg4, + &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_if_dqblk)) + return -1; + break; + case RECORD_Q_XGETQSTAT: + case RECORD_Q_XGETQUOTA: + regcache_raw_read_unsigned (regcache, tdep->arg4, + &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_fs_quota_stat)) + return -1; + break; + } break; /* sys_getpgid */ @@ -1150,15 +1455,15 @@ record_linux_system_call (int num, struc /* sys_sysfs */ case 135: - regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32); - if (tmpu32 == 2) - { - regcache_raw_read (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; - } + regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest); + if (tmpulongest == 2) + { + regcache_raw_read_unsigned (regcache, tdep->arg3, + &tmpulongest); + /*XXX the size of memory is not very clear. */ + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, 10)) + return -1; + } break; /* sys_personality */ @@ -1173,37 +1478,43 @@ record_linux_system_call (int num, struc /* sys_llseek */ case 140: - regcache_raw_read (regcache, tdep->arg4, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_loff_t)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg4, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_loff_t)) + return -1; break; /* sys_getdents */ case 141: { - uint32_t count; - regcache_raw_read (regcache, tdep->arg2, - (gdb_byte *) & tmpu32); - regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & count); - if (record_arch_list_add_mem (tmpu32, tdep->size_dirent * count)) - return -1; + ULONGEST count; + regcache_raw_read_unsigned (regcache, tdep->arg2, + &tmpulongest); + regcache_raw_read_unsigned (regcache, tdep->arg3, &count); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_dirent * count)) + return -1; } break; /* sys_select */ case 142: - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_fd_set)) - return -1; - regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_fd_set)) - return -1; - regcache_raw_read (regcache, tdep->arg4, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_fd_set)) - return -1; - regcache_raw_read (regcache, tdep->arg5, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_timeval)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_fd_set)) + return -1; + regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_fd_set)) + return -1; + regcache_raw_read_unsigned (regcache, tdep->arg4, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_fd_set)) + return -1; + regcache_raw_read_unsigned (regcache, tdep->arg5, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_timeval)) + return -1; break; /* sys_flock */ @@ -1215,36 +1526,37 @@ record_linux_system_call (int num, struc /* 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 (regcache, tdep->arg2, (gdb_byte *) & vec); - if (vec) - { - regcache_raw_read (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 = %s len = %lu.\n", - paddress (gdbarch, vec), - (unsigned long)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); - } - } + ULONGEST vec, vlen; + + regcache_raw_read_unsigned (regcache, tdep->arg2, &vec); + if (vec) + { + gdb_byte *iov = alloca (tdep->size_iovec); + + regcache_raw_read_unsigned (regcache, tdep->arg3, &vlen); + for (tmpulongest = 0; tmpulongest < vlen; tmpulongest++) + { + if (target_read_memory ((CORE_ADDR) vec, iov, + tdep->size_iovec)) + { + if (record_debug) + fprintf_unfiltered (gdb_stdlog, + "Process record: error reading " + "memory at addr = 0x%s len = %d.\n", + OUTPUT_REG (vec, tdep->arg2), + tdep->size_iovec); + return -1; + } + if (record_arch_list_add_mem + ((CORE_ADDR) extract_unsigned_integer + (iov, tdep->size_pointer, byte_order), + (int) extract_unsigned_integer + (iov + tdep->size_pointer, tdep->size_size_t, + byte_order))) + return -1; + vec += tdep->size_iovec; + } + } } break; @@ -1270,9 +1582,9 @@ record_linux_system_call (int num, struc /* sys_sched_getparam */ case 155: - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_int)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, tdep->size_int)) + return -1; break; /* sys_sched_setscheduler */ @@ -1291,9 +1603,10 @@ record_linux_system_call (int num, struc case 161: /* sys_nanosleep */ case 162: - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_timespec)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_timespec)) + return -1; break; /* sys_mremap */ @@ -1304,15 +1617,17 @@ record_linux_system_call (int num, struc /* sys_getresuid16 */ case 165: - regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_old_uid_t)) - return -1; - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_old_uid_t)) - return -1; - regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_old_uid_t)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_old_uid_t)) + return -1; + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_old_uid_t)) + return -1; + regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, tdep->size_old_uid_t)) + return -1; break; /* sys_vm86 */ @@ -1323,32 +1638,32 @@ record_linux_system_call (int num, struc /* sys_poll */ case 168: - regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32); - if (tmpu32) - { - uint32_t nfds; - regcache_raw_read (regcache, tdep->arg2, - (gdb_byte *) & nfds); - if (record_arch_list_add_mem (tmpu32, tdep->size_pollfd * nfds)) - return -1; - } + regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest); + if (tmpulongest) + { + ULONGEST nfds; + regcache_raw_read_unsigned (regcache, tdep->arg2, &nfds); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_pollfd * nfds)) + return -1; + } break; /* sys_nfsservctl */ case 169: - regcache_raw_read (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 (regcache, tdep->arg3, - (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, rsize)) - return -1; - } + regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest); + if (tmpulongest == 7 || tmpulongest == 8) + { + int rsize; + if (tmpulongest == 7) + rsize = tdep->size_NFS_FHSIZE; + else + rsize = tdep->size_knfsd_fh; + regcache_raw_read_unsigned (regcache, tdep->arg3, + &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, rsize)) + return -1; + } break; /* sys_setresgid16 */ @@ -1357,35 +1672,40 @@ record_linux_system_call (int num, struc /* sys_getresgid16 */ case 171: - regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_old_gid_t)) - return -1; - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_old_gid_t)) - return -1; - regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_old_gid_t)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_old_gid_t)) + return -1; + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_old_gid_t)) + return -1; + regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_old_gid_t)) + return -1; break; /* sys_prctl */ case 172: - regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32); - switch (tmpu32) - { - case 2: - regcache_raw_read (regcache, tdep->arg2, - (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_int)) - return -1; - break; - case 16: - regcache_raw_read (regcache, tdep->arg2, - (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_TASK_COMM_LEN)) - return -1; - break; - } + regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest); + switch (tmpulongest) + { + case 2: + regcache_raw_read_unsigned (regcache, tdep->arg2, + &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_int)) + return -1; + break; + case 16: + regcache_raw_read_unsigned (regcache, tdep->arg2, + &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_TASK_COMM_LEN)) + return -1; + break; + } break; /* sys_rt_sigreturn */ @@ -1394,36 +1714,39 @@ record_linux_system_call (int num, struc /* sys_rt_sigaction */ case 174: - regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_sigaction)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_sigaction)) + return -1; break; /* sys_rt_sigprocmask */ case 175: - regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_sigset_t)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_sigset_t)) + return -1; break; /* sys_rt_sigpending */ case 176: - regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32); - if (tmpu32) - { - uint32_t sigsetsize; - regcache_raw_read (regcache, tdep->arg2, - (gdb_byte *) & sigsetsize); - if (record_arch_list_add_mem (tmpu32, sigsetsize)) - return -1; - } + regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest); + if (tmpulongest) + { + ULONGEST sigsetsize; + regcache_raw_read_unsigned (regcache, tdep->arg2,&sigsetsize); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + (int) sigsetsize)) + return -1; + } break; /* sys_rt_sigtimedwait */ case 177: - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_siginfo_t)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_siginfo_t)) + return -1; break; /* sys_rt_sigqueueinfo */ @@ -1434,15 +1757,14 @@ record_linux_system_call (int num, struc /* sys_pread64 */ case 180: - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32); - if (tmpu32) - { - uint32_t count; - regcache_raw_read (regcache, tdep->arg3, - (gdb_byte *) & count); - if (record_arch_list_add_mem (tmpu32, count)) - return -1; - } + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (tmpulongest) + { + ULONGEST count; + regcache_raw_read_unsigned (regcache, tdep->arg3,&count); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, (int) count)) + return -1; + } break; /* sys_pwrite64 */ @@ -1453,22 +1775,22 @@ record_linux_system_call (int num, struc /* sys_getcwd */ case 183: - regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32); - if (tmpu32) - { - uint32_t size; - regcache_raw_read (regcache, tdep->arg2, - (gdb_byte *) & size); - if (record_arch_list_add_mem (tmpu32, size)) - return -1; - } + regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest); + if (tmpulongest) + { + ULONGEST size; + regcache_raw_read_unsigned (regcache, tdep->arg2, &size); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, (int) size)) + return -1; + } break; /* sys_capget */ case 184: - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_cap_user_data_t)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_cap_user_data_t)) + return -1; break; /* sys_capset */ @@ -1477,16 +1799,18 @@ record_linux_system_call (int num, struc /* sys_sigaltstack */ case 186: - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_stack_t)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_stack_t)) + return -1; break; /* sys_sendfile */ case 187: - regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_off_t)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_off_t)) + return -1; break; /* sys_ni_syscall */ @@ -1499,9 +1823,10 @@ record_linux_system_call (int num, struc /* sys_getrlimit */ case 191: - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_rlimit)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_rlimit)) + return -1; break; /* sys_mmap2 */ @@ -1520,9 +1845,10 @@ record_linux_system_call (int num, struc case 196: /* sys_fstat64 */ case 197: - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_stat64)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_stat64)) + return -1; break; /* sys_lchown */ @@ -1543,16 +1869,16 @@ record_linux_system_call (int num, struc /* sys_getgroups */ case 205: - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32); - if (tmpu32) - { - int gidsetsize; - regcache_raw_read (regcache, tdep->arg1, - (gdb_byte *) & gidsetsize); - if (record_arch_list_add_mem - (tmpu32, tdep->size_gid_t * gidsetsize)) - return -1; - } + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (tmpulongest) + { + ULONGEST gidsetsize; + regcache_raw_read_unsigned (regcache, tdep->arg1, + &gidsetsize); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_gid_t * (int) gidsetsize)) + return -1; + } break; /* sys_setgroups */ @@ -1565,15 +1891,15 @@ record_linux_system_call (int num, struc /* sys_getresuid */ case 209: - regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_uid_t)) - return -1; - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_uid_t)) - return -1; - regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_uid_t)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, tdep->size_uid_t)) + return -1; + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, tdep->size_uid_t)) + return -1; + regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, tdep->size_uid_t)) + return -1; break; /* sys_setresgid */ @@ -1582,15 +1908,15 @@ record_linux_system_call (int num, struc /* sys_getresgid */ case 211: - regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_gid_t)) - return -1; - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_gid_t)) - return -1; - regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_gid_t)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, tdep->size_gid_t)) + return -1; + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, tdep->size_gid_t)) + return -1; + regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, tdep->size_gid_t)) + return -1; break; /* sys_chown */ @@ -1609,9 +1935,10 @@ record_linux_system_call (int num, struc /* sys_mincore */ case 218: - regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_PAGE_SIZE)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_PAGE_SIZE)) + return -1; break; /* sys_madvise */ @@ -1621,30 +1948,32 @@ record_linux_system_call (int num, struc /* sys_getdents64 */ case 220: { - uint32_t count; - regcache_raw_read (regcache, tdep->arg2, - (gdb_byte *) & tmpu32); - regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & count); - if (record_arch_list_add_mem (tmpu32, tdep->size_dirent64 * count)) - return -1; + ULONGEST count; + regcache_raw_read_unsigned (regcache, tdep->arg2, + &tmpulongest); + regcache_raw_read_unsigned (regcache, tdep->arg3, &count); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_dirent64 * count)) + return -1; } break; /* sys_fcntl64 */ case 221: - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32); - if (tmpu32 == tdep->fcntl_F_GETLK64) + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (tmpulongest == tdep->fcntl_F_GETLK64) { - regcache_raw_read (regcache, tdep->arg3, - (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_flock64)) - return -1; - } - else if (tmpu32 != tdep->fcntl_F_SETLK64 - && tmpu32 != tdep->fcntl_F_SETLKW64) + regcache_raw_read_unsigned (regcache, tdep->arg3, + &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_flock64)) + return -1; + } + else if (tmpulongest != tdep->fcntl_F_SETLK64 + && tmpulongest != tdep->fcntl_F_SETLKW64) { - goto sys_fcntl; - } + goto sys_fcntl; + } break; /* sys_ni_syscall */ @@ -1669,15 +1998,14 @@ record_linux_system_call (int num, struc case 230: /* sys_fgetxattr */ case 231: - regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32); - if (tmpu32) - { - uint32_t size; - regcache_raw_read (regcache, tdep->arg4, - (gdb_byte *) & size); - if (record_arch_list_add_mem (tmpu32, size)) - return -1; - } + regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest); + if (tmpulongest) + { + ULONGEST size; + regcache_raw_read_unsigned (regcache, tdep->arg4, &size); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, (int) size)) + return -1; + } break; /* sys_listxattr */ @@ -1686,15 +2014,14 @@ record_linux_system_call (int num, struc case 233: /* sys_flistxattr */ case 234: - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32); - if (tmpu32) - { - uint32_t size; - regcache_raw_read (regcache, tdep->arg3, - (gdb_byte *) & size); - if (record_arch_list_add_mem (tmpu32, size)) - return -1; - } + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (tmpulongest) + { + ULONGEST size; + regcache_raw_read_unsigned (regcache, tdep->arg3, &size); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, (int) size)) + return -1; + } break; /* sys_removexattr */ @@ -1709,9 +2036,10 @@ record_linux_system_call (int num, struc /* sys_sendfile64 */ case 239: - regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_loff_t)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_loff_t)) + return -1; break; /* sys_futex */ @@ -1722,35 +2050,36 @@ record_linux_system_call (int num, struc /* sys_sched_getaffinity */ case 242: - regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32); - if (tmpu32) - { - uint32_t len; - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & len); - if (record_arch_list_add_mem (tmpu32, len)) - return -1; - } + regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest); + if (tmpulongest) + { + ULONGEST len; + regcache_raw_read_unsigned (regcache, tdep->arg2, &len); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, (int) len)) + return -1; + } break; /* sys_set_thread_area */ case 243: - regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_int)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, tdep->size_int)) + return -1; break; /* sys_get_thread_area */ case 244: - regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_user_desc)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_user_desc)) + return -1; break; /* sys_io_setup */ case 245: - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_long)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, tdep->size_long)) + return -1; break; /* sys_io_destroy */ @@ -1759,49 +2088,57 @@ record_linux_system_call (int num, struc /* sys_io_getevents */ case 247: - regcache_raw_read (regcache, tdep->arg4, (gdb_byte *) & tmpu32); - if (tmpu32) - { - int32_t nr; - regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & nr); - if (record_arch_list_add_mem (tmpu32, nr * tdep->size_io_event)) - return -1; - } + regcache_raw_read_unsigned (regcache, tdep->arg4, &tmpulongest); + if (tmpulongest) + { + ULONGEST nr; + regcache_raw_read_unsigned (regcache, tdep->arg3, &nr); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + nr * tdep->size_io_event)) + return -1; + } break; /* sys_io_submit */ case 248: - regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32); - if (tmpu32) - { - int32_t i, nr; - uint32_t *iocbp; - regcache_raw_read (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 = %s len = %u.\n", - paddress (gdbarch, tmpu32), - (int)(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; - } - } + regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest); + if (tmpulongest) + { + ULONGEST nr, i; + gdb_byte *iocbp; + + regcache_raw_read_unsigned (regcache, tdep->arg2, &nr); + iocbp = alloca (nr * tdep->size_pointer); + if (target_read_memory ((CORE_ADDR) tmpulongest, iocbp, + nr * tdep->size_pointer)) + { + if (record_debug) + fprintf_unfiltered (gdb_stdlog, + "Process record: error reading memory " + "at addr = 0x%s len = %u.\n", + OUTPUT_REG (tmpulongest, tdep->arg2), + (int) (nr * tdep->size_pointer)); + return -1; + } + for (i = 0; i < nr; i++) + { + if (record_arch_list_add_mem + ((CORE_ADDR) extract_unsigned_integer (iocbp, + tdep->size_pointer, + byte_order), + tdep->size_iocb)) + return -1; + iocbp += tdep->size_pointer; + } + } break; /* sys_io_cancel */ case 249: - regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_io_event)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_io_event)) + return -1; break; /* sys_fadvise64 */ @@ -1813,28 +2150,28 @@ record_linux_system_call (int num, struc /* 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; + 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 (regcache, tdep->arg2, (gdb_byte *) & tmpu32); - if (tmpu32) - { - uint32_t len; - regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & len); - if (record_arch_list_add_mem (tmpu32, len)) - return -1; - } + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (tmpulongest) + { + ULONGEST len; + regcache_raw_read_unsigned (regcache, tdep->arg3, &len); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, (int) len)) + return -1; + } break; /* sys_epoll_create */ @@ -1845,16 +2182,15 @@ record_linux_system_call (int num, struc /* sys_epoll_wait */ case 256: - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32); - if (tmpu32) - { - int32_t maxevents; - regcache_raw_read (regcache, tdep->arg3, - (gdb_byte *) & maxevents); - if (record_arch_list_add_mem - (tmpu32, maxevents * tdep->size_epoll_event)) - return -1; - } + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (tmpulongest) + { + ULONGEST maxevents; + regcache_raw_read_unsigned (regcache, tdep->arg3, &maxevents); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + maxevents * tdep->size_epoll_event)) + return -1; + } break; /* sys_remap_file_pages */ @@ -1865,23 +2201,25 @@ record_linux_system_call (int num, struc /* sys_timer_create */ case 259: - regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_int)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, tdep->size_int)) + return -1; break; /* sys_timer_settime */ case 260: - regcache_raw_read (regcache, tdep->arg4, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_itimerspec)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg4, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_itimerspec)) + return -1; break; /* sys_timer_gettime */ case 261: - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_itimerspec)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_itimerspec)) + return -1; break; /* sys_timer_getoverrun */ @@ -1894,32 +2232,36 @@ record_linux_system_call (int num, struc /* sys_clock_gettime */ case 265: - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_timespec)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_timespec)) + return -1; break; /* sys_clock_getres */ case 266: - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_timespec)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_timespec)) + return -1; break; /* sys_clock_nanosleep */ case 267: - regcache_raw_read (regcache, tdep->arg4, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_timespec)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg4, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_timespec)) + return -1; break; /* sys_statfs64 */ case 268: /* sys_fstatfs64 */ case 269: - regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_statfs64)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_statfs64)) + return -1; break; /* sys_tgkill */ @@ -1936,18 +2278,18 @@ record_linux_system_call (int num, struc /* sys_get_mempolicy */ case 275: - regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_int)) - return -1; - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32); - if (tmpu32) - { - uint32_t maxnode; - regcache_raw_read (regcache, tdep->arg3, - (gdb_byte *) & maxnode); - if (record_arch_list_add_mem (tmpu32, maxnode * tdep->size_long)) - return -1; - } + regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, tdep->size_int)) + return -1; + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (tmpulongest) + { + ULONGEST maxnode; + regcache_raw_read_unsigned (regcache, tdep->arg3, &maxnode); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + maxnode * tdep->size_long)) + return -1; + } break; /* sys_set_mempolicy */ @@ -1962,18 +2304,18 @@ record_linux_system_call (int num, struc /* sys_mq_timedreceive */ case 280: - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32); - if (tmpu32) - { - uint32_t msg_len; - regcache_raw_read (regcache, tdep->arg3, - (gdb_byte *) & msg_len); - if (record_arch_list_add_mem (tmpu32, msg_len)) - return -1; - } - regcache_raw_read (regcache, tdep->arg4, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_int)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (tmpulongest) + { + ULONGEST msg_len; + regcache_raw_read_unsigned (regcache, tdep->arg3, &msg_len); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + (int) msg_len)) + return -1; + } + regcache_raw_read_unsigned (regcache, tdep->arg4, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, tdep->size_int)) + return -1; break; /* sys_mq_notify */ @@ -1982,9 +2324,10 @@ record_linux_system_call (int num, struc /* sys_mq_getsetattr */ case 282: - regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_mq_attr)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_mq_attr)) + return -1; break; /* sys_kexec_load */ @@ -1993,12 +2336,14 @@ record_linux_system_call (int num, struc /* sys_waitid */ case 284: - regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_siginfo)) - return -1; - regcache_raw_read (regcache, tdep->arg5, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_rusage)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_siginfo)) + return -1; + regcache_raw_read_unsigned (regcache, tdep->arg5, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_rusage)) + return -1; break; /* sys_ni_syscall */ @@ -2011,20 +2356,20 @@ record_linux_system_call (int num, struc /* sys_keyctl */ case 288: - regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32); - if (tmpu32 == 6 || tmpu32 == 11) - { - regcache_raw_read (regcache, tdep->arg3, - (gdb_byte *) & tmpu32); - if (tmpu32) - { - uint32_t buflen; - regcache_raw_read (regcache, tdep->arg4, - (gdb_byte *) & buflen); - if (record_arch_list_add_mem (tmpu32, buflen)) - return -1; - } - } + regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest); + if (tmpulongest == 6 || tmpulongest == 11) + { + regcache_raw_read_unsigned (regcache, tdep->arg3, + &tmpulongest); + if (tmpulongest) + { + ULONGEST buflen; + regcache_raw_read_unsigned (regcache, tdep->arg4, &buflen); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + (int) buflen)) + return -1; + } + } break; /* sys_ioprio_set */ @@ -2053,9 +2398,10 @@ record_linux_system_call (int num, struc /* sys_fstatat64 */ case 300: - regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_stat64)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_stat64)) + return -1; break; /* sys_unlinkat */ @@ -2070,15 +2416,14 @@ record_linux_system_call (int num, struc /* sys_readlinkat */ case 305: - regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32); - if (tmpu32) - { - int32_t bufsiz; - regcache_raw_read (regcache, tdep->arg4, - (gdb_byte *) & bufsiz); - if (record_arch_list_add_mem (tmpu32, bufsiz)) - return -1; - } + regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest); + if (tmpulongest) + { + ULONGEST bufsiz; + regcache_raw_read_unsigned (regcache, tdep->arg4, &bufsiz); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, (int) bufsiz)) + return -1; + } break; /* sys_fchmodat */ @@ -2089,34 +2434,39 @@ record_linux_system_call (int num, struc /* sys_pselect6 */ case 308: - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_fd_set)) - return -1; - regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_fd_set)) - return -1; - regcache_raw_read (regcache, tdep->arg4, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_fd_set)) - return -1; - regcache_raw_read (regcache, tdep->arg5, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_timespec)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_fd_set)) + return -1; + regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_fd_set)) + return -1; + regcache_raw_read_unsigned (regcache, tdep->arg4, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_fd_set)) + return -1; + regcache_raw_read_unsigned (regcache, tdep->arg5, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_timespec)) + return -1; break; /* sys_ppoll */ case 309: - regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32); - if (tmpu32) - { - uint32_t nfds; - regcache_raw_read (regcache, tdep->arg2, - (gdb_byte *) & nfds); - if (record_arch_list_add_mem (tmpu32, tdep->size_pollfd * nfds)) - return -1; - } - regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_timespec)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest); + if (tmpulongest) + { + ULONGEST nfds; + regcache_raw_read_unsigned (regcache, tdep->arg2, &nfds); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_pollfd * nfds)) + return -1; + } + regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_timespec)) + return -1; break; /* sys_unshare */ @@ -2127,22 +2477,24 @@ record_linux_system_call (int num, struc /* sys_get_robust_list */ case 312: - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_int)) - return -1; - regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_int)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, tdep->size_int)) + return -1; + regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, tdep->size_int)) + return -1; break; /* sys_splice */ case 313: - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_loff_t)) - return -1; - regcache_raw_read (regcache, tdep->arg4, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_loff_t)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_loff_t)) + return -1; + regcache_raw_read_unsigned (regcache, tdep->arg4, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_loff_t)) + return -1; break; /* sys_sync_file_range */ @@ -2155,48 +2507,47 @@ record_linux_system_call (int num, struc /* sys_move_pages */ case 317: - regcache_raw_read (regcache, tdep->arg5, (gdb_byte *) & tmpu32); - if (tmpu32) - { - uint32_t nr_pages; - regcache_raw_read (regcache, tdep->arg2, - (gdb_byte *) & nr_pages); - if (record_arch_list_add_mem (tmpu32, nr_pages * tdep->size_int)) - return -1; - } + regcache_raw_read_unsigned (regcache, tdep->arg5, &tmpulongest); + if (tmpulongest) + { + ULONGEST nr_pages; + regcache_raw_read_unsigned (regcache, tdep->arg2, &nr_pages); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + nr_pages * tdep->size_int)) + return -1; + } break; /* sys_getcpu */ case 318: - regcache_raw_read (regcache, tdep->arg1, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_int)) - return -1; - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_int)) - return -1; - regcache_raw_read (regcache, tdep->arg3, (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem (tmpu32, tdep->size_ulong * 2)) - return -1; + regcache_raw_read_unsigned (regcache, tdep->arg1, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, tdep->size_int)) + return -1; + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, tdep->size_int)) + return -1; + regcache_raw_read_unsigned (regcache, tdep->arg3, &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + tdep->size_ulong * 2)) + return -1; break; /* sys_epoll_pwait */ case 319: - regcache_raw_read (regcache, tdep->arg2, (gdb_byte *) & tmpu32); - if (tmpu32) - { - int32_t maxevents; - regcache_raw_read (regcache, tdep->arg3, - (gdb_byte *) & maxevents); - if (record_arch_list_add_mem - (tmpu32, maxevents * tdep->size_epoll_event)) - return -1; - } + regcache_raw_read_unsigned (regcache, tdep->arg2, &tmpulongest); + if (tmpulongest) + { + ULONGEST maxevents; + regcache_raw_read_unsigned (regcache, tdep->arg3, &maxevents); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest, + (int) maxevents * tdep->size_epoll_event)) + return -1; + } break; default: printf_unfiltered (_("Process record and replay target doesn't " - "support syscall number %u\n"), - (int)tmpu32); + "support syscall number %u\n"), num); return -1; break; } --- a/linux-record.h +++ b/linux-record.h @@ -23,6 +23,7 @@ struct linux_record_tdep { /* The size of the type that will be used in a system call. */ + int size_pointer; int size__old_kernel_stat; int size_tms; int size_loff_t; @@ -81,7 +82,6 @@ struct linux_record_tdep int size_itimerspec; int size_mq_attr; int size_siginfo; - int size_termios; int size_termios2; int size_pid_t; @@ -89,6 +89,8 @@ struct linux_record_tdep int size_serial_struct; int size_serial_icounter_struct; int size_hayes_esp_config; + int size_size_t; + int size_iovec; /* The values of the second argument of system call "sys_ioctl". */ int ioctl_TCGETS; @@ -171,6 +173,7 @@ struct linux_record_tdep int arg3; int arg4; int arg5; + int arg6; }; extern int record_linux_system_call (int num, struct regcache *regcache,