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