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