405 lines
9.1 KiB
ArmAsm
405 lines
9.1 KiB
ArmAsm
/*
|
|
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
|
|
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without modification,
|
|
* are permitted provided that the following conditions are met:
|
|
*
|
|
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
|
* conditions and the following disclaimer.
|
|
*
|
|
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
|
* of conditions and the following disclaimer in the documentation and/or other materials
|
|
* provided with the distribution.
|
|
*
|
|
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
|
|
* to endorse or promote products derived from this software without specific prior written
|
|
* permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
|
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
|
* CONTRIBUTORS 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 "los_arch_regs.h"
|
|
#include "los_arch_macro.h"
|
|
|
|
.extern HalInterrupt
|
|
.extern UserException
|
|
|
|
.section .iram,"ax"
|
|
.literal_position
|
|
.type HandleEntry,@function
|
|
.align 4
|
|
HandleEntry:
|
|
|
|
mov a0, sp
|
|
addi sp, sp, -CONTEXT_SIZE
|
|
|
|
PUSH_ALL_REG a1
|
|
s32i a0, sp, CONTEXT_OFF_A1
|
|
rsr a0, EPC1
|
|
s32i a0, sp, CONTEXT_OFF_PC
|
|
rsr a0, EXCSAVE1
|
|
s32i a0, sp, CONTEXT_OFF_A0
|
|
|
|
wsr a1, EXCSAVE1
|
|
l32i a1, a1, CONTEXT_OFF_A1
|
|
call0 SpillWindow
|
|
rsr a1, EXCSAVE1
|
|
rsr a0, EXCCAUSE
|
|
s32i a0, sp, CONTEXT_OFF_EXCCAUSE
|
|
rsr a0, EXCVADDR
|
|
s32i a0, sp, CONTEXT_OFF_EXCVADDR
|
|
movi a0, INT_MASK | USER_VECTOR_MODE | WOE_ENABLE
|
|
wsr a0, PS
|
|
|
|
rsr a6, EPC1
|
|
mov a7, sp
|
|
rsr a8, EXCCAUSE
|
|
call4 HalExcHandleEntry
|
|
1:
|
|
j 1b
|
|
|
|
.begin literal_prefix .DebugExceptionHandler
|
|
.section .DebugExceptionHandler.text, "ax"
|
|
.global DebugExceptionHandler
|
|
.align 4
|
|
.literal_position
|
|
DebugExceptionHandler:
|
|
|
|
call0 UserException
|
|
|
|
.end literal_prefix
|
|
|
|
.begin literal_prefix .NMIExceptionHandler
|
|
.section .NMIExceptionHandler.text, "ax"
|
|
.global NMIExceptionHandler
|
|
.align 4
|
|
.literal_position
|
|
NMIExceptionHandler:
|
|
|
|
call0 UserException
|
|
|
|
.end literal_prefix
|
|
|
|
.begin literal_prefix .DoubleExceptionHandler
|
|
.section .DoubleExceptionHandler.text, "ax"
|
|
.global DoubleExceptionHandler
|
|
.align 4
|
|
.literal_position
|
|
DoubleExceptionHandler:
|
|
|
|
call0 UserException
|
|
|
|
.end literal_prefix
|
|
|
|
.begin literal_prefix .KernelExceptionHandler
|
|
.section .KernelExceptionHandler.text, "ax"
|
|
.global KernelExceptionHandler
|
|
.align 4
|
|
.literal_position
|
|
KernelExceptionHandler:
|
|
|
|
wsr a0, EXCSAVE1
|
|
call0 KernelException
|
|
|
|
.end literal_prefix
|
|
|
|
.section .iram,"ax"
|
|
.align 4
|
|
KernelException:
|
|
|
|
movi a0,5
|
|
wsr a0,EXCCAUSE
|
|
call0 UserException
|
|
rfe
|
|
|
|
.begin literal_prefix .UserExceptionHandler
|
|
.section .UserExceptionHandler.text, "ax"
|
|
.global UserExceptionHandler
|
|
.type UserExceptionHandler,@function
|
|
.align 4
|
|
.literal_position
|
|
UserExceptionHandler:
|
|
|
|
wsr a0, EXCSAVE1
|
|
call0 UserException
|
|
|
|
.end literal_prefix
|
|
|
|
.section .iram,"ax"
|
|
.type UserException,@function
|
|
.align 4
|
|
UserException:
|
|
|
|
rsr a0, EXCCAUSE
|
|
beqi a0, LEVEL1_TINRERRUPT_CAUSE, InterruptEntry1
|
|
beqi a0, ALLOC_CAUSE, AllocHandel
|
|
call0 HandleEntry
|
|
1:
|
|
j 1b
|
|
|
|
.section .iram,"ax"
|
|
.type AllocHandel,@function
|
|
.align 4
|
|
AllocHandel:
|
|
call0 AllocHandelEntry
|
|
|
|
.section .iram,"ax"
|
|
.type InterruptEntry1,@function
|
|
.align 4
|
|
InterruptEntry1:
|
|
|
|
mov a0, sp
|
|
addi sp, sp, -CONTEXT_SIZE
|
|
|
|
PUSH_ALL_REG a1
|
|
|
|
s32i a0, sp, CONTEXT_OFF_A1
|
|
rsr a0, EPC1
|
|
s32i a0, sp, CONTEXT_OFF_PC
|
|
rsr a0, EXCSAVE1
|
|
s32i a0, sp, CONTEXT_OFF_A0
|
|
|
|
wsr a1, EXCSAVE1
|
|
l32i a1, a1, CONTEXT_OFF_A1
|
|
call0 SpillWindow
|
|
rsr a1, EXCSAVE1
|
|
|
|
movi a0, LEVEL1_INT_MASK | USER_VECTOR_MODE | WOE_ENABLE
|
|
wsr a0, PS
|
|
rsync
|
|
|
|
call4 HalInterrupt
|
|
mov a2, a1
|
|
POP_ALL_REG a2 EPC1 PS
|
|
rfe
|
|
|
|
.begin literal_prefix .InterruptEntry2
|
|
.section .InterruptEntry2.text, "ax"
|
|
.global InterruptEntry2
|
|
.type InterruptEntry2,@function
|
|
.align 4
|
|
.literal_position
|
|
InterruptEntry2:
|
|
|
|
wsr a0, EXCSAVE2
|
|
movi a4, LEVEL2
|
|
call0 HandleEntry
|
|
|
|
.end literal_prefix
|
|
|
|
.begin literal_prefix .InterruptEntry3
|
|
.section .InterruptEntry3.text, "ax"
|
|
.global InterruptEntry3
|
|
.type InterruptEntry3,@function
|
|
.align 4
|
|
.literal_position
|
|
InterruptEntry3:
|
|
|
|
wsr a0, EXCSAVE3
|
|
movi a4, LEVEL3
|
|
call0 HandleEntry
|
|
|
|
.end literal_prefix
|
|
|
|
.begin literal_prefix .InterruptEntry4
|
|
.section .InterruptEntry4.text, "ax"
|
|
.global InterruptEntry4
|
|
.type InterruptEntry4,@function
|
|
.align 4
|
|
.literal_position
|
|
InterruptEntry4:
|
|
|
|
wsr a0, EXCSAVE4
|
|
movi a4, LEVEL4
|
|
call0 HandleEntry
|
|
|
|
.end literal_prefix
|
|
|
|
.begin literal_prefix .InterruptEntry5
|
|
.section .InterruptEntry5.text, "ax"
|
|
.global InterruptEntry5
|
|
.type InterruptEntry5,@function
|
|
.align 4
|
|
.literal_position
|
|
InterruptEntry5:
|
|
|
|
wsr a0, EXCSAVE5
|
|
movi a4, LEVEL5
|
|
call0 HandleEntry
|
|
|
|
.end literal_prefix
|
|
|
|
.section .WindowVectors.text, "ax"
|
|
|
|
.org 0x0
|
|
.global OverFlowGroup1
|
|
OverFlowGroup1:
|
|
|
|
addi a5, a5, -16
|
|
s32i a3, a5, 12
|
|
s32i a2, a5, 8
|
|
s32i a1, a5, 4
|
|
s32i a0, a5, 0
|
|
addi a5, a5, 16
|
|
rfwo
|
|
|
|
.org 0x40
|
|
.global UnderFlowGroup1
|
|
UnderFlowGroup1:
|
|
|
|
addi a5, a5, -16
|
|
l32i a3, a5, 12
|
|
l32i a2, a5, 8
|
|
l32i a1, a5, 4
|
|
l32i a0, a5, 0
|
|
addi a5, a5, 16
|
|
rfwu
|
|
|
|
.org 0x80
|
|
.global OverFlowGroup2
|
|
OverFlowGroup2:
|
|
|
|
addi a9, a9, -16
|
|
s32i a3, a9, 12
|
|
s32i a2, a9, 8
|
|
s32i a1, a9, 4
|
|
s32i a0, a9, 0
|
|
addi a9, a9, 16
|
|
|
|
addi a1, a1, -12
|
|
l32i a0, a1, 0
|
|
addi a1, a1, 12
|
|
|
|
addi a0, a0, -32
|
|
|
|
s32i a7, a0, 12
|
|
s32i a6, a0, 8
|
|
s32i a5, a0, 4
|
|
s32i a4, a0, 0
|
|
|
|
rfwo
|
|
|
|
.org 0xC0
|
|
.global UnderFlowGroup2
|
|
UnderFlowGroup2:
|
|
|
|
addi a9, a9, -16
|
|
l32i a3, a9, 12
|
|
l32i a2, a9, 8
|
|
l32i a1, a9, 4
|
|
l32i a0, a9, 0
|
|
addi a9, a9, 16
|
|
|
|
addi a1, a1, -12
|
|
l32i a4, a1, 0
|
|
addi a1, a1, 12
|
|
|
|
addi a4, a4, -32
|
|
l32i a7, a4, 12
|
|
l32i a6, a4, 8
|
|
l32i a5, a4, 4
|
|
l32i a4, a4, 0
|
|
rfwu
|
|
|
|
.org 0x100
|
|
.global OverFlowGroup3
|
|
OverFlowGroup3:
|
|
|
|
addi a13, a13, -16
|
|
s32i a3, a13, 12
|
|
s32i a2, a13, 8
|
|
s32i a1, a13, 4
|
|
s32i a0, a13, 0
|
|
addi a13, a13, 16
|
|
|
|
addi a1, a1, -12
|
|
l32i a0, a1, 0
|
|
addi a1, a1, 12
|
|
|
|
addi a0, a0, -48
|
|
|
|
s32i a11, a0, 28
|
|
s32i a10, a0, 24
|
|
s32i a9, a0, 20
|
|
s32i a8, a0, 16
|
|
s32i a7, a0, 12
|
|
s32i a6, a0, 8
|
|
s32i a5, a0, 4
|
|
s32i a4, a0, 0
|
|
rfwo
|
|
|
|
.org 0x140
|
|
.global UnderFlowGroup3
|
|
UnderFlowGroup3:
|
|
|
|
addi a13, a13, -16
|
|
l32i a3, a13, 12
|
|
l32i a2, a13, 8
|
|
l32i a1, a13, 4
|
|
l32i a0, a13, 0
|
|
addi a13, a13, 16
|
|
|
|
addi a1, a1, -12
|
|
l32i a4, a1, 0
|
|
addi a1, a1, 12
|
|
|
|
addi a4, a4, -48
|
|
l32i a11, a0, 28
|
|
l32i a10, a0, 24
|
|
l32i a9, a0, 20
|
|
l32i a8, a0, 16
|
|
l32i a7, a4, 12
|
|
l32i a6, a4, 8
|
|
l32i a5, a4, 4
|
|
l32i a4, a4, 0
|
|
rfwu
|
|
|
|
.section .userVector,"ax"
|
|
.type AllocHandelEntry,@function
|
|
.align 4
|
|
AllocHandelEntry:
|
|
|
|
addi a1, a1, -(CONTEXT_OFF_A4 - CONTEXT_OFF_A0)
|
|
s32i a2, a1, (CONTEXT_OFF_A2 - CONTEXT_OFF_A0)
|
|
s32i a3, a1, (CONTEXT_OFF_A3 - CONTEXT_OFF_A0)
|
|
|
|
rsr a0, PS
|
|
rsr a2, WINDOWBASE
|
|
extui a3, a0, PS_OWB_SHIFT, WINDOWBASEBITS
|
|
xor a3, a3, a2
|
|
slli a3, a3, PS_OWB_SHIFT
|
|
xor a0, a0, a3
|
|
wsr a0, PS
|
|
rsr a0, EXCSAVE1
|
|
|
|
l32i a2, a1, (CONTEXT_OFF_A2 - CONTEXT_OFF_A0)
|
|
l32i a3, a1, (CONTEXT_OFF_A3 - CONTEXT_OFF_A0)
|
|
addi a1, a1, (CONTEXT_OFF_A4 - CONTEXT_OFF_A0)
|
|
rsync
|
|
|
|
rotw -1
|
|
bbci a4, HIGHBIT_CALLNMODE, UnderFlowGroup1
|
|
rotw -1
|
|
bbci a8, LOWBIT_CALLNMODE, UnderFlowGroup2
|
|
rotw -1
|
|
j UnderFlowGroup3
|
|
|
|
.global EnableExceptionInterface
|
|
.section .iram,"ax"
|
|
.type EnableExceptionInterface,@function
|
|
.align 4
|
|
EnableExceptionInterface:
|
|
entry a1,16
|
|
retw
|