Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
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;  /* fp */
0042     unsigned long r28;  /* sp */
0043     unsigned long r29;
0044     unsigned long r30;
0045     unsigned long r31;  /* blink */
0046     unsigned long r63;  /* pc */
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 /* Rajesh FIXME */
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 /* CONFIG_ARC_DW2_UNWIND */
0155 
0156 #endif /* _ASM_ARC_UNWIND_H */