137 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			137 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.d.x f0, x0
 | |
|   fmv.d.x f1, x0
 | |
|   fmv.d.x f2, x0
 | |
|   fmv.d.x f3, x0
 | |
|   fmv.d.x f4, x0
 | |
|   fmv.d.x f5, x0
 | |
|   fmv.d.x f6, x0
 | |
|   fmv.d.x f7, x0
 | |
|   fmv.d.x f8, x0
 | |
|   fmv.d.x f9, x0
 | |
|   fmv.d.x f10,x0
 | |
|   fmv.d.x f11,x0
 | |
|   fmv.d.x f12,x0
 | |
|   fmv.d.x f13,x0
 | |
|   fmv.d.x f14,x0
 | |
|   fmv.d.x f15,x0
 | |
|   fmv.d.x f16,x0
 | |
|   fmv.d.x f17,x0
 | |
|   fmv.d.x f18,x0
 | |
|   fmv.d.x f19,x0
 | |
|   fmv.d.x f20,x0
 | |
|   fmv.d.x f21,x0
 | |
|   fmv.d.x f22,x0
 | |
|   fmv.d.x f23,x0
 | |
|   fmv.d.x f24,x0
 | |
|   fmv.d.x f25,x0
 | |
|   fmv.d.x f26,x0
 | |
|   fmv.d.x f27,x0
 | |
|   fmv.d.x f28,x0
 | |
|   fmv.d.x f29,x0
 | |
|   fmv.d.x f30,x0
 | |
|   fmv.d.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
 | |
|   j 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, secondary_cpu_c_start
 | |
| #endif
 | |
|   j secondary_cpu_entry
 | |
| 
 | |
| #ifdef RT_USING_SMP
 | |
| .data
 | |
| .global secondary_boot_flag
 | |
| .align 3
 | |
| secondary_boot_flag:
 | |
|     .dword 0
 | |
| #endif
 | 
