asm.S 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. /*
  2. Entry point of all programs (_start).
  3. It initializes DWARF call frame information, the stack pointer, the
  4. frame pointer (needed for closures to work in start_rust) and the global
  5. pointer. Then it calls _start_rust.
  6. */
  7. .section .init, "ax"
  8. .global _start
  9. _start:
  10. .cfi_startproc
  11. .cfi_undefined ra
  12. .option push
  13. .option norelax
  14. la gp, __global_pointer$
  15. .option pop
  16. // Check hart id
  17. csrr a2, mhartid
  18. lui t0, %hi(_max_hart_id)
  19. add t0, t0, %lo(_max_hart_id)
  20. bgtu a2, t0, abort
  21. // Allocate stacks
  22. la sp, _stack_start
  23. lui t0, %hi(_hart_stack_size)
  24. add t0, t0, %lo(_hart_stack_size)
  25. mul t0, a2, t0
  26. sub sp, sp, t0
  27. // Park non-zero harts
  28. bnez a2, abort
  29. // Set frame pointer
  30. add s0, sp, zero
  31. jal zero, _start_rust
  32. .cfi_endproc
  33. /*
  34. Trap entry point (_start_trap)
  35. Saves caller saved registers ra, t0..6, a0..7, calls _start_trap_rust,
  36. restores caller saved registers and then returns.
  37. */
  38. .section .trap, "ax"
  39. .global _start_trap
  40. _start_trap:
  41. addi sp, sp, -16*4
  42. sw ra, 0*4(sp)
  43. sw t0, 1*4(sp)
  44. sw t1, 2*4(sp)
  45. sw t2, 3*4(sp)
  46. sw t3, 4*4(sp)
  47. sw t4, 5*4(sp)
  48. sw t5, 6*4(sp)
  49. sw t6, 7*4(sp)
  50. sw a0, 8*4(sp)
  51. sw a1, 9*4(sp)
  52. sw a2, 10*4(sp)
  53. sw a3, 11*4(sp)
  54. sw a4, 12*4(sp)
  55. sw a5, 13*4(sp)
  56. sw a6, 14*4(sp)
  57. sw a7, 15*4(sp)
  58. jal ra, _start_trap_rust
  59. lw ra, 0*4(sp)
  60. lw t0, 1*4(sp)
  61. lw t1, 2*4(sp)
  62. lw t2, 3*4(sp)
  63. lw t3, 4*4(sp)
  64. lw t4, 5*4(sp)
  65. lw t5, 6*4(sp)
  66. lw t6, 7*4(sp)
  67. lw a0, 8*4(sp)
  68. lw a1, 9*4(sp)
  69. lw a2, 10*4(sp)
  70. lw a3, 11*4(sp)
  71. lw a4, 12*4(sp)
  72. lw a5, 13*4(sp)
  73. lw a6, 14*4(sp)
  74. lw a7, 15*4(sp)
  75. addi sp, sp, 16*4
  76. mret
  77. /* Make sure there is an abort when linking */
  78. .section .init
  79. .globl abort
  80. abort:
  81. j abort