ints_low.S 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. /* SPDX-License-Identifier: GPL-2.0+ */
  2. /*
  3. * Copyright (C) 2013-2015 Synopsys, Inc. All rights reserved.
  4. */
  5. #include <linux/linkage.h>
  6. /*
  7. * Note on the LD/ST addressing modes with address register write-back
  8. *
  9. * LD.a same as LD.aw
  10. *
  11. * LD.a reg1, [reg2, x] => Pre Incr
  12. * Eff Addr for load = [reg2 + x]
  13. *
  14. * LD.ab reg1, [reg2, x] => Post Incr
  15. * Eff Addr for load = [reg2]
  16. */
  17. .macro PUSH reg
  18. st.a \reg, [%sp, -4]
  19. .endm
  20. .macro PUSHAX aux
  21. lr %r9, [\aux]
  22. PUSH %r9
  23. .endm
  24. .macro SAVE_R1_TO_R24
  25. PUSH %r1
  26. PUSH %r2
  27. PUSH %r3
  28. PUSH %r4
  29. PUSH %r5
  30. PUSH %r6
  31. PUSH %r7
  32. PUSH %r8
  33. PUSH %r9
  34. PUSH %r10
  35. PUSH %r11
  36. PUSH %r12
  37. PUSH %r13
  38. PUSH %r14
  39. PUSH %r15
  40. PUSH %r16
  41. PUSH %r17
  42. PUSH %r18
  43. PUSH %r19
  44. PUSH %r20
  45. PUSH %r21
  46. PUSH %r22
  47. PUSH %r23
  48. PUSH %r24
  49. .endm
  50. .macro SAVE_ALL_SYS
  51. /* saving %r0 to reg->r0 in advance since we read %ecr into it */
  52. st %r0, [%sp, -8]
  53. lr %r0, [%ecr] /* all stack addressing is manual so far */
  54. st %r0, [%sp]
  55. st %sp, [%sp, -4]
  56. /* now move %sp to reg->r0 position so we can do "push" automatically */
  57. sub %sp, %sp, 8
  58. SAVE_R1_TO_R24
  59. PUSH %r25
  60. PUSH %gp
  61. PUSH %fp
  62. PUSH %blink
  63. PUSHAX %eret
  64. PUSHAX %erstatus
  65. PUSH %lp_count
  66. PUSHAX %lp_end
  67. PUSHAX %lp_start
  68. PUSHAX %erbta
  69. .endm
  70. .macro SAVE_EXCEPTION_SOURCE
  71. /* Otherwise in ERET (exception return) reg */
  72. lr %r0, [%eret]
  73. .endm
  74. ENTRY(memory_error)
  75. SAVE_ALL_SYS
  76. SAVE_EXCEPTION_SOURCE
  77. mov %r1, %sp
  78. j do_memory_error
  79. ENDPROC(memory_error)
  80. ENTRY(instruction_error)
  81. SAVE_ALL_SYS
  82. SAVE_EXCEPTION_SOURCE
  83. mov %r1, %sp
  84. j do_instruction_error
  85. ENDPROC(instruction_error)
  86. ENTRY(interrupt_handler)
  87. /* Todo - save and restore CPU context when interrupts will be in use */
  88. bl do_interrupt_handler
  89. rtie
  90. ENDPROC(interrupt_handler)
  91. ENTRY(EV_MachineCheck)
  92. SAVE_ALL_SYS
  93. SAVE_EXCEPTION_SOURCE
  94. mov %r1, %sp
  95. j do_machine_check_fault
  96. ENDPROC(EV_MachineCheck)
  97. ENTRY(EV_TLBMissI)
  98. SAVE_ALL_SYS
  99. mov %r0, %sp
  100. j do_itlb_miss
  101. ENDPROC(EV_TLBMissI)
  102. ENTRY(EV_TLBMissD)
  103. SAVE_ALL_SYS
  104. mov %r0, %sp
  105. j do_dtlb_miss
  106. ENDPROC(EV_TLBMissD)
  107. ENTRY(EV_TLBProtV)
  108. SAVE_ALL_SYS
  109. SAVE_EXCEPTION_SOURCE
  110. mov %r1, %sp
  111. j do_tlb_prot_violation
  112. ENDPROC(EV_TLBProtV)
  113. ENTRY(EV_PrivilegeV)
  114. SAVE_ALL_SYS
  115. mov %r0, %sp
  116. j do_privilege_violation
  117. ENDPROC(EV_PrivilegeV)
  118. ENTRY(EV_Trap)
  119. SAVE_ALL_SYS
  120. mov %r0, %sp
  121. j do_trap
  122. ENDPROC(EV_Trap)
  123. ENTRY(EV_Extension)
  124. SAVE_ALL_SYS
  125. mov %r0, %sp
  126. j do_extension
  127. ENDPROC(EV_Extension)
  128. #ifdef CONFIG_ISA_ARCV2
  129. ENTRY(EV_SWI)
  130. SAVE_ALL_SYS
  131. mov %r0, %sp
  132. j do_swi
  133. ENDPROC(EV_SWI)
  134. ENTRY(EV_DivZero)
  135. SAVE_ALL_SYS
  136. SAVE_EXCEPTION_SOURCE
  137. mov %r1, %sp
  138. j do_divzero
  139. ENDPROC(EV_DivZero)
  140. ENTRY(EV_DCError)
  141. SAVE_ALL_SYS
  142. mov %r0, %sp
  143. j do_dcerror
  144. ENDPROC(EV_DCError)
  145. ENTRY(EV_Maligned)
  146. SAVE_ALL_SYS
  147. SAVE_EXCEPTION_SOURCE
  148. mov %r1, %sp
  149. j do_maligned
  150. ENDPROC(EV_Maligned)
  151. #endif