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