ptrace.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
  4. *
  5. * Amit Bhor, Sameer Dhavale: Codito Technologies 2004
  6. */
  7. #ifndef __ASM_ARC_PTRACE_H
  8. #define __ASM_ARC_PTRACE_H
  9. #include <uapi/asm/ptrace.h>
  10. #include <linux/compiler.h>
  11. #ifndef __ASSEMBLY__
  12. typedef union {
  13. struct {
  14. #ifdef CONFIG_CPU_BIG_ENDIAN
  15. unsigned long state:8, vec:8, cause:8, param:8;
  16. #else
  17. unsigned long param:8, cause:8, vec:8, state:8;
  18. #endif
  19. };
  20. unsigned long full;
  21. } ecr_reg;
  22. /* THE pt_regs: Defines how regs are saved during entry into kernel */
  23. #ifdef CONFIG_ISA_ARCOMPACT
  24. struct pt_regs {
  25. /* Real registers */
  26. unsigned long bta; /* bta_l1, bta_l2, erbta */
  27. unsigned long lp_start, lp_end, lp_count;
  28. unsigned long status32; /* status32_l1, status32_l2, erstatus */
  29. unsigned long ret; /* ilink1, ilink2 or eret */
  30. unsigned long blink;
  31. unsigned long fp;
  32. unsigned long r26; /* gp */
  33. unsigned long r12, r11, r10, r9, r8, r7, r6, r5, r4, r3, r2, r1, r0;
  34. unsigned long sp; /* User/Kernel depending on where we came from */
  35. unsigned long orig_r0;
  36. /*
  37. * To distinguish bet excp, syscall, irq
  38. * For traps and exceptions, Exception Cause Register.
  39. * ECR: <00> <VV> <CC> <PP>
  40. * Last word used by Linux for extra state mgmt (syscall-restart)
  41. * For interrupts, use artificial ECR values to note current prio-level
  42. */
  43. ecr_reg ecr;
  44. };
  45. struct callee_regs {
  46. unsigned long r25, r24, r23, r22, r21, r20, r19, r18, r17, r16, r15, r14, r13;
  47. };
  48. #define MAX_REG_OFFSET offsetof(struct pt_regs, ecr)
  49. #else
  50. struct pt_regs {
  51. unsigned long orig_r0;
  52. ecr_reg ecr; /* Exception Cause Reg */
  53. unsigned long bta; /* erbta */
  54. unsigned long fp;
  55. unsigned long r30;
  56. unsigned long r12;
  57. unsigned long r26; /* gp */
  58. #ifdef CONFIG_ARC_HAS_ACCL_REGS
  59. unsigned long r58, r59; /* ACCL/ACCH used by FPU / DSP MPY */
  60. #endif
  61. #ifdef CONFIG_ARC_DSP_SAVE_RESTORE_REGS
  62. unsigned long DSP_CTRL;
  63. #endif
  64. unsigned long sp; /* user/kernel sp depending on entry */
  65. /*------- Below list auto saved by h/w -----------*/
  66. unsigned long r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11;
  67. unsigned long blink;
  68. unsigned long lp_end, lp_start, lp_count;
  69. unsigned long ei, ldi, jli;
  70. unsigned long ret;
  71. unsigned long status32;
  72. };
  73. struct callee_regs {
  74. unsigned long r25, r24, r23, r22, r21, r20, r19, r18, r17, r16, r15, r14, r13;
  75. };
  76. #define MAX_REG_OFFSET offsetof(struct pt_regs, status32)
  77. #endif
  78. #define instruction_pointer(regs) ((regs)->ret)
  79. #define profile_pc(regs) instruction_pointer(regs)
  80. /* return 1 if user mode or 0 if kernel mode */
  81. #define user_mode(regs) (regs->status32 & STATUS_U_MASK)
  82. #define user_stack_pointer(regs)\
  83. ({ unsigned int sp; \
  84. if (user_mode(regs)) \
  85. sp = (regs)->sp;\
  86. else \
  87. sp = -1; \
  88. sp; \
  89. })
  90. /* return 1 if PC in delay slot */
  91. #define delay_mode(regs) ((regs->status32 & STATUS_DE_MASK) == STATUS_DE_MASK)
  92. #define in_syscall(regs) ((regs->ecr.vec == ECR_V_TRAP) && !regs->ecr.param)
  93. #define in_brkpt_trap(regs) ((regs->ecr.vec == ECR_V_TRAP) && regs->ecr.param)
  94. #define STATE_SCALL_RESTARTED 0x01
  95. #define syscall_wont_restart(regs) (regs->ecr.state |= STATE_SCALL_RESTARTED)
  96. #define syscall_restartable(regs) !(regs->ecr.state & STATE_SCALL_RESTARTED)
  97. #define current_pt_regs() \
  98. ({ \
  99. /* open-coded current_thread_info() */ \
  100. register unsigned long sp asm ("sp"); \
  101. unsigned long pg_start = (sp & ~(THREAD_SIZE - 1)); \
  102. (struct pt_regs *)(pg_start + THREAD_SIZE) - 1; \
  103. })
  104. static inline long regs_return_value(struct pt_regs *regs)
  105. {
  106. return (long)regs->r0;
  107. }
  108. static inline void instruction_pointer_set(struct pt_regs *regs,
  109. unsigned long val)
  110. {
  111. instruction_pointer(regs) = val;
  112. }
  113. static inline unsigned long kernel_stack_pointer(struct pt_regs *regs)
  114. {
  115. return regs->sp;
  116. }
  117. extern int regs_query_register_offset(const char *name);
  118. extern const char *regs_query_register_name(unsigned int offset);
  119. extern bool regs_within_kernel_stack(struct pt_regs *regs, unsigned long addr);
  120. extern unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs,
  121. unsigned int n);
  122. static inline unsigned long regs_get_register(struct pt_regs *regs,
  123. unsigned int offset)
  124. {
  125. if (unlikely(offset > MAX_REG_OFFSET))
  126. return 0;
  127. return *(unsigned long *)((unsigned long)regs + offset);
  128. }
  129. extern int syscall_trace_enter(struct pt_regs *);
  130. extern void syscall_trace_exit(struct pt_regs *);
  131. #endif /* !__ASSEMBLY__ */
  132. #endif /* __ASM_PTRACE_H */