更新日期: 2022/06/01 来源: https://gitee.com/weharmony/kernel_liteos_a_note
los_exc_pri.h 文件参考

浏览源代码.

结构体

struct  IpInfo
 

函数

UINT32 OsGetSystemStatus (VOID)
 获取系统状态 更多...
 
VOID BackTraceSub (UINTPTR regFP)
 
VOID OsExcInit (VOID)
 异常接管模块的初始化 更多...
 
BOOL OsSystemExcIsReset (VOID)
 
UINT32 BackTraceGet (UINTPTR regFP, IpInfo *callChain, UINT32 maxDepth)
 
BOOL OsGetUsrIpInfo (UINTPTR ip, IpInfo *info)
 

函数说明

◆ BackTraceGet()

UINT32 BackTraceGet ( UINTPTR  regFP,
IpInfo callChain,
UINT32  maxDepth 
)

在文件 los_exc.c850 行定义.

851{
852 UINTPTR tmpFP, backLR;
853 UINTPTR stackStart, stackEnd;
854 UINTPTR backFP = regFP;
855 UINT32 count = 0;
856 BOOL ret;
857 VADDR_T kvaddr;
858
859 if (FindSuitableStack(regFP, &stackStart, &stackEnd, &kvaddr) == FALSE) {
860 if (callChain == NULL) {
861 PrintExcInfo("traceback error fp = 0x%x\n", regFP);
862 }
863 return 0;
864 }
865
866 /*
867 * Check whether it is the leaf function.
868 * Generally, the frame pointer points to the address of link register, while in the leaf function,
869 * there's no function call, and compiler will not store the link register, but the frame pointer
870 * will still be stored and updated. In that case we needs to find the right position of frame pointer.
871 */
872 tmpFP = *(UINTPTR *)(UINTPTR)kvaddr;
873 if (IsValidFP(tmpFP, stackStart, stackEnd, NULL) == TRUE) {
874 backFP = tmpFP;
875 if (callChain == NULL) {
876 PrintExcInfo("traceback fp fixed, trace using fp = 0x%x\n", backFP);
877 }
878 }
879
880 while (IsValidFP(backFP, stackStart, stackEnd, &kvaddr) == TRUE) {
881 tmpFP = backFP;
882#ifdef LOSCFG_COMPILER_CLANG_LLVM
883 backFP = *(UINTPTR *)(UINTPTR)kvaddr;
884 if (IsValidFP(tmpFP + POINTER_SIZE, stackStart, stackEnd, &kvaddr) == FALSE) {
885 if (callChain == NULL) {
886 PrintExcInfo("traceback backLR check failed, backLP: 0x%x\n", tmpFP + POINTER_SIZE);
887 }
888 return 0;
889 }
890 backLR = *(UINTPTR *)(UINTPTR)kvaddr;
891#else
892 backLR = *(UINTPTR *)(UINTPTR)kvaddr;
893 if (IsValidFP(tmpFP - POINTER_SIZE, stackStart, stackEnd, &kvaddr) == FALSE) {
894 if (callChain == NULL) {
895 PrintExcInfo("traceback backFP check failed, backFP: 0x%x\n", tmpFP - POINTER_SIZE);
896 }
897 return 0;
898 }
899 backFP = *(UINTPTR *)(UINTPTR)kvaddr;
900#endif
901 IpInfo info = {0};
902 ret = OsGetUsrIpInfo((VADDR_T)backLR, &info);
903 if (callChain == NULL) {
904 PrintExcInfo("traceback %u -- lr = 0x%x fp = 0x%x ", count, backLR, backFP);
905 if (ret) {
906#ifdef LOSCFG_KERNEL_VM
907 PrintExcInfo("lr in %s --> 0x%x\n", info.f_path, info.ip);
908#else
909 PrintExcInfo("\n");
910#endif
911 } else {
912 PrintExcInfo("\n");
913 }
914 } else {
915 (VOID)memcpy_s(&callChain[count], sizeof(IpInfo), &info, sizeof(IpInfo));
916 }
917 count++;
918 if ((count == maxDepth) || (backFP == tmpFP)) {
919 break;
920 }
921 }
922 return count;
923}
BOOL OsGetUsrIpInfo(UINTPTR ip, IpInfo *info)
Definition: los_exc.c:804
STATIC INLINE BOOL IsValidFP(UINTPTR regFP, UINTPTR start, UINTPTR end, vaddr_t *vaddr)
此函数用于验证fp或验证检查开始和结束范围
Definition: los_exc.c:716
STATIC INLINE BOOL FindSuitableStack(UINTPTR regFP, UINTPTR *start, UINTPTR *end, vaddr_t *vaddr)
找到一个合适的栈
Definition: los_exc.c:747
VOID PrintExcInfo(const CHAR *fmt,...)
打印异常信息
Definition: los_printf.c:263
unsigned long VADDR_T
Definition: los_typedef.h:208
unsigned long UINTPTR
Definition: los_typedef.h:68
unsigned int UINT32
Definition: los_typedef.h:57
size_t BOOL
Definition: los_typedef.h:88
UINTPTR ip
Definition: los_exc_pri.h:51
CHAR f_path[REGION_PATH_MAX]
Definition: los_exc_pri.h:53
函数调用图:
这是这个函数的调用关系图:

◆ BackTraceSub()

VOID BackTraceSub ( UINTPTR  regFP)

在文件 los_exc.c925 行定义.

926{
927 (VOID) BackTraceGet(regFP, NULL, OS_MAX_BACKTRACE);
928}
UINT32 BackTraceGet(UINTPTR regFP, IpInfo *callChain, UINT32 maxDepth)
Definition: los_exc.c:850
函数调用图:
这是这个函数的调用关系图:

◆ OsExcInit()

VOID OsExcInit ( VOID  )

异常接管模块的初始化

在文件 los_exc.c937 行定义.

938{
939 OsExcStackInfoReg(g_excStack, sizeof(g_excStack) / sizeof(g_excStack[0])); //异常模式下注册内核栈信息
940}
STATIC const StackInfo g_excStack[]
Definition: los_exc.c:176
VOID OsExcStackInfoReg(const StackInfo *stackInfo, UINT32 stackNum)
注册栈信息
函数调用图:
这是这个函数的调用关系图:

◆ OsGetSystemStatus()

UINT32 OsGetSystemStatus ( VOID  )

获取系统状态

在文件 los_exc.c181 行定义.

182{
183 UINT32 flag;
184 UINT32 cpuid = g_currHandleExcCpuid; //全局变量 当前执行CPU ID
185
186 if (cpuid == INVALID_CPUID) { //当前CPU处于空闲状态的情况
187 flag = OS_SYSTEM_NORMAL;
188 } else if (cpuid == ArchCurrCpuid()) { //碰到了正在执行此处代码的CPU core
189 flag = OS_SYSTEM_EXC_CURR_CPU; //当前CPU
190 } else {
191 flag = OS_SYSTEM_EXC_OTHER_CPU; //其他CPU
192 }
193
194 return flag;
195}
STATIC UINT32 g_currHandleExcCpuid
Definition: los_exc.c:126
STATIC INLINE UINT32 ArchCurrCpuid(VOID)
Definition: los_hw_cpu.h:168
函数调用图:
这是这个函数的调用关系图:

◆ OsGetUsrIpInfo()

BOOL OsGetUsrIpInfo ( UINTPTR  ip,
IpInfo info 
)

在文件 los_exc.c804 行定义.

805{
806 if (info == NULL) {
807 return FALSE;
808 }
809#ifdef LOSCFG_KERNEL_VM
810 BOOL ret = FALSE;
811 const CHAR *name = NULL;
812 LosVmMapRegion *region = NULL;
813 LosProcessCB *runProcess = OsCurrProcessGet();
814
815 if (LOS_IsUserAddress((VADDR_T)ip) == FALSE) {
816 info->ip = ip;
817 name = "kernel";
818 ret = FALSE;
819 goto END;
820 }
821
822 region = LOS_RegionFind(runProcess->vmSpace, (VADDR_T)ip);
823 if (region == NULL) {
824 info->ip = ip;
825 name = "invalid";
826 ret = FALSE;
827 goto END;
828 }
829
830 info->ip = ip - OsGetTextRegionBase(region, runProcess);
831 name = OsGetRegionNameOrFilePath(region);
832 ret = TRUE;
833 if (strcmp(name, "/lib/libc.so") != 0) {
834 PRINT_ERR("ip = 0x%x, %s\n", info->ip, name);
835 }
836END:
837 info->len = strlen(name);
838 if (strncpy_s(info->f_path, REGION_PATH_MAX, name, REGION_PATH_MAX - 1) != EOK) {
839 info->f_path[0] = '\0';
840 info->len = 0;
841 PRINT_ERR("copy f_path failed, %s\n", name);
842 }
843 return ret;
844#else
845 info->ip = ip;
846 return FALSE;
847#endif
848}
STATIC VADDR_T OsGetTextRegionBase(LosVmMapRegion *region, LosProcessCB *runProcess)
Definition: los_exc.c:359
STATIC INLINE LosProcessCB * OsCurrProcessGet(VOID)
char CHAR
Definition: los_typedef.h:63
const CHAR * OsGetRegionNameOrFilePath(LosVmMapRegion *region)
Definition: los_vm_dump.c:57
STATIC INLINE BOOL LOS_IsUserAddress(VADDR_T vaddr)
虚拟地址是否在用户空间
Definition: los_vm_map.h:275
LosVmMapRegion * LOS_RegionFind(LosVmSpace *vmSpace, VADDR_T addr)
查找线性区 根据起始地址在进程空间内查找是否存在
Definition: los_vm_map.c:414
UINT32 len
Definition: los_exc_pri.h:52
LosVmSpace * vmSpace
函数调用图:
这是这个函数的调用关系图:

◆ OsSystemExcIsReset()

BOOL OsSystemExcIsReset ( VOID  )

在文件 panic_shellcmd.c43 行定义.

44{
45 return systemExcReset;
46}
STATIC BOOL systemExcReset
这是这个函数的调用关系图: