|
|
|
|
@ -45,7 +45,6 @@
|
|
|
|
|
extern const int CODE_SECTION_END(CMB_CODE_SECTION_NAME);
|
|
|
|
|
extern const int CSTACK_BLOCK_START(CMB_CSTACK_BLOCK_NAME);
|
|
|
|
|
extern const int CSTACK_BLOCK_END(CMB_CSTACK_BLOCK_NAME);
|
|
|
|
|
//TODO ´ý²âÊÔ
|
|
|
|
|
#elif defined(__ICCARM__)
|
|
|
|
|
#pragma section=CMB_CSTACK_BLOCK_NAME
|
|
|
|
|
#pragma section=CMB_CODE_SECTION_NAME
|
|
|
|
|
@ -199,7 +198,6 @@ void cm_backtrace_init(const char *firmware_name, const char *hardware_ver, cons
|
|
|
|
|
main_stack_size = (uint32_t)&CSTACK_BLOCK_END(CMB_CSTACK_BLOCK_NAME) - main_stack_start_addr;
|
|
|
|
|
code_start_addr = (uint32_t)&CODE_SECTION_START(CMB_CODE_SECTION_NAME);
|
|
|
|
|
code_size = (uint32_t)&CODE_SECTION_END(CMB_CODE_SECTION_NAME) - code_start_addr;
|
|
|
|
|
//TODO ´ý²âÊÔ
|
|
|
|
|
#elif defined(__ICCARM__)
|
|
|
|
|
main_stack_start_addr = (uint32_t)__section_begin(CMB_CSTACK_BLOCK_NAME);
|
|
|
|
|
main_stack_size = (uint32_t)__section_end(CMB_CSTACK_BLOCK_NAME) - main_stack_start_addr;
|
|
|
|
|
@ -550,6 +548,10 @@ void cm_backtrace_fault(uint32_t fault_handler_lr, uint32_t fault_handler_sp) {
|
|
|
|
|
uint32_t stack_pointer = fault_handler_sp, saved_regs_addr = stack_pointer;
|
|
|
|
|
const char *regs_name[] = { "R0 ", "R1 ", "R2 ", "R3 ", "R12", "LR ", "PC ", "PSR" };
|
|
|
|
|
|
|
|
|
|
#ifdef CMB_USING_DUMP_STACK_INFO
|
|
|
|
|
uint32_t stack_start_addr = main_stack_start_addr, stack_size = main_stack_size;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
CMB_ASSERT(init_ok);
|
|
|
|
|
/* only call once */
|
|
|
|
|
CMB_ASSERT(!on_fault);
|
|
|
|
|
@ -559,39 +561,42 @@ void cm_backtrace_fault(uint32_t fault_handler_lr, uint32_t fault_handler_sp) {
|
|
|
|
|
cmb_println("");
|
|
|
|
|
cm_backtrace_firmware_info();
|
|
|
|
|
|
|
|
|
|
/* delete saved R0~R3, R12, LR, PC, xPSR registers address */
|
|
|
|
|
stack_pointer += sizeof(size_t) * 8;
|
|
|
|
|
|
|
|
|
|
#if (CMB_CPU_PLATFORM_TYPE == CMB_CPU_ARM_CORTEX_M4) || (CMB_CPU_PLATFORM_TYPE == CMB_CPU_ARM_CORTEX_M7)
|
|
|
|
|
stack_pointer = statck_del_fpu_regs(fault_handler_lr, stack_pointer);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef CMB_USING_DUMP_STACK_INFO
|
|
|
|
|
uint32_t stack_start_addr = main_stack_start_addr, stack_size = main_stack_size;
|
|
|
|
|
#ifdef CMB_USING_OS_PLATFORM
|
|
|
|
|
on_thread_before_fault = fault_handler_lr & (1UL << 2);
|
|
|
|
|
/* check which stack was used before (MSP or PSP) */
|
|
|
|
|
if (on_thread_before_fault) {
|
|
|
|
|
cmb_println(print_info[PRINT_FAULT_ON_THREAD], get_cur_thread_name());
|
|
|
|
|
saved_regs_addr = stack_pointer = __get_PSP();
|
|
|
|
|
|
|
|
|
|
#ifdef CMB_USING_DUMP_STACK_INFO
|
|
|
|
|
get_cur_thread_stack_info(stack_pointer, &stack_start_addr, &stack_size);
|
|
|
|
|
#endif /* CMB_USING_DUMP_STACK_INFO */
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
cmb_println(print_info[PRINT_FAULT_ON_HANDLER]);
|
|
|
|
|
}
|
|
|
|
|
#else
|
|
|
|
|
/* bare metal(no OS) environment */
|
|
|
|
|
cmb_println(print_info[PRINT_FAULT_ON_HANDLER]);
|
|
|
|
|
#endif /* CMB_USING_OS_PLATFORM */
|
|
|
|
|
|
|
|
|
|
/* delete saved R0~R3, R12, LR,PC,xPSR registers space */
|
|
|
|
|
stack_pointer += sizeof(size_t) * 8;
|
|
|
|
|
|
|
|
|
|
#if (CMB_CPU_PLATFORM_TYPE == CMB_CPU_ARM_CORTEX_M4) || (CMB_CPU_PLATFORM_TYPE == CMB_CPU_ARM_CORTEX_M7)
|
|
|
|
|
stack_pointer = statck_del_fpu_regs(fault_handler_lr, stack_pointer);
|
|
|
|
|
#endif
|
|
|
|
|
#endif /* (CMB_CPU_PLATFORM_TYPE == CMB_CPU_ARM_CORTEX_M4) || (CMB_CPU_PLATFORM_TYPE == CMB_CPU_ARM_CORTEX_M7) */
|
|
|
|
|
|
|
|
|
|
/* dump stack information */
|
|
|
|
|
#ifdef CMB_USING_DUMP_STACK_INFO
|
|
|
|
|
#ifdef CMB_USING_OS_PLATFORM
|
|
|
|
|
if (on_thread_before_fault) {
|
|
|
|
|
dump_cur_thread_stack(stack_start_addr, stack_size, (uint32_t *) stack_pointer);
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
cmb_println(print_info[PRINT_FAULT_ON_HANDLER]);
|
|
|
|
|
dump_main_stack(stack_start_addr, stack_size, (uint32_t *) stack_pointer);
|
|
|
|
|
}
|
|
|
|
|
#else
|
|
|
|
|
/* bare metal(no OS) environment */
|
|
|
|
|
cmb_println(print_info[PRINT_FAULT_ON_HANDLER]);
|
|
|
|
|
dump_main_stack(stack_start_addr, stack_size, (uint32_t *) stack_pointer);
|
|
|
|
|
#endif /* CMB_USING_OS_PLATFORM */
|
|
|
|
|
#endif /* CMB_USING_DUMP_STACK_INFO */
|
|
|
|
|
|