registers.c 1.1 KB

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