295 lines
7.1 KiB
ArmAsm
295 lines
7.1 KiB
ArmAsm
|
/*
|
|||
|
* Copyright (c) 2019-2025 Allwinner Technology Co., Ltd. ALL rights reserved.
|
|||
|
*
|
|||
|
* Allwinner is a trademark of Allwinner Technology Co.,Ltd., registered in
|
|||
|
* the the People's Republic of China and other countries.
|
|||
|
* All Allwinner Technology Co.,Ltd. trademarks are used with permission.
|
|||
|
*
|
|||
|
* DISCLAIMER
|
|||
|
* THIRD PARTY LICENCES MAY BE REQUIRED TO IMPLEMENT THE SOLUTION/PRODUCT.
|
|||
|
* IF YOU NEED TO INTEGRATE THIRD PARTY’S TECHNOLOGY (SONY, DTS, DOLBY, AVS OR MPEGLA, ETC.)
|
|||
|
* IN ALLWINNERS’SDK OR PRODUCTS, YOU SHALL BE SOLELY RESPONSIBLE TO OBTAIN
|
|||
|
* ALL APPROPRIATELY REQUIRED THIRD PARTY LICENCES.
|
|||
|
* ALLWINNER SHALL HAVE NO WARRANTY, INDEMNITY OR OTHER OBLIGATIONS WITH RESPECT TO MATTERS
|
|||
|
* COVERED UNDER ANY REQUIRED THIRD PARTY LICENSE.
|
|||
|
* YOU ARE SOLELY RESPONSIBLE FOR YOUR USAGE OF THIRD PARTY’S TECHNOLOGY.
|
|||
|
*
|
|||
|
*
|
|||
|
* THIS SOFTWARE IS PROVIDED BY ALLWINNER"AS IS" AND TO THE MAXIMUM EXTENT
|
|||
|
* PERMITTED BY LAW, ALLWINNER EXPRESSLY DISCLAIMS ALL WARRANTIES OF ANY KIND,
|
|||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION REGARDING
|
|||
|
* THE TITLE, NON-INFRINGEMENT, ACCURACY, CONDITION, COMPLETENESS, PERFORMANCE
|
|||
|
* OR MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
|||
|
* IN NO EVENT SHALL ALLWINNER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|||
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|||
|
* LOSS OF USE, DATA, OR PROFITS, OR BUSINESS INTERRUPTION)
|
|||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|||
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
|||
|
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
|
*/
|
|||
|
#include <csr.h>
|
|||
|
#include <excep.h>
|
|||
|
|
|||
|
#ifdef CONFIG_FPU_DOUBLE
|
|||
|
#define FLOAD fld
|
|||
|
#define FSTORE fsd
|
|||
|
#else
|
|||
|
#define FLOAD flw
|
|||
|
#define FSTORE fsw
|
|||
|
#endif
|
|||
|
/*
|
|||
|
* unsigned long awos_arch_task_switch(unsigned long from, unsigned long to);
|
|||
|
*/
|
|||
|
|
|||
|
.global awos_arch_task_switch
|
|||
|
awos_arch_task_switch:
|
|||
|
addi sp, sp, -14 * 4
|
|||
|
sw ra, 0*4(sp)
|
|||
|
|
|||
|
csrr t0, mstatus
|
|||
|
li t1, MR_MPIE
|
|||
|
not t1, t1
|
|||
|
li t2, MR_MPP
|
|||
|
and t0, t0, t1
|
|||
|
or t0, t0, t2
|
|||
|
sw t0, 1*4(sp)
|
|||
|
|
|||
|
sw s0, 2*4(sp)
|
|||
|
sw s1, 3*4(sp)
|
|||
|
sw s2, 4*4(sp)
|
|||
|
sw s3, 5*4(sp)
|
|||
|
sw s4, 6*4(sp)
|
|||
|
sw s5, 7*4(sp)
|
|||
|
sw s6, 8*4(sp)
|
|||
|
sw s7, 9*4(sp)
|
|||
|
sw s8, 10*4(sp)
|
|||
|
sw s9, 11*4(sp)
|
|||
|
sw s10, 12*4(sp)
|
|||
|
sw s11, 13*4(sp)
|
|||
|
|
|||
|
sw sp, 0(a0)
|
|||
|
lw sp, 0(a1)
|
|||
|
|
|||
|
jal check_gp_balance
|
|||
|
|
|||
|
# load context switch registers.
|
|||
|
lw ra, 0*4(sp)
|
|||
|
|
|||
|
# load mstatus register.
|
|||
|
lw t0, 1*4(sp)
|
|||
|
csrw mstatus,t0
|
|||
|
csrw mepc,ra
|
|||
|
|
|||
|
lw s0, 2*4(sp)
|
|||
|
lw s1, 3*4(sp)
|
|||
|
lw s2, 4*4(sp)
|
|||
|
lw s3, 5*4(sp)
|
|||
|
lw s4, 6*4(sp)
|
|||
|
lw s5, 7*4(sp)
|
|||
|
lw s6, 8*4(sp)
|
|||
|
lw s7, 9*4(sp)
|
|||
|
lw s8, 10*4(sp)
|
|||
|
lw s9, 11*4(sp)
|
|||
|
lw s10, 12*4(sp)
|
|||
|
lw s11, 13*4(sp)
|
|||
|
addi sp, sp, 4*14
|
|||
|
|
|||
|
move tp, a1
|
|||
|
#if 1
|
|||
|
mret
|
|||
|
#else
|
|||
|
#pseudo of 'jalr zero, 0(ra)'
|
|||
|
ret
|
|||
|
#endif
|
|||
|
|
|||
|
/*
|
|||
|
* void awos_arch_first_task_start(unsigned long to);
|
|||
|
* r0 --> to
|
|||
|
*/
|
|||
|
.global awos_arch_first_task_start
|
|||
|
awos_arch_first_task_start:
|
|||
|
la t0, melis_kernel_running
|
|||
|
li t1, 1
|
|||
|
sb t1, (t0)
|
|||
|
|
|||
|
lw sp, 0(a0)
|
|||
|
|
|||
|
# load context switch registers.
|
|||
|
lw ra, 0*4(sp)
|
|||
|
|
|||
|
#load mstatus register.
|
|||
|
lw t0, 1*4(sp)
|
|||
|
csrw mstatus,t0
|
|||
|
csrw mepc,ra
|
|||
|
|
|||
|
lw s0, 2*4(sp)
|
|||
|
lw s1, 3*4(sp)
|
|||
|
lw s2, 4*4(sp)
|
|||
|
lw s3, 5*4(sp)
|
|||
|
lw s4, 6*4(sp)
|
|||
|
lw s5, 7*4(sp)
|
|||
|
lw s6, 8*4(sp)
|
|||
|
lw s7, 9*4(sp)
|
|||
|
lw s8, 10*4(sp)
|
|||
|
lw s9, 11*4(sp)
|
|||
|
lw s10, 12*4(sp)
|
|||
|
lw s11, 13*4(sp)
|
|||
|
addi sp, sp, 4*14
|
|||
|
|
|||
|
move tp, a0
|
|||
|
move a1, a0
|
|||
|
move a0, zero
|
|||
|
|
|||
|
# task top exit entry to ra.
|
|||
|
move ra, s3
|
|||
|
|
|||
|
#if 1
|
|||
|
mret
|
|||
|
#else
|
|||
|
#pseudo of 'jalr zero, 0(ra)'
|
|||
|
ret
|
|||
|
#endif
|
|||
|
|
|||
|
/*
|
|||
|
* uint32_t awos_arch_chksched_start(void);
|
|||
|
*/
|
|||
|
.global awos_arch_chksched_start
|
|||
|
awos_arch_chksched_start:
|
|||
|
la t0, melis_kernel_running
|
|||
|
lbu a0, (t0)
|
|||
|
ret
|
|||
|
|
|||
|
/*
|
|||
|
* void awos_arch_save_fpu_status(fpu_context_t *);
|
|||
|
*/
|
|||
|
.global awos_arch_save_fpu_status
|
|||
|
awos_arch_save_fpu_status:
|
|||
|
li t0, SR_FS
|
|||
|
csrs mstatus, t0
|
|||
|
frcsr t1
|
|||
|
FSTORE f0, FPU_CTX_F0_F0(a0)
|
|||
|
FSTORE f1, FPU_CTX_F1_F0(a0)
|
|||
|
FSTORE f2, FPU_CTX_F2_F0(a0)
|
|||
|
FSTORE f3, FPU_CTX_F3_F0(a0)
|
|||
|
FSTORE f4, FPU_CTX_F4_F0(a0)
|
|||
|
FSTORE f5, FPU_CTX_F5_F0(a0)
|
|||
|
FSTORE f6, FPU_CTX_F6_F0(a0)
|
|||
|
FSTORE f7, FPU_CTX_F7_F0(a0)
|
|||
|
FSTORE f8, FPU_CTX_F8_F0(a0)
|
|||
|
FSTORE f9, FPU_CTX_F9_F0(a0)
|
|||
|
FSTORE f10, FPU_CTX_F10_F0(a0)
|
|||
|
FSTORE f11, FPU_CTX_F11_F0(a0)
|
|||
|
FSTORE f12, FPU_CTX_F12_F0(a0)
|
|||
|
FSTORE f13, FPU_CTX_F13_F0(a0)
|
|||
|
FSTORE f14, FPU_CTX_F14_F0(a0)
|
|||
|
FSTORE f15, FPU_CTX_F15_F0(a0)
|
|||
|
FSTORE f16, FPU_CTX_F16_F0(a0)
|
|||
|
FSTORE f17, FPU_CTX_F17_F0(a0)
|
|||
|
FSTORE f18, FPU_CTX_F18_F0(a0)
|
|||
|
FSTORE f19, FPU_CTX_F19_F0(a0)
|
|||
|
FSTORE f20, FPU_CTX_F20_F0(a0)
|
|||
|
FSTORE f21, FPU_CTX_F21_F0(a0)
|
|||
|
FSTORE f22, FPU_CTX_F22_F0(a0)
|
|||
|
FSTORE f23, FPU_CTX_F23_F0(a0)
|
|||
|
FSTORE f24, FPU_CTX_F24_F0(a0)
|
|||
|
FSTORE f25, FPU_CTX_F25_F0(a0)
|
|||
|
FSTORE f26, FPU_CTX_F26_F0(a0)
|
|||
|
FSTORE f27, FPU_CTX_F27_F0(a0)
|
|||
|
FSTORE f28, FPU_CTX_F28_F0(a0)
|
|||
|
FSTORE f29, FPU_CTX_F29_F0(a0)
|
|||
|
FSTORE f30, FPU_CTX_F30_F0(a0)
|
|||
|
FSTORE f31, FPU_CTX_F31_F0(a0)
|
|||
|
sw t1, FPU_CTX_FCSR_F0(a0)
|
|||
|
|
|||
|
# clr FS domain
|
|||
|
csrc mstatus, t0
|
|||
|
|
|||
|
# clean status woulw clr sr_sw;
|
|||
|
li t0, SR_FS_CLEAN
|
|||
|
csrs mstatus, t0
|
|||
|
ret
|
|||
|
|
|||
|
/*
|
|||
|
* void awos_arch_restore_fpu_status(fpu_context_t *);
|
|||
|
*/
|
|||
|
|
|||
|
.global awos_arch_restore_fpu_status
|
|||
|
awos_arch_restore_fpu_status:
|
|||
|
li t0, SR_FS
|
|||
|
lw t1, FPU_CTX_FCSR_F0(a0)
|
|||
|
csrs mstatus, t0
|
|||
|
FLOAD f0, FPU_CTX_F0_F0(a0)
|
|||
|
FLOAD f1, FPU_CTX_F1_F0(a0)
|
|||
|
FLOAD f2, FPU_CTX_F2_F0(a0)
|
|||
|
FLOAD f3, FPU_CTX_F3_F0(a0)
|
|||
|
FLOAD f4, FPU_CTX_F4_F0(a0)
|
|||
|
FLOAD f5, FPU_CTX_F5_F0(a0)
|
|||
|
FLOAD f6, FPU_CTX_F6_F0(a0)
|
|||
|
FLOAD f7, FPU_CTX_F7_F0(a0)
|
|||
|
FLOAD f8, FPU_CTX_F8_F0(a0)
|
|||
|
FLOAD f9, FPU_CTX_F9_F0(a0)
|
|||
|
FLOAD f10,FPU_CTX_F10_F0(a0)
|
|||
|
FLOAD f11,FPU_CTX_F11_F0(a0)
|
|||
|
FLOAD f12,FPU_CTX_F12_F0(a0)
|
|||
|
FLOAD f13,FPU_CTX_F13_F0(a0)
|
|||
|
FLOAD f14,FPU_CTX_F14_F0(a0)
|
|||
|
FLOAD f15,FPU_CTX_F15_F0(a0)
|
|||
|
FLOAD f16,FPU_CTX_F16_F0(a0)
|
|||
|
FLOAD f17,FPU_CTX_F17_F0(a0)
|
|||
|
FLOAD f18,FPU_CTX_F18_F0(a0)
|
|||
|
FLOAD f19,FPU_CTX_F19_F0(a0)
|
|||
|
FLOAD f20,FPU_CTX_F20_F0(a0)
|
|||
|
FLOAD f21,FPU_CTX_F21_F0(a0)
|
|||
|
FLOAD f22,FPU_CTX_F22_F0(a0)
|
|||
|
FLOAD f23,FPU_CTX_F23_F0(a0)
|
|||
|
FLOAD f24,FPU_CTX_F24_F0(a0)
|
|||
|
FLOAD f25,FPU_CTX_F25_F0(a0)
|
|||
|
FLOAD f26,FPU_CTX_F26_F0(a0)
|
|||
|
FLOAD f27,FPU_CTX_F27_F0(a0)
|
|||
|
FLOAD f28,FPU_CTX_F28_F0(a0)
|
|||
|
FLOAD f29,FPU_CTX_F29_F0(a0)
|
|||
|
FLOAD f30,FPU_CTX_F30_F0(a0)
|
|||
|
FLOAD f31,FPU_CTX_F31_F0(a0)
|
|||
|
fscsr t1
|
|||
|
|
|||
|
# clr FS domain
|
|||
|
csrc mstatus, t0
|
|||
|
|
|||
|
# clean status woulw clr sr_sw;
|
|||
|
li t0, SR_FS_CLEAN
|
|||
|
csrs mstatus, t0
|
|||
|
ret
|
|||
|
|
|||
|
/*
|
|||
|
* void check_gp_balance(void);
|
|||
|
*/
|
|||
|
.global check_gp_balance
|
|||
|
check_gp_balance:
|
|||
|
.gplwr:
|
|||
|
auipc a2, %pcrel_hi(__global_pointer$)
|
|||
|
addi a2, a2,%pcrel_lo(.gplwr)
|
|||
|
|
|||
|
1: # x3 is gp in abi
|
|||
|
bne gp, a2,1b
|
|||
|
ret
|
|||
|
|
|||
|
/*
|
|||
|
* void delay_10insn(void);
|
|||
|
*/
|
|||
|
.global delay_10insn
|
|||
|
delay_10insn:
|
|||
|
li a0, 10
|
|||
|
beqz a0, 2f
|
|||
|
1:
|
|||
|
addi a0, a0, -1
|
|||
|
.rept 5
|
|||
|
nop
|
|||
|
.endr
|
|||
|
bnez a0, 1b
|
|||
|
2:
|
|||
|
ret
|
|||
|
|
|||
|
.end
|