registers.c 927 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. /*
  2. * Copyright (C) 2004 PathScale, Inc
  3. * Copyright (C) 2004 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
  4. * Licensed under the GPL
  5. */
  6. #include <errno.h>
  7. #include <string.h>
  8. #include <sys/ptrace.h>
  9. #include "sysdep/ptrace.h"
  10. int save_registers(int pid, struct uml_pt_regs *regs)
  11. {
  12. int err;
  13. err = ptrace(PTRACE_GETREGS, pid, 0, regs->gp);
  14. if (err < 0)
  15. return -errno;
  16. return 0;
  17. }
  18. int restore_registers(int pid, struct uml_pt_regs *regs)
  19. {
  20. int err;
  21. err = ptrace(PTRACE_SETREGS, pid, 0, regs->gp);
  22. if (err < 0)
  23. return -errno;
  24. return 0;
  25. }
  26. /* This is set once at boot time and not changed thereafter */
  27. static unsigned long exec_regs[MAX_REG_NR];
  28. int init_registers(int pid)
  29. {
  30. int err;
  31. err = ptrace(PTRACE_GETREGS, pid, 0, exec_regs);
  32. if (err < 0)
  33. return -errno;
  34. arch_init_registers(pid);
  35. return 0;
  36. }
  37. void get_safe_registers(unsigned long *regs)
  38. {
  39. memcpy(regs, exec_regs, sizeof(exec_regs));
  40. }