去除backtrace冗余代码

Signed-off-by: LiteOS2021 <dinglu@huawei.com>
This commit is contained in:
LiteOS2021 2021-09-23 13:57:45 +08:00
parent 565649c1c1
commit db1f9c797c
2 changed files with 41 additions and 41 deletions

78
components/backtrace/los_backtrace.c Executable file → Normal file
View File

@ -32,6 +32,9 @@
#include "los_backtrace.h" #include "los_backtrace.h"
#include "los_task.h" #include "los_task.h"
#include "los_debug.h" #include "los_debug.h"
#if (LOSCFG_BACKTRACE_TYPE == 4)
#include "los_arch_regs.h"
#endif
#if (LOSCFG_BACKTRACE_TYPE != 0) #if (LOSCFG_BACKTRACE_TYPE != 0)
/* This function is used to judge whether the data in the stack is a code section address. /* This function is used to judge whether the data in the stack is a code section address.
@ -355,9 +358,9 @@ STATIC INLINE UINTPTR OsAddrIsValid(UINTPTR sp)
#elif (LOSCFG_BACKTRACE_TYPE == 4) #elif (LOSCFG_BACKTRACE_TYPE == 4)
#define OS_BACKTRACE_START 0 #define OS_BACKTRACE_START 0
#define ALIGN_MASK (4 - 1) #define ALIGN_MASK (4 - 1)
#define OS_REG_LR_OFFSET 136 #define OS_REG_LR_OFFSET (CONTEXT_SIZE - 8)
UINT32 IsFpAligned(UINT32 value) UINT32 IsSpAligned(UINT32 value)
{ {
return (value & (UINT32)(ALIGN_MASK)) == 0; return (value & (UINT32)(ALIGN_MASK)) == 0;
} }
@ -371,10 +374,10 @@ STATIC INLINE UINTPTR HalGetLr(VOID)
return regLr; return regLr;
} }
/* This function is used to check fp address. */ /* This function is used to check sp address. */
BOOL IsValidFP(UINTPTR regFP, UINTPTR start, UINTPTR end) BOOL IsValidSP(UINTPTR regSP, UINTPTR start, UINTPTR end)
{ {
return (regFP > start) && (regFP <= end) && IsFpAligned(regFP); return (regSP >= start) && (regSP <= end) && IsSpAligned(regSP);
} }
/* This function is used to check return address. */ /* This function is used to check return address. */
@ -388,28 +391,22 @@ BOOL IsValidRa(UINTPTR regRA)
BOOL FindSuitableStack(UINTPTR regSP, UINTPTR *start, UINTPTR *end) BOOL FindSuitableStack(UINTPTR regSP, UINTPTR *start, UINTPTR *end)
{ {
UINT32 index;
UINT32 stackStart; UINT32 stackStart;
UINT32 stackEnd; UINT32 stackEnd;
BOOL found = FALSE; BOOL found = FALSE;
LosTaskCB *taskCB = NULL;
/* Search in the task stacks */
for (index = 0; index < g_taskMaxNum; index++) {
taskCB = OS_TCB_FROM_TID(index);
if (taskCB->taskStatus & OS_TASK_STATUS_UNUSED) {
continue;
}
if (LOS_TaskIsRunning()) {
UINT32 taskID = LOS_CurTaskIDGet();
LosTaskCB *taskCB = OS_TCB_FROM_TID(taskID);
stackStart = taskCB->topOfStack; stackStart = taskCB->topOfStack;
stackEnd = taskCB->topOfStack + taskCB->stackSize; stackEnd = taskCB->topOfStack + taskCB->stackSize;
if (IsValidFP(regSP, stackStart, stackEnd)) { if (IsValidSP(regSP, stackStart, stackEnd)) {
found = TRUE; found = TRUE;
goto FOUND; goto FOUND;
} }
} }
if (IsValidFP(regSP, CSTACK_START_ADDR, CSTACK_END_ADDR)) { if (IsValidSP(regSP, CSTACK_START_ADDR, CSTACK_END_ADDR)) {
stackStart = CSTACK_START_ADDR; stackStart = CSTACK_START_ADDR;
stackEnd = CSTACK_END_ADDR; stackEnd = CSTACK_END_ADDR;
found = TRUE; found = TRUE;
@ -441,7 +438,7 @@ UINT32 HalBackTraceGet(UINTPTR sp, UINT32 retAddr, UINTPTR *callChain, UINT32 ma
return 0; return 0;
} }
while (IsValidFP(backSp, stackStart, stackEnd)) { while (IsValidSP(backSp, stackStart, stackEnd)) {
if (callChain == NULL) { if (callChain == NULL) {
PRINTK("trace%u ra:0x%x sp:0x%x\n", count, (backRa << WINDOW_INCREMENT_SHIFT) >> PRINTK("trace%u ra:0x%x sp:0x%x\n", count, (backRa << WINDOW_INCREMENT_SHIFT) >>
WINDOW_INCREMENT_SHIFT, backSp); WINDOW_INCREMENT_SHIFT, backSp);
@ -503,40 +500,37 @@ STATIC INLINE UINTPTR OsSpGet(VOID)
/* This function is used to check sp. */ /* This function is used to check sp. */
BOOL IsValidSP(UINTPTR regSP, UINTPTR start, UINTPTR end) BOOL IsValidSP(UINTPTR regSP, UINTPTR start, UINTPTR end)
{ {
return (regSP > start) && (regSP < end); return (regSP >= start) && (regSP <= end);
} }
STATIC INLINE BOOL FindSuitableStack(UINTPTR *regSP, UINTPTR *start, UINTPTR *end) BOOL FindSuitableStack(UINTPTR regSP, UINTPTR *start, UINTPTR *end)
{ {
UINT32 index; UINT32 stackStart;
UINT32 topOfStack; UINT32 stackEnd;
UINT32 stackBottom;
BOOL found = FALSE; BOOL found = FALSE;
LosTaskCB *taskCB = NULL;
/* Search in the task stacks */ if (LOS_TaskIsRunning()) {
for (index = 0; index < g_taskMaxNum; index++) { UINT32 taskID = LOS_CurTaskIDGet();
taskCB = &g_taskCBArray[index]; LosTaskCB *taskCB = OS_TCB_FROM_TID(taskID);
if (taskCB->taskStatus & OS_TASK_STATUS_UNUSED) { stackStart = taskCB->topOfStack;
continue; stackEnd = taskCB->topOfStack + taskCB->stackSize;
} if (IsValidSP(regSP, stackStart, stackEnd)) {
topOfStack = taskCB->topOfStack;
stackBottom = taskCB->topOfStack + taskCB->stackSize;
if (IsValidSP(*regSP, topOfStack, stackBottom)) {
found = TRUE; found = TRUE;
goto FOUND; goto FOUND;
} }
} }
if (IsValidSP(regSP, CSTACK_START_ADDR, CSTACK_END_ADDR)) {
stackStart = CSTACK_START_ADDR;
stackEnd = CSTACK_END_ADDR;
found = TRUE;
goto FOUND;
}
FOUND: FOUND:
if (found == TRUE) { if (found == TRUE) {
*start = topOfStack; *start = stackStart;
*end = stackBottom; *end = stackEnd;
} else if (*regSP < CSTACK_END_ADDR) {
*start = *regSP;
*end = CSTACK_END_ADDR;
found = TRUE;
} }
return found; return found;
@ -544,7 +538,7 @@ FOUND:
VOID LOS_RecordLR(UINTPTR *LR, UINT32 LRSize, UINT32 jumpCount, UINTPTR SP) VOID LOS_RecordLR(UINTPTR *LR, UINT32 LRSize, UINT32 jumpCount, UINTPTR SP)
{ {
UINTPTR stackPointer = SP; UINTPTR stackPointer;
UINTPTR topOfStack; UINTPTR topOfStack;
UINTPTR tmpStack = 0; UINTPTR tmpStack = 0;
UINTPTR stackBottom; UINTPTR stackBottom;
@ -560,7 +554,9 @@ VOID LOS_RecordLR(UINTPTR *LR, UINT32 LRSize, UINT32 jumpCount, UINTPTR SP)
SP = OsSpGet(); SP = OsSpGet();
} }
if (FindSuitableStack(&stackPointer, &topOfStack, &stackBottom) == FALSE) { stackPointer = SP;
if (FindSuitableStack(stackPointer, &topOfStack, &stackBottom) == FALSE) {
return; return;
} }

View File

@ -170,15 +170,19 @@ UINT32 HalBackTraceGet(UINTPTR sp, UINT32 retAddr, UINTPTR *callChain, UINT32 ma
#define CODE_SECTION_START __text_start #define CODE_SECTION_START __text_start
/* The default code section end address */ /* The default code section end address */
#define CODE_SECTION_END __text_end #define CODE_SECTION_END __text_end
/* The default C stack section start address */
#define CSTACK_SECTION_START __init_stack_s
/* The default C stack section end address */ /* The default C stack section end address */
#define CSTACK_SECTION_END __ram_end #define CSTACK_SECTION_END __ram_end
extern CHAR *CODE_SECTION_START; extern CHAR *CODE_SECTION_START;
extern CHAR *CODE_SECTION_END; extern CHAR *CODE_SECTION_END;
extern CHAR *CSTACK_SECTION_START;
extern CHAR *CSTACK_SECTION_END; extern CHAR *CSTACK_SECTION_END;
#define CODE_START_ADDR ((UINTPTR)&CODE_SECTION_START) #define CODE_START_ADDR ((UINTPTR)&CODE_SECTION_START)
#define CODE_END_ADDR ((UINTPTR)&CODE_SECTION_END) #define CODE_END_ADDR ((UINTPTR)&CODE_SECTION_END)
#define CSTACK_START_ADDR ((UINTPTR)&CSTACK_SECTION_START)
#define CSTACK_END_ADDR ((UINTPTR)&CSTACK_SECTION_END) #define CSTACK_END_ADDR ((UINTPTR)&CSTACK_SECTION_END)
#define ALGIN_CODE 2 #define ALGIN_CODE 2