xref: /openbmc/linux/arch/arm/include/asm/unwind.h (revision 2612e3bbc0386368a850140a6c9b990cd496a5ec)
145051539SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
2bff595c1SCatalin Marinas /*
3bff595c1SCatalin Marinas  * arch/arm/include/asm/unwind.h
4bff595c1SCatalin Marinas  *
5bff595c1SCatalin Marinas  * Copyright (C) 2008 ARM Limited
6bff595c1SCatalin Marinas  */
7bff595c1SCatalin Marinas 
8bff595c1SCatalin Marinas #ifndef __ASM_UNWIND_H
9bff595c1SCatalin Marinas #define __ASM_UNWIND_H
10bff595c1SCatalin Marinas 
11bff595c1SCatalin Marinas #ifndef __ASSEMBLY__
12bff595c1SCatalin Marinas 
13bff595c1SCatalin Marinas /* Unwind reason code according the the ARM EABI documents */
14bff595c1SCatalin Marinas enum unwind_reason_code {
15bff595c1SCatalin Marinas 	URC_OK = 0,			/* operation completed successfully */
16bff595c1SCatalin Marinas 	URC_CONTINUE_UNWIND = 8,
17bff595c1SCatalin Marinas 	URC_FAILURE = 9			/* unspecified failure of some kind */
18bff595c1SCatalin Marinas };
19bff595c1SCatalin Marinas 
20bff595c1SCatalin Marinas struct unwind_idx {
21de66a979SUwe Kleine-König 	unsigned long addr_offset;
22bff595c1SCatalin Marinas 	unsigned long insn;
23bff595c1SCatalin Marinas };
24bff595c1SCatalin Marinas 
25bff595c1SCatalin Marinas struct unwind_table {
26bff595c1SCatalin Marinas 	struct list_head list;
27b6f21d14SChen Zhongjin 	struct list_head mod_list;
28de66a979SUwe Kleine-König 	const struct unwind_idx *start;
29de66a979SUwe Kleine-König 	const struct unwind_idx *origin;
30de66a979SUwe Kleine-König 	const struct unwind_idx *stop;
31bff595c1SCatalin Marinas 	unsigned long begin_addr;
32bff595c1SCatalin Marinas 	unsigned long end_addr;
33bff595c1SCatalin Marinas };
34bff595c1SCatalin Marinas 
35bff595c1SCatalin Marinas extern struct unwind_table *unwind_table_add(unsigned long start,
36bff595c1SCatalin Marinas 					     unsigned long size,
37bff595c1SCatalin Marinas 					     unsigned long text_addr,
38bff595c1SCatalin Marinas 					     unsigned long text_size);
39bff595c1SCatalin Marinas extern void unwind_table_del(struct unwind_table *tab);
40e8d7b735SDmitry Safonov extern void unwind_backtrace(struct pt_regs *regs, struct task_struct *tsk,
41e8d7b735SDmitry Safonov 			     const char *loglvl);
42bff595c1SCatalin Marinas 
43*ae1f8d79SArnd Bergmann void __aeabi_unwind_cpp_pr0(void);
44*ae1f8d79SArnd Bergmann void __aeabi_unwind_cpp_pr1(void);
45*ae1f8d79SArnd Bergmann void __aeabi_unwind_cpp_pr2(void);
46*ae1f8d79SArnd Bergmann 
47bff595c1SCatalin Marinas #endif	/* !__ASSEMBLY__ */
48bff595c1SCatalin Marinas 
49bff595c1SCatalin Marinas #ifdef CONFIG_ARM_UNWIND
50bff595c1SCatalin Marinas #define UNWIND(code...)		code
51bff595c1SCatalin Marinas #else
52bff595c1SCatalin Marinas #define UNWIND(code...)
53bff595c1SCatalin Marinas #endif
54bff595c1SCatalin Marinas 
55bff595c1SCatalin Marinas #endif	/* __ASM_UNWIND_H */
56