static int aarch64_all_but_pc_registers_record (struct regcache *regcache) { int i; for (i = AARCH64_X0_REGNUM; i < AARCH64_PC_REGNUM; i++) if (record_full_arch_list_add_reg (regcache, i)) return -1; if (record_full_arch_list_add_reg (regcache, AARCH64_CPSR_REGNUM)) return -1; return 0; }
static int i386_linux_record_signal (struct gdbarch *gdbarch, struct regcache *regcache, enum gdb_signal signal) { ULONGEST esp; if (i386_all_but_ip_registers_record (regcache)) return -1; if (record_full_arch_list_add_reg (regcache, I386_EIP_REGNUM)) return -1; /* Record the change in the stack. */ regcache_raw_read_unsigned (regcache, I386_ESP_REGNUM, &esp); /* This is for xstate. sp -= sizeof (struct _fpstate); */ esp -= I386_LINUX_xstate; /* This is for frame_size. sp -= sizeof (struct rt_sigframe); */ esp -= I386_LINUX_frame_size; if (record_full_arch_list_add_mem (esp, I386_LINUX_xstate + I386_LINUX_frame_size)) return -1; if (record_full_arch_list_add_end ()) return -1; return 0; }
static int aarch64_linux_syscall_record (struct regcache *regcache, unsigned long svc_number) { int ret = 0; enum gdb_syscall syscall_gdb; syscall_gdb = aarch64_canonicalize_syscall ((enum aarch64_syscall) svc_number); if (syscall_gdb < 0) { printf_unfiltered (_("Process record and replay target doesn't " "support syscall number %s\n"), plongest (svc_number)); return -1; } if (syscall_gdb == gdb_sys_sigreturn || syscall_gdb == gdb_sys_rt_sigreturn) { if (aarch64_all_but_pc_registers_record (regcache)) return -1; return 0; } ret = record_linux_system_call (syscall_gdb, regcache, &aarch64_linux_record_tdep); if (ret != 0) return ret; /* Record the return value of the system call. */ if (record_full_arch_list_add_reg (regcache, AARCH64_X0_REGNUM)) return -1; /* Record LR. */ if (record_full_arch_list_add_reg (regcache, AARCH64_LR_REGNUM)) return -1; /* Record CPSR. */ if (record_full_arch_list_add_reg (regcache, AARCH64_CPSR_REGNUM)) return -1; return 0; }
static int i386_all_but_ip_registers_record (struct regcache *regcache) { if (record_full_arch_list_add_reg (regcache, I386_EAX_REGNUM)) return -1; if (record_full_arch_list_add_reg (regcache, I386_ECX_REGNUM)) return -1; if (record_full_arch_list_add_reg (regcache, I386_EDX_REGNUM)) return -1; if (record_full_arch_list_add_reg (regcache, I386_EBX_REGNUM)) return -1; if (record_full_arch_list_add_reg (regcache, I386_ESP_REGNUM)) return -1; if (record_full_arch_list_add_reg (regcache, I386_EBP_REGNUM)) return -1; if (record_full_arch_list_add_reg (regcache, I386_ESI_REGNUM)) return -1; if (record_full_arch_list_add_reg (regcache, I386_EDI_REGNUM)) return -1; if (record_full_arch_list_add_reg (regcache, I386_EFLAGS_REGNUM)) return -1; return 0; }
static int i386_linux_intx80_sysenter_syscall_record (struct regcache *regcache) { int ret; LONGEST syscall_native; enum gdb_syscall syscall_gdb; regcache_raw_read_signed (regcache, I386_EAX_REGNUM, &syscall_native); syscall_gdb = i386_canonicalize_syscall (syscall_native); if (syscall_gdb < 0) { printf_unfiltered (_("Process record and replay target doesn't " "support syscall number %s\n"), plongest (syscall_native)); return -1; } if (syscall_gdb == gdb_sys_sigreturn || syscall_gdb == gdb_sys_rt_sigreturn) { if (i386_all_but_ip_registers_record (regcache)) return -1; return 0; } ret = record_linux_system_call (syscall_gdb, regcache, &i386_linux_record_tdep); if (ret) return ret; /* Record the return value of the system call. */ if (record_full_arch_list_add_reg (regcache, I386_EAX_REGNUM)) return -1; return 0; }