0001
0002
0003
0004
0005
0006 #ifndef _ASM_ARC_UNWIND_H
0007 #define _ASM_ARC_UNWIND_H
0008
0009 #ifdef CONFIG_ARC_DW2_UNWIND
0010
0011 #include <linux/sched.h>
0012
0013 struct arc700_regs {
0014 unsigned long r0;
0015 unsigned long r1;
0016 unsigned long r2;
0017 unsigned long r3;
0018 unsigned long r4;
0019 unsigned long r5;
0020 unsigned long r6;
0021 unsigned long r7;
0022 unsigned long r8;
0023 unsigned long r9;
0024 unsigned long r10;
0025 unsigned long r11;
0026 unsigned long r12;
0027 unsigned long r13;
0028 unsigned long r14;
0029 unsigned long r15;
0030 unsigned long r16;
0031 unsigned long r17;
0032 unsigned long r18;
0033 unsigned long r19;
0034 unsigned long r20;
0035 unsigned long r21;
0036 unsigned long r22;
0037 unsigned long r23;
0038 unsigned long r24;
0039 unsigned long r25;
0040 unsigned long r26;
0041 unsigned long r27;
0042 unsigned long r28;
0043 unsigned long r29;
0044 unsigned long r30;
0045 unsigned long r31;
0046 unsigned long r63;
0047 };
0048
0049 struct unwind_frame_info {
0050 struct arc700_regs regs;
0051 struct task_struct *task;
0052 unsigned call_frame:1;
0053 };
0054
0055 #define UNW_PC(frame) ((frame)->regs.r63)
0056 #define UNW_SP(frame) ((frame)->regs.r28)
0057 #define UNW_BLINK(frame) ((frame)->regs.r31)
0058
0059
0060 #ifdef CONFIG_FRAME_POINTER
0061 #define UNW_FP(frame) ((frame)->regs.r27)
0062 #define FRAME_RETADDR_OFFSET 4
0063 #define FRAME_LINK_OFFSET 0
0064 #define STACK_BOTTOM_UNW(tsk) STACK_LIMIT((tsk)->thread.ksp)
0065 #define STACK_TOP_UNW(tsk) ((tsk)->thread.ksp)
0066 #else
0067 #define UNW_FP(frame) ((void)(frame), 0)
0068 #endif
0069
0070 #define STACK_LIMIT(ptr) (((ptr) - 1) & ~(THREAD_SIZE - 1))
0071
0072 #define UNW_REGISTER_INFO \
0073 PTREGS_INFO(r0), \
0074 PTREGS_INFO(r1), \
0075 PTREGS_INFO(r2), \
0076 PTREGS_INFO(r3), \
0077 PTREGS_INFO(r4), \
0078 PTREGS_INFO(r5), \
0079 PTREGS_INFO(r6), \
0080 PTREGS_INFO(r7), \
0081 PTREGS_INFO(r8), \
0082 PTREGS_INFO(r9), \
0083 PTREGS_INFO(r10), \
0084 PTREGS_INFO(r11), \
0085 PTREGS_INFO(r12), \
0086 PTREGS_INFO(r13), \
0087 PTREGS_INFO(r14), \
0088 PTREGS_INFO(r15), \
0089 PTREGS_INFO(r16), \
0090 PTREGS_INFO(r17), \
0091 PTREGS_INFO(r18), \
0092 PTREGS_INFO(r19), \
0093 PTREGS_INFO(r20), \
0094 PTREGS_INFO(r21), \
0095 PTREGS_INFO(r22), \
0096 PTREGS_INFO(r23), \
0097 PTREGS_INFO(r24), \
0098 PTREGS_INFO(r25), \
0099 PTREGS_INFO(r26), \
0100 PTREGS_INFO(r27), \
0101 PTREGS_INFO(r28), \
0102 PTREGS_INFO(r29), \
0103 PTREGS_INFO(r30), \
0104 PTREGS_INFO(r31), \
0105 PTREGS_INFO(r63)
0106
0107 #define UNW_DEFAULT_RA(raItem, dataAlign) \
0108 ((raItem).where == Memory && !((raItem).value * (dataAlign) + 4))
0109
0110 extern int arc_unwind(struct unwind_frame_info *frame);
0111 extern void arc_unwind_init(void);
0112 extern void *unwind_add_table(struct module *module, const void *table_start,
0113 unsigned long table_size);
0114 extern void unwind_remove_table(void *handle, int init_only);
0115
0116 static inline int
0117 arch_unwind_init_running(struct unwind_frame_info *info,
0118 int (*callback) (struct unwind_frame_info *info,
0119 void *arg),
0120 void *arg)
0121 {
0122 return 0;
0123 }
0124
0125 static inline int arch_unw_user_mode(const struct unwind_frame_info *info)
0126 {
0127 return 0;
0128 }
0129
0130 static inline void arch_unw_init_blocked(struct unwind_frame_info *info)
0131 {
0132 return;
0133 }
0134
0135 static inline void arch_unw_init_frame_info(struct unwind_frame_info *info,
0136 struct pt_regs *regs)
0137 {
0138 return;
0139 }
0140
0141 #else
0142
0143 #define UNW_PC(frame) ((void)(frame), 0)
0144 #define UNW_SP(frame) ((void)(frame), 0)
0145 #define UNW_FP(frame) ((void)(frame), 0)
0146
0147 static inline void arc_unwind_init(void)
0148 {
0149 }
0150
0151 #define unwind_add_table(a, b, c)
0152 #define unwind_remove_table(a, b)
0153
0154 #endif
0155
0156 #endif