From ee8ae574ec5e78297f76d2c83e68098c97254d29 Mon Sep 17 00:00:00 2001 From: zhangfanfan2 Date: Fri, 9 Apr 2021 19:36:29 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9B=9E=E9=80=80IsValidFP=E7=9A=84=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- arch/arm/arm/src/los_exc.c | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/arch/arm/arm/src/los_exc.c b/arch/arm/arm/src/los_exc.c index 03266553..58f66577 100755 --- a/arch/arm/arm/src/los_exc.c +++ b/arch/arm/arm/src/los_exc.c @@ -574,12 +574,8 @@ STATIC VOID OsUserExcHandle(ExcContext *excBufAddr) PrintExcInfo("User mode exception ends unscheduled!\n"); } -/* - * This function is used to determine whether the first input parameter is a valid virtual address. - * If it is, it is converted into a kernel virtual address and the converted kernel virtual address - * is used as an output parameter. - */ -STATIC INLINE BOOL IsValidVaddr(UINTPTR regFP, UINTPTR start, UINTPTR end, vaddr_t *vaddr) +/* this function is used to validate fp or validate the checking range start and end. */ +STATIC INLINE BOOL IsValidFP(UINTPTR regFP, UINTPTR start, UINTPTR end, vaddr_t *vaddr) { VADDR_T kvaddr = regFP; @@ -622,7 +618,7 @@ STATIC INLINE BOOL FindSuitableStack(UINTPTR regFP, UINTPTR *start, UINTPTR *end taskCB = OsCurrTaskGet(); stackStart = taskCB->userMapBase; stackEnd = taskCB->userMapBase + taskCB->userMapSize; - if (IsValidVaddr(regFP, stackStart, stackEnd, &kvaddr) == TRUE) { + if (IsValidFP(regFP, stackStart, stackEnd, &kvaddr) == TRUE) { found = TRUE; goto FOUND; } @@ -638,7 +634,7 @@ STATIC INLINE BOOL FindSuitableStack(UINTPTR regFP, UINTPTR *start, UINTPTR *end stackStart = taskCB->topOfStack; stackEnd = taskCB->topOfStack + taskCB->stackSize; - if (IsValidVaddr(regFP, stackStart, stackEnd, &kvaddr) == TRUE) { + if (IsValidFP(regFP, stackStart, stackEnd, &kvaddr) == TRUE) { found = TRUE; goto FOUND; } @@ -649,7 +645,7 @@ STATIC INLINE BOOL FindSuitableStack(UINTPTR regFP, UINTPTR *start, UINTPTR *end stack = &g_excStack[index]; stackStart = (UINTPTR)stack->stackTop; stackEnd = stackStart + LOSCFG_KERNEL_CORE_NUM * stack->stackSize; - if (IsValidVaddr(regFP, stackStart, stackEnd, &kvaddr) == TRUE) { + if (IsValidFP(regFP, stackStart, stackEnd, &kvaddr) == TRUE) { found = TRUE; goto FOUND; } @@ -685,23 +681,23 @@ VOID BackTraceSub(UINTPTR regFP) * will still be stored and updated. In that case we needs to find the right position of frame pointer. */ tmpFP = *(UINTPTR *)(UINTPTR)kvaddr; - if (IsValidVaddr(tmpFP, stackStart, stackEnd, NULL) == TRUE) { + if (IsValidFP(tmpFP, stackStart, stackEnd, NULL) == TRUE) { backFP = tmpFP; PrintExcInfo("traceback fp fixed, trace using fp = 0x%x\n", backFP); } - while (IsValidVaddr(backFP, stackStart, stackEnd, &kvaddr) == TRUE) { + while (IsValidFP(backFP, stackStart, stackEnd, &kvaddr) == TRUE) { tmpFP = backFP; #ifdef LOSCFG_COMPILER_CLANG_LLVM backFP = *(UINTPTR *)(UINTPTR)kvaddr; - if (IsValidVaddr(tmpFP + POINTER_SIZE, stackStart, stackEnd, &kvaddr) == FALSE) { + 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 (IsValidVaddr(tmpFP - POINTER_SIZE, stackStart, stackEnd, &kvaddr) == FALSE) { + if (IsValidFP(tmpFP - POINTER_SIZE, stackStart, stackEnd, &kvaddr) == FALSE) { PrintExcInfo("traceback backFP check failed, backFP: 0x%x\n", tmpFP - POINTER_SIZE); return; } -- GitLab