registers.c 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. /*
  2. * Copyright (C) 2004 PathScale, Inc
  3. * Licensed under the GPL
  4. */
  5. #include <errno.h>
  6. #include <string.h>
  7. #include "ptrace_user.h"
  8. #include "uml-config.h"
  9. #include "skas_ptregs.h"
  10. #include "registers.h"
  11. #include "user.h"
  12. /* These are set once at boot time and not changed thereafter */
  13. static unsigned long exec_regs[HOST_FRAME_SIZE];
  14. static unsigned long exec_fp_regs[HOST_FP_SIZE];
  15. void init_thread_registers(union uml_pt_regs *to)
  16. {
  17. memcpy(to->skas.regs, exec_regs, sizeof(to->skas.regs));
  18. memcpy(to->skas.fp, exec_fp_regs, sizeof(to->skas.fp));
  19. }
  20. static int move_registers(int pid, int int_op, int fp_op,
  21. union uml_pt_regs *regs)
  22. {
  23. if(ptrace(int_op, pid, 0, regs->skas.regs) < 0)
  24. return(-errno);
  25. if(ptrace(fp_op, pid, 0, regs->skas.fp) < 0)
  26. return(-errno);
  27. return(0);
  28. }
  29. void save_registers(int pid, union uml_pt_regs *regs)
  30. {
  31. int err;
  32. err = move_registers(pid, PTRACE_GETREGS, PTRACE_GETFPREGS, regs);
  33. if(err)
  34. panic("save_registers - saving registers failed, errno = %d\n",
  35. -err);
  36. }
  37. void restore_registers(int pid, union uml_pt_regs *regs)
  38. {
  39. int err;
  40. err = move_registers(pid, PTRACE_SETREGS, PTRACE_SETFPREGS, regs);
  41. if(err)
  42. panic("restore_registers - saving registers failed, "
  43. "errno = %d\n", -err);
  44. }
  45. void init_registers(int pid)
  46. {
  47. int err;
  48. err = ptrace(PTRACE_GETREGS, pid, 0, exec_regs);
  49. if(err)
  50. panic("check_ptrace : PTRACE_GETREGS failed, errno = %d",
  51. err);
  52. err = ptrace(PTRACE_GETFPREGS, pid, 0, exec_fp_regs);
  53. if(err)
  54. panic("check_ptrace : PTRACE_GETFPREGS failed, errno = %d",
  55. err);
  56. }
  57. void get_safe_registers(unsigned long *regs)
  58. {
  59. memcpy(regs, exec_regs, HOST_FRAME_SIZE * sizeof(unsigned long));
  60. }
  61. /*
  62. * Overrides for Emacs so that we follow Linus's tabbing style.
  63. * Emacs will notice this stuff at the end of the file and automatically
  64. * adjust the settings for this buffer only. This must remain at the end
  65. * of the file.
  66. * ---------------------------------------------------------------------------
  67. * Local variables:
  68. * c-file-style: "linux"
  69. * End:
  70. */