1 /*
2 * Copyright (c) 2009-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: 2009-12-22
13 * Description: 错误处理函数文件
14 */
15 #include "prt_sys_external.h"
16 #include "prt_task_external.h"
17 #include "prt_err_internal.h"
18
19 OS_SEC_L4_BSS U32 g_normalErrorNo;
20 OS_SEC_L4_BSS U32 g_fatalErrorNo;
21
22 /*
23 * 描述:设置致命错误码
24 */
OsFatalErrSet(U32 faltError)25 OS_SEC_ALW_INLINE INLINE void OsFatalErrSet(U32 faltError)
26 {
27 g_fatalErrorNo = faltError;
28 }
29
OsErrRecordInCda(U32 errorNo)30 OS_SEC_L4_TEXT void OsErrRecordInCda(U32 errorNo)
31 {
32 g_normalErrorNo = errorNo;
33 }
34
35 /* 返回上次错误,并清零 */
OsFatalErrClr(void)36 OS_SEC_L4_TEXT U32 OsFatalErrClr(void)
37 {
38 U32 oldFatalErr;
39 oldFatalErr = g_fatalErrorNo;
40 g_fatalErrorNo = 0;
41 return oldFatalErr;
42 }
43
OsErrRecord(U32 errorNo)44 OS_SEC_L4_TEXT void OsErrRecord(U32 errorNo)
45 {
46 enum SysThreadType curThreadType;
47 uintptr_t interruptSave;
48
49 struct TagTskCb *taskCb = NULL;
50
51 interruptSave = OsIntLock();
52 curThreadType = OsCurThreadType();
53 if (curThreadType == SYS_TASK) {
54 taskCb = GET_TCB_HANDLE(RUNNING_TASK->taskPid);
55 taskCb->lastErr = errorNo;
56 }
57
58 OsIntRestore(interruptSave);
59 }
60
OsErrHandle(const char * fileName,U32 lineNo,U32 errorNo,U32 paraLen,void * para)61 OS_SEC_L4_TEXT void OsErrHandle(const char *fileName, U32 lineNo, U32 errorNo, U32 paraLen, void *para)
62 {
63 OS_ERR_CALL_USR_HOOK(fileName, lineNo, errorNo, paraLen, para);
64
65 /* 表示用户调用,回调用户钩子后返回 */
66 if (lineNo != OS_ERR_MAGIC_WORD) {
67 return;
68 }
69
70 OsErrRecord(errorNo);
71
72 /* 致命错误流程:记录trace、触发异常,高8bit为03的时候为致命错误 */
73 if ((errorNo & OS_ERROR_TYPE_MASK) == ERRTYPE_FATAL) {
74 OsFatalErrSet(errorNo);
75 /* 调用ill指令触发异常 */
76 OsAsmIll();
77 }
78 }
79
80 /*
81 * 描述:错误处理函数
82 */
PRT_ErrHandle(const char * fileName,U32 lineNo,U32 errorNo,U32 paraLen,void * para)83 OS_SEC_L4_TEXT U32 PRT_ErrHandle(const char *fileName, U32 lineNo, U32 errorNo, U32 paraLen, void *para)
84 {
85 OsErrHandle(fileName, lineNo, errorNo, paraLen, para);
86
87 return OS_OK;
88 }
89