int-handler.S
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:6k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* $Id: int-handler.S,v 1.14 1999/05/01 22:40:34 ralf Exp $
  2.  *
  3.  * This file is subject to the terms and conditions of the GNU General Public
  4.  * License.  See the file "COPYING" in the main directory of this archive
  5.  * for more details.
  6.  *
  7.  * Copyright (C) 1995, 1996, 1997, 1998 by Ralf Baechle and Andreas Busse
  8.  *
  9.  * Jazz family specific interrupt stuff
  10.  *
  11.  * To do: On Jazz machines we remap some non-ISA interrupts to ISA
  12.  *        interrupts.  These interrupts should use their own vectors.
  13.  *        Squeeze the last cycles out of the handlers.  Only a dead
  14.  *        cycle is a good cycle.
  15.  */
  16. #include <asm/asm.h>
  17. #include <asm/mipsregs.h>
  18. #include <asm/jazz.h>
  19. #include <asm/regdef.h>
  20. #include <asm/stackframe.h>
  21. /*
  22.  * jazz_handle_int: Interrupt handler for the ACER Pica-61 boards
  23.  */
  24. .set noreorder
  25. NESTED(jazz_handle_int, PT_SIZE, ra)
  26. .set noat
  27. SAVE_ALL
  28. CLI
  29. .set at
  30. /*
  31.  * Get pending interrupts
  32.  */
  33. mfc0 t0,CP0_CAUSE # get pending interrupts
  34. mfc0 t1,CP0_STATUS # get enabled interrupts
  35. and t0,t1 # isolate allowed ones
  36. andi t0,0xff00 # isolate pending bits
  37. beqz t0,3f
  38. sll t0,16 # delay slot
  39. /*
  40.  * Find irq with highest priority
  41.  * FIXME: This is slow - use binary search
  42.  */
  43. la t1,ll_vectors
  44. 1: bltz t0,2f # found pending irq
  45. sll t0,1
  46. b 1b
  47. subu t1,PTRSIZE # delay slot
  48. /*
  49.  * Do the low-level stuff
  50.  */
  51. 2: lw t0,(t1)
  52. jr t0
  53. nop # delay slot
  54. END(jazz_handle_int)
  55. ll_sw0: li s1,~IE_SW0
  56. mfc0 t0,CP0_CAUSE
  57. and t0,s1
  58. mtc0 t0,CP0_CAUSE
  59. PANIC("Unimplemented sw0 handler")
  60. ll_sw1: li s1,~IE_SW1
  61. mfc0 t0,CP0_CAUSE
  62. and t0,s1
  63. mtc0 t0,CP0_CAUSE
  64. PANIC("Unimplemented sw1 handler")
  65. ll_local_dma: li s1,~IE_IRQ0
  66. PANIC("Unimplemented local_dma handler")
  67. ll_local_dev: lbu t0,JAZZ_IO_IRQ_SOURCE
  68. #if PTRSIZE == 8 /* True 64 bit kernel */
  69. dsll t0,1
  70. #endif
  71. .set reorder
  72. LONG_L t0,local_vector(t0)
  73. jr t0
  74. .set noreorder
  75. /*
  76.  * The braindead PICA hardware gives us no way to distinguish if we really
  77.  * received interrupt 7 from the (E)ISA bus or if we just received an
  78.  * interrupt with no findable cause.  This sometimes happens with braindead
  79.  * cards.  Oh well - for all the Jazz boxes slots are more or less just
  80.  * whistles and bells and we're aware of the problem.
  81.  */
  82. ll_isa_irq: lw a0,JAZZ_EISA_IRQ_ACK
  83. jal i8259_do_irq
  84.  move a1,sp
  85. j ret_from_irq
  86. nop
  87. /*
  88.  * Hmm...  This is not just a plain PC clone so the question is
  89.  * which devices on Jazz machines can generate an (E)ISA NMI?
  90.  * (Writing to nonexistent memory?)
  91.  */
  92. ll_isa_nmi: li s1,~IE_IRQ3
  93. PANIC("Unimplemented isa_nmi handler")
  94. /*
  95.  * Timer IRQ - remapped to be more similar to an IBM compatible.
  96.  *
  97.  * The timer interrupt is handled specially to ensure that the jiffies
  98.  * variable is updated at all times.  Specifically, the timer interrupt is
  99.  * just like the complete handlers except that it is invoked with interrupts
  100.  * disabled and should never re-enable them.  If other interrupts were
  101.  * allowed to be processed while the timer interrupt is active, then the
  102.  * other interrupts would have to avoid using the jiffies variable for delay
  103.  * and interval timing operations to avoid hanging the system.
  104.  */
  105. ll_timer: lw zero,JAZZ_TIMER_REGISTER # timer irq cleared on read
  106. li s1,~IE_IRQ4
  107. li a0, JAZZ_TIMER_IRQ
  108. jal do_IRQ
  109.  move a1,sp
  110. mfc0 t0,CP0_STATUS # disable interrupts again
  111. ori t0,1
  112. xori t0,1
  113. mtc0 t0,CP0_STATUS
  114. j ret_from_irq
  115.  nop
  116. /*
  117.  * CPU count/compare IRQ (unused)
  118.  */
  119. ll_count: j return
  120.  mtc0 zero,CP0_COMPARE
  121. #if 0
  122. /*
  123.  * Call the handler for the interrupt
  124.  * (Currently unused)
  125.  */
  126. call_real: /*
  127.  * temporarily disable interrupt
  128.  */
  129. mfc0 t2,CP0_STATUS
  130. and t2,s1
  131. mtc0 t2,CP0_STATUS
  132. nor s1,zero,s1
  133. jal do_IRQ
  134. /*
  135.  * reenable interrupt
  136.  */
  137. mfc0 t2,CP0_STATUS
  138. or t2,s1
  139. mtc0 t2,CP0_STATUS
  140. j ret_from_irq
  141. #endif
  142. .data
  143. PTR ll_sw0 # SW0
  144. PTR ll_sw1 # SW1
  145. PTR ll_local_dma # Local DMA
  146. PTR ll_local_dev # Local devices
  147. PTR ll_isa_irq # ISA IRQ
  148. PTR ll_isa_nmi # ISA NMI
  149. PTR ll_timer # Timer
  150. ll_vectors: PTR ll_count # Count/Compare IRQ
  151. /*
  152.  * Interrupt handlers for local devices.
  153.  */
  154. .text
  155. .set reorder
  156. loc_no_irq: PANIC("Unimplemented loc_no_irq handler")
  157. /*
  158.  * Parallel port IRQ
  159.  */
  160. loc_parallel: li s1,~JAZZ_IE_PARALLEL
  161. li a0,JAZZ_PARALLEL_IRQ
  162. b loc_call
  163. /*
  164.  * Floppy IRQ
  165.  */
  166. loc_floppy: li s1,~JAZZ_IE_FLOPPY
  167. li a0,JAZZ_FLOPPY_IRQ
  168. b loc_call
  169. /*
  170.  * Sound IRQ
  171.  */
  172. loc_sound: PANIC("Unimplemented loc_sound handler")
  173. loc_video: PANIC("Unimplemented loc_video handler")
  174. /*
  175.  * Ethernet interrupt handler
  176.  */
  177. loc_ethernet:  li s1,~JAZZ_IE_ETHERNET
  178. li a0,JAZZ_ETHERNET_IRQ
  179. b loc_call
  180. /*
  181.  * SCSI interrupt handler
  182.  */
  183. loc_scsi: li s1,~JAZZ_IE_SCSI
  184. li a0,JAZZ_SCSI_IRQ
  185. b loc_call
  186. /*
  187.  * Keyboard interrupt handler
  188.  */
  189. loc_keyboard: li s1,~JAZZ_IE_KEYBOARD
  190. li a0,JAZZ_KEYBOARD_IRQ
  191. b loc_call
  192. /*
  193.  * Mouse interrupt handler
  194.  */
  195. loc_mouse: li s1,~JAZZ_IE_MOUSE
  196. li a0,JAZZ_MOUSE_IRQ
  197. b loc_call
  198. /*
  199.  * Serial port 1 IRQ
  200.  */
  201. loc_serial1: li s1,~JAZZ_IE_SERIAL1
  202. li a0,JAZZ_SERIAL1_IRQ
  203. b loc_call
  204. /*
  205.  * Serial port 2 IRQ
  206.  */
  207. loc_serial2: li s1,~JAZZ_IE_SERIAL2
  208. li a0,JAZZ_SERIAL2_IRQ
  209. b loc_call
  210. /*
  211.  * Call the interrupt handler for an interrupt generated by a
  212.  * local device.
  213.  */
  214. loc_call: /*
  215.  * Temporarily disable interrupt source
  216.  */
  217. lhu t2,JAZZ_IO_IRQ_ENABLE
  218. and t2,s1
  219. sh t2,JAZZ_IO_IRQ_ENABLE
  220.   nor s1,zero,s1
  221. jal do_IRQ
  222.  
  223.   /*
  224.    * Reenable interrupt
  225.    */
  226. lhu t2,JAZZ_IO_IRQ_ENABLE
  227.   or t2,s1
  228. sh t2,JAZZ_IO_IRQ_ENABLE
  229.  
  230.   j ret_from_irq
  231. /*
  232.  * "Jump extender" to reach spurious_interrupt
  233.  */
  234. 3: j spurious_interrupt
  235. /*
  236.  * Vectors for interrupts generated by local devices
  237.  */
  238. .data
  239. local_vector: PTR loc_no_irq
  240. PTR loc_parallel
  241. PTR loc_floppy
  242. PTR loc_sound
  243. PTR loc_video
  244. PTR loc_ethernet
  245. PTR loc_scsi
  246. PTR loc_keyboard
  247. PTR loc_mouse
  248. PTR loc_serial1
  249. PTR loc_serial2