xref: /nrf52832-nimble/rt-thread/libcpu/arm/common/backtrace.c (revision 104654410c56c573564690304ae786df310c91fc)
1 /*
2  * Copyright (c) 2006-2018, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2008-07-29     Bernard      first version from QiuYi implementation
9  */
10 
11 #include <rtthread.h>
12 
13 #ifdef __GNUC__
14 /*
15 -->High Address,Stack Top
16 PC<------|
17 LR       |
18 IP       |
19 FP       |
20 ......   |
21 PC <-|   |
22 LR   |   |
23 IP   |   |
24 FP---|-- |
25 ......   |
26 PC       |
27 LR       |
28 IP       |
29 FP---
30 -->Low Address,Stack Bottom
31 */
rt_hw_backtrace(rt_uint32_t * fp,rt_uint32_t thread_entry)32 void rt_hw_backtrace(rt_uint32_t *fp, rt_uint32_t thread_entry)
33 {
34     rt_uint32_t i, pc, func_entry;
35 
36     pc = *fp;
37     rt_kprintf("[0x%x]\n", pc-0xC);
38 
39     for(i=0; i<10; i++)
40     {
41         fp = (rt_uint32_t *)*(fp - 3);
42         pc = *fp ;
43 
44         func_entry = pc - 0xC;
45 
46         if(func_entry <= 0x30000000) break;
47 
48         if(func_entry == thread_entry)
49         {
50             rt_kprintf("EntryPoint:0x%x\n", func_entry);
51 
52             break;
53         }
54 
55         rt_kprintf("[0x%x]\n", func_entry);
56     }
57 }
58 #else
rt_hw_backtrace(rt_uint32_t * fp,rt_uint32_t thread_entry)59 void rt_hw_backtrace(rt_uint32_t *fp, rt_uint32_t thread_entry)
60 {
61     /* old compiler implementation */
62 }
63 #endif
64