ptrace.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:9k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. #ifndef _ASM_IA64_PTRACE_H
  2. #define _ASM_IA64_PTRACE_H
  3. /*
  4.  * Copyright (C) 1998-2001 Hewlett-Packard Co
  5.  * Copyright (C) 1998-2001 David Mosberger-Tang <davidm@hpl.hp.com>
  6.  * Copyright (C) 1998, 1999 Stephane Eranian <eranian@hpl.hp.com>
  7.  *
  8.  * 12/07/98 S. Eranian added pt_regs & switch_stack
  9.  * 12/21/98 D. Mosberger updated to match latest code
  10.  *  6/17/99 D. Mosberger added second unat member to "struct switch_stack"
  11.  *
  12.  */
  13. /*
  14.  * When a user process is blocked, its state looks as follows:
  15.  *
  16.  *            +----------------------+ ------- IA64_STK_OFFSET
  17.  *            |      |  ^
  18.  *            | struct pt_regs       |  |
  19.  *       |      |  |
  20.  *            +----------------------+  |
  21.  *       |      |  |
  22.  *            |    memory stack      |  |
  23.  *       | (growing downwards)  |  |
  24.  *       //.....................//  |
  25.  *  |
  26.  *       //.....................//  |
  27.  *       |      |  |
  28.  *            +----------------------+  |
  29.  *            | struct switch_stack  |  |
  30.  *       |      |  |
  31.  *       +----------------------+  |
  32.  *       |      |  |
  33.  *       //.....................//  |
  34.  *  |
  35.  *       //.....................//  |
  36.  *       |      |  |
  37.  *       |  register stack      |  |
  38.  *       | (growing upwards)    |  |
  39.  *            |      |  |
  40.  *       +----------------------+  |  --- IA64_RBS_OFFSET
  41.  *       |      |  |  ^
  42.  *            |  struct task_struct  |  |  |
  43.  * current -> |      |   |  |
  44.  *       +----------------------+ -------
  45.  *
  46.  * Note that ar.ec is not saved explicitly in pt_reg or switch_stack.
  47.  * This is because ar.ec is saved as part of ar.pfs.
  48.  */
  49. #include <linux/config.h>
  50. #include <asm/fpu.h>
  51. #include <asm/offsets.h>
  52. /*
  53.  * Base-2 logarithm of number of pages to allocate per task structure
  54.  * (including register backing store and memory stack):
  55.  */
  56. #if defined(CONFIG_IA64_PAGE_SIZE_4KB)
  57. # define IA64_TASK_STRUCT_LOG_NUM_PAGES 3
  58. #elif defined(CONFIG_IA64_PAGE_SIZE_8KB)
  59. # define IA64_TASK_STRUCT_LOG_NUM_PAGES 2
  60. #elif defined(CONFIG_IA64_PAGE_SIZE_16KB)
  61. # define IA64_TASK_STRUCT_LOG_NUM_PAGES 1
  62. #else
  63. # define IA64_TASK_STRUCT_LOG_NUM_PAGES 0
  64. #endif
  65. #define IA64_RBS_OFFSET ((IA64_TASK_SIZE + 15) & ~15)
  66. #define IA64_STK_OFFSET ((1 << IA64_TASK_STRUCT_LOG_NUM_PAGES)*PAGE_SIZE)
  67. #define INIT_TASK_SIZE IA64_STK_OFFSET
  68. #ifndef __ASSEMBLY__
  69. #include <asm/current.h>
  70. #include <asm/page.h>
  71. /*
  72.  * This struct defines the way the registers are saved on system
  73.  * calls.
  74.  *
  75.  * We don't save all floating point register because the kernel
  76.  * is compiled to use only a very small subset, so the other are
  77.  * untouched.
  78.  *
  79.  * THIS STRUCTURE MUST BE A MULTIPLE 16-BYTE IN SIZE
  80.  * (because the memory stack pointer MUST ALWAYS be aligned this way)
  81.  *
  82.  */
  83. struct pt_regs {
  84. /* The following registers are saved by SAVE_MIN: */
  85. unsigned long cr_ipsr; /* interrupted task's psr */
  86. unsigned long cr_iip; /* interrupted task's instruction pointer */
  87. unsigned long cr_ifs; /* interrupted task's function state */
  88. unsigned long ar_unat; /* interrupted task's NaT register (preserved) */
  89. unsigned long ar_pfs; /* prev function state  */
  90. unsigned long ar_rsc; /* RSE configuration */
  91. /* The following two are valid only if cr_ipsr.cpl > 0: */
  92. unsigned long ar_rnat; /* RSE NaT */
  93. unsigned long ar_bspstore; /* RSE bspstore */
  94. unsigned long pr; /* 64 predicate registers (1 bit each) */
  95. unsigned long b6; /* scratch */
  96. unsigned long loadrs; /* size of dirty partition << 16 */
  97. unsigned long r1; /* the gp pointer */
  98. unsigned long r2; /* scratch */
  99. unsigned long r3; /* scratch */
  100. unsigned long r12; /* interrupted task's memory stack pointer */
  101. unsigned long r13; /* thread pointer */
  102. unsigned long r14; /* scratch */
  103. unsigned long r15; /* scratch */
  104. unsigned long r8; /* scratch (return value register 0) */
  105. unsigned long r9; /* scratch (return value register 1) */
  106. unsigned long r10; /* scratch (return value register 2) */
  107. unsigned long r11; /* scratch (return value register 3) */
  108. /* The following registers are saved by SAVE_REST: */
  109. unsigned long r16; /* scratch */
  110. unsigned long r17; /* scratch */
  111. unsigned long r18; /* scratch */
  112. unsigned long r19; /* scratch */
  113. unsigned long r20; /* scratch */
  114. unsigned long r21; /* scratch */
  115. unsigned long r22; /* scratch */
  116. unsigned long r23; /* scratch */
  117. unsigned long r24; /* scratch */
  118. unsigned long r25; /* scratch */
  119. unsigned long r26; /* scratch */
  120. unsigned long r27; /* scratch */
  121. unsigned long r28; /* scratch */
  122. unsigned long r29; /* scratch */
  123. unsigned long r30; /* scratch */
  124. unsigned long r31; /* scratch */
  125. unsigned long ar_ccv; /* compare/exchange value (scratch) */
  126. unsigned long ar_fpsr; /* floating point status (preserved) */
  127. unsigned long b0; /* return pointer (bp) */
  128. unsigned long b7; /* scratch */
  129. /*
  130.  * Floating point registers that the kernel considers
  131.  * scratch:
  132.  */
  133. struct ia64_fpreg f6; /* scratch */
  134. struct ia64_fpreg f7; /* scratch */
  135. struct ia64_fpreg f8; /* scratch */
  136. struct ia64_fpreg f9; /* scratch */
  137. };
  138. /*
  139.  * This structure contains the addition registers that need to
  140.  * preserved across a context switch.  This generally consists of
  141.  * "preserved" registers.
  142.  */
  143. struct switch_stack {
  144. unsigned long caller_unat; /* user NaT collection register (preserved) */
  145. unsigned long ar_fpsr; /* floating-point status register */
  146. struct ia64_fpreg f2; /* preserved */
  147. struct ia64_fpreg f3; /* preserved */
  148. struct ia64_fpreg f4; /* preserved */
  149. struct ia64_fpreg f5; /* preserved */
  150. struct ia64_fpreg f10; /* scratch, but untouched by kernel */
  151. struct ia64_fpreg f11; /* scratch, but untouched by kernel */
  152. struct ia64_fpreg f12; /* scratch, but untouched by kernel */
  153. struct ia64_fpreg f13; /* scratch, but untouched by kernel */
  154. struct ia64_fpreg f14; /* scratch, but untouched by kernel */
  155. struct ia64_fpreg f15; /* scratch, but untouched by kernel */
  156. struct ia64_fpreg f16; /* preserved */
  157. struct ia64_fpreg f17; /* preserved */
  158. struct ia64_fpreg f18; /* preserved */
  159. struct ia64_fpreg f19; /* preserved */
  160. struct ia64_fpreg f20; /* preserved */
  161. struct ia64_fpreg f21; /* preserved */
  162. struct ia64_fpreg f22; /* preserved */
  163. struct ia64_fpreg f23; /* preserved */
  164. struct ia64_fpreg f24; /* preserved */
  165. struct ia64_fpreg f25; /* preserved */
  166. struct ia64_fpreg f26; /* preserved */
  167. struct ia64_fpreg f27; /* preserved */
  168. struct ia64_fpreg f28; /* preserved */
  169. struct ia64_fpreg f29; /* preserved */
  170. struct ia64_fpreg f30; /* preserved */
  171. struct ia64_fpreg f31; /* preserved */
  172. unsigned long r4; /* preserved */
  173. unsigned long r5; /* preserved */
  174. unsigned long r6; /* preserved */
  175. unsigned long r7; /* preserved */
  176. unsigned long b0; /* so we can force a direct return in copy_thread */
  177. unsigned long b1;
  178. unsigned long b2;
  179. unsigned long b3;
  180. unsigned long b4;
  181. unsigned long b5;
  182. unsigned long ar_pfs; /* previous function state */
  183. unsigned long ar_lc; /* loop counter (preserved) */
  184. unsigned long ar_unat; /* NaT bits for r4-r7 */
  185. unsigned long ar_rnat; /* RSE NaT collection register */
  186. unsigned long ar_bspstore; /* RSE dirty base (preserved) */
  187. unsigned long pr; /* 64 predicate registers (1 bit each) */
  188. };
  189. #ifdef __KERNEL__
  190.   /* given a pointer to a task_struct, return the user's pt_regs */
  191. # define ia64_task_regs(t) (((struct pt_regs *) ((char *) (t) + IA64_STK_OFFSET)) - 1)
  192. # define ia64_psr(regs) ((struct ia64_psr *) &(regs)->cr_ipsr)
  193. # define user_mode(regs) (((struct ia64_psr *) &(regs)->cr_ipsr)->cpl != 0)
  194.   struct task_struct; /* forward decl */
  195.   extern void show_regs (struct pt_regs *);
  196.   extern unsigned long ia64_get_user_rbs_end (struct task_struct *, struct pt_regs *,
  197.       unsigned long *);
  198.   extern long ia64_peek (struct task_struct *, struct switch_stack *, unsigned long,
  199.  unsigned long, long *);
  200.   extern long ia64_poke (struct task_struct *, struct switch_stack *, unsigned long,
  201.  unsigned long, long);
  202.   extern void ia64_flush_fph (struct task_struct *);
  203.   extern void ia64_sync_fph (struct task_struct *);
  204.   extern long ia64_sync_user_rbs (struct task_struct *, struct switch_stack *,
  205.   unsigned long, unsigned long);
  206.   /* get nat bits for scratch registers such that bit N==1 iff scratch register rN is a NaT */
  207.   extern unsigned long ia64_get_scratch_nat_bits (struct pt_regs *pt, unsigned long scratch_unat);
  208.   /* put nat bits for scratch registers such that scratch register rN is a NaT iff bit N==1 */
  209.   extern unsigned long ia64_put_scratch_nat_bits (struct pt_regs *pt, unsigned long nat);
  210.   extern void ia64_increment_ip (struct pt_regs *pt);
  211.   extern void ia64_decrement_ip (struct pt_regs *pt);
  212. static inline void
  213. force_successful_syscall_return (void)
  214. {
  215. ia64_task_regs(current)->r8 = 0;
  216. }
  217. #endif /* !__KERNEL__ */
  218. #endif /* !__ASSEMBLY__ */
  219. /*
  220.  * The numbers chosen here are somewhat arbitrary but absolutely MUST
  221.  * not overlap with any of the number assigned in <linux/ptrace.h>.
  222.  */
  223. #define PTRACE_SINGLEBLOCK 12 /* resume execution until next branch */
  224. #define PTRACE_GETSIGINFO 13 /* get child's siginfo structure */
  225. #define PTRACE_SETSIGINFO 14 /* set child's siginfo structure */
  226. #endif /* _ASM_IA64_PTRACE_H */