startup_gcc.S 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. /*
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2018/10/01 Bernard The first version
  9. */
  10. #define MSTATUS_FS 0x00006000U /* initial state of FPU */
  11. #include <cpuport.h>
  12. .global _start
  13. .section ".start", "ax"
  14. _start:
  15. j 1f
  16. .word 0xdeadbeef
  17. .align 3
  18. .global g_wake_up
  19. g_wake_up:
  20. .dword 1
  21. .dword 0
  22. 1:
  23. csrw mideleg, 0
  24. csrw medeleg, 0
  25. csrw mie, 0
  26. csrw mip, 0
  27. la t0, trap_entry
  28. csrw mtvec, t0
  29. li x1, 0
  30. li x2, 0
  31. li x3, 0
  32. li x4, 0
  33. li x5, 0
  34. li x6, 0
  35. li x7, 0
  36. li x8, 0
  37. li x9, 0
  38. li x10,0
  39. li x11,0
  40. li x12,0
  41. li x13,0
  42. li x14,0
  43. li x15,0
  44. li x16,0
  45. li x17,0
  46. li x18,0
  47. li x19,0
  48. li x20,0
  49. li x21,0
  50. li x22,0
  51. li x23,0
  52. li x24,0
  53. li x25,0
  54. li x26,0
  55. li x27,0
  56. li x28,0
  57. li x29,0
  58. li x30,0
  59. li x31,0
  60. /* set to initial state of FPU and disable interrupt */
  61. li t0, MSTATUS_FS
  62. csrs mstatus, t0
  63. fssr x0
  64. fmv.d.x f0, x0
  65. fmv.d.x f1, x0
  66. fmv.d.x f2, x0
  67. fmv.d.x f3, x0
  68. fmv.d.x f4, x0
  69. fmv.d.x f5, x0
  70. fmv.d.x f6, x0
  71. fmv.d.x f7, x0
  72. fmv.d.x f8, x0
  73. fmv.d.x f9, x0
  74. fmv.d.x f10,x0
  75. fmv.d.x f11,x0
  76. fmv.d.x f12,x0
  77. fmv.d.x f13,x0
  78. fmv.d.x f14,x0
  79. fmv.d.x f15,x0
  80. fmv.d.x f16,x0
  81. fmv.d.x f17,x0
  82. fmv.d.x f18,x0
  83. fmv.d.x f19,x0
  84. fmv.d.x f20,x0
  85. fmv.d.x f21,x0
  86. fmv.d.x f22,x0
  87. fmv.d.x f23,x0
  88. fmv.d.x f24,x0
  89. fmv.d.x f25,x0
  90. fmv.d.x f26,x0
  91. fmv.d.x f27,x0
  92. fmv.d.x f28,x0
  93. fmv.d.x f29,x0
  94. fmv.d.x f30,x0
  95. fmv.d.x f31,x0
  96. .option push
  97. .option norelax
  98. la gp, __global_pointer$
  99. .option pop
  100. /* get cpu id */
  101. csrr a0, mhartid
  102. la sp, __stack_start__
  103. addi t1, a0, 1
  104. li t2, __STACKSIZE__
  105. mul t1, t1, t2
  106. add sp, sp, t1 /* sp = (cpuid + 1) * __STACKSIZE__ + __stack_start__ */
  107. /* other cpu core, jump to cpu entry directly */
  108. bnez a0, _cpu_entry
  109. #if 0
  110. /* clear bss section */
  111. la a0, __bss_start
  112. la a1, __bss_end
  113. bgeu a0, a1, 2f
  114. 1:
  115. sw zero, (a0)
  116. addi a0, a0, REGBYTES
  117. bltu a0, a1, 1b
  118. 2:
  119. #endif
  120. _cpu_entry:
  121. csrr a0, mhartid
  122. j cpu_entry