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

嵌入式Linux

开发平台:

Unix_Linux

  1. /* $Id: bagetIRQ.S,v 1.1 1999/01/17 03:49:37 ralf Exp $
  2.  * bagetIRQ.S: Interrupt exception dispatch code for Baget/MIPS
  3.  *
  4.  * Copyright (C) 1998 Gleb Raiko & Vladimir Roganov
  5.  */
  6. #include <asm/asm.h>
  7. #include <asm/mipsregs.h>
  8. #include <asm/regdef.h>
  9. #include <asm/stackframe.h>
  10. #include <asm/addrspace.h>
  11. .text
  12. .set    mips1
  13. .set    reorder
  14. .set    macro
  15. .set    noat
  16. .align 5
  17. NESTED(bagetIRQ, PT_SIZE, sp)
  18. SAVE_ALL
  19. CLI # Important: mark KERNEL mode !
  20. la      a1, baget_interrupt
  21. .set push
  22. .set    noreorder
  23. jal a1
  24. .set    pop 
  25. move a0, sp                                          
  26. la      a1, ret_from_irq
  27. jr a1
  28. END(bagetIRQ)
  29. #define DBE_HANDLER       0x1C
  30. NESTED(try_read, PT_SIZE, sp)
  31. mfc0 t3, CP0_STATUS # save flags and
  32. CLI #  disable interrupts
  33. li t0, KSEG2
  34. sltu    t1, t0, a0              # Is it KSEG2 address ?               
  35. beqz t1, mapped              # No - already mapped !    
  36.  
  37. move    t0, a0         
  38. ori t0, 0xfff
  39. xori    t0, 0xfff               # round address to page
  40. ori     t1, t0, 0xf00           # prepare EntryLo (N,V,D,G) 
  41. mfc0    t2,   CP0_ENTRYHI       # save ASID value
  42. mtc0 zero, CP0_INDEX
  43. mtc0 t0,   CP0_ENTRYHI       # Load MMU values ...
  44. mtc0    t1,   CP0_ENTRYLO0
  45. nop                             # let it understand
  46. nop
  47. tlbwi # ... and write ones
  48. nop
  49. nop
  50. mtc0    t2,  CP0_ENTRYHI           
  51. mapped:
  52. la t0, exception_handlers
  53. lw t1, DBE_HANDLER(t0) # save real handler
  54. la t2, dbe_handler
  55. sw t2, DBE_HANDLER(t0) # set temporary local handler
  56. li v0, -1 # default (failure) value
  57. li t2, 1
  58. beq t2, a1, 1f
  59. li t2, 2
  60. beq t2, a1, 2f
  61. li t2, 4
  62. beq t2, a1, 4f
  63. b out
  64. 1: lbu v0, (a0) # byte
  65. b out
  66. 2: lhu v0, (a0) # short
  67. b out
  68. 4: lw v0, (a0) # word
  69. out:
  70. sw t1, DBE_HANDLER(t0) # restore real handler
  71. mtc0 t3, CP0_STATUS # restore CPU flags
  72. jr ra
  73. dbe_handler:
  74. li v0, -1 # mark our failure
  75. .set push
  76. .set noreorder
  77. b out # "no problems !"
  78. rfe #   return from trap
  79. .set pop
  80. END(try_read)