entry_gcc.S 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. // See LICENSE for license details
  2. #ifndef ENTRY_S
  3. #define ENTRY_S
  4. #include "encoding.h"
  5. #include "sifive/bits.h"
  6. .section .text.entry
  7. .align 2
  8. .global trap_entry
  9. trap_entry:
  10. addi sp, sp, -32*REGBYTES
  11. STORE x1, 1*REGBYTES(sp)
  12. STORE x2, 2*REGBYTES(sp)
  13. STORE x3, 3*REGBYTES(sp)
  14. STORE x4, 4*REGBYTES(sp)
  15. STORE x5, 5*REGBYTES(sp)
  16. STORE x6, 6*REGBYTES(sp)
  17. STORE x7, 7*REGBYTES(sp)
  18. STORE x8, 8*REGBYTES(sp)
  19. STORE x9, 9*REGBYTES(sp)
  20. STORE x10, 10*REGBYTES(sp)
  21. STORE x11, 11*REGBYTES(sp)
  22. STORE x12, 12*REGBYTES(sp)
  23. STORE x13, 13*REGBYTES(sp)
  24. STORE x14, 14*REGBYTES(sp)
  25. STORE x15, 15*REGBYTES(sp)
  26. STORE x16, 16*REGBYTES(sp)
  27. STORE x17, 17*REGBYTES(sp)
  28. STORE x18, 18*REGBYTES(sp)
  29. STORE x19, 19*REGBYTES(sp)
  30. STORE x20, 20*REGBYTES(sp)
  31. STORE x21, 21*REGBYTES(sp)
  32. STORE x22, 22*REGBYTES(sp)
  33. STORE x23, 23*REGBYTES(sp)
  34. STORE x24, 24*REGBYTES(sp)
  35. STORE x25, 25*REGBYTES(sp)
  36. STORE x26, 26*REGBYTES(sp)
  37. STORE x27, 27*REGBYTES(sp)
  38. STORE x28, 28*REGBYTES(sp)
  39. STORE x29, 29*REGBYTES(sp)
  40. STORE x30, 30*REGBYTES(sp)
  41. STORE x31, 31*REGBYTES(sp)
  42. csrr a0, mcause
  43. csrr a1, mepc
  44. mv a2, sp
  45. call handle_trap
  46. csrw mepc, a0
  47. # Remain in M-mode after mret
  48. li t0, MSTATUS_MPP
  49. csrs mstatus, t0
  50. LOAD x1, 1*REGBYTES(sp)
  51. LOAD x2, 2*REGBYTES(sp)
  52. LOAD x3, 3*REGBYTES(sp)
  53. LOAD x4, 4*REGBYTES(sp)
  54. LOAD x5, 5*REGBYTES(sp)
  55. LOAD x6, 6*REGBYTES(sp)
  56. LOAD x7, 7*REGBYTES(sp)
  57. LOAD x8, 8*REGBYTES(sp)
  58. LOAD x9, 9*REGBYTES(sp)
  59. LOAD x10, 10*REGBYTES(sp)
  60. LOAD x11, 11*REGBYTES(sp)
  61. LOAD x12, 12*REGBYTES(sp)
  62. LOAD x13, 13*REGBYTES(sp)
  63. LOAD x14, 14*REGBYTES(sp)
  64. LOAD x15, 15*REGBYTES(sp)
  65. LOAD x16, 16*REGBYTES(sp)
  66. LOAD x17, 17*REGBYTES(sp)
  67. LOAD x18, 18*REGBYTES(sp)
  68. LOAD x19, 19*REGBYTES(sp)
  69. LOAD x20, 20*REGBYTES(sp)
  70. LOAD x21, 21*REGBYTES(sp)
  71. LOAD x22, 22*REGBYTES(sp)
  72. LOAD x23, 23*REGBYTES(sp)
  73. LOAD x24, 24*REGBYTES(sp)
  74. LOAD x25, 25*REGBYTES(sp)
  75. LOAD x26, 26*REGBYTES(sp)
  76. LOAD x27, 27*REGBYTES(sp)
  77. LOAD x28, 28*REGBYTES(sp)
  78. LOAD x29, 29*REGBYTES(sp)
  79. LOAD x30, 30*REGBYTES(sp)
  80. LOAD x31, 31*REGBYTES(sp)
  81. addi sp, sp, 32*REGBYTES
  82. mret
  83. .weak handle_trap
  84. handle_trap:
  85. 1:
  86. j 1b
  87. #endif