140 lines
2.2 KiB
ArmAsm
140 lines
2.2 KiB
ArmAsm
/*
|
|
* Copyright (c) 2006-2018, RT-Thread Development Team
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*
|
|
* Change Logs:
|
|
* Date Author Notes
|
|
* 2018/10/01 Bernard The first version
|
|
* 2018/12/27 Jesven Add SMP support
|
|
*/
|
|
|
|
#define MSTATUS_FS 0x00006000U /* initial state of FPU */
|
|
#include <cpuport.h>
|
|
|
|
.global _start
|
|
.section ".start", "ax"
|
|
_start:
|
|
j 1f
|
|
.word 0xdeadbeef
|
|
.align 3
|
|
.global g_wake_up
|
|
g_wake_up:
|
|
.dword 1
|
|
.dword 0
|
|
1:
|
|
csrw mideleg, 0
|
|
csrw medeleg, 0
|
|
csrw mie, 0
|
|
csrw mip, 0
|
|
la t0, trap_entry
|
|
csrw mtvec, t0
|
|
|
|
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
|
|
|
|
/* set to initial state of FPU and disable interrupt */
|
|
li t0, MSTATUS_FS
|
|
csrs mstatus, t0
|
|
|
|
fssr x0
|
|
fmv.w.x f0, x0
|
|
fmv.w.x f1, x0
|
|
fmv.w.x f2, x0
|
|
fmv.w.x f3, x0
|
|
fmv.w.x f4, x0
|
|
fmv.w.x f5, x0
|
|
fmv.w.x f6, x0
|
|
fmv.w.x f7, x0
|
|
fmv.w.x f8, x0
|
|
fmv.w.x f9, x0
|
|
fmv.w.x f10,x0
|
|
fmv.w.x f11,x0
|
|
fmv.w.x f12,x0
|
|
fmv.w.x f13,x0
|
|
fmv.w.x f14,x0
|
|
fmv.w.x f15,x0
|
|
fmv.w.x f16,x0
|
|
fmv.w.x f17,x0
|
|
fmv.w.x f18,x0
|
|
fmv.w.x f19,x0
|
|
fmv.w.x f20,x0
|
|
fmv.w.x f21,x0
|
|
fmv.w.x f22,x0
|
|
fmv.w.x f23,x0
|
|
fmv.w.x f24,x0
|
|
fmv.w.x f25,x0
|
|
fmv.w.x f26,x0
|
|
fmv.w.x f27,x0
|
|
fmv.w.x f28,x0
|
|
fmv.w.x f29,x0
|
|
fmv.w.x f30,x0
|
|
fmv.w.x f31,x0
|
|
|
|
.option push
|
|
.option norelax
|
|
la gp, __global_pointer$
|
|
.option pop
|
|
|
|
/* get cpu id */
|
|
csrr a0, mhartid
|
|
|
|
la sp, __stack_start__
|
|
addi t1, a0, 1
|
|
li t2, __STACKSIZE__
|
|
mul t1, t1, t2
|
|
add sp, sp, t1 /* sp = (cpuid + 1) * __STACKSIZE__ + __stack_start__ */
|
|
|
|
/* other cpu core, jump to cpu entry directly */
|
|
bnez a0, secondary_cpu_entry
|
|
tail primary_cpu_entry
|
|
|
|
secondary_cpu_entry:
|
|
#ifdef RT_USING_SMP
|
|
la a0, secondary_boot_flag
|
|
ld a0, 0(a0)
|
|
li a1, 0xa55a
|
|
beq a0, a1, 1f
|
|
#endif
|
|
j secondary_cpu_entry
|
|
|
|
#ifdef RT_USING_SMP
|
|
1:
|
|
tail secondary_cpu_c_start
|
|
|
|
.data
|
|
.global secondary_boot_flag
|
|
.align 3
|
|
secondary_boot_flag:
|
|
.dword 0
|
|
#endif
|