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