ptrace.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef __ASM_CSKY_PTRACE_H
  3. #define __ASM_CSKY_PTRACE_H
  4. #include <uapi/asm/ptrace.h>
  5. #include <asm/traps.h>
  6. #include <linux/types.h>
  7. #include <linux/compiler.h>
  8. #ifndef __ASSEMBLY__
  9. #define PS_S 0x80000000 /* Supervisor Mode */
  10. #define USR_BKPT 0x1464
  11. #define arch_has_single_step() (1)
  12. #define current_pt_regs() \
  13. ({ (struct pt_regs *)((char *)current_thread_info() + THREAD_SIZE) - 1; })
  14. #define user_stack_pointer(regs) ((regs)->usp)
  15. #define user_mode(regs) (!((regs)->sr & PS_S))
  16. #define instruction_pointer(regs) ((regs)->pc)
  17. #define profile_pc(regs) instruction_pointer(regs)
  18. #define trap_no(regs) ((regs->sr >> 16) & 0xff)
  19. static inline void instruction_pointer_set(struct pt_regs *regs,
  20. unsigned long val)
  21. {
  22. regs->pc = val;
  23. }
  24. #if defined(__CSKYABIV2__)
  25. #define MAX_REG_OFFSET offsetof(struct pt_regs, dcsr)
  26. #else
  27. #define MAX_REG_OFFSET offsetof(struct pt_regs, regs[9])
  28. #endif
  29. static inline bool in_syscall(struct pt_regs const *regs)
  30. {
  31. return ((regs->sr >> 16) & 0xff) == VEC_TRAP0;
  32. }
  33. static inline void forget_syscall(struct pt_regs *regs)
  34. {
  35. regs->sr &= ~(0xff << 16);
  36. }
  37. static inline unsigned long regs_return_value(struct pt_regs *regs)
  38. {
  39. return regs->a0;
  40. }
  41. static inline void regs_set_return_value(struct pt_regs *regs,
  42. unsigned long val)
  43. {
  44. regs->a0 = val;
  45. }
  46. /* Valid only for Kernel mode traps. */
  47. static inline unsigned long kernel_stack_pointer(struct pt_regs *regs)
  48. {
  49. return regs->usp;
  50. }
  51. static inline unsigned long frame_pointer(struct pt_regs *regs)
  52. {
  53. return regs->regs[4];
  54. }
  55. static inline void frame_pointer_set(struct pt_regs *regs,
  56. unsigned long val)
  57. {
  58. regs->regs[4] = val;
  59. }
  60. extern int regs_query_register_offset(const char *name);
  61. extern unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs,
  62. unsigned int n);
  63. /*
  64. * regs_get_register() - get register value from its offset
  65. * @regs: pt_regs from which register value is gotten
  66. * @offset: offset of the register.
  67. *
  68. * regs_get_register returns the value of a register whose offset from @regs.
  69. * The @offset is the offset of the register in struct pt_regs.
  70. * If @offset is bigger than MAX_REG_OFFSET, this returns 0.
  71. */
  72. static inline unsigned long regs_get_register(struct pt_regs *regs,
  73. unsigned int offset)
  74. {
  75. if (unlikely(offset > MAX_REG_OFFSET))
  76. return 0;
  77. return *(unsigned long *)((unsigned long)regs + offset);
  78. }
  79. #endif /* __ASSEMBLY__ */
  80. #endif /* __ASM_CSKY_PTRACE_H */