irq.h 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. /****************************************************************************
  2. * arch/misoc/include/lm32/irq.h
  3. *
  4. * Copyright (C) 2016 Gregory Nutt. All rights reserved.
  5. * Author: Gregory Nutt <gnutt@nuttx.org>
  6. * Ramtin Amin <keytwo@gmail.com>
  7. *
  8. * Redistribution and use in source and binary forms, with or without
  9. * modification, are permitted provided that the following conditions
  10. * are met:
  11. *
  12. * 1. Redistributions of source code must retain the above copyright
  13. * notice, this list of conditions and the following disclaimer.
  14. * 2. Redistributions in binary form must reproduce the above copyright
  15. * notice, this list of conditions and the following disclaimer in
  16. * the documentation and/or other materials provided with the
  17. * distribution.
  18. * 3. Neither the name NuttX nor the names of its contributors may be
  19. * used to endorse or promote products derived from this software
  20. * without specific prior written permission.
  21. *
  22. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  23. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  24. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  25. * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
  26. * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  27. * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
  28. * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
  29. * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
  30. * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  31. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
  32. * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  33. * POSSIBILITY OF SUCH DAMAGE.
  34. *
  35. ****************************************************************************/
  36. #ifndef __ARCH_MISOC_INCLUDE_LM32_IRQ_H
  37. #define __ARCH_MISOC_INCLUDE_LM32_IRQ_H
  38. /****************************************************************************
  39. * Included Files
  40. ****************************************************************************/
  41. #include <nuttx/config.h>
  42. #include <arch/types.h>
  43. /****************************************************************************
  44. * Pre-processor Definitions
  45. ****************************************************************************/
  46. /* 32 True interrupts plus the sofware interrupt */
  47. #define LM32_NINTERRUPTS 32
  48. #define LM32_IRQ_SWINT 32
  49. #define NR_IRQS 33
  50. /* Registers */
  51. #define REG_X0_NDX 0 /* Holds the value zero */
  52. #define REG_X1_NDX 1 /* General-purpose/argument 0/return value 0 */
  53. #define REG_X2_NDX 2 /* General-purpose/argument 1/return value 1 */
  54. #define REG_X3_NDX 3 /* General-purpose/argument 2 */
  55. #define REG_X4_NDX 4 /* General-purpose/argument 3 */
  56. #define REG_X5_NDX 5 /* General-purpose/argument 4 */
  57. #define REG_X6_NDX 6 /* General-purpose/argument 5 */
  58. #define REG_X7_NDX 7 /* General-purpose/argument 6 */
  59. #define REG_X8_NDX 8 /* General-purpose/argument 7 */
  60. #define REG_X9_NDX 9 /* General-purpose */
  61. #define REG_X10_NDX 10 /* General-purpose */
  62. #define REG_X11_NDX 11 /* General-purpose */
  63. #define REG_X12_NDX 12 /* General-purpose */
  64. #define REG_X13_NDX 13 /* General-purpose */
  65. #define REG_X14_NDX 14 /* General-purpose */
  66. #define REG_X15_NDX 15 /* General-purpose */
  67. #define REG_X16_NDX 16 /* General-purpose */
  68. #define REG_X17_NDX 17 /* General-purpose */
  69. #define REG_X18_NDX 18 /* General-purpose */
  70. #define REG_X19_NDX 19 /* General-purpose */
  71. #define REG_X20_NDX 20 /* General-purpose */
  72. #define REG_X21_NDX 21 /* General-purpose */
  73. #define REG_X22_NDX 22 /* General-purpose */
  74. #define REG_X23_NDX 23 /* General-purpose */
  75. #define REG_X24_NDX 24 /* General-purpose */
  76. #define REG_X25_NDX 25 /* General-purpose */
  77. #define REG_X26_NDX 26 /* General-purpose/global pointer */
  78. #define REG_X27_NDX 27 /* General-purpose/frame pointer */
  79. #define REG_X28_NDX 28 /* Stack pointer */
  80. #define REG_X29_NDX 29 /* General-purpose/return address */
  81. #define REG_X30_NDX 30 /* Exception address */
  82. #define REG_X31_NDX 31 /* Breakpoint address */
  83. #define REG_X32_NDX 32 /* Reg IE */
  84. /* Interrupt Context register */
  85. #define XCPTCONTEXT_REGS 33
  86. #define XCPTCONTEXT_SIZE (4 * XCPTCONTEXT_REGS)
  87. #ifdef __ASSEMBLY__
  88. # define REG_X0 (4*REG_X0_NDX)
  89. # define REG_X1 (4*REG_X1_NDX)
  90. # define REG_X2 (4*REG_X2_NDX)
  91. # define REG_X3 (4*REG_X3_NDX)
  92. # define REG_X4 (4*REG_X4_NDX)
  93. # define REG_X5 (4*REG_X5_NDX)
  94. # define REG_X6 (4*REG_X6_NDX)
  95. # define REG_X7 (4*REG_X7_NDX)
  96. # define REG_X8 (4*REG_X8_NDX)
  97. # define REG_X9 (4*REG_X9_NDX)
  98. # define REG_X10 (4*REG_X10_NDX)
  99. # define REG_X11 (4*REG_X11_NDX)
  100. # define REG_X12 (4*REG_X12_NDX)
  101. # define REG_X13 (4*REG_X13_NDX)
  102. # define REG_X14 (4*REG_X14_NDX)
  103. # define REG_X15 (4*REG_X15_NDX)
  104. # define REG_X16 (4*REG_X16_NDX)
  105. # define REG_X17 (4*REG_X17_NDX)
  106. # define REG_X18 (4*REG_X18_NDX)
  107. # define REG_X19 (4*REG_X19_NDX)
  108. # define REG_X20 (4*REG_X20_NDX)
  109. # define REG_X21 (4*REG_X21_NDX)
  110. # define REG_X22 (4*REG_X22_NDX)
  111. # define REG_X23 (4*REG_X23_NDX)
  112. # define REG_X24 (4*REG_X24_NDX)
  113. # define REG_X25 (4*REG_X25_NDX)
  114. # define REG_X26 (4*REG_X26_NDX)
  115. # define REG_X27 (4*REG_X27_NDX)
  116. # define REG_X28 (4*REG_X28_NDX)
  117. # define REG_X29 (4*REG_X29_NDX)
  118. # define REG_X30 (4*REG_X30_NDX)
  119. # define REG_X31 (4*REG_X31_NDX)
  120. # define REG_INT_CTX (4*REG_X32_NDX)
  121. #else
  122. # define REG_X0 REG_X0_NDX
  123. # define REG_X1 REG_X1_NDX
  124. # define REG_X2 REG_X2_NDX
  125. # define REG_X3 REG_X3_NDX
  126. # define REG_X4 REG_X4_NDX
  127. # define REG_X5 REG_X5_NDX
  128. # define REG_X6 REG_X6_NDX
  129. # define REG_X7 REG_X7_NDX
  130. # define REG_X8 REG_X8_NDX
  131. # define REG_X9 REG_X9_NDX
  132. # define REG_X10 REG_X10_NDX
  133. # define REG_X11 REG_X11_NDX
  134. # define REG_X12 REG_X12_NDX
  135. # define REG_X13 REG_X13_NDX
  136. # define REG_X14 REG_X14_NDX
  137. # define REG_X15 REG_X15_NDX
  138. # define REG_X16 REG_X16_NDX
  139. # define REG_X17 REG_X17_NDX
  140. # define REG_X18 REG_X18_NDX
  141. # define REG_X19 REG_X19_NDX
  142. # define REG_X20 REG_X20_NDX
  143. # define REG_X21 REG_X21_NDX
  144. # define REG_X22 REG_X22_NDX
  145. # define REG_X23 REG_X23_NDX
  146. # define REG_X24 REG_X24_NDX
  147. # define REG_X25 REG_X25_NDX
  148. # define REG_X26 REG_X26_NDX
  149. # define REG_X27 REG_X27_NDX
  150. # define REG_X28 REG_X28_NDX
  151. # define REG_X29 REG_X29_NDX
  152. # define REG_X30 REG_X30_NDX
  153. # define REG_X31 REG_X31_NDX
  154. # define REG_INT_CTX REG_X32_NDX
  155. #endif
  156. /* Register aliases */
  157. #define REG_GP REG_X26
  158. #define REG_FP REG_X27
  159. #define REG_SP REG_X28
  160. #define REG_RA REG_X29
  161. #define REG_EA REG_X30
  162. #define REG_BA REG_X31
  163. #define REG_EPC REG_X30
  164. #define REG_A0 REG_X1
  165. #define REG_A1 REG_X2
  166. #define REG_A2 REG_X3
  167. #define REG_A3 REG_X4
  168. #define REG_A4 REG_X5
  169. #define REG_A5 REG_X6
  170. #define REG_A6 REG_X7
  171. #define REG_A7 REG_X8
  172. #define REG_IE REG_INT_CTX
  173. /****************************************************************************
  174. * Public Types
  175. ****************************************************************************/
  176. #ifndef __ASSEMBLY__
  177. struct xcptcontext
  178. {
  179. #ifndef CONFIG_DISABLE_SIGNALS
  180. /* The following function pointer is non-NULL if there are pending signals
  181. * to be processed.
  182. */
  183. void *sigdeliver; /* Actual type is sig_deliver_t */
  184. /* These additional register save locations are used to implement the
  185. * signal delivery trampoline.
  186. */
  187. uint32_t saved_epc; /* Trampoline PC */
  188. uint32_t saved_int_ctx; /* Interrupt context with interrupts disabled. */
  189. # ifdef CONFIG_BUILD_KERNEL
  190. /* This is the saved address to use when returning from a user-space
  191. * signal handler.
  192. */
  193. uint32_t sigreturn;
  194. # endif
  195. #endif
  196. #ifdef CONFIG_BUILD_KERNEL
  197. /* The following array holds information needed to return from each nested
  198. * system call.
  199. */
  200. uint8_t nsyscalls;
  201. struct xcpt_syscall_s syscall[CONFIG_SYS_NNEST];
  202. #endif
  203. /* Register save area */
  204. uint32_t regs[XCPTCONTEXT_REGS];
  205. };
  206. #endif /* __ASSEMBLY__ */
  207. #endif /* __ARCH_MISOC_INCLUDE_LM32_IRQ_H */