From 3b9ccc839e422018e870da8ec38d05e2bae5cae3 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Wed, 28 Apr 2021 10:33:10 +0800 Subject: [PATCH] fix:solve the problem of stack backtrace failure for llvm. Change-Id: I0b0426e0e529cb6517d6a2712c6862ebbcea2239 --- arch/arm/arm/src/los_exc.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/arch/arm/arm/src/los_exc.c b/arch/arm/arm/src/los_exc.c index de57d93c..d935f466 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); }