start.S 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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. #ifdef INIT_EXT_RAM_FOR_DATA
  27. la t0, _stack_safe
  28. mv sp, t0
  29. call _init_ext_ram
  30. #endif
  31. /* Initialize stack pointer */
  32. la t0, _stack
  33. mv sp, t0
  34. /*
  35. * Initialize LMA/VMA sections.
  36. * Relocation for any sections that need to be copied from LMA to VMA.
  37. */
  38. call c_startup
  39. #if defined(__SES_RISCV)
  40. /* Initialize the heap */
  41. la a0, __heap_start__
  42. la a1, __heap_end__
  43. sub a1, a1, a0
  44. la t1, __SEGGER_RTL_init_heap
  45. jalr t1
  46. #endif
  47. /* Do global constructors */
  48. call __libc_init_array
  49. #ifndef NO_CLEANUP_AT_START
  50. /* clean up */
  51. call _clean_up
  52. #endif
  53. #ifdef __nds_execit
  54. /* Initialize EXEC.IT table */
  55. la t0, _ITB_BASE_
  56. csrw uitb, t0
  57. #endif
  58. #if defined(CONFIG_FREERTOS) && CONFIG_FREERTOS
  59. #define HANDLER_TRAP freertos_risc_v_trap_handler
  60. #define HANDLER_S_TRAP freertos_risc_v_trap_handler
  61. /* Use mscratch to store isr level */
  62. csrw mscratch, 0
  63. #elif defined(CONFIG_UCOS_III) && CONFIG_UCOS_III
  64. #define HANDLER_TRAP ucos_risc_v_trap_handler
  65. #define HANDLER_S_TRAP ucos_risc_v_trap_handler
  66. /* Use mscratch to store isr level */
  67. csrw mscratch, 0
  68. #elif defined(CONFIG_THREADX) && CONFIG_THREADX
  69. #define HANDLER_TRAP tx_risc_v_trap_handler
  70. #define HANDLER_S_TRAP tx_risc_v_trap_handler
  71. /* Use mscratch to store isr level */
  72. csrw mscratch, 0
  73. #else
  74. #define HANDLER_TRAP irq_handler_trap
  75. #define HANDLER_S_TRAP irq_handler_s_trap
  76. #endif
  77. #ifndef USE_NONVECTOR_MODE
  78. /* Initial machine trap-vector Base */
  79. la t0, __vector_table
  80. csrw mtvec, t0
  81. #if defined (USE_S_MODE_IRQ)
  82. la t0, __vector_s_table
  83. csrw stvec, t0
  84. #endif
  85. /* Enable vectored external PLIC interrupt */
  86. csrsi CSR_MMISC_CTL, 2
  87. #else
  88. /* Initial machine trap-vector Base */
  89. la t0, HANDLER_TRAP
  90. csrw mtvec, t0
  91. #if defined (USE_S_MODE_IRQ)
  92. la t0, HANDLER_S_TRAP
  93. csrw stvec, t0
  94. #endif
  95. /* Disable vectored external PLIC interrupt */
  96. csrci CSR_MMISC_CTL, 2
  97. #endif
  98. /* System reset handler */
  99. call reset_handler
  100. /* Infinite loop, if returned accidentally */
  101. 1: j 1b
  102. .weak exit
  103. exit:
  104. 1: j 1b
  105. .section .isr_vector, "ax"
  106. .weak nmi_handler
  107. nmi_handler:
  108. 1: j 1b
  109. #include "../vectors.h"