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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * This file is subject to the terms and conditions of the GNU General Public
  3.  * License.  See the file "COPYING" in the main directory of this archive
  4.  * for more details.
  5.  *
  6.  * Low level exception handling
  7.  *
  8.  * Copyright (C) 1994 - 2000, 2001 Ralf Baechle
  9.  * Copyright (C) 1999, 2000 Silicon Graphics
  10.  * Copyright (C) 2001 MIPS Technologies, Inc.
  11.  */
  12. #include <asm/asm.h>
  13. #include <asm/regdef.h>
  14. #include <asm/mipsregs.h>
  15. #include <asm/offset.h>
  16. #include <asm/stackframe.h>
  17. #define KU_USER 0x10
  18. .text
  19. .align 4
  20. FEXPORT(ret_from_fork)
  21. move a0, v0 # prev
  22. jal schedule_tail
  23. ld t0, TASK_PTRACE($28) # syscall tracing enabled?
  24. andi t0, _PT_TRACESYS
  25. bnez t0, tracesys_exit
  26. j ret_from_sys_call
  27. tracesys_exit:
  28. jal syscall_trace
  29. b ret_from_sys_call
  30. EXPORT(ret_from_irq)
  31. EXPORT(ret_from_exception)
  32. ld t0, PT_STATUS(sp) # returning to kernel mode?
  33. andi t0, t0, KU_USER
  34. bnez t0, ret_from_sys_call
  35. j restore_all
  36. reschedule: jal schedule
  37. FEXPORT(ret_from_sys_call)
  38. mfc0 t0, CP0_STATUS # need_resched and signals atomic test
  39. ori t0, t0, 1
  40. xori t0, t0, 1
  41. mtc0 t0, CP0_STATUS
  42. SSNOP; SSNOP; SSNOP
  43. ld v0, TASK_NEED_RESCHED($28)
  44. lw v1, TASK_SIGPENDING($28)
  45. bnez v0, reschedule
  46. bnez v1, signal_return
  47. restore_all: .set noat
  48. RESTORE_ALL
  49. eret
  50. .set at
  51. signal_return: .type signal_return, @function
  52. mfc0 t0, CP0_STATUS
  53. ori t0, t0, 1
  54. mtc0 t0, CP0_STATUS
  55. move a0, zero
  56. move a1, sp
  57. jal do_signal
  58. b restore_all
  59. /*
  60.  * Common spurious interrupt handler.
  61.  */
  62. .text
  63. .align  5
  64. LEAF(spurious_interrupt)
  65. /*
  66.  * Someone tried to fool us by sending an interrupt but we
  67.  * couldn't find a cause for it.
  68.  */
  69. lui     t1, %hi(irq_err_count)
  70. 1: ll      t0, %lo(irq_err_count)(t1)
  71. addiu   t0, 1
  72. sc      t0, %lo(irq_err_count)(t1)
  73. beqz t0, 1b
  74. j ret_from_irq
  75. END(spurious_interrupt)