1// See LICENSE for license details. 2 3#include "riscv_encoding.h" 4 5 .section .init 6 7 .weak eclic_msip_handler 8 .weak eclic_mtip_handler 9 .weak eclic_bwei_handler 10 .weak eclic_pmovi_handler 11 .weak WWDGT_IRQHandler 12 .weak LVD_IRQHandler 13 .weak TAMPER_IRQHandler 14 .weak RTC_IRQHandler 15 .weak FMC_IRQHandler 16 .weak RCU_IRQHandler 17 .weak EXTI0_IRQHandler 18 .weak EXTI1_IRQHandler 19 .weak EXTI2_IRQHandler 20 .weak EXTI3_IRQHandler 21 .weak EXTI4_IRQHandler 22 .weak DMA0_Channel0_IRQHandler 23 .weak DMA0_Channel1_IRQHandler 24 .weak DMA0_Channel2_IRQHandler 25 .weak DMA0_Channel3_IRQHandler 26 .weak DMA0_Channel4_IRQHandler 27 .weak DMA0_Channel5_IRQHandler 28 .weak DMA0_Channel6_IRQHandler 29 .weak ADC0_1_IRQHandler 30 .weak CAN0_TX_IRQHandler 31 .weak CAN0_RX0_IRQHandler 32 .weak CAN0_RX1_IRQHandler 33 .weak CAN0_EWMC_IRQHandler 34 .weak EXTI5_9_IRQHandler 35 .weak TIMER0_BRK_IRQHandler 36 .weak TIMER0_UP_IRQHandler 37 .weak TIMER0_TRG_CMT_IRQHandler 38 .weak TIMER0_Channel_IRQHandler 39 .weak TIMER1_IRQHandler 40 .weak TIMER2_IRQHandler 41 .weak TIMER3_IRQHandler 42 .weak I2C0_EV_IRQHandler 43 .weak I2C0_ER_IRQHandler 44 .weak I2C1_EV_IRQHandler 45 .weak I2C1_ER_IRQHandler 46 .weak SPI0_IRQHandler 47 .weak SPI1_IRQHandler 48 .weak USART0_IRQHandler 49 .weak USART1_IRQHandler 50 .weak USART2_IRQHandler 51 .weak EXTI10_15_IRQHandler 52 .weak RTC_Alarm_IRQHandler 53 .weak USBFS_WKUP_IRQHandler 54 .weak EXMC_IRQHandler 55 .weak TIMER4_IRQHandler 56 .weak SPI2_IRQHandler 57 .weak UART3_IRQHandler 58 .weak UART4_IRQHandler 59 .weak TIMER5_IRQHandler 60 .weak TIMER6_IRQHandler 61 .weak DMA1_Channel0_IRQHandler 62 .weak DMA1_Channel1_IRQHandler 63 .weak DMA1_Channel2_IRQHandler 64 .weak DMA1_Channel3_IRQHandler 65 .weak DMA1_Channel4_IRQHandler 66 .weak CAN1_TX_IRQHandler 67 .weak CAN1_RX0_IRQHandler 68 .weak CAN1_RX1_IRQHandler 69 .weak CAN1_EWMC_IRQHandler 70 .weak USBFS_IRQHandler 71 72vector_base: 73 j _start 74 .align 2 75 .word 0 76 .word 0 77 .word eclic_msip_handler 78 .word 0 79 .word 0 80 .word 0 81 .word eclic_mtip_handler 82 .word 0 83 .word 0 84 .word 0 85 .word 0 86 .word 0 87 .word 0 88 .word 0 89 .word 0 90 .word 0 91 .word eclic_bwei_handler 92 .word eclic_pmovi_handler 93 .word WWDGT_IRQHandler 94 .word LVD_IRQHandler 95 .word TAMPER_IRQHandler 96 .word RTC_IRQHandler 97 .word FMC_IRQHandler 98 .word RCU_IRQHandler 99 .word EXTI0_IRQHandler 100 .word EXTI1_IRQHandler 101 .word EXTI2_IRQHandler 102 .word EXTI3_IRQHandler 103 .word EXTI4_IRQHandler 104 .word DMA0_Channel0_IRQHandler 105 .word DMA0_Channel1_IRQHandler 106 .word DMA0_Channel2_IRQHandler 107 .word DMA0_Channel3_IRQHandler 108 .word DMA0_Channel4_IRQHandler 109 .word DMA0_Channel5_IRQHandler 110 .word DMA0_Channel6_IRQHandler 111 .word ADC0_1_IRQHandler 112 .word CAN0_TX_IRQHandler 113 .word CAN0_RX0_IRQHandler 114 .word CAN0_RX1_IRQHandler 115 .word CAN0_EWMC_IRQHandler 116 .word EXTI5_9_IRQHandler 117 .word TIMER0_BRK_IRQHandler 118 .word TIMER0_UP_IRQHandler 119 .word TIMER0_TRG_CMT_IRQHandler 120 .word TIMER0_Channel_IRQHandler 121 .word TIMER1_IRQHandler 122 .word TIMER2_IRQHandler 123 .word TIMER3_IRQHandler 124 .word I2C0_EV_IRQHandler 125 .word I2C0_ER_IRQHandler 126 .word I2C1_EV_IRQHandler 127 .word I2C1_ER_IRQHandler 128 .word SPI0_IRQHandler 129 .word SPI1_IRQHandler 130 .word USART0_IRQHandler 131 .word USART1_IRQHandler 132 .word USART2_IRQHandler 133 .word EXTI10_15_IRQHandler 134 .word RTC_Alarm_IRQHandler 135 .word USBFS_WKUP_IRQHandler 136 .word 0 137 .word 0 138 .word 0 139 .word 0 140 .word 0 141 .word EXMC_IRQHandler 142 .word 0 143 .word TIMER4_IRQHandler 144 .word SPI2_IRQHandler 145 .word UART3_IRQHandler 146 .word UART4_IRQHandler 147 .word TIMER5_IRQHandler 148 .word TIMER6_IRQHandler 149 .word DMA1_Channel0_IRQHandler 150 .word DMA1_Channel1_IRQHandler 151 .word DMA1_Channel2_IRQHandler 152 .word DMA1_Channel3_IRQHandler 153 .word DMA1_Channel4_IRQHandler 154 .word 0 155 .word 0 156 .word CAN1_TX_IRQHandler 157 .word CAN1_RX0_IRQHandler 158 .word CAN1_RX1_IRQHandler 159 .word CAN1_EWMC_IRQHandler 160 .word USBFS_IRQHandler 161 162 .globl _start 163 .type _start,@function 164 165_start: 166 167 csrc CSR_MSTATUS, MSTATUS_MIE 168 /* Jump to logical address first to ensure correct operation of RAM region */ 169 la a0, _start 170 li a1, 1 171 slli a1, a1, 29 172 bleu a1, a0, _start0800 173 srli a1, a1, 2 174 bleu a1, a0, _start0800 175 la a0, _start0800 176 add a0, a0, a1 177 jr a0 178 179_start0800: 180 181 /* Set the the NMI base to share with mtvec by setting CSR_MMISC_CTL */ 182 li t0, 0x200 183 csrs CSR_MMISC_CTL, t0 184 185 /* Intial the mtvt*/ 186 la t0, vector_base 187 csrw CSR_MTVT, t0 188 189 /* Intial the mtvt2 and enable it*/ 190 la t0, irq_entry 191 csrw CSR_MTVT2, t0 192 csrs CSR_MTVT2, 0x1 193 194 /* Intial the CSR MTVEC for the Trap ane NMI base addr*/ 195 la t0, trap_entry 196 csrw CSR_MTVEC, t0 197 198#ifdef __riscv_flen 199 /* Enable FPU */ 200 li t0, MSTATUS_FS 201 csrs mstatus, t0 202 csrw fcsr, x0 203#endif 204 205.option push 206.option norelax 207 la gp, __global_pointer$ 208.option pop 209 la sp, _sp 210 211 /* Load data section */ 212 la a0, _data_lma 213 la a1, _data 214 la a2, _edata 215 bgeu a1, a2, 2f 2161: 217 lw t0, (a0) 218 sw t0, (a1) 219 addi a0, a0, 4 220 addi a1, a1, 4 221 bltu a1, a2, 1b 2222: 223 /* Clear bss section */ 224 la a0, __bss_start 225 la a1, _end 226 bgeu a0, a1, 2f 2271: 228 sw zero, (a0) 229 addi a0, a0, 4 230 bltu a0, a1, 1b 2312: 232 /*enable mcycle_minstret*/ 233 csrci CSR_MCOUNTINHIBIT, 0x5 234 /* Call global constructors */ 235 la a0, __libc_fini_array 236 call atexit 237 call __libc_init_array 238 239 240 /* argc = argv = 0 */ 241 li a0, 0 242 li a1, 0 243 call main 244 tail exit 245 2461: 247 j 1b 248 249 .global disable_mcycle_minstret 250disable_mcycle_minstret: 251 csrsi CSR_MCOUNTINHIBIT, 0x5 252 ret 253 254 .global enable_mcycle_minstret 255enable_mcycle_minstret: 256 csrci CSR_MCOUNTINHIBIT, 0x5 257 ret 258 259