xref: /OK3568_Linux_fs/kernel/arch/arc/include/asm/unwind.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
4*4882a593Smuzhiyun  */
5*4882a593Smuzhiyun 
6*4882a593Smuzhiyun #ifndef _ASM_ARC_UNWIND_H
7*4882a593Smuzhiyun #define _ASM_ARC_UNWIND_H
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #ifdef CONFIG_ARC_DW2_UNWIND
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #include <linux/sched.h>
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun struct arc700_regs {
14*4882a593Smuzhiyun 	unsigned long r0;
15*4882a593Smuzhiyun 	unsigned long r1;
16*4882a593Smuzhiyun 	unsigned long r2;
17*4882a593Smuzhiyun 	unsigned long r3;
18*4882a593Smuzhiyun 	unsigned long r4;
19*4882a593Smuzhiyun 	unsigned long r5;
20*4882a593Smuzhiyun 	unsigned long r6;
21*4882a593Smuzhiyun 	unsigned long r7;
22*4882a593Smuzhiyun 	unsigned long r8;
23*4882a593Smuzhiyun 	unsigned long r9;
24*4882a593Smuzhiyun 	unsigned long r10;
25*4882a593Smuzhiyun 	unsigned long r11;
26*4882a593Smuzhiyun 	unsigned long r12;
27*4882a593Smuzhiyun 	unsigned long r13;
28*4882a593Smuzhiyun 	unsigned long r14;
29*4882a593Smuzhiyun 	unsigned long r15;
30*4882a593Smuzhiyun 	unsigned long r16;
31*4882a593Smuzhiyun 	unsigned long r17;
32*4882a593Smuzhiyun 	unsigned long r18;
33*4882a593Smuzhiyun 	unsigned long r19;
34*4882a593Smuzhiyun 	unsigned long r20;
35*4882a593Smuzhiyun 	unsigned long r21;
36*4882a593Smuzhiyun 	unsigned long r22;
37*4882a593Smuzhiyun 	unsigned long r23;
38*4882a593Smuzhiyun 	unsigned long r24;
39*4882a593Smuzhiyun 	unsigned long r25;
40*4882a593Smuzhiyun 	unsigned long r26;
41*4882a593Smuzhiyun 	unsigned long r27;	/* fp */
42*4882a593Smuzhiyun 	unsigned long r28;	/* sp */
43*4882a593Smuzhiyun 	unsigned long r29;
44*4882a593Smuzhiyun 	unsigned long r30;
45*4882a593Smuzhiyun 	unsigned long r31;	/* blink */
46*4882a593Smuzhiyun 	unsigned long r63;	/* pc */
47*4882a593Smuzhiyun };
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun struct unwind_frame_info {
50*4882a593Smuzhiyun 	struct arc700_regs regs;
51*4882a593Smuzhiyun 	struct task_struct *task;
52*4882a593Smuzhiyun 	unsigned call_frame:1;
53*4882a593Smuzhiyun };
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun #define UNW_PC(frame)		((frame)->regs.r63)
56*4882a593Smuzhiyun #define UNW_SP(frame)		((frame)->regs.r28)
57*4882a593Smuzhiyun #define UNW_BLINK(frame)	((frame)->regs.r31)
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun /* Rajesh FIXME */
60*4882a593Smuzhiyun #ifdef CONFIG_FRAME_POINTER
61*4882a593Smuzhiyun #define UNW_FP(frame)		((frame)->regs.r27)
62*4882a593Smuzhiyun #define FRAME_RETADDR_OFFSET	4
63*4882a593Smuzhiyun #define FRAME_LINK_OFFSET	0
64*4882a593Smuzhiyun #define STACK_BOTTOM_UNW(tsk)	STACK_LIMIT((tsk)->thread.ksp)
65*4882a593Smuzhiyun #define STACK_TOP_UNW(tsk)	((tsk)->thread.ksp)
66*4882a593Smuzhiyun #else
67*4882a593Smuzhiyun #define UNW_FP(frame)		((void)(frame), 0)
68*4882a593Smuzhiyun #endif
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun #define STACK_LIMIT(ptr)	(((ptr) - 1) & ~(THREAD_SIZE - 1))
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun #define UNW_REGISTER_INFO \
73*4882a593Smuzhiyun 	PTREGS_INFO(r0), \
74*4882a593Smuzhiyun 	PTREGS_INFO(r1), \
75*4882a593Smuzhiyun 	PTREGS_INFO(r2), \
76*4882a593Smuzhiyun 	PTREGS_INFO(r3), \
77*4882a593Smuzhiyun 	PTREGS_INFO(r4), \
78*4882a593Smuzhiyun 	PTREGS_INFO(r5), \
79*4882a593Smuzhiyun 	PTREGS_INFO(r6), \
80*4882a593Smuzhiyun 	PTREGS_INFO(r7), \
81*4882a593Smuzhiyun 	PTREGS_INFO(r8), \
82*4882a593Smuzhiyun 	PTREGS_INFO(r9), \
83*4882a593Smuzhiyun 	PTREGS_INFO(r10), \
84*4882a593Smuzhiyun 	PTREGS_INFO(r11), \
85*4882a593Smuzhiyun 	PTREGS_INFO(r12), \
86*4882a593Smuzhiyun 	PTREGS_INFO(r13), \
87*4882a593Smuzhiyun 	PTREGS_INFO(r14), \
88*4882a593Smuzhiyun 	PTREGS_INFO(r15), \
89*4882a593Smuzhiyun 	PTREGS_INFO(r16), \
90*4882a593Smuzhiyun 	PTREGS_INFO(r17), \
91*4882a593Smuzhiyun 	PTREGS_INFO(r18), \
92*4882a593Smuzhiyun 	PTREGS_INFO(r19), \
93*4882a593Smuzhiyun 	PTREGS_INFO(r20), \
94*4882a593Smuzhiyun 	PTREGS_INFO(r21), \
95*4882a593Smuzhiyun 	PTREGS_INFO(r22), \
96*4882a593Smuzhiyun 	PTREGS_INFO(r23), \
97*4882a593Smuzhiyun 	PTREGS_INFO(r24), \
98*4882a593Smuzhiyun 	PTREGS_INFO(r25), \
99*4882a593Smuzhiyun 	PTREGS_INFO(r26), \
100*4882a593Smuzhiyun 	PTREGS_INFO(r27), \
101*4882a593Smuzhiyun 	PTREGS_INFO(r28), \
102*4882a593Smuzhiyun 	PTREGS_INFO(r29), \
103*4882a593Smuzhiyun 	PTREGS_INFO(r30), \
104*4882a593Smuzhiyun 	PTREGS_INFO(r31), \
105*4882a593Smuzhiyun 	PTREGS_INFO(r63)
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun #define UNW_DEFAULT_RA(raItem, dataAlign) \
108*4882a593Smuzhiyun 	((raItem).where == Memory && !((raItem).value * (dataAlign) + 4))
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun extern int arc_unwind(struct unwind_frame_info *frame);
111*4882a593Smuzhiyun extern void arc_unwind_init(void);
112*4882a593Smuzhiyun extern void *unwind_add_table(struct module *module, const void *table_start,
113*4882a593Smuzhiyun 			      unsigned long table_size);
114*4882a593Smuzhiyun extern void unwind_remove_table(void *handle, int init_only);
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun static inline int
arch_unwind_init_running(struct unwind_frame_info * info,int (* callback)(struct unwind_frame_info * info,void * arg),void * arg)117*4882a593Smuzhiyun arch_unwind_init_running(struct unwind_frame_info *info,
118*4882a593Smuzhiyun 			 int (*callback) (struct unwind_frame_info *info,
119*4882a593Smuzhiyun 					  void *arg),
120*4882a593Smuzhiyun 			 void *arg)
121*4882a593Smuzhiyun {
122*4882a593Smuzhiyun 	return 0;
123*4882a593Smuzhiyun }
124*4882a593Smuzhiyun 
arch_unw_user_mode(const struct unwind_frame_info * info)125*4882a593Smuzhiyun static inline int arch_unw_user_mode(const struct unwind_frame_info *info)
126*4882a593Smuzhiyun {
127*4882a593Smuzhiyun 	return 0;
128*4882a593Smuzhiyun }
129*4882a593Smuzhiyun 
arch_unw_init_blocked(struct unwind_frame_info * info)130*4882a593Smuzhiyun static inline void arch_unw_init_blocked(struct unwind_frame_info *info)
131*4882a593Smuzhiyun {
132*4882a593Smuzhiyun 	return;
133*4882a593Smuzhiyun }
134*4882a593Smuzhiyun 
arch_unw_init_frame_info(struct unwind_frame_info * info,struct pt_regs * regs)135*4882a593Smuzhiyun static inline void arch_unw_init_frame_info(struct unwind_frame_info *info,
136*4882a593Smuzhiyun 					    struct pt_regs *regs)
137*4882a593Smuzhiyun {
138*4882a593Smuzhiyun 	return;
139*4882a593Smuzhiyun }
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun #else
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun #define UNW_PC(frame) ((void)(frame), 0)
144*4882a593Smuzhiyun #define UNW_SP(frame) ((void)(frame), 0)
145*4882a593Smuzhiyun #define UNW_FP(frame) ((void)(frame), 0)
146*4882a593Smuzhiyun 
arc_unwind_init(void)147*4882a593Smuzhiyun static inline void arc_unwind_init(void)
148*4882a593Smuzhiyun {
149*4882a593Smuzhiyun }
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun #define unwind_add_table(a, b, c)
152*4882a593Smuzhiyun #define unwind_remove_table(a, b)
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun #endif /* CONFIG_ARC_DW2_UNWIND */
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun #endif /* _ASM_ARC_UNWIND_H */
157