• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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