registers.c 1.7 KB

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