xref: /openbmc/linux/arch/arc/include/asm/unwind.h (revision 75bf465f0bc33e9b776a46d6a1b9b990f5fb7c37)
1*d2912cb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
2854a0d95SVineet Gupta /*
3854a0d95SVineet Gupta  * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
4854a0d95SVineet Gupta  */
5854a0d95SVineet Gupta 
6854a0d95SVineet Gupta #ifndef _ASM_ARC_UNWIND_H
7854a0d95SVineet Gupta #define _ASM_ARC_UNWIND_H
8854a0d95SVineet Gupta 
9854a0d95SVineet Gupta #ifdef CONFIG_ARC_DW2_UNWIND
10854a0d95SVineet Gupta 
11854a0d95SVineet Gupta #include <linux/sched.h>
12854a0d95SVineet Gupta 
13854a0d95SVineet Gupta struct arc700_regs {
14854a0d95SVineet Gupta 	unsigned long r0;
15854a0d95SVineet Gupta 	unsigned long r1;
16854a0d95SVineet Gupta 	unsigned long r2;
17854a0d95SVineet Gupta 	unsigned long r3;
18854a0d95SVineet Gupta 	unsigned long r4;
19854a0d95SVineet Gupta 	unsigned long r5;
20854a0d95SVineet Gupta 	unsigned long r6;
21854a0d95SVineet Gupta 	unsigned long r7;
22854a0d95SVineet Gupta 	unsigned long r8;
23854a0d95SVineet Gupta 	unsigned long r9;
24854a0d95SVineet Gupta 	unsigned long r10;
25854a0d95SVineet Gupta 	unsigned long r11;
26854a0d95SVineet Gupta 	unsigned long r12;
27854a0d95SVineet Gupta 	unsigned long r13;
28854a0d95SVineet Gupta 	unsigned long r14;
29854a0d95SVineet Gupta 	unsigned long r15;
30854a0d95SVineet Gupta 	unsigned long r16;
31854a0d95SVineet Gupta 	unsigned long r17;
32854a0d95SVineet Gupta 	unsigned long r18;
33854a0d95SVineet Gupta 	unsigned long r19;
34854a0d95SVineet Gupta 	unsigned long r20;
35854a0d95SVineet Gupta 	unsigned long r21;
36854a0d95SVineet Gupta 	unsigned long r22;
37854a0d95SVineet Gupta 	unsigned long r23;
38854a0d95SVineet Gupta 	unsigned long r24;
39854a0d95SVineet Gupta 	unsigned long r25;
40854a0d95SVineet Gupta 	unsigned long r26;
41854a0d95SVineet Gupta 	unsigned long r27;	/* fp */
42854a0d95SVineet Gupta 	unsigned long r28;	/* sp */
43854a0d95SVineet Gupta 	unsigned long r29;
44854a0d95SVineet Gupta 	unsigned long r30;
45854a0d95SVineet Gupta 	unsigned long r31;	/* blink */
46854a0d95SVineet Gupta 	unsigned long r63;	/* pc */
47854a0d95SVineet Gupta };
48854a0d95SVineet Gupta 
49854a0d95SVineet Gupta struct unwind_frame_info {
50854a0d95SVineet Gupta 	struct arc700_regs regs;
51854a0d95SVineet Gupta 	struct task_struct *task;
52854a0d95SVineet Gupta 	unsigned call_frame:1;
53854a0d95SVineet Gupta };
54854a0d95SVineet Gupta 
55854a0d95SVineet Gupta #define UNW_PC(frame)		((frame)->regs.r63)
56854a0d95SVineet Gupta #define UNW_SP(frame)		((frame)->regs.r28)
57854a0d95SVineet Gupta #define UNW_BLINK(frame)	((frame)->regs.r31)
58854a0d95SVineet Gupta 
59854a0d95SVineet Gupta /* Rajesh FIXME */
60854a0d95SVineet Gupta #ifdef CONFIG_FRAME_POINTER
61854a0d95SVineet Gupta #define UNW_FP(frame)		((frame)->regs.r27)
62854a0d95SVineet Gupta #define FRAME_RETADDR_OFFSET	4
63854a0d95SVineet Gupta #define FRAME_LINK_OFFSET	0
64854a0d95SVineet Gupta #define STACK_BOTTOM_UNW(tsk)	STACK_LIMIT((tsk)->thread.ksp)
65854a0d95SVineet Gupta #define STACK_TOP_UNW(tsk)	((tsk)->thread.ksp)
66854a0d95SVineet Gupta #else
67854a0d95SVineet Gupta #define UNW_FP(frame)		((void)(frame), 0)
68854a0d95SVineet Gupta #endif
69854a0d95SVineet Gupta 
70854a0d95SVineet Gupta #define STACK_LIMIT(ptr)	(((ptr) - 1) & ~(THREAD_SIZE - 1))
71854a0d95SVineet Gupta 
72854a0d95SVineet Gupta #define UNW_REGISTER_INFO \
73854a0d95SVineet Gupta 	PTREGS_INFO(r0), \
74854a0d95SVineet Gupta 	PTREGS_INFO(r1), \
75854a0d95SVineet Gupta 	PTREGS_INFO(r2), \
76854a0d95SVineet Gupta 	PTREGS_INFO(r3), \
77854a0d95SVineet Gupta 	PTREGS_INFO(r4), \
78854a0d95SVineet Gupta 	PTREGS_INFO(r5), \
79854a0d95SVineet Gupta 	PTREGS_INFO(r6), \
80854a0d95SVineet Gupta 	PTREGS_INFO(r7), \
81854a0d95SVineet Gupta 	PTREGS_INFO(r8), \
82854a0d95SVineet Gupta 	PTREGS_INFO(r9), \
83854a0d95SVineet Gupta 	PTREGS_INFO(r10), \
84854a0d95SVineet Gupta 	PTREGS_INFO(r11), \
85854a0d95SVineet Gupta 	PTREGS_INFO(r12), \
86854a0d95SVineet Gupta 	PTREGS_INFO(r13), \
87854a0d95SVineet Gupta 	PTREGS_INFO(r14), \
88854a0d95SVineet Gupta 	PTREGS_INFO(r15), \
89854a0d95SVineet Gupta 	PTREGS_INFO(r16), \
90854a0d95SVineet Gupta 	PTREGS_INFO(r17), \
91854a0d95SVineet Gupta 	PTREGS_INFO(r18), \
92854a0d95SVineet Gupta 	PTREGS_INFO(r19), \
93854a0d95SVineet Gupta 	PTREGS_INFO(r20), \
94854a0d95SVineet Gupta 	PTREGS_INFO(r21), \
95854a0d95SVineet Gupta 	PTREGS_INFO(r22), \
96854a0d95SVineet Gupta 	PTREGS_INFO(r23), \
97854a0d95SVineet Gupta 	PTREGS_INFO(r24), \
98854a0d95SVineet Gupta 	PTREGS_INFO(r25), \
99854a0d95SVineet Gupta 	PTREGS_INFO(r26), \
100854a0d95SVineet Gupta 	PTREGS_INFO(r27), \
101854a0d95SVineet Gupta 	PTREGS_INFO(r28), \
102854a0d95SVineet Gupta 	PTREGS_INFO(r29), \
103854a0d95SVineet Gupta 	PTREGS_INFO(r30), \
104854a0d95SVineet Gupta 	PTREGS_INFO(r31), \
105854a0d95SVineet Gupta 	PTREGS_INFO(r63)
106854a0d95SVineet Gupta 
107854a0d95SVineet Gupta #define UNW_DEFAULT_RA(raItem, dataAlign) \
108854a0d95SVineet Gupta 	((raItem).where == Memory && !((raItem).value * (dataAlign) + 4))
109854a0d95SVineet Gupta 
110854a0d95SVineet Gupta extern int arc_unwind(struct unwind_frame_info *frame);
111854a0d95SVineet Gupta extern void arc_unwind_init(void);
112854a0d95SVineet Gupta extern void *unwind_add_table(struct module *module, const void *table_start,
113854a0d95SVineet Gupta 			      unsigned long table_size);
114854a0d95SVineet Gupta extern void unwind_remove_table(void *handle, int init_only);
115854a0d95SVineet Gupta 
116854a0d95SVineet Gupta static inline int
arch_unwind_init_running(struct unwind_frame_info * info,int (* callback)(struct unwind_frame_info * info,void * arg),void * arg)117854a0d95SVineet Gupta arch_unwind_init_running(struct unwind_frame_info *info,
118854a0d95SVineet Gupta 			 int (*callback) (struct unwind_frame_info *info,
119854a0d95SVineet Gupta 					  void *arg),
120854a0d95SVineet Gupta 			 void *arg)
121854a0d95SVineet Gupta {
122854a0d95SVineet Gupta 	return 0;
123854a0d95SVineet Gupta }
124854a0d95SVineet Gupta 
arch_unw_user_mode(const struct unwind_frame_info * info)125854a0d95SVineet Gupta static inline int arch_unw_user_mode(const struct unwind_frame_info *info)
126854a0d95SVineet Gupta {
127854a0d95SVineet Gupta 	return 0;
128854a0d95SVineet Gupta }
129854a0d95SVineet Gupta 
arch_unw_init_blocked(struct unwind_frame_info * info)130854a0d95SVineet Gupta static inline void arch_unw_init_blocked(struct unwind_frame_info *info)
131854a0d95SVineet Gupta {
132854a0d95SVineet Gupta 	return;
133854a0d95SVineet Gupta }
134854a0d95SVineet Gupta 
arch_unw_init_frame_info(struct unwind_frame_info * info,struct pt_regs * regs)135854a0d95SVineet Gupta static inline void arch_unw_init_frame_info(struct unwind_frame_info *info,
136854a0d95SVineet Gupta 					    struct pt_regs *regs)
137854a0d95SVineet Gupta {
138854a0d95SVineet Gupta 	return;
139854a0d95SVineet Gupta }
140854a0d95SVineet Gupta 
141854a0d95SVineet Gupta #else
142854a0d95SVineet Gupta 
143854a0d95SVineet Gupta #define UNW_PC(frame) ((void)(frame), 0)
144854a0d95SVineet Gupta #define UNW_SP(frame) ((void)(frame), 0)
145854a0d95SVineet Gupta #define UNW_FP(frame) ((void)(frame), 0)
146854a0d95SVineet Gupta 
arc_unwind_init(void)147854a0d95SVineet Gupta static inline void arc_unwind_init(void)
148854a0d95SVineet Gupta {
149854a0d95SVineet Gupta }
150854a0d95SVineet Gupta 
151854a0d95SVineet Gupta #define unwind_add_table(a, b, c)
152854a0d95SVineet Gupta #define unwind_remove_table(a, b)
153854a0d95SVineet Gupta 
154854a0d95SVineet Gupta #endif /* CONFIG_ARC_DW2_UNWIND */
155854a0d95SVineet Gupta 
156854a0d95SVineet Gupta #endif /* _ASM_ARC_UNWIND_H */
157