registers.c 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  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. #include "user.h"
  11. /* This is set once at boot time and not changed thereafter */
  12. static unsigned long exec_regs[MAX_REG_NR];
  13. void init_thread_registers(struct uml_pt_regs *to)
  14. {
  15. memcpy(to->gp, exec_regs, sizeof(to->gp));
  16. }
  17. void save_registers(int pid, struct uml_pt_regs *regs)
  18. {
  19. int err;
  20. err = ptrace(PTRACE_GETREGS, pid, 0, regs->gp);
  21. if (err < 0)
  22. panic("save_registers - saving registers failed, errno = %d\n",
  23. errno);
  24. }
  25. void restore_registers(int pid, struct uml_pt_regs *regs)
  26. {
  27. int err;
  28. err = ptrace(PTRACE_SETREGS, pid, 0, regs->gp);
  29. if (err < 0)
  30. panic("restore_registers - saving registers failed, "
  31. "errno = %d\n", errno);
  32. }
  33. void init_registers(int pid)
  34. {
  35. int err;
  36. err = ptrace(PTRACE_GETREGS, pid, 0, exec_regs);
  37. if (err)
  38. panic("check_ptrace : PTRACE_GETREGS failed, errno = %d",
  39. errno);
  40. arch_init_registers(pid);
  41. }
  42. void get_safe_registers(unsigned long *regs)
  43. {
  44. memcpy(regs, exec_regs, sizeof(exec_regs));
  45. }