ptrace.h 4.5 KB

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