start.S 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. /*
  2. * start.S
  3. *
  4. * Startup code taken from picosoc/picorv32 and adapted for use here
  5. *
  6. * Copyright (C) 2017 Clifford Wolf <clifford@clifford.at>
  7. * Copyright (C) 2019 Sylvain Munaut <tnt@246tNt.com>
  8. *
  9. * Permission to use, copy, modify, and/or distribute this software for any
  10. * purpose with or without fee is hereby granted, provided that the above
  11. * copyright notice and this permission notice appear in all copies.
  12. *
  13. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  14. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  15. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  16. * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  17. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  18. * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  19. * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  20. */
  21. .section .text
  22. start:
  23. // zero-initialize register file
  24. addi x1, zero, 0
  25. // x2 (sp) is initialized by reset
  26. addi x3, zero, 0
  27. addi x4, zero, 0
  28. addi x5, zero, 0
  29. addi x6, zero, 0
  30. addi x7, zero, 0
  31. addi x8, zero, 0
  32. addi x9, zero, 0
  33. addi x10, zero, 0
  34. addi x11, zero, 0
  35. addi x12, zero, 0
  36. addi x13, zero, 0
  37. addi x14, zero, 0
  38. addi x15, zero, 0
  39. addi x16, zero, 0
  40. addi x17, zero, 0
  41. addi x18, zero, 0
  42. addi x19, zero, 0
  43. addi x20, zero, 0
  44. addi x21, zero, 0
  45. addi x22, zero, 0
  46. addi x23, zero, 0
  47. addi x24, zero, 0
  48. addi x25, zero, 0
  49. addi x26, zero, 0
  50. addi x27, zero, 0
  51. addi x28, zero, 0
  52. addi x29, zero, 0
  53. addi x30, zero, 0
  54. addi x31, zero, 0
  55. #ifdef BOOT_DEBUG
  56. // Set UART divisor
  57. li a0, 0x81000000
  58. li a1, 23
  59. sw a1, 4(a0)
  60. // Output '1'
  61. li a1, 49
  62. sw a1, 0(a0)
  63. #endif
  64. // zero initialize entire scratchpad memory
  65. li a0, 0x0001c000
  66. li a1, 0
  67. setmemloop:
  68. sw a1, 0(a0)
  69. addi a0, a0, 4
  70. blt a0, sp, setmemloop
  71. #ifdef BOOT_DEBUG
  72. // Output '2'
  73. li a0, 0x81000000
  74. li a1, 50
  75. sw a1, 0(a0)
  76. #endif
  77. // copy data section
  78. la a0, _sidata
  79. la a1, _sdata
  80. la a2, _edata
  81. bge a1, a2, end_init_data
  82. loop_init_data:
  83. lw a3, 0(a0)
  84. sw a3, 0(a1)
  85. addi a0, a0, 4
  86. addi a1, a1, 4
  87. blt a1, a2, loop_init_data
  88. end_init_data:
  89. #ifdef BOOT_DEBUG
  90. // Output '3'
  91. li a0, 0x81000000
  92. li a1, 51
  93. sw a1, 0(a0)
  94. #endif
  95. // zero-init bss section
  96. la a0, _sbss
  97. la a1, _ebss
  98. bge a0, a1, end_init_bss
  99. loop_init_bss:
  100. sw zero, 0(a0)
  101. addi a0, a0, 4
  102. blt a0, a1, loop_init_bss
  103. end_init_bss:
  104. #ifdef BOOT_DEBUG
  105. // Output '4'
  106. li a0, 0x81000000
  107. li a1, 52
  108. sw a1, 0(a0)
  109. #endif
  110. // call main
  111. call main
  112. loop:
  113. j loop