| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- /*
- * Copyright (c) 2006-2024, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2024/01/11 flyingcys The first version
- */
- #include "riscv-virt.h"
- .org 0
- .section .vectors, "ax"
- .globl _start
- .type _start,@function
- _start:
- .cfi_startproc
- .cfi_undefined ra
- .option push
- .option norelax
- // la gp, __global_pointer$
- .option pop
- // Continue primary hart
- csrr a0, mhartid
- li a1, PRIM_HART
- bne a0, a1, secondary
- li x1, 0
- li x2, 0
- li x3, 0
- li x4, 0
- li x5, 0
- li x6, 0
- li x7, 0
- li x8, 0
- li x9, 0
- li x10, 0
- li x11, 0
- li x12, 0
- li x13, 0
- li x14, 0
- li x15, 0
- li x16, 0
- li x17, 0
- li x18, 0
- li x19, 0
- li x20, 0
- li x21, 0
- li x22, 0
- li x23, 0
- li x24, 0
- li x25, 0
- li x26, 0
- li x27, 0
- li x28, 0
- li x29, 0
- li x30, 0
- li x31, 0
- // enable interrupt
- // li x3, 0x880
- // csrw mie, x3
- csrw mie, 0
- csrw mip, 0
- la t0, trap_entry
- csrw mtvec, t0
-
- #ifndef RISCV_QEMU
- // invalidate all memory for BTB,BHT,DCACHE,ICACHE
- li x3, 0x30013
- csrs mcor, x3
- // enable ICACHE,DCACHE,BHT,BTB,RAS,WA
- li x3, 0x7f
- csrs mhcr, x3
- // enable data_cache_prefetch, amr
- li x3, 0x610c
- csrs mhint, x3 #mhint
- #endif
- # enable fp
- li x3, 0x1 << 13
- csrs mstatus, x3
- // Primary hart
- la sp, _stack_top
- // Load data section
- la a0, _data_lma
- la a1, _data
- la a2, _edata
- bgeu a1, a2, 2f
- 1:
- LOAD t0, (a0)
- STOR t0, (a1)
- addi a0, a0, REGSIZE
- addi a1, a1, REGSIZE
- bltu a1, a2, 1b
- 2:
- // Clear bss section
- la a0, _bss
- la a1, _ebss
- bgeu a0, a1, 2f
- 1:
- // reduce branch time, be sure about bss alignment in linker script
- STOR zero, 0x00 (a0)
- STOR zero, 0x08 (a0)
- STOR zero, 0x10 (a0)
- STOR zero, 0x18 (a0)
- STOR zero, 0x20 (a0)
- STOR zero, 0x28 (a0)
- STOR zero, 0x30 (a0)
- STOR zero, 0x38 (a0)
- addi a0, a0, REGSIZE * 8
- bltu a0, a1, 1b
- 2:
- // argc, argv, envp is 0
- li a0, 0
- li a1, 0
- li a2, 0
- jal entry
- 1:
- wfi
- j 1b
- secondary:
- // TODO: Multicore is not supported
- wfi
- j secondary
- .cfi_endproc
|