registers.h 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. /* registers.h: register frame declarations
  2. *
  3. * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved.
  4. * Written by David Howells (dhowells@redhat.com)
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU General Public License
  8. * as published by the Free Software Foundation; either version
  9. * 2 of the License, or (at your option) any later version.
  10. */
  11. /*
  12. * notes:
  13. *
  14. * (1) that the members of all these structures are carefully aligned to permit
  15. * usage of STD/STDF instructions
  16. *
  17. * (2) if you change these structures, you must change the code in
  18. * arch/frvnommu/kernel/{break.S,entry.S,switch_to.S,gdb-stub.c}
  19. *
  20. *
  21. * the kernel stack space block looks like this:
  22. *
  23. * +0x2000 +----------------------
  24. * | union {
  25. * | struct user_context
  26. * | struct pt_regs [user exception]
  27. * | }
  28. * +---------------------- <-- __kernel_frame0_ptr (maybe GR28)
  29. * |
  30. * | kernel stack
  31. * |
  32. * |......................
  33. * | struct pt_regs [kernel exception]
  34. * |...................... <-- __kernel_frame0_ptr (maybe GR28)
  35. * |
  36. * | kernel stack
  37. * |
  38. * |...................... <-- stack pointer (GR1)
  39. * |
  40. * | unused stack space
  41. * |
  42. * +----------------------
  43. * | struct thread_info
  44. * +0x0000 +---------------------- <-- __current_thread_info (GR15);
  45. *
  46. * note that GR28 points to the current exception frame
  47. */
  48. #ifndef _ASM_REGISTERS_H
  49. #define _ASM_REGISTERS_H
  50. #ifndef __ASSEMBLY__
  51. #define __OFFSET(X) (X)
  52. #define __OFFSETC(X,N) xxxxxxxxxxxxxxxxxxxxxxxx
  53. #else
  54. #define __OFFSET(X) ((X)*4)
  55. #define __OFFSETC(X,N) ((X)*4+(N))
  56. #endif
  57. /*****************************************************************************/
  58. /*
  59. * Exception/Interrupt frame
  60. * - held on kernel stack
  61. * - 8-byte aligned on stack (old SP is saved in frame)
  62. * - GR0 is fixed 0, so we don't save it
  63. */
  64. #ifndef __ASSEMBLY__
  65. struct pt_regs {
  66. unsigned long psr; /* Processor Status Register */
  67. unsigned long isr; /* Integer Status Register */
  68. unsigned long ccr; /* Condition Code Register */
  69. unsigned long cccr; /* Condition Code for Conditional Insns Register */
  70. unsigned long lr; /* Link Register */
  71. unsigned long lcr; /* Loop Count Register */
  72. unsigned long pc; /* Program Counter Register */
  73. unsigned long __status; /* exception status */
  74. unsigned long syscallno; /* syscall number or -1 */
  75. unsigned long orig_gr8; /* original syscall arg #1 */
  76. unsigned long gner0;
  77. unsigned long gner1;
  78. unsigned long long iacc0;
  79. unsigned long tbr; /* GR0 is fixed zero, so we use this for TBR */
  80. unsigned long sp; /* GR1: USP/KSP */
  81. unsigned long fp; /* GR2: FP */
  82. unsigned long gr3;
  83. unsigned long gr4;
  84. unsigned long gr5;
  85. unsigned long gr6;
  86. unsigned long gr7; /* syscall number */
  87. unsigned long gr8; /* 1st syscall param; syscall return */
  88. unsigned long gr9; /* 2nd syscall param */
  89. unsigned long gr10; /* 3rd syscall param */
  90. unsigned long gr11; /* 4th syscall param */
  91. unsigned long gr12; /* 5th syscall param */
  92. unsigned long gr13; /* 6th syscall param */
  93. unsigned long gr14;
  94. unsigned long gr15;
  95. unsigned long gr16; /* GP pointer */
  96. unsigned long gr17; /* small data */
  97. unsigned long gr18; /* PIC/PID */
  98. unsigned long gr19;
  99. unsigned long gr20;
  100. unsigned long gr21;
  101. unsigned long gr22;
  102. unsigned long gr23;
  103. unsigned long gr24;
  104. unsigned long gr25;
  105. unsigned long gr26;
  106. unsigned long gr27;
  107. struct pt_regs *next_frame; /* GR28 - next exception frame */
  108. unsigned long gr29; /* GR29 - OS reserved */
  109. unsigned long gr30; /* GR30 - OS reserved */
  110. unsigned long gr31; /* GR31 - OS reserved */
  111. } __attribute__((aligned(8)));
  112. #endif
  113. #define REG_PSR __OFFSET( 0) /* Processor Status Register */
  114. #define REG_ISR __OFFSET( 1) /* Integer Status Register */
  115. #define REG_CCR __OFFSET( 2) /* Condition Code Register */
  116. #define REG_CCCR __OFFSET( 3) /* Condition Code for Conditional Insns Register */
  117. #define REG_LR __OFFSET( 4) /* Link Register */
  118. #define REG_LCR __OFFSET( 5) /* Loop Count Register */
  119. #define REG_PC __OFFSET( 6) /* Program Counter */
  120. #define REG__STATUS __OFFSET( 7) /* exception status */
  121. #define REG__STATUS_STEP 0x00000001 /* - reenable single stepping on return */
  122. #define REG__STATUS_STEPPED 0x00000002 /* - single step caused exception */
  123. #define REG__STATUS_BROKE 0x00000004 /* - BREAK insn caused exception */
  124. #define REG__STATUS_SYSC_ENTRY 0x40000000 /* - T on syscall entry (ptrace.c only) */
  125. #define REG__STATUS_SYSC_EXIT 0x80000000 /* - T on syscall exit (ptrace.c only) */
  126. #define REG_SYSCALLNO __OFFSET( 8) /* syscall number or -1 */
  127. #define REG_ORIG_GR8 __OFFSET( 9) /* saved GR8 for signal handling */
  128. #define REG_GNER0 __OFFSET(10)
  129. #define REG_GNER1 __OFFSET(11)
  130. #define REG_IACC0 __OFFSET(12)
  131. #define REG_TBR __OFFSET(14) /* Trap Vector Register */
  132. #define REG_GR(R) __OFFSET((14+(R)))
  133. #define REG__END REG_GR(32)
  134. #define REG_SP REG_GR(1)
  135. #define REG_FP REG_GR(2)
  136. #define REG_PREV_FRAME REG_GR(28) /* previous exception frame pointer (old gr28 value) */
  137. #define REG_CURR_TASK REG_GR(29) /* current task */
  138. /*****************************************************************************/
  139. /*
  140. * extension tacked in front of the exception frame in debug mode
  141. */
  142. #ifndef __ASSEMBLY__
  143. struct pt_debug_regs
  144. {
  145. unsigned long bpsr;
  146. unsigned long dcr;
  147. unsigned long brr;
  148. unsigned long nmar;
  149. struct pt_regs normal_regs;
  150. } __attribute__((aligned(8)));
  151. #endif
  152. #define REG_NMAR __OFFSET(-1)
  153. #define REG_BRR __OFFSET(-2)
  154. #define REG_DCR __OFFSET(-3)
  155. #define REG_BPSR __OFFSET(-4)
  156. #define REG__DEBUG_XTRA __OFFSET(4)
  157. /*****************************************************************************/
  158. /*
  159. * userspace registers
  160. */
  161. #ifndef __ASSEMBLY__
  162. struct user_int_regs
  163. {
  164. /* integer registers
  165. * - up to gr[31] mirror pt_regs
  166. * - total size must be multiple of 8 bytes
  167. */
  168. unsigned long psr; /* Processor Status Register */
  169. unsigned long isr; /* Integer Status Register */
  170. unsigned long ccr; /* Condition Code Register */
  171. unsigned long cccr; /* Condition Code for Conditional Insns Register */
  172. unsigned long lr; /* Link Register */
  173. unsigned long lcr; /* Loop Count Register */
  174. unsigned long pc; /* Program Counter Register */
  175. unsigned long __status; /* exception status */
  176. unsigned long syscallno; /* syscall number or -1 */
  177. unsigned long orig_gr8; /* original syscall arg #1 */
  178. unsigned long gner[2];
  179. unsigned long long iacc[1];
  180. union {
  181. unsigned long tbr;
  182. unsigned long gr[64];
  183. };
  184. };
  185. struct user_fpmedia_regs
  186. {
  187. /* FP/Media registers */
  188. unsigned long fr[64];
  189. unsigned long fner[2];
  190. unsigned long msr[2];
  191. unsigned long acc[8];
  192. unsigned char accg[8];
  193. unsigned long fsr[1];
  194. };
  195. struct user_context
  196. {
  197. struct user_int_regs i;
  198. struct user_fpmedia_regs f;
  199. /* we provide a context extension so that we can save the regs for CPUs that
  200. * implement many more of Fujitsu's lavish register spec
  201. */
  202. void *extension;
  203. } __attribute__((aligned(8)));
  204. #endif
  205. #define NR_USER_INT_REGS (14 + 64)
  206. #define NR_USER_FPMEDIA_REGS (64 + 2 + 2 + 8 + 8/4 + 1)
  207. #define NR_USER_CONTEXT (NR_USER_INT_REGS + NR_USER_FPMEDIA_REGS + 1)
  208. #define USER_CONTEXT_SIZE (((NR_USER_CONTEXT + 1) & ~1) * 4)
  209. #define __THREAD_FRAME __OFFSET(0)
  210. #define __THREAD_CURR __OFFSET(1)
  211. #define __THREAD_SP __OFFSET(2)
  212. #define __THREAD_FP __OFFSET(3)
  213. #define __THREAD_LR __OFFSET(4)
  214. #define __THREAD_PC __OFFSET(5)
  215. #define __THREAD_GR(R) __OFFSET(6 + (R) - 16)
  216. #define __THREAD_FRAME0 __OFFSET(19)
  217. #define __THREAD_USER __OFFSET(19)
  218. #define __USER_INT __OFFSET(0)
  219. #define __INT_GR(R) __OFFSET(14 + (R))
  220. #define __USER_FPMEDIA __OFFSET(NR_USER_INT_REGS)
  221. #define __FPMEDIA_FR(R) __OFFSET(NR_USER_INT_REGS + (R))
  222. #define __FPMEDIA_FNER(R) __OFFSET(NR_USER_INT_REGS + 64 + (R))
  223. #define __FPMEDIA_MSR(R) __OFFSET(NR_USER_INT_REGS + 66 + (R))
  224. #define __FPMEDIA_ACC(R) __OFFSET(NR_USER_INT_REGS + 68 + (R))
  225. #define __FPMEDIA_ACCG(R) __OFFSETC(NR_USER_INT_REGS + 76, (R))
  226. #define __FPMEDIA_FSR(R) __OFFSET(NR_USER_INT_REGS + 78 + (R))
  227. #endif /* _ASM_REGISTERS_H */