ptrace.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:8k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *  include/asm-s390/ptrace.h
  3.  *
  4.  *  S390 version
  5.  *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
  6.  *    Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
  7.  */
  8. #ifndef _S390_PTRACE_H
  9. #define _S390_PTRACE_H
  10. /*
  11.  * Offsets in the user_regs_struct. They are used for the ptrace
  12.  * system call and in entry.S
  13.  */
  14. #define PT_PSWMASK  0x00
  15. #define PT_PSWADDR  0x08
  16. #define PT_GPR0     0x10
  17. #define PT_GPR1     0x18
  18. #define PT_GPR2     0x20
  19. #define PT_GPR3     0x28
  20. #define PT_GPR4     0x30
  21. #define PT_GPR5     0x38
  22. #define PT_GPR6     0x40
  23. #define PT_GPR7     0x48
  24. #define PT_GPR8     0x50
  25. #define PT_GPR9     0x58
  26. #define PT_GPR10    0x60
  27. #define PT_GPR11    0x68
  28. #define PT_GPR12    0x70
  29. #define PT_GPR13    0x78
  30. #define PT_GPR14    0x80
  31. #define PT_GPR15    0x88
  32. #define PT_ACR0     0x90
  33. #define PT_ACR1     0x94
  34. #define PT_ACR2     0x98
  35. #define PT_ACR3     0x9C
  36. #define PT_ACR4     0xA0
  37. #define PT_ACR5     0xA4
  38. #define PT_ACR6     0xA8
  39. #define PT_ACR7     0xAC
  40. #define PT_ACR8     0xB0
  41. #define PT_ACR9     0xB4
  42. #define PT_ACR10    0xB8
  43. #define PT_ACR11    0xBC
  44. #define PT_ACR12    0xC0
  45. #define PT_ACR13    0xC4
  46. #define PT_ACR14    0xC8
  47. #define PT_ACR15    0xCC
  48. #define PT_ORIGGPR2 0xD0
  49. #define PT_FPC     0xD8
  50. #define PT_FPR0     0xE0
  51. #define PT_FPR1     0xE8
  52. #define PT_FPR2     0xF0
  53. #define PT_FPR3     0xF8
  54. #define PT_FPR4     0x100
  55. #define PT_FPR5     0x108
  56. #define PT_FPR6     0x110
  57. #define PT_FPR7     0x118
  58. #define PT_FPR8     0x120
  59. #define PT_FPR9     0x128
  60. #define PT_FPR10    0x130
  61. #define PT_FPR11    0x138
  62. #define PT_FPR12    0x140
  63. #define PT_FPR13    0x148
  64. #define PT_FPR14    0x150
  65. #define PT_FPR15    0x158
  66. #define PT_CR_9     0x160
  67. #define PT_CR_10    0x168
  68. #define PT_CR_11    0x170
  69. #define PT_IEEE_IP  0x1A8
  70. #define PT_LASTOFF  PT_IEEE_IP
  71. #define PT_ENDREGS  0x1B0-1
  72. #define NUM_GPRS      16
  73. #define NUM_FPRS      16
  74. #define NUM_CRS       16
  75. #define NUM_ACRS      16
  76. #define GPR_SIZE      8
  77. #define FPR_SIZE      8
  78. #define FPC_SIZE      4
  79. #define FPC_PAD_SIZE  4 /* gcc insists on aligning the fpregs */
  80. #define CR_SIZE       8
  81. #define ACR_SIZE      4
  82. #define STACK_FRAME_OVERHEAD    160      /* size of minimum stack frame */
  83. #ifndef __ASSEMBLY__
  84. #include <linux/config.h>
  85. #include <linux/stddef.h>
  86. #include <linux/types.h>
  87. #include <asm/current.h>
  88. #include <asm/setup.h>
  89. /* this typedef defines how a Program Status Word looks like */
  90. typedef struct 
  91. {
  92.         __u64   mask;
  93.         __u64   addr;
  94. } __attribute__ ((aligned(8))) psw_t;
  95. #ifdef __KERNEL__
  96. #define FIX_PSW(addr) ((unsigned long)(addr))
  97. #define ADDR_BITS_REMOVE(addr) ((addr))
  98. #endif
  99. typedef union
  100. {
  101. float   f;
  102. double  d;
  103. __u64   ui;
  104. struct
  105. {
  106. __u32 hi;
  107. __u32 lo;
  108. } fp;
  109. } freg_t;
  110. typedef struct
  111. {
  112. __u32   fpc;
  113. freg_t  fprs[NUM_FPRS];              
  114. } s390_fp_regs;
  115. #define FPC_EXCEPTION_MASK      0xF8000000
  116. #define FPC_FLAGS_MASK          0x00F80000
  117. #define FPC_DXC_MASK            0x0000FF00
  118. #define FPC_RM_MASK             0x00000003
  119. #define FPC_VALID_MASK          0xF8F8FF03
  120. /*
  121.  * The first entries in pt_regs and user_regs_struct
  122.  * are common for the two structures. The s390_regs structure
  123.  * covers the common parts. It simplifies copying the common part
  124.  * between the three structures.
  125.  */
  126. typedef struct
  127. {
  128. psw_t psw;
  129. __u64 gprs[NUM_GPRS];
  130. __u32 acrs[NUM_ACRS];
  131. __u64 orig_gpr2;
  132. } s390_regs;
  133. /*
  134.  * The pt_regs struct defines the way the registers are stored on
  135.  * the stack during a system call.
  136.  */
  137. struct pt_regs 
  138. {
  139. psw_t psw;
  140. __u64 gprs[NUM_GPRS];
  141. __u32 acrs[NUM_ACRS];
  142. __u64 orig_gpr2;
  143. __u32 trap;
  144. } __attribute__ ((packed));
  145. /*
  146.  * Now for the program event recording (trace) definitions.
  147.  */
  148. typedef struct
  149. {
  150. __u64 cr[3];
  151. } per_cr_words;
  152. #define PER_EM_MASK 0x00000000E8000000UL
  153. typedef struct
  154. {
  155. unsigned                       : 32;
  156. unsigned em_branching          : 1;
  157. unsigned em_instruction_fetch  : 1;
  158. /*
  159.  * Switching on storage alteration automatically fixes
  160.  * the storage alteration event bit in the users std.
  161.  */
  162. unsigned em_storage_alteration : 1;
  163. unsigned em_gpr_alt_unused     : 1;
  164. unsigned em_store_real_address : 1;
  165. unsigned                       : 3;
  166. unsigned branch_addr_ctl       : 1;
  167. unsigned                       : 1;
  168. unsigned storage_alt_space_ctl : 1;
  169. unsigned                       : 21;
  170. addr_t   starting_addr;
  171. addr_t   ending_addr;
  172. } per_cr_bits;
  173. typedef struct
  174. {
  175. __u16          perc_atmid;
  176. addr_t         address;
  177. __u8           access_id;
  178. } per_lowcore_words;
  179. typedef struct
  180. {
  181. unsigned perc_branching          : 1; /* 0x096 */
  182. unsigned perc_instruction_fetch  : 1;
  183. unsigned perc_storage_alteration : 1;
  184. unsigned perc_gpr_alt_unused     : 1;
  185. unsigned perc_store_real_address : 1;
  186. unsigned                         : 3;
  187. unsigned atmid_psw_bit_31        : 1;
  188. unsigned atmid_validity_bit      : 1;
  189. unsigned atmid_psw_bit_32        : 1;
  190. unsigned atmid_psw_bit_5         : 1;
  191. unsigned atmid_psw_bit_16        : 1;
  192. unsigned atmid_psw_bit_17        : 1;
  193. unsigned si                      : 2;
  194. addr_t   address;                     /* 0x098 */
  195. unsigned                         : 4; /* 0x0a1 */
  196. unsigned access_id               : 4;
  197. } per_lowcore_bits;
  198. typedef struct
  199. {
  200. union {
  201. per_cr_words   words;
  202. per_cr_bits    bits;
  203. } control_regs;
  204. /*
  205.  * Use these flags instead of setting em_instruction_fetch
  206.  * directly they are used so that single stepping can be
  207.  * switched on & off while not affecting other tracing
  208.  */
  209. unsigned  single_step       : 1;
  210. unsigned  instruction_fetch : 1;
  211. unsigned                    : 30;
  212. /*
  213.  * These addresses are copied into cr10 & cr11 if single
  214.  * stepping is switched off
  215.  */
  216. addr_t    starting_addr;
  217. addr_t    ending_addr;
  218. union {
  219. per_lowcore_words words;
  220. per_lowcore_bits  bits;
  221. } lowcore; 
  222. } per_struct;
  223. typedef struct
  224. {
  225. __u32  len;
  226. addr_t kernel_addr;
  227. addr_t process_addr;
  228. } ptrace_area;
  229. /*
  230.  * S/390 specific non posix ptrace requests. I chose unusual values so
  231.  * they are unlikely to clash with future ptrace definitions.
  232.  */
  233. #define PTRACE_PEEKUSR_AREA           0x5000
  234. #define PTRACE_POKEUSR_AREA           0x5001
  235. #define PTRACE_PEEKTEXT_AREA       0x5002
  236. #define PTRACE_PEEKDATA_AREA       0x5003
  237. #define PTRACE_POKETEXT_AREA       0x5004
  238. #define PTRACE_POKEDATA_AREA        0x5005
  239. /*
  240.  * PT_PROT definition is loosely based on hppa bsd definition in
  241.  * gdb/hppab-nat.c
  242.  */
  243. #define PTRACE_PROT                       21
  244. typedef enum
  245. {
  246. ptprot_set_access_watchpoint,
  247. ptprot_set_write_watchpoint,
  248. ptprot_disable_watchpoint
  249. } ptprot_flags;
  250. typedef struct
  251. {
  252. addr_t           lowaddr;
  253. addr_t           hiaddr;
  254. ptprot_flags     prot;
  255. } ptprot_area;                     
  256. /* Sequence of bytes for breakpoint illegal instruction.  */
  257. #define S390_BREAKPOINT     {0x0,0x1}
  258. #define S390_BREAKPOINT_U16 ((__u16)0x0001)
  259. #define S390_SYSCALL_OPCODE ((__u16)0x0a00)
  260. #define S390_SYSCALL_SIZE   2
  261. /*
  262.  * The user_regs_struct defines the way the user registers are
  263.  * store on the stack for signal handling.
  264.  */
  265. struct user_regs_struct
  266. {
  267. psw_t psw;
  268. __u64 gprs[NUM_GPRS];
  269. __u32 acrs[NUM_ACRS];
  270. __u64 orig_gpr2;
  271. s390_fp_regs fp_regs;
  272. /*
  273.  * These per registers are in here so that gdb can modify them
  274.  * itself as there is no "official" ptrace interface for hardware
  275.  * watchpoints. This is the way intel does it.
  276.  */
  277. per_struct per_info;
  278. addr_t  ieee_instruction_pointer; 
  279. /* Used to give failing instruction back to user for ieee exceptions */
  280. };
  281. #ifdef __KERNEL__
  282. #define user_mode(regs) (((regs)->psw.mask & PSW_PROBLEM_STATE) != 0)
  283. #define instruction_pointer(regs) ((regs)->psw.addr)
  284. extern void show_regs(struct pt_regs * regs);
  285. extern char *task_show_regs(struct task_struct *task, char *buffer);
  286. #endif
  287. #endif /* __ASSEMBLY__ */
  288. #endif /* _S390X_PTRACE_H */