0001
0002
0003
0004
0005
0006
0007 #include <errno.h>
0008 #include <string.h>
0009 #include <sys/ptrace.h>
0010 #include <sysdep/ptrace.h>
0011 #include <sysdep/ptrace_user.h>
0012 #include <registers.h>
0013
0014 int save_registers(int pid, struct uml_pt_regs *regs)
0015 {
0016 int err;
0017
0018 err = ptrace(PTRACE_GETREGS, pid, 0, regs->gp);
0019 if (err < 0)
0020 return -errno;
0021 return 0;
0022 }
0023
0024 int restore_pid_registers(int pid, struct uml_pt_regs *regs)
0025 {
0026 int err;
0027
0028 err = ptrace(PTRACE_SETREGS, pid, 0, regs->gp);
0029 if (err < 0)
0030 return -errno;
0031 return 0;
0032 }
0033
0034
0035
0036 static unsigned long exec_regs[MAX_REG_NR];
0037 static unsigned long exec_fp_regs[FP_SIZE];
0038
0039 int init_pid_registers(int pid)
0040 {
0041 int err;
0042
0043 err = ptrace(PTRACE_GETREGS, pid, 0, exec_regs);
0044 if (err < 0)
0045 return -errno;
0046
0047 arch_init_registers(pid);
0048 get_fp_registers(pid, exec_fp_regs);
0049 return 0;
0050 }
0051
0052 void get_safe_registers(unsigned long *regs, unsigned long *fp_regs)
0053 {
0054 memcpy(regs, exec_regs, sizeof(exec_regs));
0055
0056 if (fp_regs)
0057 memcpy(fp_regs, exec_fp_regs, sizeof(exec_fp_regs));
0058 }