ptrace.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. /*
  2. * S390 version
  3. * Copyright IBM Corp. 1999, 2000
  4. * Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
  5. */
  6. #ifndef _S390_PTRACE_H
  7. #define _S390_PTRACE_H
  8. #include <uapi/asm/ptrace.h>
  9. #ifndef __ASSEMBLY__
  10. extern long psw_kernel_bits;
  11. extern long psw_user_bits;
  12. /*
  13. * The pt_regs struct defines the way the registers are stored on
  14. * the stack during a system call.
  15. */
  16. struct pt_regs
  17. {
  18. unsigned long args[1];
  19. psw_t psw;
  20. unsigned long gprs[NUM_GPRS];
  21. unsigned long orig_gpr2;
  22. unsigned int int_code;
  23. unsigned long int_parm_long;
  24. };
  25. /*
  26. * Program event recording (PER) register set.
  27. */
  28. struct per_regs {
  29. unsigned long control; /* PER control bits */
  30. unsigned long start; /* PER starting address */
  31. unsigned long end; /* PER ending address */
  32. };
  33. /*
  34. * PER event contains information about the cause of the last PER exception.
  35. */
  36. struct per_event {
  37. unsigned short cause; /* PER code, ATMID and AI */
  38. unsigned long address; /* PER address */
  39. unsigned char paid; /* PER access identification */
  40. };
  41. /*
  42. * Simplified per_info structure used to decode the ptrace user space ABI.
  43. */
  44. struct per_struct_kernel {
  45. unsigned long cr9; /* PER control bits */
  46. unsigned long cr10; /* PER starting address */
  47. unsigned long cr11; /* PER ending address */
  48. unsigned long bits; /* Obsolete software bits */
  49. unsigned long starting_addr; /* User specified start address */
  50. unsigned long ending_addr; /* User specified end address */
  51. unsigned short perc_atmid; /* PER trap ATMID */
  52. unsigned long address; /* PER trap instruction address */
  53. unsigned char access_id; /* PER trap access identification */
  54. };
  55. #define PER_EVENT_MASK 0xEB000000UL
  56. #define PER_EVENT_BRANCH 0x80000000UL
  57. #define PER_EVENT_IFETCH 0x40000000UL
  58. #define PER_EVENT_STORE 0x20000000UL
  59. #define PER_EVENT_STORE_REAL 0x08000000UL
  60. #define PER_EVENT_TRANSACTION_END 0x02000000UL
  61. #define PER_EVENT_NULLIFICATION 0x01000000UL
  62. #define PER_CONTROL_MASK 0x00e00000UL
  63. #define PER_CONTROL_BRANCH_ADDRESS 0x00800000UL
  64. #define PER_CONTROL_SUSPENSION 0x00400000UL
  65. #define PER_CONTROL_ALTERATION 0x00200000UL
  66. /*
  67. * These are defined as per linux/ptrace.h, which see.
  68. */
  69. #define arch_has_single_step() (1)
  70. #define user_mode(regs) (((regs)->psw.mask & PSW_MASK_PSTATE) != 0)
  71. #define instruction_pointer(regs) ((regs)->psw.addr & PSW_ADDR_INSN)
  72. #define user_stack_pointer(regs)((regs)->gprs[15])
  73. #define profile_pc(regs) instruction_pointer(regs)
  74. static inline long regs_return_value(struct pt_regs *regs)
  75. {
  76. return regs->gprs[2];
  77. }
  78. int regs_query_register_offset(const char *name);
  79. const char *regs_query_register_name(unsigned int offset);
  80. unsigned long regs_get_register(struct pt_regs *regs, unsigned int offset);
  81. unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs, unsigned int n);
  82. static inline unsigned long kernel_stack_pointer(struct pt_regs *regs)
  83. {
  84. return regs->gprs[15] & PSW_ADDR_INSN;
  85. }
  86. #endif /* __ASSEMBLY__ */
  87. #endif /* _S390_PTRACE_H */