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#ifndef ARMV7_M_EXC_H
16#define ARMV7_M_EXC_H
17
18#include "prt_typedef.h"
19#include "prt_sys.h"
20
21#ifdef __cplusplus
22#if __cplusplus
23extern "C" {
24#endif /* __cpluscplus */
25#endif /* __cpluscplus */
26
27/*
28 * 寄存器信息结构
29 *
30 * 描述:MX平台下的异常触发时保存的寄存器信息。
31 *
32 * 注意:以下寄存器名称对应芯片手册中的寄存器名称。
33 */
34struct ExcContext {
35    U32 r4; /* R4寄存器 */
36    U32 r5; /* R5寄存器 */
37    U32 r6; /* R6寄存器 */
38    U32 r7; /* R7寄存器 */
39    U32 r8; /* R8寄存器 */
40    U32 r9; /* R9寄存器 */
41    U32 r10; /* R10寄存器 */
42    U32 r11; /* R11寄存器 */
43    U32 basePri; /* 中断优先级屏蔽寄存器 */
44    U32 sp; /* 程序栈指针 */
45    U32 r0; /* RO寄存器 */
46    U32 r1; /* R1寄存器 */
47    U32 r2; /* R2寄存器 */
48    U32 r3; /* R3寄存器 */
49    U32 r12; /* R12寄存器 */
50    U32 lr; /* 程序返回地址,即异常时的下一条指令 */
51    U32 pc; /* 异常时的PC指针 */
52    U32 xpsr; /* xpsr程序状态寄存器 */
53};
54
55/*
56 * 异常信息结构体
57 *
58 * 描述:MX平台下的异常触发时保存的异常信息。
59 *
60 */
61struct ExcRegInfo {
62    /*
63     * 上一次异常类型, bit16标示FaultAddr域是否有效,bit8~bit15表示当发生HardFault时的子异常错误类型,
64     * bit0~bit7表示异常时的主异常错误类型
65     */
66    U32 excType;
67    /* 若为精确地址访问错误表示异常发生时的错误访问地址,其它为缺省值0xABABABAB */
68    U32 faultAddr;
69    /* 异常发生时刻的硬件上下文 */
70    struct ExcContext *context;
71};
72
73/*
74 * 用户可以看到异常信息
75 */
76struct ExcInfo {
77    /* OS版本号 */
78    char osVer[OS_SYS_OS_VER_LEN];
79    /* 产品版本号 */
80    char appVer[OS_SYS_APP_VER_LEN];
81    /* 异常原因 */
82    U32 excCause;
83    /* 异常前的线程类型 */
84    U32 threadType;
85    /* 异常前的线程ID */
86    U32 threadId;
87    /* 字节序 */
88    U16 byteOrder;
89    /* CPU类型 */
90    U16 cpuType;
91    /* CPU ID */
92    U32 coreId;
93    /* CPU Tick */
94    U64 cpuTick;
95    /* 异常嵌套计数 */
96    U32 nestCnt;
97    /* 异常前栈指针 */
98    U32 sp;
99    /* 异常前栈底 */
100    U32 stackBottom;
101    /*
102     * 异常发生时的核内寄存器上下文信息,82\57必须位于152字节处,
103     * 若有改动,需更新prt_asm_cpu_external.h中的OS_EXC_REGINFO_OFFSET宏
104     */
105    struct ExcRegInfo regInfo;
106};
107
108/*
109 * Cortex-MX异常具体类型:总线状态寄存器入栈时发生错误。
110 */
111#define OS_EXC_BF_STKERR 1
112
113/*
114 * Cortex-MX异常具体类型:总线状态寄存器出栈时发生错误。
115 */
116#define OS_EXC_BF_UNSTKERR 2
117
118/*
119 * Cortex-MX异常具体类型:总线状态寄存器不精确的数据访问违例。
120 */
121#define OS_EXC_BF_IMPRECISERR 3
122
123/*
124 * Cortex-MX异常具体类型:总线状态寄存器精确的数据访问违例。
125 */
126#define OS_EXC_BF_PRECISERR 4
127
128/*
129 * Cortex-MX异常具体类型:总线状态寄存器取指时的访问违例。
130 */
131#define OS_EXC_BF_IBUSERR 5
132
133/*
134 * Cortex-MX异常具体类型:存储器管理状态寄存器入栈时发生错误。
135 */
136#define OS_EXC_MF_MSTKERR 6
137
138/*
139 * Cortex-MX异常具体类型:存储器管理状态寄存器出栈时发生错误。
140 */
141#define OS_EXC_MF_MUNSTKERR 7
142
143/*
144 * Cortex-MX异常具体类型:存储器管理状态寄存器数据访问违例。
145 */
146#define OS_EXC_MF_DACCVIOL 8
147
148/*
149 * Cortex-MX异常具体类型:存储器管理状态寄存器取指访问违例。
150 */
151#define OS_EXC_MF_IACCVIOL 9
152
153/*
154 * Cortex-MX异常具体类型:用法错误,表示除法运算时除数为零。
155 */
156#define OS_EXC_UF_DIVBYZERO 10
157
158/*
159 * Cortex-MX异常具体类型:用法错误,未对齐访问导致的错误。
160 */
161#define OS_EXC_UF_UNALIGNED 11
162
163/*
164 * Cortex-MX异常具体类型:用法错误,试图执行协处理器相关指令。
165 */
166#define OS_EXC_UF_NOCP 12
167
168/*
169 * Cortex-MX异常具体类型:用法错误,在异常返回时试图非法地加载EXC_RETURN到PC。
170 */
171#define OS_EXC_UF_INVPC 13
172
173/*
174 * Cortex-MX异常具体类型:用法错误,试图切入ARM状态。
175 */
176#define OS_EXC_UF_INVSTATE 14
177
178/*
179 * Cortex-MX异常具体类型:用法错误,执行的指令其编码是未定义的——解码不能。
180 */
181#define OS_EXC_UF_UNDEFINSTR 15
182
183/*
184 * Cortex-MX异常具体类型:NMI中断。
185 */
186#define OS_EXC_CAUSE_NMI 16
187
188/*
189 * Cortex-MX异常具体类型:硬fault。
190 */
191#define OS_EXC_CAUSE_HARDFAULT 17
192
193/*
194 * Cortex-MX异常具体类型:致命错误。
195 */
196#define OS_EXC_CAUSE_FATAL_ERR 18
197
198/*
199 * Cortex-MX异常具体类型:维测事件导致的硬fault。
200 */
201#define OS_EXC_CAUSE_DBGEVT 19
202
203/*
204 * Cortex-MX异常具体类型:取向量时发生的硬fault。
205 */
206#define OS_EXC_CAUSE_VECTBL 20
207
208#ifdef __cplusplus
209#if __cplusplus
210}
211#endif /* __cpluscplus */
212#endif /* __cpluscplus */
213
214#endif /* ARMV7_M_EXC_H */
215