asm.S 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. #include "asm.h"
  2. /*
  3. Entry point of all programs (_start).
  4. It initializes DWARF call frame information, the stack pointer, the
  5. frame pointer (needed for closures to work in start_rust) and the global
  6. pointer. Then it calls _start_rust.
  7. */
  8. .section .init, "ax"
  9. .global _start
  10. _start:
  11. .cfi_startproc
  12. .cfi_undefined ra
  13. csrw mie, 0
  14. csrw mip, 0
  15. li x1, 0
  16. li x2, 0
  17. li x3, 0
  18. li x4, 0
  19. li x5, 0
  20. li x6, 0
  21. li x7, 0
  22. li x8, 0
  23. li x9, 0
  24. li x10,0
  25. li x11,0
  26. li x12,0
  27. li x13,0
  28. li x14,0
  29. li x15,0
  30. li x16,0
  31. li x17,0
  32. li x18,0
  33. li x19,0
  34. li x20,0
  35. li x21,0
  36. li x22,0
  37. li x23,0
  38. li x24,0
  39. li x25,0
  40. li x26,0
  41. li x27,0
  42. li x28,0
  43. li x29,0
  44. li x30,0
  45. li x31,0
  46. .option push
  47. .option norelax
  48. la gp, __global_pointer$
  49. .option pop
  50. // Check hart id
  51. csrr a2, mhartid
  52. lui t0, %hi(_max_hart_id)
  53. add t0, t0, %lo(_max_hart_id)
  54. bgtu a2, t0, abort
  55. // Allocate stacks
  56. la sp, _stack_start
  57. lui t0, %hi(_hart_stack_size)
  58. add t0, t0, %lo(_hart_stack_size)
  59. mul t0, a2, t0
  60. sub sp, sp, t0
  61. // Set frame pointer
  62. add s0, sp, zero
  63. // Set trap handler
  64. la t0, _start_trap
  65. csrw mtvec, t0
  66. jal zero, _start_rust
  67. .cfi_endproc
  68. /*
  69. Trap entry point (_start_trap)
  70. Saves caller saved registers ra, t0..6, a0..7, calls _start_trap_rust,
  71. restores caller saved registers and then returns.
  72. */
  73. .section .trap, "ax"
  74. .global _start_trap
  75. _start_trap:
  76. addi sp, sp, -16*REGBYTES
  77. STORE ra, 0*REGBYTES(sp)
  78. STORE t0, 1*REGBYTES(sp)
  79. STORE t1, 2*REGBYTES(sp)
  80. STORE t2, 3*REGBYTES(sp)
  81. STORE t3, 4*REGBYTES(sp)
  82. STORE t4, 5*REGBYTES(sp)
  83. STORE t5, 6*REGBYTES(sp)
  84. STORE t6, 7*REGBYTES(sp)
  85. STORE a0, 8*REGBYTES(sp)
  86. STORE a1, 9*REGBYTES(sp)
  87. STORE a2, 10*REGBYTES(sp)
  88. STORE a3, 11*REGBYTES(sp)
  89. STORE a4, 12*REGBYTES(sp)
  90. STORE a5, 13*REGBYTES(sp)
  91. STORE a6, 14*REGBYTES(sp)
  92. STORE a7, 15*REGBYTES(sp)
  93. jal ra, _start_trap_rust
  94. LOAD ra, 0*REGBYTES(sp)
  95. LOAD t0, 1*REGBYTES(sp)
  96. LOAD t1, 2*REGBYTES(sp)
  97. LOAD t2, 3*REGBYTES(sp)
  98. LOAD t3, 4*REGBYTES(sp)
  99. LOAD t4, 5*REGBYTES(sp)
  100. LOAD t5, 6*REGBYTES(sp)
  101. LOAD t6, 7*REGBYTES(sp)
  102. LOAD a0, 8*REGBYTES(sp)
  103. LOAD a1, 9*REGBYTES(sp)
  104. LOAD a2, 10*REGBYTES(sp)
  105. LOAD a3, 11*REGBYTES(sp)
  106. LOAD a4, 12*REGBYTES(sp)
  107. LOAD a5, 13*REGBYTES(sp)
  108. LOAD a6, 14*REGBYTES(sp)
  109. LOAD a7, 15*REGBYTES(sp)
  110. addi sp, sp, 16*REGBYTES
  111. mret
  112. /* Make sure there is an abort when linking */
  113. .section .init
  114. .globl abort
  115. abort:
  116. j abort