You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

97 lines
1.6 KiB

  1. # .global crtStart
  2. # .global main
  3. # .global irqCallback
  4. # crtStart:
  5. # j crtInit
  6. # nop
  7. # nop
  8. # nop
  9. # nop
  10. # nop
  11. # nop
  12. # nop
  13. # .global trap_entry
  14. # trap_entry:
  15. # sw x1, - 1*4(sp)
  16. # sw x5, - 2*4(sp)
  17. # sw x6, - 3*4(sp)
  18. # sw x7, - 4*4(sp)
  19. # sw x10, - 5*4(sp)
  20. # sw x11, - 6*4(sp)
  21. # sw x12, - 7*4(sp)
  22. # sw x13, - 8*4(sp)
  23. # sw x14, - 9*4(sp)
  24. # sw x15, -10*4(sp)
  25. # sw x16, -11*4(sp)
  26. # sw x17, -12*4(sp)
  27. # sw x28, -13*4(sp)
  28. # sw x29, -14*4(sp)
  29. # sw x30, -15*4(sp)
  30. # sw x31, -16*4(sp)
  31. # addi sp,sp,-16*4
  32. # call irqCallback
  33. # lw x1 , 15*4(sp)
  34. # lw x5, 14*4(sp)
  35. # lw x6, 13*4(sp)
  36. # lw x7, 12*4(sp)
  37. # lw x10, 11*4(sp)
  38. # lw x11, 10*4(sp)
  39. # lw x12, 9*4(sp)
  40. # lw x13, 8*4(sp)
  41. # lw x14, 7*4(sp)
  42. # lw x15, 6*4(sp)
  43. # lw x16, 5*4(sp)
  44. # lw x17, 4*4(sp)
  45. # lw x28, 3*4(sp)
  46. # lw x29, 2*4(sp)
  47. # lw x30, 1*4(sp)
  48. # lw x31, 0*4(sp)
  49. # addi sp,sp,16*4
  50. # mret
  51. # .text
  52. # crtInit:
  53. # .option push
  54. # .option norelax
  55. # la gp, __global_pointer$
  56. # .option pop
  57. # la sp, _stack_start
  58. # bss_init:
  59. # la a0, _bss_start
  60. # la a1, _bss_end
  61. # bss_loop:
  62. # beq a0,a1,bss_done
  63. # sw zero,0(a0)
  64. # add a0,a0,4
  65. # j bss_loop
  66. # bss_done:
  67. # ctors_init:
  68. # la a0, _ctors_start
  69. # addi sp,sp,-4
  70. # ctors_loop:
  71. # la a1, _ctors_end
  72. # beq a0,a1,ctors_done
  73. # lw a3,0(a0)
  74. # add a0,a0,4
  75. # sw a0,0(sp)
  76. # jalr a3
  77. # lw a0,0(sp)
  78. # j ctors_loop
  79. # ctors_done:
  80. # addi sp,sp,4
  81. # li a0, 0x880 //880 enable timer + external interrupts
  82. # csrw mie,a0
  83. # li a0, 0x1808 //1808 enable interrupts
  84. # csrw mstatus,a0
  85. # call main
  86. # infinitLoop:
  87. # j infinitLoop