start.S 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. /*
  2. * Copyright (c) 2021-2023 HPMicro
  3. *
  4. * SPDX-License-Identifier: BSD-3-Clause
  5. *
  6. */
  7. #include "hpm_csr_regs.h"
  8. .section .start, "ax"
  9. .global _start
  10. .type _start,@function
  11. _start:
  12. /* Initialize global pointer */
  13. .option push
  14. .option norelax
  15. la gp, __global_pointer$
  16. .option pop
  17. /* reset mstatus to 0*/
  18. csrrw x0, mstatus, x0
  19. #ifdef __riscv_flen
  20. /* Enable FPU */
  21. li t0, CSR_MSTATUS_FS_MASK
  22. csrrs t0, mstatus, t0
  23. /* Initialize FCSR */
  24. fscsr zero
  25. #endif
  26. /* Initialize stack pointer */
  27. la t0, _stack
  28. mv sp, t0
  29. /*
  30. * Initialize LMA/VMA sections.
  31. * Relocation for any sections that need to be copied from LMA to VMA.
  32. */
  33. call c_startup
  34. #if defined(__SES_RISCV)
  35. /* Initialize the heap */
  36. la a0, __heap_start__
  37. la a1, __heap_end__
  38. sub a1, a1, a0
  39. la t1, __SEGGER_RTL_init_heap
  40. jalr t1
  41. #endif
  42. /* Do global constructors */
  43. call __libc_init_array
  44. #ifndef NO_CLEANUP_AT_START
  45. /* clean up */
  46. call _clean_up
  47. #endif
  48. #ifdef __nds_execit
  49. /* Initialize EXEC.IT table */
  50. la t0, _ITB_BASE_
  51. csrw uitb, t0
  52. #endif
  53. #if defined(CONFIG_FREERTOS) && CONFIG_FREERTOS
  54. #define HANDLER_TRAP freertos_risc_v_trap_handler
  55. #define HANDLER_S_TRAP freertos_risc_v_trap_handler
  56. /* Use mscratch to store isr level */
  57. csrw mscratch, 0
  58. #elif defined(CONFIG_UCOS_III) && CONFIG_UCOS_III
  59. #define HANDLER_TRAP ucos_risc_v_trap_handler
  60. #define HANDLER_S_TRAP ucos_risc_v_trap_handler
  61. /* Use mscratch to store isr level */
  62. csrw mscratch, 0
  63. #elif defined(CONFIG_THREADX) && CONFIG_THREADX
  64. #define HANDLER_TRAP tx_risc_v_trap_handler
  65. #define HANDLER_S_TRAP tx_risc_v_trap_handler
  66. /* Use mscratch to store isr level */
  67. csrw mscratch, 0
  68. #else
  69. #define HANDLER_TRAP irq_handler_trap
  70. #define HANDLER_S_TRAP irq_handler_s_trap
  71. #endif
  72. #ifndef USE_NONVECTOR_MODE
  73. /* Initial machine trap-vector Base */
  74. la t0, __vector_table
  75. csrw mtvec, t0
  76. #if defined (USE_S_MODE_IRQ)
  77. la t0, __vector_s_table
  78. csrw stvec, t0
  79. #endif
  80. /* Enable vectored external PLIC interrupt */
  81. csrsi CSR_MMISC_CTL, 2
  82. #else
  83. /* Initial machine trap-vector Base */
  84. la t0, HANDLER_TRAP
  85. csrw mtvec, t0
  86. #if defined (USE_S_MODE_IRQ)
  87. la t0, HANDLER_S_TRAP
  88. csrw stvec, t0
  89. #endif
  90. /* Disable vectored external PLIC interrupt */
  91. csrci CSR_MMISC_CTL, 2
  92. #endif
  93. /* System reset handler */
  94. call reset_handler
  95. /* Infinite loop, if returned accidentally */
  96. 1: j 1b
  97. .weak exit
  98. exit:
  99. 1: j 1b
  100. .section .isr_vector, "ax"
  101. .weak nmi_handler
  102. nmi_handler:
  103. 1: j 1b
  104. #include "../vectors.h"