• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (c) 2022-2022 Huawei Technologies Co., Ltd. All rights reserved.
3 *
4 * UniProton is licensed under Mulan PSL v2.
5 * You can use this software according to the terms and conditions of the Mulan PSL v2.
6 * You may obtain a copy of Mulan PSL v2 at:
7 *          http://license.coscl.org.cn/MulanPSL2
8 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
9 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
10 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
11 * See the Mulan PSL v2 for more details.
12 * Create: 2022-11-22
13 * Description: 异常处理的汇编部分。
14 */
15
16#include "prt_asm_cpu_external.h"
17
18    .global OsExcHandleEntry
19    .type   OsExcHandleEntry, function
20    .equ OS_TSKCONTEXT_SIZE, 0x120
21
22// save x2~x30, xzr
23.macro GENERAL_REGS_SAVE
24    stp    x3, x2, [sp,#-16]!
25    stp    x5, x4, [sp,#-16]!
26    stp    x7, x6, [sp,#-16]!
27    stp    x9, x8, [sp,#-16]!
28    stp    x11, x10, [sp,#-16]!
29    stp    x13, x12, [sp,#-16]!
30    stp    x15, x14, [sp,#-16]!
31    stp    x17, x16, [sp,#-16]!
32    stp    x19, x18, [sp,#-16]!
33    stp    x21, x20, [sp,#-16]!
34    stp    x23, x22, [sp,#-16]!
35    stp    x25, x24, [sp,#-16]!
36    stp    x27, x26, [sp,#-16]!
37    stp    x29, x28, [sp,#-16]!
38    stp    xzr, x30, [sp,#-16]!
39.endm
40
41.macro ELX_REGS_INIT
42    mov    x10, xzr
43    mov    x11, xzr
44    mov    x12, xzr
45    mov    x13, xzr
46    mov    x14, xzr
47    mov    x15, xzr
48    mov    x16, xzr
49    mov    x17, xzr
50    mov    x18, xzr
51    mov    x19, xzr
52.endm
53
54.section .os.init.text, "ax"
55
56    .globl OsSaveElxRegs
57    .type OsSaveElxRegs, @function
58    .align 4
59OsSaveElxRegs:
60    stp    x18, x19, [sp,#-16]!
61    stp    x16, x17, [sp,#-16]!
62    stp    x14, x15, [sp,#-16]!
63    stp    x12, x13, [sp,#-16]!
64    stp    x10, x11, [sp,#-16]!
65    ret
66
67    .globl OsExcDispatch
68    .type OsExcDispatch, @function
69    .align 4
70OsExcDispatch:
71    GENERAL_REGS_SAVE
72
73    mrs    x5, esr_el1
74    mrs    x4, far_el1
75    mrs    x3, spsr_el1
76    mrs    x2, elr_el1
77    stp    x4, x5, [sp,#-16]!
78    stp    x2, x3, [sp,#-16]!
79
80    mov    x0, sp
81
82    /* (X19-X29) These registers are saved in the callee frame.  */
83    mov    x22, x1 // x22: save excType
84    /* 异常后又压栈了TskContext大小 */
85    /* 记录异常发生现场时需要把这部分退栈回去 */
86    add    x21, sp, #OS_TSKCONTEXT_SIZE // x21: callee-save, x21=original sp
87    BL     OsSwitchToSysStack
88    mov    sp, x0
89
90    mrs    x20, CurrentEL
91    mrs    x19, vbar_el1
92    mrs    x18, sctlr_el1
93    mrs    x17, mair_el1
94    mrs    x16, tcr_el1
95    mrs    x15, ttbr1_el1
96    mrs    x14, ttbr0_el1
97    stp    x20, x21, [sp,#-16]!
98    stp    x18, x19, [sp,#-16]!
99    stp    x16, x17, [sp,#-16]!
100    stp    x14, x15, [sp,#-16]!
101
102    mov    w0, w22
103    mov    x1, sp
104    bl     OsExcHandleEntry
105
106    sub    x21, x21, #OS_TSKCONTEXT_SIZE
107    mov    sp, x21 // x21=original sp
108    ldp    x2, x3, [sp],#16
109    add    sp, sp, #16        // 跳过far, esr, HCR_EL2.TRVM==1的时候,EL1不能写far, esr
110    msr    spsr_el1, x3
111    msr    elr_el1, x2
112    dsb    sy
113    isb
114
115    ldp    xzr, x30, [sp,#16]
116    ldp    x29, x28, [sp],#16
117    ldp    x27, x26, [sp],#16
118    ldp    x25, x24, [sp],#16
119    ldp    x23, x22, [sp],#16
120    ldp    x21, x20, [sp],#16
121    ldp    x19, x18, [sp],#16
122    ldp    x17, x16, [sp],#16
123    ldp    x15, x14, [sp],#16
124    ldp    x13, x12, [sp],#16
125    ldp    x11, x10, [sp],#16
126    ldp    x9, x8, [sp],#16
127    ldp    x7, x6, [sp],#16
128    ldp    x5, x4, [sp],#16
129    ldp    x3, x2, [sp],#16
130    ldp    x1, x0, [sp],#16
131    eret
132
133    .text
134