/********************************** (C) COPYRIGHT *******************************
* File Name          : startup_gcc.s
* Author             : WCH
* Version            : V1.0
* Date               : 2020/07/31
* Description        : CH56x vector table for eclipse toolchain.
*******************************************************************************/

	.section	.init,"ax",@progbits
	.global	_start
	.align	1
_start:
	j	handle_reset

    .section    .vector,"ax",@progbits
    .align  1
_vector_base:
    .option norvc;
    .word   0
    .word   0
        j   nmi_handler
        j   hardfault_handler
    .word   0
    .word   0
    .word   0
    .word   0
    .word   0
    .word   0
    .word   0
    .word   0
        j   systick_handler
    .word   0
        j   swi_handler
    .word   0
    /* External Interrupts */
        j   wdog_irq_handler
        j   tmr0_irq_handler
        j   gpio_irq_handler
        j   spi0_irq_handler
        j   usbss_irq_handler
        j   link_irq_handler
        j   tmr1_irq_handler
        j   tmr2_irq_handler
        j   uart0_irq_handler
        j   usbhs_irq_handler
        j   emmc_irq_handler
        j   dvp_irq_handler
        j   hspi_irq_handler
        j   spi1_irq_handler
        j   uart1_irq_handler
        j   uart2_irq_handler
        j   uart3_irq_handler
        j   serdes_irq_handler
        j   eth_irq_handler
        j   pmt_irq_handler
        j   ecdc_irq_handler

    .option rvc;

    .section    .text.vector_handler,"ax", @prsocogbits

    .weak   nmi_handler
    .weak   hardfault_handler
    .weak   systick_handler
    .weak   swi_handler
    .weak   wdog_irq_handler
    .weak   tmr0_irq_handler
    .weak   gpio_irq_handler
    .weak   spi0_irq_handler
    .weak   usbss_irq_handler
    .weak   link_irq_handler
    .weak   tmr1_irq_handler
    .weak   tmr2_irq_handler
    .weak   uart0_irq_handler
    .weak   usbhs_irq_handler
    .weak   emmc_irq_handler
    .weak   dvp_irq_handler
    .weak   hspi_irq_handler
    .weak   spi1_irq_handler
    .weak   uart1_irq_handler
    .weak   uart2_irq_handler
    .weak   uart3_irq_handler
    .weak   serdes_irq_handler
    .weak   eth_irq_handler
    .weak   pmt_irq_handler
    .weak   ecdc_irq_handler

nmi_handler:        j .L_rip
hardfault_handler:  j .L_rip
systick_handler:    j .L_rip
swi_handler:        j .L_rip
wdog_irq_handler:   j .L_rip
tmr0_irq_handler:   j .L_rip
gpio_irq_handler:   j .L_rip
spi0_irq_handler:   j .L_rip
usbss_irq_handler:  j .L_rip
link_irq_handler:   j .L_rip
tmr1_irq_handler:   j .L_rip
tmr2_irq_handler:   j .L_rip
uart0_irq_handler:  j .L_rip
usbhs_irq_handler:  j .L_rip
emmc_irq_handler:   j .L_rip
dvp_irq_handler:    j .L_rip
hspi_irq_handler:   j .L_rip
spi1_irq_handler:   j .L_rip
uart1_irq_handler:  j .L_rip
uart2_irq_handler:  j .L_rip
uart3_irq_handler:  j .L_rip
serdes_irq_handler: j .L_rip
eth_irq_handler:    j .L_rip
pmt_irq_handler:    j .L_rip
ecdc_irq_handler:   j .L_rip

.L_rip:
    csrr t0, mepc
    csrr t1, mstatus
    csrr t2, mcause
    csrr t3, mtval
    csrr t4, mscratch
1:  j 1b

	.section	.text.handle_reset,"ax",@progbits
	.weak	handle_reset
	.align	1
handle_reset:
    .option push 
    .option	norelax 
	la gp, __global_pointer$
    .option	pop 
1:
	la sp, _eusrstack 

/* Load data section from flash to RAM */
2:	
	la a0, _data_lma
	la a1, _data_vma
	la a2, _edata
	bgeu a1, a2, 2f
1:
	lw t0, (a0)
	sw t0, (a1)
	addi a0, a0, 4
	addi a1, a1, 4
	bltu a1, a2, 1b
/* clear bss section */
2:
	la a0, _sbss
	la a1, _ebss
	bgeu a0, a1, 2f
1:
	sw zero, (a0)
	addi a0, a0, 4
	bltu a0, a1, 1b

/* clear dmadata section */
2:
    la a0, _dmadata_start
    la a1, _dmadata_end
    bgeu a0, a1, 2f
1:
    sw zero, (a0)
    addi a0, a0, 4
    bltu a0, a1, 1b

2:
	/* leave all interrupt disabled */
    li t0, 0x1800
    csrs mstatus, t0
	la t0, _vector_base
    ori t0, t0, 1
	csrw mtvec, t0
	la t0, entry
	csrw mepc, t0
	mret