ptrace.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /*
  3. * OpenRISC Linux
  4. *
  5. * Linux architectural port borrowing liberally from similar works of
  6. * others. All original copyrights apply as per the original source
  7. * declaration.
  8. *
  9. * OpenRISC implementation:
  10. * Copyright (C) 2003 Matjaz Breskvar <[email protected]>
  11. * Copyright (C) 2010-2011 Jonas Bonn <[email protected]>
  12. * et al.
  13. */
  14. #ifndef __ASM_OPENRISC_PTRACE_H
  15. #define __ASM_OPENRISC_PTRACE_H
  16. #include <asm/spr_defs.h>
  17. #include <uapi/asm/ptrace.h>
  18. /*
  19. * Make kernel PTrace/register structures opaque to userspace... userspace can
  20. * access thread state via the regset mechanism. This allows us a bit of
  21. * flexibility in how we order the registers on the stack, permitting some
  22. * optimizations like packing call-clobbered registers together so that
  23. * they share a cacheline (not done yet, though... future optimization).
  24. */
  25. #ifndef __ASSEMBLY__
  26. /*
  27. * This struct describes how the registers are laid out on the kernel stack
  28. * during a syscall or other kernel entry.
  29. *
  30. * This structure should always be cacheline aligned on the stack.
  31. * FIXME: I don't think that's the case right now. The alignment is
  32. * taken care of elsewhere... head.S, process.c, etc.
  33. */
  34. struct pt_regs {
  35. union {
  36. struct {
  37. /* Named registers */
  38. long sr; /* Stored in place of r0 */
  39. long sp; /* r1 */
  40. };
  41. struct {
  42. /* Old style */
  43. long offset[2];
  44. long gprs[30];
  45. };
  46. struct {
  47. /* New style */
  48. long gpr[32];
  49. };
  50. };
  51. long pc;
  52. /* For restarting system calls:
  53. * Set to syscall number for syscall exceptions,
  54. * -1 for all other exceptions.
  55. */
  56. long orig_gpr11; /* For restarting system calls */
  57. long dummy; /* Cheap alignment fix */
  58. long dummy2; /* Cheap alignment fix */
  59. };
  60. /* TODO: Rename this to REDZONE because that's what it is */
  61. #define STACK_FRAME_OVERHEAD 128 /* size of minimum stack frame */
  62. #define instruction_pointer(regs) ((regs)->pc)
  63. #define user_mode(regs) (((regs)->sr & SPR_SR_SM) == 0)
  64. #define user_stack_pointer(regs) ((unsigned long)(regs)->sp)
  65. #define profile_pc(regs) instruction_pointer(regs)
  66. static inline long regs_return_value(struct pt_regs *regs)
  67. {
  68. return regs->gpr[11];
  69. }
  70. #endif /* __ASSEMBLY__ */
  71. /*
  72. * Offsets used by 'ptrace' system call interface.
  73. */
  74. #define PT_SR 0
  75. #define PT_SP 4
  76. #define PT_GPR2 8
  77. #define PT_GPR3 12
  78. #define PT_GPR4 16
  79. #define PT_GPR5 20
  80. #define PT_GPR6 24
  81. #define PT_GPR7 28
  82. #define PT_GPR8 32
  83. #define PT_GPR9 36
  84. #define PT_GPR10 40
  85. #define PT_GPR11 44
  86. #define PT_GPR12 48
  87. #define PT_GPR13 52
  88. #define PT_GPR14 56
  89. #define PT_GPR15 60
  90. #define PT_GPR16 64
  91. #define PT_GPR17 68
  92. #define PT_GPR18 72
  93. #define PT_GPR19 76
  94. #define PT_GPR20 80
  95. #define PT_GPR21 84
  96. #define PT_GPR22 88
  97. #define PT_GPR23 92
  98. #define PT_GPR24 96
  99. #define PT_GPR25 100
  100. #define PT_GPR26 104
  101. #define PT_GPR27 108
  102. #define PT_GPR28 112
  103. #define PT_GPR29 116
  104. #define PT_GPR30 120
  105. #define PT_GPR31 124
  106. #define PT_PC 128
  107. #define PT_ORIG_GPR11 132
  108. #define PT_SYSCALLNO 136
  109. #endif /* __ASM_OPENRISC_PTRACE_H */