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