1#ifndef __EXIDX_UNWIND_H
2#define __EXIDX_UNWIND_H
11#define COMP_ENTRY_IDX_MASK (0xF << 24)
12#define ARM_EXIDX_CMD_FINISH 0xB0
13#define ARM_EXIDX_CMD_REFUSED 0x80
14#define ARM_EXIDX_CMD_REG_POP 0xB1
15#define ARM_EXIDX_CMD_DATA_POP 0xB2
16#define ARM_EXIDX_CMD_VFP_POP 0xB3
17#define ARM_EXIDX_CMD_WCGR_POP 0xC7
18#define ARM_EXIDX_PRS_CANT_UNWIND 0x00000001
22 ARM_RET_HND_FP = 0xFFFFFFE1,
23 ARM_RET_MSP_FP = 0xFFFFFFE9,
24 ARM_RET_PSP_FP = 0xFFFFFFED,
25 ARM_RET_HND_NOFP = 0xFFFFFFF1,
26 ARM_RET_MSP_NOFP = 0xFFFFFFF9,
27 ARM_RET_PSP_NOFP = 0xFFFFFFFD,
32 const uint32_t *prs32;
38 uint32_t get_uleb128();
39 void init(
const uint32_t *tab_entry);
48inline uint32_t prel31Addr(
const uint32_t *prel31)
50 int32_t s_ext_offset = (*((int32_t *)prel31) << 1) >> 1;
51 return (((uint32_t)prel31) + s_ext_offset) & 0x7FffFFff;
59 inline uint32_t asAddr()
const {
return prel31Addr(&offset); }
60 const int getInsn(insn_t *insn)
const;
63extern const exidx_t __exidx_start[];
64extern const exidx_t __exidx_end[];
87typedef void *unwind_trace_dat_t;
88typedef int (*unwind_trace_fn)(
const vrs_t &vrs, unwind_trace_dat_t trace_dat);
99 inline void init()
volatile
103 offset = offsetof(unwind_ctx, vrs) + offsetof(vrs_t, r) + 4 *
sizeof(vrs.r[0]);
105 "add %%r1, %0, %1\n\t"
106 "str %%r4, [%%r1], #4\n\t"
107 "str %%r5, [%%r1], #4\n\t"
108 "str %%r6, [%%r1], #4\n\t"
109 "str %%r7, [%%r1], #4\n\t"
110 "str %%r8, [%%r1], #4\n\t"
111 "str %%r9, [%%r1], #4\n\t"
112 "str %%r10, [%%r1], #4\n\t"
113 "str %%r11, [%%r1], #4\n\t"
115 :
"r"(
this),
"r"(offset)
116 :
"r1",
"r4",
"r5",
"r6",
"r7",
"r8",
"r9",
"r10",
"r11",
"memory");
118 inline void initFpr()
volatile
120#if ((__SOFTFP__ != 1) || (defined __ARM_FP))
123 offset = offsetof(unwind_ctx, vrs) + offsetof(vrs_t, fpr);
125 "add %%r1, %0, %1\n\t"
126 "vstm.64 %%r1!, {%%d0-%%d15}\n\t"
127 "vmrs %%r2, FPSCR\n\t"
128 "str %%r2, [%%r1]\n\t"
130 :
"r"(
this),
"r"(offset)
131 :
"r1",
"r2",
"memory");
134 inline void initForRunning()
volatile
138 offset = offsetof(unwind_ctx, vrs) + offsetof(vrs_t, r) + 2 *
sizeof(vrs.r[0]);
140 "add %%r1, %0, %1\n\t"
141 "stm r1!, {r2-r12}\n\t"
142 "str sp, [r1], #4\n\t"
143 "str lr, [r1], #4\n\t"
145 :
"r"(
this),
"r"(offset)
148 void init(
volatile cpu_tcb *ptcb);
149 void init(uint32_t sp, uint32_t lr, uint32_t pc);
150 void unwind_eframe();
151 int unwind_stack(unwind_trace_fn trace_cb, unwind_trace_dat_t trace_dat);
211 uint32_t prs_fn_offset;
217 inline uint8_t operator[](
int i);
224struct extab_entry_comp
228 uint8_t operator[](
int i);
231exidx_t *find_insn(uint32_t *start, uint32_t *end, uint32_t pc);
void init()
System initialization. Ideally called at the beginning of all applications, since the easiest Recover...