registers.c 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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 <sys/ptrace.h>
  8. #include <sys/user.h>
  9. #include "kern_constants.h"
  10. #include "longjmp.h"
  11. #include "user.h"
  12. #include "sysdep/ptrace_user.h"
  13. int save_fp_registers(int pid, unsigned long *fp_regs)
  14. {
  15. if (ptrace(PTRACE_GETFPREGS, pid, 0, fp_regs) < 0)
  16. return -errno;
  17. return 0;
  18. }
  19. int restore_fp_registers(int pid, unsigned long *fp_regs)
  20. {
  21. if (ptrace(PTRACE_SETFPREGS, pid, 0, fp_regs) < 0)
  22. return -errno;
  23. return 0;
  24. }
  25. int save_fpx_registers(int pid, unsigned long *fp_regs)
  26. {
  27. if (ptrace(PTRACE_GETFPXREGS, pid, 0, fp_regs) < 0)
  28. return -errno;
  29. return 0;
  30. }
  31. int restore_fpx_registers(int pid, unsigned long *fp_regs)
  32. {
  33. if (ptrace(PTRACE_SETFPXREGS, pid, 0, fp_regs) < 0)
  34. return -errno;
  35. return 0;
  36. }
  37. unsigned long get_thread_reg(int reg, jmp_buf *buf)
  38. {
  39. switch (reg) {
  40. case EIP:
  41. return buf[0]->__eip;
  42. case UESP:
  43. return buf[0]->__esp;
  44. case EBP:
  45. return buf[0]->__ebp;
  46. default:
  47. printk(UM_KERN_ERR "get_thread_regs - unknown register %d\n",
  48. reg);
  49. return 0;
  50. }
  51. }
  52. int have_fpx_regs = 1;
  53. int get_fp_registers(int pid, unsigned long *regs)
  54. {
  55. if (have_fpx_regs)
  56. return save_fpx_registers(pid, regs);
  57. else
  58. return save_fp_registers(pid, regs);
  59. }
  60. int put_fp_registers(int pid, unsigned long *regs)
  61. {
  62. if (have_fpx_regs)
  63. return restore_fpx_registers(pid, regs);
  64. else
  65. return restore_fp_registers(pid, regs);
  66. }
  67. void arch_init_registers(int pid)
  68. {
  69. struct user_fpxregs_struct fpx_regs;
  70. int err;
  71. err = ptrace(PTRACE_GETFPXREGS, pid, 0, &fpx_regs);
  72. if (!err)
  73. return;
  74. if (errno != EIO)
  75. panic("check_ptrace : PTRACE_GETFPXREGS failed, errno = %d",
  76. errno);
  77. have_fpx_regs = 0;
  78. }