diff --git a/arch/arm/arm/src/los_exc.c b/arch/arm/arm/src/los_exc.c index de57d93cfc9d6a79c523b016c9879c6b13a3ef27..d935f466bd7f0077c6c8a85f27028d4fef0ec752 100755 --- a/arch/arm/arm/src/los_exc.c +++ b/arch/arm/arm/src/los_exc.c @@ -669,12 +669,21 @@ VOID BackTraceSub(UINTPTR regFP) while (IsValidFP(backFP, stackStart, stackEnd, &kvaddr) == TRUE) { tmpFP = backFP; +#ifdef LOSCFG_COMPILER_CLANG_LLVM + backFP = *(UINTPTR *)(UINTPTR)kvaddr; + if (IsValidFP(tmpFP + POINTER_SIZE, stackStart, stackEnd, &kvaddr) == FALSE) { + PrintExcInfo("traceback backLR check failed, backLP: 0x%x\n", tmpFP + POINTER_SIZE); + return; + } + backLR = *(UINTPTR *)(UINTPTR)kvaddr; +#else backLR = *(UINTPTR *)(UINTPTR)kvaddr; if (IsValidFP(tmpFP - POINTER_SIZE, stackStart, stackEnd, &kvaddr) == FALSE) { PrintExcInfo("traceback backFP check failed, backFP: 0x%x\n", tmpFP - POINTER_SIZE); return; } backFP = *(UINTPTR *)(UINTPTR)kvaddr; +#endif if (LOS_IsUserAddress((VADDR_T)backLR) == TRUE) { region = LOS_RegionFind(OsCurrProcessGet()->vmSpace, (VADDR_T)backLR); }