235 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			235 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
							 | 
						||
| 
								 | 
							
								 * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Redistribution and use in source and binary forms, with or without modification,
							 | 
						||
| 
								 | 
							
								 * are permitted provided that the following conditions are met:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * 1. Redistributions of source code must retain the above copyright notice, this list of
							 | 
						||
| 
								 | 
							
								 *    conditions and the following disclaimer.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * 2. Redistributions in binary form must reproduce the above copyright notice, this list
							 | 
						||
| 
								 | 
							
								 *    of conditions and the following disclaimer in the documentation and/or other materials
							 | 
						||
| 
								 | 
							
								 *    provided with the distribution.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * 3. Neither the name of the copyright holder nor the names of its contributors may be used
							 | 
						||
| 
								 | 
							
								 *    to endorse or promote products derived from this software without specific prior written
							 | 
						||
| 
								 | 
							
								 *    permission.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
							 | 
						||
| 
								 | 
							
								 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
							 | 
						||
| 
								 | 
							
								 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
							 | 
						||
| 
								 | 
							
								 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
							 | 
						||
| 
								 | 
							
								 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
							 | 
						||
| 
								 | 
							
								 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
							 | 
						||
| 
								 | 
							
								 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
							 | 
						||
| 
								 | 
							
								 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
							 | 
						||
| 
								 | 
							
								 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
							 | 
						||
| 
								 | 
							
								 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
							 | 
						||
| 
								 | 
							
								 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef _LOS_BACKTRACE_H
							 | 
						||
| 
								 | 
							
								#define _LOS_BACKTRACE_H
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "los_config.h"
							 | 
						||
| 
								 | 
							
								#include "los_arch_interrupt.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __cplusplus
							 | 
						||
| 
								 | 
							
								#if __cplusplus
							 | 
						||
| 
								 | 
							
								extern "C" {
							 | 
						||
| 
								 | 
							
								#endif /* __cplusplus */
							 | 
						||
| 
								 | 
							
								#endif /* __cplusplus */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define BACKTRACE_MAX_DEPTH    LOSCFG_BACKTRACE_DEPTH
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if (LOSCFG_BACKTRACE_TYPE != 0)
							 | 
						||
| 
								 | 
							
								#if (LOSCFG_BACKTRACE_TYPE == 1)
							 | 
						||
| 
								 | 
							
								/* The default name of the code section and CSTACK section are given below,
							 | 
						||
| 
								 | 
							
								   and the user can adjust it according to the linker script file. */
							 | 
						||
| 
								 | 
							
								#if defined(__ICCARM__)
							 | 
						||
| 
								 | 
							
								/* The default code section name is .text */
							 | 
						||
| 
								 | 
							
								#define CODE_SECTION_NAME    ".text"
							 | 
						||
| 
								 | 
							
								/* The default C stack section name is CSTACK */
							 | 
						||
| 
								 | 
							
								#define CSTACK_SECTION_NAME  "CSTACK"
							 | 
						||
| 
								 | 
							
								#pragma section = CODE_SECTION_NAME
							 | 
						||
| 
								 | 
							
								#pragma section = CSTACK_SECTION_NAME
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Default only one code section. In fact, there may be more than one.
							 | 
						||
| 
								 | 
							
								   You can define more than one and redefine the OsStackDataIsCodeAddr function
							 | 
						||
| 
								 | 
							
								   to support searching in multiple code sections */
							 | 
						||
| 
								 | 
							
								#define CODE_START_ADDR     ((UINTPTR)__section_begin(CODE_SECTION_NAME))
							 | 
						||
| 
								 | 
							
								#define CODE_END_ADDR       ((UINTPTR)__section_end(CODE_SECTION_NAME))
							 | 
						||
| 
								 | 
							
								#define CSTACK_START_ADDR   ((UINTPTR)__section_begin(CSTACK_SECTION_NAME))
							 | 
						||
| 
								 | 
							
								#define CSTACK_END_ADDR     ((UINTPTR)__section_end(CSTACK_SECTION_NAME))
							 | 
						||
| 
								 | 
							
								#elif defined(__CC_ARM) || defined(__CLANG_ARM)
							 | 
						||
| 
								 | 
							
								/* The default code section name is ER_IROM1 */
							 | 
						||
| 
								 | 
							
								#define CODE_SECTION_NAME    ER_IROM1
							 | 
						||
| 
								 | 
							
								/* The default C stack section name is STACK */
							 | 
						||
| 
								 | 
							
								#define CSTACK_SECTION_NAME  STACK
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define SECTION_START(_name_)           _name_##$$Base
							 | 
						||
| 
								 | 
							
								#define SECTION_END(_name_)             _name_##$$Limit
							 | 
						||
| 
								 | 
							
								#define CSTACK_SECTION_START(_name_)    SECTION_START(_name_)
							 | 
						||
| 
								 | 
							
								#define CSTACK_SECTION_END(_name_)      SECTION_END(_name_)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define IMAGE_SECTION_START(_name_)     Image$$##_name_##$$Base
							 | 
						||
| 
								 | 
							
								#define IMAGE_SECTION_END(_name_)       Image$$##_name_##$$Limit
							 | 
						||
| 
								 | 
							
								#define CODE_SECTION_START(_name_)      IMAGE_SECTION_START(_name_)
							 | 
						||
| 
								 | 
							
								#define CODE_SECTION_END(_name_)        IMAGE_SECTION_END(_name_)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								extern CHAR *CSTACK_SECTION_START(CSTACK_SECTION_NAME);
							 | 
						||
| 
								 | 
							
								extern CHAR *CSTACK_SECTION_END(CSTACK_SECTION_NAME);
							 | 
						||
| 
								 | 
							
								extern CHAR *CODE_SECTION_START(CODE_SECTION_NAME);
							 | 
						||
| 
								 | 
							
								extern CHAR *CODE_SECTION_END(CODE_SECTION_NAME);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Default only one code section. In fact, there may be more than one.
							 | 
						||
| 
								 | 
							
								   You can define more than one and redefine the OsStackDataIsCodeAddr function
							 | 
						||
| 
								 | 
							
								   to support searching in multiple code sections */
							 | 
						||
| 
								 | 
							
								#define CODE_START_ADDR     ((UINTPTR)&CODE_SECTION_START(CODE_SECTION_NAME))
							 | 
						||
| 
								 | 
							
								#define CODE_END_ADDR       ((UINTPTR)&CODE_SECTION_END(CODE_SECTION_NAME))
							 | 
						||
| 
								 | 
							
								#define CSTACK_START_ADDR   ((UINTPTR)&CSTACK_SECTION_START(CSTACK_SECTION_NAME))
							 | 
						||
| 
								 | 
							
								#define CSTACK_END_ADDR     ((UINTPTR)&CSTACK_SECTION_END(CSTACK_SECTION_NAME))
							 | 
						||
| 
								 | 
							
								#elif defined(__GNUC__)
							 | 
						||
| 
								 | 
							
								/* The default code section start address */
							 | 
						||
| 
								 | 
							
								#define CODE_SECTION_START      _stext
							 | 
						||
| 
								 | 
							
								/* The default code section end address */
							 | 
						||
| 
								 | 
							
								#define CODE_SECTION_END        _etext
							 | 
						||
| 
								 | 
							
								/* The default C stack section start address */
							 | 
						||
| 
								 | 
							
								#define CSTACK_SECTION_START    _sstack
							 | 
						||
| 
								 | 
							
								/* The default C stack section end address */
							 | 
						||
| 
								 | 
							
								#define CSTACK_SECTION_END      _estack
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								extern CHAR *CODE_SECTION_START;
							 | 
						||
| 
								 | 
							
								extern CHAR *CODE_SECTION_END;
							 | 
						||
| 
								 | 
							
								extern CHAR *CSTACK_SECTION_START;
							 | 
						||
| 
								 | 
							
								extern CHAR *CSTACK_SECTION_END;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Default only one code section. In fact, there may be more than one.
							 | 
						||
| 
								 | 
							
								   You can define more than one and redefine the OsStackDataIsCodeAddr function
							 | 
						||
| 
								 | 
							
								   to support searching in multiple code sections */
							 | 
						||
| 
								 | 
							
								#define CODE_START_ADDR     ((UINTPTR)&CODE_SECTION_START)
							 | 
						||
| 
								 | 
							
								#define CODE_END_ADDR       ((UINTPTR)&CODE_SECTION_END)
							 | 
						||
| 
								 | 
							
								#define CSTACK_START_ADDR   ((UINTPTR)&CSTACK_SECTION_START)
							 | 
						||
| 
								 | 
							
								#define CSTACK_END_ADDR     ((UINTPTR)&CSTACK_SECTION_END)
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								#error Unknown compiler.
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								#elif (LOSCFG_BACKTRACE_TYPE == 2) || (LOSCFG_BACKTRACE_TYPE == 3)
							 | 
						||
| 
								 | 
							
								#if defined(__GNUC__)
							 | 
						||
| 
								 | 
							
								/* The default code section start address */
							 | 
						||
| 
								 | 
							
								#define CODE_SECTION_START      __text_start
							 | 
						||
| 
								 | 
							
								/* The default code section end address */
							 | 
						||
| 
								 | 
							
								#define CODE_SECTION_END        __text_end
							 | 
						||
| 
								 | 
							
								/* The default C stack section start address */
							 | 
						||
| 
								 | 
							
								#define CSTACK_SECTION_START    __except_stack_top
							 | 
						||
| 
								 | 
							
								/* The default C stack section end address */
							 | 
						||
| 
								 | 
							
								#define CSTACK_SECTION_END      __start_and_irq_stack_top
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								extern CHAR *CODE_SECTION_START;
							 | 
						||
| 
								 | 
							
								extern CHAR *CODE_SECTION_END;
							 | 
						||
| 
								 | 
							
								extern CHAR *CSTACK_SECTION_START;
							 | 
						||
| 
								 | 
							
								extern CHAR *CSTACK_SECTION_END;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define CODE_START_ADDR     ((UINTPTR)&CODE_SECTION_START)
							 | 
						||
| 
								 | 
							
								#define CODE_END_ADDR       ((UINTPTR)&CODE_SECTION_END)
							 | 
						||
| 
								 | 
							
								#define CSTACK_START_ADDR   ((UINTPTR)&CSTACK_SECTION_START)
							 | 
						||
| 
								 | 
							
								#define CSTACK_END_ADDR     ((UINTPTR)&CSTACK_SECTION_END)
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								#error Unknown compiler.
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								#elif (LOSCFG_BACKTRACE_TYPE == 4)
							 | 
						||
| 
								 | 
							
								/* The default code section start address */
							 | 
						||
| 
								 | 
							
								#define CODE_SECTION_START      __text_start
							 | 
						||
| 
								 | 
							
								/* The default code section end address */
							 | 
						||
| 
								 | 
							
								#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 */
							 | 
						||
| 
								 | 
							
								#define CSTACK_SECTION_END      __init_stack_e
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								extern CHAR *CODE_SECTION_START;
							 | 
						||
| 
								 | 
							
								extern CHAR *CODE_SECTION_END;
							 | 
						||
| 
								 | 
							
								extern CHAR *CSTACK_SECTION_START;
							 | 
						||
| 
								 | 
							
								extern CHAR *CSTACK_SECTION_END;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define CODE_START_ADDR     ((UINTPTR)&CODE_SECTION_START)
							 | 
						||
| 
								 | 
							
								#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 VIR_TEXT_ADDR_MASK  0x80000000
							 | 
						||
| 
								 | 
							
								#define TEXT_ADDR_MASK      0x40000000
							 | 
						||
| 
								 | 
							
								#define RA_OFFSET           16
							 | 
						||
| 
								 | 
							
								#define SP_OFFSET           12
							 | 
						||
| 
								 | 
							
								#define WINDOW_INCREMENT_SHIFT 2
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								UINT32 HalBackTraceGet(UINTPTR sp, UINT32 retAddr, UINTPTR *callChain, UINT32 maxDepth, UINT32 jumpCount);
							 | 
						||
| 
								 | 
							
								#elif (LOSCFG_BACKTRACE_TYPE == 5)
							 | 
						||
| 
								 | 
							
								/* The default code section start address */
							 | 
						||
| 
								 | 
							
								#define CODE_SECTION_START      __text_start
							 | 
						||
| 
								 | 
							
								/* The default code section end address */
							 | 
						||
| 
								 | 
							
								#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 */
							 | 
						||
| 
								 | 
							
								#define CSTACK_SECTION_END      __ram_end
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								extern CHAR *CODE_SECTION_START;
							 | 
						||
| 
								 | 
							
								extern CHAR *CODE_SECTION_END;
							 | 
						||
| 
								 | 
							
								extern CHAR *CSTACK_SECTION_START;
							 | 
						||
| 
								 | 
							
								extern CHAR *CSTACK_SECTION_END;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define CODE_START_ADDR     ((UINTPTR)&CODE_SECTION_START)
							 | 
						||
| 
								 | 
							
								#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 ALGIN_CODE                      2
							 | 
						||
| 
								 | 
							
								#define STACK_OFFSET                    4
							 | 
						||
| 
								 | 
							
								#elif (LOSCFG_BACKTRACE_TYPE == 6)
							 | 
						||
| 
								 | 
							
								extern CHAR *__svc_stack;
							 | 
						||
| 
								 | 
							
								extern CHAR *__svc_stack_top;
							 | 
						||
| 
								 | 
							
								/* The default code section start address */
							 | 
						||
| 
								 | 
							
								#define CODE_SECTION_START      __text_start
							 | 
						||
| 
								 | 
							
								/* The default code section end address */
							 | 
						||
| 
								 | 
							
								#define CODE_SECTION_END        __text_end
							 | 
						||
| 
								 | 
							
								/* The default C stack section start address */
							 | 
						||
| 
								 | 
							
								#define CSTACK_SECTION_START    __svc_stack
							 | 
						||
| 
								 | 
							
								/* The default C stack section end address */
							 | 
						||
| 
								 | 
							
								#define CSTACK_SECTION_END      __svc_stack_top
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								extern CHAR *CODE_SECTION_START;
							 | 
						||
| 
								 | 
							
								extern CHAR *CODE_SECTION_END;
							 | 
						||
| 
								 | 
							
								extern CHAR *CSTACK_SECTION_START;
							 | 
						||
| 
								 | 
							
								extern CHAR *CSTACK_SECTION_END;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Default only one code section. In fact, there may be more than one.
							 | 
						||
| 
								 | 
							
								   You can define more than one and redefine the OsStackDataIsCodeAddr function
							 | 
						||
| 
								 | 
							
								   to support searching in multiple code sections */
							 | 
						||
| 
								 | 
							
								#define CODE_START_ADDR     ((UINTPTR)&CODE_SECTION_START)
							 | 
						||
| 
								 | 
							
								#define CODE_END_ADDR       ((UINTPTR)&CODE_SECTION_END)
							 | 
						||
| 
								 | 
							
								#define CSTACK_START_ADDR   ((UINTPTR)&CSTACK_SECTION_START)
							 | 
						||
| 
								 | 
							
								#define CSTACK_END_ADDR     ((UINTPTR)&CSTACK_SECTION_END)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* This function is currently used to register the memory leak check hook,
							 | 
						||
| 
								 | 
							
								   other uses do not need to be called temporarily. */
							 | 
						||
| 
								 | 
							
								VOID OsBackTraceInit(VOID);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* This function is used to print the function call stack. */
							 | 
						||
| 
								 | 
							
								VOID LOS_BackTrace(VOID);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* This function is used to record the function call stack. */
							 | 
						||
| 
								 | 
							
								VOID LOS_RecordLR(UINTPTR *LR, UINT32 LRSize, UINT32 jumpCount, UINTPTR SP);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __cplusplus
							 | 
						||
| 
								 | 
							
								#if __cplusplus
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								#endif /* __cplusplus */
							 | 
						||
| 
								 | 
							
								#endif /* __cplusplus */
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 |